summaryrefslogtreecommitdiff
path: root/gtk2_ardour/floating_text_entry.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-05-21 19:17:11 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-31 15:30:44 -0400
commit428ed8ae1b9df42b91d932242ed51d30d0255c03 (patch)
treef96502be2cd2c6ca7ed0d0963935cbe90699b569 /gtk2_ardour/floating_text_entry.cc
parent30d0b2a3546e50d359e712f239a16e08f37d38c7 (diff)
stop playing silly games with widget packing when editing a route name in the edito
Use a FloatingTextEntry instead. All clever functionality from previous implementation has been retained.
Diffstat (limited to 'gtk2_ardour/floating_text_entry.cc')
-rw-r--r--gtk2_ardour/floating_text_entry.cc57
1 files changed, 52 insertions, 5 deletions
diff --git a/gtk2_ardour/floating_text_entry.cc b/gtk2_ardour/floating_text_entry.cc
index 60f10e571b..955de8d2b1 100644
--- a/gtk2_ardour/floating_text_entry.cc
+++ b/gtk2_ardour/floating_text_entry.cc
@@ -30,6 +30,7 @@
FloatingTextEntry::FloatingTextEntry (Gtk::Window* parent, const std::string& initial_contents)
: Gtk::Window (Gtk::WINDOW_POPUP)
, entry_changed (false)
+ , by_popup_menu (false)
{
set_name (X_("FloatingTextEntry"));
set_position (Gtk::WIN_POS_MOUSE);
@@ -42,8 +43,13 @@ FloatingTextEntry::FloatingTextEntry (Gtk::Window* parent, const std::string& in
entry.show ();
entry.signal_changed().connect (sigc::mem_fun (*this, &FloatingTextEntry::changed));
entry.signal_activate().connect (sigc::mem_fun (*this, &FloatingTextEntry::activated));
- entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press));
+ entry.signal_key_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_press), false);
+ entry.signal_key_release_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::key_release), false);
entry.signal_button_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::button_press));
+ entry.signal_populate_popup().connect (sigc::mem_fun (*this, &FloatingTextEntry::populate_popup));
+
+ entry.select_region (0, -1);
+ entry.set_state (Gtk::STATE_SELECTED);
if (parent) {
parent->signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
@@ -53,6 +59,12 @@ FloatingTextEntry::FloatingTextEntry (Gtk::Window* parent, const std::string& in
}
void
+FloatingTextEntry::populate_popup (Gtk::Menu *)
+{
+ by_popup_menu = true;
+}
+
+void
FloatingTextEntry::changed ()
{
entry_changed = true;
@@ -69,9 +81,14 @@ FloatingTextEntry::on_realize ()
bool
FloatingTextEntry::entry_focus_out (GdkEventFocus* ev)
{
+ if (by_popup_menu) {
+ by_popup_menu = false;
+ return false;
+ }
+
entry.remove_modal_grab ();
if (entry_changed) {
- use_text (entry.get_text ());
+ use_text (entry.get_text (), 0);
}
delete_when_idle ( this);
@@ -92,7 +109,7 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::ptr_fun (gtk_main_do_event), gdk_event_copy ((GdkEvent*) ev)), false));
if (entry_changed) {
- use_text (entry.get_text ());
+ use_text (entry.get_text (), 0);
}
delete_when_idle ( this);
@@ -103,24 +120,54 @@ FloatingTextEntry::button_press (GdkEventButton* ev)
void
FloatingTextEntry::activated ()
{
- use_text (entry.get_text()); // EMIT SIGNAL
+ use_text (entry.get_text(), 0); // EMIT SIGNAL
delete_when_idle (this);
}
bool
FloatingTextEntry::key_press (GdkEventKey* ev)
{
+ /* steal escape, tabs from GTK */
+
+ switch (ev->keyval) {
+ case GDK_Escape:
+ case GDK_ISO_Left_Tab:
+ case GDK_Tab:
+ return true;
+ }
+ return false;
+}
+
+bool
+FloatingTextEntry::key_release (GdkEventKey* ev)
+{
switch (ev->keyval) {
case GDK_Escape:
+ /* cancel edit */
+ delete_when_idle (this);
+ return true;
+
+ case GDK_ISO_Left_Tab:
+ /* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
+ * generates a different ev->keyval, rather than setting
+ * ev->state.
+ */
+ use_text (entry.get_text(), -1); // EMIT SIGNAL, move to prev
+ delete_when_idle (this);
+ return true;
+
+ case GDK_Tab:
+ use_text (entry.get_text(), 1); // EMIT SIGNAL, move to next
delete_when_idle (this);
return true;
- break;
default:
break;
}
+
return false;
}
+
void
FloatingTextEntry::on_hide ()
{