From 83e2cc45adc52922a1504f2de08316ca5b7b970b Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Mon, 11 Feb 2008 16:59:54 -0600 Subject: [PATCH] Allow editing of instrument row properties. --- canvas.C | 16 +++++++++++++- canvas.H | 11 +++++----- gui/input.C | 28 +++++++++++++++++------- gui/ui.fl | 63 +++++++++++++++++++++++++++++++++++++++++++++-------- mapping.C | 7 ++++++ mapping.H | 1 + 6 files changed, 103 insertions(+), 23 deletions(-) diff --git a/canvas.C b/canvas.C index 1a4d1ef..994e786 100644 --- a/canvas.C +++ b/canvas.C @@ -539,7 +539,7 @@ Canvas::redraw ( void ) /** convert pixel coords into grid coords. returns true if valid */ bool -Canvas::grid_pos ( int *x, int *y ) +Canvas::grid_pos ( int *x, int *y ) const { *y = (*y - m.margin_top - m.origin_y) / m.div_h; *x = (*x - m.margin_left - m.origin_x) / m.div_w; @@ -566,6 +566,20 @@ Canvas::grid_pos ( int *x, int *y ) /* These methods translate viewport pixel coords to absolute grid coords and pass on to the grid. */ +/** if coords correspond to a row name entry, return the (absolute) note number, otherwise return -1 */ +int +Canvas::is_row_name ( int x, int y ) +{ + if ( x - m.origin_x >= m.margin_left ) + return -1; + + x = m.margin_left; + + grid_pos( &x, &y ); + + return m.grid->y_to_note( y ); +} + void Canvas::set ( int x, int y ) { diff --git a/canvas.H b/canvas.H index 618d945..e0cb493 100644 --- a/canvas.H +++ b/canvas.H @@ -95,8 +95,8 @@ class Canvas : public trackable uint p1, p2; /* cursors */ } m; - int rtn ( int r ); - int ntr ( int n ); + int rtn ( int r ) const; + int ntr ( int n ) const; void _update_row_mapping ( void ); cell_t ** _alloc_array ( void ); @@ -139,7 +139,8 @@ public: int draw_playhead ( void ); void draw ( void ); void redraw ( void ); - bool grid_pos ( int *x, int *y ); + bool grid_pos ( int *x, int *y ) const; + int is_row_name ( int x, int y ); void unset ( int x, int y ); void adj_color ( int x, int y, int n ); void adj_length ( int x, int y, int n ); @@ -163,13 +164,13 @@ public: }; inline int -Canvas::rtn ( int r ) +Canvas::rtn ( int r ) const { return m.row_compact ? m.rtn[ r ] : r; } inline int -Canvas::ntr ( int n ) +Canvas::ntr ( int n ) const { return m.row_compact ? m.ntr[ n ] : n; } diff --git a/gui/input.C b/gui/input.C index 06a753c..beecbc9 100644 --- a/gui/input.C +++ b/gui/input.C @@ -47,12 +47,8 @@ async_exec ( const char *cmd ) int canvas_input_callback ( O_Canvas *widget, Canvas *c, int m ) { - - static int lmb_down; - // MESSAGE( "Hello, my name is %s", widget->parent()->label() ); - int ow, oh; int x, y; @@ -239,11 +235,27 @@ canvas_input_callback ( O_Canvas *widget, Canvas *c, int m ) switch ( Fl::event_button() ) { case 1: - lmb_down = true; - if ( IS_PATTERN && Fl::event_state() & FL_CTRL ) - c->randomize_row( y ); + int note; + if ( ( note = c->is_row_name( x, y ) ) >= 0 ) + { + DEBUG( "click on row %d", note ); + Instrument *i = ((pattern *)c->grid())->mapping.instrument(); + + if ( i ) + { + ui->edit_instrument_row( i, note ); + + c->changed_mapping(); + } + } else - c->set( x, y ); + { + + if ( IS_PATTERN && Fl::event_state() & FL_CTRL ) + c->randomize_row( y ); + else + c->set( x, y ); + } break; case 3: c->unset( x, y ); diff --git a/gui/ui.fl b/gui/ui.fl index 28af73a..e7dcc64 100644 --- a/gui/ui.fl +++ b/gui/ui.fl @@ -103,6 +103,7 @@ main_window = make_main_window(); seq_window = make_seq_window(); make_randomization_dialog(); +make_instrument_edit_dialog(); Fl::add_handler( shortcut_handler ); @@ -136,7 +137,7 @@ if ( Fl::event() == FL_SHORTCUT && Fl::event_key() == FL_Escape ) if ( maybe_save_song() ) quit();} open - xywh {790 38 869 801} type Single box PLASTIC_UP_BOX color 37 resizable xclass non size_range {869 801 0 0} visible + xywh {773 244 869 801} type Single box PLASTIC_UP_BOX color 37 resizable xclass non size_range {869 801 0 0} visible } { Fl_Menu_Bar {} {open xywh {0 0 869 30} color 37 @@ -383,7 +384,7 @@ if ( o->value() == pattern_tab ) } { Fl_Group sequence_tab { label Sequence open - xywh {0 98 868 674} color 37 resizable + xywh {0 98 868 674} color 37 hide resizable code0 {update_sequence_widgets();} } { Fl_Group {} {open @@ -501,7 +502,7 @@ if ( playlist->length() ) } Fl_Slider sequence_progress { label Sequence - callback {transport.locate( (tick_t)((double)playlist->length() * o->value()) );} selected + callback {transport.locate( (tick_t)((double)playlist->length() * o->value()) );} xywh {10 698 233 24} type Horizontal labelsize 12 align 1 } } @@ -556,7 +557,7 @@ o->maximum( phrase::phrases() );} } Fl_Group pattern_tab { label Pattern open - xywh {0 98 868 674} color 37 hide + xywh {0 98 868 674} color 37 code0 {update_pattern_widgets();} } { Fl_Box pattern_canvas_widget { @@ -1013,11 +1014,10 @@ You should have received a copy of the GNU General Public License along with thi } } } - Function {make_randomization_dialog()} {open - } { + Function {make_randomization_dialog()} {} { Fl_Window randomization_dialog { label {Randomization Settings} open - xywh {841 360 342 98} type Double + xywh {740 128 342 98} type Double code0 {// feel->value( )} code1 {probability->value( song.random.probability );} non_modal visible } { @@ -1050,7 +1050,38 @@ You should have received a copy of the GNU General Public License along with thi } } } - Function {update_pattern_widgets()} {} { + Function {make_instrument_edit_dialog()} {open + } { + Fl_Window instrument_edit_dialog { + label {Instrument Edit} open + xywh {669 299 338 191} type Double modal visible + } { + Fl_Box {} { + label {Instrument Row} + xywh {8 15 321 28} box ROUNDED_BOX color 94 labelsize 22 labelcolor 39 + } + Fl_Input instrument_name_field { + label Name + callback {instrument_edit_dialog->hide();} selected + xywh {10 70 321 25} selection_color 48 align 1 when 8 textcolor 32 + } + Fl_Value_Slider instrument_volume_slider { + label {Volume %} + xywh {10 112 321 27} type Horizontal align 1 maximum 100 step 1 textsize 14 + } + Fl_Value_Output instrument_note_field { + label {Note:} + xywh {52 158 43 24} + } + Fl_Return_Button {} { + label Done + callback {instrument_edit_dialog->hide();} + xywh {255 157 76 25} + } + } + } + Function {update_pattern_widgets()} {open + } { code {if ( ! pattern_settings_group ) return; @@ -1268,6 +1299,20 @@ if ( p ) // update_pattern_widgets(); }} {} } + Function {edit_instrument_row( Instrument *i, int n )} {open return_type void + } { + code {instrument_note_field->value( n ); +instrument_name_field->value( i->note_name( n ) ); +instrument_volume_slider->value( i->velocity( n ) ); + +instrument_edit_dialog->show(); + +while( instrument_edit_dialog->shown() ) + Fl::wait(); + +i->note_name( n, strdup( instrument_name_field->value() ) ); +i->velocity( n, instrument_volume_slider->value() );} {} + } } decl {\#include } {public @@ -1549,7 +1594,7 @@ return r;} {} } } -widget_class Triggers {open +widget_class Triggers { xywh {121 31 1278 1003} type Double hide resizable code0 {populate();} code1 {\#include } diff --git a/mapping.C b/mapping.C index 0eaebf7..cd89406 100644 --- a/mapping.C +++ b/mapping.C @@ -157,3 +157,10 @@ Mapping::type ( void ) const { return IS_INSTRUMENT ? "Instrument" : "Scale"; } + + +bool +Mapping::editable ( void ) const +{ + return IS_INSTRUMENT ? true : false; +} diff --git a/mapping.H b/mapping.H index 37b9f3e..0654806 100644 --- a/mapping.H +++ b/mapping.H @@ -68,6 +68,7 @@ public: const char * note_name ( int n ) const; int velocity ( int n ) const; int key ( void ) const; + bool editable ( void ) const; const char * type ( void ) const;