summaryrefslogtreecommitdiff
path: root/fluid
diff options
context:
space:
mode:
authorMichael R Sweet <michael.r.sweet@gmail.com>2005-03-06 05:19:26 +0000
committerMichael R Sweet <michael.r.sweet@gmail.com>2005-03-06 05:19:26 +0000
commit11d689f5bc824ff261e69d134126b194f55bbded (patch)
tree49ac75718f0ef6bba8babf4784135e5f1debca64 /fluid
parentec7b0609576b174048d3cff1c5c6abbb7fb8fc8a (diff)
Save my changes to the guide lines - basic snapping is implemented with
10 pixel spacing and recommended width/height. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.1@4073 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'fluid')
-rw-r--r--fluid/Fl_Window_Type.cxx124
1 files changed, 95 insertions, 29 deletions
diff --git a/fluid/Fl_Window_Type.cxx b/fluid/Fl_Window_Type.cxx
index 7bfa5e1c8..c2e5b9af5 100644
--- a/fluid/Fl_Window_Type.cxx
+++ b/fluid/Fl_Window_Type.cxx
@@ -489,7 +489,7 @@ static void draw_v_arrow(int x, int y1, int y2) {
char buf[16];
sprintf(buf, "%d", dy*(y2-y1));
fl_font(FL_HELVETICA, 9);
- fl_draw(buf, x+3, y1+0.5*(y2-y1)+3);
+ fl_draw(buf, x+3, y1+(y2-y1)/2+3);
}
static void draw_h_arrow(int x1, int y, int x2) {
@@ -501,7 +501,7 @@ static void draw_h_arrow(int x1, int y, int x2) {
char buf[16];
sprintf(buf, "%d", dx*(x2-x1));
fl_font(FL_HELVETICA, 9);
- fl_draw(buf, x1+0.5*(x2-x1)-6, y+9);
+ fl_draw(buf, x1+(x2-x1)/2-6, y+9);
}
static void draw_top_brace(const Fl_Widget *w) {
@@ -551,7 +551,7 @@ static void draw_width(int x, int y, int r) {
char buf[16];
sprintf(buf, "%d", r-x+1);
fl_font(FL_HELVETICA, 9);
- fl_draw(buf, r-5-fl_width(buf), y-1);
+ fl_draw(buf, r-5-(int)fl_width(buf), y-1);
}
void Fl_Window_Type::draw_overlay() {
@@ -580,7 +580,7 @@ void Fl_Window_Type::draw_overlay() {
if (!numselected) return;
int mybx,myby,mybr,mybt;
mybx = o->w(); myby = o->h(); mybr = 0; mybt = 0;
- Fl_Type *selection = 0L; // used to store the one selcted widget (if n==1)
+ Fl_Type *selection = 0L; // used to store the one selected widget (if n==1)
for (Fl_Type *q=next; q && q->level>level; q = q->next)
if (q->selected && q->is_widget() && !q->is_menu_item()) {
selection = q;
@@ -600,29 +600,83 @@ void Fl_Window_Type::draw_overlay() {
fl_rectf(mybr-5,mybt-5,5,5);
fl_rectf(mybx,mybt-5,5,5);
- if (show_guides) {
+ if (show_guides && drag) {
// draw overlays for UI Guideline distances
// - check for distance to the window edge
- // * Apple suggest 14 pixels from the top
- if (myby==14) draw_v_arrow(mybx+5, myby, 0);
- // * Apple suggest 20 pixels from the top
- if (o->h()-mybt-1==20) draw_v_arrow(mybx+5, mybt, o->h()-1);
- // * Apple suggest 20 pixels from the left
- if (mybx==20) draw_h_arrow(mybx, myby+5, 0);
- // * Apple suggest 20 pixels from the right
- if (o->w()-mybr-1==20) draw_h_arrow(mybr, myby+5, o->w()-1);
- // - the following measuremetnt only apply to single selections
- if (numselected==1 && selection) {
- // check for Apple prefered button sizes
+ // * FLTK suggests 10 pixels from the edge
+
+ if (drag & DRAG) {
+ if (abs(myby - 10) < 5) {
+ dy += 10 - myby;
+ mybt -= myby - 10;
+ myby = 10;
+ draw_v_arrow(mybx+5, myby, 0);
+ }
+ if (abs(o->h() - mybt - 10) < 5) {
+ dy += o->h() - 10 - mybt;
+ myby += o->h() - mybt - 10;
+ mybt = o->h()- 10;
+ draw_v_arrow(mybx+5, mybt, o->h());
+ }
+ if (abs(mybx - 10) < 5) {
+ dx += 10 - mybx;
+ mybr -= mybx - 10;
+ mybx = 10;
+ draw_h_arrow(mybx, myby+5, 0);
+ }
+ if (abs(o->w() - mybr - 10) < 5) {
+ dx += o->w() - 10 - mybr;
+ mybx += o->w() - mybr - 10;
+ mybr = o->w()- 10;
+ draw_h_arrow(mybr, myby+5, o->w());
+ }
+ } else if (numselected==1 && selection) {
+ // check for FLTK preferred sizes
+ Fl_Widget *myw = ((Fl_Widget_Type *)selection)->o;
+
if (selection->is_button()) {
- int h = mybt-myby;
- if (h==20 || h==17 || h==15) draw_height(mybx+10, myby, mybt);
- int w = mybr-mybx;
- if (w==68) draw_width(mybx, myby+10, mybr);
+ int w = mybr-mybx;
+ int h = mybt-myby;
+ if (abs(h-25) < 3) {
+ mybt = myby + 25;
+ if (drag & TOP) dy += 25 - h;
+ else dy += h - 25;
+ } else if (abs(h-20) < 3) {
+ mybt = myby + 20;
+ if (drag & TOP) dy += 20 - h;
+ else dy += h - 20;
+ } else if (abs(h-15) < 3) {
+ mybt = myby + 15;
+ if (drag & TOP) dy += 15 - h;
+ else dy += h - 15;
+ }
+
+ draw_height(mybx < (o->w()/2) ? mybr : mybx-10, myby, mybt);
+
+ int ww = 0, hh = 0;
+
+ myw->measure_label(ww, hh);
+
+ ww += 20;
+
+ if (abs(ww - w) < 5) {
+ if (drag & LEFT) {
+ mybx = mybr - ww;
+ dx -= ww - w;
+ } else {
+ mybr = mybx + ww;
+ dx += ww - w;
+ }
+ }
+
+ draw_width(mybx, myby < (o->h()/2) ? mybt : myby-10, mybx + ww);
}
- // - check distances between individual widgets
+ }
+
+ // - check distances between individual widgets
+ if (drag) {
for (Fl_Type *q=next; q && q->level>level; q = q->next)
- if (q != selection) {
+ if (q != selection) {
Fl_Widget_Type *qw = (Fl_Widget_Type*)q;
// - check horizontal and vertical alignment with other widgets
if (myby == qw->o->y()) draw_top_brace(qw->o);
@@ -632,15 +686,27 @@ void Fl_Window_Type::draw_overlay() {
if (selection->is_button()) {
// - check distances between buttons
if (q->is_button() && qw->o->y()==myby) {
- // * horizontal button to button is 12 or 24 pixels
- int dx = mybx - (qw->o->x()+qw->o->w());
- if (dx==12 || dx==24) draw_h_arrow(mybx-1, myby+10, mybx-dx-1);
- dx = qw->o->x() - mybr;
- if (dx==12 || dx==24) draw_h_arrow(mybr, myby+10, mybr+dx);
+ // * horizontal button to button is 10 pixels
+ int xx = mybx - (qw->o->x()+qw->o->w());
+ if (abs(xx-10) < 5) {
+ if (drag & (LEFT | DRAG)) dx += xx - 10;
+ else dx -= xx - 10;
+
+ draw_h_arrow(mybx-1, myby+10, mybx-xx-1);
+ } else {
+ xx = qw->o->x() - mybr;
+ if (abs(xx-10) < 5) {
+ if (drag & (LEFT | DRAG)) dx += xx - 10;
+ else dx -= xx - 10;
+
+ draw_h_arrow(mybr, myby+10, mybr+xx);
+ }
+ }
}
}
- }
+ }
}
+
// \todo add more cases, maybe an interpreter?
}
}
@@ -779,7 +845,7 @@ int Fl_Window_Type::handle(int event) {
if (!drag) return 0;
mx = Fl::event_x();
my = Fl::event_y();
- newdx();
+// newdx();
if (drag != BOX && (dx || dy || !Fl::event_is_click())) {
if (dx || dy) moveallchildren();
} else if ((Fl::event_clicks() || Fl::event_state(FL_CTRL))) {