STR 3442: copy/paste now inserts widget as expected.

Fluid would add pasted widgets as the last child of the
current group, even if they were cut at the beginning
of the group. This patch adds a 'startegy' to adding
widgets to allow merging closer to the 'current' widget.

Also added d'n'd for the widget bin and some other
UI improvements.

STR 3442: some preparation, variable renaming

STR 3442: unifying functions to add widgets.

Adding widgets interactively is merged into one function,
making undo/redo work as expected and removing
unexpected differences between adding by menu or bin.

STR 3442: adding drag'n'drop for windows from bin.

Just drag the window symbol out of the tree and drop it anywhere
on the desktop.

Visual representation of dragged Window.

STR 3442: insert individual nodes after 'current'

STR 3442: adding new widget at expected positions.

The widget bin can finally do drag'n'drop.
Widgets appear in the tree close to the last selection.
Duplicating now ads right below.
Cut and paste inserts after last selection.

Fluid: replaced #define with strict enum type.
This commit is contained in:
Matthias Melcher 2021-12-11 19:43:00 +01:00 committed by Matthias Melcher
parent a802aaeb17
commit 160832ce04
24 changed files with 1256 additions and 293 deletions

View File

@ -24,6 +24,7 @@ set (CPPFILES
Fl_Widget_Type.cxx Fl_Widget_Type.cxx
Fl_Window_Type.cxx Fl_Window_Type.cxx
Fluid_Image.cxx Fluid_Image.cxx
Shortcut_Button.cxx
about_panel.cxx about_panel.cxx
align_widget.cxx align_widget.cxx
alignment_panel.cxx alignment_panel.cxx

View File

@ -187,15 +187,16 @@ Fl_Function_Type::~Fl_Function_Type() {
/** /**
Create a new function for the widget tree. Create a new function for the widget tree.
\param[in] strategy new function add after current or as last child
\return the new node \return the new node
*/ */
Fl_Type *Fl_Function_Type::make() { Fl_Type *Fl_Function_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_decl_block()) p = p->parent; while (p && !p->is_decl_block()) p = p->parent;
Fl_Function_Type *o = new Fl_Function_Type(); Fl_Function_Type *o = new Fl_Function_Type();
o->name("make_window()"); o->name("make_window()");
o->return_type = 0; o->return_type = 0;
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
o->public_ = 1; o->public_ = 1;
o->cdecl_ = 0; o->cdecl_ = 0;
@ -556,8 +557,10 @@ Fl_Code_Type::Fl_Code_Type() :
Make a new code node. Make a new code node.
If the parent node is not a function, a message box will pop up and If the parent node is not a function, a message box will pop up and
the request will be ignored. the request will be ignored.
\param[in] strategy add code after current or as last child
\return new Code node
*/ */
Fl_Type *Fl_Code_Type::make() { Fl_Type *Fl_Code_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_code_block()) p = p->parent; while (p && !p->is_code_block()) p = p->parent;
if (!p) { if (!p) {
@ -566,7 +569,7 @@ Fl_Type *Fl_Code_Type::make() {
} }
Fl_Code_Type *o = new Fl_Code_Type(); Fl_Code_Type *o = new Fl_Code_Type();
o->name("printf(\"Hello, World!\\n\");"); o->name("printf(\"Hello, World!\\n\");");
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }
@ -726,8 +729,10 @@ Fl_CodeBlock_Type::~Fl_CodeBlock_Type() {
Make a new code block. Make a new code block.
If the parent node is not a function or another codeblock, a message box will If the parent node is not a function or another codeblock, a message box will
pop up and the request will be ignored. pop up and the request will be ignored.
\param[in] strategy add after current or as last child
\return new CodeBlock
*/ */
Fl_Type *Fl_CodeBlock_Type::make() { Fl_Type *Fl_CodeBlock_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_code_block()) p = p->parent; while (p && !p->is_code_block()) p = p->parent;
if (!p) { if (!p) {
@ -737,7 +742,7 @@ Fl_Type *Fl_CodeBlock_Type::make() {
Fl_CodeBlock_Type *o = new Fl_CodeBlock_Type(); Fl_CodeBlock_Type *o = new Fl_CodeBlock_Type();
o->name("if (test())"); o->name("if (test())");
o->after = 0; o->after = 0;
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }
@ -851,15 +856,17 @@ int Fl_Decl_Type::is_public() const
/** /**
Make a new declaration. Make a new declaration.
\param[in] strategy add after current or as last child
\return new Declaration node
*/ */
Fl_Type *Fl_Decl_Type::make() { Fl_Type *Fl_Decl_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_decl_block()) p = p->parent; while (p && !p->is_decl_block()) p = p->parent;
Fl_Decl_Type *o = new Fl_Decl_Type(); Fl_Decl_Type *o = new Fl_Decl_Type();
o->public_ = 0; o->public_ = 0;
o->static_ = 1; o->static_ = 1;
o->name("int x;"); o->name("int x;");
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }
@ -966,7 +973,7 @@ BREAK2:
/** /**
Write the code to the source and header files. Write the code to the source and header files.
\todo There are a lot of side effect in this node depending on the given text \todo There are a lot of side effect in this node depending on the given text
and the parent node which should really be documented. and the parent node. They need to be understood and documented.
*/ */
void Fl_Decl_Type::write_code1() { void Fl_Decl_Type::write_code1() {
const char* c = name(); const char* c = name();
@ -1063,8 +1070,10 @@ Fl_Data_Type::~Fl_Data_Type() {
/** /**
Create an empty inline data node. Create an empty inline data node.
\param[in] strategy add after current or as last child
\return new inline data node
*/ */
Fl_Type *Fl_Data_Type::make() { Fl_Type *Fl_Data_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_decl_block()) p = p->parent; while (p && !p->is_decl_block()) p = p->parent;
Fl_Data_Type *o = new Fl_Data_Type(); Fl_Data_Type *o = new Fl_Data_Type();
@ -1073,7 +1082,7 @@ Fl_Type *Fl_Data_Type::make() {
o->filename_ = 0; o->filename_ = 0;
o->text_mode_ = 0; o->text_mode_ = 0;
o->name("myInlineData"); o->name("myInlineData");
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }
@ -1352,15 +1361,17 @@ int Fl_DeclBlock_Type::is_public() const {return public_;}
/** /**
Create a new declaration block. Create a new declaration block.
\param[in] strategy add after current or as last child
\return new Declaration Blocknode
*/ */
Fl_Type *Fl_DeclBlock_Type::make() { Fl_Type *Fl_DeclBlock_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_decl_block()) p = p->parent; while (p && !p->is_decl_block()) p = p->parent;
Fl_DeclBlock_Type *o = new Fl_DeclBlock_Type(); Fl_DeclBlock_Type *o = new Fl_DeclBlock_Type();
o->name("#if 1"); o->name("#if 1");
o->public_ = 0; o->public_ = 0;
o->after = fl_strdup("#endif"); o->after = fl_strdup("#endif");
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }
@ -1479,8 +1490,10 @@ Fl_Comment_Type::Fl_Comment_Type() :
/** /**
Make a new comment node. Make a new comment node.
\param[in] strategy add after current or as last child
\return new Comment node
*/ */
Fl_Type *Fl_Comment_Type::make() { Fl_Type *Fl_Comment_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_code_block()) p = p->parent; while (p && !p->is_code_block()) p = p->parent;
Fl_Comment_Type *o = new Fl_Comment_Type(); Fl_Comment_Type *o = new Fl_Comment_Type();
@ -1488,7 +1501,7 @@ Fl_Type *Fl_Comment_Type::make() {
o->in_h_ = 1; o->in_h_ = 1;
o->style_ = 0; o->style_ = 0;
o->name("my comment"); o->name("my comment");
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
o->title_buf[0] = 0; o->title_buf[0] = 0;
return o; return o;
@ -1735,9 +1748,6 @@ void Fl_Comment_Type::write_code1() {
/** \class Fl_Class_Type /** \class Fl_Class_Type
Manage a class declaration and implementation. Manage a class declaration and implementation.
\todo This is pretty complex and needs to be revisited to give
a good description.
*/ */
/// Prototype for a class node to be used by the factory. /// Prototype for a class node to be used by the factory.
@ -1780,8 +1790,10 @@ void Fl_Class_Type::prefix(const char*p) {
/** /**
Make a new class node. Make a new class node.
\param[in] strategy add after current or as last child
\return new Class node
*/ */
Fl_Type *Fl_Class_Type::make() { Fl_Type *Fl_Class_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_decl_block()) p = p->parent; while (p && !p->is_decl_block()) p = p->parent;
Fl_Class_Type *o = new Fl_Class_Type(); Fl_Class_Type *o = new Fl_Class_Type();
@ -1789,7 +1801,7 @@ Fl_Type *Fl_Class_Type::make() {
o->class_prefix = NULL; o->class_prefix = NULL;
o->subclass_of = NULL; o->subclass_of = NULL;
o->public_ = 1; o->public_ = 1;
o->add(p); o->add(p, strategy);
o->factory = this; o->factory = this;
return o; return o;
} }

View File

@ -49,7 +49,7 @@ class Fl_Function_Type : public Fl_Type {
public: public:
Fl_Function_Type(); Fl_Function_Type();
~Fl_Function_Type(); ~Fl_Function_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2(); void write_code2();
void open(); void open();
@ -77,7 +77,7 @@ class Fl_Code_Type : public Fl_Type {
public: public:
Fl_Code_Type(); Fl_Code_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write(); void write();
void write_code1(); void write_code1();
void write_code2() { } void write_code2() { }
@ -100,7 +100,7 @@ class Fl_CodeBlock_Type : public Fl_Type {
public: public:
Fl_CodeBlock_Type(); Fl_CodeBlock_Type();
~Fl_CodeBlock_Type(); ~Fl_CodeBlock_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2(); void write_code2();
void open(); void open();
@ -123,7 +123,7 @@ protected:
public: public:
Fl_Decl_Type(); Fl_Decl_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2() { } void write_code2() { }
void open(); void open();
@ -143,7 +143,7 @@ class Fl_Data_Type : public Fl_Decl_Type {
public: public:
Fl_Data_Type(); Fl_Data_Type();
~Fl_Data_Type(); ~Fl_Data_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2() {} void write_code2() {}
void open(); void open();
@ -162,7 +162,7 @@ class Fl_DeclBlock_Type : public Fl_Type {
public: public:
Fl_DeclBlock_Type(); Fl_DeclBlock_Type();
~Fl_DeclBlock_Type(); ~Fl_DeclBlock_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2(); void write_code2();
void open(); void open();
@ -183,7 +183,7 @@ class Fl_Comment_Type : public Fl_Type {
public: public:
Fl_Comment_Type(); Fl_Comment_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2() { } void write_code2() { }
void open(); void open();
@ -210,7 +210,7 @@ public:
char write_public_state; // true when public: has been printed char write_public_state; // true when public: has been printed
Fl_Class_Type* parent_class; // save class if nested Fl_Class_Type* parent_class; // save class if nested
// //
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2(); void write_code2();
void open(); void open();

View File

@ -42,8 +42,13 @@ void igroup::resize(int X, int Y, int W, int H) {
Fl_Group_Type Fl_Group_type; // the "factory" Fl_Group_Type Fl_Group_type; // the "factory"
Fl_Type *Fl_Group_Type::make() { /**
return Fl_Widget_Type::make(); Create and add a new Group node.
\param[in] strategy add after current or as last child
\return new Group node
*/
Fl_Type *Fl_Group_Type::make(Strategy strategy) {
return Fl_Widget_Type::make(strategy);
} }
void fix_group_size(Fl_Type *tt) { void fix_group_size(Fl_Type *tt) {
@ -74,14 +79,14 @@ void group_cb(Fl_Widget *, void *) {
} }
Fl_Widget_Type* q = (Fl_Widget_Type*)qq; Fl_Widget_Type* q = (Fl_Widget_Type*)qq;
force_parent = 1; force_parent = 1;
Fl_Group_Type *n = (Fl_Group_Type*)(Fl_Group_type.make()); Fl_Group_Type *n = (Fl_Group_Type*)(Fl_Group_type.make(kAddAsLastChild));
n->move_before(q); n->move_before(q);
n->o->resize(q->o->x(),q->o->y(),q->o->w(),q->o->h()); n->o->resize(q->o->x(),q->o->y(),q->o->w(),q->o->h());
for (Fl_Type *t = Fl_Type::first; t;) { for (Fl_Type *t = Fl_Type::first; t;) {
if (t->level != n->level || t == n || !t->selected) { if (t->level != n->level || t == n || !t->selected) {
t = t->next; continue;} t = t->next; continue;}
Fl_Type *nxt = t->remove(); Fl_Type *nxt = t->remove();
t->add(n); t->add(n, kAddAsLastChild);
t = nxt; t = nxt;
} }
fix_group_size(n); fix_group_size(n);

View File

@ -54,7 +54,7 @@ public:
Fl_Widget *widget(int X,int Y,int W,int H) { Fl_Widget *widget(int X,int Y,int W,int H) {
igroup *g = new igroup(X,Y,W,H); Fl_Group::current(0); return g;} igroup *g = new igroup(X,Y,W,H); Fl_Group::current(0); return g;}
Fl_Widget_Type *_make() {return new Fl_Group_Type();} Fl_Widget_Type *_make() {return new Fl_Group_Type();}
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void write_code1(); void write_code1();
void write_code2(); void write_code2();
void add_child(Fl_Type*, Fl_Type*); void add_child(Fl_Type*, Fl_Type*);

View File

@ -100,8 +100,12 @@ void Fl_Input_Choice_Type::build_menu() {
o->redraw(); o->redraw();
} }
/**
Fl_Type *Fl_Menu_Item_Type::make() { Create and add a new Menu Item node.
\param[in] strategy add after current or as last child
\return new Menu Item node
*/
Fl_Type *Fl_Menu_Item_Type::make(Strategy strategy) {
// Find the current menu item: // Find the current menu item:
Fl_Type* q = Fl_Type::current; Fl_Type* q = Fl_Type::current;
Fl_Type* p = q; Fl_Type* p = q;
@ -122,28 +126,43 @@ Fl_Type *Fl_Menu_Item_Type::make() {
t->o = new Fl_Button(0,0,100,20); t->o = new Fl_Button(0,0,100,20);
t->o->type(menuitemtype); t->o->type(menuitemtype);
t->factory = this; t->factory = this;
t->add(p); t->add(p, strategy);
if (!reading_file) t->label(submenuflag ? "submenu" : "item"); if (!reading_file) t->label(submenuflag ? "submenu" : "item");
return t; return t;
} }
Fl_Type *Fl_Checkbox_Menu_Item_Type::make() { /**
Create and add a new Checkbox Menu Item node.
\param[in] strategy add after current or as last child
\return new node
*/
Fl_Type *Fl_Checkbox_Menu_Item_Type::make(Strategy strategy) {
menuitemtype = FL_MENU_TOGGLE; menuitemtype = FL_MENU_TOGGLE;
Fl_Type* t = Fl_Menu_Item_Type::make(); Fl_Type* t = Fl_Menu_Item_Type::make(strategy);
menuitemtype = 0; menuitemtype = 0;
return t; return t;
} }
Fl_Type *Fl_Radio_Menu_Item_Type::make() { /**
Create and add a new Radio ButtonMenu Item node.
\param[in] strategy add after current or as last child
\return new node
*/
Fl_Type *Fl_Radio_Menu_Item_Type::make(Strategy strategy) {
menuitemtype = FL_MENU_RADIO; menuitemtype = FL_MENU_RADIO;
Fl_Type* t = Fl_Menu_Item_Type::make(); Fl_Type* t = Fl_Menu_Item_Type::make(strategy);
menuitemtype = 0; menuitemtype = 0;
return t; return t;
} }
Fl_Type *Fl_Submenu_Type::make() { /**
Create and add a new Submenu Item node.
\param[in] strategy add after current or as last child
\return new node
*/
Fl_Type *Fl_Submenu_Type::make(Strategy strategy) {
submenuflag = 1; submenuflag = 1;
Fl_Type* t = Fl_Menu_Item_Type::make(); Fl_Type* t = Fl_Menu_Item_Type::make(strategy);
submenuflag = 0; submenuflag = 0;
return t; return t;
} }
@ -584,47 +603,6 @@ Fl_Menu_Bar_Type Fl_Menu_Bar_type;
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
// Shortcut entry item in panel: // Shortcut entry item in panel:
void Shortcut_Button::draw() {
if (value()) draw_box(FL_DOWN_BOX, (Fl_Color)9);
else draw_box(FL_UP_BOX, FL_WHITE);
fl_font(FL_HELVETICA,14); fl_color(FL_FOREGROUND_COLOR);
if (use_FL_COMMAND && (svalue & (FL_CTRL|FL_META))) {
char buf[1024];
fl_snprintf(buf, 1023, "Command+%s", fl_shortcut_label(svalue&~(FL_CTRL|FL_META)));
fl_draw(buf,x()+6,y(),w(),h(),FL_ALIGN_LEFT);
} else {
fl_draw(fl_shortcut_label(svalue),x()+6,y(),w(),h(),FL_ALIGN_LEFT);
}
}
int Shortcut_Button::handle(int e) {
when(0); type(FL_TOGGLE_BUTTON);
if (e == FL_KEYBOARD) {
if (!value()) return 0;
int v = Fl::event_text()[0];
if ( (v > 32 && v < 0x7f) || (v > 0xa0 && v <= 0xff) ) {
if (isupper(v)) {
v = tolower(v);
v |= FL_SHIFT;
}
v = v | (Fl::event_state()&(FL_META|FL_ALT|FL_CTRL));
} else {
v = (Fl::event_state()&(FL_META|FL_ALT|FL_CTRL|FL_SHIFT)) | Fl::event_key();
if (v == FL_BackSpace && svalue) v = 0;
}
if (v != svalue) {svalue = v; set_changed(); redraw(); do_callback(); }
return 1;
} else if (e == FL_UNFOCUS) {
int c = changed(); value(0); if (c) set_changed();
return 1;
} else if (e == FL_FOCUS) {
return value();
} else {
int r = Fl_Button::handle(e);
if (e == FL_RELEASE && value() && Fl::focus() != this) take_focus();
return r;
}
}
void shortcut_in_cb(Shortcut_Button* i, void* v) { void shortcut_in_cb(Shortcut_Button* i, void* v) {
if (v == LOAD) { if (v == LOAD) {

View File

@ -36,7 +36,7 @@ public:
Fl_Menu_Item* subtypes() {return menu_item_type_menu;} Fl_Menu_Item* subtypes() {return menu_item_type_menu;}
const char* type_name() {return "MenuItem";} const char* type_name() {return "MenuItem";}
const char* alt_type_name() {return "fltk::Item";} const char* alt_type_name() {return "fltk::Item";}
Fl_Type* make(); Fl_Type* make(Strategy strategy);
int is_menu_item() const {return 1;} int is_menu_item() const {return 1;}
int is_button() const {return 1;} // this gets shortcut to work int is_button() const {return 1;} // this gets shortcut to work
Fl_Widget* widget(int,int,int,int) {return 0;} Fl_Widget* widget(int,int,int,int) {return 0;}
@ -53,14 +53,14 @@ public:
class Fl_Radio_Menu_Item_Type : public Fl_Menu_Item_Type { class Fl_Radio_Menu_Item_Type : public Fl_Menu_Item_Type {
public: public:
const char* type_name() {return "RadioMenuItem";} const char* type_name() {return "RadioMenuItem";}
Fl_Type* make(); Fl_Type* make(Strategy strategy);
int pixmapID() { return 55; } int pixmapID() { return 55; }
}; };
class Fl_Checkbox_Menu_Item_Type : public Fl_Menu_Item_Type { class Fl_Checkbox_Menu_Item_Type : public Fl_Menu_Item_Type {
public: public:
const char* type_name() {return "CheckMenuItem";} const char* type_name() {return "CheckMenuItem";}
Fl_Type* make(); Fl_Type* make(Strategy strategy);
int pixmapID() { return 54; } int pixmapID() { return 54; }
}; };
@ -71,7 +71,7 @@ public:
const char* alt_type_name() {return "fltk::ItemGroup";} const char* alt_type_name() {return "fltk::ItemGroup";}
int is_parent() const {return 1;} int is_parent() const {return 1;}
int is_button() const {return 0;} // disable shortcut int is_button() const {return 0;} // disable shortcut
Fl_Type* make(); Fl_Type* make(Strategy strategy);
// changes to submenu must propagate up so build_menu is called // changes to submenu must propagate up so build_menu is called
// on the parent Fl_Menu_Type: // on the parent Fl_Menu_Type:
void add_child(Fl_Type*a, Fl_Type*b) {parent->add_child(a,b);} void add_child(Fl_Type*a, Fl_Type*b) {parent->add_child(a,b);}

View File

@ -14,6 +14,9 @@
// https://www.fltk.org/bugs.php // https://www.fltk.org/bugs.php
// //
/// \defgroup fl_type Basic Node for all Widgets and Functions
/// \{
/** \class Fl_Type /** \class Fl_Type
Each object described by Fluid is one of these objects. They Each object described by Fluid is one of these objects. They
are all stored in a double-linked list. are all stored in a double-linked list.
@ -34,6 +37,7 @@ copied or otherwise examined.
#include "Fl_Function_Type.h" #include "Fl_Function_Type.h"
#include "Fl_Widget_Type.h" #include "Fl_Widget_Type.h"
#include "Fl_Window_Type.h" #include "Fl_Window_Type.h"
#include "Fl_Group_Type.h"
#include "widget_browser.h" #include "widget_browser.h"
#include "file.h" #include "file.h"
#include "code.h" #include "code.h"
@ -53,6 +57,8 @@ copied or otherwise examined.
Fl_Type *Fl_Type::first = NULL; Fl_Type *Fl_Type::first = NULL;
Fl_Type *Fl_Type::last = NULL; Fl_Type *Fl_Type::last = NULL;
Fl_Type *Fl_Type::current = NULL;
Fl_Type *Fl_Type::current_dnd = NULL;
Fl_Type *in_this_only; // set if menu popped-up in window Fl_Type *in_this_only; // set if menu popped-up in window
@ -217,6 +223,31 @@ void fixvisible(Fl_Type *p) {
// ---- implemenation of Fl_Type // ---- implemenation of Fl_Type
/** \var Fl_Type *Fl_Type::parent
Link to the parent node in the tree structure.
Used for simulating a tree structure via a doubly linked list.
*/
/** \var Fl_Type *Fl_Type::level
Zero based depth of the node within the tree structure.
Level is used to emulate a tree structure: the first node with a lower
level in the prev list would be the parent of this node. If the next member
has a higher level value, it is this nodes first child. At the same level,
it would be the first sibling.
*/
/** \var Fl_Type *Fl_Type::next
Points to the next node in the doubly linked list.
If this is NULL, we are at the end of the list.
Used for simulating a tree structure via a doubly linked list.
*/
/** \var Fl_Type *Fl_Type::prev
Link to the next node in the tree structure.
If this is NULL, we are at the beginning of the list.
Used for simulating a tree structure via a doubly linked list.
*/
/**
Constructor and base for any node in the widget tree.
*/
Fl_Type::Fl_Type() { Fl_Type::Fl_Type() {
factory = 0; factory = 0;
parent = 0; parent = 0;
@ -235,11 +266,20 @@ Fl_Type::Fl_Type() {
code_position_end = header_position_end = -1; code_position_end = header_position_end = -1;
} }
/**
Destructor for any node in the tree.
The destructor removes itself from the doubly linked list. This is dangerous,
because the node does not know if it is part of the widget tree, or if it is
in a seperate tree. We try to take care of that as well as possible.
*/
Fl_Type::~Fl_Type() { Fl_Type::~Fl_Type() {
// warning: destructor only works for widgets that have been add()ed. // warning: destructor only works for widgets that have been add()ed.
if (widget_browser) widget_browser->deleting(this); if (widget_browser) widget_browser->deleting(this);
if (prev) prev->next = next; else first = next; if (prev) prev->next = next; else first = next;
if (next) next->prev = prev; else last = prev; if (next) next->prev = prev; else last = prev;
if (Fl_Type::last==this) Fl_Type::last = prev;
if (Fl_Type::first==this) Fl_Type::first = next;
if (current == this) current = 0; if (current == this) current = 0;
if (parent) parent->remove_child(this); if (parent) parent->remove_child(this);
if (name_) free((void*)name_); if (name_) free((void*)name_);
@ -259,26 +299,54 @@ const char* Fl_Type::title() {
} }
/** /**
Add this list/tree of widgets as a new child of p. Return the window that contains this widget.
\return NULL if this is not a widget.
*/
Fl_Window_Type *Fl_Type::window() {
if (!is_widget())
return NULL;
for (Fl_Type *t = this; t; t=t->parent)
if (t->is_window())
return (Fl_Window_Type*)t;
return NULL;
}
\c this is not part of the widget browser. \c p should be in the /**
Return the group that contains this widget.
\return NULL if this is not a widget.
*/
Fl_Group_Type *Fl_Type::group() {
if (!is_widget())
return NULL;
for (Fl_Type *t = this; t; t=t->parent)
if (t->is_group())
return (Fl_Group_Type*)t;
return NULL;
}
/**
Add this list/tree of widgets as a new last child of p.
\c this must not be part of the widget browser. \c p however must be in the
widget_browser, so \c Fl_Type::first and \c Fl_Type::last are valid for \c p. widget_browser, so \c Fl_Type::first and \c Fl_Type::last are valid for \c p.
This methods updates the widget_browser. This methods updates the widget_browser.
\param[in] p insert \c this tree as a child of \c p \param[in] p insert \c this tree as a child of \c p
\param[in] strategy is kAddAsLastChild or kAddAfterCurrent
*/ */
void Fl_Type::add(Fl_Type *p) { void Fl_Type::add(Fl_Type *p, Strategy strategy) {
if (p && parent == p) return; if (p && parent == p) return;
undo_checkpoint(); undo_checkpoint();
parent = p; parent = p;
// p is not in the Widget_Browser, so we must run the linked list to find the last entry // 'this' is not in the Widget_Browser, so we must run the linked list to find the last entry
Fl_Type *end = this; Fl_Type *end = this;
while (end->next) end = end->next; while (end->next) end = end->next;
// run the list again to set the future node levels // run the list again to set the future node levels
Fl_Type *q; Fl_Type *q; // insert 'this' before q
int newlevel; int newlevel;
if (p) { if (p) {
// find the last node that is a child or grandchild of p
for (q = p->next; q && q->level > p->level; q = q->next) {/*empty*/} for (q = p->next; q && q->level > p->level; q = q->next) {/*empty*/}
newlevel = p->level+1; newlevel = p->level+1;
} else { } else {
@ -287,7 +355,7 @@ void Fl_Type::add(Fl_Type *p) {
} }
for (Fl_Type *t = this->next; t; t = t->next) t->level += (newlevel-level); for (Fl_Type *t = this->next; t; t = t->next) t->level += (newlevel-level);
level = newlevel; level = newlevel;
// now link this tree after p // now link 'this' and its children before 'q', or last, if 'q' is NULL
if (q) { if (q) {
prev = q->prev; prev = q->prev;
prev->next = this; prev->next = this;
@ -308,6 +376,22 @@ void Fl_Type::add(Fl_Type *p) {
open_ = 1; open_ = 1;
fixvisible(this); fixvisible(this);
set_modflag(1); set_modflag(1);
if (strategy==kAddAfterCurrent && current) {
// we have current, t is the new node, p is the parent
// find the next child of the parent after current
//t->add(p); // add as a last child
Fl_Type *cc = current;
for (cc = current->next; cc; cc=cc->next) {
if (cc->level<=this->level)
break;
}
if (cc && cc->level==this->level && cc!=this) {
this->move_before(cc);
}
select(this, 1);
}
// run the p tree a last time to make sure the widget_browser updates correctly // run the p tree a last time to make sure the widget_browser updates correctly
Fl_Type *a = p; Fl_Type *a = p;
for (Fl_Type *t = this; t && a != end; a = t, t = t->next) for (Fl_Type *t = this; t && a != end; a = t, t = t->next)
@ -316,20 +400,20 @@ void Fl_Type::add(Fl_Type *p) {
} }
/** /**
Add this list/tree of widgets as a new sibling before p. Add `this` list/tree of widgets as a new sibling before `g`.
\c this is not part of the widget browser. \c g should be in the `This` is not part of the widget browser. `g` must be in the
widget_browser, so \c Fl_Type::first and \c Fl_Type::last are valid for \c p. widget_browser, so `Fl_Type::first` and `Fl_Type::last` are valid for `g .
This methods updates the widget_browser. This methods updates the widget_browser.
\param[in] g insert \c this tree as a child of \c p \param[in] g pointer to a node within the tree
*/ */
void Fl_Type::insert(Fl_Type *g) { void Fl_Type::insert(Fl_Type *g) {
// p is not in the Widget_Browser, so we must run the linked list to find the last entry // 'this' is not in the Widget_Browser, so we must run the linked list to find the last entry
Fl_Type *end = this; Fl_Type *end = this;
while (end->next) end = end->next; while (end->next) end = end->next;
// this wil get the sam parent as g // 'this' will get the same parent as 'g'
parent = g->parent; parent = g->parent;
// run the list again to set the future node levels // run the list again to set the future node levels
int newlevel = g->level; int newlevel = g->level;
@ -734,3 +818,5 @@ void Fl_Type::write_code1() {
void Fl_Type::write_code2() { void Fl_Type::write_code2() {
} }
/// \}

View File

@ -21,6 +21,13 @@
#include <FL/fl_draw.H> #include <FL/fl_draw.H>
class Fl_Type; class Fl_Type;
class Fl_Group_Type;
class Fl_Window_Type;
typedef enum {
kAddAsLastChild = 0,
kAddAfterCurrent
} Strategy;
void fixvisible(Fl_Type *p); void fixvisible(Fl_Type *p);
void delete_all(int selected_only=0); void delete_all(int selected_only=0);
@ -52,15 +59,15 @@ protected:
public: // things that should not be public: public: // things that should not be public:
Fl_Type *parent; // parent, which is previous in list Fl_Type *parent;
char new_selected; // browser highlight char new_selected; // browser highlight
char selected; // copied here by selection_changed() char selected; // copied here by selection_changed()
char open_; // state of triangle in browser char open_; // state of triangle in browser
char visible; // true if all parents are open char visible; // true if all parents are open
char rtti; // hack because I have no rtti, this is 0 for base class char rtti; // hack because I have no rtti, this is 0 for base class
int level; // number of parents over this int level; // number of parents over this
static Fl_Type *first, *last; // linked list of all objects static Fl_Type *first, *last;
Fl_Type *next, *prev; // linked list of all objects Fl_Type *next, *prev;
Fl_Type *factory; Fl_Type *factory;
const char *callback_name(); const char *callback_name();
@ -74,9 +81,12 @@ protected:
public: public:
virtual ~Fl_Type(); virtual ~Fl_Type();
virtual Fl_Type *make() = 0; virtual Fl_Type *make(Strategy strategy) = 0;
void add(Fl_Type *parent); // add as new child Fl_Window_Type *window();
Fl_Group_Type *group();
void add(Fl_Type *parent, Strategy strategy);
void insert(Fl_Type *n); // insert into list before n void insert(Fl_Type *n); // insert into list before n
Fl_Type* remove(); // remove from list Fl_Type* remove(); // remove from list
void move_before(Fl_Type*); // move before a sibling void move_before(Fl_Type*); // move before a sibling
@ -104,6 +114,8 @@ public:
virtual void remove_child(Fl_Type*) { } virtual void remove_child(Fl_Type*) { }
static Fl_Type *current; // most recently picked object static Fl_Type *current; // most recently picked object
static Fl_Type *current_dnd;
virtual void open(); // what happens when you double-click virtual void open(); // what happens when you double-click
// read and write data to a saved file: // read and write data to a saved file:

View File

@ -92,7 +92,12 @@ Fl_Widget_Type::ideal_spacing(int &x, int &y) {
x = y = 10; x = y = 10;
} }
Fl_Type *Fl_Widget_Type::make() { /**
Make a new Widget node.
\param[in] strategy is kAddAsLastChild or kAddAfterCurrent
\return new node
*/
Fl_Type *Fl_Widget_Type::make(Strategy strategy) {
// Find the current widget, or widget to copy: // Find the current widget, or widget to copy:
Fl_Type *qq = Fl_Type::current; Fl_Type *qq = Fl_Type::current;
while (qq && (!qq->is_widget() || qq->is_menu_item())) qq = qq->parent; while (qq && (!qq->is_widget() || qq->is_menu_item())) qq = qq->parent;
@ -162,7 +167,7 @@ Fl_Type *Fl_Widget_Type::make() {
// Put it in the parent: // Put it in the parent:
// ((Fl_Group *)(p->o))->add(t->o); (done by Fl_Type::add()) // ((Fl_Group *)(p->o))->add(t->o); (done by Fl_Type::add())
// add to browser: // add to browser:
t->add(p); t->add(p, strategy);
t->redraw(); t->redraw();
return t; return t;
} }
@ -1913,8 +1918,6 @@ void Fl_Widget_Type::open() {
if (numselected) the_panel->show(); if (numselected) the_panel->show();
} }
Fl_Type *Fl_Type::current;
extern void redraw_overlays(); extern void redraw_overlays();
extern void check_redraw_corresponding_parent(Fl_Type*); extern void check_redraw_corresponding_parent(Fl_Type*);
extern void redraw_browser(); extern void redraw_browser();
@ -2373,9 +2376,6 @@ void Fl_Widget_Type::write_widget_code() {
if (i & FL_ALIGN_INSIDE) write_c("|FL_ALIGN_INSIDE"); if (i & FL_ALIGN_INSIDE) write_c("|FL_ALIGN_INSIDE");
write_c("));\n"); write_c("));\n");
} }
// avoid the unsupported combination of flegs when user sets
// "when" to "FL_WHEN_NEVER", but keeps the "no change" set.
// FIXME: This could be reflected in the GUI by graying out the button.
Fl_When ww = o->when(); Fl_When ww = o->when();
if (ww==FL_WHEN_NOT_CHANGED) if (ww==FL_WHEN_NOT_CHANGED)
ww = FL_WHEN_NEVER; ww = FL_WHEN_NEVER;

View File

@ -73,7 +73,7 @@ public:
void setinactive(Fluid_Image *); void setinactive(Fluid_Image *);
Fl_Widget_Type(); Fl_Widget_Type();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
void open(); void open();
const char *extra_code(int n) const {return extra_code_[n];} const char *extra_code(int n) const {return extra_code_[n];}

View File

@ -27,6 +27,7 @@
#include "file.h" #include "file.h"
#include "code.h" #include "code.h"
#include "widget_panel.h" #include "widget_panel.h"
#include "factory.h"
#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/Fl_Overlay_Window.H> #include <FL/Fl_Overlay_Window.H>
@ -349,7 +350,12 @@ int Overlay_Window::handle(int e) {
return ret; return ret;
} }
Fl_Type *Fl_Window_Type::make() { /**
Make and add a new WIndow node.
\param[in] strategy is kAddAsLastChild or kAddAfterCurrent
\return new node
*/
Fl_Type *Fl_Window_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && !p->is_code_block()) p = p->parent; while (p && !p->is_code_block()) p = p->parent;
if (!p) { if (!p) {
@ -372,7 +378,7 @@ Fl_Type *Fl_Window_Type::make() {
Overlay_Window *w = new Overlay_Window(100,100); Overlay_Window *w = new Overlay_Window(100,100);
w->window = myo; w->window = myo;
myo->o = w; myo->o = w;
myo->add(p); myo->add(p, strategy);
myo->modal = 0; myo->modal = 0;
myo->non_modal = 0; myo->non_modal = 0;
return myo; return myo;
@ -1181,8 +1187,60 @@ int Fl_Window_Type::popupx = 0x7FFFFFFF; // mark as invalid (MAXINT)
int Fl_Window_Type::popupy = 0x7FFFFFFF; int Fl_Window_Type::popupy = 0x7FFFFFFF;
int Fl_Window_Type::handle(int event) { int Fl_Window_Type::handle(int event) {
static Fl_Type* selection; static Fl_Type* selection = NULL;
switch (event) { switch (event) {
case FL_DND_ENTER:
Fl::belowmouse(o);
case FL_DND_DRAG:
{
// find the innermost item clicked on:
selection = this;
for (Fl_Type* i=next; i && i->level>level; i=i->next)
if (i->is_group()) {
Fl_Widget_Type* myo = (Fl_Widget_Type*)i;
for (Fl_Widget *o1 = myo->o; o1; o1 = o1->parent())
if (!o1->visible()) goto CONTINUE_DND;
if (Fl::event_inside(myo->o)) {
selection = myo;
if (Fl::event_clicks()==1)
reveal_in_browser(myo);
}
}
CONTINUE_DND:
if (selection && !selection->selected) {
select_only(selection);
((Overlay_Window *)o)->redraw_overlay();
}
}
case FL_DND_RELEASE:
return 1;
case FL_PASTE:
{ Fl_Type *prototype = typename_to_prototype(Fl::event_text());
if (prototype==NULL)
return 0;
in_this_only = this;
popupx = Fl::event_x();
popupy = Fl::event_y();
// If the selected widget at dnd start and the drop target are the same,
// or in the same group, add after selection. Otherwise, just add
// at the end of the selected group.
if ( Fl_Type::current_dnd->group()
&& selection->group()
&& Fl_Type::current_dnd->group()==selection->group())
{
Fl_Type *cc = Fl_Type::current;
Fl_Type::current = Fl_Type::current_dnd;
add_new_widget_from_user(prototype, kAddAfterCurrent);
Fl_Type::current = cc;
} else {
add_new_widget_from_user(prototype, kAddAsLastChild);
}
popupx = 0x7FFFFFFF;
popupy = 0x7FFFFFFF; // mark as invalid (MAXINT)
in_this_only = NULL;
return 1;
}
case FL_PUSH: case FL_PUSH:
x1 = mx = Fl::event_x(); x1 = mx = Fl::event_x();
y1 = my = Fl::event_y(); y1 = my = Fl::event_y();
@ -1439,7 +1497,12 @@ int Fl_Window_Type::read_fdesign(const char* propname, const char* value) {
Fl_Widget_Class_Type Fl_Widget_Class_type; Fl_Widget_Class_Type Fl_Widget_Class_type;
Fl_Widget_Class_Type *current_widget_class = 0; Fl_Widget_Class_Type *current_widget_class = 0;
Fl_Type *Fl_Widget_Class_Type::make() { /**
Create and add a new Widget Class node.
\param[in] strategy add after current or as last child
\return new node
*/
Fl_Type *Fl_Widget_Class_Type::make(Strategy strategy) {
Fl_Type *p = Fl_Type::current; Fl_Type *p = Fl_Type::current;
while (p && (!p->is_decl_block() || (p->is_widget() && p->is_class()))) p = p->parent; while (p && (!p->is_decl_block() || (p->is_widget() && p->is_class()))) p = p->parent;
Fl_Widget_Class_Type *myo = new Fl_Widget_Class_Type(); Fl_Widget_Class_Type *myo = new Fl_Widget_Class_Type();
@ -1460,7 +1523,7 @@ Fl_Type *Fl_Widget_Class_Type::make() {
Overlay_Window *w = new Overlay_Window(100,100); Overlay_Window *w = new Overlay_Window(100,100);
w->window = myo; w->window = myo;
myo->o = w; myo->o = w;
myo->add(p); myo->add(p, strategy);
myo->modal = 0; myo->modal = 0;
myo->non_modal = 0; myo->non_modal = 0;
myo->wc_relative = 0; myo->wc_relative = 0;

View File

@ -68,7 +68,7 @@ public:
Fl_Window_Type() { drag = dx = dy = 0; sr_min_w = sr_min_h = sr_max_w = sr_max_h = 0; } Fl_Window_Type() { drag = dx = dy = 0; sr_min_w = sr_min_h = sr_max_w = sr_max_h = 0; }
uchar modal, non_modal; uchar modal, non_modal;
Fl_Type *make(); Fl_Type *make(Strategy strategy);
virtual const char *type_name() {return "Fl_Window";} virtual const char *type_name() {return "Fl_Window";}
virtual const char *alt_type_name() {return "fltk::Window";} virtual const char *alt_type_name() {return "fltk::Window";}
@ -116,7 +116,7 @@ public:
void write_code1(); void write_code1();
void write_code2(); void write_code2();
Fl_Type *make(); Fl_Type *make(Strategy strategy);
virtual const char *type_name() {return "widget_class";} virtual const char *type_name() {return "widget_class";}
int pixmapID() { return 48; } int pixmapID() { return 48; }
int is_parent() const {return 1;} int is_parent() const {return 1;}

View File

@ -26,6 +26,7 @@ CPPFILES = \
Fl_Widget_Type.cxx \ Fl_Widget_Type.cxx \
Fl_Window_Type.cxx \ Fl_Window_Type.cxx \
Fluid_Image.cxx \ Fluid_Image.cxx \
Shortcut_Button.cxx \
about_panel.cxx \ about_panel.cxx \
align_widget.cxx \ align_widget.cxx \
alignment_panel.cxx \ alignment_panel.cxx \

192
fluid/Shortcut_Button.cxx Normal file
View File

@ -0,0 +1,192 @@
//
// Widget type code for the Fast Light Tool Kit (FLTK).
//
// Copyright 1998-2021 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
//
/// \defgroup fl_type Basic Node for all Widgets and Functions
/// \{
/** \class Fl_Type
Each object described by Fluid is one of these objects. They
are all stored in a double-linked list.
The "type" of the object is covered by the virtual functions.
There will probably be a lot of these virtual functions.
The type browser is also a list of these objects, but they
are "factory" instances, not "real" ones. These objects exist
only so the "make" method can be called on them. They are
not in the linked list and are not written to files or
copied or otherwise examined.
*/
#include "Shortcut_Button.h"
#include "fluid.h"
#include "Fl_Window_Type.h"
#include "factory.h"
#include "widget_panel.h"
#include <FL/platform.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Window.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Menu_.H>
#include "../src/flstring.h"
/** \class Shortcut_Button
A button that allows the user to type a key combination to create shortcuts.
After clicked once, the button catches the following keyboard events and
records the pressed keys and all modifiers. It draws a text representation of
the shortcut. The backspace key deletes the current shortcut.
*/
/**
Draw the textual representation of the shortcut.
*/
void Shortcut_Button::draw() {
if (value()) draw_box(FL_DOWN_BOX, (Fl_Color)9);
else draw_box(FL_UP_BOX, FL_WHITE);
fl_font(FL_HELVETICA,14); fl_color(FL_FOREGROUND_COLOR);
if (use_FL_COMMAND && (svalue & (FL_CTRL|FL_META))) {
char buf[1024];
fl_snprintf(buf, 1023, "Command+%s", fl_shortcut_label(svalue&~(FL_CTRL|FL_META)));
fl_draw(buf,x()+6,y(),w(),h(),FL_ALIGN_LEFT);
} else {
fl_draw(fl_shortcut_label(svalue),x()+6,y(),w(),h(),FL_ALIGN_LEFT);
}
}
/**
Handle keystrokes to catch the user's shortcut.
*/
int Shortcut_Button::handle(int e) {
when(0); type(FL_TOGGLE_BUTTON);
if (e == FL_KEYBOARD) {
if (!value()) return 0;
int v = Fl::event_text()[0];
if ( (v > 32 && v < 0x7f) || (v > 0xa0 && v <= 0xff) ) {
if (isupper(v)) {
v = tolower(v);
v |= FL_SHIFT;
}
v = v | (Fl::event_state()&(FL_META|FL_ALT|FL_CTRL));
} else {
v = (Fl::event_state()&(FL_META|FL_ALT|FL_CTRL|FL_SHIFT)) | Fl::event_key();
if (v == FL_BackSpace && svalue) v = 0;
}
if (v != svalue) {svalue = v; set_changed(); redraw(); do_callback(); }
return 1;
} else if (e == FL_UNFOCUS) {
int c = changed(); value(0); if (c) set_changed();
return 1;
} else if (e == FL_FOCUS) {
return value();
} else {
int r = Fl_Button::handle(e);
if (e == FL_RELEASE && value() && Fl::focus() != this) take_focus();
return r;
}
}
/** \class Widget_Bin_Button
A button for the widget bin that allows the user to drag widgets into a window.
Dragging and dropping a new widget makes it easy for the user to position
a widget inside a window or group.
*/
/**
Convert mouse dragging into a drag and drop event.
*/
int Widget_Bin_Button::handle(int inEvent)
{
int ret = 0;
switch (inEvent) {
case FL_PUSH:
Fl_Button::handle(inEvent);
return 1; // make sure that we get drag events
case FL_DRAG:
ret = Fl_Button::handle(inEvent);
if (!user_data())
return ret;
if (!Fl::event_is_click()) { // make it a dnd event
// fake a drag outside of the widget
Fl::e_x = x()-1;
Fl_Button::handle(inEvent);
// fake a buttton release
Fl_Button::handle(FL_RELEASE);
// make it into a dnd event
const char *type_name = (const char*)user_data();
Fl_Type::current_dnd = Fl_Type::current;
Fl::copy(type_name, strlen(type_name)+1, 0);
Fl::dnd();
return 1;
}
return ret;
}
return Fl_Button::handle(inEvent);
}
/** \class Widget_Bin_Window_Button
This button is used by the widget bin to create new windows by drag'n'drop.
The new window will be created wherever the user drops it on the desktop.
*/
/**
Convert mouse dragging into a drag and drop event.
*/
int Widget_Bin_Window_Button::handle(int inEvent)
{
static Fl_Window *drag_win = NULL;
int ret = 0;
switch (inEvent) {
case FL_PUSH:
Fl_Button::handle(inEvent);
return 1; // make sure that we get drag events
case FL_DRAG:
ret = Fl_Button::handle(inEvent);
if (!user_data())
return ret;
if (!Fl::event_is_click()) {
if (!drag_win) {
drag_win = new Fl_Window(0, 0, 100, 100);
drag_win->border(0);
drag_win->set_non_modal();
}
if (drag_win) {
drag_win->position(Fl::event_x_root()+1, Fl::event_y_root()+1);
drag_win->show();
}
// Does not work outside window: fl_cursor(FL_CURSOR_HAND);
}
return ret;
case FL_RELEASE:
if (drag_win) {
Fl::delete_widget(drag_win);
drag_win = NULL;
// create a new window here
Fl_Type *prototype = typename_to_prototype((char*)user_data());
if (prototype) {
Fl_Type *new_type = add_new_widget_from_user(prototype, kAddAfterCurrent);
if (new_type && new_type->is_window()) {
Fl_Window_Type *new_window = (Fl_Window_Type*)new_type;
Fl_Window *w = (Fl_Window *)new_window->o;
w->position(Fl::event_x_root(), Fl::event_y_root());
}
}
}
return Fl_Button::handle(inEvent);
}
return Fl_Button::handle(inEvent);
}

View File

@ -28,5 +28,19 @@ public:
Fl_Button(X,Y,W,H,l) {svalue = 0;} Fl_Button(X,Y,W,H,l) {svalue = 0;}
}; };
class Widget_Bin_Button : public Fl_Button {
public:
int handle(int);
Widget_Bin_Button(int X,int Y,int W,int H, const char* l = 0) :
Fl_Button(X,Y,W,H,l) { }
};
class Widget_Bin_Window_Button : public Fl_Button {
public:
int handle(int);
Widget_Bin_Window_Button(int X,int Y,int W,int H, const char* l = 0) :
Fl_Button(X,Y,W,H,l) { }
};
#endif #endif

View File

@ -26,9 +26,11 @@
#include "fluid.h" #include "fluid.h"
#include "Fl_Window_Type.h" #include "Fl_Window_Type.h"
#include "pixmaps.h"
#include "undo.h" #include "undo.h"
#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Group.H> #include <FL/Fl_Group.H>
#include <FL/Fl_Menu_Item.H> #include <FL/Fl_Menu_Item.H>
#include <FL/Fl_Pixmap.H> #include <FL/Fl_Pixmap.H>
@ -36,8 +38,7 @@
#include "../src/flstring.h" #include "../src/flstring.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
extern Fl_Pixmap *pixmap[];
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -169,8 +170,6 @@ static Fl_Round_Button_Type Fl_Round_Button_type;
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
extern int batch_mode;
#include <FL/Fl_Browser.H> #include <FL/Fl_Browser.H>
#include <FL/Fl_Check_Browser.H> #include <FL/Fl_Check_Browser.H>
#include <FL/Fl_File_Browser.H> #include <FL/Fl_File_Browser.H>
@ -956,12 +955,106 @@ extern class Fl_Wizard_Type Fl_Wizard_type;
extern void select(Fl_Type *,int); extern void select(Fl_Type *,int);
extern void select_only(Fl_Type *); extern void select_only(Fl_Type *);
#include <FL/Fl_Window.H> /**
List all known types.
This is used to convert a type name into a pointer to the prototype.
This list may contain types that are supported in .fl files, but not
available in the *New* menu.
*/
static Fl_Type *known_types[] = {
// functions
(Fl_Type*)&Fl_Function_type,
(Fl_Type*)&Fl_Code_type,
(Fl_Type*)&Fl_CodeBlock_type,
(Fl_Type*)&Fl_Decl_type,
(Fl_Type*)&Fl_DeclBlock_type,
(Fl_Type*)&Fl_Class_type,
(Fl_Type*)&Fl_Widget_Class_type,
(Fl_Type*)&Fl_Comment_type,
(Fl_Type*)&Fl_Data_type,
// groups
(Fl_Type*)&Fl_Window_type,
(Fl_Type*)&Fl_Group_type,
(Fl_Type*)&Fl_Pack_type,
(Fl_Type*)&Fl_Tabs_type,
(Fl_Type*)&Fl_Scroll_type,
(Fl_Type*)&Fl_Tile_type,
(Fl_Type*)&Fl_Wizard_type,
// buttons
(Fl_Type*)&Fl_Button_type,
(Fl_Type*)&Fl_Return_Button_type,
(Fl_Type*)&Fl_Light_Button_type,
(Fl_Type*)&Fl_Check_Button_type,
(Fl_Type*)&Fl_Repeat_Button_type,
(Fl_Type*)&Fl_Round_Button_type,
// valuators
(Fl_Type*)&Fl_Slider_type,
(Fl_Type*)&Fl_Scrollbar_type,
(Fl_Type*)&Fl_Value_Slider_type,
(Fl_Type*)&Fl_Adjuster_type,
(Fl_Type*)&Fl_Counter_type,
(Fl_Type*)&Fl_Spinner_type,
(Fl_Type*)&Fl_Dial_type,
(Fl_Type*)&Fl_Roller_type,
(Fl_Type*)&Fl_Value_Input_type,
(Fl_Type*)&Fl_Value_Output_type,
// text
(Fl_Type*)&Fl_Input_type,
(Fl_Type*)&Fl_Output_type,
(Fl_Type*)&Fl_Text_Editor_type,
(Fl_Type*)&Fl_Text_Display_type,
(Fl_Type*)&Fl_File_Input_type,
(Fl_Type*)&Fl_Simple_Terminal_type,
// menus
(Fl_Type*)&Fl_Menu_Bar_type,
(Fl_Type*)&Fl_Menu_Button_type,
(Fl_Type*)&Fl_Choice_type,
(Fl_Type*)&Fl_Input_Choice_type,
(Fl_Type*)&Fl_Submenu_type,
(Fl_Type*)&Fl_Menu_Item_type,
(Fl_Type*)&Fl_Checkbox_Menu_Item_type,
(Fl_Type*)&Fl_Radio_Menu_Item_type,
// browsers
(Fl_Type*)&Fl_Browser_type,
(Fl_Type*)&Fl_Check_Browser_type,
(Fl_Type*)&Fl_File_Browser_type,
(Fl_Type*)&Fl_Tree_type,
(Fl_Type*)&Fl_Help_View_type,
(Fl_Type*)&Fl_Table_type,
// misc
(Fl_Type*)&Fl_Box_type,
(Fl_Type*)&Fl_Clock_type,
(Fl_Type*)&Fl_Progress_type,
};
static void cb(Fl_Widget *, void *v) { /**
Create and add a new widget to the widget tree.
Fluid will try to set a default postion for widgets to the user's expectation.
Using the context menu will put new widgets at the position of the mouse click.
Pulldown menu and bin actions will generate widgets no too far from previously
added widgets in the same group.
Widgets can be added by dragging them from the widget bin to the
desired location.
By setting the strategy, widgets are added as the last child of a group (this
is done when reading them from a file), or close to the current widget, which
the user would expect in interactive mode.
\param[in] inPrototype pointer to one of the FL_..._type prototype; note the
lower case 't' in type.
\param[in] strategy add after current or as last child
\see add_new_widget_from_file(const char*, int)
add_new_widget_from_user(Fl_Type*, int)
add_new_widget_from_user(const char*, int)
*/
Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy) {
undo_checkpoint(); undo_checkpoint();
undo_suspend(); undo_suspend();
Fl_Type *t = ((Fl_Type*)v)->make(); Fl_Type *ins = Fl_Type::current;
Fl_Type *t = ((Fl_Type*)inPrototype)->make(strategy);
if (t) { if (t) {
if (t->is_widget() && !t->is_window()) { if (t->is_widget() && !t->is_window()) {
Fl_Widget_Type *wt = (Fl_Widget_Type *)t; Fl_Widget_Type *wt = (Fl_Widget_Type *)t;
@ -994,6 +1087,23 @@ static void cb(Fl_Widget *, void *v) {
} }
} }
} }
#if 0
// Fluid inserts widgets always as the last child of a matching group.
// This is great when reading a file, but if users do thins interactively,
// they expect the new widget close to where they worked previously.
if (ins) {
// if the new and current widget are siblings, just move it here.
if (ins->level==t->level) {
Fl_Type *c;
for (c=t; c && c!=ins && c->level>=t->level; c=c->prev) { }
if (c==ins) {
t->move_before(ins); // together the same as 'move_after'
ins->move_before(t);
}
}
}
#endif
// make the new widget visible
select_only(t); select_only(t);
set_modflag(1); set_modflag(1);
t->open(); t->open();
@ -1002,6 +1112,36 @@ static void cb(Fl_Widget *, void *v) {
undo_last --; undo_last --;
} }
undo_resume(); undo_resume();
return t;
}
/**
Create and add a new widget to the widget tree.
\param[in] inName find the right prototype by this name
\param[in] strategy where to add the node
\return the newly created node
\see add_new_widget_from_file(const char*, int)
add_new_widget_from_user(Fl_Type*, int)
add_new_widget_from_user(const char*, int)
*/
Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy) {
Fl_Type *prototype = typename_to_prototype(inName);
if (prototype)
return add_new_widget_from_user(prototype, strategy);
else
return NULL;
}
/**
Callback for all menu items.
*/
static void cb(Fl_Widget *, void *v) {
Fl_Type *t = NULL;
if (Fl_Type::current && Fl_Type::current->is_group())
t = ((Fl_Type*)v)->make(kAddAsLastChild);
else
t = ((Fl_Type*)v)->make(kAddAfterCurrent);
select_only(t);
} }
Fl_Menu_Item New_Menu[] = { Fl_Menu_Item New_Menu[] = {
@ -1080,10 +1220,15 @@ Fl_Menu_Item New_Menu[] = {
#include <FL/Fl_Multi_Label.H> #include <FL/Fl_Multi_Label.H>
// Modify a menuitem to display an icon in front of the label. This is /**
// implemented using Fl_Multi_Label as the labeltype (FL_MULTI_LABEL). Modify a menuitem to display an icon in front of the label.
// The icon (ic) may be null. If ic is null only the text (txt) is assigned This is implemented using Fl_Multi_Label as the labeltype (FL_MULTI_LABEL).
// to the label - Fl_Multi_Label is not used. txt must not be null. The icon may be null. If ic is null only the text (is assigned
to the label and Fl_Multi_Label is not used.
\param[in] mi pointer to tme menu item that will be modified
\param[in] ic icon for the menu, may be NULL
\param[in] txt new label text, may *not* be NULL, will not be copied
*/
static void make_iconlabel(Fl_Menu_Item *mi, Fl_Image *ic, const char *txt) static void make_iconlabel(Fl_Menu_Item *mi, Fl_Image *ic, const char *txt)
{ {
if (ic) { if (ic) {
@ -1097,9 +1242,10 @@ static void make_iconlabel(Fl_Menu_Item *mi, Fl_Image *ic, const char *txt)
ml->typea = FL_IMAGE_LABEL; ml->typea = FL_IMAGE_LABEL;
ml->typeb = FL_NORMAL_LABEL; ml->typeb = FL_NORMAL_LABEL;
ml->label(mi); ml->label(mi);
} else {
if (txt != mi->text)
mi->label(txt);
} }
else if (txt != mi->text)
mi->label(txt);
} }
void fill_in_New_Menu() { void fill_in_New_Menu() {
@ -1119,25 +1265,48 @@ void fill_in_New_Menu() {
} }
} }
// use keyword to pick the type, this is used to parse files: /**
Fl_Type *Fl_Type_make(const char *tn) { Find the correct prototype for a given type name.
reading_file = 1; // makes labels be null \param[in] inName a C string that must match type_name() or alt_type_name() of
Fl_Type *r = 0; one of the known Fl_Type classes.
for (unsigned i = 0; i < sizeof(New_Menu)/sizeof(*New_Menu); i++) { \return the matching prototype or NULL
Fl_Menu_Item *m = New_Menu+i; */
if (!m->user_data()) continue; Fl_Type *typename_to_prototype(const char *inName)
Fl_Type *t = (Fl_Type*)(m->user_data()); {
if (!fl_ascii_strcasecmp(tn,t->type_name())) { if (inName==NULL || *inName==0)
r = t->make(); return NULL;
break; for (unsigned i = 0; i < sizeof(known_types)/sizeof(*known_types); i++) {
} Fl_Type *prototype = known_types[i];
if (!fl_ascii_strcasecmp(tn,t->alt_type_name())) { if (fl_ascii_strcasecmp(inName, prototype->type_name())==0)
r = t->make(); return prototype;
break; if (fl_ascii_strcasecmp(inName, prototype->alt_type_name())==0)
} return prototype;
} }
return NULL;
}
/**
Create and add a new type node to the widget tree.
This is used by the .fl file reader. New types are always created as
the last child of the first compatible parent. New widgets have a default
setup. Their position, sizem and label will be read next in the file.
\param[in] inName a C string that described the type we want
\param[in] strategy add after current or as last child
\return the type node that was created or NULL
\see add_new_widget_from_file(const char*, int)
add_new_widget_from_user(Fl_Type*, int)
add_new_widget_from_user(const char*, int)
*/
Fl_Type *add_new_widget_from_file(const char *inName, Strategy strategy) {
reading_file = 1; // makes labels be null
Fl_Type *prototype = typename_to_prototype(inName);
if (!prototype)
return NULL;
Fl_Type *new_node = prototype->make(strategy);
reading_file = 0; reading_file = 0;
return r; return new_node;
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -1269,8 +1438,6 @@ static symbol table[] = {
{"HOR_NICE_SLIDER", FL_HOR_NICE_SLIDER}, {"HOR_NICE_SLIDER", FL_HOR_NICE_SLIDER},
}; };
#include <stdlib.h>
int lookup_symbol(const char *name, int &v, int numberok) { int lookup_symbol(const char *name, int &v, int numberok) {
if (name[0]=='F' && name[1]=='L' && name[2]=='_') name += 3; if (name[0]=='F' && name[1]=='L' && name[2]=='_') name += 3;
for (int i=0; i < int(sizeof(table)/sizeof(*table)); i++) for (int i=0; i < int(sizeof(table)/sizeof(*table)); i++)

View File

@ -17,13 +17,18 @@
#ifndef _FLUID_FACTORY_H #ifndef _FLUID_FACTORY_H
#define _FLUID_FACTORY_H #define _FLUID_FACTORY_H
#include "Fl_Type.h"
struct Fl_Menu_Item; struct Fl_Menu_Item;
class Fl_Type;
extern Fl_Menu_Item New_Menu[]; extern Fl_Menu_Item New_Menu[];
void fill_in_New_Menu(); void fill_in_New_Menu();
Fl_Type *Fl_Type_make(const char *tn); Fl_Type *typename_to_prototype(const char *inName);
Fl_Type *add_new_widget_from_file(const char *inName, Strategy strategy);
Fl_Type *add_new_widget_from_user(Fl_Type *inPrototype, Strategy strategy);
Fl_Type *add_new_widget_from_user(const char *inName, Strategy strategy);
#endif // _FLUID_FACTORY_H #endif // _FLUID_FACTORY_H

View File

@ -45,7 +45,8 @@
/// \{ /// \{
// This file contains code to read and write .fl file. // This file contains code to read and write .fl file.
// TODO: there is a name confusion with routines that write to the C and Header files which must be fixed. // TODO: there is a name confusion with routines that write to the C and Header
// TODO: files vs. thos the write to th fl file which should be fixed.
static FILE *fout; static FILE *fout;
static FILE *fin; static FILE *fin;
@ -434,10 +435,11 @@ int write_file(const char *filename, int selected_only) {
\param[in] p parent node or NULL \param[in] p parent node or NULL
\param[in] paste if set, merge into existing design, else replace design \param[in] paste if set, merge into existing design, else replace design
\param[in] options_read this is set if the options were already found in \param[in] strategy add nodes after current or as last child
a previous call \param[in] skip_options this is set if the options were already found in
a previous call, and there is no need to waste time searchingg for them.
*/ */
static void read_children(Fl_Type *p, int paste, char options_read=0) { static void read_children(Fl_Type *p, int paste, Strategy strategy, char skip_options=0) {
Fl_Type::current = p; Fl_Type::current = p;
for (;;) { for (;;) {
const char *c = read_word(); const char *c = read_word();
@ -453,7 +455,7 @@ static void read_children(Fl_Type *p, int paste, char options_read=0) {
} }
// Make sure that we don;t go through the list of options for child nodes // Make sure that we don;t go through the list of options for child nodes
if (!options_read) { if (!skip_options) {
// this is the first word in a .fd file: // this is the first word in a .fd file:
if (!strcmp(c,"Magic:")) { if (!strcmp(c,"Magic:")) {
read_fdesign(); read_fdesign();
@ -470,7 +472,7 @@ static void read_children(Fl_Type *p, int paste, char options_read=0) {
// back compatibility with Vincent Penne's original class code: // back compatibility with Vincent Penne's original class code:
if (!p && !strcmp(c,"define_in_struct")) { if (!p && !strcmp(c,"define_in_struct")) {
Fl_Type *t = Fl_Type_make("class"); Fl_Type *t = add_new_widget_from_file("class", kAddAsLastChild);
t->name(read_word()); t->name(read_word());
Fl_Type::current = p = t; Fl_Type::current = p = t;
paste = 1; // stops "missing }" error paste = 1; // stops "missing }" error
@ -560,15 +562,15 @@ static void read_children(Fl_Type *p, int paste, char options_read=0) {
} }
} }
{ {
Fl_Type *t = Fl_Type_make(c); Fl_Type *t = add_new_widget_from_file(c, strategy);
if (!t) { if (!t) {
read_error("Unknown word \"%s\"", c); read_error("Unknown word \"%s\"", c);
continue; continue;
} }
t->name(read_word());
// After reading the first widget, we no longer need to look for options // After reading the first widget, we no longer need to look for options
options_read = 1; skip_options = 1;
t->name(read_word());
c = read_word(1); c = read_word(1);
if (strcmp(c,"{") && t->is_class()) { // <prefix> <name> if (strcmp(c,"{") && t->is_class()) { // <prefix> <name>
@ -595,7 +597,7 @@ static void read_children(Fl_Type *p, int paste, char options_read=0) {
read_error("Missing child list for %s\n",t->title()); read_error("Missing child list for %s\n",t->title());
goto REUSE_C; goto REUSE_C;
} }
read_children(t, 0, options_read); read_children(t, 0, strategy, skip_options);
} }
Fl_Type::current = p; Fl_Type::current = p;
@ -608,9 +610,11 @@ static void read_children(Fl_Type *p, int paste, char options_read=0) {
Read a .fl design file. Read a .fl design file.
\param[in] filename read this file \param[in] filename read this file
\param[in] merge if this is set, merge the file into an existing design \param[in] merge if this is set, merge the file into an existing design
at Fl_Type::current
\param[in] strategy add new nodes after current or as last child
\return 0 if the operation failed, 1 if it succeeded \return 0 if the operation failed, 1 if it succeeded
*/ */
int read_file(const char *filename, int merge) { int read_file(const char *filename, int merge, Strategy strategy) {
Fl_Type *o; Fl_Type *o;
read_version = 0.0; read_version = 0.0;
if (!open_read(filename)) if (!open_read(filename))
@ -619,7 +623,7 @@ int read_file(const char *filename, int merge) {
deselect(); deselect();
else else
delete_all(); delete_all();
read_children(Fl_Type::current, merge); read_children(Fl_Type::current, merge, strategy);
Fl_Type::current = 0; Fl_Type::current = 0;
// Force menu items to be rebuilt... // Force menu items to be rebuilt...
for (o = Fl_Type::first; o; o = o->next) for (o = Fl_Type::first; o; o = o->next)
@ -720,7 +724,7 @@ void read_fdesign() {
Fl_Widget_Type *group = 0; Fl_Widget_Type *group = 0;
Fl_Widget_Type *widget = 0; Fl_Widget_Type *widget = 0;
if (!Fl_Type::current) { if (!Fl_Type::current) {
Fl_Type *t = Fl_Type_make("Function"); Fl_Type *t = add_new_widget_from_file("Function", kAddAsLastChild);
t->name("create_the_forms()"); t->name("create_the_forms()");
Fl_Type::current = t; Fl_Type::current = t;
} }
@ -731,7 +735,7 @@ void read_fdesign() {
if (!strcmp(name,"Name")) { if (!strcmp(name,"Name")) {
window = (Fl_Widget_Type*)Fl_Type_make("Fl_Window"); window = (Fl_Widget_Type*)add_new_widget_from_file("Fl_Window", kAddAsLastChild);
window->name(value); window->name(value);
window->label(value); window->label(value);
Fl_Type::current = widget = window; Fl_Type::current = widget = window;
@ -739,7 +743,7 @@ void read_fdesign() {
} else if (!strcmp(name,"class")) { } else if (!strcmp(name,"class")) {
if (!strcmp(value,"FL_BEGIN_GROUP")) { if (!strcmp(value,"FL_BEGIN_GROUP")) {
group = widget = (Fl_Widget_Type*)Fl_Type_make("Fl_Group"); group = widget = (Fl_Widget_Type*)add_new_widget_from_file("Fl_Group", kAddAsLastChild);
Fl_Type::current = group; Fl_Type::current = group;
} else if (!strcmp(value,"FL_END_GROUP")) { } else if (!strcmp(value,"FL_END_GROUP")) {
if (group) { if (group) {
@ -754,10 +758,10 @@ void read_fdesign() {
for (int i = 0; class_matcher[i]; i += 2) for (int i = 0; class_matcher[i]; i += 2)
if (!strcmp(value,class_matcher[i])) { if (!strcmp(value,class_matcher[i])) {
value = class_matcher[i+1]; break;} value = class_matcher[i+1]; break;}
widget = (Fl_Widget_Type*)Fl_Type_make(value); widget = (Fl_Widget_Type*)add_new_widget_from_file(value, kAddAsLastChild);
if (!widget) { if (!widget) {
printf("class %s not found, using Fl_Button\n", value); printf("class %s not found, using Fl_Button\n", value);
widget = (Fl_Widget_Type*)Fl_Type_make("Fl_Button"); widget = (Fl_Widget_Type*)add_new_widget_from_file("Fl_Button", kAddAsLastChild);
} }
} }

View File

@ -17,6 +17,8 @@
#ifndef _FLUID_FILE_H #ifndef _FLUID_FILE_H
#define _FLUID_FILE_H #define _FLUID_FILE_H
#include "Fl_Type.h"
#include <FL/fl_attr.h> #include <FL/fl_attr.h>
extern double read_version; extern double read_version;
@ -34,7 +36,7 @@ const char *read_word(int wantbrace = 0);
int write_file(const char *, int selected_only = 0); int write_file(const char *, int selected_only = 0);
int read_file(const char *, int merge); int read_file(const char *, int merge, Strategy strategy=kAddAsLastChild);
void read_fdesign(); void read_fdesign();
#endif // _FLUID_FILE_H #endif // _FLUID_FILE_H

View File

@ -99,7 +99,9 @@ int G_debug = 0;
char G_external_editor_command[512]; char G_external_editor_command[512];
/// \todo Functionality unclear. /// If set, if the `current` node is a group, and a new group is added, it will
/// be added as sibling to the first group instead of inside the group.
/// \todo Needs to be verified.
int force_parent = 0; int force_parent = 0;
/// This is set to create different labels when creating new widgets. /// This is set to create different labels when creating new widgets.
@ -197,10 +199,10 @@ const char* i18n_set = "";
/// \todo document me /// \todo document me
char i18n_program[FL_PATH_MAX] = ""; char i18n_program[FL_PATH_MAX] = "";
/// \todo document me /// Offset in pixels when adding widgets from an .fl file.
int pasteoffset = 0; int pasteoffset = 0;
/// \todo document me /// Paste offset incrementing at every paste command.
static int ipasteoffset = 0; static int ipasteoffset = 0;
@ -999,11 +1001,16 @@ void delete_cb(Fl_Widget *, void *) {
void paste_cb(Fl_Widget*, void*) { void paste_cb(Fl_Widget*, void*) {
//if (ipasteoffset) force_parent = 1; //if (ipasteoffset) force_parent = 1;
pasteoffset = ipasteoffset; pasteoffset = ipasteoffset;
// TODO: make the paste offset more predictable, if any at all.
// TODO: Don't use the grid if the user switched it off.
if (gridx>1) pasteoffset = ((pasteoffset-1)/gridx+1)*gridx; if (gridx>1) pasteoffset = ((pasteoffset-1)/gridx+1)*gridx;
if (gridy>1) pasteoffset = ((pasteoffset-1)/gridy+1)*gridy; if (gridy>1) pasteoffset = ((pasteoffset-1)/gridy+1)*gridy;
undo_checkpoint(); undo_checkpoint();
undo_suspend(); undo_suspend();
if (!read_file(cutfname(), 1)) { Strategy strategy = kAddAfterCurrent;
if (Fl_Type::current && Fl_Type::current->is_group())
strategy = kAddAsLastChild;
if (!read_file(cutfname(), 1, strategy)) {
fl_message("Can't read %s: %s", cutfname(), strerror(errno)); fl_message("Can't read %s: %s", cutfname(), strerror(errno));
} }
undo_resume(); undo_resume();
@ -1031,7 +1038,7 @@ void duplicate_cb(Fl_Widget*, void*) {
undo_checkpoint(); undo_checkpoint();
undo_suspend(); undo_suspend();
if (!read_file(cutfname(1), 1)) { if (!read_file(cutfname(1), 1, kAddAfterCurrent)) {
fl_message("Can't read %s: %s", cutfname(1), strerror(errno)); fl_message("Can't read %s: %s", cutfname(1), strerror(errno));
} }
fl_unlink(cutfname(1)); fl_unlink(cutfname(1));

View File

@ -18,6 +18,7 @@
#include "function_panel.h" #include "function_panel.h"
#include "fluid.h" #include "fluid.h"
#include "Shortcut_Button.h"
#include "pixmaps.h" #include "pixmaps.h"
#include "factory.h" #include "factory.h"
#include "Fl_Type.h" #include "Fl_Type.h"
@ -704,16 +705,11 @@ Fl_Double_Window* make_comment_panel() {
} }
void type_make_cb(Fl_Widget*,void*d) { void type_make_cb(Fl_Widget*,void*d) {
undo_checkpoint(); const char *type_name = (const char*)d;
Fl_Type *t = Fl_Type_make((char*)d); if (Fl_Type::current && Fl_Type::current->is_group())
if (t) { add_new_widget_from_user(type_name, kAddAsLastChild);
select_only(t); else
set_modflag(1); add_new_widget_from_user(type_name, kAddAfterCurrent);
t->open();
} else {
undo_current --;
undo_last --;
}
} }
Fl_Window *widgetbin_panel=(Fl_Window *)0; Fl_Window *widgetbin_panel=(Fl_Window *)0;
@ -789,306 +785,674 @@ Fl_Window* make_widgetbin() {
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(87, 19, 79, 79, "Groups"); { Fl_Group* o = new Fl_Group(87, 19, 79, 79, "Groups");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(89, 21, 24, 24); { Widget_Bin_Window_Button* o = new Widget_Bin_Window_Button(89, 21, 24, 24);
o->tooltip("Window"); o->tooltip("Window");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Window")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Window"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[1]); o->image(pixmap[1]);
} // Fl_Button* o } // Widget_Bin_Window_Button* o
{ Fl_Button* o = new Fl_Button(114, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(114, 21, 24, 24);
o->tooltip("Group"); o->tooltip("Group");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Group")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Group"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[6]); o->image(pixmap[6]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(139, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(139, 21, 24, 24);
o->tooltip("Pack"); o->tooltip("Pack");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Pack")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Pack"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[22]); o->image(pixmap[22]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(89, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(89, 46, 24, 24);
o->tooltip("Tabs"); o->tooltip("Tabs");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tabs")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tabs"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[13]); o->image(pixmap[13]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(114, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(114, 46, 24, 24);
o->tooltip("Scroll"); o->tooltip("Scroll");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scroll")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scroll"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[19]); o->image(pixmap[19]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(89, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(89, 71, 24, 24);
o->tooltip("Tile"); o->tooltip("Tile");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tile")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tile"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[20]); o->image(pixmap[20]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(114, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(114, 71, 24, 24);
o->tooltip("Wizard"); o->tooltip("Wizard");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Wizard")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Wizard"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[21]); o->image(pixmap[21]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(171, 19, 54, 79, "Buttons"); { Fl_Group* o = new Fl_Group(171, 19, 54, 79, "Buttons");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(173, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(173, 21, 24, 24);
o->tooltip("Button"); o->tooltip("Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[2]); o->image(pixmap[2]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(198, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(198, 21, 24, 24);
o->tooltip("Return Button"); o->tooltip("Return Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Return_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Return_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[23]); o->image(pixmap[23]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(173, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(173, 46, 24, 24);
o->tooltip("Light Button"); o->tooltip("Light Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Light_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Light_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[24]); o->image(pixmap[24]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(198, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(198, 46, 24, 24);
o->tooltip("Repeat Button"); o->tooltip("Repeat Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Repeat_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Repeat_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[25]); o->image(pixmap[25]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(173, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(173, 71, 24, 24);
o->tooltip("Check Button"); o->tooltip("Check Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[3]); o->image(pixmap[3]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(198, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(198, 71, 24, 24);
o->tooltip("Round Button"); o->tooltip("Round Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Round_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Round_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[4]); o->image(pixmap[4]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(230, 19, 104, 79, "Valuators"); { Fl_Group* o = new Fl_Group(230, 19, 104, 79, "Valuators");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(232, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(232, 21, 24, 24);
o->tooltip("Slider"); o->tooltip("Slider");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Slider")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Slider"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[37]); o->image(pixmap[37]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(257, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(257, 21, 24, 24);
o->tooltip("Scroll Bar"); o->tooltip("Scroll Bar");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scrollbar")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Scrollbar"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[38]); o->image(pixmap[38]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(282, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(282, 21, 24, 24);
o->tooltip("Value Slider"); o->tooltip("Value Slider");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Slider")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Slider"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[39]); o->image(pixmap[39]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(307, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(307, 21, 24, 24);
o->tooltip("Value Output"); o->tooltip("Value Output");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Output")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Output"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[45]); o->image(pixmap[45]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(232, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(232, 46, 24, 24);
o->tooltip("Adjuster"); o->tooltip("Adjuster");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Adjuster")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Adjuster"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[40]); o->image(pixmap[40]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(257, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(257, 46, 24, 24);
o->tooltip("Counter"); o->tooltip("Counter");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Counter")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Counter"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[41]); o->image(pixmap[41]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(282, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(282, 46, 24, 24);
o->tooltip("Dial"); o->tooltip("Dial");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Dial")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Dial"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[42]); o->image(pixmap[42]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(232, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(232, 71, 24, 24);
o->tooltip("Roller"); o->tooltip("Roller");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Roller")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Roller"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[43]); o->image(pixmap[43]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(257, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(257, 71, 24, 24);
o->tooltip("Spinner"); o->tooltip("Spinner");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Spinner")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Spinner"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[47]); o->image(pixmap[47]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(282, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(282, 71, 24, 24);
o->tooltip("Value Input"); o->tooltip("Value Input");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Input")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Value_Input"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[44]); o->image(pixmap[44]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(339, 19, 54, 79, "Text"); { Fl_Group* o = new Fl_Group(339, 19, 54, 79, "Text");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(341, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(341, 21, 24, 24);
o->tooltip("Input"); o->tooltip("Input");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[14]); o->image(pixmap[14]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(366, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(366, 21, 24, 24);
o->tooltip("Output"); o->tooltip("Output");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Output")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Output"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[27]); o->image(pixmap[27]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(341, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(341, 46, 24, 24);
o->tooltip("Text Edit"); o->tooltip("Text Edit");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Editor")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Editor"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[29]); o->image(pixmap[29]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(366, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(366, 46, 24, 24);
o->tooltip("Text Display"); o->tooltip("Text Display");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Display")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Text_Display"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[28]); o->image(pixmap[28]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(341, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(341, 71, 24, 24);
o->tooltip("File Input"); o->tooltip("File Input");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Input")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Input"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[30]); o->image(pixmap[30]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(366, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(366, 71, 24, 24);
o->tooltip("Simple Terminal"); o->tooltip("Simple Terminal");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Simple_Terminal")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Simple_Terminal"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[52]); o->image(pixmap[52]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(398, 19, 79, 79, "Menus"); { Fl_Group* o = new Fl_Group(398, 19, 79, 79, "Menus");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(400, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(400, 21, 24, 24);
o->tooltip("Input Choice"); o->tooltip("Input Choice");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input_Choice")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Input_Choice"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[53]); o->image(pixmap[53]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(425, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(425, 21, 24, 24);
o->tooltip("Menu Item"); o->tooltip("Menu Item");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("menuitem")); o->callback((Fl_Callback*)type_make_cb, (void*)("menuitem"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[16]); o->image(pixmap[16]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(450, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(450, 21, 24, 24);
o->tooltip("Menu Bar"); o->tooltip("Menu Bar");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Bar")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Bar"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[17]); o->image(pixmap[17]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(400, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(400, 46, 24, 24);
o->tooltip("Menu Button"); o->tooltip("Menu Button");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Button")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Menu_Button"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[26]); o->image(pixmap[26]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(425, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(425, 46, 24, 24);
o->tooltip("Checkbox Menu Item"); o->tooltip("Checkbox Menu Item");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("checkmenuitem")); o->callback((Fl_Callback*)type_make_cb, (void*)("checkmenuitem"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[54]); o->image(pixmap[54]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(450, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(450, 46, 24, 24);
o->tooltip("Sub Menu"); o->tooltip("Sub Menu");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("submenu")); o->callback((Fl_Callback*)type_make_cb, (void*)("submenu"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[18]); o->image(pixmap[18]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(400, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(400, 71, 24, 24);
o->tooltip("Choice"); o->tooltip("Choice");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Choice")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Choice"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[15]); o->image(pixmap[15]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(425, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(425, 71, 24, 24);
o->tooltip("Radio Menu Item"); o->tooltip("Radio Menu Item");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("radiomenuitem")); o->callback((Fl_Callback*)type_make_cb, (void*)("radiomenuitem"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[55]); o->image(pixmap[55]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(482, 19, 54, 79, "Browsers"); { Fl_Group* o = new Fl_Group(482, 19, 54, 79, "Browsers");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(484, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(484, 21, 24, 24);
o->tooltip("Browser"); o->tooltip("Browser");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Browser")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Browser"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[31]); o->image(pixmap[31]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(509, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(509, 21, 24, 24);
o->tooltip("Tree"); o->tooltip("Tree");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tree")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Tree"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[50]); o->image(pixmap[50]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(484, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(484, 46, 24, 24);
o->tooltip("Check Browser"); o->tooltip("Check Browser");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Browser")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Check_Browser"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[32]); o->image(pixmap[32]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(509, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(509, 46, 24, 24);
o->tooltip("Help Browser"); o->tooltip("Help Browser");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Help_View")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Help_View"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[35]); o->image(pixmap[35]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(484, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(484, 71, 24, 24);
o->tooltip("File Browser"); o->tooltip("File Browser");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Browser")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_File_Browser"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[33]); o->image(pixmap[33]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(509, 71, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(509, 71, 24, 24);
o->tooltip("Table"); o->tooltip("Table");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Table")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Table"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[51]); o->image(pixmap[51]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
{ Fl_Group* o = new Fl_Group(540, 19, 55, 79, "Misc"); { Fl_Group* o = new Fl_Group(540, 19, 55, 79, "Misc");
o->labelsize(12); o->labelsize(12);
{ Fl_Button* o = new Fl_Button(542, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(542, 21, 24, 24);
o->tooltip("Box"); o->tooltip("Box");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Box")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Box"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[5]); o->image(pixmap[5]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(567, 21, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(567, 21, 24, 24);
o->tooltip("Clock"); o->tooltip("Clock");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Clock")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Clock"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[34]); o->image(pixmap[34]);
} // Fl_Button* o } // Widget_Bin_Button* o
{ Fl_Button* o = new Fl_Button(542, 46, 24, 24); { Widget_Bin_Button* o = new Widget_Bin_Button(542, 46, 24, 24);
o->tooltip("Progress"); o->tooltip("Progress");
o->box(FL_THIN_UP_BOX); o->box(FL_THIN_UP_BOX);
o->color(FL_BACKGROUND_COLOR);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelsize(14);
o->labelcolor(FL_FOREGROUND_COLOR);
o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Progress")); o->callback((Fl_Callback*)type_make_cb, (void*)("Fl_Progress"));
o->align(Fl_Align(FL_ALIGN_CENTER));
o->when(FL_WHEN_RELEASE);
o->image(pixmap[36]); o->image(pixmap[36]);
} // Fl_Button* o } // Widget_Bin_Button* o
o->end(); o->end();
} // Fl_Group* o } // Fl_Group* o
widgetbin_panel->set_non_modal(); widgetbin_panel->set_non_modal();

View File

@ -25,6 +25,9 @@ comment {//
decl {\#include "fluid.h"} {private local decl {\#include "fluid.h"} {private local
} }
decl {\#include "Shortcut_Button.h"} {private global
}
decl {\#include "pixmaps.h"} {private local decl {\#include "pixmaps.h"} {private local
} }
@ -84,7 +87,7 @@ Function {make_function_panel()} {open
} }
MenuItem {} { MenuItem {} {
label global label global
user_data 1 user_data_type long selected user_data 1 user_data_type long
xywh {15 15 100 20} labelsize 11 xywh {15 15 100 20} labelsize 11
} }
} }
@ -522,18 +525,10 @@ Function {make_comment_panel()} {} {
} }
} }
Function {type_make_cb(Fl_Widget*,void*d)} {return_type void Function {type_make_cb(Fl_Widget*,void*d)} {open return_type void
} { } {
code {undo_checkpoint(); code {const char *type_name = (const char*)d;
Fl_Type *t = Fl_Type_make((char*)d); add_new_widget_from_user(type_name);} {}
if (t) {
select_only(t);
set_modflag(1);
t->open();
} else {
undo_current --;
undo_last --;
}} {}
} }
Function {make_widgetbin()} {open Function {make_widgetbin()} {open
@ -543,7 +538,7 @@ Function {make_widgetbin()} {open
callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape) callback {if (Fl::event()==FL_SHORTCUT && Fl::event_key()==FL_Escape)
exit_cb((Fl_Widget*)o, v); exit_cb((Fl_Widget*)o, v);
else else
toggle_widgetbin_cb((Fl_Widget*)o, v);} toggle_widgetbin_cb((Fl_Widget*)o, v);} open
xywh {449 206 600 102} type Single align 80 non_modal visible xywh {449 206 600 102} type Single align 80 non_modal visible
} { } {
Fl_Group {} { Fl_Group {} {
@ -611,45 +606,52 @@ else
} { } {
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Window"} user_data {"Fl_Window"}
callback type_make_cb callback type_make_cb selected
tooltip Window xywh {89 21 24 24} box THIN_UP_BOX tooltip Window xywh {89 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[1]);} code0 {o->image(pixmap[1]);}
class Widget_Bin_Window_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Group"} user_data {"Fl_Group"}
callback type_make_cb callback type_make_cb
tooltip Group xywh {114 21 24 24} box THIN_UP_BOX tooltip Group xywh {114 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[6]);} code0 {o->image(pixmap[6]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Pack"} user_data {"Fl_Pack"}
callback type_make_cb callback type_make_cb
tooltip Pack xywh {139 21 24 24} box THIN_UP_BOX tooltip Pack xywh {139 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[22]);} code0 {o->image(pixmap[22]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Tabs"} user_data {"Fl_Tabs"}
callback type_make_cb callback type_make_cb
tooltip Tabs xywh {89 46 24 24} box THIN_UP_BOX tooltip Tabs xywh {89 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[13]);} code0 {o->image(pixmap[13]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Scroll"} user_data {"Fl_Scroll"}
callback type_make_cb callback type_make_cb
tooltip Scroll xywh {114 46 24 24} box THIN_UP_BOX tooltip Scroll xywh {114 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[19]);} code0 {o->image(pixmap[19]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Tile"} user_data {"Fl_Tile"}
callback type_make_cb callback type_make_cb
tooltip Tile xywh {89 71 24 24} box THIN_UP_BOX tooltip Tile xywh {89 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[20]);} code0 {o->image(pixmap[20]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Wizard"} user_data {"Fl_Wizard"}
callback type_make_cb callback type_make_cb
tooltip Wizard xywh {114 71 24 24} box THIN_UP_BOX tooltip Wizard xywh {114 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[21]);} code0 {o->image(pixmap[21]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -661,36 +663,42 @@ else
callback type_make_cb callback type_make_cb
tooltip Button xywh {173 21 24 24} box THIN_UP_BOX tooltip Button xywh {173 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[2]);} code0 {o->image(pixmap[2]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Return_Button"} user_data {"Fl_Return_Button"}
callback type_make_cb callback type_make_cb
tooltip {Return Button} xywh {198 21 24 24} box THIN_UP_BOX tooltip {Return Button} xywh {198 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[23]);} code0 {o->image(pixmap[23]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Light_Button"} user_data {"Fl_Light_Button"}
callback type_make_cb callback type_make_cb
tooltip {Light Button} xywh {173 46 24 24} box THIN_UP_BOX tooltip {Light Button} xywh {173 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[24]);} code0 {o->image(pixmap[24]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Repeat_Button"} user_data {"Fl_Repeat_Button"}
callback type_make_cb callback type_make_cb
tooltip {Repeat Button} xywh {198 46 24 24} box THIN_UP_BOX tooltip {Repeat Button} xywh {198 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[25]);} code0 {o->image(pixmap[25]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Check_Button"} user_data {"Fl_Check_Button"}
callback type_make_cb callback type_make_cb
tooltip {Check Button} xywh {173 71 24 24} box THIN_UP_BOX tooltip {Check Button} xywh {173 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[3]);} code0 {o->image(pixmap[3]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Round_Button"} user_data {"Fl_Round_Button"}
callback type_make_cb callback type_make_cb
tooltip {Round Button} xywh {198 71 24 24} box THIN_UP_BOX tooltip {Round Button} xywh {198 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[4]);} code0 {o->image(pixmap[4]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -702,60 +710,70 @@ else
callback type_make_cb callback type_make_cb
tooltip Slider xywh {232 21 24 24} box THIN_UP_BOX tooltip Slider xywh {232 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[37]);} code0 {o->image(pixmap[37]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Scrollbar"} user_data {"Fl_Scrollbar"}
callback type_make_cb callback type_make_cb
tooltip {Scroll Bar} xywh {257 21 24 24} box THIN_UP_BOX tooltip {Scroll Bar} xywh {257 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[38]);} code0 {o->image(pixmap[38]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Value_Slider"} user_data {"Fl_Value_Slider"}
callback type_make_cb callback type_make_cb
tooltip {Value Slider} xywh {282 21 24 24} box THIN_UP_BOX tooltip {Value Slider} xywh {282 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[39]);} code0 {o->image(pixmap[39]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Value_Output"} user_data {"Fl_Value_Output"}
callback type_make_cb callback type_make_cb
tooltip {Value Output} xywh {307 21 24 24} box THIN_UP_BOX tooltip {Value Output} xywh {307 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[45]);} code0 {o->image(pixmap[45]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Adjuster"} user_data {"Fl_Adjuster"}
callback type_make_cb callback type_make_cb
tooltip Adjuster xywh {232 46 24 24} box THIN_UP_BOX tooltip Adjuster xywh {232 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[40]);} code0 {o->image(pixmap[40]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Counter"} user_data {"Fl_Counter"}
callback type_make_cb callback type_make_cb
tooltip Counter xywh {257 46 24 24} box THIN_UP_BOX tooltip Counter xywh {257 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[41]);} code0 {o->image(pixmap[41]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Dial"} user_data {"Fl_Dial"}
callback type_make_cb callback type_make_cb
tooltip Dial xywh {282 46 24 24} box THIN_UP_BOX tooltip Dial xywh {282 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[42]);} code0 {o->image(pixmap[42]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Roller"} user_data {"Fl_Roller"}
callback type_make_cb callback type_make_cb
tooltip Roller xywh {232 71 24 24} box THIN_UP_BOX tooltip Roller xywh {232 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[43]);} code0 {o->image(pixmap[43]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Spinner"} user_data {"Fl_Spinner"}
callback type_make_cb callback type_make_cb
tooltip Spinner xywh {257 71 24 24} box THIN_UP_BOX tooltip Spinner xywh {257 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[47]);} code0 {o->image(pixmap[47]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Value_Input"} user_data {"Fl_Value_Input"}
callback type_make_cb callback type_make_cb
tooltip {Value Input} xywh {282 71 24 24} box THIN_UP_BOX tooltip {Value Input} xywh {282 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[44]);} code0 {o->image(pixmap[44]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -767,36 +785,42 @@ else
callback type_make_cb callback type_make_cb
tooltip Input xywh {341 21 24 24} box THIN_UP_BOX tooltip Input xywh {341 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[14]);} code0 {o->image(pixmap[14]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Output"} user_data {"Fl_Output"}
callback type_make_cb callback type_make_cb
tooltip Output xywh {366 21 24 24} box THIN_UP_BOX tooltip Output xywh {366 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[27]);} code0 {o->image(pixmap[27]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Text_Editor"} user_data {"Fl_Text_Editor"}
callback type_make_cb callback type_make_cb
tooltip {Text Edit} xywh {341 46 24 24} box THIN_UP_BOX tooltip {Text Edit} xywh {341 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[29]);} code0 {o->image(pixmap[29]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Text_Display"} user_data {"Fl_Text_Display"}
callback type_make_cb callback type_make_cb
tooltip {Text Display} xywh {366 46 24 24} box THIN_UP_BOX tooltip {Text Display} xywh {366 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[28]);} code0 {o->image(pixmap[28]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_File_Input"} user_data {"Fl_File_Input"}
callback type_make_cb callback type_make_cb
tooltip {File Input} xywh {341 71 24 24} box THIN_UP_BOX tooltip {File Input} xywh {341 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[30]);} code0 {o->image(pixmap[30]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Simple_Terminal"} user_data {"Fl_Simple_Terminal"}
callback type_make_cb callback type_make_cb
tooltip {Simple Terminal} xywh {366 71 24 24} box THIN_UP_BOX tooltip {Simple Terminal} xywh {366 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[52]);} code0 {o->image(pixmap[52]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -808,48 +832,56 @@ else
callback type_make_cb callback type_make_cb
tooltip {Input Choice} xywh {400 21 24 24} box THIN_UP_BOX tooltip {Input Choice} xywh {400 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[53]);} code0 {o->image(pixmap[53]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"menuitem"} user_data {"menuitem"}
callback type_make_cb callback type_make_cb
tooltip {Menu Item} xywh {425 21 24 24} box THIN_UP_BOX tooltip {Menu Item} xywh {425 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[16]);} code0 {o->image(pixmap[16]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Menu_Bar"} user_data {"Fl_Menu_Bar"}
callback type_make_cb callback type_make_cb
tooltip {Menu Bar} xywh {450 21 24 24} box THIN_UP_BOX tooltip {Menu Bar} xywh {450 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[17]);} code0 {o->image(pixmap[17]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Menu_Button"} user_data {"Fl_Menu_Button"}
callback type_make_cb callback type_make_cb
tooltip {Menu Button} xywh {400 46 24 24} box THIN_UP_BOX tooltip {Menu Button} xywh {400 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[26]);} code0 {o->image(pixmap[26]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"checkmenuitem"} user_data {"checkmenuitem"}
callback type_make_cb callback type_make_cb
tooltip {Checkbox Menu Item} xywh {425 46 24 24} box THIN_UP_BOX tooltip {Checkbox Menu Item} xywh {425 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[54]);} code0 {o->image(pixmap[54]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"submenu"} user_data {"submenu"}
callback type_make_cb callback type_make_cb
tooltip {Sub Menu} xywh {450 46 24 24} box THIN_UP_BOX tooltip {Sub Menu} xywh {450 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[18]);} code0 {o->image(pixmap[18]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Choice"} user_data {"Fl_Choice"}
callback type_make_cb callback type_make_cb
tooltip Choice xywh {400 71 24 24} box THIN_UP_BOX tooltip Choice xywh {400 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[15]);} code0 {o->image(pixmap[15]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"radiomenuitem"} user_data {"radiomenuitem"}
callback type_make_cb callback type_make_cb
tooltip {Radio Menu Item} xywh {425 71 24 24} box THIN_UP_BOX tooltip {Radio Menu Item} xywh {425 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[55]);} code0 {o->image(pixmap[55]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -861,36 +893,42 @@ else
callback type_make_cb callback type_make_cb
tooltip Browser xywh {484 21 24 24} box THIN_UP_BOX tooltip Browser xywh {484 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[31]);} code0 {o->image(pixmap[31]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Tree"} user_data {"Fl_Tree"}
callback type_make_cb callback type_make_cb
tooltip Tree xywh {509 21 24 24} box THIN_UP_BOX tooltip Tree xywh {509 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[50]);} code0 {o->image(pixmap[50]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Check_Browser"} user_data {"Fl_Check_Browser"}
callback type_make_cb callback type_make_cb
tooltip {Check Browser} xywh {484 46 24 24} box THIN_UP_BOX tooltip {Check Browser} xywh {484 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[32]);} code0 {o->image(pixmap[32]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Help_View"} user_data {"Fl_Help_View"}
callback type_make_cb callback type_make_cb
tooltip {Help Browser} xywh {509 46 24 24} box THIN_UP_BOX tooltip {Help Browser} xywh {509 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[35]);} code0 {o->image(pixmap[35]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_File_Browser"} user_data {"Fl_File_Browser"}
callback type_make_cb callback type_make_cb
tooltip {File Browser} xywh {484 71 24 24} box THIN_UP_BOX tooltip {File Browser} xywh {484 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[33]);} code0 {o->image(pixmap[33]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Table"} user_data {"Fl_Table"}
callback type_make_cb callback type_make_cb
tooltip Table xywh {509 71 24 24} box THIN_UP_BOX tooltip Table xywh {509 71 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[51]);} code0 {o->image(pixmap[51]);}
class Widget_Bin_Button
} }
} }
Fl_Group {} { Fl_Group {} {
@ -902,18 +940,21 @@ else
callback type_make_cb callback type_make_cb
tooltip Box xywh {542 21 24 24} box THIN_UP_BOX tooltip Box xywh {542 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[5]);} code0 {o->image(pixmap[5]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Clock"} user_data {"Fl_Clock"}
callback type_make_cb callback type_make_cb
tooltip Clock xywh {567 21 24 24} box THIN_UP_BOX tooltip Clock xywh {567 21 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[34]);} code0 {o->image(pixmap[34]);}
class Widget_Bin_Button
} }
Fl_Button {} { Fl_Button {} {
user_data {"Fl_Progress"} user_data {"Fl_Progress"}
callback type_make_cb callback type_make_cb
tooltip Progress xywh {542 46 24 24} box THIN_UP_BOX tooltip Progress xywh {542 46 24 24} box THIN_UP_BOX
code0 {o->image(pixmap[36]);} code0 {o->image(pixmap[36]);}
class Widget_Bin_Button
} }
} }
} }

View File

@ -19,6 +19,7 @@
#include "fluid.h" #include "fluid.h"
#include "file.h" #include "file.h"
#include "Fl_Type.h" #include "Fl_Type.h"
#include "widget_browser.h"
#include <FL/Fl.H> #include <FL/Fl.H>
#include <FL/Fl_Preferences.H> #include <FL/Fl_Preferences.H>
@ -107,11 +108,19 @@ void undo_cb(Fl_Widget *, void *) {
} }
undo_suspend(); undo_suspend();
// Undo first deletes all widgets which resets the widget_tree browser.
// Save the current scroll position, so we don;t scroll back to 0 at undo.
int x = widget_browser->hposition();
int y = widget_browser->position();
if (!read_file(undo_filename(undo_current - 1), 0)) { if (!read_file(undo_filename(undo_current - 1), 0)) {
// Unable to read checkpoint file, don't undo... // Unable to read checkpoint file, don't undo...
undo_resume(); undo_resume();
return; return;
} }
// Restore old browser position.
// Ideally, we would save the browser position insied the undo file.
widget_browser->hposition(x);
widget_browser->position(y);
undo_current --; undo_current --;