the return of VST support
[ardour.git] / gtk2_ardour / time_axis_view.cc
index 8eb58d0c610d360b777adeb69168bc55e3a68edd..b5ab5baa1098a6868cacc0ffda3ef24dc2558400 100644 (file)
@@ -24,7 +24,7 @@
 #include <string>
 #include <list>
 
-#include <libgnomecanvasmm/libgnomecanvasmm.h>
+#include <libgnomecanvasmm.h>
 #include <libgnomecanvasmm/canvas.h>
 #include <libgnomecanvasmm/item.h>
 
@@ -55,16 +55,30 @@ using namespace Gtk;
 using namespace Gdk;
 using namespace sigc; 
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Editing;
 using namespace ArdourCanvas;
 
 const double trim_handle_size = 6.0; /* pixels */
 
+uint32_t TimeAxisView::hLargest = 0;
+uint32_t TimeAxisView::hLarge = 0;
+uint32_t TimeAxisView::hLarger = 0;
+uint32_t TimeAxisView::hNormal = 0;
+uint32_t TimeAxisView::hSmaller = 0;
+uint32_t TimeAxisView::hSmall = 0;
+bool TimeAxisView::need_size_info = true;
+
 TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisView* rent, Canvas& canvas) 
        : AxisView (sess), 
          editor (ed),
-         controls_table (2, 9)
+         controls_table (2, 8)
 {
+       if (need_size_info) {
+               compute_controls_size_info ();
+               need_size_info = false;
+       }
+
        canvas_display = new Group (*canvas.root(), 0.0, 0.0);
        
        selection_group = new Group (*canvas_display);
@@ -80,6 +94,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        parent = rent;
        _has_state = false;
        last_name_entry_key_press_event = 0;
+       name_packing = NamePackingBits (0);
 
        /*
          Create the standard LHS Controls
@@ -99,27 +114,20 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        name_label.set_name ("TrackLabel");
        name_label.set_alignment (0.0, 0.5);
 
-       // name_hbox.set_border_width (2);
-       // name_hbox.set_spacing (5);
-
        /* typically, either name_label OR name_entry are visible,
           but not both. its up to derived classes to show/hide them as they
           wish.
        */
 
-       name_hbox.pack_start (name_label, true, true);
-       name_hbox.pack_start (name_entry, true, true);
        name_hbox.show ();
 
        controls_table.set_border_width (2);
        controls_table.set_row_spacings (0);
        controls_table.set_col_spacings (0);
        controls_table.set_homogeneous (true);
-       controls_table.show ();
-
-       controls_table.attach (name_hbox, 0, 5, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
 
-       controls_table.show ();
+       controls_table.attach (name_hbox, 0, 4, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND);
+       controls_table.show_all ();
 
        controls_vbox.pack_start (controls_table, false, false);
        controls_vbox.show ();
@@ -141,6 +149,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        controls_frame.set_name ("TimeAxisViewControlsBaseUnselected");
        controls_frame.set_shadow_type (Gtk::SHADOW_OUT);
 
+       ColorChanged.connect (mem_fun (*this, &TimeAxisView::color_handler));
 }
 
 TimeAxisView::~TimeAxisView()
@@ -176,11 +185,6 @@ TimeAxisView::~TimeAxisView()
                delete display_menu;
                display_menu = 0;
        }
-
-       if (size_menu) {
-               delete size_menu;
-               size_menu = 0;
-       }
 }
 
 guint32
@@ -241,14 +245,14 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
 {
        switch (ev->direction) {
        case GDK_SCROLL_UP:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
                        step_height (true);
                        return true;
                }
                break;
                
        case GDK_SCROLL_DOWN:
-               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Control)) {
+               if (Keyboard::modifier_state_equals (ev->state, Keyboard::Shift)) {
                        step_height (false);
                        return true;
                }
@@ -325,36 +329,48 @@ TimeAxisView::hide ()
 void
 TimeAxisView::step_height (bool bigger)
 {
-       switch (height) {
-       case Largest:
-               if (!bigger) set_height (Large);
-               break;
-       case Large:
-               if (bigger) set_height (Largest);
-               else set_height (Larger);
-               break;
-       case Larger:
-               if (bigger) set_height (Large);
-               else set_height (Normal);
-               break;
-       case Normal:
-               if (bigger) set_height (Larger);
-               else set_height (Smaller);
-               break;
-       case Smaller:
-               if (bigger) set_height (Normal);
-               else set_height (Small);
-               break;
-       case Small:
-               if (bigger) set_height (Smaller);
-               break;
-       }
+  
+       if (height == hLargest) {
+               if (!bigger) set_height (Large);
+               return;
+       }
+       if (height == hLarge) {
+               if (bigger) set_height (Largest);
+                else set_height (Larger);
+               return;
+       }
+       if (height == hLarger) {
+                if (bigger) set_height (Large);
+                else set_height (Normal);
+               return;
+       }
+       if (height == hNormal) {
+                if (bigger) set_height (Larger);
+                else set_height (Smaller);
+               return;
+       }
+       if (height == hSmaller) {
+                if (bigger) set_height (Normal);
+                else set_height (Small);
+               return;
+       }
+       if (height == hSmall) {
+                if (bigger) set_height (Smaller);
+               return;
+       }
 }
 
 void
 TimeAxisView::set_height (TrackHeight h)
 {
-       height = (gint32) h;
+       height_style = h;
+       set_height_pixels (height_to_pixels (h));
+}
+
+void
+TimeAxisView::set_height_pixels (uint32_t h)
+{
+       height = h;
        controls_frame.set_size_request (-1, height);
 
        if (canvas_item_visible (selection_group)) {
@@ -534,7 +550,7 @@ TimeAxisView::build_size_menu ()
        items.push_back (MenuElem (_("Large"), bind (mem_fun (*this, &TimeAxisView::set_height), Large)));
        items.push_back (MenuElem (_("Larger"), bind (mem_fun (*this, &TimeAxisView::set_height), Larger)));
        items.push_back (MenuElem (_("Normal"), bind (mem_fun (*this, &TimeAxisView::set_height), Normal)));
-       items.push_back (MenuElem (_("Smaller"), bind (mem_fun (*this, &TimeAxisView::set_height), Smaller)));
+       items.push_back (MenuElem (_("Smaller"), bind (mem_fun (*this, &TimeAxisView::set_height),Smaller)));
        items.push_back (MenuElem (_("Small"), bind (mem_fun (*this, &TimeAxisView::set_height), Small)));
 }
 
@@ -608,8 +624,8 @@ TimeAxisView::show_selection (TimeSelection& ts)
 
                rect = get_selection_rect ((*i).id);
                
-               x1 = start / editor.get_current_zoom();
-               x2 = (start + cnt - 1) / editor.get_current_zoom();
+               x1 = editor.frame_to_unit (start);
+               x2 = editor.frame_to_unit (start + cnt - 1);
                y2 = height;
 
                rect->rect->property_x1() = x1;
@@ -645,6 +661,8 @@ TimeAxisView::show_selection (TimeSelection& ts)
 void
 TimeAxisView::reshow_selection (TimeSelection& ts)
 {
+       cerr << name() << ": reshow selection" << endl;
+
        show_selection (ts);
 
        for (vector<TimeAxisView*>::iterator i = children.begin(); i != children.end(); ++i) {
@@ -861,14 +879,159 @@ TimeAxisView::set_state (const XMLNode& node)
 void
 TimeAxisView::reset_height()
 {
-       set_height ((TrackHeight) height);
+       set_height_pixels (height);
 
        for (vector<TimeAxisView*>::iterator i = children.begin(); i != children.end(); ++i) {
                (*i)->set_height ((TrackHeight)(*i)->height);
        }
 }
        
+uint32_t
+TimeAxisView::height_to_pixels (TrackHeight h)
+{
+       switch (h) {
+       case Largest:
+               return hLargest;
+       case Large:
+               return hLarge;
+       case Larger:
+               return hLarger;
+       case Normal:
+               return hNormal;
+       case Smaller:
+               return hSmaller;
+       case Small:
+               return hSmall;
+       }
+       
+       // what is wrong with gcc ?
+       
+       return hNormal;
+}
+                       
+void
+TimeAxisView::compute_controls_size_info ()
+{
+       Gtk::Window window (Gtk::WINDOW_TOPLEVEL);
+       Gtk::Table two_row_table (2, 8);
+       Gtk::Table one_row_table (1, 8);
+       Button* buttons[5];
+       const int border_width = 2;
+       const int extra_height = (2 * border_width) + 2; // 2 pixels for the controls frame
+
+       window.add (one_row_table);
+
+       one_row_table.set_border_width (border_width);
+       one_row_table.set_row_spacings (0);
+       one_row_table.set_col_spacings (0);
+       one_row_table.set_homogeneous (true);
+
+       two_row_table.set_border_width (border_width);
+       two_row_table.set_row_spacings (0);
+       two_row_table.set_col_spacings (0);
+       two_row_table.set_homogeneous (true);
+
+       for (int i = 0; i < 5; ++i) {
+               buttons[i] = manage (new Button (X_("f")));
+               buttons[i]->set_name ("TrackMuteButton");
+       }
+
+       Gtk::Requisition req;
+
+       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 ();
+       one_row_table.size_request (req);
+
+
+       // height required to show 1 row of buttons
+
+       hSmaller = req.height + extra_height;
+
+       window.remove ();
+       window.add (two_row_table);
+
+       two_row_table.attach (*buttons[1], 5, 6, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+       two_row_table.attach (*buttons[2], 6, 7, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+       two_row_table.attach (*buttons[3], 7, 8, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+       two_row_table.attach (*buttons[4], 8, 9, 0, 1, Gtk::FILL|Gtk::EXPAND, Gtk::FILL|Gtk::EXPAND, 0, 0);
+
+       two_row_table.show_all ();
+       two_row_table.size_request (req);
+
+       // height required to show all normal buttons 
+
+       hNormal = req.height + extra_height;
+
+       // these heights are all just larger than normal. no more 
+       // elements are visible (yet).
+
+       hLarger = hNormal + 50;
+       hLarge = hNormal + 150;
+       hLargest = hNormal + 250;
+
+       // height required to show track name
+
+       hSmall = 27;
+}
+
 void
-TimeAxisView::check_height (Gdk::Rectangle& r)
+TimeAxisView::show_name_label ()
 {
+       if (!(name_packing & NameLabelPacked)) {
+               name_hbox.pack_start (name_label, true, true);
+               name_packing = NamePackingBits (name_packing | NameLabelPacked);
+               name_hbox.show ();
+               name_label.show ();
+       }
+}
+
+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 ();
+       }
+}
+
+void
+TimeAxisView::hide_name_label ()
+{
+       if (name_packing & NameLabelPacked) {
+               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);
+       }
+}
+
+void
+TimeAxisView::color_handler (ColorID id, uint32_t val)
+{
+       switch (id) {
+       case cSelectionRectFill:
+               break;
+       case cSelectionRectOutline:
+               break;
+       case cSelectionStartFill:
+               break;
+       case cSelectionStartOutline:
+               break;
+       case cSelectionEndFill:
+               break;
+       case cSelectionEndOutline:
+               break;
+       default:
+               break;
+       }
 }