more substantive reworkings of TimeAxisView::name_(entry|label) and name editing. better, but i can still (somehow) trigger occasional misbehaviour

git-svn-id: svn://localhost/ardour2/branches/3.0@13840 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2013-01-14 21:46:32 +00:00
parent 2bc6b777c6
commit 00cba5aa3b
5 changed files with 166 additions and 155 deletions

View File

@ -1,7 +1,7 @@
#!/bin/sh
VALGRIND_OPTIONS="$VALGRIND_OPTIONS --num-callers=50"
VALGRIND_OPTIONS="$VALGRIND_OPTIONS --error-limit=no"
VALGRIND_OPTIONS="$VALGRIND_OPTIONS --leak-check=full --leak-resolution=high"
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --leak-check=full --leak-resolution=high"
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --log-file=/tmp/ardour-%p.log"
#VALGRIND_OPTIONS="$VALGRIND_OPTIONS --gen-suppressions=all"

View File

@ -153,11 +153,6 @@ AutomationTimeAxisView::AutomationTimeAxisView (
set_height (preset_height (HeightNormal));
}
/* for automation tracks, the label does not swap with an entry box. remove all that stuff */
if (name_label.get_parent()) {
hide_name_label ();
}
name_label.set_text (_name);
name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
name_label.set_name (X_("TrackParameterName"));
@ -175,6 +170,8 @@ AutomationTimeAxisView::AutomationTimeAxisView (
controls_table.attach (name_label, 0, 6, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
controls_table.attach (auto_button, 6, 8, 1, 2, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
name_label.show ();
if (_controller) {
_controller.get()->set_size_request(-1, 24);
/* add bar controller */
@ -422,15 +419,11 @@ AutomationTimeAxisView::set_height (uint32_t h)
first_call_to_set_height = false;
if (h >= preset_height (HeightNormal)) {
show_name_label ();
hide_name_entry ();
auto_button.show();
hide_button.show_all();
} else if (h >= preset_height (HeightSmall)) {
controls_table.hide_all ();
hide_name_entry ();
hide_name_label ();
auto_button.hide();
}
}

View File

@ -111,6 +111,8 @@ void
RouteTimeAxisView::set_route (boost::shared_ptr<Route> rt)
{
RouteUI::set_route (rt);
show_name_label ();
gm.set_controls (_route, _route->shared_peak_meter(), _route->amp());
gm.get_level_meter().set_no_show_all();
@ -321,15 +323,15 @@ RouteTimeAxisView::label_view ()
{
string x = _route->name();
if (x != name_entry.get_text()) {
name_entry.set_text (x);
if (name_entry && x != name_entry->get_text()) {
name_entry->set_text (x);
ARDOUR_UI::instance()->set_tip (*name_entry, Glib::Markup::escape_text(x));
}
if (x != name_label.get_text()) {
name_label.set_text (x);
}
ARDOUR_UI::instance()->set_tip (name_entry, Glib::Markup::escape_text(x));
}
void
@ -1288,7 +1290,7 @@ RouteTimeAxisView::name_entry_changed ()
{
TimeAxisView::name_entry_changed ();
string x = name_entry.get_text ();
string x = name_entry->get_text ();
if (x == _route->name()) {
return;
@ -1297,18 +1299,18 @@ RouteTimeAxisView::name_entry_changed ()
strip_whitespace_edges (x);
if (x.length() == 0) {
name_entry.set_text (_route->name());
name_entry->set_text (_route->name());
return;
}
if (_session->route_name_internal (x)) {
ARDOUR_UI::instance()->popup_error (string_compose (_("You cannot create a track with that name as it is reserved for %1"),
PROGRAM_NAME));
name_entry.grab_focus ();
name_entry->grab_focus ();
} else if (RouteUI::verify_new_route_name (x)) {
_route->set_name (x);
} else {
name_entry.grab_focus ();
name_entry->grab_focus ();
}
}

View File

@ -70,18 +70,19 @@ PBD::Signal1<void,TimeAxisView*> TimeAxisView::CatchDeletion;
TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
: AxisView (sess)
, controls_table (2, 8)
, name_entry (0)
, _name_editing (false)
, height (0)
, last_name_entry_key_press_event (0)
, display_menu (0)
, parent (rent)
, selection_group (0)
, _hidden (false)
, in_destructor (false)
, name_packing (NamePackingBits (0))
, _size_menu (0)
, _canvas_display (0)
, _y_position (0)
, _editor (ed)
, last_name_entry_key_press_event (0)
, control_parent (0)
, _order (0)
, _effective_height (0)
@ -89,6 +90,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
, _preresize_cursor (0)
, _have_preresize_cursor (false)
, _ghost_group (0)
, _ebox_release_can_act (true)
{
if (extra_height == 0) {
compute_heights ();
@ -106,24 +108,10 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
_ghost_group->lower_to_bottom();
_ghost_group->show();
/*
Create the standard LHS Controls
We create the top-level container and name add the name label here,
subclasses can add to the layout as required
*/
name_entry.set_name ("EditorTrackNameDisplay");
name_entry.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_release), false);
name_entry.signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_press), false);
name_entry.signal_key_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_release));
name_entry.signal_activate().connect (sigc::mem_fun(*this, &TimeAxisView::name_entry_activated));
name_entry.signal_focus_in_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_in));
name_entry.signal_focus_out_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_out));
Gtkmm2ext::set_size_request_to_display_given_text (name_entry, N_("gTortnam"), 10, 10); // just represents a short name
name_label.set_name ("TrackLabel");
name_label.set_alignment (0.0, 0.5);
ARDOUR_UI::instance()->set_tip (name_label, _("Track/Bus name (double click to edit)"));
/* typically, either name_label OR name_entry are visible,
but not both. its up to derived classes to show/hide them as they
wish.
@ -358,28 +346,24 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
bool
TimeAxisView::controls_ebox_button_press (GdkEventButton* event)
{
if (event->button == 1) {
if (event->type == GDK_2BUTTON_PRESS) {
/* see if it is inside the name label */
if (name_label.is_ancestor (controls_ebox)) {
int nlx;
int nly;
controls_ebox.translate_coordinates (name_label, event->x, event->y, nlx, nly);
Gtk::Allocation a = name_label.get_allocation ();
if (nlx > 0 && nlx < a.get_width() &&
nly > 0 && nly < a.get_height()) {
hide_name_label ();
show_name_entry ();
if (can_edit_name()) {
name_entry.grab_focus ();
name_entry.start_editing ((GdkEvent*) event);
}
return true;
}
if ((event->button == 1 && event->type == GDK_2BUTTON_PRESS) || Keyboard::is_edit_event (event)) {
/* see if it is inside the name label */
if (name_label.is_ancestor (controls_ebox)) {
int nlx;
int nly;
controls_ebox.translate_coordinates (name_label, event->x, event->y, nlx, nly);
Gtk::Allocation a = name_label.get_allocation ();
if (nlx > 0 && nlx < a.get_width() && nly > 0 && nly < a.get_height()) {
begin_name_edit ((GdkEvent*) event);
_ebox_release_can_act = false;
return true;
}
}
}
_ebox_release_can_act = true;
if (maybe_set_cursor (event->y) > 0) {
_resize_drag_start = event->y_root;
}
@ -473,6 +457,10 @@ TimeAxisView::controls_ebox_button_release (GdkEventButton* ev)
_resize_drag_start = -1;
}
if (!_ebox_release_can_act) {
return true;
}
switch (ev->button) {
case 1:
selection_click (ev);
@ -555,8 +543,6 @@ TimeAxisView::set_height (uint32_t h)
/* resize the selection rect */
show_selection (_editor.get_selection().time);
}
show_name_label ();
}
bool
@ -566,9 +552,11 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
switch (ev->keyval) {
case GDK_Escape:
name_entry.select_region (0,0);
// revert back to the way it was because
// name_entry_changed() will still be called as we drop focus.
name_entry->set_text (name_label.get_text());
// moving the focus will trigger everything else
controls_ebox.grab_focus ();
name_entry_changed ();
return true;
/* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
@ -578,12 +566,12 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
case GDK_ISO_Left_Tab:
case GDK_Tab:
{
name_entry_changed ();
TrackViewList const & allviews = _editor.get_track_views ();
TrackViewList::const_iterator i = find (allviews.begin(), allviews.end(), this);
if (ev->keyval == GDK_Tab) {
if (i != allviews.end()) {
do {
if (++i == allviews.end()) {
return true;
@ -624,16 +612,21 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
}
}
/* moving the focus will trigger everything else that is needed */
if ((i != allviews.end()) && (*i != this) && !(*i)->hidden()) {
(*i)->name_entry.grab_focus();
_editor.ensure_time_axis_view_is_visible (**i);
(*i)->begin_name_edit ((GdkEvent*) ev);
} else {
controls_ebox.grab_focus ();
}
}
return true;
case GDK_Up:
case GDK_Down:
name_entry_changed ();
controls_ebox.grab_focus ();
return true;
default:
@ -661,33 +654,68 @@ TimeAxisView::name_entry_key_release (GdkEventKey* ev)
name_entry_key_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_timed_out), name_entry_timeout);
#endif
return false;
}
bool
TimeAxisView::name_entry_focus_in (GdkEventFocus*)
void
TimeAxisView::begin_name_edit (GdkEvent* event)
{
name_entry.select_region (0, -1);
name_entry.set_state (STATE_SELECTED);
if (_name_editing) {
return;
}
if (can_edit_name()) {
_name_editing = true;
show_name_entry ();
name_entry->select_region (0, -1);
name_entry->set_state (STATE_SELECTED);
name_entry->grab_focus ();
name_entry->start_editing (event);
}
}
void
TimeAxisView::end_name_edit (bool push_focus)
{
if (!_name_editing) {
return;
}
if (can_edit_name()) {
_name_editing = false;
last_name_entry_key_press_event = 0;
name_entry_key_timeout.disconnect ();
if (push_focus) {
controls_ebox.grab_focus ();
}
show_name_label ();
name_entry_changed ();
}
}
void
TimeAxisView::name_entry_changed ()
{
}
bool
TimeAxisView::name_entry_focus_in (GdkEventFocus* ev)
{
begin_name_edit ((GdkEvent*) ev);
return false;
}
bool
TimeAxisView::name_entry_focus_out (GdkEventFocus*)
{
cerr << "NEFO\n";
/* clean up */
last_name_entry_key_press_event = 0;
name_entry_key_timeout.disconnect ();
name_entry.select_region (0,0);
name_entry.set_state (STATE_NORMAL);
/* do the real stuff */
name_entry_changed ();
end_name_edit (false);
return false;
}
@ -701,15 +729,7 @@ TimeAxisView::name_entry_key_timed_out ()
void
TimeAxisView::name_entry_activated ()
{
controls_ebox.grab_focus();
}
void
TimeAxisView::name_entry_changed ()
{
cerr << "swithcing back to name labnel\n";
hide_name_entry ();
show_name_label ();
end_name_edit (true);
}
bool
@ -1160,9 +1180,12 @@ TimeAxisView::compute_heights ()
void
TimeAxisView::show_name_label ()
{
if (!(name_packing & NameLabelPacked) && name_label.get_parent() == 0) {
if (name_entry && name_entry->is_ancestor (name_hbox)) {
name_hbox.remove (*name_entry);
}
if (!name_label.is_ancestor (name_hbox) && name_label.get_parent() == 0) {
name_hbox.pack_start (name_label, true, true);
name_packing = NamePackingBits (name_packing | NameLabelPacked);
name_hbox.show ();
name_label.show ();
}
@ -1171,29 +1194,35 @@ TimeAxisView::show_name_label ()
void
TimeAxisView::show_name_entry ()
{
if (!(name_packing & NameEntryPacked)) {
name_hbox.pack_start (name_entry, true, true);
name_packing = NamePackingBits (name_packing | NameEntryPacked);
name_hbox.show ();
name_entry.show ();
}
}
if (!name_entry) {
/*
Create the standard LHS Controls
We create the top-level container and name add the name label here,
subclasses can add to the layout as required
*/
void
TimeAxisView::hide_name_label ()
{
if (name_packing & NameLabelPacked) {
name_entry = new Gtkmm2ext::FocusEntry;
name_entry->set_name ("EditorTrackNameDisplay");
name_entry->signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_release), false);
name_entry->signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_press), false);
name_entry->signal_key_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_release));
name_entry->signal_activate().connect (sigc::mem_fun(*this, &TimeAxisView::name_entry_activated));
name_entry->signal_focus_in_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_in));
name_entry->signal_focus_out_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_focus_out));
Gtkmm2ext::set_size_request_to_display_given_text (*name_entry, N_("gTortnam"), 10, 10); // just represents a short name
name_entry->set_text (name_label.get_text());
}
if (name_label.is_ancestor (name_hbox)) {
name_hbox.remove (name_label);
name_packing = NamePackingBits (name_packing & ~NameLabelPacked);
}
}
void
TimeAxisView::hide_name_entry ()
{
if (name_packing & NameEntryPacked) {
name_hbox.remove (name_entry);
name_packing = NamePackingBits (name_packing & ~NameEntryPacked);
if (!name_entry->is_ancestor (name_hbox) && name_label.get_parent() == 0) {
name_hbox.pack_start (*name_entry, true, true);
name_hbox.show ();
name_entry->show ();
}
}

View File

@ -116,8 +116,6 @@ class TimeAxisView : public virtual AxisView
void idle_resize (uint32_t);
void hide_name_label ();
void hide_name_entry ();
void show_name_label ();
void show_name_entry ();
@ -200,19 +198,30 @@ class TimeAxisView : public virtual AxisView
protected:
/* The Standard LHS Controls */
Gtk::HBox controls_hbox;
Gtk::Table controls_table;
Gtk::EventBox controls_ebox;
Gtk::VBox controls_vbox;
Gtk::VBox time_axis_vbox;
Gtk::HBox name_hbox;
Gtk::Frame name_frame;
Gtkmm2ext::FocusEntry name_entry;
uint32_t height; /* in canvas units */
std::string controls_base_unselected_name;
std::string controls_base_selected_name;
Gtk::HBox controls_hbox;
Gtk::Table controls_table;
Gtk::EventBox controls_ebox;
Gtk::VBox controls_vbox;
Gtk::VBox time_axis_vbox;
Gtk::HBox name_hbox;
Gtkmm2ext::FocusEntry* name_entry;
Gtk::Label name_label;
bool _name_editing;
uint32_t height; /* in canvas units */
std::string controls_base_unselected_name;
std::string controls_base_selected_name;
Gtk::Menu* display_menu; /* The standard LHS Track control popup-menus */
TimeAxisView* parent;
ArdourCanvas::Group* selection_group;
std::list<GhostRegion*> ghosts;
std::list<SelectionRect*> free_selection_rects;
std::list<SelectionRect*> used_selection_rects;
bool _hidden;
bool in_destructor;
Gtk::Menu* _size_menu;
ArdourCanvas::Group* _canvas_display;
double _y_position;
PublicEditor& _editor;
virtual bool can_edit_name() const;
@ -224,6 +233,9 @@ class TimeAxisView : public virtual AxisView
bool name_entry_key_timed_out ();
guint32 last_name_entry_key_press_event;
void begin_name_edit (GdkEvent*);
void end_name_edit (bool push_focus);
/* derived classes can override these */
virtual void name_entry_changed ();
@ -255,14 +267,6 @@ class TimeAxisView : public virtual AxisView
*/
virtual bool handle_display_menu_map_event (GdkEventAny * /*ev*/) { return false; }
/* The standard LHS Track control popup-menus */
Gtk::Menu *display_menu;
Gtk::Label name_label;
TimeAxisView* parent;
Children children;
bool is_child (TimeAxisView*);
@ -271,47 +275,30 @@ class TimeAxisView : public virtual AxisView
/* selection display */
ArdourCanvas::Group *selection_group;
std::list<GhostRegion*> ghosts;
std::list<SelectionRect*> free_selection_rects;
std::list<SelectionRect*> used_selection_rects;
virtual void selection_click (GdkEventButton*);
bool _hidden;
bool in_destructor;
NamePackingBits name_packing;
void color_handler ();
void conditionally_add_to_selection ();
void build_size_menu ();
Gtk::Menu* _size_menu;
ArdourCanvas::Group* _canvas_display;
double _y_position;
PublicEditor& _editor;
private:
ArdourCanvas::Group* _canvas_background;
Gtk::VBox* control_parent;
int _order;
uint32_t _effective_height;
double _resize_drag_start;
GdkCursor* _preresize_cursor;
bool _have_preresize_cursor;
Gtk::VBox* control_parent;
int _order;
uint32_t _effective_height;
double _resize_drag_start;
GdkCursor* _preresize_cursor;
bool _have_preresize_cursor;
ArdourCanvas::Group* _ghost_group;
bool _ebox_release_can_act;
void compute_heights ();
static uint32_t button_height;
static uint32_t extra_height;
static int const _max_order;
void compute_heights ();
bool maybe_set_cursor (int y);
}; /* class TimeAxisView */