#include <gtkmm2ext/utils.h>
#include <ardour/audioplaylist.h>
-#include <ardour/diskstream.h>
+#include <ardour/audio_diskstream.h>
#include <ardour/insert.h>
#include <ardour/ladspa_plugin.h>
#include <ardour/location.h>
#include "i18n.h"
using namespace ARDOUR;
+using namespace PBD;
using namespace LADSPA;
using namespace Gtk;
using namespace Editing;
-static const gchar * small_x_xpm[] = {
-"11 11 2 1",
-" c None",
-". c #000000",
-" ",
-" ",
-" . . ",
-" . . ",
-" . . ",
-" . ",
-" . . ",
-" . . ",
-" . . ",
-" ",
-" "};
AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, Route& rt, Canvas& canvas)
: AxisView(sess),
visual_button.set_name ("TrackVisualButton");
hide_button.set_name ("TrackRemoveButton");
- hide_button.add (*(manage (new Image (Gdk::Pixbuf::create_from_xpm_data(small_x_xpm)))));
-
- _route.mute_changed.connect (mem_fun(*this, &RouteUI::mute_changed));
- _route.solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
- _route.solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
-
- _route.panner().Changed.connect (mem_fun(*this, &AudioTimeAxisView::update_pans));
-
- solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press));
- solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release));
- mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press));
- mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release));
+ hide_button.add (*(manage (new Image (get_xpm("small_x.xpm")))));
+
+ solo_button->signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ mute_button->signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ rec_enable_button->signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ playlist_button.signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ automation_button.signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ size_button.signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ visual_button.signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+ hide_button.signal_button_press_event().connect (mem_fun (*this, &AudioTimeAxisView::select_me), false);
+
+ solo_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::solo_press), false);
+ solo_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::solo_release), false);
+ mute_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::mute_press), false);
+ mute_button->signal_button_release_event().connect (mem_fun(*this, &RouteUI::mute_release), false);
rec_enable_button->signal_button_press_event().connect (mem_fun(*this, &RouteUI::rec_enable_press));
edit_group_button.signal_button_release_event().connect (mem_fun(*this, &AudioTimeAxisView::edit_click), false);
playlist_button.signal_clicked().connect (mem_fun(*this, &AudioTimeAxisView::playlist_click));
_route.mute_changed.connect (mem_fun(*this, &RouteUI::mute_changed));
_route.solo_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
_route.redirects_changed.connect (mem_fun(*this, &AudioTimeAxisView::redirects_changed));
-
_route.name_changed.connect (mem_fun(*this, &AudioTimeAxisView::route_name_changed));
+ _route.solo_safe_changed.connect (mem_fun(*this, &RouteUI::solo_changed));
+ _route.panner().Changed.connect (mem_fun(*this, &AudioTimeAxisView::update_pans));
if (is_audio_track()) {
MenuList &items = edit_group_menu.items();
+ cerr << "adding edit group called " << eg->name() << endl;
+
items.push_back (RadioMenuElem (*group, eg->name(), bind (mem_fun(*this, &AudioTimeAxisView::set_edit_group_from_menu), eg)));
if (_route.edit_group() == eg) {
static_cast<RadioMenuItem*>(&items.back())->set_active ();
void
AudioTimeAxisView::set_height (TrackHeight h)
{
- bool height_changed = (h != height_style);
+ bool height_changed = (height == 0) || (h != height_style);
TimeAxisView::set_height (h);
items.push_back (MenuElem (_("Show all crossfades"), mem_fun(*this, &AudioTimeAxisView::show_all_xfades)));
items.push_back (SeparatorElem());
+ build_remote_control_menu ();
+ items.push_back (MenuElem (_("Remote Control ID"), *remote_control_menu));
automation_action_menu = manage (new Menu);
MenuList& automation_items = automation_action_menu->items();
automation_action_menu->set_name ("ArdourContextMenu");
- automation_items.push_back (MenuElem (_("show all automation"),
+ automation_items.push_back (MenuElem (_("Show all automation"),
mem_fun(*this, &AudioTimeAxisView::show_all_automation)));
- automation_items.push_back (MenuElem (_("show existing automation"),
+ automation_items.push_back (MenuElem (_("Show existing automation"),
mem_fun(*this, &AudioTimeAxisView::show_existing_automation)));
- automation_items.push_back (MenuElem (_("hide all automation"),
+ automation_items.push_back (MenuElem (_("Hide all automation"),
mem_fun(*this, &AudioTimeAxisView::hide_all_automation)));
automation_items.push_back (SeparatorElem());
- automation_items.push_back (CheckMenuElem (_("gain"),
+ automation_items.push_back (CheckMenuElem (_("Fader"),
mem_fun(*this, &AudioTimeAxisView::toggle_gain_track)));
gain_automation_item = static_cast<CheckMenuItem*> (&automation_items.back());
gain_automation_item->set_active(show_gain_automation);
- automation_items.push_back (CheckMenuElem (_("pan"),
+ automation_items.push_back (CheckMenuElem (_("Pan"),
mem_fun(*this, &AudioTimeAxisView::toggle_pan_track)));
pan_automation_item = static_cast<CheckMenuItem*> (&automation_items.back());
pan_automation_item->set_active(show_pan_automation);
RadioMenuItem::Group align_group;
- alignment_items.push_back (RadioMenuElem (align_group, _("align with existing material"), bind (mem_fun(*this, &AudioTimeAxisView::set_align_style), ExistingMaterial)));
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align with existing material"), bind (mem_fun(*this, &AudioTimeAxisView::set_align_style), ExistingMaterial)));
align_existing_item = dynamic_cast<RadioMenuItem*>(&alignment_items.back());
if (get_diskstream()->alignment_style() == ExistingMaterial) {
align_existing_item->set_active();
}
- alignment_items.push_back (RadioMenuElem (align_group, _("align with capture time"), bind (mem_fun(*this, &AudioTimeAxisView::set_align_style), CaptureTime)));
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align with capture time"), bind (mem_fun(*this, &AudioTimeAxisView::set_align_style), CaptureTime)));
align_capture_item = dynamic_cast<RadioMenuItem*>(&alignment_items.back());
if (get_diskstream()->alignment_style() == CaptureTime) {
align_capture_item->set_active();
string name;
AudioPlaylist *pl;
- DiskStream *ds;
+ AudioDiskstream *ds;
if (((ds = get_diskstream()) == 0) || ds->destructive() || ((pl = ds->playlist()) == 0)) {
return;
prompter.set_prompt (_("Name for playlist"));
prompter.set_initial_text (pl->name());
+ prompter.add_button (_("Rename"), Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
switch (prompter.run ()) {
case Gtk::RESPONSE_ACCEPT:
AudioTimeAxisView::use_copy_playlist (bool prompt)
{
AudioPlaylist *pl;
- DiskStream *ds;
+ AudioDiskstream *ds;
string name;
if (((ds = get_diskstream()) == 0) || ds->destructive() || ((pl = ds->playlist()) == 0)) {
ArdourPrompter prompter (true);
- prompter.set_prompt (_("Name for playlist"));
+ prompter.set_prompt (_("Name for Playlist"));
prompter.set_initial_text (name);
+ prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
prompter.show_all ();
switch (prompter.run ()) {
AudioTimeAxisView::use_new_playlist (bool prompt)
{
AudioPlaylist *pl;
- DiskStream *ds;
+ AudioDiskstream *ds;
string name;
if (((ds = get_diskstream()) == 0) || ds->destructive() || ((pl = ds->playlist()) == 0)) {
ArdourPrompter prompter (true);
- prompter.set_prompt (_("Name for playlist"));
+ prompter.set_prompt (_("Name for Playlist"));
prompter.set_initial_text (name);
+ prompter.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
+ prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
switch (prompter.run ()) {
case Gtk::RESPONSE_ACCEPT:
AudioTimeAxisView::clear_playlist ()
{
AudioPlaylist *pl;
- DiskStream *ds;
+ AudioDiskstream *ds;
if ((ds = get_diskstream()) != 0) {
if ((pl = ds->playlist()) != 0) {
void
AudioTimeAxisView::update_diskstream_display ()
{
- DiskStream *ds;
+ AudioDiskstream *ds;
if ((ds = get_diskstream()) != 0) {
set_playlist (ds->playlist ());
jack_nframes_t start_adjusted = session_frame_to_track_frame(start, speed);
jack_nframes_t end_adjusted = session_frame_to_track_frame(end, speed);
- if (view && touched (top, bot)) {
+ if (view && ((top < 0.0 && bot < 0.0)) || touched (top, bot)) {
view->get_selectables (start_adjusted, end_adjusted, results);
}
Playlist *
AudioTimeAxisView::playlist () const
{
- DiskStream *ds;
+ AudioDiskstream *ds;
if ((ds = get_diskstream()) != 0) {
return ds->playlist();
Region*
AudioTimeAxisView::find_next_region (jack_nframes_t pos, RegionPoint point, int32_t dir)
{
- DiskStream *stream;
+ AudioDiskstream *stream;
AudioPlaylist *playlist;
if ((stream = get_diskstream()) != 0 && (playlist = stream->playlist()) != 0) {
AudioTimeAxisView::cut_copy_clear (Selection& selection, CutCopyOp op)
{
Playlist* what_we_got;
- DiskStream* ds = get_diskstream();
+ AudioDiskstream* ds = get_diskstream();
Playlist* playlist;
bool ret = false;
}
}
+ XMLNode &before, &after;
switch (op) {
case Cut:
- _session.add_undo (playlist->get_memento());
+ before = playlist->get_state();
if ((what_we_got = playlist->cut (time)) != 0) {
editor.get_cut_buffer().add (what_we_got);
- _session.add_redo_no_execute (playlist->get_memento());
+ after = playlist->get_state();
+ _session.add_command (MementoCommand<Playlist>(*playlist, before, after));
ret = true;
}
break;
break;
case Clear:
- _session.add_undo (playlist->get_memento());
+ before = playlist->get_state();
if ((what_we_got = playlist->cut (time)) != 0) {
- _session.add_redo_no_execute (playlist->get_memento());
+ _session.add_command(MementoCommand<Playlist>(*playlist, before, after));
what_we_got->unref ();
ret = true;
}
if (get_diskstream()->speed() != 1.0f)
pos = session_frame_to_track_frame(pos, get_diskstream()->speed() );
- _session.add_undo (playlist->get_memento());
+ XMLNode &before = playlist->get_state();
playlist->paste (**p, pos, times);
- _session.add_redo_no_execute (playlist->get_memento());
+ _session.add_command(MementoCommand<Playlist>(*playlist, before,
+ playlist->get_state()));
return true;
}
break;
}
}
+
+bool
+AudioTimeAxisView::select_me (GdkEventButton* ev)
+{
+ editor.get_selection().add (this);
+ return false;
+}