summaryrefslogtreecommitdiff
path: root/fluid/app/history.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <github@matthiasm.com>2025-03-16 17:16:12 -0400
committerGitHub <noreply@github.com>2025-03-16 17:16:12 -0400
commit51a55bc73660f64e8f4b32b8b4d3858f2a786f7b (patch)
tree122ad9f838fcf8f61ed7cf5fa031e8ed69817e10 /fluid/app/history.cxx
parent13a7073a1e007ce5b71ef70bced1a9b15158820d (diff)
Fluid: restructuring and rejuvenation of the source code.
* Add classes for application and project * Removed all globals from Fluid.h * Extracting args and project history into their own classes * Moving globals into Application class * Initialize values inside headers for some classes. * Undo functionality wrapped in a class inside Project. * File reader and writer are now linked to a project. * Avoid global project access * Nodes (former Types) will be managed by a new Tree class. * Removed static members (hidden globals) form Node/Fl_Type. * Adding Tree iterator. * Use nullptr instead of 0, NULL, or 0L * Renamed Fl_..._Type to ..._Node, FL_OVERRIDE -> override * Renaming ..._type to ...::prototype * Splitting Widget Panel into multiple files. * Moved callback code into widget panel file. * Cleaning up Fluid_Image -> Image_asset * Moving Fd_Snap_Action into new namespace fld::app::Snap_Action etc. * Moved mergeback into proj folder. * `enum ID` is now `enum class Type`.
Diffstat (limited to 'fluid/app/history.cxx')
-rw-r--r--fluid/app/history.cxx115
1 files changed, 115 insertions, 0 deletions
diff --git a/fluid/app/history.cxx b/fluid/app/history.cxx
new file mode 100644
index 000000000..7eadb5469
--- /dev/null
+++ b/fluid/app/history.cxx
@@ -0,0 +1,115 @@
+//
+// Fluid Project File History code 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
+//
+
+#include "app/history.h"
+
+#include "Fluid.h"
+
+#include "../src/flstring.h"
+
+using namespace fld;
+using namespace fld::app;
+
+
+/**
+ Load file history from preferences.
+
+ This loads the absolute filepaths of the last 10 used design files.
+ It also computes and stores the relative filepaths for display in
+ the main menu.
+ */
+void History::load() {
+ int i; // Looping var
+ int max_files;
+
+ Fluid.preferences.get("recent_files", max_files, 5);
+ if (max_files > 10) max_files = 10;
+
+ for (i = 0; i < max_files; i ++) {
+ Fluid.preferences.get( Fl_Preferences::Name("file%d", i), abspath[i], "", sizeof(abspath[i]));
+ if (abspath[i][0]) {
+ // Make a shortened version of the filename for the menu...
+ std::string fn = fl_filename_shortened(abspath[i], 48);
+ strncpy(relpath[i], fn.c_str(), sizeof(relpath[i]) - 1);
+ if (i == 9) Fluid.history_item[i].flags = FL_MENU_DIVIDER;
+ else Fluid.history_item[i].flags = 0;
+ } else break;
+ }
+
+ for (; i < 10; i ++) {
+ if (i) Fluid.history_item[i-1].flags |= FL_MENU_DIVIDER;
+ Fluid.history_item[i].hide();
+ }
+}
+
+/**
+ Update file history from preferences.
+
+ Add this new filepath to the history and update the main menu.
+ Writes the new file history to the app preferences.
+
+ \param[in] project_file path and filename of .fl project file, will be
+ converted into an absolute file path based on the current working directory.
+ */
+void History::update(std::string project_file) {
+ int i; // Looping var
+ int max_files;
+
+ Fluid.preferences.get("recent_files", max_files, 5);
+ if (max_files > 10) max_files = 10;
+
+ std::string absolute = fld::fix_separators(fl_filename_absolute_str(project_file));
+ for (i = 0; i < max_files; i ++)
+#if defined(_WIN32) || defined(__APPLE__)
+ if (!strcasecmp(absolute.c_str(), abspath[i])) break;
+#else
+ if (!strcmp(absolute.c_str(), abspath[i])) break;
+#endif // _WIN32 || __APPLE__
+
+ // Does the first entry match?
+ if (i == 0)
+ return;
+
+ // Was there no match?
+ if (i >= max_files)
+ i = max_files - 1;
+
+ // Move the other filenames down in the list...
+ memmove(abspath + 1, abspath, i * sizeof(abspath[0]));
+ memmove(relpath + 1, relpath, i * sizeof(relpath[0]));
+
+ // Put the new file at the top...
+ strlcpy(abspath[0], absolute.c_str(), sizeof(abspath[0]));
+ std::string fn = fl_filename_shortened(absolute, 48);
+ strncpy(relpath[0], fn.c_str(), sizeof(relpath[0]) - 1);
+
+ // Update the menu items as needed...
+ for (i = 0; i < max_files; i ++) {
+ Fluid.preferences.set( Fl_Preferences::Name("file%d", i), abspath[i]);
+ if (abspath[i][0]) {
+ if (i == 9) Fluid.history_item[i].flags = FL_MENU_DIVIDER;
+ else Fluid.history_item[i].flags = 0;
+ } else break;
+ }
+
+ for (; i < 10; i ++) {
+ Fluid.preferences.set( Fl_Preferences::Name("file%d", i), "");
+ if (i) Fluid.history_item[i-1].flags |= FL_MENU_DIVIDER;
+ Fluid.history_item[i].hide();
+ }
+ Fluid.preferences.flush();
+}
+