New feature: Color Labels (issue 684) and porting rank and inTrash to pp3
BIN
rtdata/images/cglabel1.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/cglabel2.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/cglabel3.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/cglabel4.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/cglabel5.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/clabel1.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/clabel2.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/clabel3.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/clabel4.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/clabel5.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
rtdata/images/filterclear.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
rtdata/images/nocolorlabel.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
rtdata/images/uncolorlabel.png
Normal file
After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 505 B After Width: | Height: | Size: 3.1 KiB |
@ -83,17 +83,24 @@ FILEBROWSER_NEW_NAME;New name:
|
||||
FILEBROWSER_PARTIALPASTEPROFILE;Partial paste
|
||||
FILEBROWSER_PASTEPROFILE;Paste profile
|
||||
FILEBROWSER_POPUPCANCELJOB;Cancel job
|
||||
FILEBROWSER_POPUPCOLORLABEL;Color label
|
||||
FILEBROWSER_POPUPCOLORLABEL0;Label: None
|
||||
FILEBROWSER_POPUPCOLORLABEL1;Label: Red
|
||||
FILEBROWSER_POPUPCOLORLABEL2;Label: Yellow
|
||||
FILEBROWSER_POPUPCOLORLABEL3;Label: Green
|
||||
FILEBROWSER_POPUPCOLORLABEL4;Label: Blue
|
||||
FILEBROWSER_POPUPCOLORLABEL5;Label: Purple
|
||||
FILEBROWSER_POPUPCOPYTO;Copy to...
|
||||
FILEBROWSER_POPUPMOVEEND;Move to end of queue
|
||||
FILEBROWSER_POPUPMOVEHEAD;Move to head of queue
|
||||
FILEBROWSER_POPUPMOVETO;Move to...
|
||||
FILEBROWSER_POPUPOPEN;Open
|
||||
FILEBROWSER_POPUPPROCESS;Put to processing queue
|
||||
FILEBROWSER_POPUPRANK1;Rank 1
|
||||
FILEBROWSER_POPUPRANK2;Rank 2
|
||||
FILEBROWSER_POPUPRANK3;Rank 3
|
||||
FILEBROWSER_POPUPRANK4;Rank 4
|
||||
FILEBROWSER_POPUPRANK5;Rank 5
|
||||
FILEBROWSER_POPUPRANK1;Rank 1 *
|
||||
FILEBROWSER_POPUPRANK2;Rank 2 **
|
||||
FILEBROWSER_POPUPRANK3;Rank 3 ***
|
||||
FILEBROWSER_POPUPRANK4;Rank 4 ****
|
||||
FILEBROWSER_POPUPRANK5;Rank 5 *****
|
||||
FILEBROWSER_POPUPREMOVE;Remove from filesystem
|
||||
FILEBROWSER_POPUPREMOVEINCLPROC;Remove from filesystem & batch result
|
||||
FILEBROWSER_POPUPREMOVESUBMENU;Remove
|
||||
@ -108,7 +115,12 @@ FILEBROWSER_RENAMEDLGLABEL;Rename file
|
||||
FILEBROWSER_RENAMEDLGMSG;Rename file "%1" to:
|
||||
FILEBROWSER_SELECTDARKFRAME;Select dark frame...
|
||||
FILEBROWSER_SELECTFLATFIELD;Select flat field...
|
||||
FILEBROWSER_SHOWDIRHINT;Show all images of the directory <b>D</b>
|
||||
FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red <b>Alt-1</b>
|
||||
FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yelow <b>Alt-2</b>
|
||||
FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green <b>Alt-3</b>
|
||||
FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue <b>Alt-4</b>
|
||||
FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple <b>Alt-5</b>
|
||||
FILEBROWSER_SHOWDIRHINT;Show all images in the directory (clear all filters) <b>D</b>
|
||||
FILEBROWSER_SHOWEXIFINFO;Show EXIF info <b>i</b>
|
||||
FILEBROWSER_SHOWQUEUEHINT;Show content of the processing queue
|
||||
FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1 star <b>1</b>
|
||||
@ -117,6 +129,7 @@ FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3 star <b>3</b>
|
||||
FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star <b>4</b>
|
||||
FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star <b>5</b>
|
||||
FILEBROWSER_SHOWTRASHHINT;Show content of the trash <b>T</b>
|
||||
FILEBROWSER_SHOWUNCOLORHINT;Show images without Color label <b>Alt-`</b>
|
||||
FILEBROWSER_SHOWUNRANKHINT;Show unranked images <b>`</b>
|
||||
FILEBROWSER_STARTPROCESSING;Start processing
|
||||
FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue
|
||||
|
@ -254,6 +254,10 @@ void ProcParams::setDefaults () {
|
||||
|
||||
exif.clear ();
|
||||
iptc.clear ();
|
||||
|
||||
rank = 0;
|
||||
colorlabel = 0;
|
||||
inTrash = false;
|
||||
|
||||
ppVersion = PPVERSION;
|
||||
}
|
||||
@ -265,6 +269,10 @@ int ProcParams::save (Glib::ustring fname) const {
|
||||
keyFile.set_string ("Version", "AppVersion", APPVERSION);
|
||||
keyFile.set_integer ("Version", "Version", PPVERSION);
|
||||
|
||||
keyFile.set_integer ("General", "Rank", rank);
|
||||
keyFile.set_integer ("General", "ColorLabel", colorlabel);
|
||||
keyFile.set_boolean ("General", "InTrash", inTrash);
|
||||
|
||||
// save tonecurve:
|
||||
keyFile.set_boolean ("Exposure", "Auto", toneCurve.autoexp);
|
||||
keyFile.set_double ("Exposure", "Clip", toneCurve.clip);
|
||||
@ -535,6 +543,12 @@ if (keyFile.has_group ("Version")) {
|
||||
if (keyFile.has_key ("Version", "Version")) ppVersion = keyFile.get_integer ("Version", "Version");
|
||||
}
|
||||
|
||||
if (keyFile.has_group ("General")) {
|
||||
if (keyFile.has_key ("General", "Rank")) rank = keyFile.get_integer ("General", "Rank");
|
||||
if (keyFile.has_key ("General", "ColorLabel")) colorlabel = keyFile.get_integer ("General", "ColorLabel");
|
||||
if (keyFile.has_key ("General", "InTrash")) inTrash = keyFile.get_boolean ("General", "InTrash");
|
||||
}
|
||||
|
||||
if (keyFile.has_group ("Exposure")) {
|
||||
if (keyFile.has_key ("Exposure", "Auto")) toneCurve.autoexp = keyFile.get_boolean ("Exposure", "Auto");
|
||||
if (keyFile.has_key ("Exposure", "Clip")) toneCurve.clip = keyFile.get_double ("Exposure", "Clip");
|
||||
|
@ -466,6 +466,9 @@ class ProcParams {
|
||||
HSVEqualizerParams hsvequalizer; ///< hsv equalizer parameters
|
||||
std::vector<ExifPair> exif; ///< List of modifications appplied on the exif tags of the input image
|
||||
std::vector<IPTCPair> iptc; ///< The IPTC tags and values to be saved to the output image
|
||||
char rank; ///< Custom image quality ranking
|
||||
char colorlabel; ///< Custom color label
|
||||
bool inTrash; ///< Marks deleted image
|
||||
Glib::ustring appVersion; ///< Version of the application that generated the parameters
|
||||
int ppVersion; ///< Version of the PP file from which the parameters have been read
|
||||
|
||||
|
@ -497,23 +497,22 @@ Glib::ustring BatchQueue::calcAutoFileNameBase (const Glib::ustring& origFileNam
|
||||
}
|
||||
else if (options.savePathTemplate[ix]=='f') {
|
||||
path = path + filename;
|
||||
}
|
||||
else if (options.savePathTemplate[ix]=='r') {
|
||||
CacheImageData cid;
|
||||
char rank;
|
||||
|
||||
if (cid.load(cacheMgr->getCacheFileName("data", origFileName, CacheManager::getMD5(origFileName))+".txt") == 1) {
|
||||
rank = '0';
|
||||
} else {
|
||||
if (!cid.inTrash)
|
||||
rank = cid.rank + '0';
|
||||
else
|
||||
rank = 'x';
|
||||
}
|
||||
|
||||
path += rank;
|
||||
}
|
||||
else if (options.savePathTemplate[ix]=='r') { // rank from pparams
|
||||
char rank;
|
||||
rtengine::procparams::ProcParams pparams;
|
||||
if( pparams.load(origFileName + paramFileExtension)==0 ){
|
||||
if (!pparams.inTrash)
|
||||
rank = pparams.rank + '0';
|
||||
else
|
||||
rank = 'x';
|
||||
}
|
||||
else
|
||||
rank = '0'; // if param file not loaded (e.g. does not exist), default to rank=0
|
||||
path += rank;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
path = path + options.savePathTemplate[ix];
|
||||
ix++;
|
||||
|
@ -21,6 +21,8 @@
|
||||
BrowserFilter::BrowserFilter () : exifFilterEnabled (false) {
|
||||
|
||||
showTrash = true;
|
||||
for (int i=0; i<6; i++)
|
||||
for (int i=0; i<6; i++){
|
||||
showRanked[i] = true;
|
||||
showCLabeled[i] = true;
|
||||
}
|
||||
}
|
||||
|
@ -25,8 +25,10 @@ class BrowserFilter {
|
||||
|
||||
public:
|
||||
bool showRanked[6];
|
||||
bool showCLabeled[6];
|
||||
bool showTrash;
|
||||
bool showNotTrash;
|
||||
bool showEdited[2];
|
||||
|
||||
bool exifFilterEnabled;
|
||||
ExifFilterSettings exifFilter;
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include "version.h"
|
||||
|
||||
CacheImageData::CacheImageData ()
|
||||
: md5(""), supported(false), format(FT_Invalid), rank(0), inTrash(false), recentlySaved(false),
|
||||
: md5(""), supported(false), format(FT_Invalid), rankOld(-1), inTrashOld(false), recentlySaved(false),
|
||||
timeValid(false), exifValid(false), thumbImgType(0) {
|
||||
}
|
||||
|
||||
@ -41,8 +41,8 @@ int CacheImageData::load (const Glib::ustring& fname) {
|
||||
if (keyFile.has_key ("General", "Version")) version = keyFile.get_string ("General", "Version");
|
||||
if (keyFile.has_key ("General", "Supported")) supported = keyFile.get_boolean ("General", "Supported");
|
||||
if (keyFile.has_key ("General", "Format")) format = (ThFileType)keyFile.get_integer ("General", "Format");
|
||||
if (keyFile.has_key ("General", "Rank")) rank = keyFile.get_integer ("General", "Rank");
|
||||
if (keyFile.has_key ("General", "InTrash")) inTrash = keyFile.get_boolean ("General", "InTrash");
|
||||
if (keyFile.has_key ("General", "Rank")) rankOld = keyFile.get_integer ("General", "Rank");
|
||||
if (keyFile.has_key ("General", "InTrash")) inTrashOld = keyFile.get_boolean ("General", "InTrash");
|
||||
if (keyFile.has_key ("General", "RecentlySaved")) recentlySaved = keyFile.get_boolean ("General", "RecentlySaved");
|
||||
}
|
||||
|
||||
@ -104,10 +104,12 @@ int CacheImageData::save (const Glib::ustring& fname) {
|
||||
keyFile.set_string ("General", "Version", VERSION); // Application's version
|
||||
keyFile.set_boolean ("General", "Supported", supported);
|
||||
keyFile.set_integer ("General", "Format", format);
|
||||
keyFile.set_integer ("General", "Rank", rank);
|
||||
keyFile.set_boolean ("General", "InTrash", inTrash);
|
||||
keyFile.set_boolean ("General", "RecentlySaved", recentlySaved);
|
||||
|
||||
// remove the old implementation of Rank and InTrash from cache
|
||||
if (keyFile.has_key ("General", "Rank")) keyFile.remove_key("General", "Rank");
|
||||
if (keyFile.has_key ("General", "InTrash")) keyFile.remove_key("General", "InTrash");
|
||||
|
||||
if (timeValid) {
|
||||
keyFile.set_integer ("DateTime", "Year", year);
|
||||
keyFile.set_integer ("DateTime", "Month", month);
|
||||
|
@ -31,8 +31,8 @@ class CacheImageData {
|
||||
Glib::ustring version;
|
||||
bool supported;
|
||||
ThFileType format;
|
||||
char rank;
|
||||
bool inTrash;
|
||||
char rankOld; // old implementation of rank
|
||||
bool inTrashOld; // old implementation of inTrash
|
||||
bool recentlySaved;
|
||||
|
||||
// time/date info
|
||||
|
@ -53,6 +53,19 @@ FileBrowser::FileBrowser ()
|
||||
pmenu->attach (*Gtk::manage(rank[3] = new Gtk::MenuItem (M("FILEBROWSER_POPUPRANK3"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(rank[4] = new Gtk::MenuItem (M("FILEBROWSER_POPUPRANK4"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(rank[5] = new Gtk::MenuItem (M("FILEBROWSER_POPUPRANK5"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++;
|
||||
|
||||
pmenu->attach (*Gtk::manage(colorlabel[0] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL0"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(colorlabel[1] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL1"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(colorlabel[2] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL2"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(colorlabel[3] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL3"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(colorlabel[4] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL4"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(colorlabel[5] = new Gtk::ImageMenuItem (M("FILEBROWSER_POPUPCOLORLABEL5"))), 0, 1, p, p+1); p++;
|
||||
|
||||
for (int i=1; i<=5; i++){//set color label images
|
||||
colorlabel[i]->set_image(*Gtk::manage(new Gtk::Image (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",i,".png"))));
|
||||
}
|
||||
|
||||
pmenu->attach (*Gtk::manage(new Gtk::SeparatorMenuItem ()), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(trash = new Gtk::MenuItem (M("FILEBROWSER_POPUPTRASH"))), 0, 1, p, p+1); p++;
|
||||
pmenu->attach (*Gtk::manage(untrash = new Gtk::MenuItem (M("FILEBROWSER_POPUPUNTRASH"))), 0, 1, p, p+1); p++;
|
||||
@ -89,7 +102,10 @@ FileBrowser::FileBrowser ()
|
||||
|
||||
open->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), open));
|
||||
for (int i=0; i<6; i++)
|
||||
rank[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), rank[i]));
|
||||
rank[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), rank[i]));
|
||||
for (int i=0; i<6; i++)
|
||||
colorlabel[i]->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), colorlabel[i]));
|
||||
|
||||
trash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), trash));
|
||||
untrash->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), untrash));
|
||||
develop->signal_activate().connect (sigc::bind(sigc::mem_fun(*this, &FileBrowser::menuItemActivated), develop));
|
||||
@ -237,6 +253,7 @@ void FileBrowser::addEntry_ (FileBrowserEntry* entry) {
|
||||
// add button set to the thumbbrowserentry
|
||||
entry->addButtonSet (new FileThumbnailButtonSet (entry));
|
||||
entry->getThumbButtonSet()->setRank (entry->thumbnail->getRank());
|
||||
entry->getThumbButtonSet()->setColorLabel (entry->thumbnail->getColorLabel());
|
||||
entry->getThumbButtonSet()->setInTrash (entry->thumbnail->getStage()==1);
|
||||
entry->getThumbButtonSet()->setButtonListener (this);
|
||||
entry->resize (getCurrentThumbSize());
|
||||
@ -340,7 +357,12 @@ void FileBrowser::menuItemActivated (Gtk::MenuItem* m) {
|
||||
if (m==rank[i]) {
|
||||
rankingRequested (mselected, i);
|
||||
return;
|
||||
}
|
||||
}
|
||||
for (int i=0; i<6; i++)
|
||||
if (m==colorlabel[i]) {
|
||||
colorlabelRequested (mselected, i);
|
||||
return;
|
||||
}
|
||||
if (m==open) {
|
||||
std::vector<Thumbnail*> entries;
|
||||
for (int i=0; i<mselected.size(); i++)
|
||||
@ -633,9 +655,9 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry
|
||||
|
||||
FileBrowserEntry* entry = (FileBrowserEntry*)entryb;
|
||||
// return false if basic filter settings are not satisfied
|
||||
if (filter.showRanked[entry->thumbnail->getRank()]==false || (entry->thumbnail->getStage()==1 && !filter.showTrash) || (entry->thumbnail->getStage()==0 && !filter.showNotTrash))
|
||||
if (filter.showRanked[entry->thumbnail->getRank()]==false || filter.showCLabeled[entry->thumbnail->getColorLabel()]==false || (entry->thumbnail->getStage()==1 && !filter.showTrash) || (entry->thumbnail->getStage()==0 && !filter.showNotTrash))
|
||||
return false;
|
||||
|
||||
|
||||
// check exif filter
|
||||
const CacheImageData* cfs = entry->thumbnail->getCacheImageData();
|
||||
double tol = 0.01;
|
||||
@ -662,11 +684,17 @@ bool FileBrowser::checkFilter (ThumbBrowserEntryBase* entryb) { // true -> entry
|
||||
void FileBrowser::toTrashRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
|
||||
for (int i=0; i<tbe.size(); i++) {
|
||||
if (tbe[i]->thumbnail->getStage()==1)
|
||||
// try to load the last saved parameters from the cache or from the paramfile file
|
||||
tbe[i]->thumbnail->createProcParamsForUpdate(); // this can execute customprofilebuilder to generate param file
|
||||
|
||||
// no need to notify listeners as item goes to trash, likely to be deleted
|
||||
|
||||
if (tbe[i]->thumbnail->getStage()==1)
|
||||
continue;
|
||||
tbe[i]->thumbnail->setStage (1);
|
||||
if (tbe[i]->getThumbButtonSet()) {
|
||||
tbe[i]->getThumbButtonSet()->setRank (tbe[i]->thumbnail->getRank());
|
||||
tbe[i]->getThumbButtonSet()->setColorLabel (tbe[i]->thumbnail->getColorLabel());
|
||||
tbe[i]->getThumbButtonSet()->setInTrash (true);
|
||||
tbe[i]->thumbnail->updateCache(); // needed to save the rank to disk
|
||||
}
|
||||
@ -678,11 +706,14 @@ void FileBrowser::toTrashRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
void FileBrowser::fromTrashRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
|
||||
for (int i=0; i<tbe.size(); i++) {
|
||||
// if thumbnail was marked inTrash=true then param file must be there, no need to run customprofilebuilder
|
||||
|
||||
if (tbe[i]->thumbnail->getStage()==0)
|
||||
continue;
|
||||
tbe[i]->thumbnail->setStage (0);
|
||||
if (tbe[i]->getThumbButtonSet()) {
|
||||
tbe[i]->getThumbButtonSet()->setRank (tbe[i]->thumbnail->getRank());
|
||||
tbe[i]->getThumbButtonSet()->setColorLabel (tbe[i]->thumbnail->getColorLabel());
|
||||
tbe[i]->getThumbButtonSet()->setInTrash (false);
|
||||
tbe[i]->thumbnail->updateCache(); // needed to save the rank to disk
|
||||
}
|
||||
@ -694,14 +725,40 @@ void FileBrowser::fromTrashRequested (std::vector<FileBrowserEntry*> tbe) {
|
||||
void FileBrowser::rankingRequested (std::vector<FileBrowserEntry*> tbe, int rank) {
|
||||
|
||||
for (int i=0; i<tbe.size(); i++) {
|
||||
// try to load the last saved parameters from the cache or from the paramfile file
|
||||
tbe[i]->thumbnail->createProcParamsForUpdate(); // this can execute customprofilebuilder to generate param file
|
||||
|
||||
// notify listeners TODO: should do this ONLY when params changed by customprofilebuilder?
|
||||
tbe[i]->thumbnail->notifylisterners_procParamsChanged(FILEBROWSER);
|
||||
|
||||
tbe[i]->thumbnail->setRank (rank);
|
||||
tbe[i]->thumbnail->updateCache(); // needed to save the rank to disk
|
||||
//TODO? - should update pparams instead?
|
||||
|
||||
if (tbe[i]->getThumbButtonSet())
|
||||
tbe[i]->getThumbButtonSet()->setRank (tbe[i]->thumbnail->getRank());
|
||||
}
|
||||
applyFilter (filter);
|
||||
}
|
||||
|
||||
void FileBrowser::colorlabelRequested (std::vector<FileBrowserEntry*> tbe, int colorlabel) {
|
||||
|
||||
for (int i=0; i<tbe.size(); i++) {
|
||||
// try to load the last saved parameters from the cache or from the paramfile file
|
||||
tbe[i]->thumbnail->createProcParamsForUpdate(); // this can execute customprofilebuilder to generate param file
|
||||
|
||||
// notify listeners TODO: should do this ONLY when params changed by customprofilebuilder?
|
||||
tbe[i]->thumbnail->notifylisterners_procParamsChanged(FILEBROWSER);
|
||||
|
||||
tbe[i]->thumbnail->setColorLabel (colorlabel);
|
||||
tbe[i]->thumbnail->updateCache(); // needed to save the colorlabel to disk
|
||||
//TODO? - should update pparams instead?
|
||||
if (tbe[i]->getThumbButtonSet())
|
||||
tbe[i]->getThumbButtonSet()->setColorLabel (tbe[i]->thumbnail->getColorLabel());
|
||||
}
|
||||
applyFilter (filter);
|
||||
}
|
||||
|
||||
void FileBrowser::buttonPressed (LWButton* button, int actionCode, void* actionData) {
|
||||
|
||||
if (actionCode>=0 && actionCode<=5) { // rank
|
||||
@ -709,7 +766,7 @@ void FileBrowser::buttonPressed (LWButton* button, int actionCode, void* actionD
|
||||
tbe.push_back ((FileBrowserEntry*)actionData);
|
||||
rankingRequested (tbe, actionCode);
|
||||
}
|
||||
else if (actionCode==6 && tbl) { // to processin queue
|
||||
else if (actionCode==6 && tbl) { // to processing queue
|
||||
std::vector<FileBrowserEntry*> tbe;
|
||||
tbe.push_back ((FileBrowserEntry*)actionData);
|
||||
tbl->developRequested (tbe);
|
||||
|
@ -53,6 +53,7 @@ class FileBrowser : public ThumbBrowserBase, public LWButtonListener {
|
||||
protected:
|
||||
|
||||
Gtk::MenuItem* rank[6];
|
||||
Gtk::ImageMenuItem* colorlabel[6];
|
||||
Gtk::MenuItem* trash;
|
||||
Gtk::MenuItem* untrash;
|
||||
Gtk::MenuItem* develop;
|
||||
@ -95,6 +96,7 @@ class FileBrowser : public ThumbBrowserBase, public LWButtonListener {
|
||||
void toTrashRequested (std::vector<FileBrowserEntry*> tbe);
|
||||
void fromTrashRequested (std::vector<FileBrowserEntry*> tbe);
|
||||
void rankingRequested (std::vector<FileBrowserEntry*> tbe, int rank);
|
||||
void colorlabelRequested (std::vector<FileBrowserEntry*> tbe, int colorlabel);
|
||||
void notifySelectionListener ();
|
||||
|
||||
type_trash_changed m_trash_changed;
|
||||
|
@ -87,23 +87,27 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
buttonBar->pack_start (*tbLeftPanel_1, Gtk::PACK_SHRINK);
|
||||
|
||||
buttonBar->pack_start (*(new Gtk::VSeparator), Gtk::PACK_SHRINK);
|
||||
bDir = Gtk::manage( new Gtk::ToggleButton () );
|
||||
bDir->set_active (true);
|
||||
bDir->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/folder_bw.png")));
|
||||
bDir->set_relief (Gtk::RELIEF_NONE);
|
||||
bDir->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT"));
|
||||
bDir->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
bCateg[0] = bDir->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bDir));
|
||||
buttonBar->pack_start (*bDir, Gtk::PACK_SHRINK);
|
||||
bFilterClear = Gtk::manage(new Gtk::ToggleButton ());
|
||||
bFilterClear->set_active (true);
|
||||
bFilterClear->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/filterclear.png")));
|
||||
bFilterClear->set_relief (Gtk::RELIEF_NONE);
|
||||
bFilterClear->set_tooltip_markup (M("FILEBROWSER_SHOWDIRHINT"));
|
||||
bFilterClear->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
bCateg[0] = bFilterClear->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bFilterClear));
|
||||
buttonBar->pack_start (*bFilterClear, Gtk::PACK_SHRINK);
|
||||
buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK);
|
||||
|
||||
fltrVbox1 = Gtk::manage (new Gtk::VBox());
|
||||
fltrRankbox = Gtk::manage (new Gtk::HBox());
|
||||
fltrLabelbox = Gtk::manage (new Gtk::HBox());
|
||||
|
||||
bUnRanked = Gtk::manage( new Gtk::ToggleButton () );
|
||||
bUnRanked->set_active (false);
|
||||
bUnRanked->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/unrated.png")));
|
||||
bUnRanked->set_relief (Gtk::RELIEF_NONE);
|
||||
bUnRanked->set_tooltip_markup (M("FILEBROWSER_SHOWUNRANKHINT"));
|
||||
bCateg[1] = bUnRanked->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bUnRanked));
|
||||
buttonBar->pack_start (*bUnRanked, Gtk::PACK_SHRINK);
|
||||
fltrRankbox->pack_start (*bUnRanked, Gtk::PACK_SHRINK);
|
||||
bUnRanked->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
|
||||
for (int i=0; i<5; i++) {
|
||||
@ -114,15 +118,49 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
bRank[i] = Gtk::manage( new Gtk::ToggleButton () );
|
||||
bRank[i]->set_image (*igranked[i]);
|
||||
bRank[i]->set_relief (Gtk::RELIEF_NONE);
|
||||
buttonBar->pack_start (*bRank[i], Gtk::PACK_SHRINK);
|
||||
fltrRankbox->pack_start (*bRank[i], Gtk::PACK_SHRINK);
|
||||
bCateg[i+2] = bRank[i]->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bRank[i]));
|
||||
bRank[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
}
|
||||
|
||||
bUnCLabeled = Gtk::manage(new Gtk::ToggleButton ());
|
||||
bUnCLabeled->set_active (false);
|
||||
bUnCLabeled->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/uncolorlabel.png")));
|
||||
bUnCLabeled->set_relief (Gtk::RELIEF_NONE);
|
||||
bUnCLabeled->set_tooltip_markup (M("FILEBROWSER_SHOWUNCOLORHINT"));
|
||||
bCateg[7] = bUnCLabeled->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bUnCLabeled));
|
||||
fltrLabelbox->pack_start (*bUnCLabeled, Gtk::PACK_SHRINK);
|
||||
bUnCLabeled->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
|
||||
for (int i=0; i<5; i++) {
|
||||
iCLabeled[i] = new Gtk::Image (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",i+1,".png"));
|
||||
igCLabeled[i] = new Gtk::Image (Glib::ustring::compose("%1%2%3%4",argv0,"/images/cglabel",i+1,".png"));
|
||||
iCLabeled[i]->show ();
|
||||
igCLabeled[i]->show ();
|
||||
bCLabel[i] = Gtk::manage(new Gtk::ToggleButton ());
|
||||
bCLabel[i]->set_image (*igCLabeled[i]);
|
||||
bCLabel[i]->set_relief (Gtk::RELIEF_NONE);
|
||||
fltrLabelbox->pack_start (*bCLabel[i], Gtk::PACK_SHRINK);
|
||||
bCateg[i+8] = bCLabel[i]->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bCLabel[i]));
|
||||
bCLabel[i]->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
}
|
||||
|
||||
fltrVbox1->pack_start (*fltrRankbox, Gtk::PACK_SHRINK,0);
|
||||
fltrVbox1->pack_start (*fltrLabelbox, Gtk::PACK_SHRINK,0);
|
||||
buttonBar->pack_start (*fltrVbox1, Gtk::PACK_SHRINK);
|
||||
|
||||
bRank[0]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK1HINT"));
|
||||
bRank[1]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK2HINT"));
|
||||
bRank[2]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK3HINT"));
|
||||
bRank[3]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK4HINT"));
|
||||
bRank[4]->set_tooltip_markup (M("FILEBROWSER_SHOWRANK5HINT"));
|
||||
|
||||
bCLabel[0]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL1HINT"));
|
||||
bCLabel[1]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL2HINT"));
|
||||
bCLabel[2]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL3HINT"));
|
||||
bCLabel[3]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL4HINT"));
|
||||
bCLabel[4]->set_tooltip_markup (M("FILEBROWSER_SHOWCOLORLABEL5HINT"));
|
||||
|
||||
buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK);
|
||||
|
||||
iTrashEmpty = new Gtk::Image(argv0+"/images/trash-show-empty.png") ;
|
||||
@ -131,18 +169,33 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
bTrash = Gtk::manage( new Gtk::ToggleButton () );
|
||||
bTrash->set_image (*iTrashEmpty);
|
||||
bTrash->set_relief (Gtk::RELIEF_NONE);
|
||||
bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT"));
|
||||
bCateg[7] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash));
|
||||
bTrash->set_tooltip_markup (M("FILEBROWSER_SHOWTRASHHINT"));
|
||||
bCateg[13] = bTrash->signal_toggled().connect (sigc::bind(sigc::mem_fun(*this, &FileCatalog::categoryButtonToggled), bTrash));
|
||||
bTrash->signal_button_press_event().connect (sigc::mem_fun(*this, &FileCatalog::capture_event),false);
|
||||
buttonBar->pack_start (*bTrash, Gtk::PACK_SHRINK);
|
||||
buttonBar->pack_start (*Gtk::manage(new Gtk::VSeparator), Gtk::PACK_SHRINK);
|
||||
fileBrowser->trash_changed().connect( sigc::mem_fun(*this, &FileCatalog::trashChanged) );
|
||||
|
||||
categoryButtons[0] = bDir;
|
||||
// 0 - bFilterClear
|
||||
// 1 - bUnRanked
|
||||
// 2 - bRank[0]
|
||||
// 3 - bRank[1]
|
||||
// 4 - bRank[2]
|
||||
// 5 - bRank[3]
|
||||
// 6 - bRank[4]
|
||||
// 7 - bUnCLabeled
|
||||
// 8 - bCLabel[0]
|
||||
// 9 - bCLabel[1]
|
||||
// 10 - bCLabel[2]
|
||||
// 11 - bCLabel[3]
|
||||
// 12 - bCLabel[4]
|
||||
// 13 - bTrash
|
||||
categoryButtons[0] = bFilterClear;
|
||||
categoryButtons[1] = bUnRanked;
|
||||
for (int i=0; i<5; i++)
|
||||
categoryButtons[i+2] = bRank[i];
|
||||
categoryButtons[7] = bTrash;
|
||||
for (int i=0; i<5; i++){ categoryButtons[i+2] = bRank[i];}
|
||||
categoryButtons[7] = bUnCLabeled;
|
||||
for (int i=0; i<5; i++){ categoryButtons[i+8] = bCLabel[i];}
|
||||
categoryButtons[13] = bTrash;
|
||||
|
||||
exifInfo = Gtk::manage(new Gtk::ToggleButton ());
|
||||
exifInfo->set_image (*Gtk::manage(new Gtk::Image (argv0+"/images/info.png")));
|
||||
@ -214,7 +267,7 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
enabled = true;
|
||||
|
||||
lastScrollPos = 0;
|
||||
for (int i=0; i<8; i++) {
|
||||
for (int i=0; i<14; i++) {
|
||||
hScrollPos[i] = 0;
|
||||
vScrollPos[i] = 0;
|
||||
}
|
||||
@ -225,11 +278,12 @@ FileCatalog::FileCatalog (CoarsePanel* cp, ToolBar* tb, FilePanel* filepanel) :
|
||||
#endif
|
||||
}
|
||||
|
||||
FileCatalog::~FileCatalog()
|
||||
{
|
||||
for (int i=0; i<5; i++) {
|
||||
delete iranked[i];
|
||||
FileCatalog::~FileCatalog(){
|
||||
for (int i=0; i<5; i++) {
|
||||
delete iranked[i];
|
||||
delete igranked[i];
|
||||
delete iCLabeled[i];
|
||||
delete igCLabeled[i];
|
||||
}
|
||||
delete iTrashEmpty;
|
||||
delete iTrashFull;
|
||||
@ -799,7 +853,7 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
//was shift key pressed
|
||||
bool shift_down = modifierKey & GDK_SHIFT_MASK;
|
||||
|
||||
for (int i=0; i<8; i++)
|
||||
for (int i=0; i<14; i++)
|
||||
bCateg[i].block (true);
|
||||
|
||||
//button is already toggled when entering this function, so we switch it back to its initial state
|
||||
@ -813,9 +867,9 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
//we look how many stars are already toggled on, if any
|
||||
int toggled_stars_count=0, buttons=0, start_star=0, toggled_button=0;
|
||||
|
||||
for (int i=0; i<8; i++) {
|
||||
for (int i=0; i<14; i++) {
|
||||
if (categoryButtons[i]->get_active()) {
|
||||
if (i>0 && i<7) {
|
||||
if (i>0 && i<13) {
|
||||
toggled_stars_count ++;
|
||||
start_star = i;
|
||||
}
|
||||
@ -826,12 +880,12 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
|
||||
//if no modifier key were pressed, we can switch-on the button, and clear all others
|
||||
if (!(control_down || shift_down)) {
|
||||
for (int i=0; i<8; i++) {
|
||||
for (int i=0; i<14; i++) {
|
||||
categoryButtons[i]->set_active (i==toggled_button);
|
||||
}
|
||||
}
|
||||
//modifier key allowed only for stars
|
||||
else if (toggled_button>0 && toggled_button<7) {
|
||||
//modifier key allowed only for stars and color labels
|
||||
else if (toggled_button>0 && toggled_button<13) {
|
||||
if (control_down) {
|
||||
//control is pressed
|
||||
if (toggled_stars_count == 1 && (buttons & (1 << toggled_button))) {
|
||||
@ -848,17 +902,18 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
//no star selected
|
||||
//we deselect the 2 non star filters
|
||||
if (buttons & 1 ) categoryButtons[0]->set_active(false);
|
||||
if (buttons & (1 << 7)) categoryButtons[7]->set_active(false);
|
||||
if (buttons & (1 << 13)) categoryButtons[13]->set_active(false);
|
||||
//and we toggle on the star
|
||||
categoryButtons[toggled_button]->set_active (true);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//shift is pressed, only allowed if 0 or 1 star is selected
|
||||
//shift is pressed, only allowed if 0 or 1 star & labels is selected
|
||||
if (!toggled_stars_count) {
|
||||
//we deselect the 2 non star filters
|
||||
if (buttons & 1 ) categoryButtons[0]->set_active(false);
|
||||
if (buttons & (1 << 7)) categoryButtons[7]->set_active(false);
|
||||
if (buttons & (1 << 13)) categoryButtons[13]->set_active(false); //!!! verify if (1 << 13) is correct?
|
||||
//and we set the start star to 1 (unrated images)
|
||||
start_star = 1;
|
||||
//we act as if one star were selected
|
||||
@ -873,11 +928,11 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
if (!(buttons & (1 << current_star))) categoryButtons[current_star]->set_active(true);
|
||||
}
|
||||
}
|
||||
//if more than one star selected, do nothing
|
||||
//if more than one star & color label is selected, do nothing
|
||||
}
|
||||
}
|
||||
|
||||
//so set the right images
|
||||
// set the right images
|
||||
for (int i=0; i<5; i++) {
|
||||
bool active_now, active_before;
|
||||
active_now = bRank[i]->get_active();
|
||||
@ -886,6 +941,16 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
else if (!active_now && active_before) bRank[i]->set_image (*igranked[i]);
|
||||
}
|
||||
|
||||
|
||||
// set the right images
|
||||
for (int i=0; i<5; i++) {
|
||||
bool active_now, active_before;
|
||||
active_now = bCLabel[i]->get_active();
|
||||
active_before = buttons & (1 << (i+8));
|
||||
if ( active_now && !active_before) bCLabel[i]->set_image (*iCLabeled[i]);
|
||||
else if (!active_now && active_before) bCLabel[i]->set_image (*igCLabeled[i]);
|
||||
}
|
||||
|
||||
fileBrowser->applyFilter (getFilter ());
|
||||
_refreshProgressBar();
|
||||
|
||||
@ -898,17 +963,40 @@ void FileCatalog::categoryButtonToggled (Gtk::ToggleButton* b) {
|
||||
fileBrowser->setScrollPosition (hScrollPos[lastScrollPos], vScrollPos[lastScrollPos]);
|
||||
}
|
||||
|
||||
for (int i=0; i<8; i++)
|
||||
for (int i=0; i<14; i++)
|
||||
bCateg[i].block (false);
|
||||
}
|
||||
|
||||
BrowserFilter FileCatalog::getFilter () {
|
||||
|
||||
BrowserFilter filter;
|
||||
filter.showRanked[0] = bDir->get_active() || bUnRanked->get_active () || bTrash->get_active ();
|
||||
filter.showRanked[0] = bFilterClear->get_active() || bUnRanked->get_active () || bTrash->get_active () || \
|
||||
bUnCLabeled->get_active () || bCLabel[0]->get_active ()|| bCLabel[1]->get_active ()|| bCLabel[2]->get_active ()|| bCLabel[3]->get_active ()|| bCLabel[4]->get_active ();
|
||||
for (int i=1; i<=5; i++)
|
||||
filter.showRanked[i] = bDir->get_active() || bRank[i-1]->get_active () || bTrash->get_active ();
|
||||
filter.showTrash = bDir->get_active() || bTrash->get_active ();
|
||||
filter.showRanked[i] = bFilterClear->get_active() || bRank[i-1]->get_active () || bTrash->get_active () || \
|
||||
bUnCLabeled->get_active () || bCLabel[0]->get_active ()|| bCLabel[1]->get_active ()|| bCLabel[2]->get_active ()|| bCLabel[3]->get_active ()|| bCLabel[4]->get_active ();
|
||||
|
||||
filter.showCLabeled[0] = bFilterClear->get_active() || bUnCLabeled->get_active () || bTrash->get_active () || \
|
||||
bUnRanked->get_active () || bRank[0]->get_active () || bRank[1]->get_active () || bRank[2]->get_active () || bRank[3]->get_active () || bRank[4]->get_active ();
|
||||
for (int i=1; i<=5; i++)
|
||||
filter.showCLabeled[i] = bFilterClear->get_active() || bCLabel[i-1]->get_active () || bTrash->get_active () || \
|
||||
bUnRanked->get_active () || bRank[0]->get_active () || bRank[1]->get_active () || bRank[2]->get_active () || bRank[3]->get_active () || bRank[4]->get_active ();
|
||||
|
||||
// handle AND logic between rank and color labels:
|
||||
// only when both filters for rank and color labels are selected
|
||||
if ((bUnCLabeled->get_active () || bCLabel[0]->get_active ()|| bCLabel[1]->get_active ()|| bCLabel[2]->get_active ()|| bCLabel[3]->get_active ()|| bCLabel[4]->get_active ()) \
|
||||
&& (bUnRanked->get_active () || bRank[0]->get_active () || bRank[1]->get_active () || bRank[2]->get_active () || bRank[3]->get_active () || bRank[4]->get_active ()) ){
|
||||
|
||||
filter.showRanked[0] = bUnRanked->get_active ();
|
||||
filter.showCLabeled[0] = bUnCLabeled->get_active ();
|
||||
|
||||
for (int i=1; i<=5; i++){
|
||||
filter.showRanked[i] = bRank[i-1]->get_active ();
|
||||
filter.showCLabeled[i] = bCLabel[i-1]->get_active ();
|
||||
}
|
||||
}
|
||||
|
||||
filter.showTrash = bFilterClear->get_active() || bTrash->get_active ();
|
||||
filter.showNotTrash = !bTrash->get_active ();
|
||||
if (!filterPanel)
|
||||
filter.exifFilterEnabled = false;
|
||||
@ -1210,37 +1298,62 @@ bool FileCatalog::handleShortcutKey (GdkEventKey* event) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch(event->keyval) {
|
||||
case GDK_1:
|
||||
categoryButtonToggled(bRank[0]);
|
||||
return true;
|
||||
case GDK_2:
|
||||
categoryButtonToggled(bRank[1]);
|
||||
return true;
|
||||
case GDK_3:
|
||||
categoryButtonToggled(bRank[2]);
|
||||
return true;
|
||||
case GDK_4:
|
||||
categoryButtonToggled(bRank[3]);
|
||||
return true;
|
||||
case GDK_5:
|
||||
categoryButtonToggled(bRank[4]);
|
||||
return true;
|
||||
case GDK_grave:
|
||||
categoryButtonToggled(bUnRanked);
|
||||
return true;
|
||||
|
||||
case GDK_Return:
|
||||
case GDK_KP_Enter:
|
||||
FileCatalog::buttonBrowsePathPressed ();
|
||||
return true;
|
||||
if (!alt) {
|
||||
switch(event->keyval) {
|
||||
case GDK_1:
|
||||
categoryButtonToggled(bRank[0]);
|
||||
return true;
|
||||
case GDK_2:
|
||||
categoryButtonToggled(bRank[1]);
|
||||
return true;
|
||||
case GDK_3:
|
||||
categoryButtonToggled(bRank[2]);
|
||||
return true;
|
||||
case GDK_4:
|
||||
categoryButtonToggled(bRank[3]);
|
||||
return true;
|
||||
case GDK_5:
|
||||
categoryButtonToggled(bRank[4]);
|
||||
return true;
|
||||
case GDK_grave:
|
||||
categoryButtonToggled(bUnRanked);
|
||||
return true;
|
||||
|
||||
case GDK_Return:
|
||||
case GDK_KP_Enter:
|
||||
FileCatalog::buttonBrowsePathPressed ();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (alt) {
|
||||
switch(event->keyval) {
|
||||
case GDK_1:
|
||||
categoryButtonToggled(bCLabel[0]);
|
||||
return true;
|
||||
case GDK_2:
|
||||
categoryButtonToggled(bCLabel[1]);
|
||||
return true;
|
||||
case GDK_3:
|
||||
categoryButtonToggled(bCLabel[2]);
|
||||
return true;
|
||||
case GDK_4:
|
||||
categoryButtonToggled(bCLabel[3]);
|
||||
return true;
|
||||
case GDK_5:
|
||||
categoryButtonToggled(bCLabel[4]);
|
||||
return true;
|
||||
case GDK_grave:
|
||||
categoryButtonToggled(bUnCLabeled);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ctrl && !alt) {
|
||||
switch(event->keyval) {
|
||||
case GDK_d:
|
||||
case GDK_D:
|
||||
categoryButtonToggled(bDir);
|
||||
categoryButtonToggled(bFilterClear);
|
||||
return true;
|
||||
case GDK_t:
|
||||
case GDK_T:
|
||||
|
@ -73,16 +73,22 @@ class FileCatalog : public Gtk::VBox,
|
||||
|
||||
Gtk::HBox* buttonBar;
|
||||
Gtk::HBox* buttonBar2;
|
||||
Gtk::HBox* fltrRankbox;
|
||||
Gtk::HBox* fltrLabelbox;
|
||||
Gtk::VBox* fltrVbox1;
|
||||
Gtk::ToggleButton* tbLeftPanel_1;
|
||||
Gtk::ToggleButton* tbRightPanel_1;
|
||||
Gtk::ToggleButton* bDir;
|
||||
Gtk::ToggleButton* bFilterClear;
|
||||
Gtk::ToggleButton* bUnRanked;
|
||||
Gtk::ToggleButton* bRank[5];
|
||||
Gtk::ToggleButton* bUnCLabeled;
|
||||
Gtk::ToggleButton* bCLabel[5];//color label
|
||||
Gtk::ToggleButton* bTrash;
|
||||
Gtk::ToggleButton* categoryButtons[8];
|
||||
Gtk::ToggleButton* categoryButtons[14];
|
||||
Gtk::ToggleButton* exifInfo;
|
||||
sigc::connection bCateg[8];
|
||||
sigc::connection bCateg[14];
|
||||
Gtk::Image* iranked[5], *igranked[5];
|
||||
Gtk::Image* iCLabeled[5], *igCLabeled[5];
|
||||
Gtk::Image *iTrashEmpty, *iTrashFull;
|
||||
Gtk::Image *iRightArrow_red, *iRightArrow;
|
||||
Gtk::Image *iLeftPanel_1_Show, *iLeftPanel_1_Hide, *iRightPanel_1_Show, *iRightPanel_1_Hide;
|
||||
@ -90,8 +96,8 @@ class FileCatalog : public Gtk::VBox,
|
||||
Gtk::Button* buttonBrowsePath;
|
||||
sigc::connection BrowsePathconn;
|
||||
|
||||
double hScrollPos[8];
|
||||
double vScrollPos[8];
|
||||
double hScrollPos[14];
|
||||
double vScrollPos[14];
|
||||
int lastScrollPos;
|
||||
|
||||
Gtk::VBox* trashButtonBox;
|
||||
|
@ -30,6 +30,12 @@ Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::unRankIcon;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::trashIcon;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::unTrashIcon;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::processIcon;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_0;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_1;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_2;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_3;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_4;
|
||||
Cairo::RefPtr<Cairo::ImageSurface> FileThumbnailButtonSet::colorLabelIcon_5;
|
||||
|
||||
FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) {
|
||||
|
||||
@ -40,6 +46,13 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) {
|
||||
trashIcon = safe_create_from_png (argv0+"/images/trash.png");
|
||||
unTrashIcon = safe_create_from_png (argv0+"/images/undelete.png");
|
||||
processIcon = safe_create_from_png (argv0+"/images/processing.png");
|
||||
|
||||
colorLabelIcon_0 = safe_create_from_png (argv0+"/images/nocolorlabel.png");
|
||||
colorLabelIcon_1 = safe_create_from_png (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",1,".png"));
|
||||
colorLabelIcon_2 = safe_create_from_png (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",2,".png"));
|
||||
colorLabelIcon_3 = safe_create_from_png (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",3,".png"));
|
||||
colorLabelIcon_4 = safe_create_from_png (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",4,".png"));
|
||||
colorLabelIcon_5 = safe_create_from_png (Glib::ustring::compose("%1%2%3%4",argv0,"/images/clabel",5,".png"));
|
||||
iconsLoaded = true;
|
||||
}
|
||||
|
||||
@ -49,6 +62,8 @@ FileThumbnailButtonSet::FileThumbnailButtonSet (FileBrowserEntry* myEntry) {
|
||||
add (new LWButton (rankIcon, i+1, myEntry, LWButton::Left));
|
||||
add (new LWButton (trashIcon, 7, myEntry, LWButton::Right, LWButton::Center, M("FILEBROWSER_POPUPTRASH")));
|
||||
|
||||
add (new LWButton (colorLabelIcon_0, 8, myEntry, LWButton::Right, LWButton::Center, M("FILEBROWSER_POPUPCOLORLABEL")));
|
||||
|
||||
buttons[2]->setToolTip (M("FILEBROWSER_POPUPRANK1"));
|
||||
buttons[3]->setToolTip (M("FILEBROWSER_POPUPRANK2"));
|
||||
buttons[4]->setToolTip (M("FILEBROWSER_POPUPRANK3"));
|
||||
@ -62,8 +77,18 @@ void FileThumbnailButtonSet::setRank (int stars) {
|
||||
buttons[i+1]->setIcon (i<=stars ? rankIcon : gRankIcon);
|
||||
}
|
||||
|
||||
void FileThumbnailButtonSet::setColorLabel (int colorLabel) {
|
||||
|
||||
if (colorLabel==0) buttons[8]->setIcon (colorLabelIcon_0); //transparent label
|
||||
if (colorLabel==1) buttons[8]->setIcon (colorLabelIcon_1);
|
||||
if (colorLabel==2) buttons[8]->setIcon (colorLabelIcon_2);
|
||||
if (colorLabel==3) buttons[8]->setIcon (colorLabelIcon_3);
|
||||
if (colorLabel==4) buttons[8]->setIcon (colorLabelIcon_4);
|
||||
if (colorLabel==5) buttons[8]->setIcon (colorLabelIcon_5);
|
||||
}
|
||||
|
||||
void FileThumbnailButtonSet::setInTrash (bool inTrash) {
|
||||
|
||||
buttons[7]->setIcon (inTrash ? unTrashIcon : trashIcon);
|
||||
buttons[7]->setToolTip (inTrash ? M("FILEBROWSER_POPUPUNTRASH") : M("FILEBROWSER_POPUPTRASH"));
|
||||
buttons[7]->setIcon (inTrash ? unTrashIcon : trashIcon);
|
||||
buttons[7]->setToolTip (inTrash ? M("FILEBROWSER_POPUPUNTRASH") : M("FILEBROWSER_POPUPTRASH"));
|
||||
}
|
||||
|
@ -35,9 +35,17 @@ class FileThumbnailButtonSet : public LWButtonSet {
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> trashIcon;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> unTrashIcon;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> processIcon;
|
||||
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_0;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_1;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_2;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_3;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_4;
|
||||
static Cairo::RefPtr<Cairo::ImageSurface> colorLabelIcon_5;
|
||||
|
||||
FileThumbnailButtonSet (FileBrowserEntry* myEntry);
|
||||
void setRank (int stars);
|
||||
void setColorLabel (int colorlabel);
|
||||
void setInTrash (bool inTrash);
|
||||
|
||||
};
|
||||
|
@ -42,7 +42,19 @@ Thumbnail::Thumbnail (CacheManager* cm, const Glib::ustring& fname, CacheImageDa
|
||||
loadProcParams ();
|
||||
_loadThumbnail ();
|
||||
generateExifDateTimeStrings ();
|
||||
|
||||
|
||||
if (cfs.rankOld >= 0){
|
||||
// rank and inTrash were found in cache (old style), move them over to pparams
|
||||
|
||||
// try to load the last saved parameters from the cache or from the paramfile file
|
||||
createProcParamsForUpdate(); // this can execute customprofilebuilder to generate param file
|
||||
|
||||
// TODO? should we call notifylisterners_procParamsChanged here?
|
||||
|
||||
setRank(cfs.rankOld);
|
||||
setStage(cfs.inTrashOld);
|
||||
}
|
||||
|
||||
delete tpp;
|
||||
tpp = 0;
|
||||
}
|
||||
@ -194,6 +206,11 @@ rtengine::procparams::ProcParams* Thumbnail::createProcParamsForUpdate() {
|
||||
return ldprof;
|
||||
}
|
||||
|
||||
void Thumbnail::notifylisterners_procParamsChanged(int whoChangedIt){
|
||||
for (int i=0; i<listeners.size(); i++)
|
||||
listeners[i]->procParamsChanged (this, whoChangedIt);
|
||||
}
|
||||
|
||||
void Thumbnail::loadProcParams () {
|
||||
// TODO: Check for Linux
|
||||
#ifdef WIN32
|
||||
@ -220,26 +237,62 @@ void Thumbnail::loadProcParams () {
|
||||
}
|
||||
|
||||
void Thumbnail::clearProcParams (int whoClearedIt) {
|
||||
|
||||
/* Clarification on current "clear profile" functionality:
|
||||
a. if rank/colorlabel/inTrash are NOT set,
|
||||
the "clear profile" will delete the pp3 file (as before).
|
||||
|
||||
b. if any of the rank/colorlabel/inTrash ARE set,
|
||||
the "clear profile" will lead to execution of ProcParams::setDefaults
|
||||
(the CPB is NOT called) to set the params values and will preserve
|
||||
rank/colorlabel/inTrash in the param file. */
|
||||
|
||||
// TODO: Check for Linux
|
||||
#ifdef WIN32
|
||||
Glib::Mutex::Lock lock(mutex);
|
||||
#endif
|
||||
|
||||
// preserve rank, colorlabel and inTrash across clear
|
||||
int rank = getRank();
|
||||
int colorlabel = getColorLabel();
|
||||
int inTrash = getStage();
|
||||
|
||||
|
||||
cfs.recentlySaved = false;
|
||||
pparamsValid = false;
|
||||
needsReProcessing = true;
|
||||
// remove param file from cache
|
||||
Glib::ustring fname_ = getCacheFileName ("profiles")+paramFileExtension;
|
||||
if (safe_file_test (fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
// remove param file located next to the file
|
||||
// fname_ = removeExtension(fname) + paramFileExtension;
|
||||
fname_ = fname + paramFileExtension;
|
||||
if (safe_file_test(fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
fname_ = removeExtension(fname) + paramFileExtension;
|
||||
if (safe_file_test (fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
|
||||
//TODO: run though customprofilebuilder?
|
||||
// probably not as this is the only option to set param values to default
|
||||
|
||||
// reset the params to defaults
|
||||
pparams.setDefaults();
|
||||
|
||||
// and restore rank and inTrash
|
||||
setRank(rank);
|
||||
setColorLabel(colorlabel);
|
||||
setStage(inTrash);
|
||||
|
||||
// params could get validated by rank/inTrash values restored above
|
||||
if (pparamsValid)
|
||||
{
|
||||
updateCache();
|
||||
}
|
||||
else
|
||||
{
|
||||
// remove param file from cache
|
||||
Glib::ustring fname_ = getCacheFileName ("profiles")+paramFileExtension;
|
||||
if (safe_file_test (fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
// remove param file located next to the file
|
||||
// fname_ = removeExtension(fname) + paramFileExtension;
|
||||
fname_ = fname + paramFileExtension;
|
||||
if (safe_file_test(fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
fname_ = removeExtension(fname) + paramFileExtension;
|
||||
if (safe_file_test (fname_, Glib::FILE_TEST_EXISTS))
|
||||
safe_g_remove (fname_);
|
||||
}
|
||||
|
||||
for (int i=0; i<listeners.size(); i++)
|
||||
listeners[i]->procParamsChanged (this, whoClearedIt);
|
||||
@ -259,9 +312,19 @@ void Thumbnail::setProcParams (const ProcParams& pp, int whoChangedIt, bool upda
|
||||
if (pparams!=pp)
|
||||
cfs.recentlySaved = false;
|
||||
|
||||
// do not update rank, colorlabel and inTrash
|
||||
int rank = getRank();
|
||||
int colorlabel = getColorLabel();
|
||||
int inTrash = getStage();
|
||||
|
||||
pparams = pp;
|
||||
pparamsValid = true;
|
||||
needsReProcessing = true;
|
||||
|
||||
setRank(rank);
|
||||
setColorLabel(colorlabel);
|
||||
setStage(inTrash);
|
||||
|
||||
if (updateCacheNow)
|
||||
updateCache ();
|
||||
|
||||
|
@ -87,6 +87,8 @@ class Thumbnail {
|
||||
void clearProcParams (int whoClearedIt=-1);
|
||||
void loadProcParams ();
|
||||
|
||||
void notifylisterners_procParamsChanged(int whoChangedIt);
|
||||
|
||||
bool isQuick() { return cfs.thumbImgType == CacheImageData::QUICK_THUMBNAIL; }
|
||||
bool isPParamsValid() { return pparamsValid; }
|
||||
bool isRecentlySaved ();
|
||||
@ -117,11 +119,14 @@ class Thumbnail {
|
||||
const CacheImageData* getCacheImageData() { return &cfs; }
|
||||
std::string getMD5 () { return cfs.md5; }
|
||||
|
||||
int getRank () { return cfs.rank; }
|
||||
void setRank (int rank) { cfs.rank = rank; }
|
||||
int getRank () { return pparams.rank; }
|
||||
void setRank (int rank) { if (pparams.rank != rank) { pparams.rank = rank; pparamsValid = true; } }
|
||||
|
||||
int getStage () { return cfs.inTrash; }
|
||||
void setStage (int stage) { cfs.inTrash = stage; }
|
||||
int getColorLabel () { return pparams.colorlabel; }
|
||||
void setColorLabel (int colorlabel) { if (pparams.colorlabel != colorlabel) { pparams.colorlabel = colorlabel; pparamsValid = true; } }
|
||||
|
||||
int getStage () { return pparams.inTrash; }
|
||||
void setStage (int stage) { if (pparams.inTrash != stage) { pparams.inTrash = stage; pparamsValid = true; } }
|
||||
|
||||
void addThumbnailListener (ThumbnailListener* tnl);
|
||||
void removeThumbnailListener (ThumbnailListener* tnl);
|
||||
|