/*******************************************************************************/ /* Copyright (C) 2007-2008 Jonathan Moore Liles */ /* */ /* This program is free software; you can redistribute it and/or modify it */ /* under the terms of the GNU General Public License as published by the */ /* Free Software Foundation; either version 2 of the License, or (at your */ /* option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ /* more details. */ /* */ /* You should have received a copy of the GNU General Public License along */ /* with This program; see the file COPYING. If not,write to the Free Software */ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ #pragma once #include "grid.H" #include #include using namespace sigc; class Mapping; enum { LEFT, RIGHT, UP, DOWN, TO_PLAYHEAD, TO_NEXT_NOTE, TO_PREV_NOTE }; class Fl_Scrollbar; class Fl_Slider; class Canvas : public Fl_Group, public trackable { class Canvas_Panzoomer; Canvas_Panzoomer *panzoomer; Fl_Slider *vzoom; /* these are grid coords, not pixels */ int _old_scroll_x; int _old_scroll_y; struct { int origin_x, origin_y; int width, height; int margin_left, margin_top; int div_w, div_h; int old_div_w, old_div_h; int maxh; bool ruler_drawn; bool mapping_drawn; bool grid_drawn; int playhead; /* where the playhead is for this canvas. only used for display. */ enum { PATTERN, SEQUENCE } mode; Grid *grid; /* grid currently connected to this canvas */ size_t size; bool draw; /* really drawing, or just checking size? */ int rule; bool row_compact; /* use row-compaction? */ /* tables used for row-compaction */ int rtn[128]; /* row-to-note */ int ntr[128]; /* note-to-row */ Viewport *vp; int w, h; uint p1, p2; /* range cursors */ uint p3, p4; /* row cursors */ } m; int rtn ( int r ) const; int ntr ( int n ) const; void _update_row_mapping ( void ); void draw_mapping ( void ); void draw_ruler ( void ); void _reset ( void ); void _lr ( void ); bool viewable_x ( int x ); void update_mapping ( void ); static void cb_scroll ( Fl_Widget *w, void *v ); void cb_scroll ( Fl_Widget *w ); static void draw_clip ( void *v, int X, int Y, int W, int H ); void draw_clip ( int X, int Y, int W, int H ); public: enum { OFF, ON, TOGGLE }; signal signal_settings_change; Canvas ( int X, int Y, int W, int H, const char *L=0 ); virtual ~Canvas ( ); void redraw_playhead ( void ); void handle_event_change ( void ); void set ( int x, int y ); void grid ( Grid *g ); void changed_mapping ( void ); Grid * grid ( void ); void adj_size ( void ); void resize_grid ( void ); void resize ( int x, int y, int w, int h ); void copy ( void ); void draw_row_name ( int y, const char *name, int color ); // void draw_shape ( int x, int y, int w, int color ); static void draw_dash ( tick_t x, int y, tick_t l, int color, int selected, void *userdata ); void draw_dash ( tick_t x, int y, tick_t w, int color, int selected ) const; void damage_grid ( tick_t x, int y, tick_t w, int h ); void draw_overlay ( void ); void draw_playhead ( void ); void draw ( void ); bool grid_pos ( int *x, int *y ) const; int is_row_press ( void ) const; void unset ( int x, int y ); void adj_color ( int x, int y, int n ); void adj_length ( int x, int y, int n ); void set_end ( int x, int y, int n ); void select ( int x, int y ); void select_range ( void ); void invert_selection ( void ); void duplicate_range ( void ); void crop ( void ); void row_compact ( int n ); void pan ( int dir, int n ); void can_scroll ( int *left, int *right, int *up, int *down ); void h_zoom ( float n ); void v_zoom ( float n ); void v_zoom_fit ( void ); void notes ( char *s ); char * notes ( void ); void randomize_row ( int y ); int playhead_moved ( void ); void start_cursor ( int x, int y ); void end_cursor ( int x, int y ); void delete_time ( void ); void insert_time ( void ); void move_selected ( int dir, int n ); virtual int handle ( int m ); }; inline int Canvas::rtn ( int r ) const { return m.row_compact ? m.rtn[ r ] : r; } inline int Canvas::ntr ( int n ) const { return m.row_compact ? m.ntr[ n ] : n; }