fix re-drawing of splitting icon
[ardour.git] / gtk2_ardour / editor_rulers.cc
index 0cfbcdfaa40cea8443695f935774e883a65938a3..2752f96553e68fed20ee1779f61d32408beee2b7 100644 (file)
@@ -131,6 +131,7 @@ Editor::initialize_rulers ()
        lab_children.push_back (Element(transport_mark_label, PACK_SHRINK, PACK_START));
        lab_children.push_back (Element(cd_mark_label, PACK_SHRINK, PACK_START));
        lab_children.push_back (Element(mark_label, PACK_SHRINK, PACK_START));
+       lab_children.push_back (Element(videotl_label, PACK_SHRINK, PACK_START));
 
        ruler_lab_children.push_back (Element(minsec_label, PACK_SHRINK, PACK_START));
        ruler_children.insert (canvaspos, Element(*minsec_ruler, PACK_SHRINK, PACK_START));
@@ -368,6 +369,30 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t)
                ruler_items.push_back (SeparatorElem ());
                break;
 
+       case VideoBarItem:
+               ruler_items.push_back (MenuElem (_("Timeline height")));
+               static_cast<MenuItem*>(&ruler_items.back())->set_sensitive(false);
+               ruler_items.push_back (CheckMenuElem (_("Large"),  sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 6)));
+               if (videotl_bar_height == 6) { static_cast<CheckMenuItem*>(&ruler_items.back())->set_active(true);}
+               ruler_items.push_back (CheckMenuElem (_("Normal"), sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 4)));
+               if (videotl_bar_height == 4) { static_cast<CheckMenuItem*>(&ruler_items.back())->set_active(true);}
+               ruler_items.push_back (CheckMenuElem (_("Small"),  sigc::bind ( sigc::mem_fun(*this, &Editor::set_video_timeline_height), 3)));
+               if (videotl_bar_height == 3) { static_cast<CheckMenuItem*>(&ruler_items.back())->set_active(true);}
+               ruler_items.push_back (SeparatorElem ());
+
+               ruler_items.push_back (MenuElem (_("Align Video Track")));
+               static_cast<MenuItem*>(&ruler_items.back())->set_sensitive(false);
+
+               ruler_items.push_back (CheckMenuElem (_("Lock")));
+               {
+               CheckMenuItem* vtl_lock = static_cast<CheckMenuItem*>(&ruler_items.back());
+               vtl_lock->set_active(is_video_timeline_locked());
+               vtl_lock->signal_activate().connect (sigc::mem_fun(*this, &Editor::toggle_video_timeline_locked));
+               }
+
+               ruler_items.push_back (SeparatorElem ());
+               break;
+
        default:
                break;
        }
@@ -418,6 +443,10 @@ Editor::popup_ruler_menu (framepos_t where, ItemType t)
        if (action) {
                ruler_items.push_back (MenuElem (*action->create_menu_item()));
        }
+       action = ActionManager::get_action ("Rulers", "toggle-video-ruler");
+       if (action) {
+               ruler_items.push_back (MenuElem (*action->create_menu_item()));
+       }
 
        editor_ruler_menu->popup (1, gtk_get_current_event_time());
 
@@ -439,6 +468,7 @@ Editor::store_ruler_visibility ()
        node->add_property (X_("rangemarker"), ruler_range_action->get_active() ? "yes": "no");
        node->add_property (X_("transportmarker"), ruler_loop_punch_action->get_active() ? "yes": "no");
        node->add_property (X_("cdmarker"), ruler_cd_marker_action->get_active() ? "yes": "no");
+       node->add_property (X_("videotl"), ruler_video_action->get_active() ? "yes": "no");
 
        _session->add_extra_xml (*node);
        _session->set_dirty ();
@@ -539,6 +569,14 @@ Editor::restore_ruler_visibility ()
                        }
                }
 
+               if ((prop = node->property ("videotl")) != 0) {
+                       if (string_is_affirmative (prop->value())) {
+                               ruler_video_action->set_active (true);
+                       } else {
+                               ruler_video_action->set_active (false);
+                       }
+               }
+
        }
 
        no_ruler_shown_update = false;
@@ -604,6 +642,7 @@ Editor::update_ruler_visibility ()
        transport_mark_label.hide();
        cd_mark_label.hide();
        mark_label.hide();
+       videotl_label.hide();
 #endif
        if (ruler_meter_action->get_active()) {
                old_unit_pos = meter_group->property_y();
@@ -736,6 +775,29 @@ Editor::update_ruler_visibility ()
                mark_label.hide();
        }
 
+       if (ruler_video_action->get_active()) {
+               old_unit_pos = videotl_group->property_y();
+               if (tbpos != old_unit_pos) {
+                       videotl_group->move ( 0.0, tbpos - old_unit_pos);
+               }
+               old_unit_pos = videotl_bar_group->property_y();
+               if (tbgpos != old_unit_pos) {
+                       videotl_bar_group->move ( 0.0, tbgpos - old_unit_pos);
+               }
+               videotl_bar_group->show();
+               videotl_group->show();
+               videotl_label.show();
+               tbpos += timebar_height * videotl_bar_height;
+               tbgpos += timebar_height * videotl_bar_height;
+               visible_timebars+=videotl_bar_height;
+         queue_visual_videotimeline_update();
+       } else {
+               videotl_bar_group->hide();
+               videotl_group->hide();
+               videotl_label.hide();
+         update_video_timeline(true);
+       }
+
        gdouble old_canvas_timebars_vsize = canvas_timebars_vsize;
        canvas_timebars_vsize = (timebar_height * visible_timebars) - 1;
        gdouble vertical_pos_delta = canvas_timebars_vsize - old_canvas_timebars_vsize;
@@ -854,6 +916,9 @@ Editor::update_tempo_based_rulers (ARDOUR::TempoMap::BBTPointList::const_iterato
                return;
        }
 
+       compute_bbt_ruler_scale (leftmost_frame, leftmost_frame+current_page_frames(),
+                                begin, end);
+
        ruler_metrics[ruler_metric_bbt].units_per_pixel = frames_per_unit;
 
        if (ruler_bbt_action->get_active()) {