#include <string>
#include <list>
+#include <gtkmm/separator.h>
#include "pbd/error.h"
#include "pbd/convert.h"
#include "pbd/stacktrace.h"
#include "pbd/unwind.h"
-#include <gtkmm2ext/doi.h>
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/selector.h>
+#include "ardour/profile.h"
+
+#include "gtkmm2ext/colors.h"
+#include "gtkmm2ext/doi.h"
+#include "gtkmm2ext/utils.h"
#include "canvas/canvas.h"
#include "canvas/rectangle.h"
#include "canvas/debug.h"
#include "canvas/utils.h"
-#include "canvas/colors.h"
-#include "ardour/profile.h"
+#include "widgets/tooltips.h"
#include "ardour_dialog.h"
#include "floating_text_entry.h"
#include "streamview.h"
#include "editor_drag.h"
#include "editor.h"
-#include "tooltips.h"
#include "ui_config.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace Gtk;
using namespace Gdk;
using namespace ARDOUR;
-using namespace ARDOUR_UI_UTILS;
using namespace PBD;
using namespace Editing;
using namespace ArdourCanvas;
+using namespace ArdourWidgets;
using Gtkmm2ext::Keyboard;
#define TOP_LEVEL_WIDGET controls_ebox
}
TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisView* rent, Canvas& /*canvas*/)
- : AxisView (sess)
- , controls_table (5, 4)
+ : controls_table (5, 4)
, controls_button_size_group (Gtk::SizeGroup::create (Gtk::SIZE_GROUP_BOTH))
, _name_editing (false)
, height (0)
_canvas_separator = new ArdourCanvas::Line(_canvas_display);
CANVAS_DEBUG_NAME (_canvas_separator, "separator for TAV");
_canvas_separator->set (ArdourCanvas::Duple(0.0, 0.0), ArdourCanvas::Duple(ArdourCanvas::COORD_MAX, 0.0));
- _canvas_separator->set_outline_color(ArdourCanvas::rgba_to_color (0, 0, 0, 1.0));
+ _canvas_separator->set_outline_color(Gtkmm2ext::rgba_to_color (0, 0, 0, 1.0));
_canvas_separator->set_outline_width(1.0);
_canvas_separator->hide();
name_label.set_width_chars (12);
set_tooltip (name_label, _("Track/Bus name (double click to edit)"));
- Gtk::Entry* an_entry = new Gtkmm2ext::FocusEntry;
- an_entry->set_name ("EditorTrackNameDisplay");
- Gtk::Requisition req;
- an_entry->size_request (req);
- name_label.set_size_request (-1, req.height);
- name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
- delete an_entry;
+ {
+ std::auto_ptr<Gtk::Entry> an_entry (new FocusEntry);
+ an_entry->set_name (X_("TrackNameEditor"));
+ Gtk::Requisition req;
+ an_entry->size_request (req);
- name_hbox.pack_end (name_label, true, true);
+ name_label.set_size_request (-1, req.height);
+ name_label.set_ellipsize (Pango::ELLIPSIZE_MIDDLE);
+ }
// set min. track-header width if fader is not visible
- name_hbox.set_size_request(name_width_px, -1);
+ name_label.set_size_request(name_width_px, -1);
- name_hbox.show ();
name_label.show ();
controls_table.set_row_spacings (2);
controls_table.set_border_width (2);
if (ARDOUR::Profile->get_mixbus() ) {
- controls_table.attach (name_hbox, 4, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+ controls_table.attach (name_label, 4, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
} else {
- controls_table.attach (name_hbox, 1, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
+ controls_table.attach (name_label, 1, 2, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0);
}
+
controls_table.show_all ();
controls_table.set_no_show_all ();
* @param y y position.
* @param nth index for this TimeAxisView, increased if this view has children.
* @param parent parent component.
+*
* @return height of this TimeAxisView.
*/
guint32
}
}
+ for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
+ (*i)->set_height ();
+ }
+
/* put separator at the bottom of this time axis view */
_canvas_separator->set (ArdourCanvas::Duple(0, height), ArdourCanvas::Duple(ArdourCanvas::COORD_MAX, height));
TOP_LEVEL_WIDGET.property_height_request () = h;
height = h;
- char buf[32];
- snprintf (buf, sizeof (buf), "%u", height);
- set_gui_property ("height", buf);
+ set_gui_property ("height", height);
for (list<GhostRegion*>::iterator i = ghosts.begin(); i != ghosts.end(); ++i) {
(*i)->set_height ();
}
Gtk::Window* toplevel = (Gtk::Window*) control_parent->get_toplevel();
- FloatingTextEntry* fte = new FloatingTextEntry (toplevel, name_label.get_text ());
+ FloatingTextEntry* fte = new FloatingTextEntry (toplevel, name ());
fte->set_name ("TrackNameEditor");
fte->use_text.connect (sigc::mem_fun (*this, &TimeAxisView::end_name_edit));
*/
int x, y;
- int wx, wy;
+ int wx, wy;
- name_label.translate_coordinates (*toplevel, 0, 0, x, y);
- toplevel->get_window()->get_origin (wx, wy);
+ name_label.translate_coordinates (*toplevel, 0, 0, x, y);
+ toplevel->get_window()->get_origin (wx, wy);
- fte->move (wx + x, wy + y);
+ fte->move (wx + x, wy + y);
fte->present ();
}
conditionally_add_to_selection ();
build_display_menu ();
- display_menu->popup (1, when);
+
+ if (!display_menu->items().empty()) {
+ display_menu->popup (1, when);
+ }
}
void
TimeAxisView::set_selected (bool yn)
{
-#if 0
- /* end any name edit in progress */
- if (can_edit_name()) {
- end_name_edit (string(), 0);
- }
-#endif
-
- if (yn == _selected) {
+ if (yn == selected()) {
return;
}
- Selectable::set_selected (yn);
+ AxisView::set_selected (yn);
if (_selected) {
time_axis_frame.set_shadow_type (Gtk::SHADOW_IN);
time_axis_vbox.set_name (controls_base_unselected_name);
hide_selection ();
-
- /* children will be set for the yn=true case. but when deselecting
- the editor only has a list of top-level trackviews, so we
- have to do this here.
- */
-
- for (Children::iterator i = children.begin(); i != children.end(); ++i) {
- (*i)->set_selected (false);
- }
}
time_axis_frame.show();
-
}
void
for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ if (!(*i)->selected () && !(*i)->propagate_time_selection ()) {
+ continue;
+ }
(*i)->show_selection (ts);
}
show_selection (ts);
for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ if (!(*i)->selected () && !(*i)->propagate_time_selection ()) {
+ continue;
+ }
(*i)->show_selection (ts);
}
}
}
}
+// retuned rect is pushed back into the used_selection_rects list
+// in TimeAxisView::show_selection() which is the only caller.
SelectionRect *
TimeAxisView::get_selection_rect (uint32_t id)
{
for (list<SelectionRect*>::iterator i = used_selection_rects.begin(); i != used_selection_rects.end(); ++i) {
if ((*i)->id == id) {
- return (*i);
+ SelectionRect* ret = (*i);
+ used_selection_rects.erase (i);
+ return ret;
}
}
* @param result Filled in with selectable things.
*/
void
-TimeAxisView::get_selectables (framepos_t /*start*/, framepos_t /*end*/, double /*top*/, double /*bot*/, list<Selectable*>& /*result*/, bool /*within*/)
+TimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list<Selectable*>& results, bool within)
+{
+ for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ if (!(*i)->hidden()) {
+ (*i)->get_selectables (start, end, top, bot, results, within);
+ }
+ }
+}
+
+void
+TimeAxisView::set_selected_points (PointSelection& points)
{
- return;
+ for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ (*i)->set_selected_points (points);
+ }
}
void
-TimeAxisView::get_inverted_selectables (Selection& /*sel*/, list<Selectable*>& /*result*/)
+TimeAxisView::get_inverted_selectables (Selection& sel, list<Selectable*>& results)
{
- return;
+ for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ if (!(*i)->hidden()) {
+ (*i)->get_inverted_selectables (sel, results);
+ }
+ }
}
void
/** @return Child time axis views that are not hidden */
TimeAxisView::Children
-TimeAxisView::get_child_list ()
+TimeAxisView::get_child_list () const
{
Children c;
- for (Children::iterator i = children.begin(); i != children.end(); ++i) {
+ for (Children::const_iterator i = children.begin(); i != children.end(); ++i) {
if (!(*i)->hidden()) {
c.push_back(*i);
}
{
/* this method is not required to trigger a global redraw */
- string str = gui_property ("height");
-
- if (!str.empty()) {
- set_height (atoi (str));
+ uint32_t height;
+ if (get_gui_property ("height", height)) {
+ set_height (height);
} else {
set_height (preset_height (HeightNormal));
}