summaryrefslogtreecommitdiff
path: root/fluid/app/templates.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/templates.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/templates.cxx')
-rw-r--r--fluid/app/templates.cxx143
1 files changed, 143 insertions, 0 deletions
diff --git a/fluid/app/templates.cxx b/fluid/app/templates.cxx
new file mode 100644
index 000000000..802357ed2
--- /dev/null
+++ b/fluid/app/templates.cxx
@@ -0,0 +1,143 @@
+//
+// Fluid Project Templates 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/templates.h"
+
+#include "Fluid.h"
+#include "io/Project_Writer.h"
+#include "nodes/factory.h"
+#include "nodes/Tree.h"
+#include "nodes/Window_Node.h"
+#include "panels/template_panel.h"
+
+#include <FL/filename.H>
+#include <FL/fl_ask.H>
+#include <FL/Fl_PNG_Image.H>
+#include "../src/flstring.h"
+
+using namespace fld;
+using namespace fld::app;
+
+/**
+ Save a design template.
+ \todo We should document the concept of templates.
+ */
+void fld::app::save_template() {
+ // Setup the template panel...
+ if (!template_panel) make_template_panel();
+
+ template_clear();
+ template_browser->add("New Template");
+ template_load();
+
+ template_name->show();
+ template_name->value("");
+
+ template_instance->hide();
+
+ template_delete->show();
+ template_delete->deactivate();
+
+ template_submit->label("Save");
+ template_submit->deactivate();
+
+ template_panel->label("Save Template");
+
+ // Show the panel and wait for the user to do something...
+ template_panel->show();
+ while (template_panel->shown()) Fl::wait();
+
+ // Get the template name, return if it is empty...
+ const char *c = template_name->value();
+ if (!c || !*c) return;
+
+ // Convert template name to filename_with_underscores
+ char savename[FL_PATH_MAX], *saveptr;
+ strlcpy(savename, c, sizeof(savename));
+ for (saveptr = savename; *saveptr; saveptr ++) {
+ if (isspace(*saveptr)) *saveptr = '_';
+ }
+
+ // Find the templates directory...
+ char filename[FL_PATH_MAX];
+ Fluid.preferences.getUserdataPath(filename, sizeof(filename));
+
+ strlcat(filename, "templates", sizeof(filename));
+ if (fl_access(filename, 0)) fl_make_path(filename);
+
+ strlcat(filename, "/", sizeof(filename));
+ strlcat(filename, savename, sizeof(filename));
+
+ char *ext = filename + strlen(filename);
+ if (ext >= (filename + sizeof(filename) - 5)) {
+ fl_alert("The template name \"%s\" is too long!", c);
+ return;
+ }
+
+ // Save the .fl file...
+ strcpy(ext, ".fl");
+
+ if (!fl_access(filename, 0)) {
+ if (fl_choice("The template \"%s\" already exists.\n"
+ "Do you want to replace it?", "Cancel",
+ "Replace", nullptr, c) == 0) return;
+ }
+
+ if (!fld::io::write_file(Fluid.proj, filename)) {
+ fl_alert("Error writing %s: %s", filename, strerror(errno));
+ return;
+ }
+
+#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
+ // Get the screenshot, if any...
+ Node *t;
+
+ for (t = Fluid.proj.tree.first; t; t = t->next) {
+ // Find the first window...
+ if (t->is_a(Type::Window)) break;
+ }
+
+ if (!t) return;
+
+ // Grab a screenshot...
+ Window_Node *wt = (Window_Node *)t;
+ uchar *pixels;
+ int w, h;
+
+ if ((pixels = wt->read_image(w, h)) == nullptr) return;
+
+ // Save to a PNG file...
+ strcpy(ext, ".png");
+
+ errno = 0;
+ if (fl_write_png(filename, pixels, w, h, 3) != 0) {
+ delete[] pixels;
+ fl_alert("Error writing %s: %s", filename, strerror(errno));
+ return;
+ }
+
+# if 0 // The original PPM output code...
+ strcpy(ext, ".ppm");
+ fp = fl_fopen(filename, "wb");
+ fprintf(fp, "P6\n%d %d 255\n", w, h);
+ fwrite(pixels, w * h, 3, fp);
+ fclose(fp);
+# endif // 0
+
+ delete[] pixels;
+#endif // HAVE_LIBPNG && HAVE_LIBZ
+}
+