From 1addf4bf3cdd3530b07b7dc93580be7bbe68e84b Mon Sep 17 00:00:00 2001 From: DrSlony Date: Wed, 11 Mar 2015 15:59:41 +0100 Subject: [PATCH] Added fit-crop-to-screen Editor button, issue 2706 --- rtdata/images/Dark/actions/gtk-zoom-crop.png | Bin 0 -> 1139 bytes rtdata/images/Light/actions/gtk-zoom-crop.png | Bin 0 -> 1196 bytes rtdata/languages/Polish | 3 +- rtdata/languages/default | 3 +- rtgui/crophandler.cc | 6 + rtgui/crophandler.h | 1 + rtgui/cropwindow.cc | 25 +- rtgui/cropwindow.h | 3 +- rtgui/editorpanel.cc | 7 +- rtgui/zoompanel.cc | 14 + rtgui/zoompanel.h | 2 + .../source_icons/scalable/gtk-zoom-crop.file | 1 + tools/source_icons/scalable/gtk-zoom-crop.svg | 512 ++++++++++++++++++ 13 files changed, 570 insertions(+), 7 deletions(-) create mode 100644 rtdata/images/Dark/actions/gtk-zoom-crop.png create mode 100644 rtdata/images/Light/actions/gtk-zoom-crop.png create mode 100644 tools/source_icons/scalable/gtk-zoom-crop.file create mode 100644 tools/source_icons/scalable/gtk-zoom-crop.svg diff --git a/rtdata/images/Dark/actions/gtk-zoom-crop.png b/rtdata/images/Dark/actions/gtk-zoom-crop.png new file mode 100644 index 0000000000000000000000000000000000000000..f20e826ba61328b74f5ff6b7b863933c3874563a GIT binary patch literal 1139 zcmV-(1dRKMP)=GXMYp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11Mo>iK~y-6t&~k@TvZgu&$;*A_ufn=nNBmQtzyxIQWO!%xJW~d zljKdZaU+t2NC@ z%$v-6_uS*66Nod7wdj9yANQR9k8{tx?;vcWFbv%|jvtg#=9pOmKpg2x|D-_WYo z`d4Pwh`2`xafc8B<2X)|Bsn)RG4T;1@;`!uAQ;MKvu`?%!}2hOQq5U zBB}@>(6X%On7QY!uv{)X`F#Eh$8j<%D=Wuxx!j0lS<{GkHxbo{XpM-Nhzv8+#>U1A zrBdl<-}kdp%6Ey#A);5Nrlv0atzxCr1Fq}#wcG9A7Zw(lwbnlwW4x;CPueft>&uLYOd94 z^>?c5E0@dt005R{?d`0!9eKdaU1;^5%mN`60RW;XI@@eEAKkTU*HjP$m&V4%J|7(&o!^@1`~E&e ztO3CHmSwS&@(3b=*800*vAEIG3IKq~$;qpYM&k?sz|NgJUkbzUgzx*=t%;uJ{nppl zH_XiYl~Qj=DK}5E(hUXJGAo!F!!SIW&1R2SmZhR7szp)s4H5lCnf*@ literal 0 HcmV?d00001 diff --git a/rtdata/images/Light/actions/gtk-zoom-crop.png b/rtdata/images/Light/actions/gtk-zoom-crop.png new file mode 100644 index 0000000000000000000000000000000000000000..c83bac4feed7a042b8b3a2d7acd2776222cf0e3e GIT binary patch literal 1196 zcmV;d1XKHoP)=GXMYp8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11Sv^GK~y-6rIcN0TV)u>pZDXuO>$0>HA`A&m(hi^%{qdUIbn`T zFE;Q(Z$!Lw6TI+Z(Wj$n!A0{}=V&+Og1_r8^tm63seg6kU42>~$W6U+J^)*DCW{izmmK6m6sMTt1BD%pj2V=|wTaBfZa=@}ID-6Rr z0N~{03Uf1^^fv8#@?@M4sGSM#S4fh~rYqecR3$5d~w6h$z_M zJntILxds3rBEHQS5nW>pa?Xc#=thdgVm|(OpQuzS9YowGga9IPw{5Dm zo?BmE@5N%V1G!x8z~+asSnQnRIKRbWv77OD{3`$eDdmS!$}c7+CM4(l=pEy^ZN~L_ z{jX#)c|DuWPDG>8vjFfa0D$Yd&l6D}003i*5OKh=tk;Y&7Z7oFX=&*RAw(JxyISjC zwt)cvdcEGoPN#EhaB%Q3t@U)NRQh^mX6C2OgSlMp0O#D*T2C^@NCt~38mCaLWn*hB4fDdH3>zOGe>Rm$owY2>T3uar*Vfj4)LPd#=Z15BzYyZMWm)}11jZPnwI;3g zb>H{jTv%9ecLM{!KR+X-)Op8ohNYD9juj#z`o6Dy-){v$@IB}JHW3w*$>eDwGVONz zQl(P)1ORA9@WzHCBO?U>c#w0R7D9m5x=lp45{bl(si~ zcU{;0Y<_$=mnZFdo|sI`8*TCGmsyY(M3Ha2!}n;8SxH1-+*0000< KMNUMnLSTZ~Z!mxW literal 0 HcmV?d00001 diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index fd45e40a2..096704b79 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1528,7 +1528,8 @@ TP_WBALANCE_WATER_HEADER;Pod wodą ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Otwórz (nową) lupę ZOOMPANEL_ZOOM100;Powiększ do 100%\nSkrót: z -ZOOMPANEL_ZOOMFITSCREEN;Dopasuj do ekranu\nSkrót: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Dopasuj kadr do ekranu\nSkrót: Alt-f +ZOOMPANEL_ZOOMFITSCREEN;Dopasuj cały obraz do ekranu\nSkrót: f ZOOMPANEL_ZOOMIN;Przybliż\nSkrót: + ZOOMPANEL_ZOOMOUT;Oddal\nSkrót: - diff --git a/rtdata/languages/default b/rtdata/languages/default index 42d650d1a..db5063bcf 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -1728,6 +1728,7 @@ TP_WBALANCE_WATER_HEADER;UnderWater ZOOMPANEL_100;(100%) ZOOMPANEL_NEWCROPWINDOW;Open (new) detail window ZOOMPANEL_ZOOM100;Zoom to 100%\nShortcut: z -ZOOMPANEL_ZOOMFITSCREEN;Fit to screen\nShortcut: f +ZOOMPANEL_ZOOMFITCROPSCREEN;Fit crop to screen\nShortcut: Alt-f +ZOOMPANEL_ZOOMFITSCREEN;Fit whole image to screen\nShortcut: f ZOOMPANEL_ZOOMIN;Zoom In\nShortcut: + ZOOMPANEL_ZOOMOUT;Zoom Out\nShortcut: - diff --git a/rtgui/crophandler.cc b/rtgui/crophandler.cc index 00feccd34..9c25eea64 100644 --- a/rtgui/crophandler.cc +++ b/rtgui/crophandler.cc @@ -90,6 +90,12 @@ void CropHandler::sizeChanged (int x, int y, int ow, int oh) { // the ipc notif */ } +double CropHandler::getFitCropZoom () { + double z1 = (double) wh / cropParams.h; + double z2 = (double) ww / cropParams.w; + return z1 z) { + cz = i; + break; + } + zoomVersion = exposeVersion; + int centerX,centerY; + centerX = cropHandler.cropParams.x + cropHandler.cropParams.w / 2; + centerY = cropHandler.cropParams.y + cropHandler.cropParams.h / 2; + changeZoom (cz, true, centerX, centerY, false); + fitZoom = false; + } +} + void CropWindow::buttonPressed (LWButton* button, int actionCode, void* actionData) { if (button==bZoomIn) // zoom in @@ -1597,14 +1618,14 @@ void CropWindow::redrawNeeded (LWButton* button) { iarea->redraw (); } -void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery) { +void CropWindow::changeZoom (int zoom, bool notify, int centerx, int centery, bool skipZoomIfUnchanged) { if (zoom<0) zoom = 0; else if (zoom>MAXZOOMSTEPS) zoom = MAXZOOMSTEPS; - if (cropZoom == zoom) { + if (cropZoom == zoom && skipZoomIfUnchanged) { // We are already at the start/end of the zoom range, so we do nothing return; } diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 8facdabfb..7a1126b5f 100755 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -93,7 +93,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener, public E void drawScaledSpotRectangle (Cairo::RefPtr cr, int rectSize); void drawUnscaledSpotRectangle (Cairo::RefPtr cr, int rectSize); void drawObservedFrame (Cairo::RefPtr cr, int rw=0, int rh=0); - void changeZoom (int zoom, bool notify=true, int centerx=-1, int centery=-1); + void changeZoom (int zoom, bool notify=true, int centerx=-1, int centery=-1, bool skipZoomIfUnchanged = true); void getObservedFrameArea (int& x, int& y, int& w, int& h, int rw=0, int rh=0); public: @@ -130,6 +130,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener, public E void zoomOut (bool toCursor=false, int cursorX=-1, int cursorY=-1); void zoom11 (); void zoomFit (); + void zoomFitCrop (); double getZoom (); bool isMinZoom (); bool isMaxZoom (); diff --git a/rtgui/editorpanel.cc b/rtgui/editorpanel.cc index 96b092486..b1f03fdd9 100755 --- a/rtgui/editorpanel.cc +++ b/rtgui/editorpanel.cc @@ -707,7 +707,7 @@ void EditorPanel::displayError (Glib::ustring title, Glib::ustring descr) { GtkWidget* msgd = gtk_message_dialog_new_with_markup (NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, - GTK_BUTTONS_OK, + GTK_BUTTONS_OK, "%s", descr.data()); gtk_window_set_title((GtkWindow*)msgd, title.data()); @@ -1043,6 +1043,9 @@ bool EditorPanel::handleShortcutKey (GdkEventKey* event) { history->addBookmarkPressed (); setProgressStr(M("PROGRESSBAR_SNAPSHOT_ADDED")); return true; + case GDK_f: + iareapanel->imageArea->zoomPanel->zoomFitCropClicked(); + return true; } } @@ -1296,7 +1299,7 @@ bool EditorPanel::idle_sendToGimp( ProgressConnector *pc, G rtengine::IImage16* img = pc->returnValue(); delete pc; if (img) { - // get file name base + // get file name base Glib::ustring shortname = removeExtension (Glib::path_get_basename (fname)); Glib::ustring dirname = Glib::get_tmp_dir (); Glib::ustring fname = Glib::build_filename (dirname, shortname); diff --git a/rtgui/zoompanel.cc b/rtgui/zoompanel.cc index e869e9729..3596cc588 100644 --- a/rtgui/zoompanel.cc +++ b/rtgui/zoompanel.cc @@ -33,6 +33,8 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { image11->set_padding(0,0); Gtk::Image* imageFit = Gtk::manage (new RTImage ("gtk-zoom-fit.png")); imageFit->set_padding(0,0); + Gtk::Image* imageFitCrop = Gtk::manage (new RTImage ("gtk-zoom-crop.png")); + imageFit->set_padding(0,0); zoomOut = Gtk::manage (new Gtk::Button()); zoomOut->add (*imageOut); @@ -43,6 +45,9 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { zoomFit = Gtk::manage (new Gtk::Button()); zoomFit->add (*imageFit); zoomFit->set_relief(Gtk::RELIEF_NONE); + zoomFitCrop = Gtk::manage (new Gtk::Button()); + zoomFitCrop->add (*imageFitCrop); + zoomFitCrop->set_relief(Gtk::RELIEF_NONE); zoom11 = Gtk::manage (new Gtk::Button()); zoom11->add (*image11); zoom11->set_relief(Gtk::RELIEF_NONE); @@ -50,6 +55,7 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { pack_start (*zoomOut, Gtk::PACK_SHRINK, 0); pack_start (*zoomIn, Gtk::PACK_SHRINK, 0); pack_start (*zoomFit, Gtk::PACK_SHRINK, 0); + pack_start (*zoomFitCrop, Gtk::PACK_SHRINK, 0); pack_start (*zoom11, Gtk::PACK_SHRINK, 0); zoomLabel = Gtk::manage (new Gtk::Label ()); @@ -67,6 +73,7 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { zoomIn->signal_clicked().connect ( sigc::mem_fun(*this, &ZoomPanel::zoomInClicked) ); zoomOut->signal_clicked().connect( sigc::mem_fun(*this, &ZoomPanel::zoomOutClicked) ); zoomFit->signal_clicked().connect( sigc::mem_fun(*this, &ZoomPanel::zoomFitClicked) ); + zoomFitCrop->signal_clicked().connect( sigc::mem_fun(*this, &ZoomPanel::zoomFitCropClicked) ); zoom11->signal_clicked().connect ( sigc::mem_fun(*this, &ZoomPanel::zoom11Clicked) ); newCrop->signal_clicked().connect ( sigc::mem_fun(*this, &ZoomPanel::newCropClicked) ); @@ -74,6 +81,7 @@ ZoomPanel::ZoomPanel (ImageArea* iarea) : iarea(iarea) { zoomOut->set_tooltip_markup (M("ZOOMPANEL_ZOOMOUT")); zoom11->set_tooltip_markup (M("ZOOMPANEL_ZOOM100")); zoomFit->set_tooltip_markup (M("ZOOMPANEL_ZOOMFITSCREEN")); + zoomFitCrop->set_tooltip_markup (M("ZOOMPANEL_ZOOMFITCROPSCREEN")); newCrop->set_tooltip_markup (M("ZOOMPANEL_NEWCROPWINDOW")); zoomLabel->set_text (M("ZOOMPANEL_100")); @@ -97,6 +105,12 @@ void ZoomPanel::zoomFitClicked () { iarea->mainCropWindow->zoomFit (); } +void ZoomPanel::zoomFitCropClicked () { + + if (iarea->mainCropWindow) + iarea->mainCropWindow->zoomFitCrop (); +} + void ZoomPanel::zoom11Clicked () { if (iarea->mainCropWindow) diff --git a/rtgui/zoompanel.h b/rtgui/zoompanel.h index 27bc0fa9e..cbc46b52b 100644 --- a/rtgui/zoompanel.h +++ b/rtgui/zoompanel.h @@ -29,6 +29,7 @@ class ZoomPanel : public Gtk::HBox { Gtk::Button* zoomOut; Gtk::Button* zoomIn; Gtk::Button* zoomFit; + Gtk::Button* zoomFitCrop; Gtk::Button* zoom11; Gtk::Button* newCrop; Gtk::Label* zoomLabel; @@ -41,6 +42,7 @@ class ZoomPanel : public Gtk::HBox { void zoomInClicked (); void zoomOutClicked (); void zoomFitClicked (); + void zoomFitCropClicked (); void zoom11Clicked (); void newCropClicked (); void refreshZoomLabel (); diff --git a/tools/source_icons/scalable/gtk-zoom-crop.file b/tools/source_icons/scalable/gtk-zoom-crop.file new file mode 100644 index 000000000..9d79868b9 --- /dev/null +++ b/tools/source_icons/scalable/gtk-zoom-crop.file @@ -0,0 +1 @@ +gtk-zoom-crop.png,w22,actions diff --git a/tools/source_icons/scalable/gtk-zoom-crop.svg b/tools/source_icons/scalable/gtk-zoom-crop.svg new file mode 100644 index 000000000..7ed5d51c2 --- /dev/null +++ b/tools/source_icons/scalable/gtk-zoom-crop.svg @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + +