public
Description: a tiny graphical app kit for ruby
Homepage: http://code.whytheluckystiff.net/shoes
Clone URL: git://github.com/why/shoes.git
 * shoes/ruby.h: margins now take percentages and negative pixel sizes.
why (author)
Sat Jul 12 07:05:39 -0700 2008
commit  b5dbc788cb4d191fe9e74f1962688d407b16a3b0
tree    8edeff3d804e50153cdbdd5ed3103d78785ad3ef
parent  863f934c75d00c32cb2bb809053437d6eeef31f9
...
185
186
187
188
 
189
190
191
192
193
194
...
218
219
220
221
 
222
223
224
225
226
 
227
228
229
...
296
297
298
299
 
300
301
302
...
2629
2630
2631
2632
 
2633
2634
2635
...
185
186
187
 
188
189
190
 
191
192
193
...
217
218
219
 
220
221
222
223
224
 
225
226
227
228
...
295
296
297
 
298
299
300
301
...
2628
2629
2630
 
2631
2632
2633
2634
0
@@ -185,10 +185,9 @@ shoes_safe_block(VALUE self, VALUE block, VALUE args)
0
 }
0
 
0
 int
0
-shoes_px(VALUE attr, ID k, int dv, int pv, int nv)
0
+shoes_px(VALUE obj, int dv, int pv, int nv)
0
 {
0
   int px;
0
-  VALUE obj = shoes_hash_get(attr, k);
0
   if (TYPE(obj) == T_STRING) {
0
     char *ptr = RSTRING_PTR(obj);
0
     int len = RSTRING_LEN(obj);
0
@@ -218,12 +217,12 @@ shoes_px2(VALUE attr, ID k1, ID k2, int dv, int dr, int pv)
0
   VALUE obj = shoes_hash_get(attr, k2);
0
   if (!NIL_P(obj))
0
   {
0
-    px = shoes_px(attr, k2, 0, pv, 0);
0
+    px = shoes_px(obj, 0, pv, 0);
0
     px = (pv - dr) - px;
0
   }
0
   else
0
   {
0
-    px = shoes_px(attr, k1, dv, pv, 0);
0
+    px = shoes_px(shoes_hash_get(attr, k1), dv, pv, 0);
0
   }
0
   return px;
0
 }
0
@@ -296,7 +295,7 @@ shoes_place_decide(shoes_place *place, VALUE c, VALUE attr, int dw, int dh, unsi
0
   if (!NIL_P(c))
0
     Data_Get_Struct(c, shoes_canvas, canvas);
0
 
0
-  ATTR_MARGINS(attr, 0);
0
+  ATTR_MARGINS(attr, 0, canvas);
0
   if (padded) {
0
     dh += tmargin + bmargin;
0
     dw += lmargin + rmargin;
0
@@ -2629,7 +2628,7 @@ shoes_textblock_draw(VALUE self, VALUE c, VALUE actual)
0
     return self;
0
   }
0
 
0
-  ATTR_MARGINS(self_t->attr, 4);
0
+  ATTR_MARGINS(self_t->attr, 4, canvas);
0
   if (NIL_P(ATTR(self_t->attr, margin)) && NIL_P(ATTR(self_t->attr, margin_bottom)))
0
     bmargin = 12;
0
   self_t->place.flags = REL_CANVAS;
...
113
114
115
116
117
 
 
118
119
120
121
122
 
 
123
124
125
126
127
128
129
 
 
 
 
130
131
132
133
134
135
136
 
 
 
 
 
 
 
 
137
138
139
...
153
154
155
156
 
157
158
159
...
113
114
115
 
 
116
117
118
119
120
 
 
121
122
123
124
125
 
 
 
 
126
127
128
129
130
131
 
 
 
 
 
132
133
134
135
136
137
138
139
140
141
142
...
156
157
158
 
159
160
161
162
0
@@ -113,27 +113,30 @@ void shoes_ruby_init(void);
0
 // Common funcs for dealing with attribute hashes
0
 //
0
 #define ATTR(attr, n)                  shoes_hash_get(attr, s_##n)
0
-#define PX(attr, n, dn, pn)            shoes_px(attr, s_##n, dn, pn, 1)
0
-#define PXN(attr, n, dn, pn)            shoes_px(attr, s_##n, dn, pn, 0)
0
+#define PX(attr, n, dn, pn)            shoes_px(shoes_hash_get(attr, s_##n), dn, pn, 1)
0
+#define PXN(attr, n, dn, pn)            shoes_px(shoes_hash_get(attr, s_##n), dn, pn, 0)
0
 #define PX2(attr, n1, n2, dn, dr, pn)  shoes_px2(attr, s_##n1, s_##n2, dn, dr, pn)
0
 #define ATTR2(typ, attr, n, dn)        shoes_hash_##typ(attr, s_##n, dn)
0
 #define ATTRSET(attr, k, v)            attr = shoes_hash_set(attr, s_##k, v)
0
-#define ATTR_MARGINS(attr, dm) \
0
-  int margin = 0, lmargin, rmargin, tmargin, bmargin; \
0
+#define ATTR_MARGINS(attr, dm, canvas) \
0
+  int lmargin, rmargin, tmargin, bmargin; \
0
   VALUE margino = ATTR(attr, margin); \
0
   if (rb_obj_is_kind_of(margino, rb_cArray)) \
0
   { \
0
-    lmargin = NUM2INT(rb_ary_entry(margino, 0)); \
0
-    tmargin = NUM2INT(rb_ary_entry(margino, 1)); \
0
-    rmargin = NUM2INT(rb_ary_entry(margino, 2)); \
0
-    bmargin = NUM2INT(rb_ary_entry(margino, 3)); \
0
+    lmargin = shoes_px(rb_ary_entry(margino, 0), dm, CPW(canvas), 1); \
0
+    tmargin = shoes_px(rb_ary_entry(margino, 1), dm, CPH(canvas), 1); \
0
+    rmargin = shoes_px(rb_ary_entry(margino, 2), dm, CPW(canvas), 1); \
0
+    bmargin = shoes_px(rb_ary_entry(margino, 3), dm, CPH(canvas), 1); \
0
   } \
0
   else \
0
-    margin = lmargin = tmargin = rmargin = bmargin = ATTR2(int, attr, margin, dm); \
0
-  lmargin = ATTR2(int, attr, margin_left, lmargin); \
0
-  rmargin = ATTR2(int, attr, margin_right, rmargin); \
0
-  tmargin = ATTR2(int, attr, margin_top, tmargin); \
0
-  bmargin = ATTR2(int, attr, margin_bottom, bmargin)
0
+  { \
0
+    lmargin = rmargin = PX(attr, margin, dm, CPW(canvas)); \
0
+    tmargin = bmargin = PX(attr, margin, dm, CPH(canvas)); \
0
+  } \
0
+  lmargin = PX(attr, margin_left, lmargin, CPW(canvas)); \
0
+  rmargin = PX(attr, margin_right, rmargin, CPW(canvas)); \
0
+  tmargin = PX(attr, margin_top, tmargin, CPH(canvas)); \
0
+  bmargin = PX(attr, margin_bottom, bmargin, CPH(canvas))
0
 
0
 #define CHECK_HOVER(self_t, h, touch) \
0
   if ((self_t->hover & HOVER_MOTION) != h && !NIL_P(self_t->attr)) \
0
@@ -153,7 +156,7 @@ void shoes_ruby_init(void);
0
    y >= self_t->place.iy + self_t->place.dy && \
0
    y <= self_t->place.iy + self_t->place.dy + self_t->place.ih)
0
 
0
-int shoes_px(VALUE, ID, int, int, int);
0
+int shoes_px(VALUE, int, int, int);
0
 int shoes_px2(VALUE, ID, ID, int, int, int);
0
 VALUE shoes_hash_set(VALUE, ID, VALUE);
0
 VALUE shoes_hash_get(VALUE, ID);

Comments