non/sequencer/src/canvas.H

179 lines
5.5 KiB
C++

/*******************************************************************************/
/* 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 <FL/Fl_Group.H>
#include <sigc++/sigc++.h>
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 <void> 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;
}