reflexion 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/.doc/ext/reflex/application.cpp +35 -76
- data/.doc/ext/reflex/defs.cpp +8 -0
- data/.doc/ext/reflex/key.cpp +38 -43
- data/.doc/ext/reflex/native.cpp +6 -4
- data/.doc/ext/reflex/points.cpp +47 -52
- data/.doc/ext/reflex/reflex.cpp +12 -13
- data/.doc/ext/reflex/view.cpp +242 -0
- data/.doc/ext/reflex/window.cpp +87 -178
- data/.gitignore +14 -0
- data/Rakefile +6 -31
- data/VERSION +1 -1
- data/examples/hello/.gitignore +2 -0
- data/examples/ruby/app.rb +2 -2
- data/examples/ruby/checker.rb +3 -3
- data/examples/ruby/fps.rb +14 -14
- data/examples/ruby/grid.rb +65 -0
- data/examples/ruby/hello.rb +19 -7
- data/examples/ruby/key.rb +4 -4
- data/examples/ruby/shapes.rb +6 -6
- data/examples/ruby/text.rb +20 -17
- data/examples/ruby/views.rb +88 -0
- data/examples/ruby/visuals.rb +27 -0
- data/ext/reflex/application.cpp +36 -76
- data/ext/reflex/defs.cpp +8 -0
- data/ext/reflex/defs.h +1 -18
- data/ext/reflex/extconf.rb +16 -8
- data/ext/reflex/key.cpp +39 -43
- data/ext/reflex/native.cpp +6 -4
- data/ext/reflex/points.cpp +48 -52
- data/ext/reflex/reflex.cpp +12 -13
- data/ext/reflex/view.cpp +260 -0
- data/ext/reflex/window.cpp +89 -178
- data/include/reflex/application.h +14 -7
- data/include/reflex/defs.h +8 -6
- data/include/reflex/exception.h +1 -1
- data/include/reflex/ruby/application.h +31 -10
- data/include/reflex/ruby/key.h +3 -3
- data/include/reflex/ruby/points.h +3 -3
- data/include/reflex/ruby/view.h +106 -0
- data/include/reflex/ruby/window.h +83 -12
- data/include/reflex/ruby.h +3 -2
- data/include/reflex/view.h +103 -0
- data/include/reflex/window.h +43 -18
- data/include/reflex.h +2 -1
- data/lib/reflex/application.rb +8 -7
- data/lib/reflex/autoinit.rb +1 -1
- data/lib/reflex/bitmap.rb +13 -0
- data/lib/reflex/bounds.rb +2 -122
- data/lib/reflex/ext.rb +5 -0
- data/lib/reflex/helpers.rb +36 -31
- data/lib/reflex/image.rb +13 -0
- data/lib/reflex/module.rb +9 -2
- data/lib/reflex/painter.rb +13 -0
- data/lib/reflex/point.rb +3 -59
- data/lib/reflex/reflex.rb +1 -1
- data/lib/reflex/texture.rb +13 -0
- data/lib/reflex/view.rb +33 -0
- data/lib/reflex/visuals/string.rb +53 -0
- data/lib/reflex/window.rb +18 -43
- data/lib/reflex.rb +3 -3
- data/reflex.gemspec +16 -42
- data/src/cocoa/application.mm +17 -23
- data/src/cocoa/applicationdata.h +3 -9
- data/src/cocoa/cocoaapplication.h +6 -4
- data/src/cocoa/cocoaapplication.mm +61 -19
- data/src/cocoa/cocoawindow.h +7 -5
- data/src/cocoa/cocoawindow.mm +109 -50
- data/src/cocoa/defs.mm +5 -2
- data/src/cocoa/window.mm +71 -41
- data/src/cocoa/windowdata.h +14 -9
- data/src/defs.cpp +1 -1
- data/src/exception.cpp +3 -18
- data/src/helpers.h +12 -0
- data/src/reflex.cpp +11 -5
- data/src/view.cpp +326 -0
- data/src/win32/application.cpp +7 -8
- data/src/win32/defs.h +1 -1
- data/src/win32/window.cpp +137 -41
- data/src/window.cpp +38 -1
- data/test/helpers.rb +2 -5
- data/test/test_application.rb +17 -0
- data/test/test_reflex.rb +4 -2
- data/test/test_view.rb +74 -0
- data/test/test_window.rb +33 -2
- metadata +157 -97
- data/include/reflex/helpers.h +0 -32
- data/test/test_bounds.rb +0 -163
- data/test/test_point.rb +0 -81
data/src/win32/window.cpp
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
#include "reflex/window.h"
|
2
2
|
|
3
3
|
|
4
|
+
#define NOMINMAX
|
4
5
|
#include <windows.h>
|
5
6
|
#include <boost/shared_ptr.hpp>
|
6
7
|
#include <boost/scoped_array.hpp>
|
8
|
+
#include <rays/painter.h>
|
7
9
|
#include "reflex/reflex.h"
|
10
|
+
#include "reflex/view.h"
|
8
11
|
#include "opengl.h"
|
9
12
|
|
10
13
|
|
@@ -21,11 +24,52 @@ namespace Reflex
|
|
21
24
|
|
22
25
|
int hidecount;
|
23
26
|
|
27
|
+
bool redraw;
|
28
|
+
|
29
|
+
Painter painter;
|
30
|
+
|
31
|
+
View::Ref root;
|
32
|
+
|
33
|
+
String title_tmp;
|
34
|
+
|
24
35
|
OpenGL opengl;
|
25
36
|
|
26
37
|
Data ()
|
27
|
-
: this_(NULL), hwnd(NULL), hidecount(1)
|
38
|
+
: this_(NULL), hwnd(NULL), hidecount(1), redraw(true), root(new View)
|
39
|
+
{
|
40
|
+
root->set_name("root");
|
41
|
+
}
|
42
|
+
|
43
|
+
~Data ()
|
44
|
+
{
|
45
|
+
unbind();
|
46
|
+
}
|
47
|
+
|
48
|
+
void bind_reflex (Window* obj)
|
49
|
+
{
|
50
|
+
if (!obj) return;
|
51
|
+
|
52
|
+
this_ = obj;
|
53
|
+
}
|
54
|
+
|
55
|
+
void unbind_reflex ()
|
56
|
+
{
|
57
|
+
this_ = NULL;
|
58
|
+
}
|
59
|
+
|
60
|
+
void unbind ()
|
61
|
+
{
|
62
|
+
unbind_reflex();
|
63
|
+
}
|
64
|
+
|
65
|
+
operator bool () const
|
66
|
+
{
|
67
|
+
return this_ && hwnd && IsWindow(hwnd);
|
68
|
+
}
|
69
|
+
|
70
|
+
bool operator ! () const
|
28
71
|
{
|
72
|
+
return !operator bool();
|
29
73
|
}
|
30
74
|
|
31
75
|
};// Window::Data
|
@@ -198,7 +242,7 @@ namespace Reflex
|
|
198
242
|
case WM_TIMER:
|
199
243
|
{
|
200
244
|
if (wp == UPDATE_TIMER_ID)
|
201
|
-
win->update();
|
245
|
+
win->update(1);
|
202
246
|
return 0;
|
203
247
|
}
|
204
248
|
|
@@ -291,24 +335,18 @@ namespace Reflex
|
|
291
335
|
|
292
336
|
Window::Window ()
|
293
337
|
{
|
294
|
-
self->
|
338
|
+
self->bind_reflex(this);
|
295
339
|
|
296
340
|
create_window(this);
|
341
|
+
|
342
|
+
self->painter.canvas(0, 0, 1, 1);
|
297
343
|
}
|
298
344
|
|
299
345
|
Window::~Window ()
|
300
346
|
{
|
301
347
|
close();
|
302
|
-
self->this_ = NULL;
|
303
|
-
}
|
304
|
-
|
305
|
-
bool
|
306
|
-
Window::close ()
|
307
|
-
{
|
308
|
-
if (!self->hwnd || !IsWindow(self->hwnd))
|
309
|
-
return false;
|
310
348
|
|
311
|
-
|
349
|
+
self->unbind_reflex();
|
312
350
|
}
|
313
351
|
|
314
352
|
static bool
|
@@ -361,11 +399,12 @@ namespace Reflex
|
|
361
399
|
}
|
362
400
|
|
363
401
|
bool
|
364
|
-
Window::
|
402
|
+
Window::close ()
|
365
403
|
{
|
366
|
-
if (
|
404
|
+
if (!self->hwnd || !IsWindow(self->hwnd))
|
405
|
+
return false;
|
367
406
|
|
368
|
-
return self->
|
407
|
+
return DestroyWindow(self->hwnd) != FALSE;
|
369
408
|
}
|
370
409
|
|
371
410
|
bool
|
@@ -374,6 +413,9 @@ namespace Reflex
|
|
374
413
|
if (!*this) return false;
|
375
414
|
|
376
415
|
#if 1
|
416
|
+
self->redraw = true;
|
417
|
+
return true;
|
418
|
+
#elif 1
|
377
419
|
InvalidateRect(self->hwnd, NULL, FALSE);
|
378
420
|
return true;
|
379
421
|
#else
|
@@ -383,45 +425,66 @@ namespace Reflex
|
|
383
425
|
}
|
384
426
|
|
385
427
|
bool
|
386
|
-
Window::
|
428
|
+
Window::set_title (const char* title)
|
387
429
|
{
|
388
430
|
if (!*this || !title) return false;
|
389
431
|
|
390
|
-
|
432
|
+
return SetWindowText(self->hwnd, title) != FALSE;
|
433
|
+
}
|
434
|
+
|
435
|
+
const char*
|
436
|
+
Window::title () const
|
437
|
+
{
|
438
|
+
if (!*this) return "";
|
391
439
|
|
392
440
|
int size = GetWindowTextLength(self->hwnd);
|
393
|
-
if (size <= 0) return
|
441
|
+
if (size <= 0) return "";
|
394
442
|
|
395
443
|
boost::scoped_array<char> buf(new char[size + 1]);
|
396
444
|
if (GetWindowText(self->hwnd, &buf[0], size + 1) != size)
|
397
|
-
return
|
445
|
+
return "";
|
398
446
|
|
399
|
-
|
400
|
-
return
|
401
|
-
}
|
402
|
-
|
403
|
-
bool
|
404
|
-
Window::set_title (const char* title)
|
405
|
-
{
|
406
|
-
if (!*this || !title) return false;
|
407
|
-
|
408
|
-
return SetWindowText(self->hwnd, title) != FALSE;
|
447
|
+
self->title_tmp = &buf[0];
|
448
|
+
return self->title_tmp.c_str();
|
409
449
|
}
|
410
450
|
|
411
|
-
bool
|
412
|
-
|
451
|
+
static bool
|
452
|
+
get_window_bounds (
|
453
|
+
HWND hwnd, coord* x, coord* y, coord* width, coord* height,
|
454
|
+
coord* nonclient_width = NULL, coord* nonclient_height = NULL)
|
413
455
|
{
|
414
|
-
if (
|
456
|
+
if (
|
457
|
+
!hwnd ||
|
458
|
+
(!x && !y && !width && !height) ||
|
459
|
+
!!nonclient_width != !!nonclient_height)
|
460
|
+
{
|
415
461
|
return false;
|
462
|
+
}
|
416
463
|
|
417
|
-
RECT
|
418
|
-
if (
|
464
|
+
RECT window, client;
|
465
|
+
if (
|
466
|
+
!GetWindowRect(hwnd, &window) ||
|
467
|
+
!GetClientRect(hwnd, &client))
|
468
|
+
{
|
419
469
|
return false;
|
470
|
+
}
|
471
|
+
|
472
|
+
if (x) *x = window.left;
|
473
|
+
if (y) *y = window.top;
|
474
|
+
if (width) *width = client.right - client.left;
|
475
|
+
if (height) *height = client.bottom - client.top;
|
476
|
+
|
477
|
+
if (nonclient_width || nonclient_height)
|
478
|
+
{
|
479
|
+
coord ww = window.right - window.left;
|
480
|
+
coord wh = window.bottom - window.top;
|
481
|
+
coord cw = client.right - client.left;
|
482
|
+
coord ch = client.bottom - client.top;
|
483
|
+
|
484
|
+
*nonclient_width = ww - cw;
|
485
|
+
*nonclient_height = wh - ch;
|
486
|
+
}
|
420
487
|
|
421
|
-
if (x) *x = rect.left;
|
422
|
-
if (y) *y = rect.top;
|
423
|
-
if (width) *width = rect.right - rect.left + 1;
|
424
|
-
if (height) *height = rect.bottom - rect.top + 1;
|
425
488
|
return true;
|
426
489
|
}
|
427
490
|
|
@@ -430,9 +493,16 @@ namespace Reflex
|
|
430
493
|
{
|
431
494
|
if (!*this) return false;
|
432
495
|
|
433
|
-
coord xx, yy, ww, hh;
|
434
|
-
if (
|
496
|
+
coord xx, yy, ww, hh, nonclient_w, nonclient_h;
|
497
|
+
if (
|
498
|
+
!get_window_bounds(
|
499
|
+
self->hwnd, &xx, &yy, &ww, &hh, &nonclient_w, &nonclient_h))
|
500
|
+
{
|
435
501
|
return false;
|
502
|
+
}
|
503
|
+
|
504
|
+
width += nonclient_w;
|
505
|
+
height += nonclient_h;
|
436
506
|
|
437
507
|
UINT flags = 0;
|
438
508
|
if (x == xx && y == yy) flags |= SWP_NOMOVE;
|
@@ -445,9 +515,35 @@ namespace Reflex
|
|
445
515
|
flags | SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
446
516
|
}
|
447
517
|
|
518
|
+
bool
|
519
|
+
Window::get_bounds (coord* x, coord* y, coord* width, coord* height)
|
520
|
+
{
|
521
|
+
return *this && get_window_bounds(self->hwnd, x, y, width, height);
|
522
|
+
}
|
523
|
+
|
524
|
+
bool
|
525
|
+
Window::hidden () const
|
526
|
+
{
|
527
|
+
if (!*this) return true;
|
528
|
+
|
529
|
+
return self->hidecount > 0;
|
530
|
+
}
|
531
|
+
|
532
|
+
View*
|
533
|
+
Window::root ()
|
534
|
+
{
|
535
|
+
return self->root.get();
|
536
|
+
}
|
537
|
+
|
538
|
+
Painter*
|
539
|
+
Window::painter ()
|
540
|
+
{
|
541
|
+
return &self->painter;
|
542
|
+
}
|
543
|
+
|
448
544
|
Window::operator bool () const
|
449
545
|
{
|
450
|
-
return self && self
|
546
|
+
return self && *self;
|
451
547
|
}
|
452
548
|
|
453
549
|
|
data/src/window.cpp
CHANGED
@@ -1,18 +1,50 @@
|
|
1
1
|
#include "reflex/window.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <rays/bounds.h>
|
5
|
+
#include <rays/painter.h>
|
6
|
+
#include <reflex/view.h>
|
7
|
+
|
8
|
+
|
4
9
|
namespace Reflex
|
5
10
|
{
|
6
11
|
|
7
12
|
|
13
|
+
void update_view_tree (View* v, float dt);
|
14
|
+
|
15
|
+
void draw_view_tree (View* v, Painter* p, coord left, coord top);
|
16
|
+
|
17
|
+
|
18
|
+
const View*
|
19
|
+
Window::root () const
|
20
|
+
{
|
21
|
+
return const_cast<Window*>(this)->root();
|
22
|
+
}
|
23
|
+
|
24
|
+
const Painter*
|
25
|
+
Window::painter () const
|
26
|
+
{
|
27
|
+
return const_cast<Window*>(this)->painter();
|
28
|
+
}
|
29
|
+
|
8
30
|
void
|
9
|
-
Window::update ()
|
31
|
+
Window::update (float dt)
|
10
32
|
{
|
33
|
+
update_view_tree(root(), dt);
|
11
34
|
}
|
12
35
|
|
13
36
|
void
|
14
37
|
Window::draw ()
|
15
38
|
{
|
39
|
+
Painter* p = painter();
|
40
|
+
if (!p) return;
|
41
|
+
|
42
|
+
View* v = root();
|
43
|
+
if (!v) return;
|
44
|
+
|
45
|
+
if (!p->begin()) return;
|
46
|
+
draw_view_tree(v, p, 0, 0);
|
47
|
+
p->end();
|
16
48
|
}
|
17
49
|
|
18
50
|
void
|
@@ -23,6 +55,11 @@ namespace Reflex
|
|
23
55
|
void
|
24
56
|
Window::resized (coord width, coord height)
|
25
57
|
{
|
58
|
+
Painter* p = painter();
|
59
|
+
if (p) p->canvas(0, 0, width, height);
|
60
|
+
|
61
|
+
View* v = root();
|
62
|
+
if (v) v->set_bounds(0, 0, width, height);
|
26
63
|
}
|
27
64
|
|
28
65
|
void
|
data/test/helpers.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
require 'test/unit'
|
3
2
|
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
$: << File.expand_path(File.join File.dirname(__FILE__), *paths)
|
8
|
-
end
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'test/unit'
|
9
6
|
require 'reflex'
|
10
7
|
|
11
8
|
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
|
6
|
+
|
7
|
+
class TestApplication < Test::Unit::TestCase
|
8
|
+
|
9
|
+
@@app = Reflex::Application.new
|
10
|
+
|
11
|
+
def test_name ()
|
12
|
+
assert_equal '', @@app.name
|
13
|
+
@@app.name = 'AppName'
|
14
|
+
assert_equal 'AppName', @@app.name
|
15
|
+
end
|
16
|
+
|
17
|
+
end# TestApplication
|
data/test/test_reflex.rb
CHANGED
data/test/test_view.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
5
|
+
|
6
|
+
|
7
|
+
class TestView < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def view (*args)
|
10
|
+
Reflex::View.new *args
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_initialize ()
|
14
|
+
assert_equal '', view.name
|
15
|
+
assert_equal 'Test', view(:name => 'Test').name
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_hidden ()
|
19
|
+
v = view
|
20
|
+
assert_equal false, v.hidden
|
21
|
+
v.hide
|
22
|
+
assert_equal true, v.hidden
|
23
|
+
v.show
|
24
|
+
assert_equal false, v.hidden
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_hidden_count ()
|
28
|
+
v = view
|
29
|
+
v.show
|
30
|
+
assert_equal false, v.hidden
|
31
|
+
v.hide
|
32
|
+
assert_equal false, v.hidden
|
33
|
+
v.hide
|
34
|
+
assert_equal true, v.hidden
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_add_child ()
|
38
|
+
assert_raise(ArgumentError) {view.add_child}
|
39
|
+
assert_raise(ArgumentError) {view.add_child nil}
|
40
|
+
assert_raise(ArgumentError) {view.add_child 1}
|
41
|
+
assert_nothing_raised {view.add_child view}
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_remove_child ()
|
45
|
+
assert_raise(ArgumentError) {view.remove_child}
|
46
|
+
assert_raise(ArgumentError) {view.remove_child nil}
|
47
|
+
assert_raise(ArgumentError) {view.remove_child 1}
|
48
|
+
assert_raise(Rucy::NativeError) {view.remove_child view}
|
49
|
+
v = view
|
50
|
+
v.add_child child = view
|
51
|
+
assert_nothing_raised {v.remove_child child}
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_find_child ()
|
55
|
+
v = view
|
56
|
+
v.add_child child = view(:name => :Test)
|
57
|
+
assert_equal child, v.find_child(:Test)
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_parent ()
|
61
|
+
parent, child = view, view
|
62
|
+
parent.add_child child
|
63
|
+
assert_nil parent.parent
|
64
|
+
assert_equal parent, child.parent
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_name ()
|
68
|
+
v = view
|
69
|
+
assert_equal '', v.name
|
70
|
+
v.name = 'Test'
|
71
|
+
assert_equal 'Test', v.name
|
72
|
+
end
|
73
|
+
|
74
|
+
end# TestView
|
data/test/test_window.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
|
3
|
-
|
2
|
+
|
3
|
+
|
4
|
+
require_relative 'helpers'
|
4
5
|
|
5
6
|
|
6
7
|
class TestWindow < Test::Unit::TestCase
|
@@ -36,4 +37,34 @@ class TestWindow < Test::Unit::TestCase
|
|
36
37
|
assert_equal 'test title', @w.title
|
37
38
|
end
|
38
39
|
|
40
|
+
def test_root ()
|
41
|
+
assert_not_nil @w.root
|
42
|
+
assert_nil @w.root.parent
|
43
|
+
assert_equal 'root', @w.root.name
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_window ()
|
47
|
+
assert_equal @w, @w.root.window
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_move ()
|
51
|
+
b = @w.bounds.to_a
|
52
|
+
@w.move_to 100, 100
|
53
|
+
assert_equal [100, 100], @w.bounds.pos.to_a
|
54
|
+
@w.move_by 5, 5
|
55
|
+
assert_equal [105, 105], @w.bounds.pos.to_a
|
56
|
+
@w.move_by -1, -1
|
57
|
+
assert_equal [104, 104], @w.bounds.pos.to_a
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_resize ()
|
61
|
+
b = @w.bounds.to_a
|
62
|
+
@w.resize_to 200, 200
|
63
|
+
assert_equal [200, 200], @w.bounds.size.to_a
|
64
|
+
@w.resize_by 5, 5
|
65
|
+
assert_equal [205, 205], @w.bounds.size.to_a
|
66
|
+
@w.resize_by -1, -1
|
67
|
+
assert_equal [204, 204], @w.bounds.size.to_a
|
68
|
+
end
|
69
|
+
|
39
70
|
end# TestWindow
|