reflexion 0.1.3 → 0.1.4
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.
- 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
|