summaryrefslogtreecommitdiff
path: root/gtk2_ardour/midi_time_axis.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/midi_time_axis.cc')
-rw-r--r--gtk2_ardour/midi_time_axis.cc298
1 files changed, 298 insertions, 0 deletions
diff --git a/gtk2_ardour/midi_time_axis.cc b/gtk2_ardour/midi_time_axis.cc
new file mode 100644
index 0000000000..081fc543db
--- /dev/null
+++ b/gtk2_ardour/midi_time_axis.cc
@@ -0,0 +1,298 @@
+/*
+ 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <cstdlib>
+#include <cmath>
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include <sigc++/bind.h>
+
+#include <pbd/error.h>
+#include <pbd/stl_delete.h>
+#include <pbd/whitespace.h>
+
+#include <gtkmm2ext/gtk_ui.h>
+#include <gtkmm2ext/selector.h>
+#include <gtkmm2ext/stop_signal.h>
+#include <gtkmm2ext/bindable_button.h>
+#include <gtkmm2ext/utils.h>
+
+#include <ardour/midi_playlist.h>
+#include <ardour/midi_diskstream.h>
+#include <ardour/insert.h>
+#include <ardour/ladspa_plugin.h>
+#include <ardour/location.h>
+#include <ardour/playlist.h>
+#include <ardour/session.h>
+#include <ardour/session_playlist.h>
+#include <ardour/utils.h>
+
+#include "ardour_ui.h"
+#include "midi_time_axis.h"
+#include "automation_time_axis.h"
+#include "canvas_impl.h"
+#include "crossfade_view.h"
+#include "enums.h"
+#include "gui_thread.h"
+#include "keyboard.h"
+#include "playlist_selector.h"
+#include "plugin_selector.h"
+#include "plugin_ui.h"
+#include "point_selection.h"
+#include "prompter.h"
+#include "public_editor.h"
+#include "redirect_automation_line.h"
+#include "redirect_automation_time_axis.h"
+#include "regionview.h"
+#include "rgb_macros.h"
+#include "selection.h"
+#include "simplerect.h"
+#include "midi_streamview.h"
+#include "utils.h"
+
+#include <ardour/midi_track.h>
+
+#include "i18n.h"
+
+using namespace ARDOUR;
+using namespace PBD;
+using namespace Gtk;
+using namespace Editing;
+
+
+MidiTimeAxisView::MidiTimeAxisView (PublicEditor& ed, Session& sess, Route& rt, Canvas& canvas)
+ : AxisView(sess), // FIXME: won't compile without this, why??
+ RouteTimeAxisView(ed, sess, rt, canvas)
+{
+ subplugin_menu.set_name ("ArdourContextMenu");
+
+ _view = new MidiStreamView (*this);
+
+ ignore_toggle = false;
+
+ mute_button->set_active (false);
+ solo_button->set_active (false);
+
+ if (is_midi_track())
+ controls_ebox.set_name ("MidiTimeAxisViewControlsBaseUnselected");
+ else // bus
+ controls_ebox.set_name ("MidiBusControlsBaseUnselected");
+
+ /* map current state of the route */
+
+ //redirects_changed (0);
+
+ ensure_xml_node ();
+
+ set_state (*xml_node);
+
+ //_route.redirects_changed.connect (mem_fun(*this, &MidiTimeAxisView::redirects_changed));
+
+ if (is_midi_track()) {
+
+ controls_ebox.set_name ("MidiTrackControlsBaseUnselected");
+ controls_base_selected_name = "MidiTrackControlsBaseSelected";
+ controls_base_unselected_name = "MidiTrackControlsBaseUnselected";
+
+ /* ask for notifications of any new RegionViews */
+ //view->MidiRegionViewAdded.connect (mem_fun(*this, &MidiTimeAxisView::region_view_added));
+ //view->attach ();
+
+ } else { /* bus */
+
+ controls_ebox.set_name ("MidiBusControlsBaseUnselected");
+ controls_base_selected_name = "MidiBusControlsBaseSelected";
+ controls_base_unselected_name = "MidiBusControlsBaseUnselected";
+ }
+}
+
+MidiTimeAxisView::~MidiTimeAxisView ()
+{
+}
+
+guint32
+MidiTimeAxisView::show_at (double y, int& nth, Gtk::VBox *parent)
+{
+ ensure_xml_node ();
+ xml_node->add_property ("shown_editor", "yes");
+
+ return TimeAxisView::show_at (y, nth, parent);
+}
+
+void
+MidiTimeAxisView::hide ()
+{
+ ensure_xml_node ();
+ xml_node->add_property ("shown_editor", "no");
+
+ TimeAxisView::hide ();
+}
+
+void
+MidiTimeAxisView::set_state (const XMLNode& node)
+{
+ const XMLProperty *prop;
+
+ TimeAxisView::set_state (node);
+
+ if ((prop = node.property ("shown_editor")) != 0) {
+ if (prop->value() == "no") {
+ _marked_for_display = false;
+ } else {
+ _marked_for_display = true;
+ }
+ } else {
+ _marked_for_display = true;
+ }
+
+ XMLNodeList nlist = node.children();
+ XMLNodeConstIterator niter;
+ XMLNode *child_node;
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ child_node = *niter;
+
+ // uh... do stuff..
+ }
+}
+
+void
+MidiTimeAxisView::build_display_menu ()
+{
+ using namespace Menu_Helpers;
+
+ /* get the size menu ready */
+
+ build_size_menu ();
+
+ /* prepare it */
+
+ TimeAxisView::build_display_menu ();
+
+ /* now fill it with our stuff */
+
+ MenuList& items = display_menu->items();
+ display_menu->set_name ("ArdourContextMenu");
+
+ items.push_back (MenuElem (_("Height"), *size_menu));
+ items.push_back (MenuElem (_("Color"), mem_fun(*this, &MidiTimeAxisView::select_track_color)));
+
+
+ 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 (SeparatorElem());
+
+ automation_items.push_back (MenuElem (_("Plugins"), subplugin_menu));
+
+ if (is_midi_track()) {
+
+ Menu* alignment_menu = manage (new Menu);
+ MenuList& alignment_items = alignment_menu->items();
+ alignment_menu->set_name ("ArdourContextMenu");
+
+ RadioMenuItem::Group align_group;
+
+ alignment_items.push_back (RadioMenuElem (align_group, _("Align with existing material"), bind (mem_fun(*this, &MidiTimeAxisView::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, &MidiTimeAxisView::set_align_style), CaptureTime)));
+ align_capture_item = dynamic_cast<RadioMenuItem*>(&alignment_items.back());
+ if (get_diskstream()->alignment_style() == CaptureTime) {
+ align_capture_item->set_active();
+ }
+
+ items.push_back (MenuElem (_("Alignment"), *alignment_menu));
+
+ get_diskstream()->AlignmentStyleChanged.connect (mem_fun(*this, &MidiTimeAxisView::align_style_changed));
+ }
+
+ items.push_back (SeparatorElem());
+ items.push_back (CheckMenuElem (_("Active"), mem_fun(*this, &RouteUI::toggle_route_active)));
+ route_active_menu_item = dynamic_cast<CheckMenuItem *> (&items.back());
+ route_active_menu_item->set_active (_route.active());
+
+ items.push_back (SeparatorElem());
+ items.push_back (MenuElem (_("Remove"), mem_fun(*this, &RouteUI::remove_this_route)));
+
+}
+
+// FIXME: duplicated in audio_time_axis.cc
+/*static string
+legalize_for_xml_node (string str)
+{
+ string::size_type pos;
+ string legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=:";
+ string legal;
+
+ legal = str;
+ pos = 0;
+
+ while ((pos = legal.find_first_not_of (legal_chars, pos)) != string::npos) {
+ legal.replace (pos, 1, "_");
+ pos += 1;
+ }
+
+ return legal;
+}*/
+
+void
+MidiTimeAxisView::route_active_changed ()
+{
+ RouteUI::route_active_changed ();
+
+ if (is_midi_track()) {
+ if (_route.active()) {
+ controls_ebox.set_name ("MidiTrackControlsBaseUnselected");
+ controls_base_selected_name = "MidiTrackControlsBaseSelected";
+ controls_base_unselected_name = "MidiTrackControlsBaseUnselected";
+ } else {
+ controls_ebox.set_name ("MidiTrackControlsBaseInactiveUnselected");
+ controls_base_selected_name = "MidiTrackControlsBaseInactiveSelected";
+ controls_base_unselected_name = "MidiTrackControlsBaseInactiveUnselected";
+ }
+ } else {
+ if (_route.active()) {
+ controls_ebox.set_name ("BusControlsBaseUnselected");
+ controls_base_selected_name = "BusControlsBaseSelected";
+ controls_base_unselected_name = "BusControlsBaseUnselected";
+ } else {
+ controls_ebox.set_name ("BusControlsBaseInactiveUnselected");
+ controls_base_selected_name = "BusControlsBaseInactiveSelected";
+ controls_base_unselected_name = "BusControlsBaseInactiveUnselected";
+ }
+ }
+}
+
+XMLNode*
+MidiTimeAxisView::get_child_xml_node (const string & childname)
+{
+ return RouteUI::get_child_xml_node (childname);
+}
+