diff --git a/rtdata/languages/default b/rtdata/languages/default index bf400c39f..9ef2747c8 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1129,6 +1129,8 @@ PREFERENCES_TISTD;Standard PREFERENCES_TP_LABEL;Tool panel: PREFERENCES_TP_USEICONORTEXT;Use tab icons instead of text PREFERENCES_TP_VSCROLLBAR;Hide vertical scrollbar +PREFERENCES_AUTOSAVE_TP_OPEN;Automatically save tools collapsed/expanded\nstate before exiting +PREFERENCES_SAVE_TP_OPEN_NOW;Save tools collapsed/expanded state now PREFERENCES_TUNNELMETADATA;Copy Exif/IPTC/XMP unchanged to output file PREFERENCES_USEBUNDLEDPROFILES;Use bundled profiles PREFERENCES_VIEW;Output device's white balance (monitor, TV, projector, viewing, etc.) diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 8d2d6251a..71d0729e6 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -72,61 +72,70 @@ int setprogressStrUI ( void *p ) } -bool find_default_monitor_profile(GdkWindow *rootwin, Glib::ustring &defprof, Glib::ustring &defprofname) +bool find_default_monitor_profile (GdkWindow *rootwin, Glib::ustring &defprof, Glib::ustring &defprofname) { #ifdef WIN32 - HDC hDC = GetDC(nullptr); + HDC hDC = GetDC (nullptr); if (hDC != nullptr) { - if (SetICMMode(hDC, ICM_ON)) { + if (SetICMMode (hDC, ICM_ON)) { char profileName[MAX_PATH + 1]; DWORD profileLength = MAX_PATH; - if (GetICMProfileA(hDC, &profileLength, profileName)) { - defprof = Glib::ustring(profileName); - defprofname = Glib::path_get_basename(defprof); - size_t pos = defprofname.rfind("."); + if (GetICMProfileA (hDC, &profileLength, profileName)) { + defprof = Glib::ustring (profileName); + defprofname = Glib::path_get_basename (defprof); + size_t pos = defprofname.rfind ("."); if (pos != Glib::ustring::npos) { - defprofname = defprofname.substr(0, pos); + defprofname = defprofname.substr (0, pos); } - defprof = Glib::ustring("file:") + defprof; + + defprof = Glib::ustring ("file:") + defprof; return true; } // might fail if e.g. the monitor has no profile } - ReleaseDC(NULL, hDC); + ReleaseDC (NULL, hDC); } + #elif !defined(__APPLE__) // taken from geeqie (image.c) and adapted // Originally licensed as GPL v2+, with the following copyright: // * Copyright (C) 2006 John Ellis // * Copyright (C) 2008 - 2016 The Geeqie Team - // + // guchar *prof = nullptr; gint proflen; GdkAtom type = GDK_NONE; gint format = 0; - if (gdk_property_get(rootwin, gdk_atom_intern("_ICC_PROFILE", FALSE), GDK_NONE, 0, 64 * 1024 * 1024, FALSE, &type, &format, &proflen, &prof) && proflen > 0) { - cmsHPROFILE p = cmsOpenProfileFromMem(prof, proflen); + + if (gdk_property_get (rootwin, gdk_atom_intern ("_ICC_PROFILE", FALSE), GDK_NONE, 0, 64 * 1024 * 1024, FALSE, &type, &format, &proflen, &prof) && proflen > 0) { + cmsHPROFILE p = cmsOpenProfileFromMem (prof, proflen); + if (p) { defprofname = "from GDK"; - defprof = Glib::build_filename(Options::rtdir, "GDK_ICC_PROFILE.icc"); - if (cmsSaveProfileToFile(p, defprof.c_str())) { - cmsCloseProfile(p); + defprof = Glib::build_filename (Options::rtdir, "GDK_ICC_PROFILE.icc"); + + if (cmsSaveProfileToFile (p, defprof.c_str())) { + cmsCloseProfile (p); + if (prof) { - g_free(prof); + g_free (prof); } - defprof = Glib::ustring("file:") + defprof; + + defprof = Glib::ustring ("file:") + defprof; return true; } } } + if (prof) { - g_free(prof); + g_free (prof); } + #endif return false; } @@ -153,26 +162,31 @@ private: #if !defined(__APPLE__) // monitor profile not supported on apple void prepareProfileBox () { - profileBox.setPreferredWidth(70, 200); + profileBox.setPreferredWidth (70, 200); setExpandAlignProperties (&profileBox, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); profileBox.append (M ("PREFERENCES_PROFILE_NONE")); Glib::ustring defprofname; - if (find_default_monitor_profile(profileBox.get_root_window()->gobj(), defprof, defprofname)) { + + if (find_default_monitor_profile (profileBox.get_root_window()->gobj(), defprof, defprofname)) { profileBox.append (M ("MONITOR_PROFILE_SYSTEM") + " (" + defprofname + ")"); + if (options.rtSettings.autoMonitorProfile) { - rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName(defprof); - profileBox.set_active(1); + rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName (defprof); + profileBox.set_active (1); } else { - profileBox.set_active(0); + profileBox.set_active (0); } } else { profileBox.set_active (0); } + const std::vector profiles = rtengine::ICCStore::getInstance()->getProfiles (rtengine::ICCStore::ProfileType::MONITOR); - for (const auto profile: profiles) { + + for (const auto profile : profiles) { profileBox.append (profile); } + profileBox.set_tooltip_text (profileBox.get_active_text ()); } #endif @@ -181,34 +195,34 @@ private: { // same order as the enum intentBox.addEntry ("intent-perceptual.png", M ("PREFERENCES_INTENT_PERCEPTUAL")); - intentBox.addEntry("intent-relative.png", M("PREFERENCES_INTENT_RELATIVE")); + intentBox.addEntry ("intent-relative.png", M ("PREFERENCES_INTENT_RELATIVE")); intentBox.addEntry ("intent-absolute.png", M ("PREFERENCES_INTENT_ABSOLUTE")); setExpandAlignProperties (intentBox.buttonGroup, false, false, Gtk::ALIGN_CENTER, Gtk::ALIGN_FILL); - intentBox.setSelected(1); + intentBox.setSelected (1); intentBox.show (); } void prepareSoftProofingBox () { Gtk::Image *softProofImage = Gtk::manage (new RTImage ("softProof.png")); - softProofImage->set_padding(0, 0); - softProof.add(*softProofImage); - softProof.set_relief(Gtk::RELIEF_NONE); - softProof.set_tooltip_markup(M("SOFTPROOF_TOOLTIP")); + softProofImage->set_padding (0, 0); + softProof.add (*softProofImage); + softProof.set_relief (Gtk::RELIEF_NONE); + softProof.set_tooltip_markup (M ("SOFTPROOF_TOOLTIP")); - softProof.set_active(false); - softProof.set_sensitive(canSProof); + softProof.set_active (false); + softProof.set_sensitive (canSProof); softProof.show (); Gtk::Image *spGamutCheckImage = Gtk::manage (new RTImage ("spGamutCheck.png")); - spGamutCheckImage->set_padding(0, 0); - spGamutCheck.add(*spGamutCheckImage); - spGamutCheck.set_relief(Gtk::RELIEF_NONE); - spGamutCheck.set_tooltip_markup(M("SOFTPROOF_GAMUTCHECK_TOOLTIP")); + spGamutCheckImage->set_padding (0, 0); + spGamutCheck.add (*spGamutCheckImage); + spGamutCheck.set_relief (Gtk::RELIEF_NONE); + spGamutCheck.set_tooltip_markup (M ("SOFTPROOF_GAMUTCHECK_TOOLTIP")); - spGamutCheck.set_active(false); - spGamutCheck.set_sensitive(false); + spGamutCheck.set_active (false); + spGamutCheck.set_sensitive (false); spGamutCheck.show (); } @@ -244,30 +258,35 @@ private: Glib::ustring profile; #if !defined(__APPLE__) // monitor profile not supported on apple + if (!defprof.empty() && profileBox.get_active_row_number () == 1) { profile = defprof; + if (profile.empty ()) { profile = options.rtSettings.monitorProfile; } + if (profile.empty ()) { profile = "sRGB IEC61966-2.1"; } } else if (profileBox.get_active_row_number () > 0) { profile = profileBox.get_active_text (); } + #else profile = "RT_sRGB"; #endif #if !defined(__APPLE__) // monitor profile not supported on apple + if (profileBox.get_active_row_number () == 0) { profile.clear (); intentBox.set_sensitive (false); intentBox.setSelected (1); - softProof.set_sensitive(false); - spGamutCheck.set_sensitive(false); + softProof.set_sensitive (false); + spGamutCheck.set_sensitive (false); profileBox.set_tooltip_text (""); @@ -279,38 +298,40 @@ private: if (supportsPerceptual || supportsRelativeColorimetric || supportsAbsoluteColorimetric) { intentBox.set_sensitive (true); - intentBox.setItemSensitivity(0, supportsPerceptual); - intentBox.setItemSensitivity(1, supportsRelativeColorimetric); - intentBox.setItemSensitivity(2, supportsAbsoluteColorimetric); - softProof.set_sensitive(canSProof); - spGamutCheck.set_sensitive(canSProof); + intentBox.setItemSensitivity (0, supportsPerceptual); + intentBox.setItemSensitivity (1, supportsRelativeColorimetric); + intentBox.setItemSensitivity (2, supportsAbsoluteColorimetric); + softProof.set_sensitive (canSProof); + spGamutCheck.set_sensitive (canSProof); } else { - intentBox.setItemSensitivity(0, true); - intentBox.setItemSensitivity(1, true); - intentBox.setItemSensitivity(2, true); + intentBox.setItemSensitivity (0, true); + intentBox.setItemSensitivity (1, true); + intentBox.setItemSensitivity (2, true); intentBox.set_sensitive (false); intentBox.setSelected (1); - softProof.set_sensitive(false); - spGamutCheck.set_sensitive(false); + softProof.set_sensitive (false); + spGamutCheck.set_sensitive (false); } profileBox.set_tooltip_text (profileBox.get_active_text ()); } + #endif rtengine::RenderingIntent intent; + switch (intentBox.getSelected ()) { - default: - case 0: - intent = rtengine::RI_PERCEPTUAL; - break; + default: + case 0: + intent = rtengine::RI_PERCEPTUAL; + break; - case 1: - intent = rtengine::RI_RELATIVE; - break; + case 1: + intent = rtengine::RI_RELATIVE; + break; - case 2: - intent = rtengine::RI_ABSOLUTE; - break; + case 2: + intent = rtengine::RI_ABSOLUTE; + break; } if (!processor) { @@ -320,8 +341,10 @@ private: if (!noEvent) { processor->beginUpdateParams (); } + processor->setMonitorProfile (profile, intent); processor->setSoftProofing (softProof.get_sensitive() && softProof.get_active(), spGamutCheck.get_sensitive() && spGamutCheck.get_active()); + if (!noEvent) { processor->endUpdateParams (rtengine::EvMonitorTransform); } @@ -331,36 +354,43 @@ private: { if (!canSProof) { ConnectionBlocker profileBlocker (softproofConn); - softProof.set_active(false); - softProof.set_sensitive(false); + softProof.set_active (false); + softProof.set_sensitive (false); #if !defined(__APPLE__) // monitor profile not supported on apple } else { - softProof.set_sensitive(profileBox.get_active_row_number () > 0); + softProof.set_sensitive (profileBox.get_active_row_number () > 0); #endif } - spGamutCheck.set_sensitive(softProof.get_sensitive() && softProof.get_active()); + + spGamutCheck.set_sensitive (softProof.get_sensitive() && softProof.get_active()); #if !defined(__APPLE__) // monitor profile not supported on apple + if (profileBox.get_active_row_number () > 0) { #endif + if (processor) { if (!noEvent) { processor->beginUpdateParams (); } + processor->setSoftProofing (softProof.get_sensitive() && softProof.get_active(), spGamutCheck.get_sensitive() && spGamutCheck.get_active()); + if (!noEvent) { processor->endUpdateParams (rtengine::EvMonitorTransform); } } + #if !defined(__APPLE__) // monitor profile not supported on apple } + #endif } public: explicit ColorManagementToolbar (rtengine::StagedImageProcessor* const& ipc) : intentBox (Glib::ustring (), true), - canSProof(!options.rtSettings.printerProfile.empty() && options.rtSettings.printerProfile != "None"), // assuming the printer profile exist! + canSProof (!options.rtSettings.printerProfile.empty() && options.rtSettings.printerProfile != "None"), // assuming the printer profile exist! processor (ipc) { #if !defined(__APPLE__) // monitor profile not supported on apple @@ -371,8 +401,8 @@ public: reset (); - softproofConn = softProof.signal_toggled().connect(sigc::mem_fun (this, &ColorManagementToolbar::softProofToggled)); - spGamutCheck.signal_toggled().connect(sigc::mem_fun (this, &ColorManagementToolbar::spGamutCheckToggled)); + softproofConn = softProof.signal_toggled().connect (sigc::mem_fun (this, &ColorManagementToolbar::softProofToggled)); + spGamutCheck.signal_toggled().connect (sigc::mem_fun (this, &ColorManagementToolbar::spGamutCheckToggled)); #if !defined(__APPLE__) // monitor profile not supported on apple profileConn = profileBox.signal_changed ().connect (sigc::mem_fun (this, &ColorManagementToolbar::profileBoxChanged)); #endif @@ -389,7 +419,7 @@ public: grid->attach_next_to (spGamutCheck, Gtk::POS_RIGHT, 1, 1); } - void canSoftProof(bool canSP) + void canSoftProof (bool canSP) { canSProof = canSP; updateSoftProofParameters(); @@ -398,7 +428,7 @@ public: void updateProcessor() { if (processor) { - updateParameters(true); + updateParameters (true); } } @@ -409,43 +439,44 @@ public: ConnectionBlocker profileBlocker (profileConn); if (!defprof.empty() && options.rtSettings.autoMonitorProfile) { - profileBox.set_active(1); + profileBox.set_active (1); } else { setActiveTextOrIndex (profileBox, options.rtSettings.monitorProfile, 0); } + #endif switch (options.rtSettings.monitorIntent) { - default: - case rtengine::RI_PERCEPTUAL: - intentBox.setSelected (0); - break; + default: + case rtengine::RI_PERCEPTUAL: + intentBox.setSelected (0); + break; - case rtengine::RI_RELATIVE: - intentBox.setSelected (1); - break; + case rtengine::RI_RELATIVE: + intentBox.setSelected (1); + break; - case rtengine::RI_ABSOLUTE: - intentBox.setSelected (2); - break; + case rtengine::RI_ABSOLUTE: + intentBox.setSelected (2); + break; } updateParameters (); } - void defaultMonitorProfileChanged(const Glib::ustring &profile_name, bool auto_monitor_profile) + void defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile) { ConnectionBlocker profileBlocker (profileConn); - + if (auto_monitor_profile && !defprof.empty()) { - rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName(defprof); + rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName (defprof); #ifndef __APPLE__ - profileBox.set_active(1); + profileBox.set_active (1); #endif } else { - rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName(profile_name); + rtengine::ICCStore::getInstance()->setDefaultMonitorProfileName (profile_name); #ifndef __APPLE__ - setActiveTextOrIndex(profileBox, profile_name, 0); + setActiveTextOrIndex (profileBox, profile_name, 0); #endif } } @@ -453,7 +484,7 @@ public: }; EditorPanel::EditorPanel (FilePanel* filePanel) - : catalogPane(nullptr), realized(false), tbBeforeLock(nullptr), iHistoryShow(nullptr), iHistoryHide(nullptr), iTopPanel_1_Show(nullptr), iTopPanel_1_Hide(nullptr), iRightPanel_1_Show(nullptr), iRightPanel_1_Hide(nullptr), iBeforeLockON(nullptr), iBeforeLockOFF(nullptr), previewHandler(nullptr), beforePreviewHandler(nullptr), beforeIarea(nullptr), beforeBox(nullptr), afterBox(nullptr), beforeLabel(nullptr), afterLabel(nullptr), beforeHeaderBox(nullptr), afterHeaderBox(nullptr), parent(nullptr), parentWindow(nullptr), openThm(nullptr), isrc(nullptr), ipc(nullptr), beforeIpc(nullptr), err(0), isProcessing(false) + : catalogPane (nullptr), realized (false), tbBeforeLock (nullptr), iHistoryShow (nullptr), iHistoryHide (nullptr), iTopPanel_1_Show (nullptr), iTopPanel_1_Hide (nullptr), iRightPanel_1_Show (nullptr), iRightPanel_1_Hide (nullptr), iBeforeLockON (nullptr), iBeforeLockOFF (nullptr), previewHandler (nullptr), beforePreviewHandler (nullptr), beforeIarea (nullptr), beforeBox (nullptr), afterBox (nullptr), beforeLabel (nullptr), afterLabel (nullptr), beforeHeaderBox (nullptr), afterHeaderBox (nullptr), parent (nullptr), parentWindow (nullptr), openThm (nullptr), isrc (nullptr), ipc (nullptr), beforeIpc (nullptr), err (0), isProcessing (false) { epih = new EditorPanelIdleHelper; @@ -477,7 +508,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) profilep = Gtk::manage (new ProfilePanel ()); ppframe = new Gtk::Frame (); - ppframe->set_name("ProfilePanel"); + ppframe->set_name ("ProfilePanel"); ppframe->add (*profilep); ppframe->set_label (M ("PROFILEPANEL_LABEL")); //leftbox->pack_start (*ppframe, Gtk::PACK_SHRINK, 4); @@ -551,7 +582,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iareapanel = new ImageAreaPanel (); tpc->setEditProvider (iareapanel->imageArea); - tpc->getToolBar()->setLockablePickerToolListener(iareapanel->imageArea); + tpc->getToolBar()->setLockablePickerToolListener (iareapanel->imageArea); Gtk::HBox* toolBarPanel = Gtk::manage (new Gtk::HBox ()); toolBarPanel->set_name ("EditorTopPanel"); @@ -580,7 +611,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) afterBox->pack_start (*iareapanel); beforeAfterBox = Gtk::manage (new Gtk::HBox()); - beforeAfterBox->set_name("BeforeAfterContainer"); + beforeAfterBox->set_name ("BeforeAfterContainer"); beforeAfterBox->pack_start (*afterBox); editbox->pack_start (*toolBarPanel, Gtk::PACK_SHRINK, 2); @@ -680,6 +711,7 @@ EditorPanel::EditorPanel (FilePanel* filePanel) iops->attach_next_to (*vsep2, Gtk::POS_LEFT, 1, 1); iops->attach_next_to (*progressLabel, Gtk::POS_LEFT, 1, 1); iops->attach_next_to (*vsep1, Gtk::POS_LEFT, 1, 1); + if (!gimpPlugin) { iops->attach_next_to (*sendtogimp, Gtk::POS_LEFT, 1, 1); } @@ -715,10 +747,10 @@ EditorPanel::EditorPanel (FilePanel* filePanel) editbox->show_all (); // build screen - hpanedl = Gtk::manage (new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL)); - hpanedl->set_name("EditorLeftPaned"); - hpanedr = Gtk::manage (new Gtk::Paned(Gtk::ORIENTATION_HORIZONTAL)); - hpanedr->set_name("EditorRightPaned"); + hpanedl = Gtk::manage (new Gtk::Paned (Gtk::ORIENTATION_HORIZONTAL)); + hpanedl->set_name ("EditorLeftPaned"); + hpanedr = Gtk::manage (new Gtk::Paned (Gtk::ORIENTATION_HORIZONTAL)); + hpanedr->set_name ("EditorRightPaned"); leftbox->reference (); vboxright->reference (); @@ -919,6 +951,14 @@ void EditorPanel::writeOptions() } } + +void EditorPanel::writeToolExpandedStatus (std::vector &tpOpen) +{ + if (tpc) { + tpc->writeToolExpandedStatus (tpOpen); + } +} + void EditorPanel::showTopPanel (bool show) { if (tbTopPanel_1->get_active() != show) { @@ -1026,7 +1066,7 @@ void EditorPanel::close () tpc->closeImage (); // this call stops image processing tpc->writeOptions (); rtengine::ImageSource* is = isrc->getImageSource(); - is->setProgressListener( nullptr ); + is->setProgressListener ( nullptr ); if (ipc) { ipc->setPreviewImageListener (nullptr); @@ -1039,7 +1079,7 @@ void EditorPanel::close () delete previewHandler; previewHandler = nullptr; - if(iareapanel) { + if (iareapanel) { iareapanel->imageArea->setPreviewHandler (nullptr); iareapanel->imageArea->setImProcCoordinator (nullptr); iareapanel->imageArea->unsubscribe(); @@ -1050,7 +1090,7 @@ void EditorPanel::close () navigator->previewWindow->setPreviewHandler (nullptr); // If the file was deleted somewhere, the openThm.descreaseRef delete the object, but we don't know here - if (Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { openThm->removeThumbnailListener (this); openThm->decreaseRef (); } @@ -1064,7 +1104,7 @@ void EditorPanel::saveProfile () } // If the file was deleted, do not generate ghost entries - if (Glib::file_test(fname, Glib::FILE_TEST_EXISTS)) { + if (Glib::file_test (fname, Glib::FILE_TEST_EXISTS)) { ProcParams params; ipc->getParams (¶ms); @@ -1112,10 +1152,11 @@ void EditorPanel::setProgressState (bool inProcessing) p->inProcessing = inProcessing; p->epih = epih; - const auto func = [](gpointer data) -> gboolean { - spsparams* const p = static_cast(data); + const auto func = [] (gpointer data) -> gboolean { + spsparams* const p = static_cast (data); - if (p->epih->destroyed) { + if (p->epih->destroyed) + { if (p->epih->pending == 1) { delete p->epih; } else { @@ -1134,7 +1175,7 @@ void EditorPanel::setProgressState (bool inProcessing) return FALSE; }; - idle_register.add(func, p); + idle_register.add (func, p); } void EditorPanel::setProgress (double p) @@ -1142,7 +1183,7 @@ void EditorPanel::setProgress (double p) spparams *s = new spparams; s->val = p; s->pProgress = progressLabel; - idle_register.add(setprogressStrUI, s); + idle_register.add (setprogressStrUI, s); } void EditorPanel::setProgressStr (Glib::ustring str) @@ -1151,7 +1192,7 @@ void EditorPanel::setProgressStr (Glib::ustring str) s->str = str; s->val = -1; s->pProgress = progressLabel; - idle_register.add(setprogressStrUI, s); + idle_register.add (setprogressStrUI, s); } // This is only called from the ThreadUI, so within the gtk thread @@ -1162,7 +1203,7 @@ void EditorPanel::refreshProcessingState (bool inProcessingP) if (inProcessingP) { if (processingStartedTime == 0) { - processingStartedTime = ::time(nullptr); + processingStartedTime = ::time (nullptr); } s->str = "PROGRESSBAR_PROCESSING"; @@ -1177,7 +1218,7 @@ void EditorPanel::refreshProcessingState (bool inProcessingP) // Ring a sound if it was a long event if (processingStartedTime != 0) { - time_t curTime = ::time(nullptr); + time_t curTime = ::time (nullptr); if (::difftime (curTime, processingStartedTime) > options.sndLngEditProcDoneSecs) { SoundManager::playSoundAsync (options.sndLngEditProcDone); @@ -1235,10 +1276,11 @@ void EditorPanel::error (Glib::ustring title, Glib::ustring descr) p->title = title; p->epih = epih; - const auto func = [](gpointer data) -> gboolean { + const auto func = [] (gpointer data) -> gboolean { errparams* const p = static_cast (data); - if (p->epih->destroyed) { + if (p->epih->destroyed) + { if (p->epih->pending == 1) { delete p->epih; } else { @@ -1257,7 +1299,7 @@ void EditorPanel::error (Glib::ustring title, Glib::ustring descr) return FALSE; }; - idle_register.add(func, p); + idle_register.add (func, p); } void EditorPanel::info_toggled () @@ -1410,56 +1452,56 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) // Editor Layout switch (event->keyval) { - case GDK_KEY_L: - if (tbTopPanel_1) { - tbTopPanel_1->set_active (!tbTopPanel_1->get_active()); // toggle top panel - } + case GDK_KEY_L: + if (tbTopPanel_1) { + tbTopPanel_1->set_active (!tbTopPanel_1->get_active()); // toggle top panel + } - if (ctrl) { - hidehp->set_active (!hidehp->get_active()); // toggle History (left panel) - } + if (ctrl) { + hidehp->set_active (!hidehp->get_active()); // toggle History (left panel) + } - if (alt) { - tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); // toggle right panel - } + if (alt) { + tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); // toggle right panel + } - return true; - break; - - case GDK_KEY_l: - if (!shift && !alt /*&& !ctrl*/) { - hidehp->set_active (!hidehp->get_active()); // toggle History (left panel) return true; - } + break; - if (alt && !ctrl) { // toggle right panel - tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); - return true; - } + case GDK_KEY_l: + if (!shift && !alt /*&& !ctrl*/) { + hidehp->set_active (!hidehp->get_active()); // toggle History (left panel) + return true; + } - if (alt && ctrl) { // toggle left and right panels - hidehp->set_active (!hidehp->get_active()); - tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); - return true; - } + if (alt && !ctrl) { // toggle right panel + tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); + return true; + } - break; + if (alt && ctrl) { // toggle left and right panels + hidehp->set_active (!hidehp->get_active()); + tbRightPanel_1->set_active (!tbRightPanel_1->get_active()); + return true; + } - case GDK_KEY_m: // Maximize preview panel: hide top AND right AND history panels - if (!ctrl && !alt) { - toggleSidePanels(); - return true; - } + break; - break; + case GDK_KEY_m: // Maximize preview panel: hide top AND right AND history panels + if (!ctrl && !alt) { + toggleSidePanels(); + return true; + } - case GDK_KEY_M: // Maximize preview panel: hide top AND right AND history panels AND (fit image preview) - if (!ctrl && !alt) { - toggleSidePanelsZoomFit(); - return true; - } + break; - break; + case GDK_KEY_M: // Maximize preview panel: hide top AND right AND history panels AND (fit image preview) + if (!ctrl && !alt) { + toggleSidePanelsZoomFit(); + return true; + } + + break; } #ifdef __WIN32__ @@ -1482,170 +1524,172 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) if (!ctrl) { // Normal switch (event->keyval) { - case GDK_KEY_bracketright: - tpc->coarse->rotateRight(); - return true; - - case GDK_KEY_bracketleft: - tpc->coarse->rotateLeft(); - return true; - - case GDK_KEY_i: - case GDK_KEY_I: - info->set_active (!info->get_active()); - return true; - - case GDK_KEY_B: - beforeAfter->set_active (!beforeAfter->get_active()); - return true; - - case GDK_KEY_plus: - case GDK_KEY_equal: - case GDK_KEY_KP_Add: - iareapanel->imageArea->zoomPanel->zoomInClicked(); - return true; - - case GDK_KEY_minus: - case GDK_KEY_underscore: - case GDK_KEY_KP_Subtract: - iareapanel->imageArea->zoomPanel->zoomOutClicked(); - return true; - - case GDK_KEY_z://GDK_1 - iareapanel->imageArea->zoomPanel->zoom11Clicked(); - return true; - - /* - #ifndef __WIN32__ - case GDK_KEY_9: // toggle background color of the preview - iareapanel->imageArea->previewModePanel->togglebackColor(); - return true; - #endif - */ - case GDK_KEY_r: //preview mode Red - iareapanel->imageArea->previewModePanel->toggleR(); - return true; - - case GDK_KEY_g: //preview mode Green - iareapanel->imageArea->previewModePanel->toggleG(); - return true; - - case GDK_KEY_b: //preview mode Blue - iareapanel->imageArea->previewModePanel->toggleB(); - return true; - - case GDK_KEY_v: //preview mode Luminosity - iareapanel->imageArea->previewModePanel->toggleL(); - return true; - - case GDK_KEY_F: //preview mode Focus Mask - iareapanel->imageArea->previewModePanel->toggleFocusMask(); - return true; - - case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitClicked(); - return true; - - case GDK_KEY_less: - iareapanel->imageArea->indClippedPanel->toggleClipped (false); - return true; - - case GDK_KEY_greater: - iareapanel->imageArea->indClippedPanel->toggleClipped (true); - return true; - - case GDK_KEY_F5: - openThm->openDefaultViewer ((event->state & GDK_SHIFT_MASK) ? 2 : 1); - return true; - - case GDK_KEY_y: // synchronize filebrowser with image in Editor - if (!simpleEditor && fPanel && !fname.empty()) { - fPanel->fileCatalog->selectImage (fname, false); + case GDK_KEY_bracketright: + tpc->coarse->rotateRight(); return true; - } - break; // to avoid gcc complain - - case GDK_KEY_x: // clear filters and synchronize filebrowser with image in Editor - if (!simpleEditor && fPanel && !fname.empty()) { - fPanel->fileCatalog->selectImage (fname, true); + case GDK_KEY_bracketleft: + tpc->coarse->rotateLeft(); return true; - } - break; // to avoid gcc complain + case GDK_KEY_i: + case GDK_KEY_I: + info->set_active (!info->get_active()); + return true; + + case GDK_KEY_B: + beforeAfter->set_active (!beforeAfter->get_active()); + return true; + + case GDK_KEY_plus: + case GDK_KEY_equal: + case GDK_KEY_KP_Add: + iareapanel->imageArea->zoomPanel->zoomInClicked(); + return true; + + case GDK_KEY_minus: + case GDK_KEY_underscore: + case GDK_KEY_KP_Subtract: + iareapanel->imageArea->zoomPanel->zoomOutClicked(); + return true; + + case GDK_KEY_z://GDK_1 + iareapanel->imageArea->zoomPanel->zoom11Clicked(); + return true; + + /* + #ifndef __WIN32__ + case GDK_KEY_9: // toggle background color of the preview + iareapanel->imageArea->previewModePanel->togglebackColor(); + return true; + #endif + */ + case GDK_KEY_r: //preview mode Red + iareapanel->imageArea->previewModePanel->toggleR(); + return true; + + case GDK_KEY_g: //preview mode Green + iareapanel->imageArea->previewModePanel->toggleG(); + return true; + + case GDK_KEY_b: //preview mode Blue + iareapanel->imageArea->previewModePanel->toggleB(); + return true; + + case GDK_KEY_v: //preview mode Luminosity + iareapanel->imageArea->previewModePanel->toggleL(); + return true; + + case GDK_KEY_F: //preview mode Focus Mask + iareapanel->imageArea->previewModePanel->toggleFocusMask(); + return true; + + case GDK_KEY_f: + iareapanel->imageArea->zoomPanel->zoomFitClicked(); + return true; + + case GDK_KEY_less: + iareapanel->imageArea->indClippedPanel->toggleClipped (false); + return true; + + case GDK_KEY_greater: + iareapanel->imageArea->indClippedPanel->toggleClipped (true); + return true; + + case GDK_KEY_F5: + openThm->openDefaultViewer ((event->state & GDK_SHIFT_MASK) ? 2 : 1); + return true; + + case GDK_KEY_y: // synchronize filebrowser with image in Editor + if (!simpleEditor && fPanel && !fname.empty()) { + fPanel->fileCatalog->selectImage (fname, false); + return true; + } + + break; // to avoid gcc complain + + case GDK_KEY_x: // clear filters and synchronize filebrowser with image in Editor + if (!simpleEditor && fPanel && !fname.empty()) { + fPanel->fileCatalog->selectImage (fname, true); + return true; + } + + break; // to avoid gcc complain } } else { // With control switch (event->keyval) { - case GDK_KEY_S: - saveProfile(); - setProgressStr (M ("PROGRESSBAR_PROCESSING_PROFILESAVED")); - return true; + case GDK_KEY_S: + saveProfile(); + setProgressStr (M ("PROGRESSBAR_PROCESSING_PROFILESAVED")); + return true; - case GDK_KEY_s: - if (!gimpPlugin) { - saveAsPressed(); - } - return true; + case GDK_KEY_s: + if (!gimpPlugin) { + saveAsPressed(); + } - case GDK_KEY_b: - if (!gimpPlugin && !simpleEditor) { - queueImgPressed(); - } + return true; - return true; + case GDK_KEY_b: + if (!gimpPlugin && !simpleEditor) { + queueImgPressed(); + } - case GDK_KEY_e: - if (!gimpPlugin) { - sendToGimpPressed(); - } - return true; + return true; - case GDK_KEY_z: - history->undo (); - return true; + case GDK_KEY_e: + if (!gimpPlugin) { + sendToGimpPressed(); + } - case GDK_KEY_Z: - history->redo (); - return true; + return true; - case GDK_KEY_F5: - openThm->openDefaultViewer (3); - return true; + case GDK_KEY_z: + history->undo (); + return true; + + case GDK_KEY_Z: + history->redo (); + return true; + + case GDK_KEY_F5: + openThm->openDefaultViewer (3); + return true; } } //if (!ctrl) } //if (!alt) if (alt) { switch (event->keyval) { - case GDK_KEY_s: - history->addBookmarkPressed (); - setProgressStr (M ("PROGRESSBAR_SNAPSHOT_ADDED")); - return true; + case GDK_KEY_s: + history->addBookmarkPressed (); + setProgressStr (M ("PROGRESSBAR_SNAPSHOT_ADDED")); + return true; - case GDK_KEY_f: - iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); - return true; + case GDK_KEY_f: + iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); + return true; } } if (shift) { switch (event->keyval) { - case GDK_KEY_F3: // open Previous image from Editor's perspective - if (!simpleEditor && fPanel && !fname.empty()) { - EditorPanel::openPreviousEditorImage(); - return true; - } + case GDK_KEY_F3: // open Previous image from Editor's perspective + if (!simpleEditor && fPanel && !fname.empty()) { + EditorPanel::openPreviousEditorImage(); + return true; + } - break; // to avoid gcc complain + break; // to avoid gcc complain - case GDK_KEY_F4: // open next image from Editor's perspective - if (!simpleEditor && fPanel && !fname.empty()) { - EditorPanel::openNextEditorImage(); - return true; - } + case GDK_KEY_F4: // open next image from Editor's perspective + if (!simpleEditor && fPanel && !fname.empty()) { + EditorPanel::openNextEditorImage(); + return true; + } - break; // to avoid gcc complain + break; // to avoid gcc complain } } @@ -1699,8 +1743,9 @@ bool EditorPanel::idle_saveImage (ProgressConnector *pc, Gl else if (sf.format == "jpg") ld->startFunc (sigc::bind (sigc::mem_fun (img, &rtengine::IImage16::saveAsJPEG), fname, sf.jpegQuality, sf.jpegSubSamp), sigc::bind (sigc::mem_fun (*this, &EditorPanel::idle_imageSaved), ld, img, fname, sf)); - else + else { delete ld; + } } else { Glib::ustring msg_ = Glib::ustring ("") + fname + ": Error during image processing\n"; Gtk::MessageDialog msgd (*parent, msg_, true, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); @@ -1796,7 +1841,7 @@ void EditorPanel::saveAsPressed () fnameOut = saveAsDialog->getFileName (); options.lastSaveAsPath = saveAsDialog->getDirectory (); - saveAsDialog->get_size(options.saveAsDialogWidth, options.saveAsDialogHeight); + saveAsDialog->get_size (options.saveAsDialogWidth, options.saveAsDialogHeight); options.autoSuffix = saveAsDialog->getAutoSuffix (); options.saveMethodNum = saveAsDialog->getSaveMethodNum (); lastSaveAsFileName = Glib::path_get_basename (removeExtension (fnameOut)); @@ -1897,25 +1942,27 @@ void EditorPanel::sendToGimpPressed () } -bool EditorPanel::saveImmediately(const Glib::ustring &filename, const SaveFormat &sf) +bool EditorPanel::saveImmediately (const Glib::ustring &filename, const SaveFormat &sf) { rtengine::procparams::ProcParams pparams; ipc->getParams (&pparams); - rtengine::ProcessingJob *job = rtengine::ProcessingJob::create(ipc->getInitialImage(), pparams); + rtengine::ProcessingJob *job = rtengine::ProcessingJob::create (ipc->getInitialImage(), pparams); // save immediately - rtengine::IImage16 *img = rtengine::processImage(job, err, nullptr, options.tunnelMetaData, false); + rtengine::IImage16 *img = rtengine::processImage (job, err, nullptr, options.tunnelMetaData, false); int err = 0; + if (sf.format == "tif") { - err = img->saveAsTIFF(filename, sf.tiffBits, sf.tiffUncompressed); + err = img->saveAsTIFF (filename, sf.tiffBits, sf.tiffUncompressed); } else if (sf.format == "png") { - err = img->saveAsPNG(filename, sf.pngCompression, sf.pngBits); + err = img->saveAsPNG (filename, sf.pngCompression, sf.pngBits); } else if (sf.format == "jpg") { - err = img->saveAsJPEG(filename, sf.jpegQuality, sf.jpegSubSamp); + err = img->saveAsJPEG (filename, sf.jpegQuality, sf.jpegSubSamp); } else { err = 1; } + img->free(); return !err; } @@ -1966,7 +2013,7 @@ bool EditorPanel::idle_sendToGimp ( ProgressConnector *pc, int tries = 1; while (Glib::file_test (fileName, Glib::FILE_TEST_EXISTS) && tries < 1000) { - fileName = Glib::ustring::compose("%1-%2.%3", fname, tries, sf.format); + fileName = Glib::ustring::compose ("%1-%2.%3", fname, tries, sf.format); tries++; } @@ -2012,9 +2059,9 @@ bool EditorPanel::idle_sentToGimp (ProgressConnector *pc, rtengine::IImage1 } if (!success) { - Gtk::MessageDialog msgd (*parent, M("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); - msgd.set_secondary_text (M("MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY")); - msgd.set_title (M("MAIN_BUTTON_SENDTOEDITOR")); + Gtk::MessageDialog msgd (*parent, M ("MAIN_MSG_CANNOTSTARTEDITOR"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_OK, true); + msgd.set_secondary_text (M ("MAIN_MSG_CANNOTSTARTEDITOR_SECONDARY")); + msgd.set_title (M ("MAIN_BUTTON_SENDTOEDITOR")); msgd.run (); } } @@ -2069,7 +2116,7 @@ void EditorPanel::beforeAfterToggled () if (beforeAfter->get_active ()) { int errorCode = 0; - rtengine::InitialImage *beforeImg = rtengine::InitialImage::load ( isrc->getImageSource ()->getFileName(), openThm->getType() == FT_Raw , &errorCode, nullptr); + rtengine::InitialImage *beforeImg = rtengine::InitialImage::load ( isrc->getImageSource ()->getFileName(), openThm->getType() == FT_Raw, &errorCode, nullptr); if ( !beforeImg || errorCode ) { return; @@ -2138,7 +2185,7 @@ void EditorPanel::tbBeforeLock_toggled () } void EditorPanel::histogramChanged (LUTu & histRed, LUTu & histGreen, LUTu & histBlue, LUTu & histLuma, LUTu & histToneCurve, LUTu & histLCurve, LUTu & histCCurve, /*LUTu & histCLurve, LUTu & histLLCurve,*/ LUTu & histLCAM, LUTu & histCCAM, - LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw , LUTu & histChroma, LUTu & histLRETI) + LUTu & histRedRaw, LUTu & histGreenRaw, LUTu & histBlueRaw, LUTu & histChroma, LUTu & histLRETI) { if (histogramPanel) { @@ -2199,9 +2246,9 @@ void EditorPanel::tbShowHideSidePanels_managestate() ShowHideSidePanelsconn.block (false); } -void EditorPanel::updateProfiles(const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) +void EditorPanel::updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC) { - colorMgmtToolBar->canSoftProof(!printerProfile.empty() && printerProfile != "None"); + colorMgmtToolBar->canSoftProof (!printerProfile.empty() && printerProfile != "None"); } void EditorPanel::updateTPVScrollbar (bool hide) @@ -2218,64 +2265,64 @@ void EditorPanel::updateHistogramPosition (int oldPosition, int newPosition) { switch (newPosition) { - case 0: + case 0: - // No histogram - if (!oldPosition) { - // An histogram actually exist, we delete it - delete histogramPanel; - histogramPanel = nullptr; - } + // No histogram + if (!oldPosition) { + // An histogram actually exist, we delete it + delete histogramPanel; + histogramPanel = nullptr; + } - // else no need to create it - break; + // else no need to create it + break; - case 1: + case 1: - // Histogram on the left pane - if (oldPosition == 0) { - // There was no Histogram before, so we create it - histogramPanel = Gtk::manage (new HistogramPanel ()); - leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); - } else if (oldPosition == 2) { - // The histogram was on the right side, so we move it to the left - histogramPanel->reference(); - removeIfThere (vboxright, histogramPanel, false); - leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); - histogramPanel->unreference(); - } + // Histogram on the left pane + if (oldPosition == 0) { + // There was no Histogram before, so we create it + histogramPanel = Gtk::manage (new HistogramPanel ()); + leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + } else if (oldPosition == 2) { + // The histogram was on the right side, so we move it to the left + histogramPanel->reference(); + removeIfThere (vboxright, histogramPanel, false); + leftbox->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + histogramPanel->unreference(); + } - histogramPanel->reorder (Gtk::POS_LEFT); - leftbox->reorder_child (*histogramPanel, 0); - break; + histogramPanel->reorder (Gtk::POS_LEFT); + leftbox->reorder_child (*histogramPanel, 0); + break; - case 2: - default: + case 2: + default: - // Histogram on the right pane - if (oldPosition == 0) { - // There was no Histogram before, so we create it - histogramPanel = Gtk::manage (new HistogramPanel ()); - vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); - } else if (oldPosition == 1) { - // The histogram was on the left side, so we move it to the right - histogramPanel->reference(); - removeIfThere (leftbox, histogramPanel, false); - vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); - histogramPanel->unreference(); - } + // Histogram on the right pane + if (oldPosition == 0) { + // There was no Histogram before, so we create it + histogramPanel = Gtk::manage (new HistogramPanel ()); + vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + } else if (oldPosition == 1) { + // The histogram was on the left side, so we move it to the right + histogramPanel->reference(); + removeIfThere (leftbox, histogramPanel, false); + vboxright->pack_start (*histogramPanel, Gtk::PACK_SHRINK, 2); + histogramPanel->unreference(); + } - histogramPanel->reorder (Gtk::POS_RIGHT); - vboxright->reorder_child (*histogramPanel, 0); - break; + histogramPanel->reorder (Gtk::POS_RIGHT); + vboxright->reorder_child (*histogramPanel, 0); + break; } iareapanel->imageArea->setPointerMotionHListener (histogramPanel); } -void EditorPanel::defaultMonitorProfileChanged(const Glib::ustring &profile_name, bool auto_monitor_profile) +void EditorPanel::defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile) { - colorMgmtToolBar->defaultMonitorProfileChanged(profile_name, auto_monitor_profile); + colorMgmtToolBar->defaultMonitorProfileChanged (profile_name, auto_monitor_profile); } diff --git a/rtgui/editorpanel.h b/rtgui/editorpanel.h index d3d0eeaf7..286905bf5 100644 --- a/rtgui/editorpanel.h +++ b/rtgui/editorpanel.h @@ -46,12 +46,12 @@ struct EditorPanelIdleHelper { class RTWindow; class EditorPanel final : - public Gtk::VBox, - public PParamsChangeListener, - public rtengine::ProgressListener, - public ThumbnailListener, - public HistoryBeforeLineListener, - public rtengine::HistogramListener + public Gtk::VBox, + public PParamsChangeListener, + public rtengine::ProgressListener, + public ThumbnailListener, + public HistoryBeforeLineListener, + public rtengine::HistogramListener { public: explicit EditorPanel (FilePanel* filePanel = nullptr); @@ -74,6 +74,7 @@ public: } void writeOptions(); + void writeToolExpandedStatus (std::vector &tpOpen); void showTopPanel (bool show); bool isRealized() @@ -130,14 +131,14 @@ public: { return isProcessing; } - void updateProfiles(const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); + void updateProfiles (const Glib::ustring &printerProfile, rtengine::RenderingIntent printerIntent, bool printerBPC); void updateTPVScrollbar (bool hide); void updateTabsUsesIcons (bool useIcons); void updateHistogramPosition (int oldPosition, int newPosition); - void defaultMonitorProfileChanged(const Glib::ustring &profile_name, bool auto_monitor_profile); + void defaultMonitorProfileChanged (const Glib::ustring &profile_name, bool auto_monitor_profile); - bool saveImmediately(const Glib::ustring &filename, const SaveFormat &sf); + bool saveImmediately (const Glib::ustring &filename, const SaveFormat &sf); Gtk::Paned* catalogPane; diff --git a/rtgui/options.cc b/rtgui/options.cc index 05586208a..2b504a2de 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -405,6 +405,7 @@ void Options::setDefaults () editorToSendTo = 1; favoriteDirs.clear(); tpOpen.clear (); + autoSaveTpOpen = true; //crvOpen.clear (); parseExtensions.clear (); parseExtensionsEnabled.clear (); @@ -642,7 +643,7 @@ void Options::setDefaults () #endif // rtSettings.viewingdevice = 0; // rtSettings.viewingdevicegrey = 3; - // rtSettings.viewinggreySc = 1; + // rtSettings.viewinggreySc = 1; rtSettings.leveldnv = 2; rtSettings.leveldnti = 0; rtSettings.leveldnaut = 0; @@ -1436,6 +1437,10 @@ void Options::readFromFile (Glib::ustring fname) tpOpen = keyFile.get_integer_list ("GUI", "ToolPanelsExpanded"); } + if (keyFile.has_key ("GUI", "ToolPanelsExpandedAutoSave")) { + autoSaveTpOpen = keyFile.get_boolean ("GUI", "ToolPanelsExpandedAutoSave"); + } + if (keyFile.has_key ("GUI", "MultiDisplayMode")) { multiDisplayMode = keyFile.get_integer ("GUI", "MultiDisplayMode"); } @@ -1558,11 +1563,11 @@ void Options::readFromFile (Glib::ustring fname) rtSettings.viewingdevicegrey = keyFile.get_integer ("Color Management", "grey"); } */ -/* - if (keyFile.has_key ("Color Management", "greySc")) { - rtSettings.viewinggreySc = keyFile.get_integer ("Color Management", "greySc"); - } -*/ + /* + if (keyFile.has_key ("Color Management", "greySc")) { + rtSettings.viewinggreySc = keyFile.get_integer ("Color Management", "greySc"); + } + */ if (keyFile.has_key ("Color Management", "CBDLArtif")) { rtSettings.artifact_cbdl = keyFile.get_double ("Color Management", "CBDLArtif"); } @@ -2106,6 +2111,7 @@ void Options::saveToFile (Glib::ustring fname) keyFile.set_boolean ("GUI", "ProcessingQueueEnbled", procQueueEnabled); Glib::ArrayHandle tpopen = tpOpen; keyFile.set_integer_list ("GUI", "ToolPanelsExpanded", tpopen); + keyFile.set_boolean ("GUI", "ToolPanelsExpandedAutoSave", autoSaveTpOpen); keyFile.set_integer ("GUI", "MultiDisplayMode", multiDisplayMode); keyFile.set_double_list ("GUI", "CutOverlayBrush", cutOverlayBrush); keyFile.set_double_list ("GUI", "NavGuideBrush", navGuideBrush); diff --git a/rtgui/options.h b/rtgui/options.h index 3f7e2fb94..291a45d47 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -223,6 +223,7 @@ public: std::vector parseExtensionsEnabled; // List of bool to retain extension or not std::vector parsedExtensions; // List containing all retained extensions (lowercase) std::vector tpOpen; + bool autoSaveTpOpen; //std::vector crvOpen; std::vector baBehav; rtengine::Settings rtSettings; diff --git a/rtgui/preferences.cc b/rtgui/preferences.cc index 2aa7ef9a9..94b39bd53 100644 --- a/rtgui/preferences.cc +++ b/rtgui/preferences.cc @@ -878,14 +878,14 @@ Gtk::Widget* Preferences::getColorManagementPanel () grey->append (M("PREFERENCES_GREY30")); grey->append (M("PREFERENCES_GREY40")); */ -/* - Gtk::Label* greySclab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_GREYSC") + ":", Gtk::ALIGN_START)); - setExpandAlignProperties (greySclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - greySc = Gtk::manage (new Gtk::ComboBoxText ()); - setExpandAlignProperties (greySc, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); - greySc->append (M ("PREFERENCES_GREYSCA")); - greySc->append (M ("PREFERENCES_GREYSC18")); -*/ + /* + Gtk::Label* greySclab = Gtk::manage (new Gtk::Label (M ("PREFERENCES_GREYSC") + ":", Gtk::ALIGN_START)); + setExpandAlignProperties (greySclab, false, false, Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + greySc = Gtk::manage (new Gtk::ComboBoxText ()); + setExpandAlignProperties (greySc, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_CENTER); + greySc->append (M ("PREFERENCES_GREYSCA")); + greySc->append (M ("PREFERENCES_GREYSC18")); + */ Gtk::Frame* fcielab = Gtk::manage ( new Gtk::Frame (M ("PREFERENCES_CIEART_FRAME")) ); setExpandAlignProperties (fcielab, true, false, Gtk::ALIGN_FILL, Gtk::ALIGN_START); @@ -986,8 +986,20 @@ Gtk::Widget* Preferences::getGeneralPanel () workflowGrid->attach_next_to (*hb4label, *ckbFileBrowserToolbarSingleRow, Gtk::POS_BOTTOM, 1, 1); workflowGrid->attach_next_to (*ckbHideTPVScrollbar, *hb4label, Gtk::POS_RIGHT, 1, 1); workflowGrid->attach_next_to (*ckbUseIconNoText, *ckbHideTPVScrollbar, Gtk::POS_RIGHT, 1, 1); + ckbAutoSaveTpOpen = Gtk::manage (new Gtk::CheckButton (M ("PREFERENCES_AUTOSAVE_TP_OPEN"))); + workflowGrid->attach_next_to (*ckbAutoSaveTpOpen, *hb4label, Gtk::POS_BOTTOM, 1, 1); + btnSaveTpOpenNow = Gtk::manage (new Gtk::Button (M ("PREFERENCES_SAVE_TP_OPEN_NOW"))); + setExpandAlignProperties (btnSaveTpOpenNow, false, false, Gtk::ALIGN_START, Gtk::ALIGN_BASELINE); + workflowGrid->attach_next_to (*btnSaveTpOpenNow, *ckbAutoSaveTpOpen, Gtk::POS_RIGHT, 1, 1); + + auto save_tp_open_now = + [&]() -> void { + parent->writeToolExpandedStatus (moptions.tpOpen); + }; + btnSaveTpOpenNow->signal_clicked().connect (save_tp_open_now); fworklflow->add (*workflowGrid); + mvbsd->attach_next_to (*fworklflow, Gtk::POS_TOP, 2, 1); // --------------------------------------------- @@ -1792,6 +1804,8 @@ void Preferences::storePreferences () moptions.overwriteOutputFile = chOverwriteOutputFile->get_active (); moptions.UseIconNoText = ckbUseIconNoText->get_active(); + moptions.autoSaveTpOpen = ckbAutoSaveTpOpen->get_active(); + moptions.rgbDenoiseThreadLimit = rgbDenoiseTreadLimitSB->get_value_as_int(); moptions.clutCacheSize = clutCacheSizeSB->get_value_as_int(); moptions.maxInspectorBuffers = maxInspectorBuffersSB->get_value_as_int(); @@ -2009,6 +2023,8 @@ void Preferences::fillPreferences () ckbHideTPVScrollbar->set_active (moptions.hideTPVScrollbar); ckbUseIconNoText->set_active (moptions.UseIconNoText); + ckbAutoSaveTpOpen->set_active (moptions.autoSaveTpOpen); + rgbDenoiseTreadLimitSB->set_value (moptions.rgbDenoiseThreadLimit); clutCacheSizeSB->set_value (moptions.clutCacheSize); maxInspectorBuffersSB->set_value (moptions.maxInspectorBuffers); diff --git a/rtgui/preferences.h b/rtgui/preferences.h index 1a86c64a9..c9659d3dc 100644 --- a/rtgui/preferences.h +++ b/rtgui/preferences.h @@ -36,8 +36,8 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::TreeModelColumn ext; ExtensionColumns() { - add(enabled); - add(ext); + add (enabled); + add (ext); } }; ExtensionColumns extensionColumns; @@ -54,11 +54,11 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::TreeModelColumn addsetid; BehavColumns() { - add(label); - add(badd); - add(bset); - add(visible); - add(addsetid); + add (label); + add (badd); + add (bset); + add (visible); + add (addsetid); } }; @@ -68,7 +68,7 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Glib::ustring shortFName; Glib::ustring longFName; - ThemeFilename (Glib::ustring sfname, Glib::ustring lfname) : shortFName(sfname), longFName(lfname) {} + ThemeFilename (Glib::ustring sfname, Glib::ustring lfname) : shortFName (sfname), longFName (lfname) {} }; Glib::RefPtr behModel; @@ -122,7 +122,7 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::SpinButton* panFactor; Gtk::CheckButton* rememberZoomPanCheckbutton; - // Gtk::ComboBoxText* view; +// Gtk::ComboBoxText* view; // Gtk::ComboBoxText* grey; // Gtk::ComboBoxText* greySc; Gtk::ComboBoxText* dnv; @@ -201,6 +201,9 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener Gtk::CheckButton* ckbHideTPVScrollbar; Gtk::CheckButton* ckbUseIconNoText; + Gtk::CheckButton* ckbAutoSaveTpOpen; + Gtk::Button* btnSaveTpOpenNow; + DynamicProfilePanel *dynProfilePanel; Glib::ustring storedValueRaw; @@ -232,9 +235,9 @@ class Preferences : public Gtk::Dialog, public ProfileStoreListener void iccDirChanged (); void switchThemeTo (Glib::ustring newTheme); void switchFontTo (const Glib::ustring &newFontFamily, const int newFontSize); - bool splashClosed(GdkEventAny* event); + bool splashClosed (GdkEventAny* event); - int getThemeRowNumber(Glib::ustring& longThemeFName); + int getThemeRowNumber (Glib::ustring& longThemeFName); void appendBehavList (Gtk::TreeModel::iterator& parent, Glib::ustring label, int id, bool set); diff --git a/rtgui/rtwindow.cc b/rtgui/rtwindow.cc index 6f6388dd1..9af387567 100644 --- a/rtgui/rtwindow.cc +++ b/rtgui/rtwindow.cc @@ -691,6 +691,36 @@ bool RTWindow::on_delete_event (GdkEventAny* event) return false; } + +void RTWindow::writeToolExpandedStatus (std::vector &tpOpen) +{ + if ((isSingleTabMode() || gimpPlugin) && epanel->isRealized()) { + epanel->writeToolExpandedStatus (tpOpen); + } else { + // Storing the options of the last EditorPanel before Gtk destroys everything + // Look at the active panel first, if any, otherwise look at the first one (sorted on the filename) + if (epanels.size()) { + int page = mainNB->get_current_page(); + Gtk::Widget *w = mainNB->get_nth_page (page); + bool optionsWritten = false; + + for (std::map::iterator i = epanels.begin(); i != epanels.end(); ++i) { + if (i->second == w) { + i->second->writeToolExpandedStatus (tpOpen); + optionsWritten = true; + } + } + + if (!optionsWritten) { + // fallback solution: save the options of the first editor panel + std::map::iterator i = epanels.begin(); + i->second->writeToolExpandedStatus (tpOpen); + } + } + } +} + + void RTWindow::showPreferences () { Preferences *pref = new Preferences (this); diff --git a/rtgui/rtwindow.h b/rtgui/rtwindow.h index faad5f849..9c1699bcf 100644 --- a/rtgui/rtwindow.h +++ b/rtgui/rtwindow.h @@ -50,15 +50,15 @@ private: bool isSingleTabMode() { - return !options.tabbedUI && !(options.multiDisplayMode > 0); + return !options.tabbedUI && ! (options.multiDisplayMode > 0); }; - void findVerNumbers(int* numbers, Glib::ustring versionStr); + void findVerNumbers (int* numbers, Glib::ustring versionStr); - bool on_expose_event_epanel(GdkEventExpose* event); - bool on_expose_event_fpanel(GdkEventExpose* event); - bool splashClosed(GdkEventAny* event); - bool isEditorPanel(Widget* panel); - bool isEditorPanel(guint pageNum); + bool on_expose_event_epanel (GdkEventExpose* event); + bool on_expose_event_fpanel (GdkEventExpose* event); + bool splashClosed (GdkEventAny* event); + bool isEditorPanel (Widget* panel); + bool isEditorPanel (guint pageNum); Glib::ustring versionStr; #if defined(__APPLE__) @@ -70,20 +70,20 @@ public: ~RTWindow(); #if defined(__APPLE__) - bool osxFileOpenEvent(Glib::ustring path); + bool osxFileOpenEvent (Glib::ustring path); #endif void addEditorPanel (EditorPanel* ep, const std::string &name); void remEditorPanel (EditorPanel* ep); - bool selectEditorPanel(const std::string &name); + bool selectEditorPanel (const std::string &name); void addBatchQueueJob (BatchQueueEntry* bqe, bool head = false); void addBatchQueueJobs (std::vector &entries); bool keyPressed (GdkEventKey* event); - bool on_configure_event(GdkEventConfigure* event); - bool on_delete_event(GdkEventAny* event); - bool on_window_state_event(GdkEventWindowState* event); - void on_mainNB_switch_page(Gtk::Widget* widget, guint page_num); + bool on_configure_event (GdkEventConfigure* event); + bool on_delete_event (GdkEventAny* event); + bool on_window_state_event (GdkEventWindowState* event); + void on_mainNB_switch_page (Gtk::Widget* widget, guint page_num); void showPreferences (); void on_realize (); @@ -115,10 +115,12 @@ public: { return is_fullscreen; } - void set_title_decorated(Glib::ustring fname); + void set_title_decorated (Glib::ustring fname); void closeOpenEditors(); - void setEditorMode(bool tabbedUI); + void setEditorMode (bool tabbedUI); void createSetmEditor(); + + void writeToolExpandedStatus (std::vector &tpOpen); }; #endif diff --git a/rtgui/toolpanelcoord.cc b/rtgui/toolpanelcoord.cc index b06463eff..e30309fdf 100644 --- a/rtgui/toolpanelcoord.cc +++ b/rtgui/toolpanelcoord.cc @@ -28,7 +28,7 @@ using namespace rtengine::procparams; -ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), hasChanged(false), editDataProvider(nullptr) +ToolPanelCoordinator::ToolPanelCoordinator () : ipc (nullptr), hasChanged (false), editDataProvider (nullptr) { exposurePanel = Gtk::manage (new ToolVBox ()); @@ -53,7 +53,7 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), hasChanged(false), colortoning = Gtk::manage (new ColorToning ()); lensgeom = Gtk::manage (new LensGeometry ()); lensProf = Gtk::manage (new LensProfilePanel ()); - lensProf->setLensGeomRef(lensgeom); + lensProf->setLensGeomRef (lensgeom); distortion = Gtk::manage (new Distortion ()); rotate = Gtk::manage (new Rotate ()); vibrance = Gtk::manage (new Vibrance ()); @@ -203,8 +203,8 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), hasChanged(false), toolPanelNotebook = new Gtk::Notebook (); toolPanelNotebook->set_name ("ToolPanelNotebook"); - metadataPanel->append_page (*exifpanel, M("MAIN_TAB_EXIF")); - metadataPanel->append_page (*iptcpanel, M("MAIN_TAB_IPTC")); + metadataPanel->append_page (*exifpanel, M ("MAIN_TAB_EXIF")); + metadataPanel->append_page (*iptcpanel, M ("MAIN_TAB_IPTC")); exposurePanelSW = Gtk::manage (new MyScrolledWindow ()); detailsPanelSW = Gtk::manage (new MyScrolledWindow ()); @@ -217,47 +217,47 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), hasChanged(false), // load panel endings for (int i = 0; i < 6; i++) { vbPanelEnd[i] = Gtk::manage (new Gtk::VBox ()); - imgPanelEnd[i] = Gtk::manage (new RTImage("PanelEnding.png")); + imgPanelEnd[i] = Gtk::manage (new RTImage ("PanelEnding.png")); imgPanelEnd[i]->show (); vbPanelEnd[i]->pack_start (*imgPanelEnd[i], Gtk::PACK_SHRINK); vbPanelEnd[i]->show_all(); } exposurePanelSW->add (*exposurePanel); - exposurePanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + exposurePanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); exposurePanel->pack_start (*vbPanelEnd[0], Gtk::PACK_SHRINK, 4); detailsPanelSW->add (*detailsPanel); - detailsPanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + detailsPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); detailsPanel->pack_start (*vbPanelEnd[1], Gtk::PACK_SHRINK, 4); colorPanelSW->add (*colorPanel); - colorPanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + colorPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); colorPanel->pack_start (*vbPanelEnd[2], Gtk::PACK_SHRINK, 4); waveletPanelSW->add (*waveletPanel); - waveletPanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + waveletPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); waveletPanel->pack_start (*vbPanelEnd[5], Gtk::PACK_SHRINK, 0); transformPanelSW->add (*transformPanel); - transformPanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + transformPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); transformPanel->pack_start (*vbPanelEnd[3], Gtk::PACK_SHRINK, 4); rawPanelSW->add (*rawPanel); - rawPanel->pack_start (*Gtk::manage(new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); + rawPanel->pack_start (*Gtk::manage (new Gtk::HSeparator), Gtk::PACK_SHRINK, 0); rawPanel->pack_start (*vbPanelEnd[4], Gtk::PACK_SHRINK, 0); TOITypes type = options.UseIconNoText ? TOI_ICON : TOI_TEXT; - toiE = Gtk::manage (new TextOrIcon ("exposure.png" , M("MAIN_TAB_EXPOSURE") , M("MAIN_TAB_EXPOSURE_TOOLTIP") , type)); - toiD = Gtk::manage (new TextOrIcon ("detail.png" , M("MAIN_TAB_DETAIL") , M("MAIN_TAB_DETAIL_TOOLTIP") , type)); - toiC = Gtk::manage (new TextOrIcon ("colour.png" , M("MAIN_TAB_COLOR") , M("MAIN_TAB_COLOR_TOOLTIP") , type)); - toiW = Gtk::manage (new TextOrIcon ("wavelet.png" , M("MAIN_TAB_WAVELET") , M("MAIN_TAB_WAVELET_TOOLTIP") , type)); - toiT = Gtk::manage (new TextOrIcon ("transform.png", M("MAIN_TAB_TRANSFORM"), M("MAIN_TAB_TRANSFORM_TOOLTIP"), type)); - toiR = Gtk::manage (new TextOrIcon ("raw.png" , M("MAIN_TAB_RAW") , M("MAIN_TAB_RAW_TOOLTIP") , type)); - toiM = Gtk::manage (new TextOrIcon ("meta.png" , M("MAIN_TAB_METADATA") , M("MAIN_TAB_METADATA_TOOLTIP") , type)); + toiE = Gtk::manage (new TextOrIcon ("exposure.png", M ("MAIN_TAB_EXPOSURE"), M ("MAIN_TAB_EXPOSURE_TOOLTIP"), type)); + toiD = Gtk::manage (new TextOrIcon ("detail.png", M ("MAIN_TAB_DETAIL"), M ("MAIN_TAB_DETAIL_TOOLTIP"), type)); + toiC = Gtk::manage (new TextOrIcon ("colour.png", M ("MAIN_TAB_COLOR"), M ("MAIN_TAB_COLOR_TOOLTIP"), type)); + toiW = Gtk::manage (new TextOrIcon ("wavelet.png", M ("MAIN_TAB_WAVELET"), M ("MAIN_TAB_WAVELET_TOOLTIP"), type)); + toiT = Gtk::manage (new TextOrIcon ("transform.png", M ("MAIN_TAB_TRANSFORM"), M ("MAIN_TAB_TRANSFORM_TOOLTIP"), type)); + toiR = Gtk::manage (new TextOrIcon ("raw.png", M ("MAIN_TAB_RAW"), M ("MAIN_TAB_RAW_TOOLTIP"), type)); + toiM = Gtk::manage (new TextOrIcon ("meta.png", M ("MAIN_TAB_METADATA"), M ("MAIN_TAB_METADATA_TOOLTIP"), type)); toolPanelNotebook->append_page (*exposurePanelSW, *toiE); toolPanelNotebook->append_page (*detailsPanelSW, *toiD); @@ -287,17 +287,17 @@ ToolPanelCoordinator::ToolPanelCoordinator () : ipc(nullptr), hasChanged(false), icm->setICMPanelListener (this); toolBar = new ToolBar (); - toolBar->setToolBarListener(this); + toolBar->setToolBarListener (this); } void ToolPanelCoordinator::addPanel (Gtk::Box* where, FoldableToolPanel* panel, int level) { - panel->setParent(where); - panel->setLevel(level); + panel->setParent (where); + panel->setLevel (level); expList.push_back (panel->getExpander()); - where->pack_start(*panel->getExpander(), false, false); + where->pack_start (*panel->getExpander(), false, false); } ToolPanelCoordinator::~ToolPanelCoordinator () @@ -309,12 +309,13 @@ ToolPanelCoordinator::~ToolPanelCoordinator () delete toolBar; } -void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans) +void ToolPanelCoordinator::imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans) { GThreadLock lock; - if(isRaw) { - rawPanelSW->set_sensitive(true); + if (isRaw) { + rawPanelSW->set_sensitive (true); + if (isBayer) { sensorxtrans->FoldableToolPanel::hide(); sensorbayer->FoldableToolPanel::show(); @@ -332,7 +333,7 @@ void ToolPanelCoordinator::imageTypeChanged(bool isRaw, bool isBayer, bool isXtr flatfield->FoldableToolPanel::hide(); } } else { - rawPanelSW->set_sensitive(false); + rawPanelSW->set_sensitive (false); } } @@ -345,7 +346,7 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib:: return; } - int changeFlags = refreshmap[(int)event]; + int changeFlags = refreshmap[ (int)event]; ProcParams* params = ipc->beginUpdateParams (); @@ -355,14 +356,15 @@ void ToolPanelCoordinator::panelChanged (rtengine::ProcEvent event, const Glib:: // Compensate rotation on flip if (event == rtengine::EvCTHFlip || event == rtengine::EvCTVFlip) { - if (fabs(params->rotate.degree) > 0.001) { + if (fabs (params->rotate.degree) > 0.001) { params->rotate.degree *= -1; - changeFlags |= refreshmap[(int)rtengine::EvROTDegree]; + changeFlags |= refreshmap[ (int)rtengine::EvROTDegree]; rotate->read (params); } } int tr = TR_NONE; + if (params->coarse.rotate == 90) { tr = TR_R90; } else if (params->coarse.rotate == 180) { @@ -427,14 +429,14 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi } // And apply the partial profile nparams to mergedParams - nparams->applyTo(mergedParams); + nparams->applyTo (mergedParams); // Derive the effective changes, if it's a profile change, to prevent slow RAW rerendering if not necessary bool filterRawRefresh = false; if (event != rtengine::EvPhotoLoaded) { - ParamsEdited pe(true); - std::vector lParams(2); + ParamsEdited pe (true); + std::vector lParams (2); lParams[0] = *params; lParams[1] = *mergedParams; pe.initFrom (lParams); @@ -446,6 +448,7 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi delete mergedParams; tr = TR_NONE; + if (params->coarse.rotate == 90) { tr = TR_R90; } else if (params->coarse.rotate == 180) { @@ -456,7 +459,7 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi // trimming overflowing cropped area ipc->getInitialImage()->getImageSource()->getFullSize (fw, fh, tr); - crop->trim(params, fw, fh); + crop->trim (params, fw, fh); // updating the GUI with updated values for (auto toolPanel : toolPanels) { @@ -474,7 +477,7 @@ void ToolPanelCoordinator::profileChange (const PartialProfile *nparams, rtengi // start the IPC processing if (filterRawRefresh) { - ipc->endUpdateParams ( refreshmap[(int)event] & ALLNORAW ); + ipc->endUpdateParams ( refreshmap[ (int)event] & ALLNORAW ); } else { ipc->endUpdateParams (event); } @@ -526,7 +529,7 @@ void ToolPanelCoordinator::initImage (rtengine::StagedImageProcessor* ipc_, bool ipc->setSizeListener (crop); ipc->setSizeListener (resize); ipc->setImageTypeListener (this); - flatfield->setShortcutPath(Glib::path_get_dirname(ipc->getInitialImage()->getFileName())); + flatfield->setShortcutPath (Glib::path_get_dirname (ipc->getInitialImage()->getFileName())); icm->setRawMeta (raw, (const rtengine::ImageData*)pMetaData); lensProf->setRawMeta (raw, pMetaData); @@ -552,7 +555,7 @@ void ToolPanelCoordinator::closeAllTools() for (size_t i = 0; i < options.tpOpen.size(); i++) if (i < expList.size()) { - expList.at(i)->set_expanded (false); + expList.at (i)->set_expanded (false); } } @@ -561,7 +564,7 @@ void ToolPanelCoordinator::openAllTools() for (size_t i = 0; i < options.tpOpen.size(); i++) if (i < expList.size()) { - expList.at(i)->set_expanded (true); + expList.at (i)->set_expanded (true); } } @@ -570,20 +573,20 @@ void ToolPanelCoordinator::updateToolState() for (size_t i = 0; i < options.tpOpen.size(); i++) if (i < expList.size()) { - expList.at(i)->set_expanded (options.tpOpen.at(i)); + expList.at (i)->set_expanded (options.tpOpen.at (i)); } - if(options.tpOpen.size() > expList.size()) { + if (options.tpOpen.size() > expList.size()) { size_t sizeWavelet = options.tpOpen.size() - expList.size(); std::vector temp; for (size_t i = 0; i < sizeWavelet; i++) { - temp.push_back(options.tpOpen.at(i + expList.size())); + temp.push_back (options.tpOpen.at (i + expList.size())); } - wavelet->updateToolState(temp); - wavelet->setExpanded(true); - retinex->updateToolState(temp); + wavelet->updateToolState (temp); + wavelet->setExpanded (true); + retinex->updateToolState (temp); } } @@ -597,14 +600,23 @@ void ToolPanelCoordinator::writeOptions () { crop->writeOptions (); - options.tpOpen.clear (); + + if (options.autoSaveTpOpen) { + writeToolExpandedStatus (options.tpOpen); + } +} + + +void ToolPanelCoordinator::writeToolExpandedStatus (std::vector &tpOpen) +{ + tpOpen.clear (); for (size_t i = 0; i < expList.size(); i++) { - options.tpOpen.push_back (expList.at(i)->get_expanded ()); + tpOpen.push_back (expList.at (i)->get_expanded ()); } - wavelet->writeOptions(options.tpOpen); - retinex->writeOptions(options.tpOpen); + wavelet->writeOptions (tpOpen); + retinex->writeOptions (tpOpen); } @@ -679,14 +691,14 @@ rtengine::RawImage* ToolPanelCoordinator::getDF() const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData(); - if(imd) { + if (imd) { int iso = imd->getISOSpeed(); double shutter = imd->getShutterSpeed(); - std::string maker( imd->getMake() ); - std::string model( imd->getModel() ); + std::string maker ( imd->getMake() ); + std::string model ( imd->getModel() ); time_t timestamp = imd->getDateTimeAsTS(); - return rtengine::dfm.searchDarkFrame( maker, model, iso, shutter, timestamp); + return rtengine::dfm.searchDarkFrame ( maker, model, iso, shutter, timestamp); } return nullptr; @@ -700,17 +712,17 @@ rtengine::RawImage* ToolPanelCoordinator::getFF() const rtengine::ImageMetaData *imd = ipc->getInitialImage()->getMetaData(); - if(imd) { + if (imd) { // int iso = imd->getISOSpeed(); temporarilly removed because unused // double shutter = imd->getShutterSpeed(); temporarilly removed because unused double aperture = imd->getFNumber(); double focallength = imd->getFocalLen(); - std::string maker( imd->getMake() ); - std::string model( imd->getModel() ); - std::string lens( imd->getLens() ); + std::string maker ( imd->getMake() ); + std::string model ( imd->getModel() ); + std::string lens ( imd->getLens() ); time_t timestamp = imd->getDateTimeAsTS(); - return rtengine::ffm.searchFlatField( maker, model, lens, focallength, aperture, timestamp); + return rtengine::ffm.searchFlatField ( maker, model, lens, focallength, aperture, timestamp); } return nullptr; @@ -783,8 +795,8 @@ void ToolPanelCoordinator::updateCurveBackgroundHistogram (LUTu & histToneCurve, colorappearance->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); toneCurve->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); lcurve->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve, /*histCLurve, histLLCurve,*/ histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - rgbcurves->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); - retinex->updateCurveBackgroundHistogram(histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + rgbcurves->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); + retinex->updateCurveBackgroundHistogram (histToneCurve, histLCurve, histCCurve,/* histCLurve, histLLCurve, */histLCAM, histCCAM, histRed, histGreen, histBlue, histLuma, histLRETI); } @@ -798,10 +810,10 @@ void ToolPanelCoordinator::foldAllButOne (Gtk::Box* parent, FoldableToolPanel* o if (currentTP->getParent() == parent) { // Section in the same tab, we unfold it if it's not the one that has been clicked if (currentTP != openedSection) { - currentTP->setExpanded(false); + currentTP->setExpanded (false); } else { if (!currentTP->getExpanded()) { - currentTP->setExpanded(true); + currentTP->setExpanded (true); } } } @@ -817,36 +829,36 @@ bool ToolPanelCoordinator::handleShortcutKey (GdkEventKey* event) bool alt = event->state & GDK_MOD1_MASK; if (alt) { - switch(event->keyval) { - case GDK_KEY_e: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*exposurePanelSW)); - return true; - - case GDK_KEY_d: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*detailsPanelSW)); - return true; - - case GDK_KEY_c: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*colorPanelSW)); - return true; - - case GDK_KEY_t: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*transformPanelSW)); - return true; - - case GDK_KEY_r: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*rawPanelSW)); - return true; - - case GDK_KEY_w: - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*waveletPanelSW)); - return true; - - case GDK_KEY_m: - if (metadataPanel) { - toolPanelNotebook->set_current_page (toolPanelNotebook->page_num(*metadataPanel)); + switch (event->keyval) { + case GDK_KEY_e: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*exposurePanelSW)); return true; - } + + case GDK_KEY_d: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*detailsPanelSW)); + return true; + + case GDK_KEY_c: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*colorPanelSW)); + return true; + + case GDK_KEY_t: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*transformPanelSW)); + return true; + + case GDK_KEY_r: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*rawPanelSW)); + return true; + + case GDK_KEY_w: + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*waveletPanelSW)); + return true; + + case GDK_KEY_m: + if (metadataPanel) { + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*metadataPanel)); + return true; + } } } @@ -865,7 +877,7 @@ void ToolPanelCoordinator::updateVScrollbars (bool hide) waveletPanelSW->set_policy (Gtk::POLICY_AUTOMATIC, policy); for (auto currExp : expList) { - currExp->updateVScrollbars(hide); + currExp->updateVScrollbars (hide); } } @@ -874,14 +886,14 @@ void ToolPanelCoordinator::updateTabsHeader (bool useIcons) GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected TOITypes type = useIcons ? TOI_ICON : TOI_TEXT; - toiE->switchTo(type); - toiD->switchTo(type); - toiC->switchTo(type); - toiT->switchTo(type); - toiR->switchTo(type); + toiE->switchTo (type); + toiD->switchTo (type); + toiC->switchTo (type); + toiT->switchTo (type); + toiR->switchTo (type); if (toiM) { - toiM->switchTo(type); + toiM->switchTo (type); } } @@ -900,24 +912,24 @@ void ToolPanelCoordinator::toolSelected (ToolMode tool) GThreadLock lock; // All GUI acces from idle_add callbacks or separate thread HAVE to be protected switch (tool) { - case TMCropSelect: - crop->setExpanded(true); - toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*transformPanelSW)); - break; + case TMCropSelect: + crop->setExpanded (true); + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*transformPanelSW)); + break; - case TMSpotWB: - whitebalance->setExpanded(true); - toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*colorPanelSW)); - break; + case TMSpotWB: + whitebalance->setExpanded (true); + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*colorPanelSW)); + break; - case TMStraighten: - lensgeom->setExpanded(true); - rotate->setExpanded(true); - toolPanelNotebook->set_current_page(toolPanelNotebook->page_num(*transformPanelSW)); - break; + case TMStraighten: + lensgeom->setExpanded (true); + rotate->setExpanded (true); + toolPanelNotebook->set_current_page (toolPanelNotebook->page_num (*transformPanelSW)); + break; - default: - break; + default: + break; } } @@ -931,14 +943,14 @@ void ToolPanelCoordinator::editModeSwitchedOff () void ToolPanelCoordinator::dirSelected (const Glib::ustring& dirname, const Glib::ustring& openfile) { - flatfield->setShortcutPath(dirname); + flatfield->setShortcutPath (dirname); } -void ToolPanelCoordinator::setEditProvider(EditDataProvider *provider) +void ToolPanelCoordinator::setEditProvider (EditDataProvider *provider) { editDataProvider = provider; for (size_t i = 0; i < toolPanels.size(); i++) { - toolPanels.at(i)->setEditProvider(provider); + toolPanels.at (i)->setEditProvider (provider); } } diff --git a/rtgui/toolpanelcoord.h b/rtgui/toolpanelcoord.h index cfb85e372..5a71ef692 100644 --- a/rtgui/toolpanelcoord.h +++ b/rtgui/toolpanelcoord.h @@ -217,7 +217,7 @@ public: // toolpanellistener interface void panelChanged (rtengine::ProcEvent event, const Glib::ustring& descr); - void imageTypeChanged(bool isRaw, bool isBayer, bool isXtrans); + void imageTypeChanged (bool isRaw, bool isBayer, bool isXtrans); // profilechangelistener interface void profileChange (const rtengine::procparams::PartialProfile* nparams, rtengine::ProcEvent event, const Glib::ustring& descr, const ParamsEdited* paramsEdited = nullptr); void setDefaults (rtengine::procparams::ProcParams* defparams); @@ -239,6 +239,8 @@ public: // read/write the "expanded" state of the expanders & read/write the crop panel settings (ratio, guide type, etc.) void readOptions (); void writeOptions (); + void writeToolExpandedStatus (std::vector &tpOpen); + // wbprovider interface void getAutoWB (double& temp, double& green, double equal, double tempBias) @@ -297,7 +299,7 @@ public: void toolSelected (ToolMode tool); void editModeSwitchedOff (); - void setEditProvider(EditDataProvider *provider); + void setEditProvider (EditDataProvider *provider); }; #endif