new hellenic translation, plus new names in about dialog
[ardour.git] / gtk2_ardour / automation_time_axis.cc
index 7025a11178371dfef981b576f72e890af63a2dcd..0da3a38fdc64ffbb9790e750ba38d50239ddfbdb 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,14 +92,14 @@ 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 (Gtk::ALIGN_CENTER, Gtk::ALIGN_CENTER);
 
@@ -108,11 +107,8 @@ AutomationTimeAxisView::AutomationTimeAxisView (Session& s, boost::shared_ptr<Ro
 
                /* 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;
                }
 
@@ -159,11 +155,15 @@ 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 */
 
        automation_state_changed ();
+       ColorChanged.connect (mem_fun (*this, &AutomationTimeAxisView::color_handler));
 }
 
 AutomationTimeAxisView::~AutomationTimeAxisView ()
@@ -195,7 +195,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());
 }
 
 
@@ -402,8 +402,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
@@ -482,7 +487,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;
@@ -494,7 +499,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;
@@ -526,7 +531,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) {
 
@@ -569,7 +574,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;
@@ -581,7 +586,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;
@@ -589,7 +594,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;
@@ -602,7 +609,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;
 
@@ -614,7 +621,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());
@@ -640,7 +647,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;
 }
@@ -670,7 +677,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;
@@ -680,7 +687,7 @@ AutomationTimeAxisView::get_selectables (jack_nframes_t start, jack_nframes_t en
                   y_position is the "origin" or "top" of the track.
                */
 
-               double mybot = y_position + height; // XXX need to include Editor::track_spacing; 
+               double mybot = y_position + height;
 
                if (y_position >= top && mybot <= bot) {
 
@@ -781,6 +788,42 @@ AutomationTimeAxisView::exited ()
        hide_all_but_selected_control_points ();
 }
 
+void
+AutomationTimeAxisView::set_colors () {
+
+    for( list<GhostRegion *>::iterator i=ghosts.begin(); i != ghosts.end(); i++ ) {
+       (*i)->set_colors();
+    }
+    
+    for( vector<AutomationLine *>::iterator i=lines.begin(); i != lines.end(); i++ ) {
+       (*i)->set_colors();
+    }
+
+}
+
+void
+AutomationTimeAxisView::color_handler (ColorID id, uint32_t val) {
+    
+       switch (id) {
+       case cGhostTrackWave:
+       case cGhostTrackWaveClip:
+       case cGhostTrackZeroLine:
+
+       case cControlPoint:
+       case cControlPointFill:
+       case cControlPointOutline:
+       case cAutomationLine:
+               set_colors ();
+
+               break;
+
+       default: 
+               break;
+       }
+}
+
+
+
 void
 AutomationTimeAxisView::set_state (const XMLNode& node)
 {