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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4bac7565182a0ae6badaee56d7b323459bdc2b198281a50639fafd6fcb2d2499
4
- data.tar.gz: 5dc08857adaf213871ec7fce09117bac4cc19f00cac50638de552dc2219ea803
3
+ metadata.gz: c44502717c4bc43863f96c826432224a7cc81063d3768dcffa8a92c7bbead181
4
+ data.tar.gz: c002fc5f501cba71fa127585102916daca951424e986a265e740e7ca9cbc6e9e
5
5
  SHA512:
6
- metadata.gz: cbd4920bcc8ae2085ed85b49ee218642c1eb8a58c6bae7132fd653f479e5af6a60c716f61a9ad38bfdcc5cdc1e3560eb4152365127414bf0c401f266b39228c9
7
- data.tar.gz: 60bba874185fe173a83d8878e458721a3f3fe58cbf484be2826c100a6009dff062972af7ecbaa9bc7dd3095d100aafdf326ac2dd994e1e50e7939654673d2466
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.values.each_value do |enum|
56
- if enum != 0 && mask.allbits?(enum)
57
- enums << enum.to_s
58
- mask &= ~enum
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.values.has_key?(to_i) ? "#{self.class.name}::#{self.class.names_by_value[self]}" : bitmask_to_s
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
@@ -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] || Kernel.raise(no_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.set_website(*info[:website])
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
@@ -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
@@ -3,5 +3,5 @@
3
3
  # This software is released under the MIT license.
4
4
 
5
5
  module Wx
6
- WXRUBY_VERSION = '1.2.0'
6
+ WXRUBY_VERSION = '1.2.1'
7
7
  end
@@ -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.0
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-10 00:00:00.000000000 Z
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