wxruby3 1.2.0 → 1.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/wx/core/enum.rb +22 -5
- data/lib/wx/core/functions.rb +4 -10
- data/lib/wx/doc/animation_ctrl.rb +18 -0
- data/lib/wx/doc/enum.rb +0 -11
- data/lib/wx/keyword_defs.rb +7 -1
- data/lib/wx/version.rb +1 -1
- data/rakelib/lib/core/include/enum.inc +0 -80
- data/rakelib/lib/director/animation_ctrl.rb +5 -0
- data/samples/animate/anitest.rb +284 -0
- data/samples/animate/hourglass.ani +0 -0
- data/samples/animate/throbber.gif +0 -0
- data/samples/animate/throbber_2x.gif +0 -0
- data/samples/animate/tn_anitest.png +0 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c44502717c4bc43863f96c826432224a7cc81063d3768dcffa8a92c7bbead181
|
4
|
+
data.tar.gz: c002fc5f501cba71fa127585102916daca951424e986a265e740e7ca9cbc6e9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdd8149612a7ef5637362c5e27a821afe3cd6f1f03c92c00529ab3df12e427a73af97aa1ffa6f89281e7ff259861aed925f3b737ff49bc7564f92b6369b97550
|
7
|
+
data.tar.gz: dcce12022c263d4b5955b2417ab415460f38e5d0418e0c53d64d677c9c9352de5e1ff3b53a7318066b8e8c0b4ff47bf6fefb27ae194e0955801aac0edf99cd59
|
data/lib/wx/core/enum.rb
CHANGED
@@ -8,6 +8,23 @@
|
|
8
8
|
|
9
9
|
class Wx::Enum
|
10
10
|
|
11
|
+
class << self
|
12
|
+
|
13
|
+
def enumerators
|
14
|
+
self.constants(false).inject({}) do |tbl, cn|
|
15
|
+
cv = self.const_get(cn)
|
16
|
+
tbl[cv.to_i] = cn if self === cv
|
17
|
+
tbl
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def [](enum_name)
|
22
|
+
return self.const_get(enum_name) if self.const_defined?(enum_name)
|
23
|
+
nil
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
11
28
|
def |(other)
|
12
29
|
if other.instance_of?(self.class)
|
13
30
|
self.class.new(to_i | other.to_i)
|
@@ -52,10 +69,10 @@ class Wx::Enum
|
|
52
69
|
return '' if to_i == 0
|
53
70
|
enums = []
|
54
71
|
mask = to_i
|
55
|
-
self.class.
|
56
|
-
if
|
57
|
-
enums <<
|
58
|
-
mask &= ~
|
72
|
+
self.class.enumerators.each_pair do |eval, ename|
|
73
|
+
if eval != 0 && mask.allbits?(eval)
|
74
|
+
enums << ename
|
75
|
+
mask &= ~eval
|
59
76
|
break if mask == 0
|
60
77
|
end
|
61
78
|
end
|
@@ -65,7 +82,7 @@ class Wx::Enum
|
|
65
82
|
private :bitmask_to_s
|
66
83
|
|
67
84
|
def to_s
|
68
|
-
self.class.
|
85
|
+
self.class.enumerators.has_key?(to_i) ? "#{self.class.name}::#{self.class.enumerators[to_i]}" : bitmask_to_s
|
69
86
|
end
|
70
87
|
|
71
88
|
end
|
data/lib/wx/core/functions.rb
CHANGED
@@ -13,20 +13,14 @@ module Wx
|
|
13
13
|
# Allow this to be called with keyword parameters, and avoid
|
14
14
|
# segfaults on OS X with bad params
|
15
15
|
wx_about_box = self.instance_method(:about_box)
|
16
|
-
define_method(:about_box) do | info |
|
17
|
-
# If AboutDialogInfo has no version, it segfaults on OS X 10.5
|
18
|
-
no_version = ArgumentError.new("Must supply a version for AboutDialog")
|
16
|
+
define_method(:about_box) do | info, parent=nil |
|
19
17
|
case info
|
20
18
|
when Wx::AboutDialogInfo
|
21
|
-
unless info.has_version
|
22
|
-
Kernel.raise no_version
|
23
|
-
end
|
24
|
-
|
25
19
|
ab_info = info
|
26
20
|
when Hash
|
27
21
|
ab_info = Wx::AboutDialogInfo.new
|
28
22
|
ab_info.name = info[:name] || 'wxRuby application'
|
29
|
-
ab_info.version = info[:version]
|
23
|
+
ab_info.version = info[:version] if info[:version]
|
30
24
|
|
31
25
|
ab_info.description = info[:description] || ''
|
32
26
|
ab_info.copyright = info[:copyright] || ''
|
@@ -36,7 +30,7 @@ module Wx
|
|
36
30
|
ab_info.artists = info[:artists] || []
|
37
31
|
ab_info.translators = info[:translators] || []
|
38
32
|
if info.key?(:website)
|
39
|
-
ab_info.
|
33
|
+
ab_info.set_web_site(*info[:website])
|
40
34
|
end
|
41
35
|
if info.key?(:icon)
|
42
36
|
ab_info.icon = info[:icon]
|
@@ -46,7 +40,7 @@ module Wx
|
|
46
40
|
Kernel.raise ArgumentError,
|
47
41
|
"Can't use #{info.inspect} for AboutDialogInfo"
|
48
42
|
end
|
49
|
-
wx_about_box.bind(self).call(ab_info)
|
43
|
+
wx_about_box.bind(self).call(ab_info, parent)
|
50
44
|
end
|
51
45
|
end
|
52
46
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# :stopdoc:
|
2
|
+
# This file is automatically generated by the WXRuby3 documentation
|
3
|
+
# generator. Do not alter this file.
|
4
|
+
# :startdoc:
|
5
|
+
|
6
|
+
|
7
|
+
module Wx
|
8
|
+
|
9
|
+
class GenericAnimationCtrl < AnimationCtrl
|
10
|
+
|
11
|
+
# This override of {Wx::AnimationCtrl#play} lets you specify if the animation must loop or not.
|
12
|
+
# @param looped [Boolean] default true
|
13
|
+
# @return [Boolean]
|
14
|
+
def play(looped = true) end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/lib/wx/doc/enum.rb
CHANGED
@@ -100,17 +100,6 @@ module Wx
|
|
100
100
|
# of a bitwise **or** expression is returned matching the mask.
|
101
101
|
def to_s; end
|
102
102
|
|
103
|
-
# Create a new class and associated enum values.
|
104
|
-
# @param [String,Symbol] name name of new enum class
|
105
|
-
# @param [Hash] enum_values hash with enum value name and enum integer value pairs
|
106
|
-
# @return [Class] new enum class
|
107
|
-
def self.create(name, enum_values) end
|
108
|
-
|
109
|
-
# Returns enum class matching name or nil.
|
110
|
-
# @param [String,Symbol] name name of enum class
|
111
|
-
# @return [Class,nil] enum class
|
112
|
-
def self.[](name) end
|
113
|
-
|
114
103
|
end
|
115
104
|
|
116
105
|
end
|
data/lib/wx/keyword_defs.rb
CHANGED
@@ -530,7 +530,13 @@ Wx::define_keyword_ctors(Wx::SearchCtrl) do
|
|
530
530
|
end
|
531
531
|
|
532
532
|
Wx::define_keyword_ctors(Wx::AnimationCtrl) do
|
533
|
-
wx_ctor_params :id, :anim
|
533
|
+
wx_ctor_params :id, :anim => Wx::NULL_ANIMATION
|
534
|
+
wx_ctor_params :pos, :size, :style => Wx::AC_DEFAULT_STYLE
|
535
|
+
wx_ctor_params :name => Wx::ANIMATION_CTRL_NAME_STR
|
536
|
+
end
|
537
|
+
|
538
|
+
Wx::define_keyword_ctors(Wx::GenericAnimationCtrl) do
|
539
|
+
wx_ctor_params :id, :anim => Wx::NULL_ANIMATION
|
534
540
|
wx_ctor_params :pos, :size, :style => Wx::AC_DEFAULT_STYLE
|
535
541
|
wx_ctor_params :name => Wx::ANIMATION_CTRL_NAME_STR
|
536
542
|
end
|
data/lib/wx/version.rb
CHANGED
@@ -16,7 +16,6 @@ static const char * __iv_Enum_sc_enums = "@enums";
|
|
16
16
|
|
17
17
|
// instance variables for derived Enum class singleton classes
|
18
18
|
static const char * __iv_enum_klass_values = "@values"; // hash map of all value instances of derived Enum (by integer value)
|
19
|
-
static const char * __iv_enum_klass_values_by_name = "@values_by_name"; // hash map of all value instances of derived Enum
|
20
19
|
static const char * __iv_enum_klass_name = "@name"; // unscoped name of derived Enum
|
21
20
|
|
22
21
|
static VALUE wx_Enum_initialize(int argc, VALUE *argv, VALUE self)
|
@@ -149,55 +148,10 @@ static VALUE wx_Enum_to_int(int argc, VALUE *argv, VALUE self)
|
|
149
148
|
return rb_iv_get(self, __iv_cEnum_value);
|
150
149
|
}
|
151
150
|
|
152
|
-
static VALUE wx_Enum_sc_get_enum_class(int argc, VALUE *argv, VALUE self)
|
153
|
-
{
|
154
|
-
if ((argc < 1) || (argc > 1))
|
155
|
-
{
|
156
|
-
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)", argc); return Qnil;
|
157
|
-
}
|
158
|
-
return rb_hash_aref(rb_iv_get(cEnum_Singleton, __iv_Enum_sc_enums), rb_to_symbol(argv[0]));
|
159
|
-
}
|
160
|
-
|
161
|
-
static VALUE wx_Enum_sc_create_enum_class(int argc, VALUE *argv, VALUE self)
|
162
|
-
{
|
163
|
-
if ((argc < 2) || (argc > 2))
|
164
|
-
{
|
165
|
-
rb_raise(rb_eArgError, "wrong # of arguments(%d for 2)", argc); return Qnil;
|
166
|
-
}
|
167
|
-
VALUE enum_name = rb_to_symbol(argv[0]);
|
168
|
-
if (TYPE(argv[1]) != T_HASH)
|
169
|
-
{
|
170
|
-
VALUE str = rb_inspect(argv[1]);
|
171
|
-
rb_raise(rb_eArgError,
|
172
|
-
"Invalid enum_values; expected Hash but got %s.",
|
173
|
-
StringValuePtr(str));
|
174
|
-
return Qnil;
|
175
|
-
}
|
176
|
-
ID id_new = rb_intern("new");
|
177
|
-
ID id_to_i = rb_intern("to_i");
|
178
|
-
ID id_const_set = rb_intern("const_set");
|
179
|
-
VALUE enum_klass = rb_funcall(rb_cClass, id_new, 1, cWxEnum, 0);
|
180
|
-
VALUE enum_singleton_klass = rb_funcall(enum_klass, rb_intern("singleton_class"), 0, 0);
|
181
|
-
VALUE enum_values = rb_funcall(argv[1], rb_intern("keys"), 0, 0);
|
182
|
-
for (int i=0; i<RARRAY_LEN(enum_values) ;++i)
|
183
|
-
{
|
184
|
-
VALUE enum_value_name = rb_ary_entry(enum_values, i);
|
185
|
-
VALUE enum_value_num = rb_funcall(rb_hash_aref(argv[1], enum_value_name), id_to_i, 0, 0);
|
186
|
-
VALUE enum_value = rb_funcall(enum_klass, id_new, 1, enum_value_num, 0);
|
187
|
-
rb_funcall(enum_klass, id_const_set, 2, enum_value_name, enum_value, 0);
|
188
|
-
rb_hash_aset(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values), enum_value_num, enum_value);
|
189
|
-
rb_hash_aset(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values_by_name), rb_to_symbol(enum_value_name), enum_value);
|
190
|
-
}
|
191
|
-
rb_hash_aset(rb_iv_get(cEnum_Singleton, __iv_Enum_sc_enums), enum_name, enum_klass);
|
192
|
-
return enum_klass;
|
193
|
-
}
|
194
|
-
|
195
151
|
static void wx_setup_Enum_singleton_class()
|
196
152
|
{
|
197
153
|
cEnum_Singleton = rb_funcall(cWxEnum, rb_intern("singleton_class"), 0, 0);
|
198
154
|
rb_iv_set(cEnum_Singleton, __iv_Enum_sc_enums, rb_hash_new());
|
199
|
-
rb_define_method(cEnum_Singleton, "create", VALUEFUNC(wx_Enum_sc_create_enum_class), -1);
|
200
|
-
rb_define_singleton_method(cWxEnum, "[]", VALUEFUNC(wx_Enum_sc_get_enum_class), -1);
|
201
155
|
}
|
202
156
|
|
203
157
|
static void wx_define_Enum_class()
|
@@ -223,44 +177,11 @@ WXRB_EXPORT_FLAG VALUE wxRuby_GetEnumClass(const char* enum_class_name_cstr)
|
|
223
177
|
return rb_hash_aref(enum_hash, rb_str_new2(enum_class_name_cstr));
|
224
178
|
}
|
225
179
|
|
226
|
-
static VALUE wx_Enum_sc_get_enum_value(int argc, VALUE *argv, VALUE self)
|
227
|
-
{
|
228
|
-
if ((argc < 1) || (argc > 1))
|
229
|
-
{
|
230
|
-
rb_raise(rb_eArgError, "wrong # of arguments(%d for 1)", argc); return Qnil;
|
231
|
-
}
|
232
|
-
VALUE enum_singleton_klass = rb_funcall(self, rb_intern("singleton_class"), 0, 0);
|
233
|
-
return rb_hash_aref(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values_by_name), rb_to_symbol(argv[0]));
|
234
|
-
}
|
235
|
-
|
236
|
-
static VALUE wx_Enum_sc_get_enum_values(VALUE self)
|
237
|
-
{
|
238
|
-
VALUE enum_singleton_klass = rb_funcall(self, rb_intern("singleton_class"), 0, 0);
|
239
|
-
return rb_iv_get(enum_singleton_klass, __iv_enum_klass_values);
|
240
|
-
}
|
241
|
-
|
242
|
-
static VALUE wx_Enum_sc_get_enum_values_by_name(VALUE self)
|
243
|
-
{
|
244
|
-
VALUE enum_singleton_klass = rb_funcall(self, rb_intern("singleton_class"), 0, 0);
|
245
|
-
return rb_iv_get(enum_singleton_klass, __iv_enum_klass_values_by_name);
|
246
|
-
}
|
247
|
-
|
248
|
-
static VALUE wx_Enum_sc_get_enum_names_by_value(VALUE self)
|
249
|
-
{
|
250
|
-
VALUE enum_singleton_klass = rb_funcall(self, rb_intern("singleton_class"), 0, 0);
|
251
|
-
return rb_funcall(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values_by_name), rb_intern("invert"), 0);
|
252
|
-
}
|
253
|
-
|
254
180
|
WXRB_EXPORT_FLAG VALUE wxRuby_CreateEnumClass(const char* enum_class_name_cstr)
|
255
181
|
{
|
256
182
|
VALUE enum_klass = rb_funcall(rb_cClass, rb_intern("new"), 1, cWxEnum, 0);
|
257
|
-
rb_define_singleton_method(enum_klass, "[]", VALUEFUNC(wx_Enum_sc_get_enum_value), -1);
|
258
|
-
rb_define_singleton_method(enum_klass, "values", VALUEFUNC(wx_Enum_sc_get_enum_values), 0);
|
259
|
-
rb_define_singleton_method(enum_klass, "values_by_name", VALUEFUNC(wx_Enum_sc_get_enum_values_by_name), 0);
|
260
|
-
rb_define_singleton_method(enum_klass, "names_by_value", VALUEFUNC(wx_Enum_sc_get_enum_names_by_value), 0);
|
261
183
|
VALUE enum_singleton_klass = rb_funcall(enum_klass, rb_intern("singleton_class"), 0, 0);
|
262
184
|
rb_iv_set(enum_singleton_klass, __iv_enum_klass_values, rb_hash_new());
|
263
|
-
rb_iv_set(enum_singleton_klass, __iv_enum_klass_values_by_name, rb_hash_new());
|
264
185
|
rb_iv_set(enum_singleton_klass, __iv_enum_klass_name, rb_str_new2(enum_class_name_cstr));
|
265
186
|
rb_hash_aset(rb_iv_get(cEnum_Singleton, __iv_Enum_sc_enums),
|
266
187
|
ID2SYM(rb_intern(enum_class_name_cstr)),
|
@@ -274,7 +195,6 @@ WXRB_EXPORT_FLAG VALUE wxRuby_AddEnumValue(VALUE enum_klass, const char* enum_va
|
|
274
195
|
VALUE enum_value = rb_funcall(enum_klass, rb_intern("new"), 1, enum_value_num, 0);
|
275
196
|
VALUE enum_singleton_klass = rb_funcall(enum_klass, rb_intern("singleton_class"), 0, 0);
|
276
197
|
rb_hash_aset(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values), enum_value_num, enum_value);
|
277
|
-
rb_hash_aset(rb_iv_get(enum_singleton_klass, __iv_enum_klass_values_by_name), enum_value_name, enum_value);
|
278
198
|
rb_funcall(enum_klass, rb_intern("const_set"), 2, enum_value_name, enum_value, 0);
|
279
199
|
return enum_value;
|
280
200
|
}
|
@@ -18,6 +18,9 @@ module WXRuby3
|
|
18
18
|
|
19
19
|
def setup
|
20
20
|
super
|
21
|
+
spec.items << 'wxGenericAnimationCtrl'
|
22
|
+
spec.include 'wx/animate.h'
|
23
|
+
spec.include 'wx/generic/animate.h'
|
21
24
|
if Config.instance.wx_version >= '3.3.0'
|
22
25
|
spec.items << 'wxAnimationBundle'
|
23
26
|
spec.ignore 'wxAnimationBundle::GetAll', ignore_doc: false
|
@@ -38,6 +41,8 @@ module WXRuby3
|
|
38
41
|
map_out code: ''
|
39
42
|
end
|
40
43
|
end
|
44
|
+
spec.ignore 'wxGenericAnimationCtrl::Play'
|
45
|
+
spec.extend_interface 'wxGenericAnimationCtrl', 'bool Play(bool looped=true)'
|
41
46
|
spec.do_not_generate :variables, :enums, :defines, :functions
|
42
47
|
end
|
43
48
|
end # class AnimationCtrl
|
@@ -0,0 +1,284 @@
|
|
1
|
+
# Copyright (c) 2023 M.J.N. Corino, The Netherlands
|
2
|
+
#
|
3
|
+
# This software is released under the MIT license.
|
4
|
+
#
|
5
|
+
# Adapted for wxRuby from wxWidgets widgets sample
|
6
|
+
# Copyright (c) 2001 Julian Smart
|
7
|
+
|
8
|
+
require 'wx'
|
9
|
+
|
10
|
+
module AniTest
|
11
|
+
|
12
|
+
# Define a new frame
|
13
|
+
class MyFrame < Wx::Frame
|
14
|
+
|
15
|
+
module ID
|
16
|
+
include Wx::IDHelper
|
17
|
+
|
18
|
+
PLAY = self.next_id
|
19
|
+
SET_NULL_ANIMATION = self.next_id
|
20
|
+
SET_INACTIVE_BITMAP = self.next_id
|
21
|
+
SET_NO_AUTO_RESIZE = self.next_id
|
22
|
+
SET_BGCOLOR = self.next_id
|
23
|
+
USE_GENERIC = self.next_id
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def initialize(title)
|
28
|
+
super(nil, :title => title, :size => [500, 400], style: Wx::DEFAULT_FRAME_STYLE)
|
29
|
+
|
30
|
+
set_icon(Wx.Icon(:sample, art_path: File.dirname(__dir__)))
|
31
|
+
|
32
|
+
# Make a menubar
|
33
|
+
file_menu = Wx::Menu.new
|
34
|
+
|
35
|
+
if Wx.has_feature?(:USE_FILEDLG)
|
36
|
+
file_menu.append(Wx::ID_OPEN, "&Open Animation...\tCtrl+O", 'Loads an animation')
|
37
|
+
end # USE_FILEDLG
|
38
|
+
file_menu.append(Wx::ID_EXIT)
|
39
|
+
|
40
|
+
play_menu = Wx::Menu.new
|
41
|
+
play_menu.append(ID::PLAY, "Play\tCtrl+P", "Play the animation")
|
42
|
+
play_menu.append(Wx::ID_STOP, "Stop\tCtrl+S", "Stop the animation")
|
43
|
+
play_menu.append_separator
|
44
|
+
play_menu.append(ID::SET_NULL_ANIMATION, "Set null animation",
|
45
|
+
"Sets the empty animation in the control")
|
46
|
+
play_menu.append_check_item(ID::SET_INACTIVE_BITMAP, "Set inactive bitmap",
|
47
|
+
"Sets an inactive bitmap for the control")
|
48
|
+
play_menu.append_check_item(ID::SET_NO_AUTO_RESIZE, "Set no autoresize",
|
49
|
+
"Tells the control not to resize automatically")
|
50
|
+
play_menu.append(ID::SET_BGCOLOR, "Set background colour...",
|
51
|
+
"Sets the background colour of the control")
|
52
|
+
|
53
|
+
if Wx::PLATFORM == 'WXGTK'
|
54
|
+
play_menu.append_separator
|
55
|
+
play_menu.append_check_item(ID::USE_GENERIC, "Use &generic animation\tCtrl+G",
|
56
|
+
"Selects whether native or generic version is used")
|
57
|
+
end
|
58
|
+
|
59
|
+
help_menu = Wx::Menu.new
|
60
|
+
help_menu.append(Wx::ID_ABOUT)
|
61
|
+
|
62
|
+
menu_bar = Wx::MenuBar.new
|
63
|
+
|
64
|
+
menu_bar.append(file_menu, "&File")
|
65
|
+
menu_bar.append(play_menu, "&Animation")
|
66
|
+
menu_bar.append(help_menu, "&Help")
|
67
|
+
|
68
|
+
# Associate the menu bar with this frame
|
69
|
+
set_menu_bar(menu_bar)
|
70
|
+
|
71
|
+
if Wx.has_feature?(:USE_STATUSBAR)
|
72
|
+
create_status_bar
|
73
|
+
end # USE_STATUSBAR
|
74
|
+
|
75
|
+
# use a Wx::BoxSizer otherwise Wx::Frame will automatically
|
76
|
+
# resize the @animation_ctrl to fill its client area on
|
77
|
+
# user resizes
|
78
|
+
sz = Wx::VBoxSizer.new
|
79
|
+
sz.add(Wx::StaticText.new(self, Wx::ID_ANY, "wxAnimationCtrl:"),
|
80
|
+
Wx::SizerFlags.new.centre.border)
|
81
|
+
|
82
|
+
@animation_ctrl = Wx::AnimationCtrl.new(self, Wx::ID_ANY)
|
83
|
+
|
84
|
+
animations = Wx::AnimationBundle.new
|
85
|
+
|
86
|
+
throbber = Wx::Animation.new(File.join(__dir__, 'throbber.gif'))
|
87
|
+
animations.add(throbber) if throbber.ok?
|
88
|
+
|
89
|
+
throbber2x = Wx::Animation.new(File.join(__dir__, 'throbber_2x.gif'))
|
90
|
+
animations.add(throbber2x) if throbber2x.ok?
|
91
|
+
|
92
|
+
if animations.ok?
|
93
|
+
@animation_ctrl.set_animation(animations)
|
94
|
+
@animation_ctrl.play
|
95
|
+
end
|
96
|
+
|
97
|
+
sz.add(@animation_ctrl, Wx::SizerFlags.new.centre.border)
|
98
|
+
set_sizer(sz)
|
99
|
+
|
100
|
+
evt_menu(ID::PLAY, :on_play)
|
101
|
+
evt_menu(ID::SET_NULL_ANIMATION, :on_set_null_animation)
|
102
|
+
evt_menu(ID::SET_INACTIVE_BITMAP, :on_set_inactive_bitmap)
|
103
|
+
evt_menu(ID::SET_NO_AUTO_RESIZE, :on_set_no_auto_resize)
|
104
|
+
evt_menu(ID::SET_BGCOLOR, :on_set_bg_color)
|
105
|
+
if Wx::PLATFORM == 'WXGTK'
|
106
|
+
evt_menu(ID::USE_GENERIC, :on_use_generic)
|
107
|
+
end
|
108
|
+
|
109
|
+
evt_menu(Wx::ID_STOP, :on_stop)
|
110
|
+
evt_menu(Wx::ID_ABOUT, :on_about)
|
111
|
+
evt_menu(Wx::ID_EXIT, :on_quit)
|
112
|
+
if Wx.has_feature?(:USE_FILEDLG)
|
113
|
+
evt_menu(Wx::ID_OPEN, :on_open)
|
114
|
+
end # USE_FILEDLG
|
115
|
+
|
116
|
+
evt_size { self.layout }
|
117
|
+
evt_update_ui(Wx::ID_ANY, :on_update_ui)
|
118
|
+
end
|
119
|
+
|
120
|
+
def on_about(_event)
|
121
|
+
info = Wx::AboutDialogInfo.new
|
122
|
+
info.set_name("Wx::AnimationCtrl and Wx::Animation sample")
|
123
|
+
info.set_description("This sample program demonstrates the usage of Wx::AnimationCtrl")
|
124
|
+
info.set_copyright("(C) 2024 Martin Corino (original (C) 2006 Julian Smart)")
|
125
|
+
|
126
|
+
info.add_developer("Martin Corino")
|
127
|
+
|
128
|
+
Wx.about_box(info, self)
|
129
|
+
end
|
130
|
+
|
131
|
+
def on_quit(_event)
|
132
|
+
close
|
133
|
+
end
|
134
|
+
|
135
|
+
def on_play(_event)
|
136
|
+
Wx.log_error('Invalid animation') unless @animation_ctrl.play
|
137
|
+
end
|
138
|
+
|
139
|
+
def on_set_null_animation(_event)
|
140
|
+
@animation_ctrl.set_animation(Wx::AnimationBundle.new(Wx::NULL_ANIMATION))
|
141
|
+
end
|
142
|
+
|
143
|
+
def on_set_inactive_bitmap(event)
|
144
|
+
if event.checked?
|
145
|
+
# set a dummy bitmap as the inactive bitmap
|
146
|
+
bmp = Wx::ArtProvider.get_bitmap(Wx::ART_MISSING_IMAGE)
|
147
|
+
@animation_ctrl.set_inactive_bitmap(bmp)
|
148
|
+
else
|
149
|
+
@animation_ctrl.set_inactive_bitmap(Wx::NULL_BITMAP)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def on_set_no_auto_resize(event)
|
154
|
+
# recreate the control with the new flag if necessary
|
155
|
+
style = Wx::AC_DEFAULT_STYLE | (event.checked? ? Wx::AC_NO_AUTORESIZE : 0)
|
156
|
+
|
157
|
+
recreate_animation(style) if style != @animation_ctrl.get_window_style
|
158
|
+
end
|
159
|
+
|
160
|
+
def on_set_bg_color(_event)
|
161
|
+
clr = Wx.get_colour_from_user(self, @animation_ctrl.get_background_colour,
|
162
|
+
'Choose the background colour')
|
163
|
+
|
164
|
+
@animation_ctrl.set_background_colour(clr) if clr.ok?
|
165
|
+
end
|
166
|
+
|
167
|
+
def on_stop(_event)
|
168
|
+
@animation_ctrl.stop
|
169
|
+
end
|
170
|
+
|
171
|
+
if Wx::PLATFORM == 'WXGTK'
|
172
|
+
|
173
|
+
def on_use_generic(_event)
|
174
|
+
recreate_animation(@animation_ctrl.get_window_style)
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
def on_update_ui(_event)
|
180
|
+
get_menu_bar.find_item(Wx::ID_STOP).first.enable(@animation_ctrl.playing?)
|
181
|
+
get_menu_bar.find_item(ID::PLAY).first.enable(!@animation_ctrl.playing?)
|
182
|
+
get_menu_bar.find_item(ID::SET_NO_AUTO_RESIZE).first.enable(!@animation_ctrl.playing?)
|
183
|
+
end
|
184
|
+
|
185
|
+
if Wx.has_feature?(:USE_FILEDLG)
|
186
|
+
|
187
|
+
def on_open(_event)
|
188
|
+
Wx.FileDialog(self, "Please choose an animation", '', '', '*.gif;*.ani', Wx::FD_OPEN) do |dialog|
|
189
|
+
if dialog.show_modal == Wx::ID_OK
|
190
|
+
filename = dialog.get_path
|
191
|
+
|
192
|
+
temp = @animation_ctrl.create_animation
|
193
|
+
unless temp.load_file(filename)
|
194
|
+
Wx.log_error("Sorry, this animation is not a valid format for Wx::Animation.")
|
195
|
+
return
|
196
|
+
end
|
197
|
+
|
198
|
+
@animation_ctrl.set_animation(Wx::AnimationBundle.new(temp))
|
199
|
+
@animation_ctrl.play
|
200
|
+
|
201
|
+
get_sizer.layout
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
end # USE_FILEDLG
|
207
|
+
|
208
|
+
private
|
209
|
+
|
210
|
+
def recreate_animation(style)
|
211
|
+
# save status of the control before destroying it
|
212
|
+
|
213
|
+
# We can't reuse the existing animation if we're switching from native to
|
214
|
+
# generic control or vice versa (as indicated by the absence of change in
|
215
|
+
# the style, which is the only other reason we can get called). We could
|
216
|
+
# save the file name we loaded it from and recreate it, of course, but for
|
217
|
+
# now, for simplicity, just start without any animation in this case.
|
218
|
+
curr = Wx::Animation.new
|
219
|
+
if Wx::PLATFORM == 'WXGTK'
|
220
|
+
curr = @animation_ctrl.get_animation if style != @animation_ctrl.get_window_style
|
221
|
+
end
|
222
|
+
|
223
|
+
inactive = @animation_ctrl.get_inactive_bitmap
|
224
|
+
bg = @animation_ctrl.get_background_colour
|
225
|
+
|
226
|
+
# destroy & rebuild
|
227
|
+
old = @animation_ctrl
|
228
|
+
|
229
|
+
if Wx::PLATFORM == 'WXGTK' && get_menu_bar.is_checked(ID::USE_GENERIC)
|
230
|
+
@animation_ctrl = Wx::GenericAnimationCtrl.new(self, Wx::ID_ANY, curr, style: style)
|
231
|
+
else
|
232
|
+
@animation_ctrl = Wx::AnimationCtrl.new(self, Wx::ID_ANY, curr, style: style)
|
233
|
+
end
|
234
|
+
|
235
|
+
get_sizer.replace(old, @animation_ctrl)
|
236
|
+
|
237
|
+
# load old status in new control
|
238
|
+
@animation_ctrl.set_inactive_bitmap(inactive)
|
239
|
+
@animation_ctrl.set_background_colour(bg)
|
240
|
+
|
241
|
+
get_sizer.layout
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
245
|
+
|
246
|
+
|
247
|
+
class App < Wx::App
|
248
|
+
|
249
|
+
# this one is called on application startup and is a good place for the app
|
250
|
+
# initialization (doing it here and not in the ctor allows to have an error
|
251
|
+
# return: if OnInit() returns false, the application terminates)
|
252
|
+
def on_init
|
253
|
+
# Create the main frame window
|
254
|
+
frame = MyFrame.new('Animation Demo')
|
255
|
+
frame.show
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
end
|
261
|
+
|
262
|
+
module AniTestSample
|
263
|
+
|
264
|
+
include WxRuby::Sample if defined? WxRuby::Sample
|
265
|
+
|
266
|
+
def self.describe
|
267
|
+
{ file: __FILE__,
|
268
|
+
summary: 'wxRuby AnimationCtrl example.',
|
269
|
+
description: <<~__DESC
|
270
|
+
A Ruby port of the wxWidgets anitest sample which showcases
|
271
|
+
animation controls.
|
272
|
+
__DESC
|
273
|
+
}
|
274
|
+
end
|
275
|
+
|
276
|
+
def self.run
|
277
|
+
execute(__FILE__)
|
278
|
+
end
|
279
|
+
|
280
|
+
if $0 == __FILE__
|
281
|
+
AniTest::App.run
|
282
|
+
end
|
283
|
+
|
284
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wxruby3
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
4
|
+
version: 1.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Corino
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
11
|
+
date: 2024-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -239,6 +239,7 @@ files:
|
|
239
239
|
- lib/wx/core/window.rb
|
240
240
|
- lib/wx/core/window_update_locker.rb
|
241
241
|
- lib/wx/core/xmlresource.rb
|
242
|
+
- lib/wx/doc/animation_ctrl.rb
|
242
243
|
- lib/wx/doc/app.rb
|
243
244
|
- lib/wx/doc/array_ext.rb
|
244
245
|
- lib/wx/doc/art_locator.rb
|
@@ -826,6 +827,11 @@ files:
|
|
826
827
|
- rakelib/yard/yard-relative_markdown_links.rb
|
827
828
|
- rakelib/yard/yard/relative_markdown_links.rb
|
828
829
|
- rakelib/yard/yard/relative_markdown_links/version.rb
|
830
|
+
- samples/animate/anitest.rb
|
831
|
+
- samples/animate/hourglass.ani
|
832
|
+
- samples/animate/throbber.gif
|
833
|
+
- samples/animate/throbber_2x.gif
|
834
|
+
- samples/animate/tn_anitest.png
|
829
835
|
- samples/art/wxruby-128x128.png
|
830
836
|
- samples/art/wxruby-256x256.png
|
831
837
|
- samples/art/wxruby-64x64.png
|