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 000000000..f20e826ba Binary files /dev/null and b/rtdata/images/Dark/actions/gtk-zoom-crop.png differ 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 000000000..c83bac4fe Binary files /dev/null and b/rtdata/images/Light/actions/gtk-zoom-crop.png differ 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 + + + + + + + + + + + + + + + + + + + +