| [ Return to Bugs & Features | Post Text | Post File | Prev | Next ]
STR #2494
Application: | FLTK Library |
Status: | 5 - New |
Priority: | 1 - Request for Enhancement, e.g. asking for a feature |
Scope: | 3 - Applies to all machines and operating systems |
Subsystem: | FLUID |
Summary: | Patch that adds some macros to the extra code lines |
Version: | 1.4-feature |
Created By: | mingodad |
Assigned To: | Unassigned |
Fix Version: | Unassigned |
Update Notification: | |
Trouble Report Files:
[ Post File ]
Trouble Report Comments:
[ Post Text ]
|
#1 | mingodad 11:27 Dec 21, 2010 |
| This patch adds simple macro capability to the extra code lines in fluid:
=db_vat_rates.@class.user_data = @name;
If an extra code line starts with "=" then the "=" will be removed and any occurrence of "@name" will be replaced by the widget name entered and every occurrence of "@class" will be replaced by the classname (default or user entered).
Supposing the above line on an "Fl_Input" with a name of "age" will be converted to:
db_vat_rates.Fl_Input.user_data = age; | |
|
#2 | mingodad 03:13 Dec 22, 2010 |
| This second version of simple macros for fluid also include the memory leaks patch from a previous STR.
This version adds a $(dirty_name) macro that is the supplied widget name without any cleanup, the resulting name used on code generation have all "@" replaced by "_" except the first one if it is at position 0 (see bellow) in this case it's removed.
And a new code generation option when the widget name starts with "@", with this option instead of fluid generate code to create a new widget it instead generate code to reuse an already existing widget (probably existing on a base class or created elsewhere).
This option allow to have more than one Skin/Layout to the same widgets, we create a class with all widgets that are necessary to show/edit a set of fields with the code to mange load/validation/save/..., and we create on fluid one or more dialogs/widget classes derived from this class, lets suppose one for big monitors, another for pdas, another for touch screens, ...
example code with and without this option:
--------- //widget name = @dbf_id //extra line = =o->user_data((void*)"$(dirty_name)"); { Fl_Output* o = dbf_id; Fl_Group::current->add(dbf_id); dbf_id->resize(15, 240, 82, 26); dbf_id->label(_tr("ID")); dbf_id->labelsize(16); dbf_id->textsize(16); dbf_id->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->user_data((void*)"@dbf@id"); } // Fl_Output* dbf_id
--------- --------- //widget name = dbf_id //extra line = =o->user_data((void*)"$(dirty_name)"); { Fl_Output* o = dbf_id = new Fl_Output(15, 240, 82, 26, _tr("ID")); dbf_id->labelsize(16); dbf_id->textsize(16); dbf_id->align(Fl_Align(FL_ALIGN_TOP_LEFT)); o->user_data((void*)"dbf@id"); } // Fl_Output* dbf_id --------- | |
|
#3 | mingodad 08:14 Dec 22, 2010 |
| Here there is some code corrections and a simple project as example.
For this to work with stack/auto widgets we need a new flag: Fl_Widget.H -> ON_GROUP_ONLY_REMOVE = 1<<25, ///< Fl_Group should only remove this widget without apply free on it
And a modification to Fl_Group.cxx on method Fl_Group::clear() ---- while (children_) { // delete all children int idx = children_-1; // last child's index Fl_Widget* w = child(idx); // last child widget if (w->parent()==this) { // should always be true if (children_>2) { // optimized removal w->parent_ = 0; // reset child's parent children_--; // update counter } else { // slow removal remove(idx); } if(!w->flags() & ON_GROUP_ONLY_REMOVE) delete w; // delete the child } else { // should never happen remove(idx); // remove it anyway } } ----
This modifications are invisible to existing applications but if we want touse automatic/stack widgets with dynamic allocated Windows/Groups then we need to set this flag on our automatic/stack widgets to prevent double free (one on the dynamig window/group release and another by the compiler at the end of the local scope).
Also to use automatic/stack variables on fluid we need to inform it when supplying widget names:
widget name : age //an widget that fluid will generate code to create it widget name : @age //a pointer to a widget that fluid will reuse widget name : @&age //an automatic/stack widget that fluid will reuse
On the example attached I use automatic/stack widgets, to ease of use I derived then, using a macro, where I have a constructor that don't need any arguments and sets the flag ON_GROUP_ONLY_REMOVE.
On the dialog created on fluid I have an automatic/stack instance of AddressEdit (wich supply most of the widgets used) and reuse it's widgets with fluid. | |
|
#5 | matt 05:29 Dec 25, 2010 |
| We have to check if this is of general use and which parts of it to implement. | |
[ Return to Bugs & Features | Post Text | Post File ]
|
| |