From e62c0369790843fadc17608b870a57dbf7a69216 Mon Sep 17 00:00:00 2001 From: paul Date: Thu, 7 Jul 2011 21:45:38 +0000 Subject: [PATCH] remove track resize handle and allow resize of tracks from the lower 25% of the track control box git-svn-id: http://subversion.ardour.org/svn/ardour2/ardour2/branches/3.0@9805 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/ardour3_styles.rc.in | 8 +- gtk2_ardour/time_axis_view.cc | 205 +++++++++++++++++++-------------------- gtk2_ardour/time_axis_view.h | 17 ++-- 3 files changed, 112 insertions(+), 118 deletions(-) diff --git a/gtk2_ardour/ardour3_styles.rc.in b/gtk2_ardour/ardour3_styles.rc.in index 6deddf7c1..29c1e7dcd 100644 --- a/gtk2_ardour/ardour3_styles.rc.in +++ b/gtk2_ardour/ardour3_styles.rc.in @@ -403,12 +403,13 @@ style "transport_button_alternate_two" style "transport_rec_button" { - bg[ACTIVE] = darker(@@COLPREFIX@_arm) #the rest of these don't quite do what I expected - #bg[NORMAL] = mix(0.05,@@COLPREFIX@_arm,@@COLPREFIX@_bg) + fg[ACTIVE] = @@COLPREFIX@_darkest + bg[ACTIVE] = darker(@@COLPREFIX@_arm) + #the rest of these don't quite do what I expected + #bg[NORMAL] = mix(0.05,@@COLPREFIX@_arm,@@COLPREFIX@_bg) #bg[SELECTED] = darker(@@COLPREFIX@_arm) #bg[PRELIGHT] = lighter(mix(0.05,@@COLPREFIX@_arm,@@COLPREFIX@_bg)) - fg[ACTIVE] = @@COLPREFIX@_darkest } style "transport_rec_button_active" @@ -1068,3 +1069,4 @@ style "tooltip" = "medium_text" fg[NORMAL] = @@COLPREFIX@_fg_tooltip bg[NORMAL] = @@COLPREFIX@_bg_tooltip } + diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index b8f1c0ad1..a37a6ac9d 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -79,6 +79,9 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie , _y_position (0) , _editor (ed) , _order (0) + , _preresize_cursor (0) + , _have_preresize_cursor (false) + , _ghost_group (0) { if (extra_height == 0) { compute_heights (); @@ -141,35 +144,25 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie controls_table.show_all (); controls_table.set_no_show_all (); - resizer.set_size_request (10, 6); - resizer.set_name ("ResizeHandle"); - resizer.signal_expose_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_expose)); - resizer.signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_button_press)); - resizer.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_button_release)); - resizer.signal_motion_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::resizer_motion)); - - resizer.set_events (Gdk::BUTTON_PRESS_MASK| - Gdk::BUTTON_RELEASE_MASK| - Gdk::POINTER_MOTION_MASK| - Gdk::SCROLL_MASK); - - resizer_box.pack_start (resizer, false, false); - resizer.show (); - resizer_box.show(); - HSeparator* separator = manage (new HSeparator()); controls_vbox.pack_start (controls_table, false, false); - controls_vbox.pack_end (resizer_box, false, false); controls_vbox.show (); //controls_ebox.set_name ("TimeAxisViewControlsBaseUnselected"); controls_ebox.add (controls_vbox); - controls_ebox.add_events (BUTTON_PRESS_MASK|BUTTON_RELEASE_MASK|SCROLL_MASK); + controls_ebox.add_events (Gdk::BUTTON_PRESS_MASK| + Gdk::BUTTON_RELEASE_MASK| + Gdk::POINTER_MOTION_MASK| + Gdk::ENTER_NOTIFY_MASK| + Gdk::LEAVE_NOTIFY_MASK| + Gdk::SCROLL_MASK); controls_ebox.set_flags (CAN_FOCUS); - controls_ebox.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_button_release)); controls_ebox.signal_scroll_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_scroll), true); + controls_ebox.signal_button_press_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_button_press)); + controls_ebox.signal_button_release_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_button_release)); + controls_ebox.signal_motion_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_motion)); controls_ebox.show (); controls_hbox.pack_start (controls_ebox, true, true); @@ -358,8 +351,93 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) } bool +TimeAxisView::controls_ebox_button_press (GdkEventButton* event) +{ + if (maybe_set_cursor (event->y) > 0) { + _resize_drag_start = event->y_root; + } + + return true; +} + +void +TimeAxisView::idle_resize (uint32_t h) +{ + set_height (h); +} + + +bool +TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) +{ + if (_resize_drag_start >= 0) { + /* (ab)use the DragManager to do autoscrolling; adjust the event coordinates + into the world coordinate space that DragManager::motion_handler is expecting, + and then fake a DragManager motion event so that when maybe_autoscroll + asks DragManager for the current pointer position it will get the correct + answers. + */ + int tx, ty; + controls_ebox.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty); + ev->y = ty - _editor.get_trackview_group_vertical_offset(); + _editor.drags()->motion_handler ((GdkEvent *) ev, false); + _editor.maybe_autoscroll (false, true); + + /* now do the actual TAV resize */ + int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start); + _editor.add_to_idle_resize (this, delta); + _resize_drag_start = ev->y_root; + } else { + /* not dragging but ... */ + Glib::RefPtr win = controls_ebox.get_window(); + + maybe_set_cursor (ev->y); + } + + return true; +} + +bool +TimeAxisView::maybe_set_cursor (int y) +{ + /* XXX no Gtkmm Gdk::Window::get_cursor() */ + Glib::RefPtr win = controls_ebox.get_window(); + + if (y > (gint) floor (controls_ebox.get_height() * 0.75)) { + + /* y-coordinate in lower 25% */ + + if (!_have_preresize_cursor) { + _preresize_cursor = gdk_window_get_cursor (win->gobj()); + _have_preresize_cursor = true; + win->set_cursor (Gdk::Cursor(Gdk::SB_V_DOUBLE_ARROW)); + } + + return 1; + + } else if (_have_preresize_cursor) { + gdk_window_set_cursor (win->gobj(), _preresize_cursor); + _have_preresize_cursor = false; + + return -1; + } + + return 0; +} + +bool TimeAxisView::controls_ebox_button_release (GdkEventButton* ev) { + if (_resize_drag_start >= 0) { + if (_have_preresize_cursor) { + gdk_window_set_cursor (controls_ebox.get_window()->gobj(), _preresize_cursor); + _preresize_cursor = 0; + _have_preresize_cursor = false; + } + _editor.stop_canvas_autoscroll (); + _resize_drag_start = -1; + } + switch (ev->button) { case 1: selection_click (ev); @@ -641,8 +719,6 @@ TimeAxisView::set_selected (bool yn) (*i)->set_selected (false); } } - - resizer.queue_draw (); } void @@ -979,9 +1055,8 @@ TimeAxisView::compute_heights () Gtk::Table one_row_table (1, 8); Button* buttons[5]; const int border_width = 2; - extra_height = (2 * border_width) - //+ 2 // 2 pixels for the hseparator between TimeAxisView control areas - + 6; // resizer button (3 x 2 pixel elements + 2 x 2 pixel gaps) + + extra_height = (2 * border_width); window.add (one_row_table); @@ -1124,88 +1199,6 @@ TimeAxisView::covers_y_position (double y) return std::make_pair ((TimeAxisView *) 0, 0); } -bool -TimeAxisView::resizer_button_press (GdkEventButton* event) -{ - _resize_drag_start = event->y_root; - return true; -} - -bool -TimeAxisView::resizer_button_release (GdkEventButton*) -{ - _editor.stop_canvas_autoscroll (); - _resize_drag_start = -1; - return true; -} - -void -TimeAxisView::idle_resize (uint32_t h) -{ - set_height (h); -} - -bool -TimeAxisView::resizer_motion (GdkEventMotion* ev) -{ - if (_resize_drag_start >= 0) { - /* (ab)use the DragManager to do autoscrolling; adjust the event coordinates - into the world coordinate space that DragManager::motion_handler is expecting, - and then fake a DragManager motion event so that when maybe_autoscroll - asks DragManager for the current pointer position it will get the correct - answers. - */ - int tx, ty; - resizer.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty); - ev->y = ty - _editor.get_trackview_group_vertical_offset(); - _editor.drags()->motion_handler ((GdkEvent *) ev, false); - _editor.maybe_autoscroll (false, true); - - /* now do the actual TAV resize */ - int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start); - _editor.add_to_idle_resize (this, delta); - _resize_drag_start = ev->y_root; - } - - return true; -} - -bool -TimeAxisView::resizer_expose (GdkEventExpose* event) -{ - int w, h, x, y, d; - Glib::RefPtr win (resizer.get_window()); - Glib::RefPtr dark (resizer.get_style()->get_fg_gc (STATE_NORMAL)); - Glib::RefPtr light (resizer.get_style()->get_bg_gc (STATE_NORMAL)); - - win->draw_rectangle (controls_ebox.get_style()->get_bg_gc(STATE_NORMAL), - true, - event->area.x, - event->area.y, - event->area.width, - event->area.height); - - win->get_geometry (x, y, w, h, d); - - /* handle/line #1 */ - - win->draw_line (dark, 0, 0, w - 2, 0); - win->draw_point (dark, 0, 1); - win->draw_line (light, 1, 1, w - 1, 1); - win->draw_point (light, w - 1, 0); - - /* handle/line #2 */ - - win->draw_line (dark, 0, 4, w - 2, 4); - win->draw_point (dark, 0, 5); - win->draw_line (light, 1, 5, w - 1, 5); - win->draw_point (light, w - 1, 4); - - /* use vertical resize mouse cursor */ - win->set_cursor(Gdk::Cursor(Gdk::SB_V_DOUBLE_ARROW)); - - return true; -} uint32_t TimeAxisView::preset_height (Height h) diff --git a/gtk2_ardour/time_axis_view.h b/gtk2_ardour/time_axis_view.h index 32e6fce84..8a354abcd 100644 --- a/gtk2_ardour/time_axis_view.h +++ b/gtk2_ardour/time_axis_view.h @@ -114,11 +114,6 @@ class TimeAxisView : public virtual AxisView uint32_t current_height() const { return height; } - bool resizer_button_press (GdkEventButton*); - bool resizer_button_release (GdkEventButton*); - bool resizer_motion (GdkEventMotion*); - bool resizer_expose (GdkEventExpose*); - void idle_resize (uint32_t); void hide_name_label (); @@ -213,8 +208,6 @@ class TimeAxisView : public virtual AxisView Gtk::EventBox controls_ebox; Gtk::VBox controls_vbox; Gtk::VBox time_axis_vbox; - Gtk::DrawingArea resizer; - Gtk::HBox resizer_box; Gtk::HBox name_hbox; Gtk::Frame name_frame; Gtkmm2ext::FocusEntry name_entry; @@ -242,8 +235,10 @@ class TimeAxisView : public virtual AxisView * *@ param ev the event */ - virtual bool controls_ebox_button_release (GdkEventButton *ev); - virtual bool controls_ebox_scroll (GdkEventScroll *ev); + virtual bool controls_ebox_button_release (GdkEventButton*); + virtual bool controls_ebox_scroll (GdkEventScroll*); + virtual bool controls_ebox_button_press (GdkEventButton*); + virtual bool controls_ebox_motion (GdkEventMotion*); /** Display the standard LHS control menu at when. * @@ -309,6 +304,8 @@ private: int _order; uint32_t _effective_height; double _resize_drag_start; + GdkCursor* _preresize_cursor; + bool _have_preresize_cursor; ArdourCanvas::Group* _ghost_group; void compute_heights (); @@ -316,6 +313,8 @@ private: static uint32_t small_height; static int const _max_order; + + bool maybe_set_cursor (int y); }; /* class TimeAxisView */ -- 2.11.4.GIT