summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fluid/Fl_Type.h5
-rw-r--r--fluid/Fl_Window_Type.cxx159
2 files changed, 92 insertions, 72 deletions
diff --git a/fluid/Fl_Type.h b/fluid/Fl_Type.h
index 70b6b1043..ca3df08b1 100644
--- a/fluid/Fl_Type.h
+++ b/fluid/Fl_Type.h
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Type.h,v 1.5.2.4 1999/08/05 09:01:25 bill Exp $"
+// "$Id: Fl_Type.h,v 1.5.2.5 1999/09/10 16:40:17 bill Exp $"
//
// Widget type header file for the Fast Light Tool Kit (FLTK).
//
@@ -365,6 +365,7 @@ class Fl_Window_Type : public Fl_Widget_Type {
Fl_Widget_Type *_make() {return 0;} // we don't call this
Fl_Widget *widget(int,int,int,int) {return 0;}
int recalc; // set by fix_overlay()
+ void moveallchildren();
public:
@@ -527,5 +528,5 @@ int storestring(const char *n, const char * & p, int nostrip=0);
extern int include_H_from_C;
//
-// End of "$Id: Fl_Type.h,v 1.5.2.4 1999/08/05 09:01:25 bill Exp $".
+// End of "$Id: Fl_Type.h,v 1.5.2.5 1999/09/10 16:40:17 bill Exp $".
//
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index 4e34dfc2b..5c6ed9d2c 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -1,5 +1,5 @@
//
-// "$Id: Fl_Window_Type.cxx,v 1.13.2.2 1999/04/18 14:10:55 gustavo Exp $"
+// "$Id: Fl_Window_Type.cxx,v 1.13.2.3 1999/09/10 16:40:17 bill Exp $"
//
// Window type code for the Fast Light Tool Kit (FLTK).
//
@@ -349,7 +349,7 @@ void Fl_Window_Type::draw_overlay() {
int y = y1; int b = my; if (y > b) {y = my; b = y1;}
fl_rect(x,y,r-x,b-y);
}
- if (overlays_invisible) return;
+ if (overlays_invisible && !drag) return;
if (selected) fl_rect(0,0,o->w(),o->h());
if (!numselected) return;
int bx,by,br,bt;
@@ -404,6 +404,39 @@ extern void fix_group_size(Fl_Type *t);
extern Fl_Menu_Item Main_Menu[];
extern Fl_Menu_Item New_Menu[];
+// move the selected children according to current dx,dy,drag state:
+void Fl_Window_Type::moveallchildren()
+{
+ Fl_Type *i;
+ for (i=next; i && i->level>level;) {
+ if (i->selected && i->is_widget() && !i->is_menu_item()) {
+ Fl_Widget_Type* o = (Fl_Widget_Type*)i;
+ int x,y,r,t;
+ newposition(o,x,y,r,t);
+ o->o->resize(x,y,r-x,t-y);
+ // move all the children, whether selected or not:
+ Fl_Type* p;
+ for (p = o->next; p && p->level>o->level; p = p->next)
+ if (p->is_widget() && !p->is_menu_item()) {
+ Fl_Widget_Type* o = (Fl_Widget_Type*)p;
+ int x,y,r,t;
+ newposition(o,x,y,r,t);
+ o->o->resize(x,y,r-x,t-y);
+ }
+ i = p;
+ } else {
+ i = i->next;
+ }
+ }
+ for (i=next; i && i->level>level; i=i->next)
+ fix_group_size(i);
+ o->redraw();
+ recalc = 1;
+ ((Overlay_Window *)(this->o))->redraw_overlay();
+ modflag = 1;
+ dx = dy = 0;
+}
+
int Fl_Window_Type::handle(int event) {
static Fl_Type* selection;
switch (event) {
@@ -431,7 +464,7 @@ int Fl_Window_Type::handle(int event) {
CONTINUE2:;
}}
// see if user grabs edges of selected region:
- if (numselected && !overlays_invisible && !(Fl::event_state(FL_SHIFT)) &&
+ if (numselected && !(Fl::event_state(FL_SHIFT)) &&
mx<=br+snap && mx>=bx-snap && my<=bt+snap && my>=by-snap) {
int snap1 = snap>5 ? snap : 5;
int w1 = (br-bx)/4; if (w1 > snap1) w1 = snap1;
@@ -460,45 +493,21 @@ int Fl_Window_Type::handle(int event) {
if (!drag) drag = BOX; // if all else fails, start a new selection region
}}
return 1;
+
case FL_DRAG:
if (!drag) return 0;
mx = Fl::event_x();
my = Fl::event_y();
newdx();
return 1;
+
case FL_RELEASE:
if (!drag) return 0;
mx = Fl::event_x();
my = Fl::event_y();
newdx();
if (drag != BOX && (dx || dy || !Fl::event_is_click())) {
- if (dx || dy) {
- Fl_Type *i;
- for (i=next; i && i->level>level;) {
- if (i->selected && i->is_widget() && !i->is_menu_item()) {
- Fl_Widget_Type* o = (Fl_Widget_Type*)i;
- int x,y,r,t;
- newposition(o,x,y,r,t);
- o->o->resize(x,y,r-x,t-y);
- // move all the children, whether selected or not:
- Fl_Type* p;
- for (p = o->next; p && p->level>o->level; p = p->next)
- if (p->is_widget() && !p->is_menu_item()) {
- Fl_Widget_Type* o = (Fl_Widget_Type*)p;
- int x,y,r,t;
- newposition(o,x,y,r,t);
- o->o->resize(x,y,r-x,t-y);
- }
- i = p;
- } else {
- i = i->next;
- }
- }
- for (i=next; i && i->level>level; i=i->next) fix_group_size(i);
- this->o->redraw();
- fix_overlay();
- modflag = 1;
- }
+ if (dx || dy) moveallchildren();
} else if ((Fl::event_clicks() || Fl::event_state(FL_CTRL))) {
Fl_Widget_Type::open();
} else {
@@ -531,53 +540,63 @@ int Fl_Window_Type::handle(int event) {
return 1;
case FL_KEYBOARD: {
- if (Fl::event_key() == FL_Escape) {((Fl_Window*)o)->hide(); return 1;}
- // find current child:
- Fl_Type *i = Fl_Type::current;
- while (i && (!i->is_widget() || i->is_menu_item())) i = i->parent;
- if (!i) return 0;
- Fl_Type *p = i->parent;
- while (p && p != this) p = p->parent;
- if (!p || !p->is_widget()) {i=next; if (!i || i->level <= level) return 0;}
- p = i;
- // try to navigate to another child:
- for (;;) {
- switch (Fl::event_key()) {
- case FL_Tab:
- if (Fl::event_state(FL_SHIFT)) goto LEFT;
- case FL_Right:
- case FL_Down:
- i = i->next; break;
- case FL_Left:
- case FL_Up:
- LEFT:
- i = i->prev; break;
- default:
- return 0;
+
+ int backtab = 0;
+ switch (Fl::event_key()) {
+
+ case FL_Escape:
+ ((Fl_Window*)o)->hide();
+ return 1;
+
+ case 0xFE20: // backtab
+ backtab = 1;
+ case FL_Tab: {
+ if (Fl::event_state(FL_SHIFT)) backtab = 1;
+ // find current child:
+ Fl_Type *i = Fl_Type::current;
+ while (i && (!i->is_widget() || i->is_menu_item())) i = i->parent;
+ if (!i) return 0;
+ Fl_Type *p = i->parent;
+ while (p && p != this) p = p->parent;
+ if (!p || !p->is_widget()) {
+ i = next; if (!i || i->level <= level) return 0;
+ }
+ p = i;
+ for (;;) {
+ i = backtab ? i->prev : i->next;
+ if (!i || i->level <= level) {i = p; break;}
+ if (i->is_widget() && !i->is_menu_item()) break;
}
- if (!i || i->level <= level) {i = p; break;}
- if (!i->is_widget() || i->is_menu_item()) continue;
- switch (Fl::event_key()) {
- case FL_Up:
- case FL_Down: if (p->is_widget() && !p->is_menu_item()) {
- Fl_Widget* w = ((Fl_Widget_Type*)i)->o;
- Fl_Widget* pw = ((Fl_Widget_Type*)p)->o;
- if (w->x() >= pw->x()+pw->w() ||
- w->x()+w->w() <= pw->x()) continue;
- }}
+ deselect(); select(i,1);
+ return 1;}
+
+ case FL_Left: dx = -1; dy = 0; goto ARROW;
+ case FL_Right: dx = +1; dy = 0; goto ARROW;
+ case FL_Up: dx = 0; dy = -1; goto ARROW;
+ case FL_Down: dx = 0; dy = +1; goto ARROW;
+ ARROW:
+ // for some reason BOTTOM/TOP are swapped... should be fixed...
+ drag = (Fl::event_state(FL_SHIFT)) ? (RIGHT|TOP) : DRAG;
+ if (Fl::event_state(FL_CTRL)) {dx *= gridx; dy *= gridy;}
+ moveallchildren();
+ drag = 0;
+ return 1;
+
+ case 'o':
+ toggle_overlays(0, 0);
break;
- }
- // select it:
- deselect(); select(i,1);
- } return 1;
+
+ default:
+ return 0;
+ }}
case FL_SHORTCUT: {
in_this_only = this; // modifies how some menu items work.
const Fl_Menu_Item* m = Main_Menu->test_shortcut();
if (m && m->callback()) m->do_callback(this->o);
in_this_only = 0;
- return (m != 0);
- }
+ return (m != 0);}
+
default:
return 0;
}
@@ -653,5 +672,5 @@ int Fl_Window_Type::read_fdesign(const char* name, const char* value) {
}
//
-// End of "$Id: Fl_Window_Type.cxx,v 1.13.2.2 1999/04/18 14:10:55 gustavo Exp $".
+// End of "$Id: Fl_Window_Type.cxx,v 1.13.2.3 1999/09/10 16:40:17 bill Exp $".
//