diff --git a/Fltk/visibilityWindow.cpp b/Fltk/visibilityWindow.cpp index 5e027f477bf5c1408ff061417025b2e0535cf38f..2998c925fd56ee657866199fe1c1fc088a5a97b4 100644 --- a/Fltk/visibilityWindow.cpp +++ b/Fltk/visibilityWindow.cpp @@ -315,6 +315,112 @@ static void _rebuild_list_browser() GUI::instance()->visibility->push[0]->deactivate(); } +static void visibility_browser_apply_cb(Fl_Widget *w, void *data) +{ + // if the browser is not empty, get the selections made in the + // browser and apply them into the model + if(VisibilityList::instance()->getNumEntities()){ + CTX.mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); + bool recursive = GUI::instance()->visibility->butt[0]->value() ? true : false; + VisibilityList::VisibilityType type; + switch(GUI::instance()->visibility->browser_type->value()){ + case 0: type = VisibilityList::Models; break; + case 2: type = VisibilityList::PhysicalEntities; break; + case 3: type = VisibilityList::MeshPartitions; break; + case 1: default: type = VisibilityList::ElementaryEntities; break; + } + VisibilityList::instance()->setAllInvisible(type); + for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) + if(GUI::instance()->visibility->browser->selected(i + 1)) + VisibilityList::instance()->setVisibility(i, 1, recursive); + // then refresh the browser to account for recursive selections + for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) + if(VisibilityList::instance()->getVisibility(i)) + GUI::instance()->visibility->browser->select(i + 1); + Draw(); + } +} + +static void visibility_delete_cb(Fl_Widget *w, void *data) +{ + bool all = true; + for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++){ + if(!GUI::instance()->visibility->browser->selected(i + 1)){ + all = false; + break; + } + } + if(all){ + GModel::current()->deletePhysicalGroups(); + } + else{ + for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++){ + if(GUI::instance()->visibility->browser->selected(i + 1)){ + Vis *v = VisibilityList::instance()->getEntity(i); + GModel::current()->deletePhysicalGroup(v->getDim(), v->getTag()); + } + } + } + visibility_cb(NULL, (void*)"redraw_only"); +} + +static void visibility_sort_cb(Fl_Widget *w, void *data) +{ + const char *str = (const char*)data; + int val; + if(!strcmp(str, "type")) + val = 1; + else if(!strcmp(str, "number")) + val = 2; + else if(!strcmp(str, "name")) + val = 3; + else if(!strcmp(str, "-")) + val = -1; + else if(!strcmp(str, "+")) + val = -2; + else + val = 0; + + if(val == 0) { // select or deselect everything + int selectall = 0; + for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) + if(!GUI::instance()->visibility->browser->selected(i + 1)) { + selectall = 1; + break; + } + if(selectall) + for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) + GUI::instance()->visibility->browser->select(i + 1); + else + GUI::instance()->visibility->browser->deselect(); + } + else if(val == -1){ // invert the selection + int *state = new int[GUI::instance()->visibility->browser->size()]; + for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) + state[i] = GUI::instance()->visibility->browser->selected(i + 1); + GUI::instance()->visibility->browser->deselect(); + for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) + if(!state[i]) GUI::instance()->visibility->browser->select(i + 1); + delete [] state; + } + else if(val == -2){ // create new parameter name for selection + for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++){ + if(GUI::instance()->visibility->browser->selected(i + 1)){ + static char tmpstr[256]; + sprintf(tmpstr, "%d", VisibilityList::instance()->getTag(i)); + GUI::instance()->geoContext->input[1]->value(tmpstr); + break; + } + } + GUI::instance()->geoContext->input[0]->value("NewName"); + GUI::instance()->geoContext->show(0); + } + else { // set new sorting mode + VisibilityList::instance()->setSortMode(val); + visibility_cb(NULL, (void*)"redraw_only"); + } +} + #if defined(HAVE_TREE_BROWSER) static void _add_vertex(GVertex *gv, Flu_Tree_Browser::Node *n) @@ -545,32 +651,6 @@ void visibility_cb(Fl_Widget *w, void *data) #endif } -static void visibility_browser_apply_cb(Fl_Widget *w, void *data) -{ - // if the browser is not empty, get the selections made in the - // browser and apply them into the model - if(VisibilityList::instance()->getNumEntities()){ - CTX.mesh.changed |= (ENT_LINE | ENT_SURFACE | ENT_VOLUME); - bool recursive = GUI::instance()->visibility->butt[0]->value() ? true : false; - VisibilityList::VisibilityType type; - switch(GUI::instance()->visibility->browser_type->value()){ - case 0: type = VisibilityList::Models; break; - case 2: type = VisibilityList::PhysicalEntities; break; - case 3: type = VisibilityList::MeshPartitions; break; - case 1: default: type = VisibilityList::ElementaryEntities; break; - } - VisibilityList::instance()->setAllInvisible(type); - for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) - if(GUI::instance()->visibility->browser->selected(i + 1)) - VisibilityList::instance()->setVisibility(i, 1, recursive); - // then refresh the browser to account for recursive selections - for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++) - if(VisibilityList::instance()->getVisibility(i)) - GUI::instance()->visibility->browser->select(i + 1); - Draw(); - } -} - static void visibility_save_cb(Fl_Widget *w, void *data) { // get the whole visibility information in geo format @@ -625,86 +705,6 @@ static void visibility_save_cb(Fl_Widget *w, void *data) add_infile(str.c_str(), CTX.filename); } -static void visibility_delete_cb(Fl_Widget *w, void *data) -{ - bool all = true; - for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++){ - if(!GUI::instance()->visibility->browser->selected(i + 1)){ - all = false; - break; - } - } - if(all){ - GModel::current()->deletePhysicalGroups(); - } - else{ - for(int i = 0; i < VisibilityList::instance()->getNumEntities(); i++){ - if(GUI::instance()->visibility->browser->selected(i + 1)){ - Vis *v = VisibilityList::instance()->getEntity(i); - GModel::current()->deletePhysicalGroup(v->getDim(), v->getTag()); - } - } - } - visibility_cb(NULL, (void*)"redraw_only"); -} - -static void visibility_sort_cb(Fl_Widget *w, void *data) -{ - const char *str = (const char*)data; - int val; - if(!strcmp(str, "type")) - val = 1; - else if(!strcmp(str, "number")) - val = 2; - else if(!strcmp(str, "name")) - val = 3; - else if(!strcmp(str, "-")) - val = -1; - else if(!strcmp(str, "+")) - val = -2; - else - val = 0; - - if(val == 0) { // select or deselect everything - int selectall = 0; - for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) - if(!GUI::instance()->visibility->browser->selected(i + 1)) { - selectall = 1; - break; - } - if(selectall) - for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) - GUI::instance()->visibility->browser->select(i + 1); - else - GUI::instance()->visibility->browser->deselect(); - } - else if(val == -1){ // invert the selection - int *state = new int[GUI::instance()->visibility->browser->size()]; - for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) - state[i] = GUI::instance()->visibility->browser->selected(i + 1); - GUI::instance()->visibility->browser->deselect(); - for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++) - if(!state[i]) GUI::instance()->visibility->browser->select(i + 1); - delete [] state; - } - else if(val == -2){ // create new parameter name for selection - for(int i = 0; i < GUI::instance()->visibility->browser->size(); i++){ - if(GUI::instance()->visibility->browser->selected(i + 1)){ - static char tmpstr[256]; - sprintf(tmpstr, "%d", VisibilityList::instance()->getTag(i)); - GUI::instance()->geoContext->input[1]->value(tmpstr); - break; - } - } - GUI::instance()->geoContext->input[0]->value("NewName"); - GUI::instance()->geoContext->show(0); - } - else { // set new sorting mode - VisibilityList::instance()->setSortMode(val); - visibility_cb(NULL, (void*)"redraw_only"); - } -} - static void _set_visibility_by_number(int what, int num, char val, bool recursive) { bool all = (num < 0) ? true : false; @@ -1002,8 +1002,8 @@ static void visibility_interactive_cb(Fl_Widget *w, void *data) Msg::StatusBar(3, false, ""); } -// derive our own browser, that reacts differently to the Enter key -class visBrowser : public Fl_Browser{ +// derive our own browsers, that react differently to the Enter key +class listBrowser : public Fl_Browser{ int handle(int event) { switch(event){ @@ -1023,10 +1023,29 @@ class visBrowser : public Fl_Browser{ return Fl_Browser::handle(event); } public: - visBrowser(int x, int y, int w , int h, const char* c = 0) + listBrowser(int x, int y, int w , int h, const char* c = 0) : Fl_Browser(x, y, w, h, c){} }; +class treeBrowser : public Flu_Tree_Browser{ + int handle(int event) + { + switch(event){ + case FL_SHORTCUT: + case FL_KEYBOARD: + if(Fl::test_shortcut(FL_Enter) || + Fl::test_shortcut(FL_KP_Enter)){ + visibility_tree_apply_cb(NULL, NULL); + return 1; + } + } + return Flu_Tree_Browser::handle(event); + } + public: + treeBrowser(int x, int y, int w , int h, const char* c = 0) + : Flu_Tree_Browser(x, y, w, h, c){} +}; + visibilityWindow::visibilityWindow(int fontsize) : _fontsize(fontsize) { @@ -1083,7 +1102,7 @@ visibilityWindow::visibilityWindow(int fontsize) Fl_Group *gg = new Fl_Group (2 * WB, 2 * WB + 2 * BH, brw, height - 6 * WB - 4 * BH); - browser = new visBrowser + browser = new listBrowser (2 * WB, 2 * WB + 2 * BH, brw, height - 6 * WB - 4 * BH); browser->type(FL_MULTI_BROWSER); browser->column_widths(cols); @@ -1120,7 +1139,7 @@ visibilityWindow::visibilityWindow(int fontsize) Fl_Group *g = new Fl_Group (WB, WB + BH, width - 2 * WB, height - 3 * WB - 2 * BH, "Tree browser"); - tree = new Flu_Tree_Browser + tree = new treeBrowser (2 * WB, 2 * WB + BH, brw, height - 6 * WB - 3 * BH); tree->show_root(false); tree->box(FL_DOWN_BOX);