wxruby3 1.2.0 → 1.2.1
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/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
|