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
This commit is contained in:
parent
2eeb861253
commit
3a4848d055
@ -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
|
||||
|
@ -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 ();
|
||||
|
Loading…
Reference in New Issue
Block a user