diff options
| author | Bill Spitzak <spitzak@gmail.com> | 1999-09-10 16:40:17 +0000 |
|---|---|---|
| committer | Bill Spitzak <spitzak@gmail.com> | 1999-09-10 16:40:17 +0000 |
| commit | 54a6bda767ccf76473c127aa47b2d15bdc4f5491 (patch) | |
| tree | 049d1c2d8b404c1e49d8769f3f482b8d07ed3af3 | |
| parent | 820654ccd63662460b1b7ee5595784fbe49e0977 (diff) | |
The arrow patch is in!
Slightly modified version of the second version submitted.
It reuses the resizing code for the mouse drag and does not turn on the overlay
if it has been toggled off. Also cleaned up some very hard to understand
code for handling FL_KEYBOARD.
Arrows move the selected widgets by 1 pixel
Shift moves the right+bottom edge of the selected region
Ctrl moves by the current grid step
Also typing the letter 'o' in a window is a shortcut to toggle the overlay
on and off.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.0@712 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
| -rw-r--r-- | fluid/Fl_Type.h | 5 | ||||
| -rw-r--r-- | fluid/Fl_Window_Type.cxx | 159 |
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 $". // |
