X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fgtkmm2ext%2Fpersistent_tooltip.cc;h=d45ef01408d2be966983920f461521b70ee0be02;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=77a8d94c0fea78d30c87db9acf5413a17320a812;hpb=650964f3203319b013c49a286b5fc5fc203f3bbb;p=ardour.git diff --git a/libs/gtkmm2ext/persistent_tooltip.cc b/libs/gtkmm2ext/persistent_tooltip.cc index 77a8d94c0f..d45ef01408 100644 --- a/libs/gtkmm2ext/persistent_tooltip.cc +++ b/libs/gtkmm2ext/persistent_tooltip.cc @@ -19,25 +19,35 @@ #include #include +#include #include "gtkmm2ext/persistent_tooltip.h" -#include "i18n.h" +#include "pbd/stacktrace.h" + +#include "pbd/i18n.h" using namespace std; using namespace Gtk; using namespace Gtkmm2ext; +bool PersistentTooltip::_tooltips_enabled = true; +unsigned int PersistentTooltip::_tooltip_timeout = 500; + /** @param target The widget to provide the tooltip for */ -PersistentTooltip::PersistentTooltip (Gtk::Widget* target) +PersistentTooltip::PersistentTooltip (Gtk::Widget* target, bool draggable, int margin_y) : _target (target) , _window (0) , _label (0) + , _draggable (draggable) , _maybe_dragging (false) + , _align_to_center (true) + , _margin_y (margin_y) { target->signal_enter_notify_event().connect (sigc::mem_fun (*this, &PersistentTooltip::enter), false); target->signal_leave_notify_event().connect (sigc::mem_fun (*this, &PersistentTooltip::leave), false); target->signal_button_press_event().connect (sigc::mem_fun (*this, &PersistentTooltip::press), false); target->signal_button_release_event().connect (sigc::mem_fun (*this, &PersistentTooltip::release), false); + _tooltip_timeout = Gtk::Settings::get_default()->property_gtk_tooltip_timeout (); } PersistentTooltip::~PersistentTooltip () @@ -51,7 +61,7 @@ PersistentTooltip::enter (GdkEventCrossing *) if (_timeout.connected()) { leave(NULL); } - _timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), 500); + _timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &PersistentTooltip::timeout), _tooltip_timeout); return false; } @@ -96,7 +106,7 @@ PersistentTooltip::release (GdkEventButton* ev) bool PersistentTooltip::dragging () const { - return _maybe_dragging; + return _maybe_dragging && _draggable; } void @@ -110,6 +120,10 @@ PersistentTooltip::hide () void PersistentTooltip::show () { + if (_tip.empty() || !_tooltips_enabled) { + return; + } + if (!_window) { _window = new Window (WINDOW_POPUP); _window->set_name (X_("ContrastingPopup")); @@ -117,6 +131,7 @@ PersistentTooltip::show () _window->set_decorated (false); _label = manage (new Label); + _label->modify_font (_font); _label->set_use_markup (true); _window->set_border_width (6); @@ -128,23 +143,36 @@ PersistentTooltip::show () _window->set_transient_for (*tlw); } } - + set_tip (_tip); if (!_window->is_visible ()) { - int rx, ry, sw; - sw= gdk_screen_width(); + int rx, ry; + int sw = gdk_screen_width (); + _target->get_window()->get_origin (rx, ry); - _window->move (rx, ry + _target->get_height()); - _window->present (); /* the window needs to be realized first * for _window->get_width() to be correct. */ + + if (sw < rx + _window->get_width()) { + /* right edge of window would be off the right edge of + the screen, so don't show it in the usual place. + */ rx = sw - _window->get_width(); - _window->move (rx, ry + _target->get_height()); + _window->move (rx, ry + _target->get_height() + _margin_y); + } else { + if (_align_to_center) { + _window->move (rx + (_target->get_width () - _window->get_width ()) / 2, ry + _target->get_height()); + } else { + _window->move (rx, ry + _target->get_height()); + } } + + _window->present (); + } } @@ -157,3 +185,19 @@ PersistentTooltip::set_tip (string t) _label->set_markup (t); } } + +void +PersistentTooltip::set_font (Pango::FontDescription font) +{ + _font = font; + + if (_label) { + _label->modify_font (_font); + } +} + +void +PersistentTooltip::set_center_alignment (bool align_to_center) +{ + _align_to_center = align_to_center; +}