diff --git a/rtdata/images/Dark/actions/profile-filled.png b/rtdata/images/Dark/actions/profile-filled.png new file mode 100644 index 000000000..8e39de5f2 Binary files /dev/null and b/rtdata/images/Dark/actions/profile-filled.png differ diff --git a/rtdata/images/Dark/actions/profile-partial.png b/rtdata/images/Dark/actions/profile-partial.png new file mode 100644 index 000000000..70c77fdff Binary files /dev/null and b/rtdata/images/Dark/actions/profile-partial.png differ diff --git a/rtdata/images/Light/actions/profile-filled.png b/rtdata/images/Light/actions/profile-filled.png new file mode 100644 index 000000000..7e5ae44bf Binary files /dev/null and b/rtdata/images/Light/actions/profile-filled.png differ diff --git a/rtdata/images/Light/actions/profile-partial.png b/rtdata/images/Light/actions/profile-partial.png new file mode 100644 index 000000000..9bb666ae3 Binary files /dev/null and b/rtdata/images/Light/actions/profile-partial.png differ diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index fb9d06096..64e1c008f 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -88,7 +88,7 @@ FILEBROWSER_ARRANGEMENTHINT;Permuter entre l'alignement vertical/horizontal des FILEBROWSER_AUTODARKFRAME;Soustraction automatique de Trame Noire FILEBROWSER_AUTOFLATFIELD;Champ Uniforme auto FILEBROWSER_BROWSEPATHBUTTONHINT;Cliquez pour parcourir le chemin saisi -FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir (Ctrl-o place le focus,Ctrl-Entrée pour naviguer dans le Navigateur de Fichier) +FILEBROWSER_BROWSEPATHHINT;Saisissez le chemin à parcourir\nCtrl-O pour placer le focus sur le champ de saisie.\nEntrée / Ctrl-Entrée pour y naviguer;\nEsc pour effacer les modifications.\nShift-Esc pour enlever le focus.\n\n\nRaccourcis pour les chemins:\n ~ - le dossier utilisateur\n ! - le dossier Images de l'utilisateur FILEBROWSER_CACHECLEARFROMFULL;Supprimer du cache (complet) FILEBROWSER_CACHECLEARFROMPARTIAL;Supprimer du cache (partiel) FILEBROWSER_CACHE;Cache @@ -149,7 +149,7 @@ FILEBROWSER_POPUPUNTRASH;Retirer de la corbeille FILEBROWSER_PROCESSINGSETTINGSHINT;Règle le format de fichier et le dossier de sortie FILEBROWSER_PROCESSINGSETTINGS;Réglages FILEBROWSER_QUERYBUTTONHINT;Effacer la recherche -FILEBROWSER_QUERYHINT;Taper la partie du nom du fichier à chercher. \nCtrl-f Place le curseur dans le champ de saisie;\nEntrée pour lancer la recherche +FILEBROWSER_QUERYHINT;Taper la partie du nom du fichier à chercher ou une liste spéarée par des virgules.\nEx: 1001.1004.1199\n\nCtrl-F pour placer le curseur dans le champ de saisie.\nEntrée pour lancer la recherche\nEsc pour effacer.\nShift-Esc pour enlever le focus. FILEBROWSER_QUERYLABEL;Chercher: FILEBROWSER_RENAMEDLGLABEL;Renommage du fichier FILEBROWSER_RENAMEDLGMSG;Renommer le fichier "%1" en: @@ -163,7 +163,7 @@ FILEBROWSER_SHOWCOLORLABEL5HINT;Afficher les images avec un label Pourpre Alt FILEBROWSER_SHOWDIRHINT;Voir toutes les images du dossier D FILEBROWSER_SHOWEDITEDHINT;Afficher les images éditées 7 FILEBROWSER_SHOWEDITEDNOTHINT;Afficher les images non éditées 6 -FILEBROWSER_SHOWEXIFINFO;Montrer les infos EXIF i +FILEBROWSER_SHOWEXIFINFO;Montrer les infos EXIF.\nRaccourcis: i\n\nRaccourcis dans le mode Éditeur unique: Alt-i FILEBROWSER_SHOWQUEUEHINT;Voir le contenu de la file de traitement FILEBROWSER_SHOWRANK1HINT;Voir les images 1 étoile 1 FILEBROWSER_SHOWRANK2HINT;Voir les images 2 étoiles 2 @@ -182,8 +182,8 @@ FILEBROWSER_STOPPROCESSING;Arrêter le traitement FILEBROWSER_THUMBSIZE;Taille vign. FILEBROWSER_TOOLTIP_STOPPROCESSING;Démarrer automatiquement le traitement à l'arrivée d'une nouvelle tâche FILEBROWSER_USETEMPLATE;Utiliser le modèle: -FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes + -FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes - +FILEBROWSER_ZOOMINHINT;Augmenter la taille des vignettes.\nRaccourcis: +\n\nRaccourcis dans le mode Éditeur unique: Alt + +FILEBROWSER_ZOOMOUTHINT;Diminuer la taille des vignettes.\nRaccourcis: -\n\nRaccourcis dans le mode Éditeur unique: Alt - GENERAL_ABOUT;À propos GENERAL_AFTER;Après GENERAL_AUTO;Automatique @@ -430,6 +430,7 @@ HISTORY_MSG_200;CAM02 - Compression tonale avec Q HISTORY_MSG_201;Réd. de bruit - Delta chrom. rouge HISTORY_MSG_202;Réd. de bruit - Delta chrom. bleu HISTORY_MSG_203;Réd. de bruit - Méthode +HISTORY_MSG_204;Niveau d'amélioration LMMSE HISTORY_NEWSNAPSHOTAS;Sous... HISTORY_NEWSNAPSHOT;Ajouter HISTORY_NEWSNAPSHOT_TOOLTIP;Raccourcis: Alt-s @@ -496,6 +497,9 @@ IPTCPANEL_TRANSREFERENCEHINT;Un code représentant le lieux de la transmission i IPTCPANEL_TRANSREFERENCE;Réf. transmission MAIN_BUTTON_EXIT;Sortie MAIN_BUTTON_FULLSCREEN;Plein écran +MAIN_BUTTON_NAVNEXT_TOOLTIP;Navigue à l'image Suivante relativement à l'image ouverte dans l'Éditeur\nRaccourcis: Shift-F4\n\nPour naviguer à l'image Suivante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourcis: F4 +MAIN_BUTTON_NAVPREV_TOOLTIP;Navigue à l'image Précédante relativement à l'image ouverte dans l'Éditeur\nRaccourcis: Shift-F3\n\nPour naviguer à l'image Précédante relativement à la vignette sélectionnée dans le Navigateur de fichiers\nRaccourcis: F3 +MAIN_BUTTON_NAVSYNC_TOOLTIP;Synchronise le Navigateur de fichiers avec l'Éditeur pour révéler la vignette de l'image actuellement ouverte, et efface les filtres dans le Navigateur de fichiers\nRaccourcis: x\n\nComme ci-dessus, mais sans effacer les filtres dans le Navigateur de fichiers\nRaccourcis: y\n(Notez que la vignette ne sera pas visible si elle a été filtrée). MAIN_BUTTON_PREFERENCES;Préférences MAIN_BUTTON_PUTTOQUEUE_TOOLTIP;Ajouter l'image courante à la file de traitement Ctrl+Q MAIN_BUTTON_QUEUE;Envoyer dans la file @@ -654,6 +658,7 @@ PARTIALPASTE_RAWGROUP;Réglages RAW PARTIALPASTE_RAW_ALLENHANCE;Applique la réduction de bruit/artefact post-dématriçage PARTIALPASTE_RAW_DCBENHANCE;Appliquer la phase d'amélioration de DCB PARTIALPASTE_RAW_DCBITERATIONS;Nombre d'itération de DCB +PARTIALPASTE_RAW_LMMSEITERATIONS;Niveau d'amélioration LMMSE PARTIALPASTE_RAW_DMETHOD;Algorithme de dématriçage PARTIALPASTE_RAW_FALSECOLOR;Nbr d'itération des fausses couleurs PARTIALPASTE_RESIZE;Redimentionnement @@ -672,6 +677,10 @@ PREFERENCES_APPLNEXTSTARTUP;appliqué au prochain lancement PREFERENCES_AUTOMONPROFILE;Utiliser automatiquement le profil de l'écran principal PREFERENCES_BATCH_PROCESSING;Traitement par lot PREFERENCES_BEHAVIOR;Comportement +PREFERENCES_BEHADDALL;Tout à 'Ajoute' +PREFERENCES_BEHADDALLHINT;Règle tous les paramètres sur le mode Ajoute.\nLa modification des paramètres dans le panneau d'édition en par lot sera des deltas par-rapport aux valeurs existantes +PREFERENCES_BEHSETALL;Tout à 'Remplace' +PREFERENCES_BEHSETALLHINT;Règle tous les paramètres sur le mode Remplace.\nLa modification des paramètres dans le panneau d'édition en par lot sera absolue, les valeurs réelles seront affichées PREFERENCES_BLACKBODY;Tungstène PREFERENCES_BLINKCLIPPED;Faire clignoter les zones hors domaine PREFERENCES_CACHECLEARALL;Tout nettoyer @@ -830,6 +839,7 @@ PROFILEPANEL_FILEDLGFILTERPP;Profils de post-traitement PROFILEPANEL_LABEL;Profils de post-traitement PROFILEPANEL_LOADDLGLABEL;Charger les paramètres de post-traitement... PROFILEPANEL_LOADPPASTE;Paramètres à charger +PROFILEPANEL_MODE_TIP;Bouton pressé: les profils partiels seront convertis en profils complets; les valeurs manquantes seront remplacées par les valeurs internes par défaut\n\nBouton relevé: les profils seront appliqués tel quel, altérant seulement les paramètres qu'ils contiennent. PROFILEPANEL_PASTEPPASTE;Paramètres à coller PROFILEPANEL_PCUSTOM;Personnel PROFILEPANEL_PFILE;Depuis le fichier @@ -911,8 +921,8 @@ TP_CHMIXER_RED;Rouge TP_CHROMATABERR_LABEL;Aberration Chromatique TP_COARSETRAF_DEGREE;degré: TP_COARSETRAF_TOOLTIP_HFLIP;Symétriser / axe vertical -TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche -TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotation vers la droite +TP_COARSETRAF_TOOLTIP_ROTLEFT;Rotation vers la gauche\nRaccourcis: [\n\nRaccourcis en mode Éditeur unique: Alt-[ +TP_COARSETRAF_TOOLTIP_ROTRIGHT;Rotation vers la droite\nRaccourcis: ]\n\nRaccourcis en mode Éditeur unique: Alt-] TP_COARSETRAF_TOOLTIP_VFLIP;Symétriser / axe horizontal TP_COLORAPP_ADAPTSCENE;Luminosité d'adaptation (cd/m2) TP_COLORAPP_ADAPTSCENE_TOOLTIP;Luminance absolue de l'environnement de la scène\n(souvent 2000cd/m2) @@ -1192,6 +1202,8 @@ TP_RAW_ALLENHANCE;Réduction de bruit/artefact post-dématriçage TP_RAW_DCBENHANCE;Appliquer la phase d'amélioration de DCB TP_RAW_DCBITERATIONS;Nombre d'itération de DCB TP_RAW_DMETHOD;Méthode +TP_RAW_LMMSEITERATIONS;Niveau d'amélioration LMMSE +TP_RAW_LMMSE_TOOLTIP;Ajoute gamma (niveau 1) - ajoute médian (niveau 2,3,4), puis ajoute un affinage (niveau 5,6) pour réduire les artéfacts et améliorer le rapport signal/bruit TP_RAW_DMETHOD_PROGRESSBAR;Dématriçage %1... TP_RAW_DMETHOD_PROGRESSBAR_REFINE;Affinage du dématriçage... TP_RAW_DMETHOD_TOOLTIP;Note: IGV et LMMSE sont dédiés aux images à haut ISO @@ -1331,7 +1343,7 @@ ZOOMBAR_SCALE;Échelle ZOOMBAR_SMALL;Petit ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Ouvrir une (nouvelle) vue détaillée -ZOOMPANEL_ZOOM100;Zoom à 100% 1 +ZOOMPANEL_ZOOM100;Zoom à 100%\nRaccourcis: z ZOOMPANEL_ZOOMFITSCREEN;Ajuster à la fenêtre F ZOOMPANEL_ZOOMIN;Zoom + ZOOMPANEL_ZOOMOUT;Zoom - @@ -1342,7 +1354,7 @@ ZOOMPANEL_ZOOMOUT;Zoom - ! Untranslated keys follow; remove the ! prefix after an entry is translated. !!!!!!!!!!!!!!!!!!!!!!!!! -!TP_COLORAPP_SHARPCIE;Sharpening, Contrast by Detail Levels, Microcontrast & Defringe with Q/C -!TP_COLORAPP_SHARPCIE_TOOLTIP;Sharpening, Contrast by Detail Levels, Microcontrast & Defringe will use CIECAM02 if enabled. -!TP_RGBCURVES_LUMAMODE;Luminosity Mode -!TP_RGBCURVES_LUMAMODE_TOOLTIP;Luminosity Mode allows to vary the contribution of R, G an B channels to the Luminosity of the image, without altering image color. +TP_COLORAPP_SHARPCIE;Netteté, Contraste par niveau de détails, Microcontraste & Aberration chromatique avec Q/C +TP_COLORAPP_SHARPCIE_TOOLTIP;Netteté, Contraste par niveau de détails, Microcontraste & Aberration chromatique utiliseront CIECAM02 si activé. +TP_RGBCURVES_LUMAMODE;Mode Lominosité +TP_RGBCURVES_LUMAMODE_TOOLTIP;Mode Lominosité permet de faire varier la contribution des canaux R, V et B à la luminosité de l'image, sans altérer les couleurs de l'image. diff --git a/rtdata/languages/default b/rtdata/languages/default index f5843680c..c6d74cc59 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -835,6 +835,7 @@ PROFILEPANEL_FILEDLGFILTERPP;Processing profiles PROFILEPANEL_LABEL;Processing Profiles PROFILEPANEL_LOADDLGLABEL;Load Processing Parameters... PROFILEPANEL_LOADPPASTE;Parameters to load +PROFILEPANEL_MODE_TIP;Button pressed: partial profiles will be converted to full profiles; the missing values will be replaced with hard-coded defaults.\n\nButton released: profiles will be applied as they are, altering only those values which they contain. PROFILEPANEL_PASTEPPASTE;Parameters to paste PROFILEPANEL_PCUSTOM;Custom PROFILEPANEL_PFILE;From file diff --git a/rtengine/procparams.cc b/rtengine/procparams.cc index e413e2ffa..4463e6866 100644 --- a/rtengine/procparams.cc +++ b/rtengine/procparams.cc @@ -1740,7 +1740,7 @@ void PartialProfile::clearGeneral () { } } -void PartialProfile::applyTo(ProcParams *destParams) const { +const void PartialProfile::applyTo(ProcParams *destParams) const { if (destParams && pparams && pedited) { pedited->combine(*destParams, *pparams, true); } diff --git a/rtengine/procparams.h b/rtengine/procparams.h index d4cb47ac7..5d5f9ec37 100644 --- a/rtengine/procparams.h +++ b/rtengine/procparams.h @@ -853,7 +853,7 @@ class PartialProfile { void clearGeneral (); int load (Glib::ustring fName); void set (bool v); - void applyTo (ProcParams *destParams) const ; + const void applyTo (ProcParams *destParams) const ; }; } diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 614b38ce7..38079d411 100644 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -398,6 +398,8 @@ void EditorPanel::rightPaneButtonReleased(GdkEventButton *event) { } void EditorPanel::writeOptions() { + if (profilep) + profilep->writeOptions(); if (tpc) tpc->writeOptions(); } diff --git a/rtgui/filebrowser.cc b/rtgui/filebrowser.cc index 997c694af..2b66ecba3 100644 --- a/rtgui/filebrowser.cc +++ b/rtgui/filebrowser.cc @@ -877,7 +877,7 @@ bool FileBrowser::keyPressed (GdkEventKey* event) { void FileBrowser::applyMenuItemActivated (Glib::ustring ppname) { - rtengine::procparams::PartialProfile* partProfile = profileStore.getProfile (ppname); + const rtengine::procparams::PartialProfile* partProfile = profileStore.getProfile (ppname); if (partProfile->pparams && !selected.empty()) { for (size_t i=0; i(selected[i]))->thumbnail->setProcParams (*partProfile->pparams, partProfile->pedited, FILEBROWSER); @@ -890,7 +890,7 @@ void FileBrowser::applyPartialMenuItemActivated (Glib::ustring ppname) { if (!tbl || selected.empty()) return; - rtengine::procparams::PartialProfile* srcProfiles = profileStore.getProfile (ppname); + const rtengine::procparams::PartialProfile* srcProfiles = profileStore.getProfile (ppname); if (srcProfiles->pparams) { if (partialPasteDlg.run()==Gtk::RESPONSE_OK) { diff --git a/rtgui/options.cc b/rtgui/options.cc index 0d28227a4..c6cf653fa 100644 --- a/rtgui/options.cc +++ b/rtgui/options.cc @@ -307,6 +307,8 @@ void Options::setDefaults () { rgbDenoiseThreadLimit = 0; + filledProfile = false; + showProfileSelector = true; FileBrowserToolbarSingleRow = false; hideTPVScrollbar = false; @@ -571,6 +573,7 @@ if (keyFile.has_group ("Profiles")) { if (keyFile.has_key ("Profiles", "LoadSaveProfilePath")) loadSaveProfilePath = keyFile.get_string ("Profiles", "LoadSaveProfilePath"); if (keyFile.has_key ("Profiles", "RawDefault")) defProfRaw = keyFile.get_string ("Profiles", "RawDefault"); if (keyFile.has_key ("Profiles", "ImgDefault")) defProfImg = keyFile.get_string ("Profiles", "ImgDefault"); + if (keyFile.has_key ("Profiles", "FilledProfile")) filledProfile = keyFile.get_boolean ("Profiles", "FilledProfile"); if (keyFile.has_key ("Profiles", "SaveParamsWithFile")) saveParamsFile = keyFile.get_boolean ("Profiles", "SaveParamsWithFile"); if (keyFile.has_key ("Profiles", "SaveParamsToCache")) saveParamsCache = keyFile.get_boolean ("Profiles", "SaveParamsToCache"); if (keyFile.has_key ("Profiles", "LoadParamsFromLocation")) paramsLoadLocation = (PPLoadLocation)keyFile.get_integer ("Profiles", "LoadParamsFromLocation"); @@ -869,6 +872,7 @@ int Options::saveToFile (Glib::ustring fname) { keyFile.set_string ("Profiles", "LoadSaveProfilePath", loadSaveProfilePath); keyFile.set_string ("Profiles", "RawDefault", defProfRaw); keyFile.set_string ("Profiles", "ImgDefault", defProfImg); + keyFile.set_boolean ("Profiles", "FilledProfile", filledProfile); keyFile.set_boolean ("Profiles", "SaveParamsWithFile", saveParamsFile); keyFile.set_boolean ("Profiles", "SaveParamsToCache", saveParamsCache); keyFile.set_integer ("Profiles", "LoadParamsFromLocation", paramsLoadLocation); diff --git a/rtgui/options.h b/rtgui/options.h index 2d0da00f8..57f32778e 100644 --- a/rtgui/options.h +++ b/rtgui/options.h @@ -108,8 +108,8 @@ class Options { bool windowMaximized; int dirBrowserWidth; int dirBrowserHeight; - int preferencesWidth; - int preferencesHeight; + int preferencesWidth; + int preferencesHeight; int lastScale; int panAccelFactor; int lastCropSize; @@ -151,7 +151,7 @@ class Options { Glib::ustring psDir; Glib::ustring customEditorProg; Glib::ustring customProfileBuilder; - int editorToSendTo; + int editorToSendTo; int maxThumbnailHeight; std::size_t maxCacheEntries; ThFileType thumbnailFormat; @@ -198,6 +198,8 @@ class Options { // Performance options int rgbDenoiseThreadLimit; // maximum number of threads for the denoising tool ; 0 = use the maximum available + bool filledProfile; // Used as reminder for the ProfilePanel "mode" + bool menuGroupRank; bool menuGroupLabel; bool menuGroupFileOperations; diff --git a/rtgui/profilepanel.cc b/rtgui/profilepanel.cc index bec6349bd..94f2d6576 100644 --- a/rtgui/profilepanel.cc +++ b/rtgui/profilepanel.cc @@ -27,8 +27,6 @@ using namespace rtengine; using namespace rtengine::procparams; -extern Glib::ustring argv0; - PartialPasteDlg* ProfilePanel::partialProfileDlg; @@ -43,7 +41,15 @@ void ProfilePanel::cleanup () { ProfilePanel::ProfilePanel (bool readOnly) : lastFilename(""), imagePath("") { tpc = NULL; - + + profileFillModeOnImage = new RTImage("profile-filled.png"); + profileFillModeOffImage = new RTImage("profile-partial.png"); + fillMode = Gtk::manage (new Gtk::ToggleButton()); + fillMode->set_active(options.filledProfile); + fillMode->add( options.filledProfile ? *profileFillModeOnImage : *profileFillModeOffImage ); + fillMode->signal_toggled().connect ( sigc::mem_fun(*this, &ProfilePanel::profileFillModeToggled) ); + fillMode->set_tooltip_text(M("PROFILEPANEL_MODE_TIP")); + profiles = Gtk::manage (new MyComboBoxText ()); Gtk::HBox* hbox = Gtk::manage (new Gtk::HBox ()); hbox->show (); @@ -60,6 +66,7 @@ ProfilePanel::ProfilePanel (bool readOnly) : lastFilename(""), imagePath("") { paste = Gtk::manage (new Gtk::Button ()); paste->add (*Gtk::manage (new RTImage ("edit-paste.png"))); + hbox->pack_start (*fillMode, Gtk::PACK_SHRINK, 1); hbox->pack_start (*profiles); hbox->pack_start (*load, Gtk::PACK_SHRINK, 1); if (!readOnly) hbox->pack_start (*save, Gtk::PACK_SHRINK, 1); @@ -93,6 +100,8 @@ ProfilePanel::~ProfilePanel () { if (custom) { custom->deleteInstance(); delete custom; } if (lastsaved) { lastsaved->deleteInstance(); delete lastsaved; } + delete profileFillModeOnImage; + delete profileFillModeOffImage; } void ProfilePanel::refreshProfileList () { @@ -166,7 +175,7 @@ void ProfilePanel::save_clicked (GdkEventButton* event) { lastFilename = Glib::path_get_basename (fname); - PartialProfile* toSave = NULL; + const PartialProfile* toSave; if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") toSave = custom; else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")") @@ -221,7 +230,7 @@ void ProfilePanel::copy_clicked (GdkEventButton* event) { if (event->button != 1) return; - PartialProfile* toSave = NULL; + const PartialProfile* toSave; if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PCUSTOM") + ")") toSave = custom; else if (profiles->get_active_text() == Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")") @@ -379,7 +388,7 @@ void ProfilePanel::paste_clicked (GdkEventButton* event) { return; } -void ProfilePanel::changeTo (PartialProfile* newpp, Glib::ustring profname) { +void ProfilePanel::changeTo (const PartialProfile* newpp, Glib::ustring profname) { if (!newpp) return; @@ -398,9 +407,17 @@ void ProfilePanel::selection_changed () { else if (profiles->get_active_text() == (entry = Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")")) changeTo (lastsaved, entry); else { - PartialProfile* s = profileStore.getProfile (profiles->get_active_text()); - if (s) - changeTo (s, profiles->get_active_text()); + const PartialProfile* s = profileStore.getProfile (profiles->get_active_text()); + if (s) { + if (fillMode->get_active() && s->pedited) { + ParamsEdited pe; + pe.set(true); + PartialProfile s2(s->pparams, &pe, false); + changeTo (&s2, profiles->get_active_text()+"+"); + } + else + changeTo (s, profiles->get_active_text()); + } } old = profiles->get_active_text (); dontupdate = false; @@ -453,7 +470,7 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS } Glib::ustring defline = profname; - PartialProfile* defprofile = profileStore.getProfile (profname); + const PartialProfile* defprofile = profileStore.getProfile (profname); if (lastsaved) { defline = Glib::ustring("(") + M("PROFILEPANEL_PLASTSAVED") + ")"; @@ -475,18 +492,17 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS tpc->profileChange (defprofile, EvPhotoLoaded, defline); } else { - bool dels = false; // select first valid profile old = ""; profiles->set_active (0); - PartialProfile* s = profileStore.getProfile (profiles->get_active_text()); + const PartialProfile* s = profileStore.getProfile (profiles->get_active_text()); if (!s) { changeconn.block (false); - s = new PartialProfile (true); - s->set(true); - dels = true; // we've created a temporary PartialProfile, so we set a flag to destroy it + PartialProfile s2(true); + s2.pedited->set(true); if (tpc) - tpc->profileChange (s, EvPhotoLoaded, DEFPROFILE_INTERNAL); + tpc->profileChange (&s2, EvPhotoLoaded, DEFPROFILE_INTERNAL); + s2.deleteInstance(); } else { Glib::ustring cProfile = profiles->get_active_text(); @@ -494,11 +510,6 @@ void ProfilePanel::initProfile (const Glib::ustring& profname, ProcParams* lastS if (tpc) tpc->profileChange (s, EvPhotoLoaded, cProfile); } - - if (dels) { - s->deleteInstance(); - delete s; - } } } @@ -507,3 +518,18 @@ void ProfilePanel::setInitialFileName (const Glib::ustring& filename) { imagePath = Glib::path_get_dirname(filename); } +void ProfilePanel::profileFillModeToggled() { + if (fillMode->get_active()) { + // The button is pressed, we'll use the profileFillModeOnImage + fillMode->set_image(*profileFillModeOnImage); + } + else { + // The button is released, we'll use the profileFillModeOffImage + fillMode->set_image(*profileFillModeOffImage); + } +} + +void ProfilePanel::writeOptions() { + options.filledProfile = fillMode->get_active(); +} + diff --git a/rtgui/profilepanel.h b/rtgui/profilepanel.h index dab365c18..647e0cfad 100644 --- a/rtgui/profilepanel.h +++ b/rtgui/profilepanel.h @@ -26,6 +26,7 @@ #include "profilechangelistener.h" #include "partialpastedlg.h" #include "guiutils.h" +#include "rtimage.h" class ProfilePanel : public Gtk::VBox, public PParamsChangeListener { @@ -33,6 +34,11 @@ class ProfilePanel : public Gtk::VBox, public PParamsChangeListener { Glib::ustring lastFilename; Glib::ustring imagePath; + RTImage *profileFillModeOnImage; + RTImage *profileFillModeOffImage; + Gtk::ToggleButton* fillMode; + + void profileFillModeToggled(); protected: @@ -50,7 +56,7 @@ class ProfilePanel : public Gtk::VBox, public PParamsChangeListener { bool dontupdate; sigc::connection changeconn; - void changeTo (rtengine::procparams::PartialProfile* newpp, Glib::ustring profname); + void changeTo (const rtengine::procparams::PartialProfile* newpp, Glib::ustring profname); void refreshProfileList (); public: @@ -75,6 +81,7 @@ class ProfilePanel : public Gtk::VBox, public PParamsChangeListener { void copy_clicked (GdkEventButton* event); void paste_clicked (GdkEventButton* event); void selection_changed (); + void writeOptions(); }; #endif diff --git a/rtgui/profilestore.cc b/rtgui/profilestore.cc index bbeba0460..7d8b5f8b1 100644 --- a/rtgui/profilestore.cc +++ b/rtgui/profilestore.cc @@ -143,7 +143,7 @@ void ProfileStore::parseDir (const Glib::ustring& pdir) { } } -PartialProfile* ProfileStore::getProfile (const Glib::ustring& profname) { +const PartialProfile* ProfileStore::getProfile (const Glib::ustring& profname) { if (!init()) // I don't even know if this situation can occur @@ -177,14 +177,14 @@ std::vector ProfileStore::getProfileNames () { * If the profile doesn't already exist in the profile list, * it will add it with default internal values, so this method never fails */ -ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) { +const ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) { if (!init()) // I don't even know if this situation can occur return NULL; //Note: the mutex is locked in getProfile, called below - PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg); + const PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg); // NOTE: pProf should not be NULL anymore, since init() should have created the default profiles already return pProf->pparams; } @@ -194,14 +194,14 @@ ProcParams* ProfileStore::getDefaultProcParams (bool isRaw) { * If it doesn't already exist in the profile list, it will add it with default internal values, * so this method will never fails */ -PartialProfile* ProfileStore::getDefaultPartialProfile (bool isRaw) { +const PartialProfile* ProfileStore::getDefaultPartialProfile (bool isRaw) { if (!init()) // I don't even know if this situation can occur return NULL; //Note: the mutex is locked in getProfile, called below - PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg); + const PartialProfile* pProf = getProfile (isRaw ? options.defProfRaw : options.defProfImg); // NOTE: pProf should not be NULL anymore, since init() should have created the default profiles already return pProf; } diff --git a/rtgui/profilestore.h b/rtgui/profilestore.h index 40d3def30..a58c51da5 100644 --- a/rtgui/profilestore.h +++ b/rtgui/profilestore.h @@ -46,10 +46,10 @@ class ProfileStore { ~ProfileStore(); bool init (); void parseProfiles (); - rtengine::procparams::PartialProfile* getProfile (const Glib::ustring& profname); - std::vector getProfileNames (); - rtengine::procparams::ProcParams* getDefaultProcParams (bool isRaw); - rtengine::procparams::PartialProfile* getDefaultPartialProfile (bool isRaw); + const rtengine::procparams::PartialProfile* getProfile (const Glib::ustring& profname); + std::vector getProfileNames (); + const rtengine::procparams::ProcParams* getDefaultProcParams (bool isRaw); + const rtengine::procparams::PartialProfile* getDefaultPartialProfile (bool isRaw); }; extern ProfileStore profileStore; diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index fe3499b96..8d06da256 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -233,7 +233,7 @@ void Thumbnail::loadProcParams () { pparamsValid = false; pparams.setDefaults(); - PartialProfile *defaultPP = profileStore.getDefaultPartialProfile(getType()==FT_Raw); + const PartialProfile *defaultPP = profileStore.getDefaultPartialProfile(getType()==FT_Raw); defaultPP->applyTo(&pparams); if (options.paramsLoadLocation==PLL_Input) { diff --git a/tools/source_icons/scalable/profile-filled.file b/tools/source_icons/scalable/profile-filled.file new file mode 100644 index 000000000..7e877241a --- /dev/null +++ b/tools/source_icons/scalable/profile-filled.file @@ -0,0 +1 @@ +profile-filled.png,w22 diff --git a/tools/source_icons/scalable/profile-filled.svg b/tools/source_icons/scalable/profile-filled.svg new file mode 100644 index 000000000..fadc80267 --- /dev/null +++ b/tools/source_icons/scalable/profile-filled.svg @@ -0,0 +1,746 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/source_icons/scalable/profile-partial.file b/tools/source_icons/scalable/profile-partial.file new file mode 100644 index 000000000..0ac99aaaf --- /dev/null +++ b/tools/source_icons/scalable/profile-partial.file @@ -0,0 +1 @@ +profile-partial.png,w22 diff --git a/tools/source_icons/scalable/profile-partial.svg b/tools/source_icons/scalable/profile-partial.svg new file mode 100644 index 000000000..d379fc471 --- /dev/null +++ b/tools/source_icons/scalable/profile-partial.svg @@ -0,0 +1,732 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + +