New feature: Color Labels (issue 684) and porting rank and inTrash to pp3

This commit is contained in:
Michael Ezra 2011-05-29 08:23:09 -04:00
parent a64a6d1b2c
commit 81f0135ec5
30 changed files with 434 additions and 120 deletions

BIN
rtdata/images/cglabel1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/cglabel2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/cglabel3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/cglabel4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/cglabel5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/clabel1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/clabel2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/clabel3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/clabel4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
rtdata/images/clabel5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 505 B

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -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

View File

@ -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");

View File

@ -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

View File

@ -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++;

View File

@ -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;
}
}

View File

@ -25,8 +25,10 @@ class BrowserFilter {
public:
bool showRanked[6];
bool showCLabeled[6];
bool showTrash;
bool showNotTrash;
bool showEdited[2];
bool exifFilterEnabled;
ExifFilterSettings exifFilter;

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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:

View File

@ -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;

View File

@ -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"));
}

View File

@ -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);
};

View File

@ -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 ();

View File

@ -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);