From 3aa1f2147531de91f6a59fde7ba9501620fd4dda Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Tue, 21 Sep 2010 14:22:13 +0000 Subject: [PATCH] Updating zoom mouse cursor on modifier press. Fixes #274. git-svn-id: svn://localhost/ardour2/branches/3.0@7820 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/editor.cc | 17 +++++++++-------- gtk2_ardour/editor.h | 5 ++++- gtk2_ardour/editor_canvas.cc | 26 +++++++++++++++++++++++++- gtk2_ardour/editor_canvas_events.cc | 2 +- gtk2_ardour/editor_drag.cc | 16 ++++++++++------ gtk2_ardour/editor_drag.h | 3 +++ gtk2_ardour/editor_mouse.cc | 4 ++-- gtk2_ardour/editor_xpms | 15 --------------- 8 files changed, 54 insertions(+), 34 deletions(-) diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc index 4d3ecb80c8..65130dc6de 100644 --- a/gtk2_ardour/editor.cc +++ b/gtk2_ardour/editor.cc @@ -220,7 +220,8 @@ Gdk::Cursor* Editor::fade_out_cursor = 0; Gdk::Cursor* Editor::grabber_cursor = 0; Gdk::Cursor* Editor::grabber_note_cursor = 0; Gdk::Cursor* Editor::grabber_edit_point_cursor = 0; -Gdk::Cursor* Editor::zoom_cursor = 0; +Gdk::Cursor* Editor::zoom_in_cursor = 0; +Gdk::Cursor* Editor::zoom_out_cursor = 0; Gdk::Cursor* Editor::time_fx_cursor = 0; Gdk::Cursor* Editor::fader_cursor = 0; Gdk::Cursor* Editor::speaker_cursor = 0; @@ -1195,16 +1196,16 @@ Editor::build_cursors () { using namespace Gdk; - Gdk::Color mbg ("#000000" ); /* Black */ - Gdk::Color mfg ("#0000ff" ); /* Blue. */ - { - RefPtr source, mask; - source = Bitmap::create (mag_bits, mag_width, mag_height); - mask = Bitmap::create (magmask_bits, mag_width, mag_height); - zoom_cursor = new Gdk::Cursor (source, mask, mfg, mbg, mag_x_hot, mag_y_hot); + Glib::RefPtr zoom_in_cursor_pixbuf (::get_icon ("zoom_in_cursor")); + zoom_in_cursor = new Gdk::Cursor (Gdk::Display::get_default(), zoom_in_cursor_pixbuf, 5, 5); } + { + Glib::RefPtr zoom_out_cursor_pixbuf (::get_icon ("zoom_out_cursor")); + zoom_out_cursor = new Gdk::Cursor (Gdk::Display::get_default(), zoom_out_cursor_pixbuf, 5, 5); + } + Gdk::Color fbg ("#ffffff" ); Gdk::Color ffg ("#000000" ); diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h index 9e5e065ecd..01bc7a09e7 100644 --- a/gtk2_ardour/editor.h +++ b/gtk2_ardour/editor.h @@ -462,7 +462,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD static Gdk::Cursor* grabber_cursor; static Gdk::Cursor* grabber_note_cursor; static Gdk::Cursor* grabber_edit_point_cursor; - static Gdk::Cursor* zoom_cursor; + static Gdk::Cursor* zoom_in_cursor; + static Gdk::Cursor* zoom_out_cursor; static Gdk::Cursor* time_fx_cursor; static Gdk::Cursor* fader_cursor; static Gdk::Cursor* speaker_cursor; @@ -1408,6 +1409,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD void track_canvas_allocate (Gtk::Allocation alloc); bool track_canvas_size_allocated (); bool track_canvas_drag_motion (Glib::RefPtr const &, int, int, guint); + bool track_canvas_key_press (GdkEventKey *); + bool track_canvas_key_release (GdkEventKey *); void set_playhead_cursor (); diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 5989cb7c92..705e7efa3b 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -46,6 +46,7 @@ #include "editor_group_tabs.h" #include "editor_routes.h" #include "editor_summary.h" +#include "keyboard.h" #include "i18n.h" @@ -282,9 +283,11 @@ Editor::initialize_canvas () track_canvas->signal_button_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_press_event)); track_canvas->signal_button_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_release_event)); track_canvas->signal_drag_motion().connect (sigc::mem_fun (*this, &Editor::track_canvas_drag_motion)); + track_canvas->signal_key_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_press)); + track_canvas->signal_key_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_release)); track_canvas->set_name ("EditorMainCanvas"); - track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK); + track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); track_canvas->signal_leave_notify_event().connect (sigc::mem_fun(*this, &Editor::left_track_canvas)); track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas)); track_canvas->set_flags (CAN_FOCUS); @@ -914,3 +917,24 @@ Editor::horizontal_position () const { return frame_to_unit (leftmost_frame); } + +bool +Editor::track_canvas_key_press (GdkEventKey* event) +{ + /* XXX: event does not report the modifier key pressed down, AFAICS, so use the Keyboard object instead */ + if (mouse_mode == Editing::MouseZoom && Keyboard::the_keyboard().key_is_down (GDK_Control_L)) { + track_canvas->get_window()->set_cursor (*zoom_out_cursor); + } + + return false; +} + +bool +Editor::track_canvas_key_release (GdkEventKey* event) +{ + if (mouse_mode == Editing::MouseZoom && !Keyboard::the_keyboard().key_is_down (GDK_Control_L)) { + track_canvas->get_window()->set_cursor (*zoom_in_cursor); + } + + return false; +} diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index d25492287d..2fabce80b4 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -294,7 +294,7 @@ Editor::canvas_stream_view_event (GdkEvent *event, ArdourCanvas::Item* item, Rou case GDK_LEAVE_NOTIFY: set_entered_track (0); break; - + default: break; } diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 0463061f19..61d137cb98 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3561,6 +3561,7 @@ RangeMarkerBarDrag::update_item (Location* location) MouseZoomDrag::MouseZoomDrag (Editor* e, ArdourCanvas::Item* i) : Drag (e, i) + , _zoom_out (false) { DEBUG_TRACE (DEBUG::Drags, "New MouseZoomDrag\n"); } @@ -3568,7 +3569,14 @@ MouseZoomDrag::MouseZoomDrag (Editor* e, ArdourCanvas::Item* i) void MouseZoomDrag::start_grab (GdkEvent* event, Gdk::Cursor *) { - Drag::start_grab (event, _editor->zoom_cursor); + if (Keyboard::the_keyboard().key_is_down (GDK_Control_L)) { + Drag::start_grab (event, _editor->zoom_out_cursor); + _zoom_out = true; + } else { + Drag::start_grab (event, _editor->zoom_in_cursor); + _zoom_out = false; + } + _editor->show_verbose_time_cursor (adjusted_current_frame (event), 10); } @@ -3617,11 +3625,7 @@ MouseZoomDrag::finished (GdkEvent* event, bool movement_occurred) _editor->temporal_zoom_by_frame (last_pointer_frame(), grab_frame(), "mouse zoom"); } } else { - _editor->temporal_zoom_to_frame (false, grab_frame()); - /* - temporal_zoom_step (false); - center_screen (grab_frame()); - */ + _editor->temporal_zoom_to_frame (_zoom_out, grab_frame()); } _editor->zoom_rect->hide(); diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 4e8a703c2d..a0281fc427 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -807,6 +807,9 @@ public: void motion (GdkEvent *, bool); void finished (GdkEvent *, bool); void aborted (); + +private: + bool _zoom_out; }; /** Drag of a range of automation data, changing value but not position */ diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index a3eef66d72..d33db07e88 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -242,7 +242,7 @@ Editor::set_canvas_cursor () break; case MouseZoom: - current_canvas_cursor = zoom_cursor; + current_canvas_cursor = zoom_in_cursor; break; case MouseTimeFX: @@ -1595,7 +1595,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ cursor = selector_cursor; break; case MouseZoom: - cursor = zoom_cursor; + cursor = zoom_in_cursor; break; default: cursor = cross_hair_cursor; diff --git a/gtk2_ardour/editor_xpms b/gtk2_ardour/editor_xpms index 95a51a8213..cb4a044cfd 100644 --- a/gtk2_ardour/editor_xpms +++ b/gtk2_ardour/editor_xpms @@ -1,18 +1,3 @@ -/* Created with The GIMP */ -#define mag_width 16 -#define mag_height 16 -#define mag_x_hot 9 -#define mag_y_hot 5 -static const gchar mag_bits[] = { - 0x7f, 0xe0, 0x3f, 0xc0, 0x1f, 0x8f, 0x8f, 0x9f, 0xcf, 0x3f, 0xcf, 0x3f, - 0xcf, 0x3f, 0xcf, 0x3f, 0x8f, 0x1f, 0x1f, 0x8f, 0x0f, 0xc0, 0x47, 0xe0, - 0xe3, 0xff, 0xf1, 0xff, 0xf8, 0xff, 0xfc, 0xff }; - -static const gchar magmask_bits[] = { - 0x80, 0x1f, 0xc0, 0x3f, 0xe0, 0x70, 0x70, 0x66, 0x30, 0xc6, 0xb0, 0xdf, - 0xb0, 0xdf, 0x30, 0xc6, 0x70, 0xe6, 0xe0, 0x70, 0xf0, 0x3f, 0xb8, 0x1f, - 0x1c, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x03, 0x00 }; - /* Created with The GIMP */ #define fader_cursor_width 25 #define fader_cursor_height 25