summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/mono_panner.cc19
-rw-r--r--gtk2_ardour/mono_panner.h4
-rw-r--r--gtk2_ardour/panner_interface.cc90
-rw-r--r--gtk2_ardour/panner_interface.h27
-rw-r--r--gtk2_ardour/processor_box.cc13
-rw-r--r--gtk2_ardour/processor_box.h2
-rw-r--r--gtk2_ardour/stereo_panner.cc18
-rw-r--r--gtk2_ardour/stereo_panner.h4
8 files changed, 81 insertions, 96 deletions
diff --git a/gtk2_ardour/mono_panner.cc b/gtk2_ardour/mono_panner.cc
index 8b28d7f1a4..7dd16d4853 100644
--- a/gtk2_ardour/mono_panner.cc
+++ b/gtk2_ardour/mono_panner.cc
@@ -31,6 +31,7 @@
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/keyboard.h"
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/persistent_tooltip.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
@@ -64,6 +65,7 @@ MonoPanner::MonoPanner (boost::shared_ptr<ARDOUR::Panner> panner)
, accumulated_delta (0)
, detented (false)
, position_binder (position_control)
+ , _dragging (false)
{
if (!have_colors) {
set_colors ();
@@ -73,6 +75,8 @@ MonoPanner::MonoPanner (boost::shared_ptr<ARDOUR::Panner> panner)
position_control->Changed.connect (connections, invalidator(*this), boost::bind (&MonoPanner::value_change, this), gui_context());
ColorsChanged.connect (sigc::mem_fun (*this, &MonoPanner::color_handler));
+
+ set_tooltip ();
}
MonoPanner::~MonoPanner ()
@@ -81,12 +85,8 @@ MonoPanner::~MonoPanner ()
}
void
-MonoPanner::set_drag_data ()
+MonoPanner::set_tooltip ()
{
- if (!_drag_data_label) {
- return;
- }
-
double pos = position_control->get_value(); // 0..1
/* We show the position of the center of the image relative to the left & right.
@@ -101,7 +101,7 @@ MonoPanner::set_drag_data ()
snprintf (buf, sizeof (buf), "L:%3d R:%3d",
(int) rint (100.0 * (1.0 - pos)),
(int) rint (100.0 * pos));
- _drag_data_label->set_markup (buf);
+ _tooltip.set_tip (buf);
}
bool
@@ -255,6 +255,7 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
last_drag_x = ev->x;
_dragging = false;
+ _tooltip.target_stop_drag ();
accumulated_delta = 0;
detented = false;
@@ -290,6 +291,7 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
}
_dragging = false;
+ _tooltip.target_stop_drag ();
} else if (ev->type == GDK_BUTTON_PRESS) {
@@ -299,8 +301,8 @@ MonoPanner::on_button_press_event (GdkEventButton* ev)
}
_dragging = true;
+ _tooltip.target_start_drag ();
StartGesture ();
- show_drag_data_window ();
}
return true;
@@ -318,11 +320,10 @@ MonoPanner::on_button_release_event (GdkEventButton* ev)
}
_dragging = false;
+ _tooltip.target_stop_drag ();
accumulated_delta = 0;
detented = false;
- hide_drag_data_window ();
-
if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
_panner->reset ();
} else {
diff --git a/gtk2_ardour/mono_panner.h b/gtk2_ardour/mono_panner.h
index 3b7a37c993..1c387ad32c 100644
--- a/gtk2_ardour/mono_panner.h
+++ b/gtk2_ardour/mono_panner.h
@@ -63,7 +63,7 @@ class MonoPanner : public PannerInterface
BindingProxy position_binder;
- void set_drag_data ();
+ void set_tooltip ();
struct ColorScheme {
uint32_t outline;
@@ -74,6 +74,8 @@ class MonoPanner : public PannerInterface
uint32_t pos_fill;
};
+ bool _dragging;
+
static ColorScheme colors;
static void set_colors ();
static bool have_colors;
diff --git a/gtk2_ardour/panner_interface.cc b/gtk2_ardour/panner_interface.cc
index 09155c6b79..09cf29dfd6 100644
--- a/gtk2_ardour/panner_interface.cc
+++ b/gtk2_ardour/panner_interface.cc
@@ -19,6 +19,7 @@
#include <gtkmm.h>
#include "gtkmm2ext/keyboard.h"
+#include "gtkmm2ext/persistent_tooltip.h"
#include "panner_interface.h"
#include "panner_editor.h"
#include "global_signals.h"
@@ -32,9 +33,7 @@ using namespace Gtkmm2ext;
PannerInterface::PannerInterface (boost::shared_ptr<Panner> p)
: _panner (p)
- , _drag_data_window (0)
- , _drag_data_label (0)
- , _dragging (false)
+ , _tooltip (this)
, _editor (0)
{
set_flags (Gtk::CAN_FOCUS);
@@ -49,66 +48,14 @@ PannerInterface::PannerInterface (boost::shared_ptr<Panner> p)
PannerInterface::~PannerInterface ()
{
- delete _drag_data_window;
delete _editor;
}
-void
-PannerInterface::show_drag_data_window ()
-{
- if (!_drag_data_window) {
- _drag_data_window = new Window (WINDOW_POPUP);
- _drag_data_window->set_name (X_("ContrastingPopup"));
- _drag_data_window->set_position (WIN_POS_MOUSE);
- _drag_data_window->set_decorated (false);
-
- _drag_data_label = manage (new Label);
- _drag_data_label->set_use_markup (true);
-
- _drag_data_window->set_border_width (6);
- _drag_data_window->add (*_drag_data_label);
- _drag_data_label->show ();
-
- Window* toplevel = dynamic_cast<Window*> (get_toplevel());
- if (toplevel) {
- _drag_data_window->set_transient_for (*toplevel);
- }
- }
-
- set_drag_data ();
-
- if (!_drag_data_window->is_visible ()) {
- /* move the window a little away from the mouse */
- int rx, ry;
- get_window()->get_origin (rx, ry);
- _drag_data_window->move (rx, ry + get_height());
- _drag_data_window->present ();
- }
-}
-
-void
-PannerInterface::hide_drag_data_window ()
-{
- if (_drag_data_window) {
- _drag_data_window->hide ();
- }
-}
-
bool
PannerInterface::on_enter_notify_event (GdkEventCrossing *)
{
grab_focus ();
Keyboard::magic_widget_grab_focus ();
-
- _drag_data_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PannerInterface::drag_data_timeout), 500);
-
- return false;
-}
-
-bool
-PannerInterface::drag_data_timeout ()
-{
- show_drag_data_window ();
return false;
}
@@ -116,12 +63,6 @@ bool
PannerInterface::on_leave_notify_event (GdkEventCrossing *)
{
Keyboard::magic_widget_drop_focus ();
-
- _drag_data_timeout.disconnect ();
- if (!_dragging) {
- hide_drag_data_window ();
- }
-
return false;
}
@@ -134,7 +75,7 @@ PannerInterface::on_key_release_event (GdkEventKey*)
void
PannerInterface::value_change ()
{
- set_drag_data ();
+ set_tooltip ();
queue_draw ();
}
@@ -167,3 +108,28 @@ PannerInterface::edit ()
_editor = editor ();
_editor->show ();
}
+
+PannerPersistentTooltip::PannerPersistentTooltip (Gtk::Widget* w)
+ : PersistentTooltip (w)
+ , _dragging (false)
+{
+
+}
+
+void
+PannerPersistentTooltip::target_start_drag ()
+{
+ _dragging = true;
+}
+
+void
+PannerPersistentTooltip::target_stop_drag ()
+{
+ _dragging = false;
+}
+
+bool
+PannerPersistentTooltip::dragging () const
+{
+ return _dragging;
+}
diff --git a/gtk2_ardour/panner_interface.h b/gtk2_ardour/panner_interface.h
index 8dd19d1a14..02f4e210bd 100644
--- a/gtk2_ardour/panner_interface.h
+++ b/gtk2_ardour/panner_interface.h
@@ -23,6 +23,7 @@
#include <boost/shared_ptr.hpp>
#include <gtkmm/drawingarea.h>
#include <gtkmm/label.h>
+#include "gtkmm2ext/persistent_tooltip.h"
#include "pbd/destructible.h"
namespace ARDOUR {
@@ -31,6 +32,21 @@ namespace ARDOUR {
class PannerEditor;
+class PannerPersistentTooltip : public Gtkmm2ext::PersistentTooltip
+{
+public:
+ PannerPersistentTooltip (Gtk::Widget* w);
+
+ void target_start_drag ();
+ void target_stop_drag ();
+
+ bool dragging () const;
+
+private:
+ bool _dragging;
+};
+
+
/** Parent class for some panner UI classes that contains some common code */
class PannerInterface : public Gtk::DrawingArea, public PBD::Destructible
{
@@ -45,10 +61,8 @@ public:
void edit ();
protected:
- virtual void set_drag_data () = 0;
+ virtual void set_tooltip () = 0;
- void show_drag_data_window ();
- void hide_drag_data_window ();
void value_change ();
bool on_enter_notify_event (GdkEventCrossing *);
@@ -58,14 +72,9 @@ protected:
bool on_button_release_event (GdkEventButton*);
boost::shared_ptr<ARDOUR::Panner> _panner;
- Gtk::Window* _drag_data_window;
- Gtk::Label* _drag_data_label;
- bool _dragging;
+ PannerPersistentTooltip _tooltip;
private:
- bool drag_data_timeout ();
- sigc::connection _drag_data_timeout;
-
virtual PannerEditor* editor () = 0;
PannerEditor* _editor;
};
diff --git a/gtk2_ardour/processor_box.cc b/gtk2_ardour/processor_box.cc
index 525aca33e9..ac35204fb7 100644
--- a/gtk2_ardour/processor_box.cc
+++ b/gtk2_ardour/processor_box.cc
@@ -411,6 +411,7 @@ ProcessorEntry::Control::Control (Glib::RefPtr<Gdk::Pixbuf> s, Glib::RefPtr<Gdk:
: _control (c)
, _adjustment (gain_to_slider_position_with_max (1.0, Config->get_max_gain()), 0, 1, 0.01, 0.1)
, _slider (s, sd, &_adjustment, 0, false)
+ , _slider_persistant_tooltip (&_slider)
, _button (ArdourButton::Element (ArdourButton::Text | ArdourButton::Indicator))
, _ignore_ui_adjustment (false)
, _visible (false)
@@ -454,6 +455,9 @@ ProcessorEntry::Control::Control (Glib::RefPtr<Gdk::Pixbuf> s, Glib::RefPtr<Gdk:
control_changed ();
set_tooltip ();
+
+ /* We're providing our own PersistentTooltip */
+ set_no_tooltip_whatsoever (_slider);
}
void
@@ -470,11 +474,13 @@ ProcessorEntry::Control::set_tooltip ()
if (c->toggled ()) {
s << (c->get_value() > 0.5 ? _("on") : _("off"));
} else {
- s << c->internal_to_interface (c->get_value ());
+ s << setprecision(2) << fixed;
+ s << c->internal_to_user (c->get_value ());
}
ARDOUR_UI::instance()->set_tip (_label, s.str ());
- ARDOUR_UI::instance()->set_tip (_slider, s.str ());
+ _slider_persistant_tooltip.set_tip (s.str ());
+// ARDOUR_UI::instance()->set_tip (_slider, " ");
ARDOUR_UI::instance()->set_tip (_button, s.str ());
}
@@ -498,6 +504,7 @@ ProcessorEntry::Control::slider_adjusted ()
}
c->set_value (c->interface_to_internal (_adjustment.get_value ()));
+ set_tooltip ();
}
void
@@ -537,8 +544,6 @@ ProcessorEntry::Control::control_changed ()
s.precision (1);
s.setf (ios::fixed, ios::floatfield);
s << c->internal_to_user (c->get_value ());
-
- _slider.set_tooltip_text (s.str ());
}
_ignore_ui_adjustment = false;
diff --git a/gtk2_ardour/processor_box.h b/gtk2_ardour/processor_box.h
index 67a9e315d5..d300f70d5a 100644
--- a/gtk2_ardour/processor_box.h
+++ b/gtk2_ardour/processor_box.h
@@ -34,6 +34,7 @@
#include "gtkmm2ext/click_box.h"
#include "gtkmm2ext/dndvbox.h"
#include "gtkmm2ext/pixfader.h"
+#include "gtkmm2ext/persistent_tooltip.h"
#include "pbd/stateful.h"
#include "pbd/signals.h"
@@ -189,6 +190,7 @@ private:
Gtk::Adjustment _adjustment;
Gtkmm2ext::HSliderController _slider;
Gtk::Label _label;
+ Gtkmm2ext::PersistentTooltip _slider_persistant_tooltip;
/* things for a button */
ArdourButton _button;
bool _ignore_ui_adjustment;
diff --git a/gtk2_ardour/stereo_panner.cc b/gtk2_ardour/stereo_panner.cc
index 5ee75ecc19..ebb55e7c86 100644
--- a/gtk2_ardour/stereo_panner.cc
+++ b/gtk2_ardour/stereo_panner.cc
@@ -30,6 +30,7 @@
#include "gtkmm2ext/gtk_ui.h"
#include "gtkmm2ext/keyboard.h"
#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/persistent_tooltip.h"
#include "ardour/pannable.h"
#include "ardour/panner.h"
@@ -70,6 +71,7 @@ StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner)
, detented (false)
, position_binder (position_control)
, width_binder (width_control)
+ , _dragging (false)
{
if (!have_colors) {
set_colors ();
@@ -80,6 +82,8 @@ StereoPanner::StereoPanner (boost::shared_ptr<Panner> panner)
width_control->Changed.connect (connections, invalidator(*this), boost::bind (&StereoPanner::value_change, this), gui_context());
ColorsChanged.connect (sigc::mem_fun (*this, &StereoPanner::color_handler));
+
+ set_tooltip ();
}
StereoPanner::~StereoPanner ()
@@ -88,12 +92,8 @@ StereoPanner::~StereoPanner ()
}
void
-StereoPanner::set_drag_data ()
+StereoPanner::set_tooltip ()
{
- if (!_drag_data_label) {
- return;
- }
-
double pos = position_control->get_value(); // 0..1
/* We show the position of the center of the image relative to the left & right.
@@ -108,7 +108,7 @@ StereoPanner::set_drag_data ()
snprintf (buf, sizeof (buf), "L:%3d R:%3d Width:%d%%", (int) rint (100.0 * (1.0 - pos)),
(int) rint (100.0 * pos),
(int) floor (100.0 * width_control->get_value()));
- _drag_data_label->set_markup (buf);
+ _tooltip.set_tip (buf);
}
bool
@@ -360,8 +360,6 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
return true;
}
- show_drag_data_window ();
-
if (ev->y < 20) {
/* top section of widget is for position drags */
dragging_position = true;
@@ -395,6 +393,7 @@ StereoPanner::on_button_press_event (GdkEventButton* ev)
}
_dragging = true;
+ _tooltip.target_start_drag ();
}
return true;
@@ -414,14 +413,13 @@ StereoPanner::on_button_release_event (GdkEventButton* ev)
bool const dp = dragging_position;
_dragging = false;
+ _tooltip.target_stop_drag ();
dragging_position = false;
dragging_left = false;
dragging_right = false;
accumulated_delta = 0;
detented = false;
- hide_drag_data_window ();
-
if (Keyboard::modifier_state_contains (ev->state, Keyboard::TertiaryModifier)) {
_panner->reset ();
} else {
diff --git a/gtk2_ardour/stereo_panner.h b/gtk2_ardour/stereo_panner.h
index 19fa0c056e..8b62b7d82a 100644
--- a/gtk2_ardour/stereo_panner.h
+++ b/gtk2_ardour/stereo_panner.h
@@ -72,7 +72,7 @@ class StereoPanner : public PannerInterface
BindingProxy position_binder;
BindingProxy width_binder;
- void set_drag_data ();
+ void set_tooltip ();
struct ColorScheme {
uint32_t outline;
@@ -88,6 +88,8 @@ class StereoPanner : public PannerInterface
Inverted
};
+ bool _dragging;
+
static ColorScheme colors[3];
static void set_colors ();
static bool have_colors;