# data file for the Fltk User Interface Designer (fluid)
version 1.0500
header_name {.h}
code_name {.cxx}
include_guard {}
snap {
  ver 1
  current_suite {FLUID (based on FLTK)}
  current_preset 1
  suite {
    name {FLUID (based on FLTK)}
    preset { 1
      15 15 15 15 0 0
      10 10 10 10 0 0
      25 25
      24 12 6 24 6 10
      0 14 0 14
    }
    preset { 1
      10 10 10 10 0 0
      10 10 10 10 0 0
      20 20
      22 11 6 22 6 6
      0 12 0 12
    }
    preset { 1
      10 10 10 10 0 0
      10 10 10 10 0 0
      18 18
      18 9 2 18 5 2
      0 11 0 11
    }
  }
}
comment {//
// Setting and shell dialogs for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2025 by Bill Spitzak and others.
//
// This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file.  If this
// file is missing or damaged, see the license at:
//
//     https://www.fltk.org/COPYING.php
//
// Please see the following page on how to report bugs and issues:
//
//     https://www.fltk.org/bugs.php
//
} {in_source in_header
}

decl {\#include "Fluid.h"} {public global
}

decl {\#include "Project.h"} {private local
}

decl {\#include "proj/undo.h"} {private global
}

decl {\#include "app/Snap_Action.h"} {public global
}

decl {\#include "app/shell_command.h"} {public global
}

decl {\#include "tools/filename.h"} {public local
}

decl {\#include "widgets/Node_Browser.h"} {public global
}

decl {\#include <FL/Fl_Text_Buffer.H>} {public local
}

decl {\#include <FL/Fl_Text_Display.H>} {public local
}

decl {\#include <FL/fl_string_functions.h>} {public local
}

decl {\#include <FL/Fl_Scheme_Choice.H>} {public local
}

decl {\#include <FL/Fl_Preferences.H>} {private global
}

decl {\#include <FL/Fl_Tooltip.H>} {private global
}

decl {\#include <FL/fl_ask.H>} {private global
}

decl {\#include "../src/flstring.h"} {private global
}

decl {\#include <string.h>} {private global
}

decl {using namespace fld::widget;} {private global
}

decl {extern struct Fl_Menu_Item *dbmanager_item;} {public local
}

decl {extern void i18n_cb(Fl_Choice *,void *);} {public local
}

decl {void scheme_cb(Fl_Scheme_Choice *, void *);} {public local
}

decl {int w_settings_shell_list_selected;} {public local
}

Function {cb_Comments(Fl_Choice* o, void* v)} {open private return_type void
} {
  code {Fl_Font *font = (Fl_Font*)o->user_data();
if (v == LOAD) {
  o->value(*font);
} else {
  *font = (int)o->value();
  widget_browser->redraw();
  widget_browser->save_prefs();
}} {}
}

Function {cb_Color_Chip(Fl_Button* o, void* v)} {open private return_type void
} {
  code {Fl_Color *color = (Fl_Color*)o->user_data();
if (v == LOAD) {
  o->color(*color);
  o->redraw();
} else {
  Fl_Color d = fl_show_colormap(*color);
  *color = d;
  o->color(d);
  widget_browser->redraw();
  widget_browser->save_prefs();
}} {}
}

Function {cb_Color_Choice(Fl_Menu_Button* o, void* v)} {open private return_type void
} {
  code {if (v != LOAD) {
  Fl_Color *color = (Fl_Color*)o->user_data();
  Fl_Color d = (Fl_Color)(o->mvalue()->argument());
  *color = d;
  o->parent()->do_callback(o->parent(), LOAD);
  widget_browser->redraw();
  widget_browser->save_prefs();
}} {}
}

Function {make_script_panel()} {open
} {
  Fl_Window script_panel {
    label {Shell Script Editor}
    callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
  return; // ignore Escape
script_panel->hide(); // otherwise hide..} open
    xywh {869 311 540 184} type Double labelsize 11 resizable
    code0 {o->size_range(200, 150);} modal visible
  } {
    Fl_Text_Editor script_input {
      xywh {10 10 520 130} box DOWN_BOX labelsize 12 when 13 textfont 4 textsize 12 resizable
      code0 {script_input->buffer(new Fl_Text_Buffer);}
    }
    Fl_Group {} {
      callback propagate_load open
      xywh {10 150 520 24} labelsize 11
    } {
      Fl_Button script_panel_cancel {
        label Cancel selected
        xywh {348 150 88 24}
      }
      Fl_Return_Button script_panel_ok {
        label OK
        xywh {442 150 88 24} hotspot
      }
      Fl_Box {} {
        xywh {10 150 338 24} labelsize 11 resizable
      }
    }
  }
  code {// Enable line numbers
script_input->linenumber_width(60);
script_input->linenumber_size(script_input->Fl_Text_Display::textsize());} {}
}

Function {make_settings_window()} {open
} {
  Fl_Window settings_window {
    label {FLUID Settings} open
    xywh {504 366 360 585} type Double align 80 resizable size_range {340 580 0 0} visible
  } {
    Fl_Tabs w_settings_tabs {
      callback {propagate_load(o, v);} open
      xywh {10 10 340 530} selection_color 12 labelsize 12 labelcolor 255 resizable
    } {
      Fl_Group w_settings_general_tab {
        label General open
        scale_image {36 24} image {../icons/general_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 resizable
      } {
        Fl_Group {} {
          callback {propagate_load(o, v);} open
          xywh {130 78 210 25}
        } {
          Fl_Choice scheme_choice {
            label {Scheme: }
            callback {Fluid.set_scheme(o->text(o->value()));} open
            xywh {130 78 120 25} down_box BORDER_BOX labelfont 1 labelsize 12 textsize 12
            code0 {Fluid.init_scheme();}
            class Fl_Scheme_Choice
          } {}
          Fl_Box {} {
            xywh {250 78 10 25} hide resizable
          }
        }
        Fl_Box {} {
          label {Options: }
          xywh {130 115 0 20} labelfont 1 labelsize 12 align 4
        }
        Fl_Check_Button tooltips_button {
          label {Show Tooltips}
          callback {Fl_Tooltip::enable(tooltips_button->value());
Fluid.preferences.set("show_tooltips", tooltips_button->value());}
          xywh {130 115 210 20} down_box DOWN_BOX labelsize 12
          code0 {int b;}
          code1 {Fluid.preferences.get("show_tooltips", b, 1);}
          code2 {tooltips_button->value(b);}
          code3 {Fl_Tooltip::enable(b);}
        }
        Fl_Check_Button completion_button {
          label {Show Completion Dialogs}
          callback {Fluid.preferences.set("show_completion_dialogs", completion_button->value());}
          xywh {130 135 210 20} down_box DOWN_BOX labelsize 12
          code0 {int b;}
          code1 {Fluid.preferences.get("show_completion_dialogs", b, 1);}
          code2 {completion_button->value(b);}
        }
        Fl_Check_Button openlast_button {
          label {Open Previous File on Startup}
          callback {Fluid.preferences.set("open_previous_file", openlast_button->value());}
          xywh {130 155 210 20} down_box DOWN_BOX labelsize 12
          code0 {int b;}
          code1 {Fluid.preferences.get("open_previous_file", b, 0);}
          code2 {openlast_button->value(b);}
        }
        Fl_Check_Button prevpos_button {
          label {Remember Window Positions}
          callback {Fluid.preferences.set("prev_window_pos", prevpos_button->value());}
          xywh {130 175 210 20} down_box DOWN_BOX labelsize 12
          code0 {int b;}
          code1 {Fluid.preferences.get("prev_window_pos", b, 1);}
          code2 {prevpos_button->value(b);}
        }
        Fl_Check_Button show_comments_button {
          label {Show Comments in Browser}
          callback {Fluid.show_comments = show_comments_button->value();
Fluid.preferences.set("Fluid.show_comments", Fluid.show_comments);
redraw_browser();}
          xywh {130 195 210 20} down_box DOWN_BOX labelsize 12
          code1 {Fluid.preferences.get("Fluid.show_comments", Fluid.show_comments, 1);}
          code2 {show_comments_button->value(Fluid.show_comments);}
        }
        Fl_Group {} {
          callback {propagate_load(o, v);} open
          xywh {130 225 210 20}
        } {
          Fl_Spinner recent_spinner {
            label {\# Recent Files:}
            callback {Fluid.preferences.set("recent_files", recent_spinner->value());
Fluid.history.load();}
            xywh {130 225 40 20} labelfont 1 labelsize 12 when 1 maximum 10 textsize 12
            code0 {int c;}
            code1 {Fluid.preferences.get("recent_files", c, 5);}
            code2 {recent_spinner->maximum(10);}
            code3 {recent_spinner->value(c);}
          }
          Fl_Box {} {
            xywh {170 225 10 20} hide resizable
          }
        }
        Fl_Input editor_command_input {
          label {External Editor:}
          callback {strncpy(Fluid.external_editor_command, editor_command_input->value(), sizeof(Fluid.external_editor_command)-1);
Fluid.external_editor_command[sizeof(Fluid.external_editor_command)-1] = 0;
Fluid.preferences.set("external_editor_command", Fluid.external_editor_command);
redraw_browser();}
          tooltip {The editor command to open your external text editor.
Include any necessary flags to ensure your editor does not background itself.
Examples:
    gvim -f
    gedit
 emacs} xywh {130 255 210 20} labelfont 1 labelsize 12 when 1 textfont 4 textsize 12
          code1 {Fluid.preferences.get("external_editor_command", Fluid.external_editor_command, "", sizeof(Fluid.external_editor_command)-1);}
          code2 {editor_command_input->value(Fluid.external_editor_command);}
        }
        Fl_Check_Button use_external_editor_button {
          label {Use for Code Nodes}
          callback {Fluid.use_external_editor = use_external_editor_button->value();
Fluid.preferences.set("use_external_editor", Fluid.use_external_editor);
redraw_browser();}
          xywh {130 278 210 20} down_box DOWN_BOX labelsize 12
          code1 {Fluid.preferences.get("use_external_editor", Fluid.use_external_editor, 0);}
          code2 {use_external_editor_button->value(Fluid.use_external_editor);}
        }
        Fl_Box {} {
          label {Overlays: }
          xywh {130 306 0 20} labelfont 1 labelsize 12 align 4
        }
        Fl_Check_Button guides_button {
          label {Show Positioning Guides}
          callback toggle_guides_cb
          tooltip {show guides that help to position and resize widgets and enable snapping} xywh {130 306 210 20} down_box DOWN_BOX labelsize 12
          code0 {o->value(Fluid.show_guides);}
        }
        Fl_Check_Button restricted_button {
          label {Show Restricted Areas}
          callback toggle_restricted_cb
          tooltip {show overlapping and out of bounds areas, show unfilled areas in Fl_Pack groups} xywh {130 326 210 20} down_box DOWN_BOX labelsize 12
          code0 {o->value(Fluid.show_restricted);}
        }
        Fl_Check_Button ghosted_outline_button {
          label {Show Ghosted Group Outlines}
          callback toggle_ghosted_outline_cb
          tooltip {groups with no box type or flat boxtypes without contrast will be rendered with a dim outline in the editing window only} xywh {130 346 210 20} down_box DOWN_BOX labelsize 12
          code0 {o->value(Fluid.show_ghosted_outline);}
        }
        Fl_Box {} {
          xywh {130 530 210 10} hide resizable
        }
      }
      Fl_Group w_settings_project_tab {
        label Project
        callback {propagate_load(o, v);} open
        scale_image {36 24} image {../icons/document_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 hide
      } {
        Fl_Group {} {open
          xywh {110 78 230 30}
        } {
          Fl_Box {} {
            label {Use "name.ext" to set a file name
or just ".ext" to set extension.}
            xywh {110 78 210 30} labelsize 11 align 148
          }
          Fl_Box {} {
            xywh {320 78 20 30} hide resizable
          }
        }
        Fl_Input header_file_input {
          label {Header File:}
          user_data 1 user_data_type {void*}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.header_file_name.c_str());
} else {
  if (strcmp(Fluid.proj.header_file_name.c_str(), o->value())) {
    Fluid.proj.header_file_name = o->value();
    Fluid.proj.set_modflag(1);
  }
}}
          tooltip {The name of the generated header file.} xywh {110 112 230 20} box THIN_DOWN_BOX labelfont 1 labelsize 12 when 1 textfont 4 textsize 12
        }
        Fl_Input code_file_input {
          label {Code File:}
          user_data 1 user_data_type {void*}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.code_file_name.c_str());
} else {
  if (strcmp(Fluid.proj.code_file_name.c_str(), o->value())) {
    Fluid.proj.code_file_name = o->value();
    Fluid.proj.set_modflag(1);
  }
}}
          tooltip {The name of the generated code file.} xywh {110 137 230 20} box THIN_DOWN_BOX labelfont 1 labelsize 12 when 1 textfont 4 textsize 12
        }
        Fl_Check_Button include_H_from_C_button {
          label {Include Header from Code}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.include_H_from_C);
} else {
  if (Fluid.proj.include_H_from_C != o->value()) {
    Fluid.proj.set_modflag(1);
    Fluid.proj.include_H_from_C = o->value();
  }
}}
          tooltip {Include the header file from the code file.} xywh {110 160 230 20} down_box DOWN_BOX labelsize 12
        }
        Fl_Input include_guard_input {
          label {Include Guard:}
          user_data 1 user_data_type {void*}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.include_guard.c_str());
} else {
  if (strcmp(Fluid.proj.include_guard.c_str(), o->value())) {
    Fluid.proj.include_guard = o->value();
    Fluid.proj.set_modflag(1);
  }
}}
          tooltip {Name of macro used as
an include guard in header file:

\#ifdef GUARD
\#define GUARD
...
\#endif} xywh {110 188 230 20} box THIN_DOWN_BOX labelfont 1 labelsize 12 when 1 textfont 4 textsize 12
        }
        Fl_Box {} {
          label {Options: }
          xywh {110 214 0 20} labelfont 1 labelsize 12 align 4
        }
        Fl_Check_Button use_FL_COMMAND_button {
          label {Menu shortcuts use FL_COMMAND}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.use_FL_COMMAND);
} else {
  if (Fluid.proj.use_FL_COMMAND != o->value()) {
    Fluid.proj.set_modflag(1);
    Fluid.proj.use_FL_COMMAND = o->value();
  }
}}
          tooltip {Replace FL_CTRL and FL_META with FL_COMMAND when generating menu shortcuts} xywh {110 214 230 20} down_box DOWN_BOX labelsize 12
        }
        Fl_Check_Button utf8_in_src_button {
          label {Allow Unicode UTF-8 in source code}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.utf8_in_src);
} else {
  if (Fluid.proj.utf8_in_src != o->value()) {
    Fluid.proj.set_modflag(1);
    Fluid.proj.utf8_in_src = o->value();
  }
}}
          tooltip {For older compilers, characters outside of the printable ASCII range are escaped using octal notation `\\0123`. If this option is checked, Fluid will write UTF-8 characters unchanged.} xywh {110 234 230 20} down_box DOWN_BOX labelsize 12
        }
        Fl_Check_Button avoid_early_includes_button {
          label {Avoid early include of Fl.H}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.avoid_early_includes);
} else {
  if (Fluid.proj.avoid_early_includes != o->value()) {
    Fluid.proj.set_modflag(1);
    Fluid.proj.avoid_early_includes = o->value();
  }
}}
          tooltip {Do not emit \#include <FL//Fl.H> until it is needed by another include file.} xywh {110 254 230 20} down_box DOWN_BOX labelsize 12
        }
        Fl_Box {} {
          label {Experimental: }
          xywh {110 280 0 20} labelfont 1 labelsize 12 align 4
        }
        Fl_Check_Button w_proj_mergeback {
          label {Generate MergeBack data}
          callback {if (v == LOAD) {
  o->value(Fluid.proj.write_mergeback_data);
} else {
  if (Fluid.proj.write_mergeback_data != o->value()) {
    Fluid.proj.set_modflag(1);
    Fluid.proj.write_mergeback_data = o->value();
  }
}}
          tooltip {MergeBack is a feature under construction that allows changes in code files to be merged back into the project file. Checking this option will generate additional data in code and project files.} xywh {110 280 230 20} down_box DOWN_BOX labelsize 12
        }
        Fl_Box {} {
          xywh {110 530 230 10} hide resizable
        }
      }
      Fl_Group w_settings_layout_tab {
        label Layout
        callback {propagate_load(o, v);} open
        scale_image {36 24} image {../icons/layout_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 hide
      } {
        Fl_Box {} {
          label {Layout:}
          xywh {20 78 75 24} labelfont 1 labelsize 12 align 24
        }
        Fl_Choice layout_choice {
          callback {if (v == LOAD) {
    o->value(Fluid.layout_list.current_suite());
  } else {
    int index = o->value();
    Fluid.layout_list.current_suite(index);
    Fluid.layout_list.update_dialogs();
  }} open
          xywh {95 78 197 24} down_box BORDER_BOX
        } {
          MenuItem {} {
            label FLTK
            xywh {0 0 31 20}
          }
          MenuItem {} {
            label Grid
            xywh {0 0 31 20}
          }
        }
        Fl_Button {} {
          label {+}
          callback {// Clone the current layout suite

if (v == LOAD) return;

std::string old_name = "Copy of ";
old_name.append(Fluid.layout_list[Fluid.layout_list.current_suite()].name_);
const char *new_name = fl_input("Enter a name for the new layout:", old_name.c_str());
if (new_name == nullptr)
  return;

Fluid.layout_list.add(new_name);
Fluid.layout_list.update_dialogs();}
          xywh {292 78 24 24}
        }
        Fl_Menu_Button w_layout_menu {
          callback {if (v == LOAD) {
  fld::app::Layout_Suite &suite = Fluid.layout_list[Fluid.layout_list.current_suite()];
  if (suite.storage_ == fld::Tool_Store::INTERNAL) {
    w_layout_menu_rename->deactivate();
    for (int i=1; i<4; i++) w_layout_menu_storage[i]->deactivate();
    w_layout_menu_delete->deactivate();
  } else {
    w_layout_menu_rename->activate();
    for (int i=1; i<4; i++) w_layout_menu_storage[i]->activate();
    w_layout_menu_delete->activate();
  }
  w_layout_menu_storage[static_cast<int>(suite.storage_)]->setonly(menu_w_layout_menu);
}} open
          xywh {316 78 24 24}
        } {
          MenuItem w_layout_menu_rename {
            label {Rename...}
            callback {// Rename the current layout suite

std::string old_name = Fluid.layout_list[Fluid.layout_list.current_suite()].name_;
const char *new_name = fl_input("Enter a new name for the layout:", old_name.c_str());
if (new_name == nullptr)
  return;

Fluid.layout_list.rename(new_name);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20} divider
          }
          MenuItem {w_layout_menu_storage[0]} {
            label {@fd_beaker  FLUID Built-In}
            callback {fld::app::Layout_Suite &suite = Fluid.layout_list[Fluid.layout_list.current_suite()];
suite.storage(fld::Tool_Store::INTERNAL);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20} type Radio deactivate
          }
          MenuItem {w_layout_menu_storage[1]} {
            label {@fd_user  User Preference}
            callback {fld::app::Layout_Suite &suite = Fluid.layout_list[Fluid.layout_list.current_suite()];
suite.storage(fld::Tool_Store::USER);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20} type Radio
          }
          MenuItem {w_layout_menu_storage[2]} {
            label {@fd_project  Store in .fl Project File}
            callback {fld::app::Layout_Suite &suite = Fluid.layout_list[Fluid.layout_list.current_suite()];
suite.storage(fld::Tool_Store::PROJECT);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20} type Radio
          }
          MenuItem {w_layout_menu_storage[3]} {
            label {@fd_file  Store in External File}
            callback {fld::app::Layout_Suite &suite = Fluid.layout_list[Fluid.layout_list.current_suite()];
suite.storage(fld::Tool_Store::FILE);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20} type Radio divider
          }
          MenuItem w_layout_menu_load {
            label {Load...}
            callback {// Give the user a file chooser and load that file
Fl_Native_File_Chooser fnfc;
fnfc.title("Load Layout Settings:");
fnfc.type(Fl_Native_File_Chooser::BROWSE_FILE);
fnfc.options(Fl_Native_File_Chooser::USE_FILTER_EXT);
fnfc.filter("FLUID Layouts\\t*.fll\\n");
if (fnfc.show() != 0) return;
const char *new_filename = fnfc.filename();
if (!new_filename) return;
Fluid.layout_list.load(new_filename);
//Fluid.layout_list.current_suite(n);
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20}
          }
          MenuItem w_layout_menu_save {
            label {Save...}
            callback {// Give the user a file chooser with a suggested name
  Fl_Native_File_Chooser fnfc;
  fnfc.title("Save Layout Settings:");
  fnfc.type(Fl_Native_File_Chooser::BROWSE_SAVE_FILE);
  fnfc.options(Fl_Native_File_Chooser::SAVEAS_CONFIRM | Fl_Native_File_Chooser::USE_FILTER_EXT);
  fnfc.filter("FLUID Layouts\\t*.fll\\n");
  std::string filename = Fluid.layout_list.filename_;
  fnfc.directory(fl_filename_path_str(filename).c_str());
  fnfc.preset_file(fl_filename_name_str(filename).c_str());
  if (fnfc.show() != 0) return;
  const char *new_filename = fnfc.filename();
  if (!new_filename) return;
  Fluid.layout_list.filename_ = new_filename;
  Fluid.layout_list.save(new_filename);}
            xywh {0 0 31 20} divider
            code0 {\#include <FL/Fl_Native_File_Chooser.H>}
          }
          MenuItem w_layout_menu_delete {
            label Delete
            callback {// remove the current suite

Fluid.layout_list.remove(Fluid.layout_list.current_suite());
Fluid.layout_list.update_dialogs();}
            xywh {0 0 31 20}
          }
        }
        Fl_Box {} {
          label {Preset:}
          xywh {20 107 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Group {} {
          callback propagate_load open
          xywh {95 107 245 20} labelsize 11
        } {
          Fl_Button {preset_choice[0]} {
            label Application
            user_data 0
            callback edit_layout_preset_cb
            xywh {95 107 81 20} type Radio value 1 selection_color 45 labelsize 12 compact 1
          }
          Fl_Button {preset_choice[1]} {
            label Dialog
            user_data 1
            callback edit_layout_preset_cb
            xywh {176 107 82 20} type Radio selection_color 45 labelsize 12 compact 1
          }
          Fl_Button {preset_choice[2]} {
            label Toolbox
            user_data 2
            callback edit_layout_preset_cb
            xywh {258 107 82 20} type Radio selection_color 45 labelsize 12 compact 1
          }
        }
        Fl_Box {} {
          label {---- Window ----}
          xywh {95 132 235 20} labelfont 1 labelsize 12 align 20
        }
        Fl_Box {} {
          label {Margins:}
          xywh {20 167 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Left:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->left_window_margin);
} else {
  Fluid.proj.layout->left_window_margin = (int)o->value();
}}
          xywh {95 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Top:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->top_window_margin);
} else {
  Fluid.proj.layout->top_window_margin = (int)o->value();
}}
          xywh {155 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Right:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->right_window_margin);
} else {
  Fluid.proj.layout->right_window_margin = (int)o->value();
}}
          xywh {215 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Bottom:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->bottom_window_margin);
} else {
  Fluid.proj.layout->bottom_window_margin = (int)o->value();
}}
          xywh {275 167 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {Grid:}
          xywh {20 201 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Horizontal:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->window_grid_x);
} else {
  Fluid.proj.layout->window_grid_x = (int)o->value();
}}
          xywh {95 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Vertical:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->window_grid_y);
} else {
  Fluid.proj.layout->window_grid_y = (int)o->value();
}}
          xywh {155 201 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {---- Group ----}
          xywh {95 226 235 20} labelfont 1 labelsize 12 align 20
        }
        Fl_Box {} {
          label {Margins:}
          xywh {20 261 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Left:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->left_group_margin);
} else {
  Fluid.proj.layout->left_group_margin = (int)o->value();
}}
          xywh {95 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Top:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->top_group_margin);
} else {
  Fluid.proj.layout->top_group_margin = (int)o->value();
}}
          xywh {155 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Right:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->right_group_margin);
} else {
  Fluid.proj.layout->right_group_margin = (int)o->value();
}}
          xywh {215 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Bottom:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->bottom_group_margin);
} else {
  Fluid.proj.layout->bottom_group_margin = (int)o->value();
}}
          xywh {275 261 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {Grid:}
          xywh {20 295 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Horizontal:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->group_grid_x);
} else {
  Fluid.proj.layout->group_grid_x = (int)o->value();
}}
          xywh {95 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Vertical:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->group_grid_y);
} else {
  Fluid.proj.layout->group_grid_y = (int)o->value();
}}
          xywh {155 295 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {---- Tabs ----}
          xywh {95 320 235 20} labelfont 1 labelsize 12 align 20
        }
        Fl_Box {} {
          label {Margins:}
          xywh {20 355 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Top:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->top_tabs_margin);
} else {
  Fluid.proj.layout->top_tabs_margin = (int)o->value();
}}
          xywh {95 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Bottom:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->bottom_tabs_margin);
} else {
  Fluid.proj.layout->bottom_tabs_margin = (int)o->value();
}}
          xywh {155 355 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {---- Widget ----}
          xywh {95 380 235 20} labelfont 1 labelsize 12 align 20
        }
        Fl_Box {} {
          label {Horizontal:}
          xywh {20 415 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          label {Minimum:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_min_w);
} else {
  Fluid.proj.layout->widget_min_w = (int)o->value();
}}
          xywh {95 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Increment:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_inc_w);
} else {
  Fluid.proj.layout->widget_inc_w = (int)o->value();
}}
          xywh {155 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          label {Gap:}
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_gap_x);
} else {
  Fluid.proj.layout->widget_gap_x = (int)o->value();
}}
          xywh {215 414 55 20} labelsize 11 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Box {} {
          label {Vertical:}
          xywh {20 440 75 20} labelfont 1 labelsize 12 align 24
        }
        Fl_Value_Input {} {
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_min_h);
} else {
  Fluid.proj.layout->widget_min_h = (int)o->value();
}}
          xywh {95 440 55 20} labelsize 12 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_inc_h);
} else {
  Fluid.proj.layout->widget_inc_h = (int)o->value();
}}
          xywh {155 440 55 20} labelsize 12 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Value_Input {} {
          callback {if (v == LOAD) {
  o->value((double)Fluid.proj.layout->widget_gap_y);
} else {
  Fluid.proj.layout->widget_gap_y = (int)o->value();
}}
          xywh {215 440 55 20} labelsize 12 align 5 maximum 32767 step 1 textsize 12
        }
        Fl_Group {} {
          label {Label Font:}
          callback propagate_load open
          xywh {95 465 201 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            callback {if (v == LOAD) {
  o->value(Fluid.proj.layout->labelfont+1);
} else {
  Fluid.proj.layout->labelfont = (int)o->value()-1;
}} open
            tooltip {The style of the label text.} xywh {95 465 150 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 12 resizable
            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
            code1 {o->menu(fontmenu_w_default);}
          } {}
          Fl_Value_Input {} {
            callback {if (v == LOAD) {
  o->value(Fluid.proj.layout->labelsize);
} else {
  Fluid.proj.layout->labelsize = (int)o->value();
}}
            tooltip {The size of the label text.} xywh {245 465 50 20} labelsize 12 minimum 1 maximum 1000 step 1 value 14 textsize 12
          }
        }
        Fl_Group {} {
          label {Text Font:}
          callback propagate_load open
          xywh {95 490 200 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            callback {if (v == LOAD) {
  o->value(Fluid.proj.layout->textfont+1);
} else {
  Fluid.proj.layout->textfont = (int)o->value()-1;
}} open
            tooltip {The value text style.} xywh {95 490 150 20} box DOWN_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 12 resizable
            code0 {extern Fl_Menu_Item fontmenu_w_default[];}
            code1 {o->menu(fontmenu_w_default);}
          } {}
          Fl_Value_Input {} {
            callback {if (v == LOAD) {
  o->value(Fluid.proj.layout->textsize);
} else {
  Fluid.proj.layout->textsize = (int)o->value();
}}
            tooltip {The value text size.} xywh {245 490 50 20} labelsize 12 maximum 1000 step 1 value 14 textsize 12
          }
        }
        Fl_Box {} {
          xywh {95 535 245 5} hide resizable
        }
      }
      Fl_Group w_settings_shell_tab {
        label Shell
        callback propagate_load open
        scale_image {36 24} image {../icons/shell_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 hide
      } {
        Fl_Group {} {
          callback propagate_load open
          xywh {20 90 320 132}
        } {
          Fl_Browser w_settings_shell_list {
            label {Shell
command
list:}
            callback {if (v == LOAD) {
  // load from g_shell_config
  if (g_shell_config) {
    o->clear();
    w_settings_shell_list_selected = 0;
    for (int i=0; i<g_shell_config->list_size; i++) {
      Fd_Shell_Command *cmd = g_shell_config->list[i];
      o->add(cmd->name.c_str());
      if (cmd->storage == fld::Tool_Store::USER)
        o->icon(i+1, w_settings_shell_fd_user->image());
      else if (cmd->storage == fld::Tool_Store::PROJECT)
        o->icon(i+1, w_settings_shell_fd_project->image());
    }
  }
} else {
//  int prev_selected = w_settings_shell_list_selected;
  w_settings_shell_list_selected = 0;
  int selected = w_settings_shell_list->value();
  if (selected) {
    if (w_settings_shell_list->selected(selected))
      w_settings_shell_list_selected = selected;
  }
  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
}}
            xywh {110 90 230 110} type Multi labelfont 1 labelsize 12 align 4 textsize 12 resizable
          }
          Fl_Group w_settings_shell_toolbox {
            callback {if (v==LOAD) {
  propagate_load(o, v);
}} open
            xywh {110 200 230 22}
          } {
            Fl_Button {} {
              label {+}
              callback {if (v != LOAD) {
  int selected = w_settings_shell_list_selected;
  Fd_Shell_Command *cmd = new Fd_Shell_Command("new shell command");
  g_shell_config->insert(selected, cmd);
  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
  w_settings_shell_list->deselect();
  w_settings_shell_list->value(selected+1);
  if (cmd->storage == fld::Tool_Store::USER) {
    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
  } else if (cmd->storage == fld::Tool_Store::PROJECT) {
    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
    Fluid.proj.set_modflag(1);
  }
  w_settings_shell_list->do_callback();
  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
  g_shell_config->rebuild_shell_menu();
}}
              tooltip {insert a new shell command into the list after the selected command} xywh {110 200 24 22} labelfont 1 labelsize 12
            }
            Fl_Button w_settings_shell_dup {
              label {++}
              callback {int selected = w_settings_shell_list_selected;
if (v==LOAD) {
  if (selected) {
    o->activate();
  } else {
    o->deactivate();
  }
} else {
  if (!selected) return;
  Fd_Shell_Command *cmd = new Fd_Shell_Command(g_shell_config->list[selected-1]);
  g_shell_config->insert(selected, cmd);
  w_settings_shell_list->insert(selected+1, cmd->name.c_str());
  w_settings_shell_list->deselect();
  w_settings_shell_list->value(selected+1);
  if (cmd->storage == fld::Tool_Store::USER) {
    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_user->image());
  } else if (cmd->storage == fld::Tool_Store::PROJECT) {
    w_settings_shell_list->icon(selected+1, w_settings_shell_fd_project->image());
    Fluid.proj.set_modflag(1);
  }
  w_settings_shell_list->do_callback();
  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
  g_shell_config->rebuild_shell_menu();
}}
              tooltip {duplicate the selected shell command and insert it into the list} xywh {134 200 24 22} labelfont 1 labelsize 12 deactivate
            }
            Fl_Button w_settings_shell_remove {
              label DEL
              callback {int selected = w_settings_shell_list_selected;
if (v==LOAD) {
  if (selected) {
    o->activate();
  } else {
    o->deactivate();
  }
} else {
  if (!selected) return;
  int ret = fl_choice("Delete the shell command\\n\\"%s\\"?\\n\\nThis can not be undone.",
    "Delete", "Cancel", nullptr, g_shell_config->list[selected-1]->name.c_str());
  if (ret==1) return;
  if (g_shell_config->at(selected-1)->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  g_shell_config->remove(selected-1);
  w_settings_shell_list->remove(selected);
  if (selected <= w_settings_shell_list->size())
    w_settings_shell_list->value(selected);
  else
    w_settings_shell_list->value(0);
  w_settings_shell_list->do_callback();
  w_settings_shell_cmd->do_callback(w_settings_shell_cmd, LOAD);
  w_settings_shell_toolbox->do_callback(w_settings_shell_toolbox, LOAD);
  g_shell_config->rebuild_shell_menu();
}}
              tooltip {remove the selected shell command - this can not be undone} xywh {158 200 24 22} labelsize 12 deactivate
            }
            Fl_Menu_Button w_settings_shell_menu {open
              xywh {182 200 24 22} labelsize 12 textsize 12
            } {
              MenuItem {} {
                label {Import...}
                callback {if (v != LOAD)
  Fd_Shell_Command_List::import_from_file();}
                tooltip {import shell commands from an external file} xywh {90 90 100 20} labelsize 12
              }
              MenuItem {} {
                label {Export selected...}
                callback {if (v != LOAD)
  Fd_Shell_Command_List::export_selected();}
                tooltip {export selected shell commands to an external file} xywh {10 10 100 20} labelsize 12
              }
              MenuItem {} {
                label {Example Scripts:}
                xywh {20 20 100 20} labelfont 1 labelsize 12 hide deactivate
              }
              MenuItem {} {
                label {Compile with fltk-config}
                xywh {30 30 100 20} labelsize 12 hide
              }
              MenuItem {} {
                label {Build and run}
                xywh {40 40 100 20} labelsize 12 hide
              }
              MenuItem {} {
                label {Build with Xcode on macOS}
                xywh {50 50 100 20} labelsize 12 hide
              }
              MenuItem {} {
                label {Build with CMake}
                xywh {60 60 100 20} labelsize 12 hide
              }
            }
            Fl_Box {} {
              xywh {243 200 13 22} hide resizable
            }
            Fl_Button {} {
              label T
              callback {if (v!=LOAD) show_terminal_window();}
              tooltip {show terminal window} xywh {256 200 24 22} labelfont 5 labelsize 12
            }
            Fl_Button w_settings_shell_play {
              label Run
              callback {int selected = w_settings_shell_list_selected;
if (v==LOAD) {
  if (selected) {
    o->activate();
  } else {
    o->deactivate();
  }
} else {
  if (!selected) return;
  Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
  cmd->run();
}}
              tooltip {run the selected shell command} xywh {280 200 60 22} labelsize 12 deactivate
            }
          }
        }
        Fl_Group w_settings_shell_cmd {
          callback {if (v==LOAD) {
  int selected = w_settings_shell_list_selected;
  if (selected) {
    o->activate();
  } else {
    o->deactivate();
  }
  propagate_load(o, v);
}} open
          xywh {20 235 320 291} resizable
        } {
          Fl_Input {} {
            label {Name:}
            callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->name.c_str());
  } else {
    o->value("");
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    cmd->name = o->value();
    w_settings_shell_list->text(selected, o->value());
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
            tooltip {file the shell command under this name in the shell command list} xywh {110 246 230 20} labelfont 1 labelsize 12 when 13 textfont 4 textsize 12
          }
          Fl_Input {} {
            label {Menu Label:}
            callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->label.c_str());
  } else {
    o->value("");
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    cmd->label = o->value();
    cmd->update_shell_menu();
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
            tooltip {label text for the Shell menu in the main menu bar} xywh {110 272 230 20} labelfont 1 labelsize 12 textfont 4 textsize 12
          }
          Fl_Group {} {
            callback {propagate_load(o, v);} open
            xywh {110 297 140 71}
          } {
            Fl_Button {} {
              label Shortcut
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->shortcut);
    //o->default_value(o->value());
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    cmd->shortcut = o->value();
    cmd->update_shell_menu();
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {an optional keyboard shortcut to run this shell command} xywh {110 297 130 20} labelsize 12 align 16
              code0 {\#include <FL/Fl_Shortcut_Button.H>}
              class Fl_Shortcut_Button
            }
            Fl_Choice {} {
              label {Store:}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    fld::Tool_Store ts = g_shell_config->list[selected-1]->storage;
    o->value(o->find_item_with_argument((long)ts));
  } else {
    o->value(o->find_item_with_argument((long)fld::Tool_Store::USER));
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    fld::Tool_Store ts = (fld::Tool_Store)(o->mvalue()->argument());
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
    cmd->storage = ts;
    //w_settings_shell_list->text(selected, cmd->name.c_str());
    if (cmd->storage == fld::Tool_Store::USER)
      w_settings_shell_list->icon(selected, w_settings_shell_fd_user->image());
    else if (cmd->storage == fld::Tool_Store::PROJECT)
      w_settings_shell_list->icon(selected, w_settings_shell_fd_project->image());
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}} open
              tooltip {store this shell command as a user setting or save it with the .fl project file} xywh {110 322 130 20} down_box BORDER_BOX labelfont 1 labelsize 12 textsize 12
            } {
              MenuItem {} {
                label {@fd_user User Setting}
                user_data {fld::Tool_Store::USER} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {@fd_project Project File}
                user_data {fld::Tool_Store::PROJECT} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
            }
            Fl_Choice {} {
              label {Condition:}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    int cond = g_shell_config->list[selected-1]->condition;
    o->value(o->find_item_with_argument(cond));
  } else {
    o->value(o->find_item_with_argument(0));
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int cond = (int)(o->mvalue()->argument());
    cmd->condition = cond;
    g_shell_config->rebuild_shell_menu();
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}} open
              tooltip {add this command to the main menu bar only if this condition is true} xywh {110 348 130 20} down_box BORDER_BOX labelfont 1 labelsize 12 textsize 12
            } {
              MenuItem {} {
                label {all platforms}
                user_data {Fd_Shell_Command::ALWAYS} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {Windows only}
                user_data {Fd_Shell_Command::WIN_ONLY} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {Linux only}
                user_data {Fd_Shell_Command::UX_ONLY} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {macOS only}
                user_data {Fd_Shell_Command::MAC_ONLY} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {Linux and macOS}
                user_data {Fd_Shell_Command::MAC_AND_UX_ONLY} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
              MenuItem {} {
                label {don't use}
                user_data {Fd_Shell_Command::NEVER} user_data_type long
                xywh {0 0 100 20} labelsize 12
              }
            }
            Fl_Box {} {
              xywh {240 297 10 71} hide resizable
            }
          }
          Fl_Input {} {
            label {Label:}
            callback {if (v == LOAD) {
//  o->value(g_shell_command.c_str());
} else {
//  g_shell_command = o->value();
}}
            xywh {240 348 90 20} labelfont 1 labelsize 12 textfont 4 textsize 12 hide
          }
          Fl_Group {} {
            callback propagate_load open
            xywh {110 373 230 80} resizable
          } {
            Fl_Text_Editor w_settings_shell_command {
              label {Shell script:}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->buffer()->text(g_shell_config->list[selected-1]->command.c_str());
  } else {
    o->buffer()->text("");
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    cmd->command = o->buffer()->text();
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              xywh {110 373 208 80} labelfont 1 labelsize 12 align 4 textfont 4 textsize 12 resizable
              code0 {o->buffer(new Fl_Text_Buffer);}
            }
            Fl_Group {} {open
              xywh {318 373 22 80}
            } {
              Fl_Menu_Button w_settings_shell_text_macros {
                callback {const Fl_Menu_Item *mi = o->mvalue();
if (mi) {
  char buffer[256];
  fl_strlcpy(buffer, mi->label(), 255);
  int n = (int)strlen(buffer)-1;
  if (buffer[n]=='@') buffer[n] = 0;
  char *word = buffer;
  if (word[0]=='@') word++;
  if (w_settings_shell_command->buffer()->selected()) {
    int start = 0, end = 0;
    w_settings_shell_command->buffer()->selection_position(&start, &end);
    w_settings_shell_command->buffer()->replace(start, end, word);
  } else {
    int pos = w_settings_shell_command->insert_position();
    w_settings_shell_command->buffer()->insert(pos, word);
  }
  w_settings_shell_command->do_callback(w_settings_shell_command, (void*)nullptr);
}} open
                tooltip {a list of text replacements available for the shell script} xywh {318 373 22 22} labelsize 12 textsize 12
              } {
                MenuItem {} {
                  label {@@BASENAME@@}
                  xywh {80 80 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@PROJECTFILE_PATH@@}
                  xywh {0 0 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@PROJECTFILE_NAME@@}
                  xywh {10 10 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@CODEFILE_PATH@@}
                  xywh {20 20 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@CODEFILE_NAME@@}
                  xywh {30 30 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@HEADERFILE_PATH@@}
                  xywh {40 40 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@HEADERFILE_NAME@@}
                  xywh {50 50 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@TEXTFILE_PATH@@}
                  xywh {60 60 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@TEXTFILE_NAME@@}
                  xywh {70 70 100 20} labelfont 4 labelsize 12
                }
                MenuItem {} {
                  label {@@FLTK_CONFIG@@}
                  comment {Not yet implemented}
                  xywh {70 70 100 20} labelfont 4 labelsize 12 hide
                }
                MenuItem {} {
                  label {@@TMPDIR@@}
                  xywh {70 70 100 20} labelfont 4 labelsize 12
                }
              }
              Fl_Button {} {
                label {@+1fd_zoom}
                callback {if (!script_panel) make_script_panel();
script_input->buffer()->text(w_settings_shell_command->buffer()->text());
script_panel->show();

for (;;) {
  Fl_Widget* w = Fl::readqueue();
  if (w == script_panel_cancel) goto BREAK2;
  else if (w == script_panel_ok) break;
  else if (!w) Fl::wait();
}

w_settings_shell_command->buffer()->text(script_input->buffer()->text());
w_settings_shell_command->do_callback();
BREAK2:
script_panel->hide();}
                tooltip {open the big code editor} xywh {318 395 22 22} labelsize 12
              }
              Fl_Box {} {
                xywh {318 417 12 10} hide resizable
              }
            }
          }
          Fl_Group {} {open
            xywh {110 458 230 60}
          } {
            Fl_Check_Button {} {
              label {save .fl project file}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_PROJECT);
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (v) {
      cmd->flags |= Fd_Shell_Command::SAVE_PROJECT;
    } else {
      cmd->flags &= ~Fd_Shell_Command::SAVE_PROJECT;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {save the project to the .fl file before running the command} xywh {110 458 110 20} down_box DOWN_BOX labelsize 12
            }
            Fl_Check_Button {} {
              label {save source code}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_SOURCECODE);
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (v) {
      cmd->flags |= Fd_Shell_Command::SAVE_SOURCECODE;
    } else {
      cmd->flags &= ~Fd_Shell_Command::SAVE_SOURCECODE;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {generate the source code and header file before running the command} xywh {110 478 110 19} down_box DOWN_BOX labelsize 12
            }
            Fl_Check_Button {} {
              label {save i18n strings}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::SAVE_STRINGS);
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (v) {
      cmd->flags |= Fd_Shell_Command::SAVE_STRINGS;
    } else {
      cmd->flags &= ~Fd_Shell_Command::SAVE_STRINGS;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {save the internationalisation strings before running the command} xywh {110 498 110 20} down_box DOWN_BOX labelsize 12
            }
            Fl_Check_Button {} {
              label {show terminal}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(!(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::DONT_SHOW_TERMINAL));
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (!v) {
      cmd->flags |= Fd_Shell_Command::DONT_SHOW_TERMINAL;
    } else {
      cmd->flags &= ~Fd_Shell_Command::DONT_SHOW_TERMINAL;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {show the terminal window when launching this script} xywh {229 458 106 20} down_box DOWN_BOX labelsize 12
            }
            Fl_Check_Button {} {
              label {clear terminal}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_TERMINAL);
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (v) {
      cmd->flags |= Fd_Shell_Command::CLEAR_TERMINAL;
    } else {
      cmd->flags &= ~Fd_Shell_Command::CLEAR_TERMINAL;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {clear the teminal window before running this script} xywh {229 478 106 19} down_box DOWN_BOX labelsize 12
            }
            Fl_Check_Button {} {
              label {clear term history}
              callback {int selected = w_settings_shell_list_selected;
if (v == LOAD) {
  if (selected) {
    o->value(g_shell_config->list[selected-1]->flags & Fd_Shell_Command::CLEAR_HISTORY);
  } else {
    o->value(0);
  }
} else {
  if (selected) {
    Fd_Shell_Command *cmd = g_shell_config->list[selected-1];
    int v = o->value();
    if (v) {
      cmd->flags |= Fd_Shell_Command::CLEAR_HISTORY;
    } else {
      cmd->flags &= ~Fd_Shell_Command::CLEAR_HISTORY;
    }
    if (cmd->storage == fld::Tool_Store::PROJECT) Fluid.proj.set_modflag(1);
  }
}}
              tooltip {clear the teminal history in the terminal window} xywh {229 498 106 19} down_box DOWN_BOX labelsize 12
            }
            Fl_Box {} {
              xywh {335 458 5 60} labelsize 12 resizable
            }
          }
        }
        Fl_Box w_settings_shell_fd_project {
          image {../pixmaps/fd_project.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
          code0 {o->image()->scale(16, 16);}
        }
        Fl_Box w_settings_shell_fd_user {
          image {../pixmaps/fd_user.png} compress_image 1 bind_image 1 bind_deimage 1 xywh {20 70 16 15} labelsize 11 hide deactivate
          code0 {o->image()->scale(16, 16);}
        }
      }
      Fl_Group w_settings_i18n_tab {
        label Locale
        callback {propagate_load(o, v);} open
        scale_image {36 24} image {../icons/language_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 hide
      } {
        Fl_Group {} {
          callback propagate_load open
          xywh {110 78 170 20}
        } {
          Fl_Choice i18n_type_chooser {
            label {i18n Library:}
            callback i18n_type_cb open
            tooltip {Type of internationalization to use.} xywh {110 78 160 20} box THIN_UP_BOX down_box BORDER_BOX labelsize 12 textsize 12
          } {
            MenuItem {} {
              label None
              xywh {0 -11 100 20} labelsize 12
            }
            MenuItem {} {
              label {GNU gettext}
              xywh {0 -11 100 20} labelsize 12
            }
            MenuItem {} {
              label {POSIX catgets}
              xywh {0 -11 100 20} labelsize 12
            }
          }
          Fl_Box {} {
            xywh {270 78 10 20} hide resizable
          }
        }
        Fl_Group i18n_gnu_group {
          callback {propagate_load(o, v);} open
          xywh {110 103 230 95} labelsize 12
        } {
          Fl_Input i18n_gnu_include_input {
            label {\#include:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.gnu_include.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.gnu_include = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {The include file for internationalization.} xywh {110 103 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Input i18n_gnu_conditional_input {
            label {Conditional:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.gnu_conditional.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.gnu_conditional = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {110 128 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Input i18n_gnu_function_input {
            label {Function:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.gnu_function.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.gnu_function = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {The function to call to translate labels and tooltips, usually "gettext" or "_"} xywh {110 153 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Input i18n_gnu_static_function_input {
            label {Static Function:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.gnu_static_function.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.gnu_static_function = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {function to call to translate static text, The function to call to internationalize labels and tooltips, usually "gettext_noop" or "N_"} xywh {110 178 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
        }
        Fl_Group i18n_posix_group {
          callback {propagate_load(o, v);} open
          xywh {110 103 230 95} labelsize 12 hide
        } {
          Fl_Input i18n_pos_include_input {
            label {\#include:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.posix_include.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.posix_include = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {The include file for internationalization.} xywh {110 103 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Input i18n_pos_conditional_input {
            label {Conditional:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.posix_conditional.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.posix_conditional = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {only include the header file if this preprocessor macro is defined, for example FLTK_GETTEXT_FOUND} xywh {110 128 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Input i18n_pos_file_input {
            label {Catalog:}
            callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.posix_file.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.posix_file = o->value();
  Fluid.proj.set_modflag(1);
}}
            tooltip {The name of the message catalog.} xywh {110 153 230 20} box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
          }
          Fl_Group {} {
            callback {propagate_load(o, v);} open
            xywh {110 178 90 20}
          } {
            Fl_Input i18n_pos_set_input {
              label {Set:}
              callback {if (v == LOAD) {
  o->value(Fluid.proj.i18n.posix_set.c_str());
} else {
  Fluid.proj.undo.checkpoint();
  Fluid.proj.i18n.posix_set = o->value();
  Fluid.proj.set_modflag(1);
}}
              tooltip {The message set number.} xywh {110 178 80 20} type Int box THIN_DOWN_BOX labelsize 12 textfont 4 textsize 12
            }
            Fl_Box {} {
              xywh {190 178 10 20} hide resizable
            }
          }
        }
        Fl_Box {} {
          xywh {110 530 220 10} hide resizable
        }
      }
      Fl_Group w_settings_user_tab {
        label User
        callback {propagate_load(o, v);} open
        scale_image {36 24} image {../icons/user_circle_64.png} compress_image 1 xywh {10 60 340 480} labelsize 12 hide
        code0 {\#include <FL/fl_show_colormap.H>}
      } {
        Fl_Box {} {
          label {---- Widget Browser ----}
          xywh {110 84 220 20} labelfont 1 labelsize 12 align 20
        }
        Fl_Group {} {
          label {Label:}
          callback propagate_load open
          xywh {110 112 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            user_data {&Node_Browser::label_font}
            callback cb_Comments open
            xywh {110 112 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::label_color}
            callback cb_Color_Chip
            xywh {271 112 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::label_color}
            callback cb_Color_Choice open
            xywh {322 112 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Group {} {
          label {Class:}
          callback propagate_load open
          xywh {110 137 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            user_data {&Node_Browser::class_font}
            callback cb_Comments open
            xywh {110 137 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::class_color}
            callback cb_Color_Chip
            xywh {271 137 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::class_color}
            callback cb_Color_Choice open
            xywh {322 137 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Group {} {
          label {Function:}
          callback propagate_load open
          xywh {110 162 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            user_data {&Node_Browser::func_font}
            callback cb_Comments open
            xywh {110 162 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::func_color}
            callback cb_Color_Chip
            xywh {271 162 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::func_color}
            callback cb_Color_Choice open
            xywh {322 162 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Group {} {
          label {Name:}
          callback propagate_load open
          xywh {110 187 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            user_data {&Node_Browser::name_font}
            callback cb_Comments open
            xywh {110 187 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::name_color}
            callback cb_Color_Chip
            xywh {271 187 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::name_color}
            callback cb_Color_Choice open
            xywh {322 187 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Group {} {
          label {Code:}
          callback propagate_load open
          xywh {110 212 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice {} {
            user_data {&Node_Browser::code_font}
            callback cb_Comments open
            xywh {110 212 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::code_color}
            callback cb_Color_Chip
            xywh {271 212 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::code_color}
            callback cb_Color_Choice open
            xywh {322 212 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Group {} {
          label {Comments:}
          callback propagate_load open
          xywh {110 237 230 20} labelfont 1 labelsize 12 align 4
        } {
          Fl_Choice w_settings_user_commenttext {
            user_data {&Node_Browser::comment_font}
            callback cb_Comments open
            xywh {110 237 161 20} box THIN_UP_BOX down_box BORDER_BOX labelfont 1 labelsize 12 textsize 11 resizable
            code0 {extern Fl_Menu_Item fontmenu[];}
            code1 {o->menu(fontmenu);}
          } {}
          Fl_Button {} {
            user_data {&Node_Browser::comment_color}
            callback cb_Color_Chip
            xywh {271 237 51 20} labelsize 12
          }
          Fl_Menu_Button {} {
            user_data {&Node_Browser::comment_color}
            callback cb_Color_Choice open
            xywh {322 237 18 20} labelsize 12
            code0 {extern Fl_Menu_Item colormenu[];}
            code1 {o->menu(colormenu);}
          } {}
        }
        Fl_Box {} {
          xywh {110 530 230 10} hide resizable
        }
        Fl_Button {} {
          label Reset
          callback {if (v == LOAD) return;
Node_Browser::label_color = 72;
Node_Browser::label_font = FL_HELVETICA;
Node_Browser::class_color = FL_FOREGROUND_COLOR;
Node_Browser::class_font = FL_HELVETICA_BOLD;
Node_Browser::func_color = FL_FOREGROUND_COLOR;
Node_Browser::func_font = FL_HELVETICA;
Node_Browser::name_color = FL_FOREGROUND_COLOR;
Node_Browser::name_font = FL_HELVETICA;
Node_Browser::code_color = FL_FOREGROUND_COLOR;
Node_Browser::code_font = FL_HELVETICA;
Node_Browser::comment_color = FL_DARK_GREEN;
Node_Browser::comment_font = FL_DARK_GREEN;
o->parent()->do_callback(o->parent(), LOAD);
widget_browser->redraw();
widget_browser->save_prefs();}
          xywh {251 269 77 22} labelsize 12
        }
      }
    }
    Fl_Group {} {open
      xywh {10 550 340 25}
    } {
      Fl_Button {} {
        label Close
        callback {if (g_shell_config)
  g_shell_config->write(Fluid.preferences, fld::Tool_Store::USER);
Fluid.layout_list.write(Fluid.preferences, fld::Tool_Store::USER);
settings_window->hide();}
        tooltip {Close this dialog.} xywh {230 550 120 25}
      }
      Fl_Box {} {
        xywh {220 550 10 25} hide resizable
      }
    }
  }
  code {w_settings_tabs->do_callback(w_settings_tabs, LOAD);} {}
}

Function {make_shell_window()} {open
} {
  Fl_Window shell_run_window {
    label {Shell Command Output} open
    xywh {880 548 555 430} type Double align 80 resizable visible
  } {
    Fl_Terminal shell_run_terminal {
      xywh {10 10 535 375} resizable
      code0 {shell_run_terminal->ansi(1);}
      code1 {shell_run_terminal->history_lines(1000);}
    }
    Fl_Group {} {open
      xywh {10 395 535 25}
    } {
      Fl_Button {} {
        label Clear
        callback {// clear screen, clear scrollback, home cursor
shell_run_terminal->append("\\033[2J\\033[3J\\033[H");}
        xywh {10 395 94 25}
      }
      Fl_Box {} {
        xywh {104 395 341 25} hide resizable
      }
      Fl_Return_Button shell_run_button {
        label Close
        callback {Fl_Preferences pos(Fluid.preferences, "shell_run_Window_pos");
pos.set("x", shell_run_window->x());
pos.set("y", shell_run_window->y());
pos.set("w", shell_run_window->w());
pos.set("h", shell_run_window->h());
shell_run_window->hide();}
        xywh {445 395 100 25}
      }
    }
  }
}

decl {Fl_Menu_Item *w_layout_menu_storage[4];} {private global
}
