Fluid: user_data_

This commit is contained in:
Matthias Melcher
2026-01-07 13:35:11 +01:00
parent 5f6a2cbb16
commit e4b3713fad
7 changed files with 34 additions and 26 deletions

View File

@@ -464,8 +464,10 @@ int Menu_Item_Node::flags() {
if (!o->active()) i |= FL_MENU_INACTIVE;
if (!o->visible()) i |= FL_MENU_INVISIBLE;
if (can_have_children()) {
if (user_data() == nullptr) i |= FL_SUBMENU;
else i |= FL_SUBMENU_POINTER;
if (user_data().empty())
i |= FL_SUBMENU;
else
i |= FL_SUBMENU_POINTER;
}
if (hotspot()) i |= FL_MENU_DIVIDER;
if (menu_headline()) i |= FL_MENU_HEADLINE;
@@ -538,8 +540,8 @@ void Menu_Item_Node::write_item(fld::io::Code_Writer& f) {
}
} else
f.write_c(" 0,");
if (user_data())
f.write_c(" (void*)(%s),", user_data());
if (!user_data().empty())
f.write_c(" (void*)(%s),", user_data().c_str());
else
f.write_c(" 0,");
f.write_c(" %d, (uchar)%s, %d, %d, %d", flags(),

View File

@@ -512,7 +512,6 @@ Node::Node() :
name_(nullptr),
label_(nullptr),
callback_(nullptr),
user_data_(nullptr),
comment_(nullptr),
uid_(0),
parent(nullptr),
@@ -555,7 +554,6 @@ Node::~Node() {
if (name_) free((void*)name_);
if (label_) free((void*)label_);
if (callback_) free((void*)callback_);
if (user_data_) free((void*)user_data_);
if (comment_) free((void*)comment_);
}
@@ -846,8 +844,8 @@ void Node::callback(const char *n) {
storestring(n,callback_);
}
void Node::user_data(const char *n) {
storestring(n,user_data_);
void Node::user_data(const std::string& n) {
storestring(n, user_data_);
}
void Node::user_data_type(const std::string& n) {
@@ -936,7 +934,7 @@ void Node::write_properties(fld::io::Project_Writer &f) {
f.write_word("label");
f.write_word(label());
}
if (user_data()) {
if (!user_data().empty()) {
f.write_indent(level+1);
f.write_word("user_data");
f.write_word(user_data());

View File

@@ -168,7 +168,7 @@ protected:
it is the full callback C++ code. Can be nullptr. */
const char *callback_;
/** Widget user data field as C++ text. */
const char *user_data_;
std::string user_data_;
/** Widget user data type as C++ text, usually `void*` or `long`. */
std::string user_data_type_;
/** Optional comment for every node in the graph. Visible in browser and
@@ -234,8 +234,8 @@ public:
void label(const char *);
const char *callback() const {return callback_;}
void callback(const char *);
const char *user_data() const {return user_data_;}
void user_data(const char *);
std::string user_data() const { return user_data_; }
void user_data(const std::string&);
std::string user_data_type() const { return user_data_type_; }
std::string user_data_type_or_voidp() const { return user_data_type_.empty() ? "void*" : user_data_type_; }
void user_data_type(const std::string&);

View File

@@ -1924,7 +1924,7 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
if (s != fs) f.write_c("%s%s->textsize(%d);\n", f.indent(), var, s);
if (c != fc) write_color(f, "textcolor", c);
}}
const char* ud = user_data();
std::string ud = user_data();
if (class_name(1) && !parent->is_widget()) ud = "this";
if (callback()) {
if (callback()[0] == '[') {
@@ -1937,12 +1937,12 @@ void Widget_Node::write_widget_code(fld::io::Code_Writer& f) {
} else {
f.write_c("%s%s->callback((Fl_Callback*)%s", f.indent(), var, callback_name(f));
}
if (ud)
f.write_c(", (void*)(%s));\n", ud);
if (!ud.empty())
f.write_c(", (void*)(%s));\n", ud.c_str());
else
f.write_c(");\n");
} else if (ud) {
f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud);
} else if (!ud.empty()) {
f.write_c("%s%s->user_data((void*)(%s));\n", f.indent(), var, ud.c_str());
}
if (o->align() != tplate->align() || !subclass().empty()) {
int i = o->align();

View File

@@ -2396,19 +2396,23 @@ Fl_Group *wp_cpp_callback=(Fl_Group *)0;
static void cb_13(Fl_Input* o, void* v) {
//fl ▼ ---------------------- callback -~~=~-~----==~-=~~=~-= ▼ fl//
if (v == LOAD) {
o->value(current_widget->user_data());
o->value(current_widget->user_data().c_str());
} else {
int mod = 0;
const char *c = o->value();
const char *d = c_check(c);
if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;}
if (d) {
fl_message("Error in user_data: %s",d);
haderror = 1;
return;
}
for (Node *n: Fluid.proj.tree.all_selected_nodes()) {
n->user_data(c);
mod = 1;
}
if (mod) Fluid.proj.set_modflag(1);
}
//fl ▲ ----------=~-=-~--~--=----------~-~=-~=~-~~---=-~~-~-- ▲ fl//
//fl ▲ ----------=~-=-~--~--=-----------~=--~~~~=~-=~-~=-~==~ ▲ fl//
}
static void cb_When(Fl_Menu_Button* o, void* v) {

View File

@@ -519,7 +519,7 @@ Function {make_widget_panel()} {uid 9310
} {
Fl_Window {} {uid 30ee
comment {Use a Double Window to avoid flickering.} open
xywh {444 254 420 400} type Double labelsize 11 align 80 resizable hotspot
xywh {444 253 420 400} type Double labelsize 11 align 80 resizable hotspot
code0 {o->size_range(o->w(), o->h());} size_range {420 400 0 0} visible
} {
Fl_Wizard tabs_wizard {uid 647f
@@ -1601,7 +1601,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
Fluid.proj.undo.checkpoint();
((Fl_Window*)(current_widget->o))->border(o->value());
Fluid.proj.set_modflag(1);
}}
}} selected
tooltip {Add a border around the window.} xywh {195 235 60 20} selection_color 1 labelsize 11
}
Fl_Light_Button {} {uid 457d
@@ -1784,7 +1784,7 @@ unselectable, but not grayed out} xywh {225 260 75 20} selection_color 1 labelsi
mod = 1;
}
if (mod) Fluid.proj.set_modflag(1);
}} selected
}}
tooltip {The tooltip text for the widget.
Use Ctrl-J for newlines.} xywh {95 285 310 20} labelfont 1 labelsize 11 textsize 11
}
@@ -2506,12 +2506,16 @@ wCallback->do_callback(wCallback, v);} open
} {
Fl_Input {} {uid c214
callback {if (v == LOAD) {
o->value(current_widget->user_data());
o->value(current_widget->user_data().c_str());
} else {
int mod = 0;
const char *c = o->value();
const char *d = c_check(c);
if (d) {fl_message("Error in user_data: %s",d); haderror = 1; return;}
if (d) {
fl_message("Error in user_data: %s",d);
haderror = 1;
return;
}
for (Node *n: Fluid.proj.tree.all_selected_nodes()) {
n->user_data(c);
mod = 1;

View File

@@ -693,7 +693,7 @@ static void deferred_mergeback_handler(void*) {
static int app_event_handler(int event) {
if (event == FL_APP_ACTIVATE) {
Fl::add_idle(deferred_mergeback_handler, nullptr);
Fl::add_timeout(0.5, deferred_mergeback_handler, nullptr);
}
return 0;
}