Greg Ercolano wrote:
>> An example of the table with multiple colors:
>> http://db.tt/FFmO9hj
Here's some code that shows how to define a second selection.
I started with the table_simple.cxx in the examples directory,
modified it to use Fl_Table_Row, and added some code to do the
secondary selection stuff using the technique described in my last post.
Might do what you want, or at least steer you in the right direction.
Compile and run; highlight some lines to make a primary selection,
then click the button to define a secondary selection (fixed in code
to make row/cols 4 thru 8 selected in blue). You can change the primary
selection, and the secondary remains intact.
#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Table_Row.H>
#include <FL/Fl_Check_Button.H>
#include <FL/fl_draw.H>
//
// Demonstrate Fl_Table_Row with multiple selections -- erco 04/14/11
// (Started with examples/table_simple.cxx)
//
#define MAX_ROWS 100
#define MAX_COLS 100
// Derive a class from Fl_Table_Row
class MyTable : public Fl_Table_Row {
int secondary_selection[4]; // handle secondary selection
// Draw the row/col headings
// Make this a dark thin upbox with the text inside.
//
void DrawHeader(const char *s, int X, int Y, int W, int H) {
fl_push_clip(X,Y,W,H);
fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, row_header_color());
fl_color(FL_BLACK);
fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
fl_pop_clip();
}
// Handle drawing table's cells
// Fl_Table calls this function to draw each visible cell in the table.
// It's up to us to use FLTK's drawing functions to draw the cells the
way we want.
//
void draw_cell(TableContext context, int ROW=0, int COL=0, int X=0, int Y=0,
int W=0, int H=0) {
static char s[40];
switch ( context ) {
case CONTEXT_STARTPAGE: // before page is drawn..
fl_font(FL_HELVETICA, 16); // set the font for our drawing
operations
return;
case CONTEXT_COL_HEADER: // Draw column headers
sprintf(s,"%c",'A'+COL); // "A", "B", "C", etc.
DrawHeader(s,X,Y,W,H);
return;
case CONTEXT_ROW_HEADER: // Draw row headers
sprintf(s,"%03d:",ROW); // "001:", "002:", etc
DrawHeader(s,X,Y,W,H);
return;
case CONTEXT_CELL: { // Draw data in cells
sprintf(s,"%d",ROW*MAX_COLS+COL); // whatever..
// HANDLE COLORING OF CELLS
int fgcol = FL_BLACK;
int bgcol = FL_WHITE;
if ( row_selected(ROW) ) {
fgcol = FL_WHITE;
bgcol = 0xaa4444; // lt blue
}
//// HANDLE SECONDARY SELECTION
if ( COL >= secondary_selection[0] && COL <= secondary_selection[1] &&
ROW >= secondary_selection[2] && ROW <= secondary_selection[3] ) {
fgcol = FL_WHITE;
bgcol = 0x44aa44; // lt green
}
fl_draw_box(FL_THIN_UP_BOX, X,Y,W,H, bgcol);
fl_color(fgcol);
fl_draw(s, X,Y,W,H, FL_ALIGN_CENTER);
return;
}
default:
return;
}
}
public:
// Constructor
// Make our data array, and initialize the table options.
//
MyTable(int X, int Y, int W, int H, const char *L=0) :
Fl_Table_Row(X,Y,W,H,L) {
// Init secondary selection off
SetSecondarySelection(-1,-1,-1,-1);
// Rows
rows(MAX_ROWS); // how many rows
row_header(1); // enable row headers (along left)
row_height_all(20); // default height of rows
row_resize(0); // disable row resizing
// Cols
cols(MAX_COLS); // how many columns
col_header(1); // enable column headers (along top)
col_width_all(80); // default width of columns
col_resize(1); // enable column resizing
end(); // end the Fl_Table group
}
~MyTable() { }
// Let caller define a secondary selection rectangle
void SetSecondarySelection(int col_left, int col_right, int row_top, int
row_bot) {
secondary_selection[0] = col_left;
secondary_selection[1] = col_right;
secondary_selection[2] = row_top;
secondary_selection[3] = row_bot;
redraw();
}
};
void Button_CB(Fl_Widget *w,void *data) {
Fl_Check_Button *but = (Fl_Check_Button*)w;
MyTable *table = (MyTable*)data;
if ( but->value() ) {
table->SetSecondarySelection(4,8,4,8); // on
} else {
table->SetSecondarySelection(-1,-1,-1,-1); // off
}
}
int main(int argc, char **argv) {
Fl_Double_Window win(900, 400, "Multiselect Table");
// Table
MyTable table(10,10,win.w()-20,win.h()-50);
// Toggle button for 'fixed' secondary selection
Fl_Check_Button but(10,win.h()-35,180,25,"Secondary Selection");
but.callback(Button_CB, (void*)&table);
win.end();
win.resizable(table);
win.show(argc,argv);
return(Fl::run());
}
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk