d7768b76d0
Tutorial still to be written. Also adds convenience methods to Fl_Input_ for getting and setting numeric values.
284 lines
9.2 KiB
C++
284 lines
9.2 KiB
C++
//
|
||
// FLUID template support for the Fast Light Tool Kit (FLTK).
|
||
//
|
||
// Copyright 1998-2020 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
|
||
//
|
||
|
||
// generated by Fast Light User Interface Designer (fluid) version 1.0400
|
||
|
||
#include "template_panel.h"
|
||
#include "fluid.h"
|
||
#include <FL/Fl_Shared_Image.H>
|
||
#include <FL/fl_ask.H>
|
||
#include <FL/fl_string_functions.h>
|
||
#include "fluid_filename.h"
|
||
#include "../src/flstring.h"
|
||
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
#include <errno.h>
|
||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||
#include <io.h>
|
||
#else
|
||
#include <unistd.h>
|
||
#endif // _WIN32 && !__CYGWIN__
|
||
|
||
Fl_Double_Window *template_panel=(Fl_Double_Window *)0;
|
||
|
||
static void cb_template_panel(Fl_Double_Window*, void*) {
|
||
Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image();
|
||
if (img) img->release();
|
||
template_preview->image(0);
|
||
|
||
template_browser->deselect();
|
||
template_name->value("");
|
||
template_instance->value("");
|
||
template_panel->hide();
|
||
}
|
||
|
||
Fl_Browser *template_browser=(Fl_Browser *)0;
|
||
|
||
static void cb_template_browser(Fl_Browser*, void*) {
|
||
if (Fl::event_clicks()) {
|
||
template_panel->hide();
|
||
return;
|
||
}
|
||
Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image();
|
||
if (img) img->release();
|
||
template_preview->image(0);
|
||
template_preview->redraw();
|
||
|
||
int item = template_browser->value();
|
||
|
||
if (item <= 1) template_instance->deactivate();
|
||
else template_instance->activate();
|
||
|
||
if (item < 1) {
|
||
template_submit->deactivate();
|
||
template_delete->deactivate();
|
||
return;
|
||
}
|
||
|
||
template_submit->activate();
|
||
|
||
const char *flfile = (const char *)template_browser->data(item);
|
||
if (!flfile) {
|
||
template_delete->deactivate();
|
||
return;
|
||
}
|
||
|
||
template_name->value(template_browser->text(item));
|
||
|
||
template_delete->activate();
|
||
|
||
char pngfile[1024], *ext;
|
||
|
||
strlcpy(pngfile, flfile, sizeof(pngfile));
|
||
if ((ext = strrchr(pngfile, '.')) == NULL) return;
|
||
strcpy(ext, ".png");
|
||
|
||
img = Fl_Shared_Image::get(pngfile);
|
||
|
||
if (img) {
|
||
template_preview->image(img);
|
||
template_preview->redraw();
|
||
}
|
||
}
|
||
|
||
Fl_Box *template_preview=(Fl_Box *)0;
|
||
|
||
Fl_Input *template_name=(Fl_Input *)0;
|
||
|
||
static void cb_template_name(Fl_Input*, void*) {
|
||
if (strlen(template_name->value())) {
|
||
template_submit->activate();
|
||
if (Fl::event_key() == FL_Enter) template_panel->hide();
|
||
} else template_submit->deactivate();
|
||
}
|
||
|
||
Fl_Input *template_instance=(Fl_Input *)0;
|
||
|
||
Fl_Button *template_delete=(Fl_Button *)0;
|
||
|
||
static void cb_Cancel(Fl_Button*, void*) {
|
||
Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image();
|
||
if (img) img->release();
|
||
template_preview->image(0);
|
||
|
||
template_browser->deselect();
|
||
template_name->value("");
|
||
template_instance->value("");
|
||
template_panel->hide();
|
||
}
|
||
|
||
Fl_Return_Button *template_submit=(Fl_Return_Button *)0;
|
||
|
||
static void cb_template_submit(Fl_Return_Button*, void*) {
|
||
Fl_Shared_Image *img = (Fl_Shared_Image *)template_preview->image();
|
||
if (img) img->release();
|
||
template_preview->image(0);
|
||
|
||
template_panel->hide();
|
||
}
|
||
|
||
Fl_Double_Window* make_template_panel() {
|
||
{ template_panel = new Fl_Double_Window(460, 355, "New/Save Template");
|
||
template_panel->callback((Fl_Callback*)cb_template_panel);
|
||
{ template_browser = new Fl_Browser(10, 28, 180, 250, "Available Templates:");
|
||
template_browser->type(2);
|
||
template_browser->labelfont(1);
|
||
template_browser->callback((Fl_Callback*)cb_template_browser);
|
||
template_browser->align(Fl_Align(FL_ALIGN_TOP_LEFT));
|
||
template_browser->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED);
|
||
} // Fl_Browser* template_browser
|
||
{ template_preview = new Fl_Box(200, 28, 250, 250, "no preview...");
|
||
template_preview->box(FL_THIN_DOWN_BOX);
|
||
template_preview->align(Fl_Align(FL_ALIGN_CLIP|FL_ALIGN_INSIDE));
|
||
Fl_Group::current()->resizable(template_preview);
|
||
} // Fl_Box* template_preview
|
||
{ template_name = new Fl_Input(198, 288, 252, 25, "Template Name:");
|
||
template_name->labelfont(1);
|
||
template_name->textfont(4);
|
||
template_name->callback((Fl_Callback*)cb_template_name);
|
||
template_name->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED);
|
||
} // Fl_Input* template_name
|
||
{ template_instance = new Fl_Input(198, 288, 252, 25, "Instance Name:");
|
||
template_instance->labelfont(1);
|
||
template_instance->textfont(4);
|
||
template_instance->hide();
|
||
} // Fl_Input* template_instance
|
||
{ Fl_Group* o = new Fl_Group(10, 323, 440, 25);
|
||
{ template_delete = new Fl_Button(10, 323, 143, 25, "Delete Template");
|
||
template_delete->callback((Fl_Callback*)template_delete_cb);
|
||
} // Fl_Button* template_delete
|
||
{ Fl_Box* o = new Fl_Box(153, 323, 126, 25);
|
||
Fl_Group::current()->resizable(o);
|
||
} // Fl_Box* o
|
||
{ Fl_Button* o = new Fl_Button(289, 323, 72, 25, "Cancel");
|
||
o->callback((Fl_Callback*)cb_Cancel);
|
||
} // Fl_Button* o
|
||
{ template_submit = new Fl_Return_Button(371, 323, 79, 25, "Save");
|
||
template_submit->callback((Fl_Callback*)cb_template_submit);
|
||
} // Fl_Return_Button* template_submit
|
||
o->end();
|
||
} // Fl_Group* o
|
||
template_panel->set_modal();
|
||
template_panel->end();
|
||
} // Fl_Double_Window* template_panel
|
||
return template_panel;
|
||
}
|
||
|
||
void template_clear() {
|
||
int i;
|
||
void *filename;
|
||
|
||
for (i = 1; i <= template_browser->size(); i ++) {
|
||
if ((filename = template_browser->data(i)) != NULL) free(filename);
|
||
}
|
||
|
||
template_browser->deselect();
|
||
template_browser->clear();
|
||
}
|
||
|
||
void template_delete_cb(Fl_Button *, void *) {
|
||
int item = template_browser->value();
|
||
if (item < 1) return;
|
||
|
||
const char *name = template_browser->text(item);
|
||
const char *flfile = (const char *)template_browser->data(item);
|
||
if (!flfile) return;
|
||
|
||
if (!fl_choice("Are you sure you want to delete the template \"%s\"?",
|
||
"Cancel", "Delete", 0, name)) return;
|
||
|
||
if (fl_unlink(flfile)) {
|
||
fl_alert("Unable to delete template \"%s\":\n%s", name, strerror(errno));
|
||
return;
|
||
}
|
||
|
||
template_browser->remove(item);
|
||
template_browser->do_callback();
|
||
}
|
||
|
||
void template_load() {
|
||
int i;
|
||
char name[1024], filename[1400], path[1024], *ptr;
|
||
struct dirent **files;
|
||
int num_files;
|
||
|
||
fluid_prefs.getUserdataPath(path, sizeof(path));
|
||
strlcat(path, "templates", sizeof(path));
|
||
|
||
int sample_templates_generated = 0;
|
||
fluid_prefs.get("sample_templates_generated", sample_templates_generated, 0);
|
||
|
||
if (sample_templates_generated < 2) {
|
||
strcpy(filename, path);
|
||
strcat(filename, "/FLTK_License.fl");
|
||
FILE *f = fopen(filename, "wb");
|
||
if (f) {
|
||
fputs(
|
||
"# data file for the Fltk User Interface Designer (fluid)\nversion 1.0400\nheader_name {.h}\n"
|
||
"code_name {.cxx}\ncomment {//\n// @INSTANCE@ for the Fast Light Tool Kit (FLT"
|
||
"K).\n//\n// Copyright 1998-2023 by Bill Spitzak and others.\n//\n// This library is free sof"
|
||
"tware. Distribution and use rights are outlined in\n// the file \"COPYING\" which should have "
|
||
"been included with this file. If this\n// file is missing or damaged, see the license at:\n"
|
||
"//\n// https://www.fltk.org/COPYING.php\n//\n// Please see the following page on how to report "
|
||
"bugs and issues:\n//\n// https://www.fltk.org/bugs.php\n//\n} {selected in_source in_head"
|
||
"er\n}\n", f);
|
||
fclose(f);
|
||
}
|
||
strcpy(filename, path);
|
||
strcat(filename, "/1of7GUIs.fl");
|
||
f = fopen(filename, "wb");
|
||
if (f) {
|
||
fputs(
|
||
"# data file for the Fltk User Interface Designer (fluid)\n version 1.0400\n header_name {.h}\n"
|
||
"code_name {.cxx}\n comment {\n1 of 7GUIs\n\n7GUIs was been created as a spin-off of the master’s\n"
|
||
"thesis Comparison of Object-Oriented and Functional\nProgramming for GUI Development by Eugen Kiss at the\n"
|
||
"Human-Computer Interaction group of the Leibniz\nUniversität Hannover in 2014.\n\n"
|
||
"https://7guis.github.io/7guis/\n} {selected in_source not_in_header\n}\n\nFunction {} {open\n"
|
||
"} {\nFl_Window {} {\nlabel Counter open\nxywh {486 292 194 55} type Double resizable visible\n"
|
||
"} {\nFl_Output counter_widget {\nxywh {15 15 80 22}\ncode0 {counter_widget->value(0);}\n"
|
||
"}\nFl_Button {} {\nlabel Count\ncallback {int i = counter_widget->ivalue();\ni++;\n"
|
||
"counter_widget->value(i);}\nxywh {99 15 80 22}\n}\n}\n}\n", f);
|
||
fclose(f);
|
||
}
|
||
sample_templates_generated = 2;
|
||
fluid_prefs.set("sample_templates_generated", sample_templates_generated);
|
||
fluid_prefs.flush();
|
||
}
|
||
|
||
num_files = fl_filename_list(path, &files);
|
||
|
||
for (i = 0; i < num_files; i ++) {
|
||
if (fl_filename_match(files[i]->d_name, "*.fl")) {
|
||
// Format the name as the filename with "_" replaced with " "
|
||
// and without the trailing ".fl"...
|
||
strlcpy(name, files[i]->d_name, sizeof(name));
|
||
*strstr(name, ".fl") = '\0';
|
||
|
||
for (ptr = name; *ptr; ptr ++) {
|
||
if (*ptr == '_') *ptr = ' ';
|
||
}
|
||
|
||
// Add the template to the browser...
|
||
snprintf(filename, sizeof(filename), "%s/%s", path, files[i]->d_name);
|
||
template_browser->add(name, fl_strdup(filename));
|
||
}
|
||
|
||
free(files[i]);
|
||
}
|
||
|
||
if (num_files > 0) free(files);
|
||
}
|