From 3a4848d055927fea4e9497d05455d62d30dcb094 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 21 Nov 2011 19:24:37 +0000 Subject: tentative code shuffle to allow for 2 different styles of clock editing git-svn-id: svn://localhost/ardour2/branches/3.0@10742 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/audio_clock.cc | 144 +++++++++++++++++++++++++++++++++++---------- gtk2_ardour/audio_clock.h | 7 ++- 2 files changed, 117 insertions(+), 34 deletions(-) diff --git a/gtk2_ardour/audio_clock.cc b/gtk2_ardour/audio_clock.cc index 3ae2c8bdd6..a69ef76af7 100644 --- a/gtk2_ardour/audio_clock.cc +++ b/gtk2_ardour/audio_clock.cc @@ -71,6 +71,7 @@ AudioClock::AudioClock (const string& clock_name, bool transient, const string& , _fixed_width (true) , layout_x_offset (0) , em_width (0) + , _edit_by_click_field (false) , ops_menu (0) , editing_attr (0) , foreground_attr (0) @@ -362,11 +363,13 @@ AudioClock::render (cairo_t* cr) cairo_set_source_rgba (cr, cursor_r, cursor_g, cursor_b, cursor_a); if (!_fixed_width) { cairo_rectangle (cr, - min (get_width() - 2.0, (double) cursor.get_x()/PANGO_SCALE + em_width), 0, + min (get_width() - 2.0, + (double) cursor.get_x()/PANGO_SCALE + layout_x_offset + em_width), 0, 2.0, cursor.get_height()/PANGO_SCALE); } else { cairo_rectangle (cr, - min (get_width() - 2.0, (double) layout_x_offset + cursor.get_x()/PANGO_SCALE + em_width), + min (get_width() - 2.0, + (double) layout_x_offset + cursor.get_x()/PANGO_SCALE + em_width), (upper_height - layout_height)/2.0, 2.0, cursor.get_height()/PANGO_SCALE); } @@ -519,7 +522,7 @@ AudioClock::show_edit_status (int length) } void -AudioClock::start_edit () +AudioClock::start_edit (Field f) { pre_edit_string = _layout->get_text (); if (!insert_map.empty()) { @@ -531,12 +534,61 @@ AudioClock::start_edit () input_string.clear (); editing = true; + if (f) { + input_string = get_field (f); + show_edit_status (merge_input_and_edit_string ()); + _layout->set_text (edit_string); + } + queue_draw (); Keyboard::magic_widget_grab_focus (); grab_focus (); } +string +AudioClock::get_field (Field f) +{ + switch (f) { + case Timecode_Hours: + return edit_string.substr (1, 2); + break; + case Timecode_Minutes: + return edit_string.substr (4, 2); + break; + case Timecode_Seconds: + return edit_string.substr (7, 2); + break; + case Timecode_Frames: + return edit_string.substr (10, 2); + break; + case MS_Hours: + return edit_string.substr (1, 2); + break; + case MS_Minutes: + return edit_string.substr (4, 2); + break; + case MS_Seconds: + return edit_string.substr (7, 2); + break; + case MS_Milliseconds: + return edit_string.substr (10, 3); + break; + case Bars: + return edit_string.substr (1, 3); + break; + case Beats: + return edit_string.substr (5, 2); + break; + case Ticks: + return edit_string.substr (8, 4); + break; + case AudioFrames: + return edit_string; + break; + } +} + void AudioClock::end_edit (bool modify) { @@ -1165,6 +1217,8 @@ AudioClock::on_key_press_event (GdkEventKey* ev) string new_text; char new_char = 0; + int highlight_length; + framepos_t pos; switch (ev->keyval) { case GDK_0: @@ -1254,18 +1308,13 @@ AudioClock::on_key_press_event (GdkEventKey* ev) use_input_string: - int highlight_length = 0; - framepos_t pos; - - /* merge with pre-edit-string into edit string */ - switch (_mode) { case Frames: /* get this one in the right order, and to the right width */ - if (ev->keyval != GDK_Delete && ev->keyval != GDK_BackSpace) { - edit_string.push_back (new_char); - } else { + if (ev->keyval == GDK_Delete || ev->keyval == GDK_BackSpace) { edit_string = edit_string.substr (0, edit_string.length() - 1); + } else { + edit_string.push_back (new_char); } if (!edit_string.empty()) { char buf[32]; @@ -1276,26 +1325,11 @@ AudioClock::on_key_press_event (GdkEventKey* ev) /* highlight the whole thing */ highlight_length = edit_string.length(); break; - - default: - edit_string = pre_edit_string; - if (input_string.empty()) { - highlight_length = 0; - } else { - // for (int i = input_string.length() - 1; i >= 0; --i) { - string::size_type target; - for (string::size_type i = 0; i < input_string.length(); ++i) { - target = insert_map[input_string.length() - 1 - i]; - edit_string[target] = input_string[i]; - } - /* highlight from end to wherever the last character was added */ - highlight_length = edit_string.length() - insert_map[input_string.length()-1]; - } - break; + default: + highlight_length = merge_input_and_edit_string (); } - - + show_edit_status (highlight_length); _layout->set_text (edit_string); queue_draw (); @@ -1303,6 +1337,26 @@ AudioClock::on_key_press_event (GdkEventKey* ev) return true; } +int +AudioClock::merge_input_and_edit_string () +{ + /* merge with pre-edit-string into edit string */ + + edit_string = pre_edit_string; + + if (input_string.empty()) { + return 0; + } + + string::size_type target; + for (string::size_type i = 0; i < input_string.length(); ++i) { + target = insert_map[input_string.length() - 1 - i]; + edit_string[target] = input_string[i]; + } + /* highlight from end to wherever the last character was added */ + return edit_string.length() - insert_map[input_string.length()-1]; +} + bool AudioClock::on_key_release_event (GdkEventKey *ev) @@ -1451,10 +1505,36 @@ AudioClock::on_button_release_event (GdkEventButton *ev) return true; } else { if (ev->button == 1) { - start_edit (); + + if (_edit_by_click_field) { + + int index = 0; + int trailing; + int y = ev->y - ((upper_height - layout_height)/2); + int x = ev->x - layout_x_offset; + Field f; + + if (!_layout->xy_to_index (x * PANGO_SCALE, y * PANGO_SCALE, index, trailing)) { + return true; + } + + f = index_to_field (index); + + switch (f) { + case Timecode_Frames: + case MS_Milliseconds: + case Ticks: + f = Field (0); + break; + default: + break; + } + start_edit (f); + } else { + start_edit (); + } } } - } } @@ -2020,7 +2100,7 @@ AudioClock::set_off (bool yn) void AudioClock::focus () { - start_edit (); + start_edit (Field (0)); } void diff --git a/gtk2_ardour/audio_clock.h b/gtk2_ardour/audio_clock.h index 07770df0f6..8af3f49abe 100644 --- a/gtk2_ardour/audio_clock.h +++ b/gtk2_ardour/audio_clock.h @@ -99,6 +99,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr bool _fixed_width; int layout_x_offset; int em_width; + bool _edit_by_click_field; Gtk::Menu *ops_menu; @@ -127,7 +128,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr static const double x_leading_padding; enum Field { - Timecode_Hours, + Timecode_Hours = 1, Timecode_Minutes, Timecode_Seconds, Timecode_Frames, @@ -202,7 +203,7 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr Field index_to_field () const; - void start_edit (); + void start_edit (Field f = Field (0)); void end_edit (bool); void end_edit_relative (bool); void edit_next_field (); @@ -216,6 +217,8 @@ class AudioClock : public CairoWidget, public ARDOUR::SessionHandlePtr void set_font (); void set_colors (); void show_edit_status (int length); + int merge_input_and_edit_string (); + std::string get_field (Field); void drop_focus (); void dpi_reset (); -- cgit v1.2.3