summaryrefslogtreecommitdiff
path: root/fluid
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2005-07-08 14:12:00 +0000
committerMatthias Melcher <fltk@matthiasm.com>2005-07-08 14:12:00 +0000
commit8461a157e489601bdc2e0f83812708315c6dedc5 (patch)
tree340a4610dcdb48c89df93ac67730ec330538e34c /fluid
parent9ac6934696fa366ec3f475549750efdd3c3a7154 (diff)
Added the first implementation of "live mode" to Fluid. This is incomplete and mostly untested, but it seems to be a great help to figure out the darned wonderful resize behavior. I apologize for typos, no time to compile on Linux. Please feed back.
More details in the developers mailing list. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4407 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'fluid')
-rw-r--r--fluid/Fl_Group_Type.cxx43
-rw-r--r--fluid/Fl_Type.cxx22
-rw-r--r--fluid/Fl_Type.h20
-rw-r--r--fluid/Fl_Widget_Type.cxx158
-rw-r--r--fluid/Fl_Window_Type.cxx29
-rw-r--r--fluid/widget_panel.cxx19
-rw-r--r--fluid/widget_panel.fl19
-rw-r--r--fluid/widget_panel.h2
8 files changed, 288 insertions, 24 deletions
diff --git a/fluid/Fl_Group_Type.cxx b/fluid/Fl_Group_Type.cxx
index 6fa0945e0..d68a96b8b 100644
--- a/fluid/Fl_Group_Type.cxx
+++ b/fluid/Fl_Group_Type.cxx
@@ -220,6 +220,49 @@ void Fl_Group_Type::move_child(Fl_Type* cc, Fl_Type* before) {
}
////////////////////////////////////////////////////////////////
+// live mode support
+
+Fl_Widget *Fl_Group_Type::enter_live_mode(int top) {
+ Fl_Group *grp = new Fl_Group(o->x(), o->y(), o->w(), o->h());
+ live_widget = grp;
+ if (live_widget) {
+ copy_properties();
+ Fl_Type *n;
+ for (n = next; n && n->level > level; n = n->next) {
+ if (n->level == level+1)
+ n->enter_live_mode();
+ }
+ grp->end();
+ }
+ return live_widget;
+}
+
+Fl_Widget *Fl_Tabs_Type::enter_live_mode(int top) {
+ Fl_Tabs *grp = new Fl_Tabs(o->x(), o->y(), o->w(), o->h());
+ live_widget = grp;
+ if (live_widget) {
+ copy_properties();
+ Fl_Type *n;
+ for (n = next; n && n->level > level; n = n->next) {
+ if (n->level == level+1)
+ n->enter_live_mode();
+ }
+ grp->end();
+ }
+ return live_widget;
+}
+
+void Fl_Group_Type::leave_live_mode() {
+}
+
+/**
+ * copy all properties from the edit widget to the live widget
+ */
+void Fl_Group_Type::copy_properties() {
+ Fl_Widget_Type::copy_properties();
+}
+
+////////////////////////////////////////////////////////////////
// some other group subclasses that fluid does not treat specially:
#include <FL/Fl_Scroll.H>
diff --git a/fluid/Fl_Type.cxx b/fluid/Fl_Type.cxx
index 9b768c1d8..fb6db86eb 100644
--- a/fluid/Fl_Type.cxx
+++ b/fluid/Fl_Type.cxx
@@ -827,6 +827,28 @@ void Fl_Type::read_property(const char *c) {
int Fl_Type::read_fdesign(const char*, const char*) {return 0;}
+/**
+ * Build widgets and dataset needed in live mode.
+ * \return a widget pointer that the live mode initiator can 'show()'
+ * \see leave_live_mode()
+ */
+Fl_Widget *Fl_Type::enter_live_mode(int top) {
+ return 0L;
+}
+
+/**
+ * Release all resources created when enetring live mode.
+ * \see enter_live_mode()
+ */
+void Fl_Type::leave_live_mode() {
+}
+
+/**
+ * Copy all needed properties for this tye into the live object.
+ */
+void Fl_Type::copy_properties() {
+}
+
//
// End of "$Id$".
//
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index c34d34439..b26e713fd 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -115,6 +115,11 @@ public:
virtual void write_code1(); // code and .h before children
virtual void write_code2(); // code and .h after children
+ // live mode
+ virtual Fl_Widget *enter_live_mode(int top=0); // build wdgets needed for live mode
+ virtual void leave_live_mode(); // free allocated resources
+ virtual void copy_properties(); // copy properties from this type into a potetial live object
+
// get message number for I18N
int msgnum();
@@ -284,6 +289,7 @@ protected:
void write_block_close();
void write_code2();
void write_color(const char*, Fl_Color);
+ Fl_Widget *live_widget;
public:
static int default_size;
@@ -326,6 +332,10 @@ public:
virtual void read_property(const char *);
virtual int read_fdesign(const char*, const char*);
+ virtual Fl_Widget *enter_live_mode(int top=0);
+ virtual void leave_live_mode();
+ virtual void copy_properties();
+
virtual void ideal_size(int &w, int &h);
virtual void ideal_spacing(int &x, int &y);
@@ -373,6 +383,10 @@ public:
int is_parent() const {return 1;}
int is_group() const {return 1;}
int pixmapID() { return 6; }
+
+ virtual Fl_Widget *enter_live_mode(int top=0);
+ virtual void leave_live_mode();
+ virtual void copy_properties();
};
extern const char pack_type_name[];
@@ -384,6 +398,7 @@ public:
virtual const char *type_name() {return pack_type_name;}
Fl_Widget_Type *_make() {return new Fl_Pack_Type();}
int pixmapID() { return 22; }
+ void copy_properties();
};
extern const char tabs_type_name[];
@@ -403,6 +418,7 @@ public:
void add_child(Fl_Type*, Fl_Type*);
void remove_child(Fl_Type*);
int pixmapID() { return 13; }
+ Fl_Widget *enter_live_mode(int top=0);
};
extern const char scroll_type_name[];
@@ -488,6 +504,10 @@ public:
int is_parent() const {return 1;}
int is_group() const {return 1;}
int is_window() const {return 1;}
+
+ Fl_Widget *enter_live_mode(int top=0);
+ void leave_live_mode();
+ void copy_properties();
};
class Fl_Widget_Class_Type : private Fl_Window_Type {
diff --git a/fluid/Fl_Widget_Type.cxx b/fluid/Fl_Widget_Type.cxx
index 4c32a5a97..0b9ec37df 100644
--- a/fluid/Fl_Widget_Type.cxx
+++ b/fluid/Fl_Widget_Type.cxx
@@ -1357,12 +1357,12 @@ void step_cb(Fl_Value_Input* i, void* v) {
double n = i->value();
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->is_valuator()) {
- ((Fl_Valuator*)(q->o))->step(n);
- q->o->redraw();
- mod = 1;
- }
+ Fl_Widget_Type* q = (Fl_Widget_Type*)o;
+ if (q->is_valuator()) {
+ ((Fl_Valuator*)(q->o))->step(n);
+ q->o->redraw();
+ mod = 1;
+ }
}
}
if (mod) set_modflag(1);
@@ -1424,12 +1424,12 @@ void subtype_cb(Fl_Choice* i, void* v) {
Fl_Menu_Item* m = current_widget->subtypes();
for (Fl_Type *o = Fl_Type::first; o; o = o->next) {
if (o->selected && o->is_widget()) {
- Fl_Widget_Type* q = (Fl_Widget_Type*)o;
- if (q->subtypes()==m) {
- q->o->type(n);
- q->redraw();
- mod = 1;
- }
+ Fl_Widget_Type* q = (Fl_Widget_Type*)o;
+ if (q->subtypes()==m) {
+ q->o->type(n);
+ q->redraw();
+ mod = 1;
+ }
}
}
if (mod) set_modflag(1);
@@ -1483,6 +1483,59 @@ void overlay_cb(Fl_Button*o,void *v) {
toggle_overlays(o,v);
}
+void leave_live_mode_cb(Fl_Widget*, void*);
+
+void live_mode_cb(Fl_Button*o,void *v) {
+ /// \todo live mode should end gracefully when the application quits
+ /// or when the user closes the live widget
+ static Fl_Type *live_type = 0L;
+ static Fl_Widget *live_widget = 0L;
+ static Fl_Window *live_window = 0L;
+ // if 'o' is 0, we must quit live mode
+ if (!o) {
+ o = wLiveMode;
+ o->value(0);
+ }
+ if (o->value()) {
+ if (numselected == 1) {
+ live_widget = current_widget->enter_live_mode(1);
+ if (live_widget) {
+ live_type = current_widget;
+ Fl_Group::current(0);
+ int w = live_widget->w();
+ int h = live_widget->h();
+ live_window = new Fl_Window(w+20, h+55, "Fluid Live Mode Widget");
+ live_window->box(FL_FLAT_BOX);
+ live_window->color(FL_GREEN);
+ Fl_Group *rsz = new Fl_Group(0, h+20, 130, 35);
+ rsz->box(FL_NO_BOX);
+ Fl_Box *rsz_dummy = new Fl_Box(110, h+20, 1, 25);
+ rsz_dummy->box(FL_NO_BOX);
+ rsz->resizable(rsz_dummy);
+ Fl_Button *btn = new Fl_Button(10, h+20, 100, 25, "Exit Live Mode");
+ btn->labelsize(12);
+ btn->callback(leave_live_mode_cb);
+ live_widget->position(10, 10);
+ live_window->add(live_widget);
+ live_window->resizable(live_widget);
+ live_window->set_modal(); // block all other UI
+ live_window->callback(leave_live_mode_cb);
+ live_window->show();
+ } else o->value(0);
+ } else o->value(0);
+ } else {
+ if (live_type)
+ live_type->leave_live_mode();
+ if (live_window) {
+ live_window->hide();
+ Fl::delete_widget(live_window);
+ }
+ live_type = 0L;
+ live_widget = 0L;
+ live_window = 0L;
+ }
+}
+
// update the panel according to current widget set:
static void load_panel() {
if (!the_panel) return;
@@ -2238,6 +2291,87 @@ int Fl_Widget_Type::read_fdesign(const char* propname, const char* value) {
return 1;
}
+static void leave_live_mode_cb(Fl_Widget*, void*) {
+ live_mode_cb(0, 0);
+}
+
+Fl_Widget *Fl_Widget_Type::enter_live_mode(int top) {
+ live_widget = widget(o->x(), o->y(), o->w(), o->h());
+ if (live_widget)
+ copy_properties();
+ return live_widget;
+}
+
+void Fl_Widget_Type::leave_live_mode() {
+}
+
+/**
+ * copy all properties from the edit widget to the live widget
+ */
+void Fl_Widget_Type::copy_properties() {
+ if (!live_widget)
+ return;
+
+ Fl_Widget *w = live_widget;
+ w->label(o->label());
+ w->tooltip(o->tooltip());
+ w->type(o->type());
+ w->box(o->box());
+/* move this into the derived _type classes
+ if (is_button()) {
+ Fl_Button* d = (Fl_Button*)live_widget, *s = (Fl_Button*)o;
+ d->down_box(s->down_box());
+ d->shortcut(s->shortcut());
+ d->value(s->value());
+ } else if (!strcmp(type_name(), "Fl_Input_Choice")) {
+ Fl_Input_Choice* d = (Fl_Input_Choice*)live_widget, *s = (Fl_Input_Choice*)o;
+ d->down_box(s->down_box());
+ } else if (is_menu_button()) {
+ Fl_Menu_* d = (Fl_Menu_*)live_widget, *s = (Fl_Menu_*)o;
+ d->down_box(s->down_box());
+ }
+*/
+ w->color(o->color());
+ w->selection_color(o->selection_color());
+ w->labeltype(o->labeltype());
+ w->labelfont(o->labelfont());
+ w->labelsize(o->labelsize());
+ w->labelcolor(o->labelcolor());
+ w->align(o->align());
+/* move this into the derived _type classes
+ if (is_valuator()) {
+ Fl_Valuator* d = (Fl_Valuator*)live_widget, *s = (Fl_Valuator*)o;
+ d->minimum(s->minimum());
+ d->maximum(s->maximum());
+ d->step(s->step());
+ d->value(s->value());
+ //if (is_valuator()==2) {
+ // double x = ((Fl_Slider*)v)->slider_size();
+ // double y = ((Fl_Slider*)f)->slider_size();
+ // if (x != y) write_string("slider_size %g", x);
+ //}
+ }
+/* move this into the derived _type classes
+ {Fl_Font ff; int fs; Fl_Color fc; if (textstuff(4,ff,fs,fc)) {
+ Fl_Font f; int s; Fl_Color c; textstuff(0,f,s,c);
+ if (f != ff) write_string("textfont %d", f);
+ if (s != fs) write_string("textsize %d", s);
+ if (c != fc) write_string("textcolor %d", c);
+ }}*/
+ /// hmmm: if (!o->visible()) write_string("hide");
+ if (!o->active())
+ w->deactivate();
+ if (resizable() && w->parent())
+ w->parent()->resizable(o);
+}
+
+void Fl_Pack_Type::copy_properties()
+{
+ Fl_Group_Type::copy_properties();
+ Fl_Pack *d = (Fl_Pack*)live_widget, *s =(Fl_Pack*)o;
+ d->spacing(s->spacing());
+}
+
//
// End of "$Id$".
//
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index 45546cb4c..7b6e89f20 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -1388,6 +1388,35 @@ void Fl_Widget_Class_Type::write_code2() {
write_c("}\n");
}
+////////////////////////////////////////////////////////////////
+// live mode support
+
+Fl_Widget *Fl_Window_Type::enter_live_mode(int top) {
+ Fl_Window *win = new Fl_Window(o->x(), o->y(), o->w(), o->h());
+ live_widget = win;
+ if (live_widget) {
+ copy_properties();
+ Fl_Type *n;
+ for (n = next; n && n->level > level; n = n->next) {
+ if (n->level == level+1)
+ n->enter_live_mode();
+ }
+ win->end();
+ }
+ return live_widget;
+}
+
+void Fl_Window_Type::leave_live_mode() {
+}
+
+/**
+ * copy all properties from the edit widget to the live widget
+ */
+void Fl_Window_Type::copy_properties() {
+ Fl_Widget_Type::copy_properties();
+ /// \todo copy resizing constraints over
+}
+
//
// End of "$Id$".
diff --git a/fluid/widget_panel.cxx b/fluid/widget_panel.cxx
index 0c2f0b406..7c3efdb33 100644
--- a/fluid/widget_panel.cxx
+++ b/fluid/widget_panel.cxx
@@ -43,18 +43,20 @@ Fl_Value_Input *widget_h_input=(Fl_Value_Input *)0;
Fl_Input *v_input[4]={(Fl_Input *)0};
+Fl_Button *wLiveMode=(Fl_Button *)0;
+
Fl_Double_Window* make_widget_panel() {
Fl_Double_Window* w;
{ Fl_Double_Window* o = new Fl_Double_Window(410, 355);
w = o;
o->labelsize(11);
w->hotspot(o);
- { Fl_Tabs* o = new Fl_Tabs(5, 5, 400, 310);
+ { Fl_Tabs* o = new Fl_Tabs(3, 5, 402, 310);
o->selection_color((Fl_Color)4);
o->labelsize(11);
o->callback((Fl_Callback*)cb_);
o->when(FL_WHEN_NEVER);
- { Fl_Group* o = new Fl_Group(5, 25, 400, 290, "GUI");
+ { Fl_Group* o = new Fl_Group(3, 25, 402, 290, "GUI");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -385,7 +387,7 @@ Fl_Double_Window* make_widget_panel() {
o->end();
Fl_Group::current()->resizable(o);
}
- { Fl_Group* o = new Fl_Group(5, 25, 400, 290, "Style");
+ { Fl_Group* o = new Fl_Group(3, 25, 402, 290, "Style");
o->labelsize(11);
o->callback((Fl_Callback*)propagate_load);
o->when(FL_WHEN_NEVER);
@@ -655,7 +657,7 @@ Fl_Double_Window* make_widget_panel() {
o->end();
Fl_Group::current()->resizable(o);
}
- { Fl_Group* o = new Fl_Group(8, 321, 391, 19);
+ { Fl_Group* o = new Fl_Group(8, 321, 391, 24);
o->labelsize(11);
{ Fl_Box* o = new Fl_Box(8, 325, 20, 20);
o->labelsize(11);
@@ -667,7 +669,7 @@ Fl_Double_Window* make_widget_panel() {
o->labelcolor((Fl_Color)1);
o->callback((Fl_Callback*)overlay_cb);
}
- { Fl_Button* o = new Fl_Button(159, 325, 80, 20, "Revert");
+ { Fl_Button* o = new Fl_Button(80, 325, 80, 20, "Revert");
o->labelsize(11);
o->callback((Fl_Callback*)revert_cb);
o->hide();
@@ -681,6 +683,13 @@ Fl_Double_Window* make_widget_panel() {
o->callback((Fl_Callback*)cancel_cb);
o->hide();
}
+ { Fl_Button* o = wLiveMode = new Fl_Button(145, 325, 84, 20, "LIve &Mode");
+ o->tooltip("Hide the widget overlay box.");
+ o->type(1);
+ o->labelsize(11);
+ o->labelcolor(FL_FOREGROUND_COLOR);
+ o->callback((Fl_Callback*)live_mode_cb);
+ }
o->end();
}
o->size_range(o->w(), o->h());
diff --git a/fluid/widget_panel.fl b/fluid/widget_panel.fl
index 46286de48..0c70171b5 100644
--- a/fluid/widget_panel.fl
+++ b/fluid/widget_panel.fl
@@ -28,7 +28,7 @@ comment {//
//
// http://www.fltk.org/str.php
//
-} {selected in_source in_header
+} {in_source in_header
}
Function {make_widget_panel()} {open
@@ -39,12 +39,12 @@ Function {make_widget_panel()} {open
} {
Fl_Tabs {} {
callback {propagate_load((Fl_Group *)o,v);} open
- xywh {5 5 400 310} selection_color 4 labelsize 11 when 0 resizable
+ xywh {3 5 402 310} selection_color 4 labelsize 11 when 0 resizable
} {
Fl_Group {} {
label GUI
callback propagate_load
- xywh {5 25 400 290} labelsize 11 when 0 resizable
+ xywh {3 25 402 290} labelsize 11 when 0 resizable
} {
Fl_Group {} {
callback propagate_load
@@ -290,7 +290,7 @@ Function {make_widget_panel()} {open
Fl_Group {} {
label Style
callback propagate_load
- xywh {5 25 400 290} labelsize 11 when 0 hide
+ xywh {3 25 402 290} labelsize 11 when 0 hide
} {
Fl_Group {} {
callback propagate_load
@@ -489,8 +489,8 @@ Function {make_widget_panel()} {open
}
}
}
- Fl_Group {} {
- xywh {8 321 391 19} labelsize 11
+ Fl_Group {} {selected
+ xywh {8 321 391 24} labelsize 11
} {
Fl_Box {} {
xywh {8 325 20 20} labelsize 11 resizable
@@ -503,7 +503,7 @@ Function {make_widget_panel()} {open
Fl_Button {} {
label Revert
callback revert_cb
- xywh {159 325 80 20} labelsize 11 hide
+ xywh {80 325 80 20} labelsize 11 hide
}
Fl_Return_Button {} {
label Close
@@ -515,6 +515,11 @@ Function {make_widget_panel()} {open
callback cancel_cb
xywh {329 325 70 20} labelsize 11 hide
}
+ Fl_Button wLiveMode {
+ label {LIve &Mode}
+ callback live_mode_cb
+ tooltip {Hide the widget overlay box.} xywh {145 325 84 20} type Toggle labelsize 11 labelcolor 0
+ }
}
}
}
diff --git a/fluid/widget_panel.h b/fluid/widget_panel.h
index 57b2dc473..55e4524a5 100644
--- a/fluid/widget_panel.h
+++ b/fluid/widget_panel.h
@@ -102,6 +102,8 @@ extern void revert_cb(Fl_Button*, void*);
#include <FL/Fl_Return_Button.H>
extern void ok_cb(Fl_Return_Button*, void*);
extern void cancel_cb(Fl_Button*, void*);
+extern void live_mode_cb(Fl_Button*, void*);
+extern Fl_Button *wLiveMode;
Fl_Double_Window* make_widget_panel();
#endif