[Summary] Fixing behavior of the FloatingTextEntry

This commit is contained in:
VKamyshniy 2014-11-25 00:28:33 +02:00 committed by Paul Davis
parent 76334847c5
commit c14c365419
2 changed files with 64 additions and 52 deletions

View file

@ -18,6 +18,8 @@
*/ */
#include "pbd/stacktrace.h" #include "pbd/stacktrace.h"
#include "public_editor.h"
#include "floating_text_entry.h" #include "floating_text_entry.h"
#include "gtkmm2ext/doi.h" #include "gtkmm2ext/doi.h"
@ -26,95 +28,106 @@
#include "i18n.h" #include "i18n.h"
FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents) FloatingTextEntry::FloatingTextEntry (const std::string& initial_contents)
: ArdourWindow ("") : Gtk::Window (Gtk::WINDOW_POPUP)
, entry_changed (false) , entry_changed (false)
{ {
set_name (X_("FloatingTextEntry")); set_name (X_("FloatingTextEntry"));
set_position (Gtk::WIN_POS_MOUSE); set_position (Gtk::WIN_POS_MOUSE);
set_border_width (0); set_border_width (0);
if (!initial_contents.empty()) { if (!initial_contents.empty()) {
entry.set_text (initial_contents); entry.set_text (initial_contents);
} }
entry.show (); entry.show ();
entry.signal_changed().connect (sigc::mem_fun (*this, &FloatingTextEntry::changed)); entry.signal_changed().connect (sigc::mem_fun (*this, &FloatingTextEntry::changed));
entry.signal_activate().connect (sigc::mem_fun (*this, &FloatingTextEntry::activated)); 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));
entry.signal_button_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::button_press)); entry.signal_button_press_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::button_press));
PublicEditor::instance ().signal_focus_out_event().connect (sigc::mem_fun (*this, &FloatingTextEntry::entry_focus_out));
add (entry); add (entry);
} }
void void
FloatingTextEntry::changed () FloatingTextEntry::changed ()
{ {
entry_changed = true; entry_changed = true;
} }
void void
FloatingTextEntry::on_realize () FloatingTextEntry::on_realize ()
{ {
ArdourWindow::on_realize (); Gtk::Window::on_realize ();
get_window()->set_decorations (Gdk::WMDecoration (0)); get_window()->set_decorations (Gdk::WMDecoration (0));
entry.add_modal_grab (); entry.add_modal_grab ();
}
bool
FloatingTextEntry::entry_focus_out (GdkEventFocus* ev)
{
entry.remove_modal_grab ();
if (entry_changed) {
use_text (entry.get_text ());
}
delete_when_idle ( this);
return false;
} }
bool bool
FloatingTextEntry::button_press (GdkEventButton* ev) FloatingTextEntry::button_press (GdkEventButton* ev)
{ {
if (Gtkmm2ext::event_inside_widget_window (*this, (GdkEvent*) ev)) { if (Gtkmm2ext::event_inside_widget_window (*this, (GdkEvent*) ev)) {
return true; return true;
} }
/* Clicked outside widget window - edit is done */ /* Clicked outside widget window - edit is done */
entry.remove_modal_grab ();
entry.remove_modal_grab (); /* arrange re-propagation of the event once we go idle */
Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::ptr_fun (gtk_main_do_event), gdk_event_copy ((GdkEvent*) ev)), false));
/* arrange re-propagation of the event once we go idle */ if (entry_changed) {
use_text (entry.get_text ());
}
Glib::signal_idle().connect (sigc::bind_return (sigc::bind (sigc::ptr_fun (gtk_main_do_event), gdk_event_copy ((GdkEvent*) ev)), false)); delete_when_idle ( this);
if (entry_changed) { return false;
use_text (entry.get_text ());
}
delete_when_idle ( this);
return false;
} }
void void
FloatingTextEntry::activated () FloatingTextEntry::activated ()
{ {
use_text (entry.get_text()); // EMIT SIGNAL use_text (entry.get_text()); // EMIT SIGNAL
delete_when_idle (this); delete_when_idle (this);
} }
bool bool
FloatingTextEntry::key_press (GdkEventKey* ev) FloatingTextEntry::key_press (GdkEventKey* ev)
{ {
switch (ev->keyval) { switch (ev->keyval) {
case GDK_Escape: case GDK_Escape:
delete_when_idle (this); delete_when_idle (this);
return true; return true;
break; break;
default: default:
break; break;
} }
return false; return false;
} }
void void
FloatingTextEntry::on_hide () FloatingTextEntry::on_hide ()
{ {
entry.remove_modal_grab (); entry.remove_modal_grab ();
/* No hide button is shown (no decoration on the window), /* No hide button is shown (no decoration on the window),
so being hidden is equivalent to the Escape key or any other so being hidden is equivalent to the Escape key or any other
method of cancelling the edit. method of cancelling the edit.
*/ */
delete_when_idle (this); delete_when_idle (this);
ArdourWindow::on_hide (); Gtk::Window::on_hide ();
} }

View file

@ -21,10 +21,9 @@
#define __floating_text_entry_h__ #define __floating_text_entry_h__
#include <gtkmm/entry.h> #include <gtkmm/entry.h>
#include <gtkmm/Window.h>
#include "ardour_window.h" class FloatingTextEntry : public Gtk::Window
class FloatingTextEntry : public ArdourWindow
{ {
public: public:
FloatingTextEntry (const std::string& initial_contents); FloatingTextEntry (const std::string& initial_contents);
@ -36,7 +35,7 @@ class FloatingTextEntry : public ArdourWindow
bool entry_changed; bool entry_changed;
/* handlers for Entry events */ /* handlers for Entry events */
bool entry_focus_out (GdkEventFocus*);
bool key_press (GdkEventKey*); bool key_press (GdkEventKey*);
void activated (); void activated ();
bool button_press (GdkEventButton*); bool button_press (GdkEventButton*);