patch from mantis user cth103 to fix up fixed-time cross-track drags
[ardour.git] / gtk2_ardour / automation_time_axis.cc
index 6e2a93889f46504cb5f4def427dc5603544b3096..c3f53d266c5740ea6d119a9ee1bda5852cad1c56 100644 (file)
@@ -21,6 +21,9 @@ using namespace PBD;
 using namespace Gtk;
 using namespace Editing;
 
+Pango::FontDescription AutomationTimeAxisView::name_font;
+bool AutomationTimeAxisView::have_name_font = false;
+
 AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Route> r, PublicEditor& e, TimeAxisView& rent, 
                                                ArdourCanvas::Canvas& canvas, const string & nom, 
                                                const string & state_name, const string & nomparent)
@@ -34,6 +37,11 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
          clear_button (_("clear")),
          auto_button (X_("")) /* force addition of a label */
 {
+       if (!have_name_font) {
+               name_font = get_font_for_style (X_("AutomationTrackName"));
+               have_name_font = true;
+       }
+
        automation_menu = 0;
        in_destructor = false;
        auto_off_item = 0;
@@ -43,31 +51,22 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
        ignore_state_request = false;
        first_call_to_set_height = true;
 
-       //      base_rect = gnome_canvas_item_new (GNOME_CANVAS_GROUP(canvas_display),
-       //                       gnome_canvas_simplerect_get_type(),
-       //                       "x1", 0.0,
-       //                       "y1", 0.0,
-       //                       "x2", 1000000.0,
-       //                       "outline_color_rgba", color_map[cAutomationTrackOutline],
-       //                       /* outline ends and bottom */
-       //                       "outline_what", (guint32) (0x1|0x2|0x8),
-       //                       "fill_color_rgba", color_map[cAutomationTrackFill],
-       //                       NULL);
        base_rect = new SimpleRect(*canvas_display);
        base_rect->property_x1() = 0.0;
        base_rect->property_y1() = 0.0;
-       base_rect->property_x2() = 1000000.0;
+       base_rect->property_x2() = max_frames;
        base_rect->property_outline_color_rgba() = color_map[cAutomationTrackOutline];
        /* outline ends and bottom */
        base_rect->property_outline_what() = (guint32) (0x1|0x2|0x8);
        base_rect->property_fill_color_rgba() = color_map[cAutomationTrackFill];
+       //base_rect->property_fill_color_rgba() = color_map[cEnteredControlPoint];
        
        base_rect->set_data ("trackview", this);
 
        base_rect->signal_event().connect (bind (mem_fun (editor, &PublicEditor::canvas_automation_track_event),
                                                 base_rect, this));
 
-       hide_button.add (*(manage (new Gtk::Image (get_xpm("small_x.xpm")))));
+       hide_button.add (*(manage (new Gtk::Image (::get_icon("hide")))));
 
        height_button.set_name ("TrackSizeButton");
        auto_button.set_name ("TrackVisualButton");
@@ -93,32 +92,28 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
 
        string shortpname = _name;
        bool shortened = false;
-       
-       if (_name.length()) {
-               if (shortpname.length() > 18) {
-                       shortpname = shortpname.substr (0, 16);
-                       shortpname += "...";
-                       shortened = true;
-               }
+
+       int ignore_width;
+       shortpname = fit_to_pixels (_name, 60, name_font, ignore_width, true);
+
+       if (shortpname != _name ){
+               shortened = true;
        }
+
        name_label.set_text (shortpname);
-       name_label.set_alignment (1.0, 0.5);
+       name_label.set_alignment (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
 
        if (nomparent.length()) {
 
                /* limit the plug name string */
 
-               string pname = nomparent;
-
-               if (pname.length() > 14) {
-                       pname = pname.substr (0, 11);
-                       pname += "...";
+               string pname = fit_to_pixels (nomparent, 60, name_font, ignore_width, true);
+               if (pname != nomparent) {
                        shortened = true;
                }
 
                plugname = new Label (pname);
                plugname->set_name (X_("TrackPlugName"));
-               plugname->set_alignment (1.0, 0.5);
                plugname->show();
                name_label.set_name (X_("TrackParameterName"));
                controls_table.remove (name_hbox);
@@ -160,7 +155,10 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
        controls_frame.set_shadow_type (Gtk::SHADOW_ETCHED_OUT);
 
        XMLNode* xml_node = get_parent_with_state()->get_child_xml_node (_state_name);
-       set_state (*xml_node);
+
+       if (xml_node) {
+               set_state (*xml_node);
+       } 
 
        /* make sure labels etc. are correct */
 
@@ -196,7 +194,7 @@ AutomationTimeAxisView::auto_clicked ()
                                           bind (mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Touch)));
        }
 
-       automation_menu->popup (1, 0);
+       automation_menu->popup (1, gtk_get_current_event_time());
 }
 
 
@@ -403,8 +401,13 @@ AutomationTimeAxisView::set_samples_per_unit (double spu)
 void
 AutomationTimeAxisView::hide_clicked ()
 {
+       // LAME fix for refreshing the hide button
+       hide_button.set_sensitive(false);
+       
        set_marked_for_display (false);
        hide ();
+       
+       hide_button.set_sensitive(true);
 }
 
 void
@@ -483,7 +486,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
        case Cut:
                if ((what_we_got = alist.cut (selection.time.front().start, selection.time.front().end)) != 0) {
                        editor.get_cut_buffer().add (what_we_got);
-                       _session.add_command(new MementoCommand<AutomationList>(alist, before, alist.get_state()));
+                       _session.add_command(new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
                        ret = true;
                }
                break;
@@ -495,7 +498,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
 
        case Clear:
                if ((what_we_got = alist.cut (selection.time.front().start, selection.time.front().end)) != 0) {
-                       _session.add_command(new MementoCommand<AutomationList>(alist, before, alist.get_state()));
+                       _session.add_command(new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
                        delete what_we_got;
                        what_we_got = 0;
                        ret = true;
@@ -527,7 +530,7 @@ AutomationTimeAxisView::reset_objects_one (AutomationLine& line, PointSelection&
 {
        AutomationList& alist (line.the_list());
 
-       _session.add_command (new MementoUndoCommand<AutomationList>(alist, alist.get_state()));
+       _session.add_command (new MementoCommand<AutomationList>(alist, &alist.get_state(), 0));
 
        for (PointSelection::iterator i = selection.begin(); i != selection.end(); ++i) {
 
@@ -570,7 +573,7 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
                case Cut:
                        if ((what_we_got = alist.cut ((*i).start, (*i).end)) != 0) {
                                editor.get_cut_buffer().add (what_we_got);
-                               _session.add_command (new MementoCommand<AutomationList>(alist, before, alist.get_state()));
+                               _session.add_command (new MementoCommand<AutomationList>(alist, new XMLNode (before), &alist.get_state()));
                                ret = true;
                        }
                        break;
@@ -582,7 +585,7 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
                        
                case Clear:
                        if ((what_we_got = alist.cut ((*i).start, (*i).end)) != 0) {
-                               _session.add_command (new MementoCommand<AutomationList>(alist, before, alist.get_state()));
+                               _session.add_command (new MementoCommand<AutomationList>(alist, new XMLNode (before), &alist.get_state()));
                                delete what_we_got;
                                what_we_got = 0;
                                ret = true;
@@ -590,7 +593,9 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
                        break;
                }
        }
-               
+
+       delete &before;
+
        if (what_we_got) {
                for (AutomationList::iterator x = what_we_got->begin(); x != what_we_got->end(); ++x) {
                        double foo = (*x)->value;
@@ -603,7 +608,7 @@ AutomationTimeAxisView::cut_copy_clear_objects_one (AutomationLine& line, PointS
 }
 
 bool
-AutomationTimeAxisView::paste (jack_nframes_t pos, float times, Selection& selection, size_t nth)
+AutomationTimeAxisView::paste (nframes_t pos, float times, Selection& selection, size_t nth)
 {
        bool ret = true;
 
@@ -615,7 +620,7 @@ AutomationTimeAxisView::paste (jack_nframes_t pos, float times, Selection& selec
 }
 
 bool
-AutomationTimeAxisView::paste_one (AutomationLine& line, jack_nframes_t pos, float times, Selection& selection, size_t nth)
+AutomationTimeAxisView::paste_one (AutomationLine& line, nframes_t pos, float times, Selection& selection, size_t nth)
 {
        AutomationSelection::iterator p;
        AutomationList& alist (line.the_list());
@@ -641,7 +646,7 @@ AutomationTimeAxisView::paste_one (AutomationLine& line, jack_nframes_t pos, flo
 
         XMLNode &before = alist.get_state();
        alist.paste (copy, pos, times);
-       _session.add_command (new MementoCommand<AutomationList>(alist, before, alist.get_state()));
+       _session.add_command (new MementoCommand<AutomationList>(alist, &before, &alist.get_state()));
 
        return true;
 }
@@ -671,7 +676,7 @@ AutomationTimeAxisView::remove_ghost (GhostRegion* gr)
 }
 
 void
-AutomationTimeAxisView::get_selectables (jack_nframes_t start, jack_nframes_t end, double top, double bot, list<Selectable*>& results)
+AutomationTimeAxisView::get_selectables (nframes_t start, nframes_t end, double top, double bot, list<Selectable*>& results)
 {
        if (!lines.empty() && touched (top, bot)) {
                double topfrac;