class PixFader : public Gtk::DrawingArea
{
public:
- PixFader (Glib::RefPtr<Gdk::Pixbuf>, Glib::RefPtr<Gdk::Pixbuf>, Gtk::Adjustment& adjustment, int orientation, int);
+ PixFader (Gtk::Adjustment& adjustment, int orientation, int span, int girth);
virtual ~PixFader ();
- void set_fader_length (int);
- void set_border_colors (uint32_t rgba_left, uint32_t rgba_right);
-
void set_default_value (float);
-
void set_text (const std::string&);
protected:
bool on_scroll_event (GdkEventScroll* ev);
bool on_enter_notify_event (GdkEventCrossing* ev);
bool on_leave_notify_event (GdkEventCrossing* ev);
+ void on_state_changed (Gtk::StateType);
+ void on_style_changed (const Glib::RefPtr<Gtk::Style>&);
enum Orientation {
- VERT=1,
- HORIZ=2,
+ VERT,
+ HORIZ,
};
private:
-
- enum State {
- NORMAL,
- DESENSITISED,
- STATES
- };
-
-#if 0
- Cairo::RefPtr<Cairo::Context> belt_context[STATES];
- Cairo::RefPtr<Cairo::ImageSurface> belt_surface[STATES];
- Glib::RefPtr<Gdk::Pixbuf> pixbuf[STATES];
-#endif
-
int span, girth;
int _orien;
- float left_r;
- float left_g;
- float left_b;
- float right_r;
- float right_g;
- float right_b;
-
- GdkRectangle view;
+ cairo_pattern_t* pattern;
+
+ struct FaderImage {
+ cairo_pattern_t* pattern;
+ double fr;
+ double fg;
+ double fb;
+ double br;
+ double bg;
+ double bb;
+ int width;
+ int height;
+
+ FaderImage (cairo_pattern_t* p,
+ double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h)
+ : pattern (p)
+ , fr (afr)
+ , fg (afg)
+ , fb (afb)
+ , br (abr)
+ , bg (abg)
+ , bb (abb)
+ , width (w)
+ , height (h)
+ {}
+
+ bool matches (double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h) {
+ return width == w &&
+ height == h &&
+ afr == fr &&
+ afg == fg &&
+ afb == fb &&
+ abr == br &&
+ abg == bg &&
+ abb == bb;
+ }
+ };
- void create_patterns();
- cairo_pattern_t* pattern;
- cairo_pattern_t* shine_pattern;
+ static std::list<FaderImage*> _patterns;
+ static cairo_pattern_t* find_pattern (double afr, double afg, double afb,
+ double abr, double abg, double abb,
+ int w, int h);
bool _hovering;
int display_span ();
void set_adjustment_from_event (GdkEventButton *);
void update_unity_position ();
+ void create_patterns();
};