diff --git a/rtdata/images/cglabel1.png b/rtdata/images/cglabel1.png
new file mode 100644
index 000000000..e1b20bd04
Binary files /dev/null and b/rtdata/images/cglabel1.png differ
diff --git a/rtdata/images/cglabel2.png b/rtdata/images/cglabel2.png
new file mode 100644
index 000000000..c78a09936
Binary files /dev/null and b/rtdata/images/cglabel2.png differ
diff --git a/rtdata/images/cglabel3.png b/rtdata/images/cglabel3.png
new file mode 100644
index 000000000..bd19d2fff
Binary files /dev/null and b/rtdata/images/cglabel3.png differ
diff --git a/rtdata/images/cglabel4.png b/rtdata/images/cglabel4.png
new file mode 100644
index 000000000..01861c210
Binary files /dev/null and b/rtdata/images/cglabel4.png differ
diff --git a/rtdata/images/cglabel5.png b/rtdata/images/cglabel5.png
new file mode 100644
index 000000000..12d1ed202
Binary files /dev/null and b/rtdata/images/cglabel5.png differ
diff --git a/rtdata/images/clabel1.png b/rtdata/images/clabel1.png
new file mode 100644
index 000000000..693a12d5e
Binary files /dev/null and b/rtdata/images/clabel1.png differ
diff --git a/rtdata/images/clabel2.png b/rtdata/images/clabel2.png
new file mode 100644
index 000000000..c0c8a1666
Binary files /dev/null and b/rtdata/images/clabel2.png differ
diff --git a/rtdata/images/clabel3.png b/rtdata/images/clabel3.png
new file mode 100644
index 000000000..908144636
Binary files /dev/null and b/rtdata/images/clabel3.png differ
diff --git a/rtdata/images/clabel4.png b/rtdata/images/clabel4.png
new file mode 100644
index 000000000..7f5e87785
Binary files /dev/null and b/rtdata/images/clabel4.png differ
diff --git a/rtdata/images/clabel5.png b/rtdata/images/clabel5.png
new file mode 100644
index 000000000..44e4f5acb
Binary files /dev/null and b/rtdata/images/clabel5.png differ
diff --git a/rtdata/images/filterclear.png b/rtdata/images/filterclear.png
new file mode 100644
index 000000000..98b81b9b5
Binary files /dev/null and b/rtdata/images/filterclear.png differ
diff --git a/rtdata/images/nocolorlabel.png b/rtdata/images/nocolorlabel.png
new file mode 100644
index 000000000..420d3a963
Binary files /dev/null and b/rtdata/images/nocolorlabel.png differ
diff --git a/rtdata/images/uncolorlabel.png b/rtdata/images/uncolorlabel.png
new file mode 100644
index 000000000..44b4021a9
Binary files /dev/null and b/rtdata/images/uncolorlabel.png differ
diff --git a/rtdata/images/unrated.png b/rtdata/images/unrated.png
index 247127ea5..ff75cc7c9 100644
Binary files a/rtdata/images/unrated.png and b/rtdata/images/unrated.png differ
diff --git a/rtdata/languages/default b/rtdata/languages/default
index 28d489348..799de3535 100644
--- a/rtdata/languages/default
+++ b/rtdata/languages/default
@@ -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 D
+FILEBROWSER_SHOWCOLORLABEL1HINT;Show images labeled Red Alt-1
+FILEBROWSER_SHOWCOLORLABEL2HINT;Show images labeled Yelow Alt-2
+FILEBROWSER_SHOWCOLORLABEL3HINT;Show images labeled Green Alt-3
+FILEBROWSER_SHOWCOLORLABEL4HINT;Show images labeled Blue Alt-4
+FILEBROWSER_SHOWCOLORLABEL5HINT;Show images labeled Purple Alt-5
+FILEBROWSER_SHOWDIRHINT;Show all images in the directory (clear all filters) D
FILEBROWSER_SHOWEXIFINFO;Show EXIF info i
FILEBROWSER_SHOWQUEUEHINT;Show content of the processing queue
FILEBROWSER_SHOWRANK1HINT;Show images ranked as 1 star 1
@@ -117,6 +129,7 @@ FILEBROWSER_SHOWRANK3HINT;Show images ranked as 3 star 3
FILEBROWSER_SHOWRANK4HINT;Show images ranked as 4 star 4
FILEBROWSER_SHOWRANK5HINT;Show images ranked as 5 star 5
FILEBROWSER_SHOWTRASHHINT;Show content of the trash T
+FILEBROWSER_SHOWUNCOLORHINT;Show images without Color label Alt-`
FILEBROWSER_SHOWUNRANKHINT;Show unranked images `
FILEBROWSER_STARTPROCESSING;Start processing
FILEBROWSER_STARTPROCESSINGHINT;Start processing/saving of images in the queue
diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc
index 4043cd976..c224183e9 100644
--- a/rtengine/procparams.cc
+++ b/rtengine/procparams.cc
@@ -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");
diff --git a/rtengine/procparams.h b/rtengine/procparams.h
index 155c0b92a..aa68c7dc3 100644
--- a/rtengine/procparams.h
+++ b/rtengine/procparams.h
@@ -466,6 +466,9 @@ class ProcParams {
HSVEqualizerParams hsvequalizer; ///< hsv equalizer parameters
std::vector exif; ///< List of modifications appplied on the exif tags of the input image
std::vector 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
diff --git a/rtgui/batchqueue.cc b/rtgui/batchqueue.cc
index 640eacb9b..0069b24a8 100644
--- a/rtgui/batchqueue.cc
+++ b/rtgui/batchqueue.cc
@@ -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++;
diff --git a/rtgui/browserfilter.cc b/rtgui/browserfilter.cc
index c39e40e5e..ac85a92f3 100644
--- a/rtgui/browserfilter.cc
+++ b/rtgui/browserfilter.cc
@@ -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;
+ }
}
diff --git a/rtgui/browserfilter.h b/rtgui/browserfilter.h
index 61a9d5684..7106ce374 100644
--- a/rtgui/browserfilter.h
+++ b/rtgui/browserfilter.h
@@ -25,8 +25,10 @@ class BrowserFilter {
public:
bool showRanked[6];
+ bool showCLabeled[6];
bool showTrash;
bool showNotTrash;
+ bool showEdited[2];
bool exifFilterEnabled;
ExifFilterSettings exifFilter;
diff --git a/rtgui/cacheimagedata.cc b/rtgui/cacheimagedata.cc
index fdfbd2a04..6bd273bf3 100644
--- a/rtgui/cacheimagedata.cc
+++ b/rtgui/cacheimagedata.cc
@@ -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);
diff --git a/rtgui/cacheimagedata.h b/rtgui/cacheimagedata.h
index d27504a3b..3c24f973d 100644
--- a/rtgui/cacheimagedata.h
+++ b/rtgui/cacheimagedata.h
@@ -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
diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc
index 1171bf5b0..58aef36fa 100644
--- a/rtgui/filebrowser.cc
+++ b/rtgui/filebrowser.cc
@@ -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 entries;
for (int i=0; i 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 tbe) {
for (int i=0; ithumbnail->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 tbe) {
void FileBrowser::fromTrashRequested (std::vector tbe) {
for (int i=0; ithumbnail->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 tbe) {
void FileBrowser::rankingRequested (std::vector tbe, int rank) {
for (int i=0; ithumbnail->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 tbe, int colorlabel) {
+
+ for (int i=0; ithumbnail->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 tbe;
tbe.push_back ((FileBrowserEntry*)actionData);
tbl->developRequested (tbe);
diff --git a/rtgui/filebrowser.h b/rtgui/filebrowser.h
index ae683be10..389f2612f 100644
--- a/rtgui/filebrowser.h
+++ b/rtgui/filebrowser.h
@@ -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 tbe);
void fromTrashRequested (std::vector tbe);
void rankingRequested (std::vector tbe, int rank);
+ void colorlabelRequested (std::vector tbe, int colorlabel);
void notifySelectionListener ();
type_trash_changed m_trash_changed;
diff --git a/rtgui/filecatalog.cc b/rtgui/filecatalog.cc
index c77395d59..f5746a7a7 100644
--- a/rtgui/filecatalog.cc
+++ b/rtgui/filecatalog.cc
@@ -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:
diff --git a/rtgui/filecatalog.h b/rtgui/filecatalog.h
index 11d2f3dde..36c90eb4a 100644
--- a/rtgui/filecatalog.h
+++ b/rtgui/filecatalog.h
@@ -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;
diff --git a/rtgui/filethumbnailbuttonset.cc b/rtgui/filethumbnailbuttonset.cc
index 78954cd3f..05a0c4a3b 100644
--- a/rtgui/filethumbnailbuttonset.cc
+++ b/rtgui/filethumbnailbuttonset.cc
@@ -30,6 +30,12 @@ Cairo::RefPtr FileThumbnailButtonSet::unRankIcon;
Cairo::RefPtr FileThumbnailButtonSet::trashIcon;
Cairo::RefPtr FileThumbnailButtonSet::unTrashIcon;
Cairo::RefPtr FileThumbnailButtonSet::processIcon;
+Cairo::RefPtr FileThumbnailButtonSet::colorLabelIcon_0;
+Cairo::RefPtr FileThumbnailButtonSet::colorLabelIcon_1;
+Cairo::RefPtr FileThumbnailButtonSet::colorLabelIcon_2;
+Cairo::RefPtr FileThumbnailButtonSet::colorLabelIcon_3;
+Cairo::RefPtr FileThumbnailButtonSet::colorLabelIcon_4;
+Cairo::RefPtr 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"));
}
diff --git a/rtgui/filethumbnailbuttonset.h b/rtgui/filethumbnailbuttonset.h
index af377c7ba..7bd5ef817 100644
--- a/rtgui/filethumbnailbuttonset.h
+++ b/rtgui/filethumbnailbuttonset.h
@@ -35,9 +35,17 @@ class FileThumbnailButtonSet : public LWButtonSet {
static Cairo::RefPtr trashIcon;
static Cairo::RefPtr unTrashIcon;
static Cairo::RefPtr processIcon;
+
+ static Cairo::RefPtr colorLabelIcon_0;
+ static Cairo::RefPtr colorLabelIcon_1;
+ static Cairo::RefPtr colorLabelIcon_2;
+ static Cairo::RefPtr colorLabelIcon_3;
+ static Cairo::RefPtr colorLabelIcon_4;
+ static Cairo::RefPtr colorLabelIcon_5;
FileThumbnailButtonSet (FileBrowserEntry* myEntry);
void setRank (int stars);
+ void setColorLabel (int colorlabel);
void setInTrash (bool inTrash);
};
diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc
index 51d18a01f..f61496c45 100644
--- a/rtgui/thumbnail.cc
+++ b/rtgui/thumbnail.cc
@@ -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; iprocParamsChanged (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; iprocParamsChanged (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 ();
diff --git a/rtgui/thumbnail.h b/rtgui/thumbnail.h
index 163b61618..38ba2d28b 100644
--- a/rtgui/thumbnail.h
+++ b/rtgui/thumbnail.h
@@ -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);