From aed90f29ea32fec8a48ab24f08fb9e34092c2156 Mon Sep 17 00:00:00 2001 From: Thanatomanic Date: Thu, 12 Jul 2018 09:01:30 +0200 Subject: [PATCH] Try something new: click-and-drag to modify scaling. Feedback appreciated. --- rtgui/histogrampanel.cc | 34 ++++++++++++++++++++++++++++++++-- rtgui/histogrampanel.h | 7 +++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/rtgui/histogrampanel.cc b/rtgui/histogrampanel.cc index bf9c9de3d..511f7f35e 100644 --- a/rtgui/histogrampanel.cc +++ b/rtgui/histogrampanel.cc @@ -627,6 +627,9 @@ HistogramArea::HistogramArea (DrawModeListener *fml) : //needChroma unactive by ghist(256); bhist(256); chist(256); + + factor = 10.0; + isPressed = false; get_style_context()->add_class("drawingarea"); set_name("HistogramArea"); @@ -934,12 +937,12 @@ void HistogramArea::on_realize () Gtk::DrawingArea::on_realize(); Glib::RefPtr window = get_window(); - add_events(Gdk::BUTTON_PRESS_MASK); + add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK); } double HistogramArea::scalingFunctionLog(double vsize, double val) { - double factor = 10.0; // can be tuned if necessary - higher is flatter curve + //double factor = 10.0; // can be tuned if necessary - higher is flatter curve return vsize * log(factor / (factor + val)) / log(factor / (factor + vsize)); } @@ -1005,6 +1008,9 @@ bool HistogramArea::on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr) bool HistogramArea::on_button_press_event (GdkEventButton* event) { + isPressed = true; + movingPosition = event->x; + if (event->type == GDK_2BUTTON_PRESS && event->button == 1) { drawMode = (drawMode + 1) % 3; @@ -1021,3 +1027,27 @@ bool HistogramArea::on_button_press_event (GdkEventButton* event) return true; } +bool HistogramArea::on_button_release_event (GdkEventButton* event) +{ + isPressed = false; + return true; +} + +bool HistogramArea::on_motion_notify_event (GdkEventMotion* event) +{ + if (isPressed) + { + double mod = 1 + (event->x - movingPosition) / get_width(); + + factor /= mod; + if (factor < 1.0) + factor = 1.0; + if (factor > 100.0) + factor = 100.0; + + setDirty(true); + queue_draw (); + } + + return true; +} diff --git a/rtgui/histogrampanel.h b/rtgui/histogrampanel.h index d11b87153..b38a20d3c 100644 --- a/rtgui/histogrampanel.h +++ b/rtgui/histogrampanel.h @@ -119,8 +119,9 @@ protected: int oldwidth, oldheight; bool needLuma, needRed, needGreen, needBlue, rawMode, needChroma; - - + double factor; + bool isPressed; + double movingPosition; HistogramAreaIdleHelper* haih; @@ -134,6 +135,8 @@ public: void on_realize(); bool on_draw(const ::Cairo::RefPtr< Cairo::Context> &cr); bool on_button_press_event (GdkEventButton* event); + bool on_button_release_event (GdkEventButton* event); + bool on_motion_notify_event (GdkEventMotion* event); private: void drawCurve(Cairo::RefPtr &cr, LUTu & data, double scale, int hsize, int vsize);