/*
- Copyright (C) 2000 Paul Davis
+ Copyright (C) 2000 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "ardour/location.h"
#include "ardour_ui.h"
+#include "gui_thread.h"
#include "public_editor.h"
#include "time_axis_view.h"
#include "region_view.h"
using namespace std;
using namespace Gtk;
using namespace Gdk;
-using namespace sigc;
using namespace ARDOUR;
using namespace PBD;
using namespace Editing;
using namespace ArdourCanvas;
+using Gtkmm2ext::Keyboard;
const double trim_handle_size = 6.0; /* pixels */
uint32_t TimeAxisView::hSmall = 0;
bool TimeAxisView::need_size_info = true;
int const TimeAxisView::_max_order = 512;
+PBD::Signal1<void,TimeAxisView*> TimeAxisView::CatchDeletion;
-TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
- : AxisView (sess),
+TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
+ : AxisView (sess),
controls_table (2, 8),
_y_position (0),
_editor (ed),
}
_canvas_background = new Group (*ed.get_background_group (), 0.0, 0.0);
_canvas_display = new Group (*ed.get_trackview_group (), 0.0, 0.0);
+ _canvas_display->hide(); // reveal as needed
selection_group = new Group (*_canvas_display);
selection_group->hide();
*/
name_entry.set_name ("EditorTrackNameDisplay");
- name_entry.signal_button_release_event().connect (mem_fun (*this, &TimeAxisView::name_entry_button_release));
- name_entry.signal_button_press_event().connect (mem_fun (*this, &TimeAxisView::name_entry_button_press));
- name_entry.signal_key_release_event().connect (mem_fun (*this, &TimeAxisView::name_entry_key_release));
- name_entry.signal_activate().connect (mem_fun(*this, &TimeAxisView::name_entry_activated));
- name_entry.signal_focus_in_event().connect (mem_fun (*this, &TimeAxisView::name_entry_focus_in));
- name_entry.signal_focus_out_event().connect (mem_fun (*this, &TimeAxisView::name_entry_focus_out));
+ name_entry.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_release));
+ name_entry.signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_button_press));
+ 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");
resizer.set_size_request (10, 10);
resizer.set_name ("ResizeHandle");
- resizer.signal_expose_event().connect (mem_fun (*this, &TimeAxisView::resizer_expose));
- resizer.signal_button_press_event().connect (mem_fun (*this, &TimeAxisView::resizer_button_press));
- resizer.signal_button_release_event().connect (mem_fun (*this, &TimeAxisView::resizer_button_release));
- resizer.signal_motion_notify_event().connect (mem_fun (*this, &TimeAxisView::resizer_motion));
+ resizer.signal_expose_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_expose));
+ resizer.signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_button_press));
+ resizer.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_button_release));
+ resizer.signal_motion_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_motion));
resizer.set_events (Gdk::BUTTON_PRESS_MASK|
Gdk::BUTTON_RELEASE_MASK|
Gdk::POINTER_MOTION_MASK|
controls_ebox.add_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|SCROLL_MASK);
controls_ebox.set_flags (CAN_FOCUS);
- controls_ebox.signal_button_release_event().connect (mem_fun (*this, &TimeAxisView::controls_ebox_button_release));
- controls_ebox.signal_scroll_event().connect (mem_fun (*this, &TimeAxisView::controls_ebox_scroll), true);
+ controls_ebox.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_button_release));
+ controls_ebox.signal_scroll_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_scroll), true);
controls_hbox.pack_start (controls_ebox,true,true);
controls_hbox.show ();
- ColorsChanged.connect (mem_fun (*this, &TimeAxisView::color_handler));
+ ColorsChanged.connect (sigc::mem_fun (*this, &TimeAxisView::color_handler));
+
+ GhostRegion::CatchDeletion.connect (*this, ui_bind (&TimeAxisView::erase_ghost, this, _1), gui_context());
}
TimeAxisView::~TimeAxisView()
if (canvas_item_visible ((*i)->_canvas_display)) {
++nth;
_effective_height += (*i)->show_at (y + _effective_height, nth, parent);
- }
+ }
}
return _effective_height;
bool
TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
{
+ if (Keyboard::some_magic_widget_has_focus()) {
+ return false;
+ }
+
switch (ev->direction) {
case GDK_SCROLL_UP:
if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
void
TimeAxisView::selection_click (GdkEventButton* ev)
{
- Selection::Operation op = Keyboard::selection_type (ev->state);
+ Selection::Operation op = ArdourKeyboard::selection_type (ev->state);
_editor.set_selected_track (*this, op, false);
}
bool
TimeAxisView::name_entry_key_release (GdkEventKey* ev)
{
- PublicEditor::TrackViewList *allviews = 0;
- PublicEditor::TrackViewList::iterator i;
+ TrackViewList::iterator i;
switch (ev->keyval) {
case GDK_Escape:
return true;
/* Shift+Tab Keys Pressed. Note that for Shift+Tab, GDK actually
- * generates a different ev->keyval, rather than setting
+ * generates a different ev->keyval, rather than setting
* ev->state.
*/
case GDK_ISO_Left_Tab:
case GDK_Tab:
+ {
name_entry_changed ();
- allviews = _editor.get_valid_views (0);
- if (allviews != 0) {
- i = find (allviews->begin(), allviews->end(), this);
- if (ev->keyval == GDK_Tab) {
- if (i != allviews->end()) {
- do {
- if (++i == allviews->end()) { return true; }
- } while((*i)->hidden());
- }
- } else {
- if (i != allviews->begin()) {
- do {
- if (--i == allviews->begin()) { return true; }
- } while ((*i)->hidden());
- }
+ 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;
+ }
+ } while((*i)->hidden());
}
-
-
- /* resize to show editable name display */
-
- if ((*i)->current_height() >= hSmall && (*i)->current_height() < hNormal) {
- (*i)->set_height (hSmaller);
+ } else {
+ if (i != allviews.begin()) {
+ do {
+ if (i == allviews.begin()) {
+ return true;
+ }
+ --i;
+ } while ((*i)->hidden());
}
-
- (*i)->name_entry.grab_focus();
}
- return true;
-
+
+
+ /* resize to show editable name display */
+
+ if ((*i)->current_height() <= hSmaller) {
+ (*i)->set_height (hSmaller);
+ }
+
+ (*i)->name_entry.grab_focus();
+ }
+ return true;
+
case GDK_Up:
case GDK_Down:
name_entry_changed ();
break;
}
-#ifdef TIMEOUT_NAME_EDIT
+#ifdef TIMEOUT_NAME_EDIT
/* adapt the timeout to reflect the user's typing speed */
guint32 name_entry_timeout;
/* wait 1 seconds and if no more keys are pressed, act as if they pressed enter */
name_entry_key_timeout.disconnect();
- name_entry_key_timeout = Glib::signal_timeout().connect (mem_fun (*this, &TimeAxisView::name_entry_key_timed_out), name_entry_timeout);
+ name_entry_key_timeout = Glib::signal_timeout().connect (sigc::mem_fun (*this, &TimeAxisView::name_entry_key_timed_out), name_entry_timeout);
#endif
return false;
}
conditionally_add_to_selection ();
- display_menu->popup (1, when);
+ display_menu->popup (1, when);
}
gint
controls_ebox.set_name (controls_base_selected_name);
controls_hbox.set_name (controls_base_selected_name);
controls_vbox.set_name (controls_base_selected_name);
- /* propagate any existing selection, if the mode is right */
-
- if (_editor.current_mouse_mode() == Editing::MouseRange && !_editor.get_selection().time.empty()) {
- show_selection (_editor.get_selection().time);
- }
-
} else {
controls_ebox.set_name (controls_base_unselected_name);
controls_hbox.set_name (controls_base_unselected_name);
size_menu->set_name ("ArdourContextMenu");
MenuList& items = size_menu->items();
- items.push_back (MenuElem (_("Largest"), bind (mem_fun (*this, &TimeAxisView::set_heights), hLargest)));
- items.push_back (MenuElem (_("Large"), bind (mem_fun (*this, &TimeAxisView::set_heights), hLarge)));
- items.push_back (MenuElem (_("Larger"), bind (mem_fun (*this, &TimeAxisView::set_heights), hLarger)));
- items.push_back (MenuElem (_("Normal"), bind (mem_fun (*this, &TimeAxisView::set_heights), hNormal)));
- items.push_back (MenuElem (_("Smaller"), bind (mem_fun (*this, &TimeAxisView::set_heights),hSmaller)));
- items.push_back (MenuElem (_("Small"), bind (mem_fun (*this, &TimeAxisView::set_heights), hSmall)));
+ items.push_back (MenuElem (_("Largest"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights), hLargest)));
+ items.push_back (MenuElem (_("Large"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights), hLarge)));
+ items.push_back (MenuElem (_("Larger"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights), hLarger)));
+ items.push_back (MenuElem (_("Normal"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights), hNormal)));
+ items.push_back (MenuElem (_("Smaller"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights),hSmaller)));
+ items.push_back (MenuElem (_("Small"), sigc::bind (sigc::mem_fun (*this, &TimeAxisView::set_heights), hSmall)));
}
void
{
using namespace Menu_Helpers;
+ delete display_menu;
+
display_menu = new Menu;
display_menu->set_name ("ArdourContextMenu");
free_selection_rects.push_front (rect);
- rect->rect->signal_event().connect (bind (mem_fun (_editor, &PublicEditor::canvas_selection_rect_event), rect->rect, rect));
- rect->start_trim->signal_event().connect (bind (mem_fun (_editor, &PublicEditor::canvas_selection_start_trim_event), rect->rect, rect));
- rect->end_trim->signal_event().connect (bind (mem_fun (_editor, &PublicEditor::canvas_selection_end_trim_event), rect->rect, rect));
- }
+ rect->rect->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_rect_event), rect->rect, rect));
+ rect->start_trim->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_start_trim_event), rect->rect, rect));
+ rect->end_trim->signal_event().connect (sigc::bind (sigc::mem_fun (_editor, &PublicEditor::canvas_selection_end_trim_event), rect->rect, rect));
+ }
rect = free_selection_rects.front();
rect->id = id;
if(gr) {
ghosts.push_back(gr);
- gr->GoingAway.connect (mem_fun(*this, &TimeAxisView::erase_ghost));
}
}
void
-TimeAxisView::remove_ghost (RegionView* rv) {
+TimeAxisView::remove_ghost (RegionView* rv)
+{
rv->remove_ghost_in (*this);
}
void
-TimeAxisView::erase_ghost (GhostRegion* gr) {
- if(in_destructor) {
+TimeAxisView::erase_ghost (GhostRegion* gr)
+{
+ if (in_destructor) {
return;
}
-
- list<GhostRegion*>::iterator i;
-
- for (i = ghosts.begin(); i != ghosts.end(); ++i) {
+
+ for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
if ((*i) == gr) {
ghosts.erase (i);
break;
*/
double mybot = _y_position + current_height();
-
- return ((_y_position <= bot && _y_position >= top) ||
- ((mybot <= bot) && (top < mybot)) ||
+
+ return ((_y_position <= bot && _y_position >= top) ||
+ ((mybot <= bot) && (top < mybot)) ||
(mybot >= bot && _y_position < top));
-}
+}
void
TimeAxisView::set_parent (TimeAxisView& p)
if (parent->has_state()) {
return parent;
- }
+ }
return parent->get_parent_with_state ();
}
}
int
-TimeAxisView::set_state (const XMLNode& node)
+TimeAxisView::set_state (const XMLNode& node, int /*version*/)
{
const XMLProperty *prop;
} else if ((prop = node.property ("height")) != 0) {
set_height (atoi (prop->value()));
-
+
} else {
set_height (hNormal);
(*i)->set_height ((*i)->height);
}
}
-
+
void
TimeAxisView::compute_controls_size_info ()
{
}
one_row_table.attach (*buttons[0], 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
-
+
one_row_table.show_all ();
Gtk::Requisition req(one_row_table.size_request ());
two_row_table.show_all ();
req = two_row_table.size_request ();
- // height required to show all normal buttons
+ // height required to show all normal buttons
hNormal = /*req.height*/ 48 + extra_height;
- // these heights are all just larger than normal. no more
+ // these heights are all just larger than normal. no more
// elements are visible (yet).
hLarger = hNormal + 50;
l = view()->layers() - 1;
}
}
-
+
return std::make_pair (this, l);
}
win->get_geometry (x, y, w, h, d);
/* handle/line #1 */
-
+
win->draw_line (dark, 0, 0, w - 2, 0);
win->draw_point (dark, 0, 1);
win->draw_line (light, 1, 1, w - 1, 1);
return true;
}
+bool
+TimeAxisView::set_visibility (bool yn)
+{
+ if (yn != marked_for_display()) {
+ if (yn) {
+ set_marked_for_display (true);
+ canvas_display()->show();
+ } else {
+ set_marked_for_display (false);
+ hide ();
+ }
+ return true; // things changed
+ }
+
+ return false;
+}