reflexion 0.1.21 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.doc/ext/reflex/contact_event.cpp +6 -6
- data/.doc/ext/reflex/focus_event.cpp +6 -6
- data/.doc/ext/reflex/key_event.cpp +210 -12
- data/.doc/ext/reflex/pointer_event.cpp +21 -21
- data/VERSION +1 -1
- data/ext/reflex/contact_event.cpp +6 -6
- data/ext/reflex/focus_event.cpp +6 -6
- data/ext/reflex/key_event.cpp +211 -12
- data/ext/reflex/pointer_event.cpp +21 -21
- data/include/reflex/defs.h +143 -91
- data/lib/reflex/application.rb +3 -3
- data/lib/reflex/autoinit.rb +1 -1
- data/lib/reflex/button.rb +7 -7
- data/lib/reflex/capture_event.rb +7 -7
- data/lib/reflex/contact_event.rb +4 -4
- data/lib/reflex/draw_event.rb +2 -2
- data/lib/reflex/ellipse_shape.rb +2 -2
- data/lib/reflex/focus_event.rb +4 -4
- data/lib/reflex/frame_event.rb +5 -5
- data/lib/reflex/helper.rb +20 -20
- data/lib/reflex/image_view.rb +2 -2
- data/lib/reflex/key_event.rb +5 -5
- data/lib/reflex/model.rb +22 -22
- data/lib/reflex/model_owner.rb +7 -7
- data/lib/reflex/model_view.rb +1 -1
- data/lib/reflex/module.rb +5 -5
- data/lib/reflex/pointer_event.rb +12 -12
- data/lib/reflex/polygon_shape.rb +2 -2
- data/lib/reflex/reflex.rb +3 -3
- data/lib/reflex/scroll_event.rb +1 -1
- data/lib/reflex/selector.rb +4 -4
- data/lib/reflex/shape.rb +13 -13
- data/lib/reflex/style.rb +11 -11
- data/lib/reflex/style_length.rb +1 -1
- data/lib/reflex/text_view.rb +2 -2
- data/lib/reflex/timer.rb +2 -2
- data/lib/reflex/timer_event.rb +1 -1
- data/lib/reflex/update_event.rb +1 -1
- data/lib/reflex/view.rb +32 -32
- data/lib/reflex/wheel_event.rb +3 -3
- data/lib/reflex/window.rb +5 -5
- data/lib/reflexion.rb +17 -17
- data/reflex.gemspec +4 -4
- data/samples/reflexion/noise.rb +1 -1
- data/samples/tree.rb +1 -1
- data/src/ios/window.mm +1 -1
- data/src/osx/event.h +8 -0
- data/src/osx/event.mm +173 -1
- data/src/osx/native_window.mm +5 -1
- data/src/view.cpp +38 -10
- data/src/window.cpp +1 -1
- data/test/helper.rb +3 -3
- data/test/test_application.rb +1 -1
- data/test/test_capture_event.rb +6 -6
- data/test/test_event.rb +2 -2
- data/test/test_has_frame.rb +11 -11
- data/test/test_pointer_event.rb +13 -13
- data/test/test_reflex.rb +1 -1
- data/test/test_selector.rb +8 -8
- data/test/test_shape.rb +8 -8
- data/test/test_style.rb +13 -13
- data/test/test_style_length.rb +5 -5
- data/test/test_view.rb +30 -30
- data/test/test_window.rb +10 -10
- metadata +10 -10
data/lib/reflexion.rb
CHANGED
@@ -18,7 +18,7 @@ module Reflexion
|
|
18
18
|
}
|
19
19
|
|
20
20
|
|
21
|
-
def call_event
|
21
|
+
def call_event(event, *args, &block)
|
22
22
|
$event = event
|
23
23
|
Xot::BlockUtil.instance_eval_or_block_call *args, &block if block
|
24
24
|
$event = nil
|
@@ -27,7 +27,7 @@ module Reflexion
|
|
27
27
|
|
28
28
|
class App < Application
|
29
29
|
|
30
|
-
def on_motion
|
30
|
+
def on_motion(e)
|
31
31
|
super
|
32
32
|
call_event e, e, &$motion
|
33
33
|
end
|
@@ -39,29 +39,29 @@ module Reflexion
|
|
39
39
|
|
40
40
|
attr_reader :event
|
41
41
|
|
42
|
-
def initialize
|
42
|
+
def initialize(*args, &block)
|
43
43
|
super
|
44
44
|
$window = self
|
45
45
|
call_event nil, self, &$setup
|
46
46
|
end
|
47
47
|
|
48
|
-
def on_update
|
48
|
+
def on_update(e)
|
49
49
|
super
|
50
50
|
redraw
|
51
51
|
call_event e, e, &$update
|
52
52
|
end
|
53
53
|
|
54
|
-
def on_draw
|
54
|
+
def on_draw(e)
|
55
55
|
super
|
56
56
|
call_event e, e.painter, &$draw
|
57
57
|
end
|
58
58
|
|
59
|
-
def on_key
|
59
|
+
def on_key(e)
|
60
60
|
super
|
61
61
|
call_event e, e, &$key
|
62
62
|
end
|
63
63
|
|
64
|
-
def on_pointer
|
64
|
+
def on_pointer(e)
|
65
65
|
super
|
66
66
|
call_event e, e, &$pointer
|
67
67
|
end
|
@@ -71,43 +71,43 @@ module Reflexion
|
|
71
71
|
|
72
72
|
module_function
|
73
73
|
|
74
|
-
def window
|
74
|
+
def window()
|
75
75
|
$window ||= MainWindow.new DEFAULTS
|
76
76
|
end
|
77
77
|
|
78
|
-
def event
|
78
|
+
def event()
|
79
79
|
$event
|
80
80
|
end
|
81
81
|
|
82
|
-
def setup
|
82
|
+
def setup(&block)
|
83
83
|
$setup = block
|
84
84
|
end
|
85
85
|
|
86
|
-
def update
|
86
|
+
def update(&block)
|
87
87
|
$update = block
|
88
88
|
end
|
89
89
|
|
90
|
-
def draw
|
90
|
+
def draw(&block)
|
91
91
|
$draw = block
|
92
92
|
end
|
93
93
|
|
94
|
-
def key
|
94
|
+
def key(&block)
|
95
95
|
$key = block
|
96
96
|
end
|
97
97
|
|
98
|
-
def pointer
|
98
|
+
def pointer(&block)
|
99
99
|
$pointer = block
|
100
100
|
end
|
101
101
|
|
102
|
-
def motion
|
102
|
+
def motion(&block)
|
103
103
|
$motion = block
|
104
104
|
end
|
105
105
|
|
106
|
-
def start
|
106
|
+
def start()
|
107
107
|
App.new {window.show}.start
|
108
108
|
end
|
109
109
|
|
110
|
-
def quit
|
110
|
+
def quit()
|
111
111
|
window.close
|
112
112
|
end
|
113
113
|
|
data/reflex.gemspec
CHANGED
@@ -28,10 +28,10 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.platform = Gem::Platform::RUBY
|
29
29
|
s.required_ruby_version = '~> 2'
|
30
30
|
|
31
|
-
s.add_runtime_dependency 'xot', '~> 0.1.
|
32
|
-
s.add_runtime_dependency 'rucy', '~> 0.1.
|
33
|
-
s.add_runtime_dependency 'beeps', '~> 0.1.
|
34
|
-
s.add_runtime_dependency 'rays', '~> 0.1.
|
31
|
+
s.add_runtime_dependency 'xot', '~> 0.1.22'
|
32
|
+
s.add_runtime_dependency 'rucy', '~> 0.1.22'
|
33
|
+
s.add_runtime_dependency 'beeps', '~> 0.1.22'
|
34
|
+
s.add_runtime_dependency 'rays', '~> 0.1.22'
|
35
35
|
|
36
36
|
s.files = `git ls-files`.split $/
|
37
37
|
s.executables = s.files.grep(%r{^bin/}) {|f| File.basename f}
|
data/samples/reflexion/noise.rb
CHANGED
data/samples/tree.rb
CHANGED
data/src/ios/window.mm
CHANGED
data/src/osx/event.h
CHANGED
data/src/osx/event.mm
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
|
5
5
|
#include <assert.h>
|
6
|
+
#include <Carbon/Carbon.h>
|
6
7
|
#import <Cocoa/Cocoa.h>
|
7
8
|
|
8
9
|
|
@@ -17,6 +18,168 @@ namespace Reflex
|
|
17
18
|
return [chars UTF8String];
|
18
19
|
}
|
19
20
|
|
21
|
+
static KeyCode
|
22
|
+
get_code (UInt16 code)
|
23
|
+
{
|
24
|
+
switch (code)
|
25
|
+
{
|
26
|
+
case kVK_ANSI_A: return KEY_A;
|
27
|
+
case kVK_ANSI_S: return KEY_S;
|
28
|
+
case kVK_ANSI_D: return KEY_D;
|
29
|
+
case kVK_ANSI_F: return KEY_F;
|
30
|
+
case kVK_ANSI_H: return KEY_H;
|
31
|
+
case kVK_ANSI_G: return KEY_G;
|
32
|
+
case kVK_ANSI_Z: return KEY_Z;
|
33
|
+
case kVK_ANSI_X: return KEY_X;
|
34
|
+
case kVK_ANSI_C: return KEY_C;
|
35
|
+
case kVK_ANSI_V: return KEY_V;
|
36
|
+
case kVK_ANSI_B: return KEY_B;
|
37
|
+
case kVK_ANSI_Q: return KEY_Q;
|
38
|
+
case kVK_ANSI_W: return KEY_W;
|
39
|
+
case kVK_ANSI_E: return KEY_E;
|
40
|
+
case kVK_ANSI_R: return KEY_R;
|
41
|
+
case kVK_ANSI_Y: return KEY_Y;
|
42
|
+
case kVK_ANSI_T: return KEY_T;
|
43
|
+
case kVK_ANSI_1: return KEY_1;
|
44
|
+
case kVK_ANSI_2: return KEY_2;
|
45
|
+
case kVK_ANSI_3: return KEY_3;
|
46
|
+
case kVK_ANSI_4: return KEY_4;
|
47
|
+
case kVK_ANSI_6: return KEY_6;
|
48
|
+
case kVK_ANSI_5: return KEY_5;
|
49
|
+
case kVK_ANSI_Equal: return KEY_EQUAL;
|
50
|
+
case kVK_ANSI_9: return KEY_9;
|
51
|
+
case kVK_ANSI_7: return KEY_7;
|
52
|
+
case kVK_ANSI_Minus: return KEY_MINUS;
|
53
|
+
case kVK_ANSI_8: return KEY_8;
|
54
|
+
case kVK_ANSI_0: return KEY_0;
|
55
|
+
case kVK_ANSI_RightBracket: return KEY_RBRACKET;
|
56
|
+
case kVK_ANSI_O: return KEY_O;
|
57
|
+
case kVK_ANSI_U: return KEY_U;
|
58
|
+
case kVK_ANSI_LeftBracket: return KEY_LBRACKET;
|
59
|
+
case kVK_ANSI_I: return KEY_I;
|
60
|
+
case kVK_ANSI_P: return KEY_P;
|
61
|
+
case kVK_ANSI_L: return KEY_L;
|
62
|
+
case kVK_ANSI_J: return KEY_J;
|
63
|
+
case kVK_ANSI_Quote: return KEY_QUOTE;
|
64
|
+
case kVK_ANSI_K: return KEY_K;
|
65
|
+
case kVK_ANSI_Semicolon: return KEY_SEMICOLON;
|
66
|
+
case kVK_ANSI_Backslash: return KEY_BACKSLASH;
|
67
|
+
case kVK_ANSI_Comma: return KEY_COMMA;
|
68
|
+
case kVK_ANSI_Slash: return KEY_SLASH;
|
69
|
+
case kVK_ANSI_N: return KEY_N;
|
70
|
+
case kVK_ANSI_M: return KEY_M;
|
71
|
+
case kVK_ANSI_Period: return KEY_PERIOD;
|
72
|
+
case kVK_ANSI_Grave: return KEY_GRAVE;
|
73
|
+
case kVK_ANSI_KeypadDecimal: return KEY_NUM_DECIMAL;
|
74
|
+
case kVK_ANSI_KeypadMultiply: return KEY_NUM_MULTIPLY;
|
75
|
+
case kVK_ANSI_KeypadPlus: return KEY_NUM_PLUS;
|
76
|
+
case kVK_ANSI_KeypadClear: return KEY_NUM_CLEAR;
|
77
|
+
case kVK_ANSI_KeypadDivide: return KEY_NUM_DIVIDE;
|
78
|
+
case kVK_ANSI_KeypadEnter: return KEY_ENTER;
|
79
|
+
case kVK_ANSI_KeypadMinus: return KEY_NUM_MINUS;
|
80
|
+
case kVK_ANSI_KeypadEquals: return KEY_NUM_EQUAL;
|
81
|
+
case kVK_ANSI_Keypad0: return KEY_NUM_0;
|
82
|
+
case kVK_ANSI_Keypad1: return KEY_NUM_1;
|
83
|
+
case kVK_ANSI_Keypad2: return KEY_NUM_2;
|
84
|
+
case kVK_ANSI_Keypad3: return KEY_NUM_3;
|
85
|
+
case kVK_ANSI_Keypad4: return KEY_NUM_4;
|
86
|
+
case kVK_ANSI_Keypad5: return KEY_NUM_5;
|
87
|
+
case kVK_ANSI_Keypad6: return KEY_NUM_6;
|
88
|
+
case kVK_ANSI_Keypad7: return KEY_NUM_7;
|
89
|
+
case kVK_ANSI_Keypad8: return KEY_NUM_8;
|
90
|
+
case kVK_ANSI_Keypad9: return KEY_NUM_9;
|
91
|
+
|
92
|
+
case kVK_Return: return KEY_RETURN;
|
93
|
+
case kVK_Tab: return KEY_TAB;
|
94
|
+
case kVK_Space: return KEY_SPACE;
|
95
|
+
case kVK_Delete: return KEY_BACKSPACE;
|
96
|
+
case kVK_Escape: return KEY_ESCAPE;
|
97
|
+
case kVK_Command: return KEY_LCOMMAND;
|
98
|
+
case kVK_Shift: return KEY_LSHIFT;
|
99
|
+
case kVK_CapsLock: return KEY_CAPSLOCK;
|
100
|
+
case kVK_Option: return KEY_LOPTION;
|
101
|
+
case kVK_Control: return KEY_LCONTROL;
|
102
|
+
case kVK_RightCommand: return KEY_RCOMMAND;
|
103
|
+
case kVK_RightShift: return KEY_RSHIFT;
|
104
|
+
case kVK_RightOption: return KEY_ROPTION;
|
105
|
+
case kVK_RightControl: return KEY_RCONTROL;
|
106
|
+
case kVK_Function: return KEY_FUNCTION;
|
107
|
+
case kVK_F17: return KEY_F17;
|
108
|
+
case kVK_VolumeUp: return KEY_VOLUME_UP;
|
109
|
+
case kVK_VolumeDown: return KEY_VOLUME_DOWN;
|
110
|
+
case kVK_Mute: return KEY_MUTE;
|
111
|
+
case kVK_F18: return KEY_F18;
|
112
|
+
case kVK_F19: return KEY_F19;
|
113
|
+
case kVK_F20: return KEY_F20;
|
114
|
+
case kVK_F5: return KEY_F5;
|
115
|
+
case kVK_F6: return KEY_F6;
|
116
|
+
case kVK_F7: return KEY_F7;
|
117
|
+
case kVK_F3: return KEY_F3;
|
118
|
+
case kVK_F8: return KEY_F8;
|
119
|
+
case kVK_F9: return KEY_F9;
|
120
|
+
case kVK_F11: return KEY_F11;
|
121
|
+
case kVK_F13: return KEY_F13;
|
122
|
+
case kVK_F16: return KEY_F16;
|
123
|
+
case kVK_F14: return KEY_F14;
|
124
|
+
case kVK_F10: return KEY_F10;
|
125
|
+
case kVK_F12: return KEY_F12;
|
126
|
+
case kVK_F15: return KEY_F15;
|
127
|
+
case kVK_Help: return KEY_HELP;
|
128
|
+
case kVK_Home: return KEY_HOME;
|
129
|
+
case kVK_PageUp: return KEY_PAGEUP;
|
130
|
+
case kVK_ForwardDelete: return KEY_DELETE;
|
131
|
+
case kVK_F4: return KEY_F4;
|
132
|
+
case kVK_End: return KEY_END;
|
133
|
+
case kVK_F2: return KEY_F2;
|
134
|
+
case kVK_PageDown: return KEY_PAGEDOWN;
|
135
|
+
case kVK_F1: return KEY_F1;
|
136
|
+
case kVK_LeftArrow: return KEY_LEFT;
|
137
|
+
case kVK_RightArrow: return KEY_RIGHT;
|
138
|
+
case kVK_DownArrow: return KEY_DOWN;
|
139
|
+
case kVK_UpArrow: return KEY_UP;
|
140
|
+
|
141
|
+
case kVK_ISO_Section: return KEY_SECTION;
|
142
|
+
|
143
|
+
case kVK_JIS_Yen: return KEY_YEN;
|
144
|
+
case kVK_JIS_Underscore: return KEY_UNDERSCORE;
|
145
|
+
case kVK_JIS_KeypadComma: return KEY_NUM_COMMA;
|
146
|
+
case kVK_JIS_Eisu: return KEY_IME_EISU;
|
147
|
+
case kVK_JIS_Kana: return KEY_IME_KANA;
|
148
|
+
}
|
149
|
+
|
150
|
+
return KEY_NONE;
|
151
|
+
}
|
152
|
+
|
153
|
+
static uint
|
154
|
+
get_modifier_flag_mask (const NSEvent* e)
|
155
|
+
{
|
156
|
+
switch ([e keyCode])
|
157
|
+
{
|
158
|
+
case kVK_Shift:
|
159
|
+
case kVK_RightShift: return NSShiftKeyMask;
|
160
|
+
case kVK_Control:
|
161
|
+
case kVK_RightControl: return NSControlKeyMask;
|
162
|
+
case kVK_Option:
|
163
|
+
case kVK_RightOption: return NSAlternateKeyMask;
|
164
|
+
case kVK_Command:
|
165
|
+
case kVK_RightCommand: return NSCommandKeyMask;
|
166
|
+
case kVK_CapsLock: return NSAlphaShiftKeyMask;
|
167
|
+
case kVK_Function: return NSFunctionKeyMask;
|
168
|
+
}
|
169
|
+
return 0;
|
170
|
+
}
|
171
|
+
|
172
|
+
static KeyEvent::Type
|
173
|
+
get_flag_key_event_type(const NSEvent* e)
|
174
|
+
{
|
175
|
+
uint mask = get_modifier_flag_mask(e);
|
176
|
+
if (mask == 0) return Reflex::KeyEvent::NONE;
|
177
|
+
|
178
|
+
return [e modifierFlags] & mask
|
179
|
+
? Reflex::KeyEvent::DOWN
|
180
|
+
: Reflex::KeyEvent::UP;
|
181
|
+
}
|
182
|
+
|
20
183
|
static uint
|
21
184
|
get_current_pointer_type ()
|
22
185
|
{
|
@@ -81,7 +244,16 @@ namespace Reflex
|
|
81
244
|
|
82
245
|
NativeKeyEvent::NativeKeyEvent (NSEvent* e, Type type)
|
83
246
|
: KeyEvent(
|
84
|
-
type, get_chars(e), [e keyCode], get_modifiers(e),
|
247
|
+
type, get_chars(e), get_code([e keyCode]), get_modifiers(e),
|
248
|
+
[e isARepeat] ? 1 : 0)
|
249
|
+
{
|
250
|
+
}
|
251
|
+
|
252
|
+
|
253
|
+
NativeFlagKeyEvent::NativeFlagKeyEvent (NSEvent* e)
|
254
|
+
: KeyEvent(
|
255
|
+
get_flag_key_event_type(e), "", get_code([e keyCode]), get_modifiers(e),
|
256
|
+
0)
|
85
257
|
{
|
86
258
|
}
|
87
259
|
|
data/src/osx/native_window.mm
CHANGED
@@ -280,7 +280,11 @@ static const NSUInteger WINDOW_STYLE_MASK =
|
|
280
280
|
|
281
281
|
- (void) flagsChanged: (NSEvent*) event
|
282
282
|
{
|
283
|
-
|
283
|
+
Reflex::Window* win = self.window;
|
284
|
+
if (!win) return;
|
285
|
+
|
286
|
+
Reflex::NativeFlagKeyEvent e(event);
|
287
|
+
win->on_key(&e);
|
284
288
|
}
|
285
289
|
|
286
290
|
- (void) mouseDown: (NSEvent*) event
|
data/src/view.cpp
CHANGED
@@ -1279,6 +1279,24 @@ namespace Reflex
|
|
1279
1279
|
}
|
1280
1280
|
}
|
1281
1281
|
|
1282
|
+
static void
|
1283
|
+
scroll_and_zoom_positions (PointerEvent* e, const Point* scroll, float zoom)
|
1284
|
+
{
|
1285
|
+
static const Point ZERO = 0;
|
1286
|
+
|
1287
|
+
assert(zoom != 0);
|
1288
|
+
|
1289
|
+
if (!scroll) scroll = &ZERO;
|
1290
|
+
if (*scroll == 0 && zoom == 1)
|
1291
|
+
return;
|
1292
|
+
|
1293
|
+
for (size_t i = 0; i < e->size; ++i)
|
1294
|
+
{
|
1295
|
+
e->position(i) -= *scroll;
|
1296
|
+
e->position(i) /= zoom;
|
1297
|
+
}
|
1298
|
+
}
|
1299
|
+
|
1282
1300
|
void
|
1283
1301
|
View_call_pointer_event (View* view, const PointerEvent& event)
|
1284
1302
|
{
|
@@ -1288,14 +1306,14 @@ namespace Reflex
|
|
1288
1306
|
bool capturing = view->capture() & View::CAPTURE_POINTER;
|
1289
1307
|
if (capturing != event.capture) return;
|
1290
1308
|
|
1291
|
-
const Bounds& frame = view->frame();
|
1292
|
-
|
1293
1309
|
PointerEvent e = event;
|
1294
|
-
filter_pointer_event(&e, event, frame);
|
1310
|
+
filter_pointer_event(&e, event, view->frame());
|
1295
1311
|
|
1296
1312
|
if (!capturing && e.size == 0)
|
1297
1313
|
return;
|
1298
1314
|
|
1315
|
+
scroll_and_zoom_positions(&e, view->self->pscroll.get(), view->zoom());
|
1316
|
+
|
1299
1317
|
view->on_pointer(&e);
|
1300
1318
|
|
1301
1319
|
switch (e.type)
|
@@ -1989,18 +2007,23 @@ namespace Reflex
|
|
1989
2007
|
void
|
1990
2008
|
View::scroll_to (coord x, coord y, coord z)
|
1991
2009
|
{
|
1992
|
-
Point
|
1993
|
-
self->scroll().reset(x, y, z);
|
1994
|
-
ScrollEvent e(x, y, z, x - old.x, y - old.y, z - old.z);
|
1995
|
-
on_scroll(&e);
|
1996
|
-
|
1997
|
-
redraw();
|
2010
|
+
scroll_to(Point(x, y, z));
|
1998
2011
|
}
|
1999
2012
|
|
2000
2013
|
void
|
2001
2014
|
View::scroll_to (const Point& scroll)
|
2002
2015
|
{
|
2003
|
-
|
2016
|
+
if (scroll == this->scroll()) return;
|
2017
|
+
|
2018
|
+
Point old = self->scroll();
|
2019
|
+
self->scroll() = scroll;
|
2020
|
+
|
2021
|
+
ScrollEvent e(
|
2022
|
+
scroll.x, scroll.y, scroll.z,
|
2023
|
+
scroll.x - old.x, scroll.y - old.y, scroll.z - old.z);
|
2024
|
+
on_scroll(&e);
|
2025
|
+
|
2026
|
+
redraw();
|
2004
2027
|
}
|
2005
2028
|
|
2006
2029
|
void
|
@@ -2028,6 +2051,11 @@ namespace Reflex
|
|
2028
2051
|
void
|
2029
2052
|
View::set_zoom (float zoom)
|
2030
2053
|
{
|
2054
|
+
if (zoom == self->zoom) return;
|
2055
|
+
|
2056
|
+
if (zoom == 0)
|
2057
|
+
argument_error(__FILE__, __LINE__);
|
2058
|
+
|
2031
2059
|
self->zoom = zoom;
|
2032
2060
|
redraw();
|
2033
2061
|
}
|