Author: Carlos Lopez <[email protected]>
Date:   Wed Mar 28 00:12:20 2012 +0200

Improve constrast on color sliders for Color Edit and Gradient Edit widgets. 
Patch thanks to Bertrand Gregoire

---

 synfig-studio/src/gui/widgets/widget_coloredit.cpp |    6 +++-
 synfig-studio/src/gui/widgets/widget_coloredit.h   |    2 +-
 synfig-studio/src/gui/widgets/widget_gradient.cpp  |   27 ++++++++++++++++---
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/synfig-studio/src/gui/widgets/widget_coloredit.cpp 
b/synfig-studio/src/gui/widgets/widget_coloredit.cpp
index 3657052..72b0656 100644
--- a/synfig-studio/src/gui/widgets/widget_coloredit.cpp
+++ b/synfig-studio/src/gui/widgets/widget_coloredit.cpp
@@ -55,6 +55,7 @@ using namespace studio;
 /* === M A C R O S ========================================================= */
 
 #define SPINBUTTON_WIDTH 100
+#define ARROW_NEGATIVE_THRESHOLD 0.4
 
 /* === G L O B A L S ======================================================= */
 
@@ -75,7 +76,7 @@ void
 ColorSlider::set_type(Type x) { type=x; queue_draw(); }
 
 void
-ColorSlider::set_color(synfig::Color x) { color_=x; queue_draw(); }
+ColorSlider::set_color(synfig::Color x) { orig_color=x; color_=x; 
queue_draw(); }
 
 void
 ColorSlider::slider_color_TYPE_R(synfig::Color &color, float amount) { 
color.set_r(amount); }
@@ -191,7 +192,8 @@ ColorSlider::redraw(GdkEventExpose */*bleh*/)
 
        get_style()->paint_arrow(
                get_window(),
-               Gtk::STATE_SELECTED,
+               
(orig_color.get_y()<ARROW_NEGATIVE_THRESHOLD)?Gtk::STATE_SELECTED:Gtk::STATE_ACTIVE,
+               //use light arrow on dark color, and dark arrow on light color 
, TODO: detect from style which is darkest from SELECTED or ACTIVE
                Gtk::SHADOW_OUT,
                ca,
                *this,
diff --git a/synfig-studio/src/gui/widgets/widget_coloredit.h 
b/synfig-studio/src/gui/widgets/widget_coloredit.h
index bb9c71d..7152b6d 100644
--- a/synfig-studio/src/gui/widgets/widget_coloredit.h
+++ b/synfig-studio/src/gui/widgets/widget_coloredit.h
@@ -71,7 +71,7 @@ private:
        sigc::signal<void> signal_activated_;
 
        Type type;
-       synfig::Color color_;
+       synfig::Color color_, orig_color;
 
 public:
 
diff --git a/synfig-studio/src/gui/widgets/widget_gradient.cpp 
b/synfig-studio/src/gui/widgets/widget_gradient.cpp
index ccbc94e..a3a5ad1 100644
--- a/synfig-studio/src/gui/widgets/widget_gradient.cpp
+++ b/synfig-studio/src/gui/widgets/widget_gradient.cpp
@@ -49,6 +49,8 @@ using namespace studio;
 
 /* === M A C R O S ========================================================= */
 
+#define ARROW_NEGATIVE_THRESHOLD 0.4
+
 /* === G L O B A L S ======================================================= */
 
 /* === P R O C E D U R E S ================================================= */
@@ -135,11 +137,9 @@ Widget_Gradient::redraw(GdkEventExpose */*bleh*/)
                return true;
        }
 
-       
render_gradient_to_window(get_window(),Gdk::Rectangle(0,0,w,h-CONTROL_HEIGHT),gradient_);
+       
render_gradient_to_window(get_window(),Gdk::Rectangle(0,0,w,h),gradient_);
 
        gc->set_rgb_fg_color(Gdk::Color("#7f7f7f"));
-       get_window()->draw_rectangle(gc, false, 0, h-CONTROL_HEIGHT, w, 
CONTROL_HEIGHT);
-
        Gradient::iterator iter,selected_iter;
        bool show_selected(false);
        for(iter=gradient_.begin();iter!=gradient_.end();iter++)
@@ -147,7 +147,7 @@ Widget_Gradient::redraw(GdkEventExpose */*bleh*/)
                if(*iter!=selected_cpoint)
                get_style()->paint_arrow(
                        get_window(),
-                       
(*iter==selected_cpoint)?Gtk::STATE_SELECTED:Gtk::STATE_ACTIVE,
+                 
(iter->color.get_y()<ARROW_NEGATIVE_THRESHOLD)?Gtk::STATE_SELECTED:Gtk::STATE_ACTIVE,
 //use light arrow on dark color, and dark arrow on light color , todo detect 
from style which is darkest from SELECTED or ACTIVE, here SELECTED is lighter.
                        Gtk::SHADOW_OUT,
                        area,
                        *this,
@@ -168,11 +168,14 @@ Widget_Gradient::redraw(GdkEventExpose */*bleh*/)
 
        // we do this so that we can be sure that
        // the selected marker is shown on top
+  // show 2 arrows for selected, to compensate for lack of contrast in some 
color schemes, such as ubuntu default theme
+  // Gtk::STATE_SELECTED was used, but resulted in a barely visible arrow in 
some color scheme, hence double arrow with contrasting color
+
        if(show_selected)
        {
                get_style()->paint_arrow(
                        get_window(),
-                       Gtk::STATE_SELECTED,
+                       
(selected_iter->color.get_y()<ARROW_NEGATIVE_THRESHOLD)?Gtk::STATE_SELECTED:Gtk::STATE_ACTIVE,
 //use light arrow on dark color, and dark arrow on light color , todo detect 
from style which is darkest from SELECTED or ACTIVE
                        Gtk::SHADOW_OUT,
                        area,
                        *this,
@@ -183,6 +186,20 @@ Widget_Gradient::redraw(GdkEventExpose */*bleh*/)
                        h-CONTROL_HEIGHT,
                        CONTROL_HEIGHT,
                        CONTROL_HEIGHT
+               ); // paint_arrow(window, state_type, shadow_type, area, 
widget, detail, arrow_type, fill, x, y, width, height)
+               get_style()->paint_arrow(
+                       get_window(),
+                                               
(selected_iter->color.get_y()<ARROW_NEGATIVE_THRESHOLD)?Gtk::STATE_SELECTED:Gtk::STATE_ACTIVE,
 //use light arrow on dark color, and dark arrow on light color , todo detect 
from style which is darkest from SELECTED or ACTIVE
+                       Gtk::SHADOW_OUT,
+                       area,
+                       *this,
+                       " ",
+                       Gtk::ARROW_UP,
+                       1,
+                       round_to_int(selected_iter->pos*w)-CONTROL_HEIGHT/2+1,
+                       h-CONTROL_HEIGHT*1.3,
+                       CONTROL_HEIGHT,
+                       CONTROL_HEIGHT
                );
        }
 


------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to