Files
fltk/fluid/Fluid.h
Albrecht Schlosser 5d68428a00 Fix trailing whitespace and convert a few tabs to spaces
... according to CMP
2025-07-08 15:25:14 +02:00

223 lines
7.7 KiB
C++

//
// Fluid Application header 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
//
#ifndef FLUID_FLUID_H
#define FLUID_FLUID_H
#include "Project.h"
#include "app/args.h"
#include "app/history.h"
#include "app/Snap_Action.h"
#include "tools/filename.h"
#include <FL/Fl_Preferences.H>
#include <FL/Fl_Menu_Item.H>
#include <FL/filename.H>
#include <string>
constexpr int BROWSERWIDTH = 300;
constexpr int BROWSERHEIGHT = 500;
constexpr int WINWIDTH = 300;
constexpr int MENUHEIGHT = 25;
constexpr int WINHEIGHT = (BROWSERHEIGHT+MENUHEIGHT);
// ---- types
class Fl_Double_Window;
class Fl_Window;
class Fl_Menu_Bar;
class Node;
class Fl_Choice;
class Fl_Button;
class Fl_Check_Button;
class Fl_Help_Dialog;
namespace fld {
namespace app {
class Layout_List;
}
namespace widget {
class App_Menu_Bar;
}
/**
Indicate the storage location for tools like layout suites and shell macros.
\see class Fd_Shell_Command, class Layout_Suite
*/
enum class Tool_Store {
INTERNAL, ///< stored inside FLUID app
USER, ///< suite is stored in the user wide FLUID settings
PROJECT, ///< suite is stored within the current .fl project file
FILE ///< store suite in external file
};
class Project;
class Application {
/// Currently selected project.
Project *current_project_ = new Project();
/// Working directory at application launch.
std::string launch_path_;
/// Path to store temporary files during app run.
std::string tmpdir_path;
/// True if the temporary file path was already created.
bool tmpdir_create_called = false;
// Generate a path to a directory for temporary data storage.
void create_tmpdir();
// Delete the temporary directory and all its contents.
void delete_tmpdir();
public: // Member Variables
/// Application wide preferences
Fl_Preferences preferences;
/// Project history.
app::History history;
/// Command line arguments
app::Args args;
/// List of available layouts
app::Layout_List layout_list;
/// Set, if Fluid runs in batch mode, and no user interface is activated.
int batch_mode { 0 }; // fluid + any code generators (-u, -c, -cs)
// TODO: make this into a class: app::Settings
/// Show guides in the design window when positioning widgets, saved in app preferences.
int show_guides { 1 };
/// Show areas of restricted use in overlay plane.
/// Restricted areas are widget that overlap each other, widgets that are outside
/// of their parent's bounds (except children of Scroll groups), and areas
/// within an Fl_Tile that are not covered by children.
int show_restricted { 1 };
/// Show a ghosted outline for groups that have very little contrast.
/// This makes groups with NO_BOX or FLAT_BOX better editable.
int show_ghosted_outline { 1 };
/// Show widget comments in the browser, saved in app preferences.
int show_comments { 1 };
// TODO: make this into a class: app::External_Editor
/// Use external editor for editing Code_Node, saved in app preferences.
int use_external_editor { 0 };
/// Debugging help for external Code_Node editor.
int debug_external_editor { 0 };
/// Run this command to load an Code_Node into an external editor, save in app preferences.
// TODO: make this into a std::string
char external_editor_command[512] { };
// TODO: make this into a class: app::GUI
Fl_Window *main_window { nullptr };
static Fl_Menu_Item main_menu[];
fld::widget::App_Menu_Bar *main_menubar { nullptr };
Fl_Menu_Item *save_item { nullptr };
Fl_Menu_Item *history_item { nullptr };
Fl_Menu_Item *widgetbin_item { nullptr };
Fl_Menu_Item *codeview_item { nullptr };
Fl_Menu_Item *overlay_item { nullptr };
Fl_Button *overlay_button { nullptr };
Fl_Menu_Item *guides_item { nullptr };
Fl_Menu_Item *restricted_item { nullptr };
/// Offset in pixels when adding widgets from an .fl file.
int pasteoffset { 0 };
int ipasteoffset { 0 };
/// FLUID-wide help dialog.
Fl_Help_Dialog *help_dialog { nullptr };
public: // Methods
// Create the Fluid application.
Application();
/// Destructor.
~Application() = default;
// Launch the application.
int run(int argc,char **argv);
// Quit the application and clean up.
void quit();
/// Quick access to the current project. Make sure it stays synched to current_project_.
Project &proj { *current_project_ };
// Return the working directory path at application launch.
const std::string &launch_path() const;
// Return the path to a temporary directory for this instance of Fluid.
const std::string &get_tmpdir();
// Return the path and filename of a temporary file for cut or duplicated data.
const char *cutfname(int which = 0);
// Clear the current project and create a new, empty one.
bool new_project(bool user_must_confirm = true);
// Open a file chooser and load an exiting project file.
bool open_project_file(const std::string &filename_arg);
// Load a project from the give file name and path.
bool merge_project_file(const std::string &filename_arg);
// Save the current design to the file given by \c filename.
void save_project_file(void *arg);
// Reload the file set by \c filename, replacing the current design.
void revert_project();
// Open the template browser and load a new file from templates.
bool new_project_from_template();
// Open the dialog to allow the user to print the current window.
void print_snapshots();
// Generate the C++ source and header filenames and write those files.
int write_code_files(bool dont_show_completion_dialog=false);
// User chose to cut the currently selected widgets.
void cut_selected();
// User chose to copy the currently selected widgets.
void copy_selected();
// User chose to paste the widgets from the cut buffer.
void paste_from_clipboard();
// Duplicate the selected widgets.
void duplicate_selected();
// User chose to delete the currently selected widgets.
void delete_selected();
// Show the editor for the \c current Node.
void edit_selected();
// User wants to sort selected widgets by y coordinate.
void sort_selected();
// Show or hide the widget bin.
void toggle_widget_bin();
// Open a dialog to show the HTML help page form the FLTK documentation folder.
void show_help(const char *name);
// Open the "About" dialog.
void about();
// Build the main app window and create a few other dialogs.
void make_main_window();
// Open a native file chooser to allow choosing a project file for reading.
std::string open_project_filechooser(const std::string &title);
// Give the user the opportunity to save a project before clearing it.
bool confirm_project_clear();
// Ensure that text widgets in the widget panel propagates apply current changes.
void flush_text_widgets();
// Position the given window window based on entries in the app preferences.
char position_window(Fl_Window *w, const char *prefsName, int Visible, int X, int Y, int W=0, int H=0);
// Save the position and visibility state of a window to the app preferences.
void save_position(Fl_Window *w, const char *prefsName);
// Change the app's and hence preview the design's scheme.
void set_scheme(const char *new_scheme);
// Read Fluid's scheme preferences and set the app's scheme.
void init_scheme();
#ifdef __APPLE__
static void apple_open_cb(const char *c);
#endif // __APPLE__
};
} // namespace fld
extern fld::Application Fluid;
#endif // FLUID_FLUID_H