From 4ad7319fe35f761d518740b1e9b59e4315842ced Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Tue, 9 Jan 2001 08:59:11 +0000 Subject: [PATCH] *** empty log message *** --- {Motif => Common}/Bitmaps.h | 0 {Motif => Common}/Help.h | 0 Fltk/Callbacks.cpp | 544 ++++++++++++++++++++++++++-- Fltk/Callbacks.h | 156 ++++++-- Fltk/GUI.cpp | 692 +++++++++++++++++++++++++++++------- Fltk/GUI.h | 67 ++-- Fltk/Main.cpp | 12 +- Fltk/Opengl.cpp | 14 +- jpeg/rawjpeg.tar | Bin 139264 -> 0 bytes 9 files changed, 1272 insertions(+), 213 deletions(-) rename {Motif => Common}/Bitmaps.h (100%) rename {Motif => Common}/Help.h (100%) delete mode 100644 jpeg/rawjpeg.tar diff --git a/Motif/Bitmaps.h b/Common/Bitmaps.h similarity index 100% rename from Motif/Bitmaps.h rename to Common/Bitmaps.h diff --git a/Motif/Help.h b/Common/Help.h similarity index 100% rename from Motif/Help.h rename to Common/Help.h diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 20628b02cc..8e55fb35ee 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,3 +1,4 @@ +// $Id: Callbacks.cpp,v 1.2 2001-01-09 08:58:37 geuzaine Exp $ #include "Gmsh.h" #include "GmshUI.h" @@ -5,19 +6,130 @@ #include "Mesh.h" #include "Draw.h" #include "Views.h" +#include "Timer.h" #include "OpenFile.h" #include "Context.h" #include "GUI.h" +#include "Callbacks.h" #include <FL/fl_file_chooser.H> -extern GUI *WID; -extern Mesh M; -extern Context_T CTX; +extern GUI *WID; +extern Mesh M; +extern Context_T CTX; +extern List_T *Post_ViewList; + +// Compatibility routines + +int AddViewInUI(int i, char *Name, int Num){ + if(i > NB_BUTT_MAX -1) return 1; + if(WID->get_context() == 2) + WID->set_context(menu_post,0); + return 0; +} + +void MarkAllViewsChanged(int action){ + int i; + Post_View *v; + + for(i = 0 ; i< List_Nbr(Post_ViewList) ; i++){ + v = (Post_View*)List_Pointer(Post_ViewList, i); + switch(action){ + case 1: // toggle drawing mode + if(v->IntervalsType == DRAW_POST_ISO) + v->IntervalsType = DRAW_POST_DISCRETE ; + else if(v->IntervalsType == DRAW_POST_DISCRETE) + v->IntervalsType = DRAW_POST_CONTINUOUS ; + else + v->IntervalsType = DRAW_POST_ISO ; + break; + case 2: // time step++ + if(v->TimeStep < v->NbTimeStep-1) + v->TimeStep++ ; + else + v->TimeStep = 0 ; + break; + case 3: // time step-- + if(v->TimeStep > 0) + v->TimeStep-- ; + else + v->TimeStep = v->NbTimeStep-1 ; + } + v->Changed = 1 ; + } +} + +void CancelMeshThread(void){ + +} + +// Graphical window + +void status_xyz1p_cb(CALLBACK_ARGS){ + + extern void set_r(int i, double val); + extern void set_t(int i, double val); + extern void set_s(int i, double val); + + switch((int)data){ + case 0 : + if(CTX.useTrackball) + CTX.setQuaternion(0.,-1./sqrt(2.),0.,1./sqrt(2.)); + set_r(0,0.); set_r(1,90.);set_r(2,0.); + Init(); Draw(); + break; + case 1 : + if(CTX.useTrackball) + CTX.setQuaternion(1./sqrt(2.),0.,0.,1./sqrt(2.)); + set_r(0,-90.);set_r(1,0.); set_r(2,0.); + Init(); Draw(); + break; + case 2 : + if(CTX.useTrackball) + CTX.setQuaternion(0.,0.,0.,1.); + set_r(0,0.); set_r(1,0.); set_r(2,0.); + Init(); Draw(); + break; + case 3 : + set_t(0,0.); set_t(1,0.); set_t(2,0.); + set_s(0,1.); set_s(1,1.); set_s(2,1.); + Init(); Draw(); + break; + case 4 : + Print_Context(NULL); + break ; + } +} + +static int stop_anim ; +void status_play_cb(CALLBACK_ARGS){ + static long anim_time ; + WID->set_anim(0); + stop_anim = 0 ; + anim_time = GetTime(); + while(1){ + if(stop_anim) break ; + WID->check(); + if(GetTime() - anim_time > CTX.post.anim_delay){ + anim_time = GetTime(); + MarkAllViewsChanged(2); + Init(); Draw(); + } + } +} + +void status_pause_cb(CALLBACK_ARGS){ + stop_anim = 1; + WID->set_anim(1); +} + +void status_cancel_cb(CALLBACK_ARGS){ + CancelMeshThread(); +} // File Menu -void file_open_cb(void) { +void file_open_cb(CALLBACK_ARGS) { char *newfile; newfile = fl_file_chooser("Open File", "*.geo", NULL); if (newfile != NULL) { @@ -27,7 +139,7 @@ void file_open_cb(void) { } } -void file_merge_cb(void) { +void file_merge_cb(CALLBACK_ARGS) { char *newfile; newfile = fl_file_chooser("Merge File", "*.{geo,pos,msh}", NULL); if (newfile != NULL) { @@ -37,76 +149,442 @@ void file_merge_cb(void) { } } -void file_save_cb(void) { +void file_save_cb(CALLBACK_ARGS) { + Print_Mesh(&M, NULL, CTX.mesh.format); } -void file_save_as_cb(void) { +void file_save_as_cb(CALLBACK_ARGS) { + char *newfile; + newfile = fl_file_chooser("Save File", "*.{geo,pos,msh}", NULL); + void CreateFile (char *name, int format) ; + if (newfile != NULL) + CreateFile(newfile, FORMAT_AUTO); } -void file_reload_all_views_cb(void) { +static int RELOAD_ALL_VIEWS = 0 ; + +void file_reload_all_views_cb(CALLBACK_ARGS) { + if(!Post_ViewList) return; + RELOAD_ALL_VIEWS = 1; + for(int i = 1 ; i<=List_Nbr(Post_ViewList) ; i++) + view_reload_cb(NULL, (void *)i); + RELOAD_ALL_VIEWS = 0; + Init(); + Draw(); } -void file_remove_all_views_cb(void) { +static int REMOVE_ALL_VIEWS = 0 ; + +void file_remove_all_views_cb(CALLBACK_ARGS) { + if(!Post_ViewList) return; + REMOVE_ALL_VIEWS = 1; + while(List_Nbr(Post_ViewList)) + view_remove_cb(NULL, (void*)1); + REMOVE_ALL_VIEWS = 0; + Init(); + Draw(); } -void file_quit_cb(void) { +void file_quit_cb(CALLBACK_ARGS) { exit(0); } // Option Menu -void opt_general_cb(void) { +void opt_general_cb(CALLBACK_ARGS) { WID->opt_general(); } - -void opt_geometry_cb(void) { +void opt_geometry_cb(CALLBACK_ARGS) { + WID->opt_geometry(); } -void opt_mesh_cb(void) { +void opt_mesh_cb(CALLBACK_ARGS) { + WID->opt_mesh(); } -void opt_post_cb(void) { +void opt_post_cb(CALLBACK_ARGS) { + WID->opt_post(); } -void opt_stat_cb(void) { +void opt_stat_cb(CALLBACK_ARGS) { + WID->opt_stat(); } // Help Menu -void help_short_cb(void){ +void help_short_cb(CALLBACK_ARGS){ + WID->help_short(); } -void help_about_cb(void){ +void help_about_cb(CALLBACK_ARGS){ + WID->help_about(); } // Module Menu -void mod_geometry_cb(void){ +void mod_geometry_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry, 0); +} +void mod_mesh_cb(CALLBACK_ARGS){ + WID->set_context(menu_mesh, 0); } -void mod_mesh_cb(void){ +void mod_post_cb(CALLBACK_ARGS){ + WID->set_context(menu_post, 0); } -void mod_post_cb(void){ +void mod_back_cb(CALLBACK_ARGS){ + WID->set_context(NULL, -1); +} +void mod_forward_cb(CALLBACK_ARGS){ + WID->set_context(NULL, 1); } -// View Menus +// Dynamic Menus -void view_reload_cb(Fl_Widget* w, void* data){ - printf("Reload view %d \n", (int)data); +void geometry_elementary_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary, 0); +} +void geometry_physical_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_physical, 0); +} +void geometry_reload_cb(CALLBACK_ARGS){ + printf("reload geometry\n"); +} +void geometry_elementary_add_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add, 0); +} +void geometry_elementary_translate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_translate, 0); +} +void geometry_elementary_rotate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_rotate, 0); +} +void geometry_elementary_dilate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_dilate, 0); +} +void geometry_elementary_symmetry_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_symmetry, 0); +} +void geometry_elementary_extrude_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_extrude, 0); +} +void geometry_elementary_delete_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_delete, 0); +} +void geometry_elementary_add_new_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add_new, 0); +} +void geometry_elementary_add_translate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add_translate, 0); +} +void geometry_elementary_add_rotate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add_rotate, 0); +} +void geometry_elementary_add_dilate_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add_dilate, 0); +} +void geometry_elementary_add_symmetry_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_elementary_add_symmetry, 0); +} +void geometry_elementary_add_new_parameter_cb(CALLBACK_ARGS){ + printf("new param\n"); +} +void geometry_elementary_add_new_point_cb(CALLBACK_ARGS){ + printf("new point\n"); +} +void geometry_elementary_add_new_line_cb(CALLBACK_ARGS){ + printf("new line\n"); +} +void geometry_elementary_add_new_spline_cb(CALLBACK_ARGS){ + printf("new spline\n"); +} +void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS){ + printf("new circle\n"); +} +void geometry_elementary_add_new_ellipsis_cb(CALLBACK_ARGS){ + printf("new ellipsis\n"); +} +void geometry_elementary_add_new_planesurface_cb(CALLBACK_ARGS){ + printf("new plane surf\n"); +} +void geometry_elementary_add_new_ruledsurface_cb(CALLBACK_ARGS){ + printf("new rules surf\n"); +} +void geometry_elementary_add_new_volume_cb(CALLBACK_ARGS){ + printf("new vol\n"); +} +void geometry_elementary_add_translate_point_cb(CALLBACK_ARGS){ + printf("translate point\n"); +} +void geometry_elementary_add_translate_curve_cb(CALLBACK_ARGS){ + printf("translate curve\n"); +} +void geometry_elementary_add_translate_surface_cb(CALLBACK_ARGS){ + printf("translate surface\n"); +} +void geometry_elementary_add_rotate_point_cb(CALLBACK_ARGS){ + printf("rotate point\n"); +} +void geometry_elementary_add_rotate_curve_cb(CALLBACK_ARGS){ + printf("rotate curve\n"); +} +void geometry_elementary_add_rotate_surface_cb(CALLBACK_ARGS){ + printf("rotate surf\n"); +} +void geometry_elementary_add_dilate_point_cb(CALLBACK_ARGS){ + printf("dilate point\n"); +} +void geometry_elementary_add_dilate_curve_cb(CALLBACK_ARGS){ + printf("dilate curve\n"); +} +void geometry_elementary_add_dilate_surface_cb(CALLBACK_ARGS){ + printf("dilate surface\n"); +} +void geometry_elementary_add_symmetry_point_cb(CALLBACK_ARGS){ + printf("symm point\n"); +} +void geometry_elementary_add_symmetry_curve_cb(CALLBACK_ARGS){ + printf("symm curve\n"); +} +void geometry_elementary_add_symmetry_surface_cb(CALLBACK_ARGS){ + printf("symm surf\n"); +} +void geometry_elementary_translate_point_cb(CALLBACK_ARGS){ + printf("translate point\n"); +} +void geometry_elementary_translate_curve_cb(CALLBACK_ARGS){ + printf("translate curve\n"); +} +void geometry_elementary_translate_surface_cb(CALLBACK_ARGS){ + printf("translate surf\n"); } -void view_remove_cb(Fl_Widget* w, void* data){ - printf("Remove view %d \n", (int)data); +void geometry_elementary_rotate_point_cb(CALLBACK_ARGS){ + printf("rot point\n"); } -void view_duplicate_cb(Fl_Widget* w, void* data){ - printf("Duplicate view %d \n", (int)data); +void geometry_elementary_rotate_curve_cb(CALLBACK_ARGS){ + printf("rot curve\n"); } -void view_lighting_cb(Fl_Widget* w, void* data){ +void geometry_elementary_rotate_surface_cb(CALLBACK_ARGS){ + printf("rot surf\n"); +} +void geometry_elementary_dilate_point_cb(CALLBACK_ARGS){ + printf("dilate point\n"); +} +void geometry_elementary_dilate_curve_cb(CALLBACK_ARGS){ + printf("dilate curve\n"); +} +void geometry_elementary_dilate_surface_cb(CALLBACK_ARGS){ + printf("dilate surf\n"); +} +void geometry_elementary_symmetry_point_cb(CALLBACK_ARGS){ + printf("symm point\n"); +} +void geometry_elementary_symmetry_curve_cb(CALLBACK_ARGS){ + printf("symm curve\n"); +} +void geometry_elementary_symmetry_surface_cb(CALLBACK_ARGS){ + printf("symm surf\n"); +} +void geometry_elementary_extrude_point_cb(CALLBACK_ARGS){ + printf("extr point\n"); +} +void geometry_elementary_extrude_curve_cb(CALLBACK_ARGS){ + printf("extr curve\n"); +} +void geometry_elementary_extrude_surface_cb(CALLBACK_ARGS){ + printf("extr surf\n"); +} +void geometry_elementary_delete_point_cb(CALLBACK_ARGS){ + printf("del point\n"); +} +void geometry_elementary_delete_curve_cb(CALLBACK_ARGS){ + printf("del curve\n"); +} +void geometry_elementary_delete_surface_cb(CALLBACK_ARGS){ + printf("del surf\n"); +} +void geometry_physical_add_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_physical_add, 0); +} +void geometry_physical_delete_cb(CALLBACK_ARGS){ + WID->set_context(menu_geometry_physical_delete, 0); +} +void geometry_physical_add_point_cb (CALLBACK_ARGS){ + printf("phys add point\n"); +} +void geometry_physical_add_curve_cb (CALLBACK_ARGS){ + printf("phys add curve\n"); +} +void geometry_physical_add_surface_cb (CALLBACK_ARGS){ + printf("phys add surf\n"); +} +void geometry_physical_add_volume_cb (CALLBACK_ARGS){ + printf("phys add vol\n"); +} +void geometry_physical_delete_point_cb(CALLBACK_ARGS){ + printf("phys delpoint\n"); +} +void geometry_physical_delete_curve_cb(CALLBACK_ARGS){ + printf("phys del curve\n"); +} +void geometry_physical_delete_surface_cb(CALLBACK_ARGS){ + printf("phys adel surf\n"); +} +void geometry_physical_delete_volume_cb(CALLBACK_ARGS){ + printf("phys del vol\n"); +} +void mesh_define_cb(CALLBACK_ARGS){ + WID->set_context(menu_mesh_define, 0); +} +void mesh_1d_cb(CALLBACK_ARGS){ + printf("mesh 1d\n"); +} +void mesh_2d_cb(CALLBACK_ARGS){ + printf("mesh 2d\n"); +} +void mesh_3d_cb(CALLBACK_ARGS){ + printf("mesh 3d\n"); +} +void mesh_define_length_cb (CALLBACK_ARGS){ + printf("mesh define length\n"); +} +void mesh_define_recombine_cb (CALLBACK_ARGS){ + printf("mesh define reco\n"); +} +void mesh_define_transfinite_cb (CALLBACK_ARGS){ + WID->set_context(menu_mesh_define_transfinite, 0); +} +void mesh_define_transfinite_line_cb(CALLBACK_ARGS){ + printf("mesh define tr line\n"); +} +void mesh_define_transfinite_surface_cb(CALLBACK_ARGS){ + printf("mesh define tr su\n"); +} +void mesh_define_transfinite_volume_cb(CALLBACK_ARGS){ + printf("mesh define tr vol\n"); +} + +void view_toggle_cb(CALLBACK_ARGS){ + if(!Post_ViewList) return; + + Post_View *v = (Post_View*)List_Pointer(Post_ViewList,(int)data); + + Msg(DEBUG, "View %d\n" + DEBUG_NIL " -> Name '%s'\n" + DEBUG_NIL " -> FileName '%s'\n" + DEBUG_NIL " -> DuplicateOf %d\n" + DEBUG_NIL " -> Links %d", + v->Num, v->Name, v->FileName, v->DuplicateOf, v->Links); + + v->Visible = !v->Visible; + + Init(); + Draw(); +} + +void view_reload_cb(CALLBACK_ARGS){ + Post_View tmp ; + char filename[NAME_STR_L]; + extern int Force_ViewNumber; + + if(!Post_ViewList) return; + + Post_View *v = (Post_View*)List_Pointer(Post_ViewList,(int)data); + strcpy(filename, v->FileName); + CopyViewOptions(v, &tmp); + + Force_ViewNumber = v->Num ; + FreeView(v); + MergeProblem(filename); + Force_ViewNumber = 0 ; + + v = (Post_View*)List_Pointer(Post_ViewList,(int)data); + CopyViewOptions(&tmp, v); + + if(!RELOAD_ALL_VIEWS){ + Init(); + Draw(); + } +} + +void view_remove_cb(CALLBACK_ARGS){ + Post_View *v = (Post_View*)List_Pointer(Post_ViewList,(int)data); + FreeView(v); + + if(!List_Suppress(Post_ViewList, v, fcmpPostViewNum)) + Msg(ERROR, "Could Not Suppress View from List"); + + CTX.post.nb_views = List_Nbr(Post_ViewList); + + if(WID->get_context() == 2) + WID->set_context(menu_post, 0); + + if(!REMOVE_ALL_VIEWS){ + Init(); + Draw(); + } +} + +void view_duplicate_cb(CALLBACK_ARGS){ + Post_View v, *v1, *v2, *v3 ; + + if(!Post_ViewList) return; + + v1 = (Post_View*)List_Pointer(Post_ViewList,(int)data); + + BeginView(0); + EndView(0, 0, v1->FileName, v1->Name, 0., 0., 0.); + + v2 = (Post_View*)List_Pointer(Post_ViewList,List_Nbr(Post_ViewList)-1); + + if(!v1->DuplicateOf){ + v2->DuplicateOf = v1->Num ; + v1->Links++ ; + } + else{ + v.Num = v1->DuplicateOf ; + if(!(v3 = (Post_View*)List_PQuery(Post_ViewList, &v, fcmpPostViewNum))){ + v2->DuplicateOf = v1->Num ; + v1->Links++ ; + } + else{ + v2->DuplicateOf = v3->Num; + v3->Links++ ; + } + } + + v2->Time = v1->Time; + v2->NbSP = v1->NbSP; v2->SP = v1->SP; + v2->NbVP = v1->NbVP; v2->VP = v1->VP; + v2->NbTP = v1->NbTP; v2->TP = v1->TP; + v2->NbSL = v1->NbSL; v2->SL = v1->SL; + v2->NbVL = v1->NbVL; v2->VL = v1->VL; + v2->NbTL = v1->NbTL; v2->TL = v1->TL; + v2->NbST = v1->NbST; v2->ST = v1->ST; + v2->NbVT = v1->NbVT; v2->VT = v1->VT; + v2->NbTT = v1->NbTT; v2->TT = v1->TT; + v2->NbSS = v1->NbSS; v2->SS = v1->SS; + v2->NbVS = v1->NbVS; v2->VS = v1->VS; + v2->NbTS = v1->NbTS; v2->TS = v1->TS; + v2->ScalarOnly = v1->ScalarOnly; + v2->Min = v1->Min; + v2->Max = v1->Max; + v2->NbTimeStep = v1->NbTimeStep; + + CopyViewOptions(v1, v2); + + AddViewInUI(List_Nbr(Post_ViewList), v2->Name, v2->Num); + Init(); + Draw(); +} + +void view_lighting_cb(CALLBACK_ARGS){ printf("Light view %d \n", (int)data); } -void view_elements_cb(Fl_Widget* w, void* data){ +void view_elements_cb(CALLBACK_ARGS){ printf("Show Elements view %d \n", (int)data); } -void view_applybgmesh_cb(Fl_Widget* w, void* data){ +void view_applybgmesh_cb(CALLBACK_ARGS){ printf("Apply bgmesh view %d \n", (int)data); } -void view_timestep_cb(Fl_Widget* w, void* data){ +void view_timestep_cb(CALLBACK_ARGS){ printf("Timestep view %d \n", (int)data); } -void view_options_cb(Fl_Widget* w, void* data){ +void view_options_cb(CALLBACK_ARGS){ printf("Options view %d \n", (int)data); } diff --git a/Fltk/Callbacks.h b/Fltk/Callbacks.h index f04535f8cd..dab7872741 100644 --- a/Fltk/Callbacks.h +++ b/Fltk/Callbacks.h @@ -1,34 +1,132 @@ #ifndef _CALLBACKS_H_ #define _CALLBACKS_H_ -void file_open_cb(void) ; -void file_merge_cb(void) ; -void file_save_cb(void) ; -void file_save_as_cb(void) ; -void file_reload_all_views_cb(void) ; -void file_remove_all_views_cb(void) ; -void file_quit_cb(void) ; - -void opt_general_cb(void) ; -void opt_geometry_cb(void) ; -void opt_mesh_cb(void) ; -void opt_post_cb(void) ; -void opt_stat_cb(void) ; - -void help_short_cb(void) ; -void help_about_cb(void) ; - -void mod_geometry_cb(void) ; -void mod_mesh_cb(void) ; -void mod_post_cb(void) ; - -void view_reload_cb(Fl_Widget* w, void*) ; -void view_remove_cb(Fl_Widget* w, void*) ; -void view_duplicate_cb(Fl_Widget* w, void*) ; -void view_lighting_cb(Fl_Widget* w, void*) ; -void view_elements_cb(Fl_Widget* w, void*) ; -void view_timestep_cb(Fl_Widget* w, void*) ; -void view_options_cb(Fl_Widget* w, void*) ; -void view_applybgmesh_cb(Fl_Widget* w, void*) ; +#define CALLBACK_ARGS Fl_Widget* w, void* data + +// Graphical window + +void status_xyz1p_cb(CALLBACK_ARGS) ; +void status_play_cb(CALLBACK_ARGS) ; +void status_pause_cb(CALLBACK_ARGS) ; +void status_cancel_cb(CALLBACK_ARGS) ; + +// File Menu + +void file_open_cb(CALLBACK_ARGS) ; +void file_merge_cb(CALLBACK_ARGS) ; +void file_save_cb(CALLBACK_ARGS) ; +void file_save_as_cb(CALLBACK_ARGS) ; +void file_reload_all_views_cb(CALLBACK_ARGS) ; +void file_remove_all_views_cb(CALLBACK_ARGS) ; +void file_quit_cb(CALLBACK_ARGS) ; + +// Option Menu + +void opt_general_cb(CALLBACK_ARGS) ; +void opt_geometry_cb(CALLBACK_ARGS) ; +void opt_mesh_cb(CALLBACK_ARGS) ; +void opt_post_cb(CALLBACK_ARGS) ; +void opt_stat_cb(CALLBACK_ARGS) ; + +// Help Menu + +void help_short_cb(CALLBACK_ARGS) ; +void help_about_cb(CALLBACK_ARGS) ; + +// Module Menu + +void mod_geometry_cb(CALLBACK_ARGS) ; +void mod_mesh_cb(CALLBACK_ARGS) ; +void mod_post_cb(CALLBACK_ARGS) ; +void mod_back_cb(CALLBACK_ARGS) ; +void mod_forward_cb(CALLBACK_ARGS) ; + +// Dynamic Menus + +void geometry_elementary_cb(CALLBACK_ARGS) ; +void geometry_physical_cb(CALLBACK_ARGS) ; +void geometry_reload_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_cb(CALLBACK_ARGS) ; +void geometry_elementary_translate_cb(CALLBACK_ARGS) ; +void geometry_elementary_rotate_cb(CALLBACK_ARGS) ; +void geometry_elementary_dilate_cb(CALLBACK_ARGS) ; +void geometry_elementary_symmetry_cb(CALLBACK_ARGS) ; +void geometry_elementary_extrude_cb(CALLBACK_ARGS) ; +void geometry_elementary_delete_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_translate_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_rotate_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_dilate_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_symmetry_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_parameter_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_line_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_spline_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_circle_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_ellipsis_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_planesurface_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_ruledsurface_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_new_volume_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_translate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_translate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_translate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_rotate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_rotate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_rotate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_dilate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_dilate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_dilate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_symmetry_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_symmetry_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_add_symmetry_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_translate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_translate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_translate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_rotate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_rotate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_rotate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_dilate_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_dilate_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_dilate_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_symmetry_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_symmetry_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_symmetry_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_extrude_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_extrude_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_extrude_surface_cb(CALLBACK_ARGS) ; +void geometry_elementary_delete_point_cb(CALLBACK_ARGS) ; +void geometry_elementary_delete_curve_cb(CALLBACK_ARGS) ; +void geometry_elementary_delete_surface_cb(CALLBACK_ARGS) ; +void geometry_physical_add_cb(CALLBACK_ARGS) ; +void geometry_physical_delete_cb(CALLBACK_ARGS) ; +void geometry_physical_add_point_cb (CALLBACK_ARGS) ; +void geometry_physical_add_curve_cb (CALLBACK_ARGS) ; +void geometry_physical_add_surface_cb (CALLBACK_ARGS) ; +void geometry_physical_add_volume_cb (CALLBACK_ARGS) ; +void geometry_physical_delete_point_cb(CALLBACK_ARGS) ; +void geometry_physical_delete_curve_cb(CALLBACK_ARGS) ; +void geometry_physical_delete_surface_cb(CALLBACK_ARGS) ; +void geometry_physical_delete_volume_cb(CALLBACK_ARGS) ; +void mesh_define_cb(CALLBACK_ARGS) ; +void mesh_1d_cb(CALLBACK_ARGS) ; +void mesh_2d_cb(CALLBACK_ARGS) ; +void mesh_3d_cb(CALLBACK_ARGS) ; +void mesh_define_length_cb (CALLBACK_ARGS) ; +void mesh_define_recombine_cb (CALLBACK_ARGS) ; +void mesh_define_transfinite_cb (CALLBACK_ARGS) ; +void mesh_define_transfinite_line_cb(CALLBACK_ARGS) ; +void mesh_define_transfinite_surface_cb(CALLBACK_ARGS) ; +void mesh_define_transfinite_volume_cb(CALLBACK_ARGS) ; +void view_reload_cb(CALLBACK_ARGS) ; +void view_toggle_cb(CALLBACK_ARGS) ; +void view_remove_cb(CALLBACK_ARGS) ; +void view_duplicate_cb(CALLBACK_ARGS) ; +void view_lighting_cb(CALLBACK_ARGS) ; +void view_elements_cb(CALLBACK_ARGS) ; +void view_applybgmesh_cb(CALLBACK_ARGS) ; +void view_timestep_cb(CALLBACK_ARGS) ; +void view_options_cb(CALLBACK_ARGS) ; + + #endif diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index 112e7d24c2..b39dd7671d 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -14,8 +14,7 @@ #include "Version.h" #include "GUI.h" #include "Callbacks.h" - -//int strtok_r(char *, char const *, char **){return 0;} +#include "Bitmaps.h" extern Context_T CTX; extern List_T *Post_ViewList; @@ -55,159 +54,159 @@ Fl_Menu_Item m_module_table[] = { // Definition of the dynamic contexts -Context_Item menu_geom[] = +Context_Item menu_geometry[] = { { "0", NULL } , - { "Elementary", NULL } , - { "Physical", NULL } , - { "Reload", NULL } , + { "Elementary", (Fl_Callback *)geometry_elementary_cb } , + { "Physical", (Fl_Callback *)geometry_physical_cb } , + { "Reload", (Fl_Callback *)geometry_reload_cb } , { NULL } }; - Context_Item menu_geom_elementary[] = + Context_Item menu_geometry_elementary[] = { { "0", NULL } , - { "Add", NULL } , - { "Translate", NULL } , - { "Rotate", NULL } , - { "Dilate", NULL } , - { "Symmetry", NULL } , - { "Extrude", NULL } , - { "Delete", NULL } , + { "Add", (Fl_Callback *)geometry_elementary_add_cb } , + { "Translate", (Fl_Callback *)geometry_elementary_translate_cb } , + { "Rotate", (Fl_Callback *)geometry_elementary_rotate_cb } , + { "Dilate", (Fl_Callback *)geometry_elementary_dilate_cb } , + { "Symmetry", (Fl_Callback *)geometry_elementary_symmetry_cb } , + { "Extrude", (Fl_Callback *)geometry_elementary_extrude_cb } , + { "Delete", (Fl_Callback *)geometry_elementary_delete_cb } , { NULL } }; - Context_Item menu_geom_elementary_add[] = + Context_Item menu_geometry_elementary_add[] = { { "0", NULL } , - { "New", NULL } , - { "Translate", NULL } , - { "Rotate", NULL } , - { "Dilate", NULL } , - { "Symmetry", NULL } , + { "New", (Fl_Callback *)geometry_elementary_add_new_cb } , + { "Translate", (Fl_Callback *)geometry_elementary_add_translate_cb } , + { "Rotate", (Fl_Callback *)geometry_elementary_add_rotate_cb } , + { "Dilate", (Fl_Callback *)geometry_elementary_add_dilate_cb } , + { "Symmetry", (Fl_Callback *)geometry_elementary_add_symmetry_cb } , { NULL } }; - Context_Item menu_geom_elementary_add_new[] = + Context_Item menu_geometry_elementary_add_new[] = { { "0", NULL } , - { "Parameter", NULL } , - { "Point", NULL } , - { "Line", NULL } , - { "Spline", NULL } , - { "Circle", NULL } , - { "Ellipsis", NULL } , - { "Plane Surface", NULL } , - { "Ruled Surface", NULL } , - { "Volume", NULL } , + { "Parameter", (Fl_Callback *)geometry_elementary_add_new_parameter_cb } , + { "Point", (Fl_Callback *)geometry_elementary_add_new_point_cb } , + { "Line", (Fl_Callback *)geometry_elementary_add_new_line_cb } , + { "Spline", (Fl_Callback *)geometry_elementary_add_new_spline_cb } , + { "Circle", (Fl_Callback *)geometry_elementary_add_new_circle_cb } , + { "Ellipsis", (Fl_Callback *)geometry_elementary_add_new_ellipsis_cb } , + { "Plane Surface", (Fl_Callback *)geometry_elementary_add_new_planesurface_cb } , + { "Ruled Surface", (Fl_Callback *)geometry_elementary_add_new_ruledsurface_cb } , + { "Volume", (Fl_Callback *)geometry_elementary_add_new_volume_cb } , { NULL } }; - Context_Item menu_geom_elementary_add_translate[] = + Context_Item menu_geometry_elementary_add_translate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_add_translate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_add_translate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_add_translate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_add_rotate[] = + Context_Item menu_geometry_elementary_add_rotate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_add_rotate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_add_rotate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_add_rotate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_add_dilate[] = + Context_Item menu_geometry_elementary_add_dilate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_add_dilate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_add_dilate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_add_dilate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_add_symmetry[] = + Context_Item menu_geometry_elementary_add_symmetry[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_add_symmetry_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_add_symmetry_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_add_symmetry_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_translate[] = + Context_Item menu_geometry_elementary_translate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_translate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_translate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_translate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_rotate[] = + Context_Item menu_geometry_elementary_rotate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_rotate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_rotate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_rotate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_dilate[] = + Context_Item menu_geometry_elementary_dilate[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_dilate_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_dilate_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_dilate_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_symmetry[] = + Context_Item menu_geometry_elementary_symmetry[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_symmetry_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_symmetry_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_symmetry_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_extrude[] = + Context_Item menu_geometry_elementary_extrude[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_extrude_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_extrude_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_extrude_surface_cb } , { NULL } }; - Context_Item menu_geom_elementary_delete[] = + Context_Item menu_geometry_elementary_delete[] = { { "0", NULL } , - { "Point", NULL } , - { "Curve", NULL } , - { "Surface", NULL } , + { "Point", (Fl_Callback *)geometry_elementary_delete_point_cb } , + { "Curve", (Fl_Callback *)geometry_elementary_delete_curve_cb } , + { "Surface", (Fl_Callback *)geometry_elementary_delete_surface_cb } , { NULL } }; - Context_Item menu_geom_physical[] = + Context_Item menu_geometry_physical[] = { { "0", NULL } , - { "Add", NULL } , - { "Delete", NULL } , + { "Add", (Fl_Callback *)geometry_physical_add_cb } , + { "Delete", (Fl_Callback *)geometry_physical_delete_cb } , { NULL } }; - Context_Item menu_geom_physical_add[] = + Context_Item menu_geometry_physical_add[] = { { "0", NULL } , - { "Point", NULL } , - { "Line", NULL } , - { "Surface", NULL } , - { "Volume", NULL } , + { "Point", (Fl_Callback *)geometry_physical_add_point_cb } , + { "Curve", (Fl_Callback *)geometry_physical_add_curve_cb } , + { "Surface", (Fl_Callback *)geometry_physical_add_surface_cb } , + { "Volume", (Fl_Callback *)geometry_physical_add_volume_cb } , { NULL } }; - Context_Item menu_geom_physical_delete[] = + Context_Item menu_geometry_physical_delete[] = { { "0", NULL } , - { "Point", NULL } , - { "Line", NULL } , - { "Surface", NULL } , - { "Volume", NULL } , + { "Point", (Fl_Callback *)geometry_physical_delete_point_cb } , + { "Line", (Fl_Callback *)geometry_physical_delete_curve_cb } , + { "Surface", (Fl_Callback *)geometry_physical_delete_surface_cb } , + { "Volume", (Fl_Callback *)geometry_physical_delete_volume_cb } , { NULL } }; Context_Item menu_mesh[] = { { "1", NULL } , - { "Define", NULL } , - { "1D", NULL } , - { "2D", NULL } , - { "3D", NULL } , + { "Define", (Fl_Callback *)mesh_define_cb } , + { "1D", (Fl_Callback *)mesh_1d_cb } , + { "2D", (Fl_Callback *)mesh_2d_cb } , + { "3D", (Fl_Callback *)mesh_3d_cb } , { NULL } }; Context_Item menu_mesh_define[] = { { "1", NULL } , - { "Length", NULL } , - { "Recombine", NULL } , - { "Transfinite", NULL } , + { "Length", (Fl_Callback *)mesh_define_length_cb } , + { "Recombine", (Fl_Callback *)mesh_define_recombine_cb } , + { "Transfinite", (Fl_Callback *)mesh_define_transfinite_cb } , { NULL } }; Context_Item menu_mesh_define_transfinite[] = { { "1", NULL } , - { "Line", NULL } , - { "Surface", NULL } , - { "Volume", NULL } , + { "Line", (Fl_Callback *)mesh_define_transfinite_line_cb } , + { "Surface", (Fl_Callback *)mesh_define_transfinite_surface_cb } , + { "Volume", (Fl_Callback *)mesh_define_transfinite_volume_cb } , { NULL } }; @@ -228,6 +227,12 @@ GUI::GUI() { if(strlen(CTX.display)) Fl::display(CTX.display); + // Icons + + icon1_bmp = new Fl_Bitmap(g1_bits,g1_width,g1_height); + icon2_bmp = new Fl_Bitmap(g2_bits,g2_width,g2_height); + icon3_bmp = new Fl_Bitmap(g3_bits,g3_width,g3_height); + // Menu Window { @@ -240,6 +245,7 @@ GUI::GUI() { { Fl_Menu_Bar *o = new Fl_Menu_Bar(0,0,width,BH); o->menu(m_menubar_table); + o->global(); o->textsize(CTX.fontsize); o->box(FL_UP_BOX); } @@ -253,12 +259,14 @@ GUI::GUI() { m_navig_butt[0]->labeltype(FL_SYMBOL_LABEL); m_navig_butt[0]->box(FL_FLAT_BOX); m_navig_butt[0]->selection_color(FL_WHITE); + m_navig_butt[0]->callback(mod_back_cb); m_navig_butt[1] = new Fl_Button(2,y+BH/2,20,BH/2,"@>"); m_navig_butt[1]->labeltype(FL_SYMBOL_LABEL); m_navig_butt[1]->box(FL_FLAT_BOX); m_navig_butt[1]->selection_color(FL_WHITE); + m_navig_butt[1]->callback(mod_forward_cb); - m_module_butt = new Fl_Choice(22,y,width-29,BH); + m_module_butt = new Fl_Choice(22,y,width-28,BH); m_module_butt->menu(m_module_table); m_module_butt->textsize(CTX.fontsize); m_module_butt->box(FL_THIN_DOWN_BOX); @@ -271,7 +279,8 @@ GUI::GUI() { m_push_butt[i]->hide(); m_toggle_butt[i] = new Fl_Light_Button(0,y+i*BH,width,BH,"test"); m_toggle_butt[i]->labelsize(CTX.fontsize); - if(i>5)m_toggle_butt[i]->hide(); + m_toggle_butt[i]->callback(view_toggle_cb, (void*)i); + m_toggle_butt[i]->hide(); m_popup_butt[i] = new Fl_Menu_Button(0,y+i*BH,width,BH); m_popup_butt[i]->type(Fl_Menu_Button::POPUP3); m_popup_butt[i]->add("Reload", 0, @@ -291,7 +300,7 @@ GUI::GUI() { m_popup_butt[i]->add("Options...", 0, (Fl_Callback *)view_options_cb, (void*)i, 0); m_popup_butt[i]->textsize(CTX.fontsize); - if(i>5)m_popup_butt[i]->hide(); + m_popup_butt[i]->hide(); } m_window->position(800,50); @@ -304,7 +313,6 @@ GUI::GUI() { { g_window = new Fl_Window(700,520); - g_opengl_window = new Opengl_Window(0,0,700,500); { @@ -312,14 +320,31 @@ GUI::GUI() { o->box(FL_THIN_UP_BOX); x = 2; + g_status_butt[0] = new Fl_Button(x,502,15,16,"X"); x+=15; + g_status_butt[0]->callback(status_xyz1p_cb, (void*)0); //g_status_butt[0]->tooltip("Set X view"); g_status_butt[1] = new Fl_Button(x,502,15,16,"Y"); x+=15; + g_status_butt[1]->callback(status_xyz1p_cb, (void*)1); g_status_butt[2] = new Fl_Button(x,502,15,16,"Z"); x+=15; - g_status_butt[3] = new Fl_Button(x,502,16,16,"1:1"); x+=16; + g_status_butt[2]->callback(status_xyz1p_cb, (void*)2); + g_status_butt[3] = new Fl_Button(x,502,20,16,"1:1"); x+=20; + g_status_butt[3]->callback(status_xyz1p_cb, (void*)3); g_status_butt[4] = new Fl_Button(x,502,15,16,"?"); x+=15; + g_status_butt[4]->callback(status_xyz1p_cb, (void*)4); + g_status_butt[5] = new Fl_Button(x,502,15,16,">>"); x+=15; + g_status_butt[5]->callback(status_play_cb); + start_bmp = new Fl_Bitmap(start_bits,start_width,start_height); + start_bmp->label(g_status_butt[5]); + stop_bmp = new Fl_Bitmap(stop_bits,stop_width,stop_height); + g_status_butt[6] = new Fl_Button(x,502,15,16,"0"); x+=15; + g_status_butt[6]->callback(status_cancel_cb); + abort_bmp = new Fl_Bitmap(abort_bits,abort_width,abort_height); + abort_bmp->label(g_status_butt[6]); + g_status_butt[6]->deactivate(); + for(i = 0 ; i<7 ; i++){ g_status_butt[i]->box(FL_FLAT_BOX); g_status_butt[i]->selection_color(FL_WHITE); @@ -327,13 +352,13 @@ GUI::GUI() { g_status_butt[i]->align(FL_ALIGN_CENTER|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); } - g_status_box[0] = new Fl_Box(x,502,(700-x)/3,16); - g_status_box[1] = new Fl_Box(x+(700-x)/3,5022,(700-x)/3,16); - g_status_box[2] = new Fl_Box(x+2*(700-x)/3,5022,(700-x)/3-2,16); + g_status_label[0] = new Fl_Box(x,502,(700-x)/3,16); + g_status_label[1] = new Fl_Box(x+(700-x)/3,5022,(700-x)/3,16); + g_status_label[2] = new Fl_Box(x+2*(700-x)/3,5022,(700-x)/3-2,16); for(i = 0 ; i<3 ; i++){ - g_status_box[i]->box(FL_FLAT_BOX); - g_status_box[i]->labelsize(CTX.fontsize); - g_status_box[i]->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); + g_status_label[i]->box(FL_FLAT_BOX); + g_status_label[i]->labelsize(CTX.fontsize); + g_status_label[i]->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE|FL_ALIGN_CLIP); } o->end(); @@ -352,6 +377,19 @@ GUI::GUI() { } +// Set animation button + +void GUI::set_anim(int mode){ + if(mode){ + g_status_butt[5]->callback(status_play_cb); + start_bmp->label(g_status_butt[5]); + } + else{ + g_status_butt[5]->callback(status_pause_cb); + stop_bmp->label(g_status_butt[5]); + } +} + // Draw the opengl window void GUI::draw_gl(){ @@ -378,27 +416,17 @@ void GUI::check(){ // Set the size of the graphical window -void GUI::set_size(int w, int h){ - static int initw, inith, init=0; - if(!init){ - init = 1; - initw = w; - inith = h; - } - if(w == initw && h == inith) return; - initw = w; - inith = h; - int hh = g_window->h()-g_opengl_window->h(); - g_window->size(w,h+hh); +void GUI::set_gl_size(int new_w, int new_h){ + g_window->size(new_w,new_h+g_window->h()-g_opengl_window->h()); } -// Dymanically set the height of the menu window +// Dynamically set the height of the menu window void GUI::set_menu_size(int nb_butt){ m_window->size(m_window->w(), MH + nb_butt*BH); } -// Dymanically set the context +// Dynamically set the context void GUI::set_context(Context_Item *menu_asked, int flag){ static int nb_back = 0, nb_forward = 0, init_context=0; @@ -414,6 +442,8 @@ void GUI::set_context(Context_Item *menu_asked, int flag){ } } + if(nb_back > NB_HISTORY_MAX-2) nb_back = 1; // we should do a circular list + if(flag == -1){ if(nb_back > 1){ nb_back--; @@ -466,7 +496,8 @@ void GUI::set_context(Context_Item *menu_asked, int flag){ m_popup_butt[i]->hide(); if(menu[i+1].label){ m_push_butt[i]->label(menu[i+1].label); - //m_push_butt[i]->callback(menu[i+1].callback); + m_push_butt[i]->callback(menu[i+1].callback); + m_push_butt[i]->redraw(); m_push_butt[i]->show(); nb++; } @@ -484,6 +515,10 @@ void GUI::set_context(Context_Item *menu_asked, int flag){ } +int GUI::get_context(){ + return m_module_butt->value(); +} + // Create the window for general options void GUI::opt_general(){ @@ -575,3 +610,422 @@ void GUI::opt_general(){ } } + +// Create the window for geometry options + +void GUI::opt_geometry(){ + static int init_opt_geometry = 0; + + if(!init_opt_geometry){ + init_opt_geometry = 1 ; + + int width = 280; + int height = 5*WB+9*BH ; + + geo_window = new Fl_Window(width,height); + geo_window->box(FL_THIN_UP_BOX); + { + Fl_Tabs* o = new Fl_Tabs(WB, WB, width-2*WB, height-3*WB-BH); + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Visibility"); + o->labelsize(CTX.fontsize); + geo_butt[0] = new Fl_Check_Button(2*WB, 2*WB+BH, 100, BH, "Points"); + geo_butt[1] = new Fl_Check_Button(2*WB, 2*WB+2*BH, 100, BH, "Curves"); + geo_butt[2] = new Fl_Check_Button(2*WB, 2*WB+3*BH, 100, BH, "Surfaces"); + geo_butt[3] = new Fl_Check_Button(2*WB, 2*WB+4*BH, 100, BH, "Volumes"); + geo_butt[4] = new Fl_Check_Button(2*WB+120, 2*WB+BH, 100, BH, "Point Numbers"); + geo_butt[5] = new Fl_Check_Button(2*WB+120, 2*WB+2*BH, 100, BH, "Curve Numbers"); + geo_butt[6] = new Fl_Check_Button(2*WB+120, 2*WB+3*BH, 100, BH, "Surface Numbers"); + geo_butt[7] = new Fl_Check_Button(2*WB+120, 2*WB+4*BH, 100, BH, "Volume Numbers"); + for(int i=0 ; i<8 ; i++){ + geo_butt[i]->type(FL_TOGGLE_BUTTON); + geo_butt[i]->down_box(FL_DOWN_BOX); + geo_butt[i]->labelsize(CTX.fontsize); + geo_butt[i]->selection_color(FL_YELLOW); + } + geo_value[0] = new Fl_Value_Input(2*WB, 2*WB+5*BH, 100, BH, "Entity Number"); + geo_value[0]->minimum(0); geo_value[0]->maximum(1000); geo_value[0]->step(1); + geo_value[1] = new Fl_Value_Input(2*WB, 2*WB+6*BH, 100, BH, "Normals"); + geo_value[1]->minimum(0); geo_value[1]->maximum(100); geo_value[1]->step(1); + geo_value[2] = new Fl_Value_Input(2*WB, 2*WB+7*BH, 100, BH, "Tangents"); + geo_value[2]->minimum(0); geo_value[2]->maximum(100); geo_value[2]->step(1); + for(int i=0 ; i<3 ; i++){ + geo_value[i]->labelsize(CTX.fontsize); + geo_value[i]->type(FL_HORIZONTAL); + geo_value[i]->align(FL_ALIGN_RIGHT); + } + o->end(); + } + o->end(); + } + + { + Fl_Button* o = new Fl_Button(width-2*60-2*WB, height-BH-WB, 60, BH, "cancel"); + o->labelsize(CTX.fontsize); + } + { + Fl_Return_Button* o = new Fl_Return_Button(width-60-WB, height-BH-WB, 60, BH, "OK"); + o->labelsize(CTX.fontsize); + } + + geo_window->end(); + geo_window->show(); + } + else{ + if(geo_window->shown()) + geo_window->hide(); + else + geo_window->show(); + + } + +} + +// Create the window for mesh options + +void GUI::opt_mesh(){ + static int init_opt_mesh = 0; + + if(!init_opt_mesh){ + init_opt_mesh = 1 ; + + int width = 280; + int height = 5*WB+9*BH ; + + mesh_window = new Fl_Window(width,height); + mesh_window->box(FL_THIN_UP_BOX); + { + Fl_Tabs* o = new Fl_Tabs(WB, WB, width-2*WB, height-3*WB-BH); + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Algorithm"); + o->labelsize(CTX.fontsize); + o->hide(); + mesh_butt[0] = new Fl_Check_Button(2*WB, 2*WB+BH, 100, BH, "Second Order"); + mesh_butt[1] = new Fl_Check_Button(2*WB, 2*WB+2*BH, 100, BH, "Interactive"); + mesh_butt[2] = new Fl_Check_Button(2*WB, 2*WB+3*BH, 100, BH, "Anisotropic"); + for(int i=0 ; i<3 ; i++){ + mesh_butt[i]->type(FL_TOGGLE_BUTTON); + mesh_butt[i]->down_box(FL_DOWN_BOX); + mesh_butt[i]->labelsize(CTX.fontsize); + mesh_butt[i]->selection_color(FL_YELLOW); + } + mesh_value[0] = new Fl_Value_Input(2*WB, 2*WB+4*BH, 40, BH, "Smoothing Steps"); + mesh_value[0]->minimum(0); mesh_value[0]->maximum(1000); mesh_value[0]->step(1); + for(int i=0 ; i<1 ; i++){ + mesh_value[i]->labelsize(CTX.fontsize); + mesh_value[i]->type(FL_HORIZONTAL); + mesh_value[i]->align(FL_ALIGN_RIGHT); + } + o->end(); + } + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Visibility"); + o->labelsize(CTX.fontsize); + mesh_butt[3] = new Fl_Check_Button(2*WB, 2*WB+BH, 100, BH, "Points"); + mesh_butt[4] = new Fl_Check_Button(2*WB, 2*WB+2*BH, 100, BH, "Curves"); + mesh_butt[5] = new Fl_Check_Button(2*WB, 2*WB+3*BH, 100, BH, "Surfaces"); + mesh_butt[6] = new Fl_Check_Button(2*WB, 2*WB+4*BH, 100, BH, "Volumes"); + mesh_butt[7] = new Fl_Check_Button(2*WB+120, 2*WB+BH, 100, BH, "Point Numebers"); + mesh_butt[8] = new Fl_Check_Button(2*WB+120, 2*WB+2*BH, 100, BH, "Curve Numbers"); + mesh_butt[9] = new Fl_Check_Button(2*WB+120, 2*WB+3*BH, 100, BH, "Surface Numbers"); + mesh_butt[10] = new Fl_Check_Button(2*WB+120, 2*WB+4*BH, 100, BH, "Volume Numbers"); + for(int i=3 ; i<11 ; i++){ + mesh_butt[i]->type(FL_TOGGLE_BUTTON); + mesh_butt[i]->down_box(FL_DOWN_BOX); + mesh_butt[i]->labelsize(CTX.fontsize); + mesh_butt[i]->selection_color(FL_YELLOW); + } + mesh_value[1] = new Fl_Value_Input(2*WB, 2*WB+5*BH, 100, BH, "Entity Number"); + mesh_value[1]->minimum(0); mesh_value[1]->maximum(1000); mesh_value[1]->step(1); + mesh_value[2] = new Fl_Value_Input(2*WB, 2*WB+6*BH, 100, BH, "Element Quality"); + mesh_value[2]->minimum(0); mesh_value[2]->maximum(1000); mesh_value[2]->step(1); + mesh_value[3] = new Fl_Value_Input(2*WB, 2*WB+7*BH, 100, BH, "Normals"); + mesh_value[3]->minimum(0); mesh_value[3]->maximum(100); mesh_value[3]->step(1); + for(int i=1 ; i<4 ; i++){ + mesh_value[i]->labelsize(CTX.fontsize); + mesh_value[i]->type(FL_HORIZONTAL); + mesh_value[i]->align(FL_ALIGN_RIGHT); + } + o->end(); + } + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Aspect"); + o->labelsize(CTX.fontsize); + o->hide(); + mesh_butt[11] = new Fl_Check_Button(2*WB, 2*WB+BH, 100, BH, "Wireframe"); + mesh_butt[12] = new Fl_Check_Button(2*WB, 2*WB+2*BH, 100, BH, "Hidden lines"); + mesh_butt[13] = new Fl_Check_Button(2*WB, 2*WB+3*BH, 100, BH, "Solid"); + for(int i=11 ; i<14 ; i++){ + mesh_butt[i]->type(FL_TOGGLE_BUTTON); + mesh_butt[i]->down_box(FL_DOWN_BOX); + mesh_butt[i]->labelsize(CTX.fontsize); + mesh_butt[i]->selection_color(FL_YELLOW); + } + mesh_value[4] = new Fl_Value_Input(2*WB, 2*WB+4*BH, 40, BH, "Explode"); + mesh_value[4]->minimum(0); mesh_value[4]->maximum(100); mesh_value[4]->step(1); + o->end(); + for(int i=4 ; i<5 ; i++){ + mesh_value[i]->labelsize(CTX.fontsize); + mesh_value[i]->type(FL_HORIZONTAL); + mesh_value[i]->align(FL_ALIGN_RIGHT); + } + } + o->end(); + } + + { + Fl_Button* o = new Fl_Button(width-2*60-2*WB, height-BH-WB, 60, BH, "cancel"); + o->labelsize(CTX.fontsize); + } + { + Fl_Return_Button* o = new Fl_Return_Button(width-60-WB, height-BH-WB, 60, BH, "OK"); + o->labelsize(CTX.fontsize); + } + + mesh_window->end(); + mesh_window->show(); + } + else{ + if(mesh_window->shown()) + mesh_window->hide(); + else + mesh_window->show(); + + } + +} + + +// Create the window for post-processing options + +void GUI::opt_post(){ + static int init_opt_post = 0; + + if(!init_opt_post){ + init_opt_post = 1 ; + + int width = 200; + int height = 5*WB+5*BH ; + + post_window = new Fl_Window(width,height); + post_window->box(FL_THIN_UP_BOX); + { + Fl_Tabs* o = new Fl_Tabs(WB, WB, width-2*WB, height-3*WB-BH); + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Links"); + o->labelsize(CTX.fontsize); + post_butt[0] = new Fl_Check_Button(2*WB, 2*WB+BH, 150, BH, "No link between views"); + post_butt[1] = new Fl_Check_Button(2*WB, 2*WB+2*BH, 150, BH, "Link all views"); + post_butt[2] = new Fl_Check_Button(2*WB, 2*WB+3*BH, 150, BH, "Link visible views"); + for(int i=0 ; i<3 ; i++){ + post_butt[i]->type(FL_RADIO_BUTTON); + post_butt[i]->labelsize(CTX.fontsize); + post_butt[i]->selection_color(FL_YELLOW); + } + o->end(); + } + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Animation"); + o->labelsize(CTX.fontsize); + o->hide(); + post_value[0] = new Fl_Value_Input(2*WB, 2*WB+BH, 40, BH, "Animation delay"); + post_value[0]->minimum(0); post_value[0]->maximum(10); post_value[0]->step(0.1); + for(int i=0 ; i<1 ; i++){ + post_value[i]->labelsize(CTX.fontsize); + post_value[i]->type(FL_HORIZONTAL); + post_value[i]->align(FL_ALIGN_RIGHT); + } + o->end(); + } + o->end(); + } + + { + Fl_Button* o = new Fl_Button(width-2*60-2*WB, height-BH-WB, 60, BH, "cancel"); + o->labelsize(CTX.fontsize); + } + { + Fl_Return_Button* o = new Fl_Return_Button(width-60-WB, height-BH-WB, 60, BH, "OK"); + o->labelsize(CTX.fontsize); + } + + post_window->end(); + post_window->show(); + } + else{ + if(post_window->shown()) + post_window->hide(); + else + post_window->show(); + + } + +} + +// Create the window for the statistics + +void GUI::opt_stat(){ + static int init_opt_stat = 0; + + if(!init_opt_stat){ + init_opt_stat = 1 ; + + int width = 234; + int height = 5*WB+16*BH ; + + stat_window = new Fl_Window(width,height); + stat_window->box(FL_THIN_UP_BOX); + { + Fl_Tabs* o = new Fl_Tabs(WB, WB, width-2*WB, height-3*WB-BH); + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Geometry"); + o->labelsize(CTX.fontsize); + o->hide(); + stat_value[0] = new Fl_Value_Output(110+2*WB, 2*WB+BH, 100, BH, "Number of points"); + stat_value[1] = new Fl_Value_Output(110+2*WB, 2*WB+2*BH, 100, BH, "Number of curves"); + stat_value[2] = new Fl_Value_Output(110+2*WB, 2*WB+3*BH, 100, BH, "Number of surfaces"); + stat_value[3] = new Fl_Value_Output(110+2*WB, 2*WB+4*BH, 100, BH, "Number of volumes"); + o->end(); + } + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Mesh"); + o->labelsize(CTX.fontsize); + stat_value[4] = new Fl_Value_Output(110+2*WB, 2*WB+BH, 100, BH, "Nodes on curves"); + stat_value[5] = new Fl_Value_Output(110+2*WB, 2*WB+2*BH, 100, BH, "Nodes on surfaces"); + stat_value[6] = new Fl_Value_Output(110+2*WB, 2*WB+3*BH, 100, BH, "Nodes in Volumes"); + stat_value[7] = new Fl_Value_Output(110+2*WB, 2*WB+4*BH, 100, BH, "Triangles"); + stat_value[8] = new Fl_Value_Output(110+2*WB, 2*WB+5*BH, 100, BH, "Quadrangles"); + stat_value[9] = new Fl_Value_Output(110+2*WB, 2*WB+6*BH, 100, BH, "Tetrahedra"); + stat_value[10] = new Fl_Value_Output(110+2*WB, 2*WB+7*BH, 100, BH, "Hexahedra"); + stat_value[11] = new Fl_Value_Output(110+2*WB, 2*WB+8*BH, 100, BH, "Prisms"); + stat_value[12] = new Fl_Value_Output(110+2*WB, 2*WB+9*BH, 100, BH, "Time for 1D mesh"); + stat_value[13] = new Fl_Value_Output(110+2*WB, 2*WB+10*BH, 100, BH, "Time for 2D mesh"); + stat_value[14] = new Fl_Value_Output(110+2*WB, 2*WB+11*BH, 100, BH, "Time for 3D mesh"); + stat_value[15] = new Fl_Value_Output(110+2*WB, 2*WB+12*BH, 100, BH, "Gamma factor"); + stat_value[16] = new Fl_Value_Output(110+2*WB, 2*WB+13*BH, 100, BH, "Eta factor"); + stat_value[17] = new Fl_Value_Output(110+2*WB, 2*WB+14*BH, 100, BH, "Rho factor"); + o->end(); + } + { + Fl_Group* o = new Fl_Group(WB, WB+BH, width-2*WB, height-3*WB-2*BH, "Post-processing"); + o->labelsize(CTX.fontsize); + o->hide(); + stat_value[18] = new Fl_Value_Output(110+2*WB, 2*WB+BH, 100, BH, "Views loaded"); + stat_value[19] = new Fl_Value_Output(110+2*WB, 2*WB+2*BH, 100, BH, "Visible Points"); + stat_value[20] = new Fl_Value_Output(110+2*WB, 2*WB+3*BH, 100, BH, "Visible Lines"); + stat_value[21] = new Fl_Value_Output(110+2*WB, 2*WB+4*BH, 100, BH, "Visible Triangles"); + stat_value[22] = new Fl_Value_Output(110+2*WB, 2*WB+5*BH, 100, BH, "Visible Tetrahedra"); + o->end(); + } + o->end(); + } + + for(int i=0 ; i<23 ; i++){ + stat_value[i]->labelsize(CTX.fontsize); + stat_value[i]->type(FL_HORIZONTAL); + stat_value[i]->align(FL_ALIGN_LEFT); + } + + { + Fl_Button* o = new Fl_Button(width-2*60-2*WB, height-BH-WB, 60, BH, "cancel"); + o->labelsize(CTX.fontsize); + } + { + Fl_Return_Button* o = new Fl_Return_Button(width-60-WB, height-BH-WB, 60, BH, "OK"); + o->labelsize(CTX.fontsize); + } + + stat_window->end(); + stat_window->show(); + } + else{ + if(stat_window->shown()) + stat_window->hide(); + else + stat_window->show(); + + } + +} + +// Create the short help window + +#include "Help.h" + +void GUI::help_short(){ + static int init_help_short = 0; + + if(!init_help_short){ + init_help_short = 1 ; + + int width = 450; + int height = 400 ; + + help_window = new Fl_Window(width,height); + help_window->box(FL_THIN_UP_BOX); + + Fl_Scroll*o = new Fl_Scroll(WB, WB, width-2*WB, height-3*WB-BH); + { + Fl_Multiline_Output* o = new Fl_Multiline_Output(WB, WB, 600, 1200); + o->value(txt_help); + o->textfont(FL_COURIER); + o->textsize(CTX.fontsize); + } + o->end(); + + { + Fl_Return_Button* o = new Fl_Return_Button(width-60-WB, height-BH-WB, 60, BH, "OK"); + o->labelsize(CTX.fontsize); + } + + help_window->resizable(o); + help_window->end(); + help_window->show(); + } + else{ + if(help_window->shown()) + help_window->hide(); + else + help_window->show(); + + } + +} + +// Create the about window + +void GUI::help_about(){ + static int init_help_about = 0; + extern char TextAbout[1024]; + + if(!init_help_about){ + init_help_about = 1 ; + + int width = 470; + int height = 220; + + about_window = new Fl_Window(width,height); + about_window->box(FL_THIN_UP_BOX); + + Fl_Box *o = new Fl_Box(2*WB, WB, about_width, height-2*WB); + about_bmp = new Fl_Bitmap(about_bits,about_width,about_height); + about_bmp->label(o); + + Fl_Button *o2 = new Fl_Button(WB+80, WB, width-2*WB-80, height-2*WB); + o2->label(TextAbout); + o2->box(FL_FLAT_BOX); + o2->labelsize(CTX.fontsize); + o2->labelfont(FL_COURIER); + o2->align(FL_ALIGN_LEFT|FL_ALIGN_INSIDE); + + about_window->end(); + about_window->show(); + } + else{ + if(about_window->shown()) + about_window->hide(); + else + about_window->show(); + } + +} diff --git a/Fltk/GUI.h b/Fltk/GUI.h index 785fe6bd7c..ea4605f3e6 100644 --- a/Fltk/GUI.h +++ b/Fltk/GUI.h @@ -18,34 +18,38 @@ #include <FL/Fl_Menu_Button.H> #include <FL/Fl_Check_Button.H> #include <FL/Fl_Value_Input.H> +#include <FL/Fl_Value_Output.H> +#include <FL/Fl_Multiline_Output.H> +#include <FL/Fl_Browser.H> +#include <FL/Fl_Bitmap.H> #define NB_BUTT_MAX 100 #define NB_HISTORY_MAX 1000 -// The dynamic menus +// The dynamic contexts typedef struct{ char *label; - void (*callback)(Fl_Widget* w, void* data); + Fl_Callback* callback; } Context_Item; -extern Context_Item menu_geom[]; -extern Context_Item menu_geom_elementary[]; -extern Context_Item menu_geom_elementary_add[]; -extern Context_Item menu_geom_elementary_add_new[]; -extern Context_Item menu_geom_elementary_add_translate[]; -extern Context_Item menu_geom_elementary_add_rotate[]; -extern Context_Item menu_geom_elementary_add_dilate[]; -extern Context_Item menu_geom_elementary_add_symmetry[]; -extern Context_Item menu_geom_elementary_translate[]; -extern Context_Item menu_geom_elementary_rotate[]; -extern Context_Item menu_geom_elementary_dilate[]; -extern Context_Item menu_geom_elementary_symmetry[]; -extern Context_Item menu_geom_elementary_extrude[]; -extern Context_Item menu_geom_elementary_delete[]; -extern Context_Item menu_geom_physical[]; -extern Context_Item menu_geom_physical_add[]; -extern Context_Item menu_geom_physical_delete[]; +extern Context_Item menu_geometry[]; +extern Context_Item menu_geometry_elementary[]; +extern Context_Item menu_geometry_elementary_add[]; +extern Context_Item menu_geometry_elementary_add_new[]; +extern Context_Item menu_geometry_elementary_add_translate[]; +extern Context_Item menu_geometry_elementary_add_rotate[]; +extern Context_Item menu_geometry_elementary_add_dilate[]; +extern Context_Item menu_geometry_elementary_add_symmetry[]; +extern Context_Item menu_geometry_elementary_translate[]; +extern Context_Item menu_geometry_elementary_rotate[]; +extern Context_Item menu_geometry_elementary_dilate[]; +extern Context_Item menu_geometry_elementary_symmetry[]; +extern Context_Item menu_geometry_elementary_extrude[]; +extern Context_Item menu_geometry_elementary_delete[]; +extern Context_Item menu_geometry_physical[]; +extern Context_Item menu_geometry_physical_add[]; +extern Context_Item menu_geometry_physical_delete[]; extern Context_Item menu_mesh[]; extern Context_Item menu_mesh_define[]; extern Context_Item menu_mesh_define_transfinite[]; @@ -81,9 +85,13 @@ class GUI{ // Windows Fl_Window *m_window, *g_window, *gen_window, *geo_window ; Fl_Window *mesh_window, *post_window, *stat_window ; - Fl_Window *view_window ; + Fl_Window *help_window, *about_window, *view_window ; Opengl_Window *g_opengl_window ; + // Bitmaps + Fl_Bitmap *icon1_bmp, *icon2_bmp, *icon3_bmp; + Fl_Bitmap *abort_bmp, *start_bmp, *stop_bmp, *about_bmp ; + // We keep the following widgets for easy further reference // menu window @@ -95,19 +103,26 @@ class GUI{ // graphic window Fl_Button *g_status_butt[7] ; - Fl_Box *g_status_box[3] ; + Fl_Box *g_status_label[3] ; // general options window Fl_Check_Button *gen_butt[10] ; Fl_Value_Input *gen_value[10] ; // geometry options window + Fl_Check_Button *geo_butt[10] ; + Fl_Value_Input *geo_value[10] ; // mesh options window + Fl_Check_Button *mesh_butt[20] ; + Fl_Value_Input *mesh_value[20] ; // post-processing options window + Fl_Check_Button *post_butt[20] ; + Fl_Value_Input *post_value[20] ; // statistics window + Fl_Value_Output *stat_value[40] ; // view options window @@ -118,16 +133,24 @@ public: void check(); void draw_gl(); void draw_gl_overlay(); - void set_size(int w, int h); + void set_gl_size(int w, int h); void set_menu_size(int nb_butt); void set_context(Context_Item menu[], int flag); + int get_context(); + void set_anim(int mode); + void set_status(char *msg, int num); + // create option windows void opt_general(); void opt_geometry(); void opt_mesh(); void opt_post(); void opt_stat(); + // create help windows + void help_short(); + void help_about(); + }; diff --git a/Fltk/Main.cpp b/Fltk/Main.cpp index b4eb9f58e5..c2d4391707 100644 --- a/Fltk/Main.cpp +++ b/Fltk/Main.cpp @@ -1,4 +1,4 @@ -// $Id: Main.cpp,v 1.2 2001-01-08 14:51:30 geuzaine Exp $ +// $Id: Main.cpp,v 1.3 2001-01-09 08:58:38 geuzaine Exp $ #include <signal.h> @@ -21,8 +21,6 @@ extern List_T *Post_ViewList; int SHOW_ALL_ENTITIES ; -void AddViewInUI(int, char *, int){} - GUI *WID ; int main(int argc, char *argv[]){ @@ -94,8 +92,8 @@ int main(int argc, char *argv[]){ // Text for about window - sprintf(TextAbout, "%s\n \n%s%.2f\n%s\n%s\n%s\n%s\n%s\n%s\n \n%s\n \n" - "Type 'gmsh -help' for command line options", + sprintf(TextAbout, " %s\n \n %s%.2f\n %s\n %s\n %s\n %s\n %s\n %s\n \n %s" + "\n \n Type 'gmsh -help' for command line options", gmsh_progname, gmsh_version, GMSH_VERSION, gmsh_os, gmsh_date, gmsh_host, gmsh_packager, gmsh_url, gmsh_email, gmsh_copyright); @@ -125,10 +123,10 @@ int main(int argc, char *argv[]){ if(nbf > 1){ for(i=1;i<nbf;i++) MergeProblem(TheFileNameTab[i]); - WID->set_context(menu_post,0); + WID->set_context(menu_post, 0); } else { - WID->set_context(menu_geom,0); + WID->set_context(menu_geometry, 0); } // Read background mesh on disk diff --git a/Fltk/Opengl.cpp b/Fltk/Opengl.cpp index 01c0ae2db8..bdda3d0907 100644 --- a/Fltk/Opengl.cpp +++ b/Fltk/Opengl.cpp @@ -1,4 +1,4 @@ -// $Id: Opengl.cpp,v 1.1 2001-01-08 08:16:27 geuzaine Exp $ +// $Id: Opengl.cpp,v 1.2 2001-01-09 08:58:38 geuzaine Exp $ #include "Gmsh.h" #include "GmshUI.h" @@ -30,8 +30,6 @@ void InitOverlay(void){ } void Draw(void){ - WID->set_size(CTX.viewport[2]-CTX.viewport[0], - CTX.viewport[3]-CTX.viewport[1]); WID->draw_gl(); } @@ -125,6 +123,16 @@ void Opengl_Window::draw() { CTX.viewport[2], CTX.viewport[3]); } + if((w() != CTX.viewport[2]-CTX.viewport[0]) || + (h() != CTX.viewport[3]-CTX.viewport[1])){ + WID->set_gl_size(CTX.viewport[2]-CTX.viewport[0], + CTX.viewport[3]-CTX.viewport[1]); + glViewport(CTX.viewport[0], + CTX.viewport[1], + CTX.viewport[2], + CTX.viewport[3]); + } + Orthogonalize(0,0); glClearColor(UNPACK_RED(CTX.color.bg)/255., UNPACK_GREEN(CTX.color.bg)/255., diff --git a/jpeg/rawjpeg.tar b/jpeg/rawjpeg.tar deleted file mode 100644 index 73ef5fa55bb8aff017373302849c4f472060a7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 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 -- GitLab