add pixfader tweaks API:
* change API to hide unity/default value line * allow to override vertical scroll [1] * allow changing button event forwarding [2] [1] override scrolling in track-headers [2] dbl-click is needed for BarControllers -> switch to SpinBtn but a plain Slider on a track-header should not forward these events to the TAV (they may trigger name-edit)
This commit is contained in:
parent
4c12a01b62
commit
48a851011b
@ -49,7 +49,7 @@ BarController::BarController (Gtk::Adjustment& adj,
|
||||
set (.5, .5, 1.0, 1.0);
|
||||
set_border_width (0);
|
||||
_slider.set_controllable (mc);
|
||||
_slider.show_unity_line (false);
|
||||
_slider.set_tweaks (PixFader::NoShowUnityLine);
|
||||
|
||||
_slider.StartGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_start));
|
||||
_slider.StopGesture.connect (sigc::mem_fun(*this, &BarController::passtrhu_gesture_stop));
|
||||
|
@ -43,16 +43,17 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea
|
||||
|
||||
void set_default_value (float);
|
||||
void set_text (const std::string&, bool centered = true, bool expose = true);
|
||||
void show_unity_line (bool yn);
|
||||
|
||||
enum Tweaks {
|
||||
NoShowUnityLine = 0x1,
|
||||
NoButtonForward = 0x2,
|
||||
NoVerticalScroll = 0x4,
|
||||
};
|
||||
|
||||
Tweaks tweaks() const { return _tweaks; }
|
||||
void set_tweaks (Tweaks);
|
||||
|
||||
protected:
|
||||
Glib::RefPtr<Pango::Layout> _layout;
|
||||
std::string _text;
|
||||
int _text_width;
|
||||
int _text_height;
|
||||
|
||||
Gtk::Adjustment& adjustment;
|
||||
|
||||
void on_size_request (GtkRequisition*);
|
||||
void on_size_allocate (Gtk::Allocation& alloc);
|
||||
|
||||
@ -73,6 +74,14 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea
|
||||
};
|
||||
|
||||
private:
|
||||
|
||||
Glib::RefPtr<Pango::Layout> _layout;
|
||||
std::string _text;
|
||||
Tweaks _tweaks;
|
||||
Gtk::Adjustment& _adjustment;
|
||||
int _text_width;
|
||||
int _text_height;
|
||||
|
||||
int _span, _girth;
|
||||
int _min_span, _min_girth;
|
||||
int _orien;
|
||||
@ -86,7 +95,6 @@ class LIBGTKMM2EXT_API PixFader : public Gtk::DrawingArea
|
||||
float _default_value;
|
||||
int _unity_loc;
|
||||
bool _centered_text;
|
||||
bool _display_unity_line;
|
||||
|
||||
sigc::connection _parent_style_change;
|
||||
Widget * _current_parent;
|
||||
|
@ -41,7 +41,11 @@ using namespace std;
|
||||
std::list<PixFader::FaderImage*> PixFader::_patterns;
|
||||
|
||||
PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int fader_girth)
|
||||
: adjustment (adj)
|
||||
: _layout (0)
|
||||
, _tweaks (Tweaks(0))
|
||||
, _adjustment (adj)
|
||||
, _text_width (0)
|
||||
, _text_height (0)
|
||||
, _span (fader_length)
|
||||
, _girth (fader_girth)
|
||||
, _min_span (fader_length)
|
||||
@ -52,10 +56,9 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
|
||||
, _last_drawn (-1)
|
||||
, _dragging (false)
|
||||
, _centered_text (true)
|
||||
, _display_unity_line (true)
|
||||
, _current_parent (0)
|
||||
{
|
||||
_default_value = adjustment.get_value();
|
||||
_default_value = _adjustment.get_value();
|
||||
update_unity_position ();
|
||||
|
||||
add_events (
|
||||
@ -67,8 +70,8 @@ PixFader::PixFader (Gtk::Adjustment& adj, int orientation, int fader_length, int
|
||||
| Gdk::LEAVE_NOTIFY_MASK
|
||||
);
|
||||
|
||||
adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
|
||||
adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
|
||||
_adjustment.signal_value_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
|
||||
_adjustment.signal_changed().connect (mem_fun (*this, &PixFader::adjustment_changed));
|
||||
|
||||
if (_orien == VERT) {
|
||||
DrawingArea::set_size_request(_girth, _span);
|
||||
@ -290,7 +293,7 @@ PixFader::on_expose_event (GdkEventExpose* ev)
|
||||
}
|
||||
|
||||
/* draw the unity-position line if it's not at either end*/
|
||||
if (_display_unity_line && _unity_loc > CORNER_RADIUS) {
|
||||
if (!(_tweaks & NoShowUnityLine) && _unity_loc > CORNER_RADIUS) {
|
||||
context->set_line_width (1);
|
||||
context->set_line_cap (Cairo::LINE_CAP_ROUND);
|
||||
Gdk::Color c = get_style()->get_fg (Gtk::STATE_ACTIVE);
|
||||
@ -384,7 +387,7 @@ PixFader::on_button_press_event (GdkEventButton* ev)
|
||||
gdk_pointer_ungrab (GDK_CURRENT_TIME);
|
||||
StopGesture ();
|
||||
}
|
||||
return false;
|
||||
return (_tweaks & NoButtonForward) ? true : false;
|
||||
}
|
||||
|
||||
if (ev->button != 1 && ev->button != 2) {
|
||||
@ -405,7 +408,7 @@ PixFader::on_button_press_event (GdkEventButton* ev)
|
||||
set_adjustment_from_event (ev);
|
||||
}
|
||||
|
||||
return true;
|
||||
return (_tweaks & NoButtonForward) ? true : false;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -432,16 +435,16 @@ PixFader::on_button_release_event (GdkEventButton* ev)
|
||||
ev_pos = rint(ev_pos);
|
||||
|
||||
if (ev->state & Keyboard::TertiaryModifier) {
|
||||
adjustment.set_value (_default_value);
|
||||
_adjustment.set_value (_default_value);
|
||||
} else if (ev->state & Keyboard::GainFineScaleModifier) {
|
||||
adjustment.set_value (adjustment.get_lower());
|
||||
_adjustment.set_value (_adjustment.get_lower());
|
||||
} else if (ev_pos == slider_pos) {
|
||||
; // click on current position, no move.
|
||||
} else if ((_orien == VERT && ev_pos < slider_pos) || (_orien == HORIZ && ev_pos > slider_pos)) {
|
||||
/* above the current display height, remember X Window coords */
|
||||
adjustment.set_value (adjustment.get_value() + adjustment.get_step_increment());
|
||||
_adjustment.set_value (_adjustment.get_value() + _adjustment.get_step_increment());
|
||||
} else {
|
||||
adjustment.set_value (adjustment.get_value() - adjustment.get_step_increment());
|
||||
_adjustment.set_value (_adjustment.get_value() - _adjustment.get_step_increment());
|
||||
}
|
||||
}
|
||||
return true;
|
||||
@ -482,42 +485,37 @@ PixFader::on_scroll_event (GdkEventScroll* ev)
|
||||
}
|
||||
|
||||
if (_orien == VERT) {
|
||||
|
||||
/* should left/right scroll affect vertical faders ? */
|
||||
|
||||
switch (ev->direction) {
|
||||
|
||||
case GDK_SCROLL_UP:
|
||||
adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
case GDK_SCROLL_DOWN:
|
||||
adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
case GDK_SCROLL_UP:
|
||||
_adjustment.set_value (_adjustment.get_value() + (_adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
case GDK_SCROLL_DOWN:
|
||||
_adjustment.set_value (_adjustment.get_value() - (_adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
int dir = ev->direction;
|
||||
|
||||
/* up/down scrolls should definitely affect horizontal faders
|
||||
because they are so much easier to use
|
||||
*/
|
||||
if (ev->state & Keyboard::ScrollHorizontalModifier || !(_tweaks & NoVerticalScroll)) {
|
||||
if (ev->direction == GDK_SCROLL_UP) dir = GDK_SCROLL_RIGHT;
|
||||
if (ev->direction == GDK_SCROLL_DOWN) dir = GDK_SCROLL_LEFT;
|
||||
}
|
||||
|
||||
switch (ev->direction) {
|
||||
|
||||
case GDK_SCROLL_RIGHT:
|
||||
case GDK_SCROLL_UP:
|
||||
adjustment.set_value (adjustment.get_value() + (adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
case GDK_SCROLL_LEFT:
|
||||
case GDK_SCROLL_DOWN:
|
||||
adjustment.set_value (adjustment.get_value() - (adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
switch (dir) {
|
||||
case GDK_SCROLL_RIGHT:
|
||||
_adjustment.set_value (_adjustment.get_value() + (_adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
case GDK_SCROLL_LEFT:
|
||||
_adjustment.set_value (_adjustment.get_value() - (_adjustment.get_page_increment() * scale));
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -558,7 +556,7 @@ PixFader::on_motion_notify_event (GdkEventMotion* ev)
|
||||
fract = -fract;
|
||||
}
|
||||
|
||||
adjustment.set_value (adjustment.get_value() + scale * fract * (adjustment.get_upper() - adjustment.get_lower()));
|
||||
_adjustment.set_value (_adjustment.get_value() + scale * fract * (_adjustment.get_upper() - _adjustment.get_lower()));
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -576,7 +574,7 @@ PixFader::adjustment_changed ()
|
||||
int
|
||||
PixFader::display_span ()
|
||||
{
|
||||
float fract = (adjustment.get_value () - adjustment.get_lower()) / ((adjustment.get_upper() - adjustment.get_lower()));
|
||||
float fract = (_adjustment.get_value () - _adjustment.get_lower()) / ((_adjustment.get_upper() - _adjustment.get_lower()));
|
||||
int ds;
|
||||
if (_orien == VERT) {
|
||||
ds = (int)rint (_span * (1.0 - fract));
|
||||
@ -591,9 +589,9 @@ void
|
||||
PixFader::update_unity_position ()
|
||||
{
|
||||
if (_orien == VERT) {
|
||||
_unity_loc = (int) rint (_span * (1 - ((_default_value - adjustment.get_lower()) / (adjustment.get_upper() - adjustment.get_lower())))) - 1;
|
||||
_unity_loc = (int) rint (_span * (1 - ((_default_value - _adjustment.get_lower()) / (_adjustment.get_upper() - _adjustment.get_lower())))) - 1;
|
||||
} else {
|
||||
_unity_loc = (int) rint ((_default_value - adjustment.get_lower()) * _span / (adjustment.get_upper() - adjustment.get_lower()));
|
||||
_unity_loc = (int) rint ((_default_value - _adjustment.get_lower()) * _span / (_adjustment.get_upper() - _adjustment.get_lower()));
|
||||
}
|
||||
|
||||
queue_draw ();
|
||||
@ -627,7 +625,7 @@ PixFader::set_adjustment_from_event (GdkEventButton* ev)
|
||||
fract = min (1.0, fract);
|
||||
fract = max (0.0, fract);
|
||||
|
||||
adjustment.set_value (fract * (adjustment.get_upper () - adjustment.get_lower ()));
|
||||
_adjustment.set_value (fract * (_adjustment.get_upper () - _adjustment.get_lower ()));
|
||||
}
|
||||
|
||||
void
|
||||
@ -638,11 +636,16 @@ PixFader::set_default_value (float d)
|
||||
}
|
||||
|
||||
void
|
||||
PixFader::show_unity_line (bool yn )
|
||||
PixFader::set_tweaks (Tweaks t)
|
||||
{
|
||||
if (yn == _display_unity_line) return;
|
||||
_display_unity_line = yn;
|
||||
queue_draw();
|
||||
bool need_redraw = false;
|
||||
if ((_tweaks & NoShowUnityLine) ^ (t & NoShowUnityLine)) {
|
||||
need_redraw = true;
|
||||
}
|
||||
_tweaks = t;
|
||||
if (need_redraw) {
|
||||
queue_draw();
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
Loading…
Reference in New Issue
Block a user