From f76ccb6ac9ddfbef943612f838a4e98e4d9a9c68 Mon Sep 17 00:00:00 2001 From: natureh 510 Date: Mon, 8 Apr 2013 22:23:10 +0200 Subject: [PATCH] Solving issue 1751: "When switching processing profiles, missing values should be taken from Neutral" ; also updates the French language file --- rtdata/images/Dark/actions/profile-filled.png | Bin 0 -> 538 bytes .../images/Dark/actions/profile-partial.png | Bin 0 -> 491 bytes .../images/Light/actions/profile-filled.png | Bin 0 -> 535 bytes .../images/Light/actions/profile-partial.png | Bin 0 -> 489 bytes rtdata/languages/Francais | 36 +- rtdata/languages/default | 1 + rtengine/procparams.cc | 2 +- rtengine/procparams.h | 2 +- rtgui/editorpanel.cc | 2 + rtgui/filebrowser.cc | 4 +- rtgui/options.cc | 4 + rtgui/options.h | 8 +- rtgui/profilepanel.cc | 68 +- rtgui/profilepanel.h | 9 +- rtgui/profilestore.cc | 10 +- rtgui/profilestore.h | 8 +- rtgui/thumbnail.cc | 2 +- .../source_icons/scalable/profile-filled.file | 1 + .../source_icons/scalable/profile-filled.svg | 746 ++++++++++++++++++ .../scalable/profile-partial.file | 1 + .../source_icons/scalable/profile-partial.svg | 732 +++++++++++++++++ 21 files changed, 1585 insertions(+), 51 deletions(-) create mode 100644 rtdata/images/Dark/actions/profile-filled.png create mode 100644 rtdata/images/Dark/actions/profile-partial.png create mode 100644 rtdata/images/Light/actions/profile-filled.png create mode 100644 rtdata/images/Light/actions/profile-partial.png create mode 100644 tools/source_icons/scalable/profile-filled.file create mode 100644 tools/source_icons/scalable/profile-filled.svg create mode 100644 tools/source_icons/scalable/profile-partial.file create mode 100644 tools/source_icons/scalable/profile-partial.svg diff --git a/rtdata/images/Dark/actions/profile-filled.png b/rtdata/images/Dark/actions/profile-filled.png new file mode 100644 index 0000000000000000000000000000000000000000..8e39de5f2a4a9aff5655b30d1d90eacd31890c63 GIT binary patch literal 538 zcmV+#0_FXQP)=GXMYp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10hdWcK~y-6z0$F36j2bz@$bAlR!NXU!6smB5r{>={_X~r155u9 zK`gAURuIx9jZFe61bexC$035~iGd(oWsx(Tg=7`s;Mg~5qQzz(c}UE!+u8R%JIs!l z835knsE(5tzxP8$9?|lwjZ+a&pKl=UtyCm3q{~EwK_pI0JO@ZgY?WW6S zb^xTo!0s9R?dC z&be&>GkXHO6_L9{W?YYmtVTOl)%&&57O+}B*OYd|w z0a~rri*C33+03?xkKzD$kOTv70G7+;_Xw7ht6R6pWU>yhSS*eQgTc@7c)Vw3Hxs?5 zs`{l7uBvJuAj`5xz{JcpNL;rN!i{Lhs(P;Qxiw(~qc6p@!Ak~E64EFS{z>+lIM6p=rjmgldg=kL13GMmk^`Ft)Z*mOEw4u`{# c1pjMJ0mpKj(I=GXMYp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10cc4?K~y-6-PJKm12GuJ@&B8a8x$!DE`qazpo8Gv^1{*G4~zq&1Unn*Xx~o z?-v8T166%4gtIKW0EnV!7wCKMHwb)g&bfusiB)woSG7fCE^y+vQaB&){eyEZ3Q=pd zT3QMxNzw*z&Yi?@{3If$A`)~JX`1c;cX{{&Xo<+rr0MUi;gO#|uPnpiFdB_U5`ql| hgGsB^azXI4`2yd+c<%kZB=7(L002ovPDHLkV1gQz&dUG* literal 0 HcmV?d00001 diff --git a/rtdata/images/Light/actions/profile-filled.png b/rtdata/images/Light/actions/profile-filled.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5ae44bfa1a21fd7bb3200290f8c7988728c5af GIT binary patch literal 535 zcmV+y0_gpTP)=GXMYp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H10hCEZK~y-6y^=9Y13?gl-|U7c1`7pCyX;+I&_eJp*jV~Q1hKHP zRuIx9jg5kZU~eZPh$sevMcCX0)PRMBB#K42WXI+X;^kHsB|bQqy`B5!@ovD(U}h+# z=9N;<$@#C3z?d{PaPFrDrPQjFax&|VnP0Wmmrh{M^G*SPh<3HsH$=2&jG42{tpRWY z3n2~xAeYNM#jf6oXu{(7!!i&U*H(-;E*6W+@xZXvYIS|zKVjxstFs{y(WchAZi}K4 zgSP-&FtZQ9mhl%227^LUkAR!a=1S^SnTQJMzAQ;8AFbfDj4=-YGJhTsb%G$c&brH5 zx8oSNABN$b5TXow6g2>APGBNBi^~@a%uWBcZc3?zxNHYO@aFse5i`%Yn3Pg(HyVw5 zAUldA;|&1k%)AK4b&H~CI;pePZE5(-%vB-8lnWR@+X_xgN_pGw_wz1PBI;Vfp66BL zri#|OZj3n)LO4ZXj9CY8l?HbJ><|$EKnT$t{nTB=%-=SYN~L_S*CQ8L7={ru8z=B@ Z^$D)8OddC9!OZ{w002ovPDHLkV1gO+;Ftga literal 0 HcmV?d00001 diff --git a/rtdata/images/Light/actions/profile-partial.png b/rtdata/images/Light/actions/profile-partial.png new file mode 100644 index 0000000000000000000000000000000000000000..9bb666ae330a55ea7bdbc629cd534404f19f57e1 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEX7WqAsj$Z!;#Vf2>S zKM-czcvjvR$dD{?jVKAuPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw>;fq^m2)5S5w zqW9`0LvLn75%v%Nt1Yb}WJF}{&f0x&QS$@!kIfv99z1!Yuw!dCho}q-ySaH`VSr4R z^X%897n+(UKMz}Xws>dL981n{*+0$-`g{HeIVmU!2xhDe-+FER=Bj%Ke=PoEZ=s>r zl32mX;8K#&v-7{{jG5L90xSo;L$7dt|NVD$<$<6b7c+908ah-CKQ!oF^uozyTCIW7 zEz@Hqa}A8Q7gg{dSli*k5LWZxWl5C&-a?t<(XC69l~#%WjtTU#oqnjV*{}9OQq29g zG7M|Bx_eHt33HrlAQ=1n^7d6Lgw2kXJY)1uT>CZ3PL`LgxnHB}oJ-0{_F%8K->dej ztNXZYHowPMpse)z!=Jp!X}Z(yS@b>bUB9(s%goAy>}&>Ft=&L7eAFh->i2TV)RbvU zw9e0xOx|_vmT=m)Dz5CeW(~WQ{_s6$0LH?ZId%76$qP-Cm!5StE!ReFGXFFcPc@}$ c-0Nof@BOwrxTHN+7Z@!Jp00i_>zopr01vvt@Bjb+ literal 0 HcmV?d00001 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 + + + + + + + + + + + + + + + + + + + + +