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 @@
+
+
+
+