adjusting region fade in/out lengths makes the fade in/out active; new font sizes...
[ardour.git] / gtk2_ardour / editor_canvas.cc
index 28bbaf2ce2266db7140b3e140f6e96669588efa9..a5922fc5157dc906f39e645efa0a91450ee49411 100644 (file)
@@ -102,6 +102,9 @@ Editor::initialize_canvas ()
        track_canvas.signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event));
        track_canvas.signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event));
 
+       /* just scroll stuff for the timecanvas */
+       time_canvas.signal_scroll_event().connect (mem_fun (*this, &Editor::time_canvas_scroll_event));
+
        track_canvas.set_name ("EditorMainCanvas");
        track_canvas.add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK);
        track_canvas.signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas));
@@ -279,7 +282,6 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc)
        } 
 
        initial_ruler_update_required = false;
-       
        track_canvas_size_allocated ();
 }
 
@@ -316,41 +318,26 @@ Editor::track_canvas_size_allocated ()
 
        if (playhead_cursor) playhead_cursor->set_length (canvas_height);
 
-       // EDIT CURSOR XXX set line height for selected markers here
-
-       if (range_marker_drag_rect) {
-               range_marker_drag_rect->property_y1() = 0.0;
-               range_marker_drag_rect->property_y2() = canvas_height;
+       double y1 = vertical_adjustment.get_value ();
+       
+       for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {
+               (*x)->set_line_vpos (y1, canvas_height);
        }
 
-       if (transport_loop_range_rect) {
-               transport_loop_range_rect->property_y1() = 0.0;
-               transport_loop_range_rect->property_y2() = canvas_height;
-       }
-
-       if (transport_punch_range_rect) {
-               transport_punch_range_rect->property_y1() = 0.0;
-               transport_punch_range_rect->property_y2() = canvas_height;
-       }
-
-       if (transport_punchin_line) {
-               transport_punchin_line->property_y1() = 0.0;
-               transport_punchin_line->property_y2() = canvas_height;
-       }
-
-       if (transport_punchout_line) {
-               transport_punchout_line->property_y1() = 0.0;
-               transport_punchout_line->property_y2() = canvas_height;
-       }
-               
+       range_marker_drag_rect->property_y1() = y1;
+       range_marker_drag_rect->property_y2() = full_canvas_height;
+       transport_loop_range_rect->property_y1() = y1;
+       transport_loop_range_rect->property_y2() = full_canvas_height;
+       transport_punch_range_rect->property_y1() = y1;
+       transport_punch_range_rect->property_y2() = full_canvas_height;
+       transport_punchin_line->property_y1() = y1;
+       transport_punchin_line->property_y2() = full_canvas_height;
+       transport_punchout_line->property_y1() = y1;
+       transport_punchout_line->property_y2() = full_canvas_height;
+       
        update_fixed_rulers();
        redisplay_tempo (true);
 
-       if (logo_item) {
-               // logo_item->property_height() = canvas_height;
-               // logo_item->property_width() = canvas_width;
-       }
-
        Resized (); /* EMIT_SIGNAL */
 
        return false;
@@ -370,12 +357,20 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc)
                }
        }
 
-       double last_canvas_unit =  last_canvas_frame / frames_per_unit;
+       double last_canvas_unit =  max ((last_canvas_frame / frames_per_unit), canvas_width);
 
-       track_canvas.set_scroll_region (0.0, 0.0, max (last_canvas_unit, canvas_width), pos);
+       track_canvas.set_scroll_region (0.0, 0.0, last_canvas_unit, pos);
 
        // XXX what is the correct height value for the time canvas ? this overstates it
-       time_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height);
+       time_canvas.set_scroll_region ( 0.0, 0.0, last_canvas_unit, canvas_height);
+
+       range_marker_drag_rect->property_y2() = canvas_height;
+       transport_loop_range_rect->property_y2() = canvas_height;
+       transport_punch_range_rect->property_y2() = canvas_height;
+       transport_punchin_line->property_y2() = canvas_height;
+       transport_punchout_line->property_y2() = canvas_height;
+
+       update_punch_range_view (true);
 
        controls_layout.queue_resize();
 }
@@ -387,8 +382,8 @@ Editor::controls_layout_size_request (Requisition* req)
        TreeModel::Children::iterator i;
        double pos;
 
-        for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
-               TimeAxisView *tv = (*i)[route_display_columns.tv];
+       for (pos = 0, i = rows.begin(); i != rows.end(); ++i) {
+               TimeAxisView *tv = (*i)[route_display_columns.tv];
                if (tv != 0) {
                        pos += tv->effective_height;
                }
@@ -400,12 +395,9 @@ Editor::controls_layout_size_request (Requisition* req)
                screen = Gdk::Screen::get_default();
        }
 
-       /* never let the width of the controls area shrink horizontally */
-
        edit_controls_vbox.check_resize();
-
        req->width = max (edit_controls_vbox.get_width(),  controls_layout.get_width());
-       
+
        /* don't get too big. the fudge factors here are just guesses */
        
        req->width = min (req->width, screen->get_width() - 300);
@@ -414,8 +406,13 @@ Editor::controls_layout_size_request (Requisition* req)
        /* this one is important: it determines how big the layout thinks it really is, as 
           opposed to what it displays on the screen
        */
+       
+       controls_layout.set_size (edit_controls_vbox.get_width(), (gint) pos);
+       controls_layout.set_size_request(edit_controls_vbox.get_width(), -1);
+       zoom_box.set_size_request(edit_controls_vbox.get_width(), -1);
+       time_button_frame.set_size_request(edit_controls_vbox.get_width() + edit_vscrollbar.get_width(), -1);
 
-       controls_layout.set_size (req->width, (gint) pos);
+       //cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG        
 }
 
 bool
@@ -438,6 +435,8 @@ Editor::track_canvas_drag_data_received (const RefPtr<Gdk::DragContext>& context
                                         const SelectionData& data,
                                         guint info, guint time)
 {
+       cerr << "drop on canvas, target = " << data.get_target() << endl;
+
        if (data.get_target() == "regions") {
                drop_regions (context, x, y, data, info, time);
        } else {
@@ -687,19 +686,55 @@ Editor::left_track_canvas (GdkEventCrossing *ev)
        return FALSE;
 }
 
+void
+Editor::tie_vertical_scrolling ()
+{
+       double y1 = vertical_adjustment.get_value();
+
+       playhead_cursor->set_y_axis (y1);
+
+       range_marker_drag_rect->property_y1() = y1;
+       range_marker_drag_rect->property_y2() = full_canvas_height;
+       transport_loop_range_rect->property_y1() = y1;
+       transport_loop_range_rect->property_y2() = full_canvas_height;
+       transport_punch_range_rect->property_y1() = y1;
+       transport_punch_range_rect->property_y2() = full_canvas_height;
+       transport_punchin_line->property_y1() = y1;
+       transport_punchin_line->property_y2() = full_canvas_height;
+       transport_punchout_line->property_y1() = y1;
+       transport_punchout_line->property_y2() = full_canvas_height;
+
+       if (!selection->markers.empty()) {
+               for (MarkerSelection::iterator x = selection->markers.begin(); x != selection->markers.end(); ++x) {            
+                       (*x)->set_line_vpos (y1, canvas_height);
+               }
+       }
+
+       if (logo_item) {
+               logo_item->property_y() = y1;
+       }
+
+       /* this will do an immediate redraw */
+
+       controls_layout.get_vadjustment()->set_value (y1);
+}
 
 void 
 Editor::canvas_horizontally_scrolled ()
 {
-       /* this is the core function that controls horizontal scrolling of the canvas. it is called
-          whenever the horizontal_adjustment emits its "value_changed" signal. it typically executes in an
-          idle handler, which is important because tempo_map_changed() should issue redraws immediately
-          and not defer them to an idle handler.
-       */
+       nframes64_t time_origin = (nframes_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
+
+       if (time_origin != leftmost_frame) {
+               canvas_scroll_to (time_origin);
+       }
+}
 
-       leftmost_frame = (nframes_t) floor (horizontal_adjustment.get_value() * frames_per_unit);
+void
+Editor::canvas_scroll_to (nframes64_t time_origin)
+{
+       leftmost_frame = time_origin;
        nframes_t rightmost_frame = leftmost_frame + current_page_frames ();
-       
+
        if (rightmost_frame > last_canvas_frame) {
                last_canvas_frame = rightmost_frame;
                reset_scrolling_region ();
@@ -782,7 +817,7 @@ Editor::flush_canvas ()
 {
        if (is_mapped()) {
                track_canvas.update_now ();
-               gdk_window_process_updates (GTK_LAYOUT(track_canvas.gobj())->bin_window, true);
+               // gdk_window_process_updates (GTK_LAYOUT(track_canvas.gobj())->bin_window, true);
        }
 }