Skip to content
Snippets Groups Projects
Select Git revision
  • 6962920d25256d83e7c8e35c1bad4ee1490e4f1d
  • master default
  • cgnsUnstructured
  • partitioning
  • poppler
  • HighOrderBLCurving
  • gmsh_3_0_4
  • gmsh_3_0_3
  • gmsh_3_0_2
  • gmsh_3_0_1
  • gmsh_3_0_0
  • gmsh_2_16_0
  • gmsh_2_15_0
  • gmsh_2_14_1
  • gmsh_2_14_0
  • gmsh_2_13_2
  • gmsh_2_13_1
  • gmsh_2_12_0
  • gmsh_2_11_0
  • gmsh_2_10_1
  • gmsh_2_10_0
  • gmsh_2_9_3
  • gmsh_2_9_2
  • gmsh_2_9_1
  • gmsh_2_9_0
  • gmsh_2_8_6
26 results

loader.cpp

Blame
  • Forked from gmsh / gmsh
    Source project has a limited visibility.
    GUI_Extras.cpp 15.81 KiB
    // $Id: GUI_Extras.cpp,v 1.14 2006-01-06 00:34:23 geuzaine Exp $
    //
    // Copyright (C) 1997-2006 C. Geuzaine, J.-F. Remacle
    //
    // 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; if not, write to the Free Software
    // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
    // USA.
    // 
    // Please report all bugs and problems to <gmsh@geuz.org>.
    
    #include "Gmsh.h"
    #include "GmshUI.h"
    #include "Mesh.h"
    #include "File_Picker.h"
    #include "Shortcut_Window.h"
    #include "CreateFile.h"
    #include "Options.h"
    #include "Context.h"
    #include "Draw.h"
    
    #include <FL/Fl_Button.H>
    #include <FL/Fl_Return_Button.H>
    #include <FL/Fl_Value_Slider.H>
    #include <FL/Fl_Menu_Window.H>
    #include <errno.h>
    
    extern Context_T CTX;
    
    // File chooser
    
    static File_Picker *fc = NULL;
    
    int file_chooser(int multi, int create, const char *message,
    		 const char *filter, char *fname)
    {
      static char thefilter[1024] = "";
      static int thefilterindex = 0;
    
      Fl_File_Chooser::show_label = "Format:";
      Fl_File_Chooser::all_files_label = "All files (*)";
    
      if(strncmp(thefilter, filter, 1024)) {
        // reset the filter and the selection if the filter has changed
        strncpy(thefilter, filter, 1024);
        thefilterindex = 0;
      }
    
      if(!fc) {
        fc = new File_Picker(getenv("PWD") ? "." : CTX.home_dir, thefilter, 
    			 Fl_File_Chooser::SINGLE, message);
        fc->position(CTX.file_chooser_position[0], CTX.file_chooser_position[1]);
      }
    
      if(multi)
        fc->type(Fl_File_Chooser::MULTI);
      else if(create)
        fc->type(Fl_File_Chooser::CREATE);
      else
        fc->type(Fl_File_Chooser::SINGLE);
    
      fc->label(message);
      fc->filter(thefilter);
      fc->filter_value(thefilterindex);
      if(fname)
        fc->value(fname);
    
      fc->show();
    
      while(fc->shown())
        Fl::wait();
    
      thefilterindex = fc->filter_value();
    
      if(fc->value())
        return fc->count();
      else
        return 0;
    }
    
    char *file_chooser_get_name(int num)
    {
      if(!fc)
        return "";
      return (char *)fc->value(num);
    }
    
    int file_chooser_get_filter()
    {
      if(!fc)
        return 0;
      return fc->filter_value();
    }
    
    void file_chooser_get_position(int *x, int *y)
    {
      if(!fc)
        return;
      *x = fc->x();
      *y = fc->y();
    }
    
    // Arrow editor
    
    int arrow_editor(char *title, double &a, double &b, double &c)
    {
      struct _editor{
        Fl_Window *window;
        Fl_Value_Slider *sa, *sb, *sc;
        Fl_Button *apply, *cancel;
      };
      static _editor *editor = NULL;
    
      if(!editor){
        editor = new _editor;
        editor->window = new Dialog_Window(200, 140);
        editor->sa = new Fl_Value_Slider(10, 10, 100, 25, "Head radius");
        editor->sa->type(FL_HOR_SLIDER);
        editor->sa->align(FL_ALIGN_RIGHT);
        editor->sb = new Fl_Value_Slider(10, 40, 100, 25, "Stem length");
        editor->sb->type(FL_HOR_SLIDER);
        editor->sb->align(FL_ALIGN_RIGHT);
        editor->sc = new Fl_Value_Slider(10, 70, 100, 25, "Stem radius");
        editor->sc->type(FL_HOR_SLIDER);
        editor->sc->align(FL_ALIGN_RIGHT);
        editor->apply = new Fl_Return_Button(10, 105, 85, 25, "Apply");
        editor->cancel = new Fl_Button(105, 105, 85, 25, "Cancel");
        editor->window->end();
        editor->window->hotspot(editor->window);
      }
      
      editor->window->label(title);
      editor->sa->value(a);
      editor->sb->value(b);
      editor->sc->value(c);
      editor->window->show();
    
      while(editor->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
          if (o == editor->apply) {
    	a = editor->sa->value();
    	b = editor->sb->value();
    	c = editor->sc->value();
    	return 1;
          }
          if (o == editor->window || o == editor->cancel){
    	editor->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }
    
    // Perspective editor (aka z-clipping planes factor slider)
    
    static void persp_change_factor(Fl_Widget* w, void* data){
      opt_general_clip_factor(0, GMSH_SET|GMSH_GUI, ((Fl_Slider*)w)->value());
      Draw();
    }
    
    class Release_Slider : public Fl_Slider {
      int handle(int event){ 
        switch (event) {
        case FL_RELEASE: 
          if(window())
    	window()->hide();
          return 1;
        default:
          return Fl_Slider::handle(event);
        }
      };
    public:
      Release_Slider(int x,int y,int w,int h,const char *l=0)
        : Fl_Slider(x, y, w, h, l) {}
    };
    
    int perspective_editor()
    {
      struct _editor{
        Fl_Menu_Window *window;
        Release_Slider *sa;
      };
      static _editor *editor = NULL;
    
      if(!editor){
        editor = new _editor;
        editor->window = new Fl_Menu_Window(20, 100);
        editor->sa = new Release_Slider(0, 0, 20, 100);
        editor->sa->type(FL_VERT_NICE_SLIDER);
        editor->sa->minimum(12);
        editor->sa->maximum(0.75);
        editor->sa->callback(persp_change_factor);
        editor->window->border(0);
        editor->window->end();
      }
    
      editor->window->hotspot(editor->window);
      editor->sa->value(CTX.clip_factor);
      editor->window->show();
      return 0;
    }
    
    // jpeg dialog
    
    int jpeg_dialog(char *name, int TeX)
    {
      struct _jpeg_dialog{
        Fl_Window *window;
        Fl_Value_Slider *s[2];
        Fl_Button *ok, *cancel;
      };
      static _jpeg_dialog *dialog = NULL;
    
      if(!dialog){
        dialog = new _jpeg_dialog;
        int h = 3*10 + 25 + 2*25, y = 0;
        // not a "Dialog_Window" since it is modal 
        dialog->window = new Fl_Double_Window(200, h, "JPEG Options"); y = 10;
        dialog->window->box(GMSH_WINDOW_BOX);
        dialog->s[0] = new Fl_Value_Slider(10, y, 100, 25, "Quality"); y += 25;
        dialog->s[0]->type(FL_HOR_SLIDER);
        dialog->s[0]->align(FL_ALIGN_RIGHT);
        dialog->s[0]->minimum(1);
        dialog->s[0]->maximum(100);
        dialog->s[0]->step(1);
        dialog->s[1] = new Fl_Value_Slider(10, y, 100, 25, "Smoothing"); y += 25;
        dialog->s[1]->type(FL_HOR_SLIDER);
        dialog->s[1]->align(FL_ALIGN_RIGHT);
        dialog->s[1]->minimum(0);
        dialog->s[1]->maximum(100);
        dialog->s[1]->step(1);
        dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
        dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
        dialog->window->set_modal();
        dialog->window->end();
        dialog->window->hotspot(dialog->window);
      }
      
      dialog->s[0]->value(CTX.print.jpeg_quality);
      dialog->s[1]->value(CTX.print.jpeg_smoothing);
      dialog->window->show();
    
      while(dialog->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
          if (o == dialog->ok) {
    	opt_print_jpeg_quality(0, GMSH_SET | GMSH_GUI, (int)dialog->s[0]->value());
    	opt_print_jpeg_smoothing(0, GMSH_SET | GMSH_GUI, (int)dialog->s[1]->value());
    	CreateOutputFile(name, TeX ? FORMAT_JPEGTEX : FORMAT_JPEG);
    	dialog->window->hide();
    	return 1;
          }
          if (o == dialog->window || o == dialog->cancel){
    	dialog->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }
    
    // gif dialog
    
    int gif_dialog(char *name)
    {
      struct _gif_dialog{
        Fl_Window *window;
        Fl_Check_Button *b[4];
        Fl_Button *ok, *cancel;
      };
      static _gif_dialog *dialog = NULL;
    
      if(!dialog){
        dialog = new _gif_dialog;
        int h = 3*10 + 25 + 4*25, y = 0;
        // not a "Dialog_Window" since it is modal 
        dialog->window = new Fl_Double_Window(200, h, "GIF Options"); y = 10;
        dialog->window->box(GMSH_WINDOW_BOX);
        dialog->b[0] = new Fl_Check_Button(10, y, 180, 25, "Dither"); y += 25;
        dialog->b[1] = new Fl_Check_Button(10, y, 180, 25, "Interlace"); y += 25;
        dialog->b[2] = new Fl_Check_Button(10, y, 180, 25, "Sort colormap"); y += 25;
        dialog->b[3] = new Fl_Check_Button(10, y, 180, 25, "Transparent background"); y += 25;
        for(int i = 0; i < 4; i++){
          dialog->b[i]->type(FL_TOGGLE_BUTTON);
          dialog->b[i]->down_box(GMSH_TOGGLE_BOX);
          dialog->b[i]->selection_color(GMSH_TOGGLE_COLOR);
        }
        dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
        dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
        dialog->window->set_modal();
        dialog->window->end();
        dialog->window->hotspot(dialog->window);
      }
      
      dialog->b[0]->value(CTX.print.gif_dither);
      dialog->b[1]->value(CTX.print.gif_interlace);
      dialog->b[2]->value(CTX.print.gif_sort);
      dialog->b[3]->value(CTX.print.gif_transparent);
      dialog->window->show();
    
      while(dialog->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
          if (o == dialog->ok) {
    	opt_print_gif_dither(0, GMSH_SET | GMSH_GUI, dialog->b[0]->value());
    	opt_print_gif_interlace(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value());
    	opt_print_gif_sort(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value());
    	opt_print_gif_transparent(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value());
    	CreateOutputFile(name, FORMAT_GIF);
    	dialog->window->hide();
    	return 1;
          }
          if (o == dialog->window || o == dialog->cancel){
    	dialog->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }
    
    // ps/eps/pdf dialog
    
    static void activate_gl2ps_choices(int format, Fl_Check_Button *b[5])
    {
    #if defined(HAVE_LIBZ)
      b[0]->activate();
    #else
      b[0]->deactivate();
    #endif
      switch(format){
      case 0: 
        b[1]->deactivate(); b[2]->deactivate(); 
        b[3]->deactivate(); b[4]->deactivate();
        break;
      case 1:
        b[1]->activate();   b[2]->activate();
        b[3]->deactivate(); b[4]->activate();
        break;
      case 2:
        b[1]->activate();   b[2]->activate();
        b[3]->activate();   b[4]->activate();
        break;
      }
    }
    
    int gl2ps_dialog(char *name, char *title, int format, int TeX)
    {
      struct _gl2ps_dialog{
        Fl_Window *window;
        Fl_Check_Button *b[5];
        Fl_Choice *c;
        Fl_Button *ok, *cancel;
      };
      static _gl2ps_dialog *dialog = NULL;
    
      static Fl_Menu_Item sortmenu[] = {
        {"Raster image", 0, 0, 0},
        {"Vector simple sort", 0, 0, 0},
        {"Vector accurate sort", 0, 0, 0},
        {0}
      };
    
      if(!dialog){
        dialog = new _gl2ps_dialog;
        int h = 3*10 + 25 + 6*25, y = 0;
        // not a "Dialog_Window" since it is modal 
        dialog->window = new Fl_Double_Window(200, h); y = 10;
        dialog->window->box(GMSH_WINDOW_BOX);
        dialog->c = new Fl_Choice(10, y, 145, 25, "Type"); y+= 25;
        dialog->c->menu(sortmenu);
        dialog->c->align(FL_ALIGN_RIGHT);
        dialog->b[0] = new Fl_Check_Button(10, y, 180, 25, "Compress"); y += 25;
        dialog->b[1] = new Fl_Check_Button(10, y, 180, 25, "Print background"); y += 25;
        dialog->b[2] = new Fl_Check_Button(10, y, 180, 25, "Remove hidden primitives"); y += 25;
        dialog->b[3] = new Fl_Check_Button(10, y, 180, 25, "Optimize BSP tree"); y += 25;
        dialog->b[4] = new Fl_Check_Button(10, y, 180, 25, "Use level 3 shading"); y += 25;
        for(int i = 0; i < 5; i++){
          dialog->b[i]->type(FL_TOGGLE_BUTTON);
          dialog->b[i]->down_box(GMSH_TOGGLE_BOX);
          dialog->b[i]->selection_color(GMSH_TOGGLE_COLOR);
        }
        dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
        dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
        dialog->window->set_modal();
        dialog->window->end();
        dialog->window->hotspot(dialog->window);
      }
      
      dialog->window->label(title);
      dialog->c->value(CTX.print.eps_quality);
      dialog->b[0]->value(CTX.print.eps_compress);
      dialog->b[1]->value(CTX.print.eps_background);
      dialog->b[2]->value(CTX.print.eps_occlusion_culling);
      dialog->b[3]->value(CTX.print.eps_best_root);
      dialog->b[4]->value(CTX.print.eps_ps3shading);
      activate_gl2ps_choices(CTX.print.eps_quality, dialog->b);
      dialog->window->show();
    
      while(dialog->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
    
          if (o == dialog->c){
    	activate_gl2ps_choices(dialog->c->value(), dialog->b);
          }
          if (o == dialog->ok) {
    	opt_print_eps_quality(0, GMSH_SET | GMSH_GUI, dialog->c->value());
    	opt_print_eps_compress(0, GMSH_SET | GMSH_GUI, dialog->b[0]->value());
    	opt_print_eps_background(0, GMSH_SET | GMSH_GUI, dialog->b[1]->value());
    	opt_print_eps_occlusion_culling(0, GMSH_SET | GMSH_GUI, dialog->b[2]->value());
    	opt_print_eps_best_root(0, GMSH_SET | GMSH_GUI, dialog->b[3]->value());
    	opt_print_eps_ps3shading(0, GMSH_SET | GMSH_GUI, dialog->b[4]->value());
    	CreateOutputFile(name, 
    			 (format == 2) ? (TeX ? FORMAT_PDFTEX : FORMAT_PDF) : 
    			 (format == 1) ? (TeX ? FORMAT_EPSTEX : FORMAT_EPS) : 
    			 FORMAT_PS);
    	dialog->window->hide();
    	return 1;
          }
          if (o == dialog->window || o == dialog->cancel){
    	dialog->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }
    
    // gmsh options dialog
    
    int options_dialog(char *name)
    {
      struct _options_dialog{
        Fl_Window *window;
        Fl_Check_Button *b[2];
        Fl_Button *ok, *cancel;
      };
      static _options_dialog *dialog = NULL;
    
      if(!dialog){
        dialog = new _options_dialog;
        int h = 3*10 + 25 + 2*25, y = 0;
        // not a "Dialog_Window" since it is modal 
        dialog->window = new Fl_Double_Window(200, h, "Options"); y = 10;
        dialog->window->box(GMSH_WINDOW_BOX);
        dialog->b[0] = new Fl_Check_Button(10, y, 180, 25, "Save only modified options"); y += 25;
        dialog->b[0]->value(1);
        dialog->b[0]->type(FL_TOGGLE_BUTTON);
        dialog->b[0]->down_box(GMSH_TOGGLE_BOX);
        dialog->b[0]->selection_color(GMSH_TOGGLE_COLOR);
        dialog->b[1] = new Fl_Check_Button(10, y, 180, 25, "Print help strings"); y += 25;
        dialog->b[1]->value(1);
        dialog->b[1]->type(FL_TOGGLE_BUTTON);
        dialog->b[1]->down_box(GMSH_TOGGLE_BOX);
        dialog->b[1]->selection_color(GMSH_TOGGLE_COLOR);
        dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
        dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
        dialog->window->set_modal();
        dialog->window->end();
        dialog->window->hotspot(dialog->window);
      }
      
      dialog->window->show();
    
      while(dialog->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
          if (o == dialog->ok) {
    	Print_Options(0, GMSH_FULLRC, dialog->b[0]->value(), dialog->b[1]->value(), name);
    	dialog->window->hide();
    	return 1;
          }
          if (o == dialog->window || o == dialog->cancel){
    	dialog->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }
    
    // save msh dialog
    
    int msh_dialog(char *name)
    {
      struct _msh_dialog{
        Fl_Window *window;
        Fl_Check_Button *b;
        Fl_Choice *c;
        Fl_Button *ok, *cancel;
      };
      static _msh_dialog *dialog = NULL;
    
      static Fl_Menu_Item versionmenu[] = {
        {"Version 1.0", 0, 0, 0},
        {"Version 2.0", 0, 0, 0},
        {0}
      };
    
      if(!dialog){
        dialog = new _msh_dialog;
        int h = 3*10 + 25 + 2*25, y = 0;
        // not a "Dialog_Window" since it is modal 
        dialog->window = new Fl_Double_Window(200, h, "MSH Options"); y = 10;
        dialog->window->box(GMSH_WINDOW_BOX);
        dialog->c = new Fl_Choice(10, y, 130, 25, "Format"); y+= 25;
        dialog->c->menu(versionmenu);
        dialog->c->align(FL_ALIGN_RIGHT);
        dialog->b = new Fl_Check_Button(10, y, 180, 25, "Save all (ignore physicals)"); y += 25;
        dialog->b->type(FL_TOGGLE_BUTTON);
        dialog->b->down_box(GMSH_TOGGLE_BOX);
        dialog->b->selection_color(GMSH_TOGGLE_COLOR);
        dialog->ok = new Fl_Return_Button(10, y+10, 85, 25, "OK");
        dialog->cancel = new Fl_Button(105, y+10, 85, 25, "Cancel");
        dialog->window->set_modal();
        dialog->window->end();
        dialog->window->hotspot(dialog->window);
      }
      
      dialog->c->value((CTX.mesh.msh_file_version==1.0) ? 0 : 1);
      dialog->b->value(CTX.mesh.save_all);
      dialog->window->show();
    
      while(dialog->window->shown()){
        Fl::wait();
        for (;;) {
          Fl_Widget* o = Fl::readqueue();
          if (!o) break;
          if (o == dialog->ok) {
    	opt_mesh_msh_file_version(0, GMSH_SET | GMSH_GUI, dialog->c->value() + 1);
    	opt_mesh_save_all(0, GMSH_SET | GMSH_GUI, dialog->b->value());
    	CreateOutputFile(name, FORMAT_MSH);
    	dialog->window->hide();
    	return 1;
          }
          if (o == dialog->window || o == dialog->cancel){
    	dialog->window->hide();
    	return 0;
          }
        }
      }
      return 0;
    }