wx_sugar 0.1.16 → 0.1.17

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/lib/wx_sugar/all.rb CHANGED
@@ -1,5 +1,5 @@
1
- %w[ accessors delayed_constructors event_connector
2
- keyword_constructors layout menu wx_classes ].each do | ext_feature |
1
+ %w[ delayed_constructors event_connector
2
+ layout menu wx_classes ].each do | ext_feature |
3
3
  require 'wx_sugar/' + ext_feature
4
4
  end
5
5
 
@@ -1,3 +1,3 @@
1
1
  module WxSugar
2
- VERSION = '0.1.16'
2
+ VERSION = '0.1.17'
3
3
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: wx_sugar
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.1.16
7
- date: 2007-08-24 00:00:00 +01:00
6
+ version: 0.1.17
7
+ date: 2007-09-11 00:00:00 +01:00
8
8
  summary: Syntax extensions for WxRuby.
9
9
  require_paths:
10
10
  - lib
@@ -35,20 +35,16 @@ files:
35
35
  - lib/wx_sugar/layout.rb
36
36
  - lib/wx_sugar/delayed_constructors.rb
37
37
  - lib/wx_sugar/class_definitions.rb
38
- - lib/wx_sugar/keyword_classes.rb
39
38
  - lib/wx_sugar/enumerable_controls.rb
40
39
  - lib/wx_sugar/menu.rb
41
- - lib/wx_sugar/accessors.rb
42
40
  - lib/wx_sugar/all.rb
43
41
  - lib/wx_sugar/itemdata.rb
44
42
  - lib/wx_sugar/event_connector.rb
45
43
  - lib/wx_sugar/wx_classes.rb
46
- - lib/wx_sugar/keyword_constructors.rb
47
44
  - lib/wx_sugar/version.rb
48
45
  - lib/wx_sugar/wx_classes/listctrl.rb
49
46
  - lib/wx_sugar/wx_classes/colour.rb
50
47
  - lib/wx_sugar/wx_classes/position.rb
51
- - lib/wx_sugar/wx_classes/treectrl.rb
52
48
  - lib/wx_sugar/wx_classes/window.rb
53
49
  - lib/wx_sugar/wx_classes/size.rb
54
50
  - lib/wx_sugar/wx_classes/control_with_items.rb
@@ -1,66 +0,0 @@
1
- # = WxSugar - Accessors
2
- #
3
- # The default WxRuby interface has lots and lots of methods like
4
- #
5
- # * get_position()
6
- # * set_size(a_size)
7
- # * is_checked()
8
- #
9
- # and so on. Methods that retrieve set, or query attributes of an object
10
- # are more normally in Ruby called simply by the attribute name:
11
- #
12
- # * position()
13
- # * size = a_size
14
- # * checked?
15
- #
16
- # This extension creates an alias for every WxRuby instance method that
17
- # begins with +get_+, +set_+ or +is_+. Note that if you are calling a
18
- # 'setter' method on self, you must explicitly send the message to self:
19
- #
20
- # # set's self size to be 100px by 100px
21
- # self.size = Wx::Size.new(100, 100)
22
- # # only sets the value of a local variable 'size'
23
- # size = Wx::Size.new
24
-
25
- require 'wx_sugar/class_definitions.rb'
26
-
27
- module NiceRubyMethodNames
28
- def self.included(klass)
29
- klass.class_eval do
30
- instance_methods.grep(/^([gs]et|is)_(\w+)/) do | meth |
31
- prefix, basename = $1, $2
32
- case prefix
33
- when 'get' : alias_method(basename, meth)
34
- when 'set' : alias_method("#{basename}=", meth)
35
- when 'is' : alias_method("#{basename}?", meth)
36
- end
37
- end
38
- end
39
- end
40
- end
41
-
42
- module MethMissingNiceRubyNames
43
- def method_missing(sym, *args)
44
- case sym.to_s
45
- when /^(.*)\=$/
46
- meth = "set_#{$1}"
47
- when /^(.*)\?$/
48
- meth = "is_#{$1}"
49
- else
50
- meth = "get_#{sym}"
51
- end
52
- if respond_to?(meth)
53
- send(meth, *args)
54
- else
55
- e = NoMethodError.new("undefined method '#{sym}' for #{self.inspect}")
56
- e.set_backtrace(caller)
57
- Kernel.raise e
58
- end
59
- end
60
- end
61
-
62
-
63
- WxSugar::ALL_CLASSES.each do | klass |
64
- # klass.class_eval { include NiceRubyMethodNames }
65
- klass.class_eval { include MethMissingNiceRubyNames }
66
- end
@@ -1,443 +0,0 @@
1
- # = WxSugar - Keyword Constructors Classes
2
- #
3
- # This extension defines the keyword parameters for +new+ methods for
4
- # widgets, windows and frames. It's for use with *Keyword Constructors*
5
- # and is no use on its own - except if you are looking for a bug or want
6
- # to add a missing class.
7
-
8
- module WxSugar
9
- @defined_classes = {}
10
-
11
- # accepts a string unadorned name of a WxWidgets class, and block, which
12
- # defines the constructor parameters and style flags for that class.
13
- # If the named class exists in the available WxRuby, the block is run and
14
- # the class may use keyword constructors. If the class is not available, the
15
- # block is ignored.
16
- def self.define_keyword_ctors(klass_name, &block)
17
- # check this class hasn't already been defined
18
- if @defined_classes[klass_name]
19
- raise ArgumentError, "Keyword ctor for #{klass_name} already defined"
20
- else
21
- @defined_classes[klass_name] = true
22
- end
23
-
24
- begin
25
- klass = Wx::const_get(klass_name)
26
- rescue NameError
27
- return nil
28
- end
29
- klass.module_eval { include WxSugar::KeywordConstructor }
30
- # automatically add :id as the first argument, unless this is a
31
- # Dialog subclass - which don't require this argument
32
- unless klass < Wx::Dialog
33
- klass.wx_ctor_params :id
34
- end
35
- klass.instance_eval(&block)
36
- end
37
- end
38
-
39
- # Window : base class for all widgets and frames
40
- WxSugar.define_keyword_ctors('Window') do
41
- wx_ctor_params :pos, :size, :style
42
- wx_ctor_params :name => 'window'
43
- end
44
-
45
-
46
- ### FRAMES
47
-
48
- # wxTopLevelWindow ABSTRACT: Any top level window, dialog or frame
49
-
50
- # Normal frame
51
- WxSugar.define_keyword_ctors('Frame') do
52
- wx_ctor_params :title => ''
53
- wx_ctor_params :pos, :size, :style => Wx::DEFAULT_FRAME_STYLE
54
- wx_ctor_params :name => 'frame'
55
- end
56
-
57
- # MDI child frame
58
- WxSugar.define_keyword_ctors('MDIChildFrame') do
59
- wx_ctor_params :title => ''
60
- wx_ctor_params :pos, :size, :style => Wx::DEFAULT_FRAME_STYLE
61
- wx_ctor_params :name => 'frame'
62
- end
63
-
64
- # MDI parent frame
65
- WxSugar.define_keyword_ctors('MDIParentFrame') do
66
- wx_ctor_params :title => ''
67
- wx_ctor_params :pos, :size
68
- wx_ctor_params :style => Wx::DEFAULT_FRAME_STYLE|Wx::VSCROLL|Wx::HSCROLL
69
- wx_ctor_params :name => 'frame'
70
- end
71
-
72
- # wxMiniFrame A frame with a small title bar
73
- WxSugar.define_keyword_ctors('MiniFrame') do
74
- wx_ctor_params :title => ''
75
- wx_ctor_params :pos, :size
76
- wx_ctor_params :style => Wx::DEFAULT_FRAME_STYLE
77
- wx_ctor_params :name => 'frame'
78
- end
79
-
80
- # wxSplashScreen Splash screen class
81
- # FIXME - this probably won't work at present because the 'parent' arg
82
- # comes in a funny place in this class's ctor
83
- #
84
- # WxSugar.define_keyword_ctors('SplashScreen') do
85
- # wx_ctor_params :bitmap => Wx::NULL_BITMAP
86
- # wx_ctor_params :splashstyle, :milliseconds, :id => 1
87
- # wx_ctor_params :parent => nil
88
- # wx_ctor_params :title => ''
89
- # wx_ctor_params :pos, :size
90
- # wx_ctor_params :style => Wx::SIMPLE_BORDER|Wx::FRAME_NO_TASKBAR|Wx::STAY_ON_TOP
91
- # end
92
-
93
- # wxPropertySheetDialog Property sheet dialog
94
- # wxTipWindow Shows text in a small window
95
-
96
- # wxWizard A wizard dialog
97
- WxSugar.define_keyword_ctors('Wizard') do
98
- wx_ctor_params :title => ''
99
- wx_ctor_params :bitmap => Wx::NULL_BITMAP
100
- wx_ctor_params :pos, :size
101
- wx_ctor_params :style => Wx::DEFAULT_DIALOG_STYLE
102
- end
103
-
104
-
105
- # MISCELLANEOUS WINDOWS
106
-
107
- # A window whose colour changes according to current user settings
108
- WxSugar.define_keyword_ctors('Panel') do
109
- wx_ctor_params :pos, :size, :style => Wx::TAB_TRAVERSAL
110
- wx_ctor_params :name => 'panel'
111
- end
112
-
113
- # wxScrolledWindow Window with automatically managed scrollbars
114
- WxSugar.define_keyword_ctors('ScrolledWindow') do
115
- wx_ctor_params :pos, :size, :style => Wx::VSCROLL|Wx::HSCROLL
116
- wx_ctor_params :name => 'scrolledWindow'
117
- wx_ctor_flags :h_scroll => Wx::HSCROLL,
118
- :v_scroll => Wx::VSCROLL
119
- end
120
-
121
- # wxGrid A grid (table) window
122
- WxSugar.define_keyword_ctors('Grid') do
123
- wx_ctor_params :pos, :size, :style => Wx::WANTS_CHARS
124
- wx_ctor_params :name => 'grid'
125
- end
126
-
127
- # Window which can be split vertically or horizontally
128
- WxSugar.define_keyword_ctors('SplitterWindow') do
129
- wx_ctor_params :pos, :size, :style => Wx::SP_3D
130
- wx_ctor_params :name => 'splitterWindow'
131
- end
132
-
133
- # Implements the status bar on a frame
134
- WxSugar.define_keyword_ctors('StatusBar') do
135
- wx_ctor_params :style => Wx::ST_SIZEGRIP
136
- wx_ctor_params :name => 'statusBar'
137
- end
138
-
139
- # Toolbar class
140
- WxSugar.define_keyword_ctors('ToolBar') do
141
- wx_ctor_params :pos, :size, :style => Wx::TB_HORIZONTAL|Wx::NO_BORDER
142
- wx_ctor_params :name => 'toolBar' # not as documented in Wx 2.6.3
143
- end
144
-
145
- # Notebook class
146
- WxSugar.define_keyword_ctors('Notebook') do
147
- wx_ctor_params :pos, :size, :style, :name => 'noteBook'
148
- end
149
-
150
- # Similar to notebook but using list control - undocumented
151
- WxSugar.define_keyword_ctors('Listbook') do
152
- wx_ctor_params :pos, :size, :style, :name => 'listBook'
153
- end
154
-
155
- # Similar to notebook but using choice control
156
- WxSugar.define_keyword_ctors('Choicebook') do
157
- wx_ctor_params :pos, :size, :style, :name => 'choiceBook'
158
- end
159
-
160
- # wxSashWindow: Window with four optional sashes that can be dragged
161
- WxSugar.define_keyword_ctors('SashWindow') do
162
- wx_ctor_params :pos, :size
163
- wx_ctor_params :style => Wx::CLIP_CHILDREN|Wx::SW_3D
164
- wx_ctor_params :name => 'sashWindow'
165
- end
166
-
167
- # wxSashLayoutWindow: Window that can be involved in an IDE-like layout
168
- # arrangement
169
- WxSugar.define_keyword_ctors('SashLayoutWindow') do
170
- wx_ctor_params :pos, :size
171
- wx_ctor_params :style => Wx::CLIP_CHILDREN|Wx::SW_3D
172
- wx_ctor_params :name => 'layoutWindow'
173
- end
174
-
175
- # wxVScrolledWindow: As wxScrolledWindow but supports lines of variable height
176
-
177
- # wxWizardPage: A base class for the page in wizard dialog.
178
- WxSugar.define_keyword_ctors('WizardPage') do
179
- wx_ctor_params :bitmap => Wx::NULL_BITMAP
180
- end
181
-
182
- # wxWizardPageSimple: A page in wizard dialog.
183
- WxSugar.define_keyword_ctors('WizardPageSimple') do
184
- wx_ctor_params :prev, :next, :bitmap => Wx::NULL_BITMAP
185
- end
186
-
187
- ### DIALOGS
188
- # wxDialog Base class for common dialogs
189
- WxSugar.define_keyword_ctors('Dialog') do
190
- wx_ctor_params :title => ''
191
- wx_ctor_params :pos, :size, :style => Wx::DEFAULT_DIALOG_STYLE
192
- wx_ctor_params :name => 'dialogBox'
193
- end
194
-
195
- # wxColourDialog Colour chooser dialog
196
- WxSugar.define_keyword_ctors('ColourDialog') do
197
- wx_ctor_params :colour_data => nil
198
- end
199
-
200
- # wxDirDialog Directory selector dialog
201
- WxSugar.define_keyword_ctors('DirDialog') do
202
- wx_ctor_params :message => 'Choose a directory'
203
- wx_ctor_params :default_path => ''
204
- wx_ctor_params :style, :pos, :size, :name => 'wxDirCtrl'
205
- end
206
-
207
- # wxFileDialog File selector dialog
208
- WxSugar.define_keyword_ctors('FileDialog') do
209
- wx_ctor_params :message => 'Choose a file'
210
- wx_ctor_params :default_dir => ''
211
- wx_ctor_params :default_file => ''
212
- wx_ctor_params :wildcard => '*.*'
213
- wx_ctor_params :style, :pos
214
- end
215
-
216
- # wxFindReplaceDialog Text search/replace dialog
217
- WxSugar.define_keyword_ctors('FindReplaceDialog') do
218
- wx_ctor_params :find_replace_data => Wx::FindReplaceData.new()
219
- wx_ctor_params :title => 'findReplaceDialog'
220
- wx_ctor_params :style
221
- end
222
-
223
- # wxMultiChoiceDialog Dialog to get one or more selections from a list
224
- # wxSingleChoiceDialog Dialog to get a single selection from a list and return the string
225
-
226
- # Dialog to get a single line of text from the user
227
- WxSugar.define_keyword_ctors('TextEntryDialog') do
228
- wx_ctor_params :message => ''
229
- wx_ctor_params :caption => 'Please enter text'
230
- wx_ctor_params :default_value => ''
231
- wx_ctor_params :style => Wx::OK|Wx::CANCEL|Wx::CENTRE
232
- wx_ctor_params :pos
233
- end
234
-
235
- # wxPasswordEntryDialog Dialog to get a password from the user
236
- # WxSugar.define_keyword_ctors('PasswordEntryDialog') do
237
- # wx_ctor_params :message => ''
238
- # wx_ctor_params :caption => 'Enter password'
239
- # wx_ctor_params :default_value => ''
240
- # wx_ctor_params :style => Wx::OK|Wx::CANCEL|Wx::CENTRE
241
- # wx_ctor_params :pos
242
- # end
243
-
244
- # wxFontDialog Font chooser dialog
245
- # wxPageSetupDialog Standard page setup dialog
246
- WxSugar.define_keyword_ctors('PageSetupDialog') do
247
- wx_ctor_params :data
248
- end
249
-
250
- # wxPrintDialog Standard print dialog
251
- WxSugar.define_keyword_ctors('PrintDialog') do
252
- wx_ctor_params :data
253
- end
254
-
255
-
256
- # Simple message box dialog
257
- WxSugar.define_keyword_ctors('MessageDialog') do
258
- wx_ctor_params :message => ''
259
- wx_ctor_params :caption => 'Message box'
260
- wx_ctor_params :style => Wx::OK|Wx::CANCEL
261
- wx_ctor_params :pos
262
- end
263
-
264
- ### CONTROLS
265
-
266
- # Push button control, displaying text
267
- WxSugar.define_keyword_ctors('Button') do
268
- wx_ctor_params :label => ''
269
- wx_ctor_params :pos, :size, :style
270
- wx_ctor_params :validator, :name => 'button'
271
- end
272
-
273
- # Push button control, displaying a bitmap
274
- WxSugar.define_keyword_ctors('BitmapButton') do
275
- wx_ctor_params :bitmap, :pos, :size, :style => Wx::BU_AUTODRAW
276
- wx_ctor_params :validator, :name => 'button'
277
- end
278
-
279
- # A button which stays pressed when clicked by user.
280
- WxSugar.define_keyword_ctors('ToggleButton') do
281
- wx_ctor_params :label, :pos, :size, :style
282
- wx_ctor_params :validator, :name => 'checkBox'
283
- end
284
-
285
- # Control showing an entire calendar month
286
- WxSugar.define_keyword_ctors('CalendarCtrl') do
287
- wx_ctor_params :date => Time.now()
288
- wx_ctor_params :pos, :size, :style => Wx::CAL_SHOW_HOLIDAYS
289
- wx_ctor_params :name => 'calendar'
290
- end
291
-
292
- # Checkbox control
293
- WxSugar.define_keyword_ctors('CheckBox') do
294
- wx_ctor_params :label => ''
295
- wx_ctor_params :pos, :size, :style
296
- wx_ctor_params :validator, :name => 'checkBox'
297
- end
298
-
299
- # A listbox with a checkbox to the left of each item
300
- WxSugar.define_keyword_ctors('CheckListBox') do
301
- wx_ctor_params :pos, :size, :choices, :style
302
- wx_ctor_params :validator, :name => 'listBox'
303
- end
304
-
305
- # wxChoice Choice control (a combobox without the editable area)
306
- WxSugar.define_keyword_ctors('Choice') do
307
- wx_ctor_params :pos, :size, :choices, :style
308
- wx_ctor_params :validator, :name => 'choice'
309
- end
310
-
311
- # wxComboBox A choice with an editable area
312
- WxSugar.define_keyword_ctors('ComboBox') do
313
- wx_ctor_params :value => ''
314
- wx_ctor_params :pos, :size, :choices => []
315
- wx_ctor_params :style
316
- wx_ctor_params :validator, :name => 'comboBox'
317
- end
318
-
319
- # wxDatePickerCtrl Small date picker control
320
-
321
- # wxGauge A control to represent a varying quantity, such as time
322
- # remaining
323
- WxSugar.define_keyword_ctors('Gauge') do
324
- wx_ctor_params :range, :pos, :size, :style => Wx::GA_HORIZONTAL
325
- wx_ctor_params :validator, :name => 'gauge'
326
- end
327
-
328
- # wxGenericDirCtrl A control for displaying a directory tree
329
- WxSugar.define_keyword_ctors('GenericDirCtrl') do
330
- # TODO :dir => Wx::DIR_DIALOG_DEFAULT_FOLDER_STR
331
- wx_ctor_params :dir => ''
332
- wx_ctor_params :pos, :size,
333
- :style => Wx::DIRCTRL_3D_INTERNAL|Wx::SUNKEN_BORDER
334
- wx_ctor_params :filter => ''
335
- wx_ctor_params :default_filter => 0
336
- wx_ctor_params :name => 'genericDirCtrl'
337
- end
338
-
339
-
340
- # wxHtmlListBox A listbox showing HTML content
341
- # wxListBox A list of strings for single or multiple selection
342
- WxSugar.define_keyword_ctors('ListBox') do
343
- wx_ctor_params :pos, :size, :choices => []
344
- wx_ctor_params :style
345
- wx_ctor_params :validator, :name => 'listBox'
346
- end
347
-
348
- # wxListCtrl A control for displaying lists of strings and/or icons, plus a multicolumn report view
349
- WxSugar.define_keyword_ctors('ListCtrl') do
350
- wx_ctor_params :pos, :size, :style => Wx::LC_ICON
351
- wx_ctor_params :validator, :name => 'listCtrl'
352
- end
353
-
354
- # wxListView A simpler interface (facade for wxListCtrl in report mode
355
-
356
- # wxTreeCtrl Tree (hierarchy) control
357
- WxSugar.define_keyword_ctors('TreeCtrl') do
358
- wx_ctor_params :pos, :size, :style => Wx::TR_HAS_BUTTONS
359
- wx_ctor_params :validator, :name => 'treeCtrl'
360
- end
361
-
362
- # wxSpinCtrl A spin control - i.e. spin button and text control
363
- WxSugar.define_keyword_ctors('SpinCtrl') do
364
- wx_ctor_params :value => ''
365
- wx_ctor_params :pos, :size, :style => Wx::SP_ARROW_KEYS
366
- wx_ctor_params :min => 0
367
- wx_ctor_params :max => 100
368
- wx_ctor_params :initial => 0
369
- wx_ctor_params :name => 'spinCtrl'
370
- end
371
-
372
- # One or more lines of non-editable text
373
- WxSugar.define_keyword_ctors('StaticText') do
374
- wx_ctor_params :label, :pos, :size, :style, :name => 'staticText'
375
- end
376
-
377
- WxSugar.define_keyword_ctors('StaticBox') do
378
- wx_ctor_params :label, :pos, :size, :style, :name => 'staticBox'
379
- end
380
-
381
- WxSugar.define_keyword_ctors('StaticLine') do
382
- wx_ctor_params :pos, :size, :style => Wx::LI_HORIZONTAL
383
- wx_ctor_params :name => 'staticBox'
384
- end
385
-
386
- # wxStaticBitmap A control to display a bitmap
387
- WxSugar.define_keyword_ctors('StaticBitmap') do
388
- wx_ctor_params :label, :pos, :size, :style
389
- end
390
-
391
-
392
- # wxRadioBox A group of radio buttons
393
- WxSugar.define_keyword_ctors('RadioBox') do
394
- wx_ctor_params :label => ''
395
- wx_ctor_params :pos, :size, :choices => []
396
- wx_ctor_params :major_dimension => 0
397
- wx_ctor_params :style => Wx::RA_SPECIFY_COLS
398
- wx_ctor_params :validator, :name => 'radioBox'
399
- end
400
-
401
- # wxRadioButton: A round button used with others in a mutually exclusive way
402
- WxSugar.define_keyword_ctors('RadioButton') do
403
- wx_ctor_params :label => ''
404
- wx_ctor_params :pos, :size, :style => 0
405
- wx_ctor_params :validator, :name => 'radioButton'
406
- end
407
-
408
- # wxSlider A slider that can be dragged by the user
409
- WxSugar.define_keyword_ctors('Slider') do
410
- wx_ctor_params :value => 0
411
- wx_ctor_params :min_value, :max_value
412
- wx_ctor_params :pos, :size, :style => Wx::SL_HORIZONTAL
413
- wx_ctor_params :validator, :name => 'slider'
414
- end
415
-
416
- # wxSpinButton - Has two small up and down (or left and right) arrow buttons
417
- WxSugar.define_keyword_ctors('SpinButton') do
418
- wx_ctor_params :pos, :size, :style => Wx::SP_HORIZONTAL
419
- wx_ctor_params :name => 'spinButton'
420
- end
421
-
422
- # wxVListBox A listbox supporting variable height rows
423
-
424
- # wxTextCtrl Single or multiline text editing control
425
- WxSugar.define_keyword_ctors('TextCtrl') do
426
- wx_ctor_params :value => ''
427
- wx_ctor_params :pos, :size, :style
428
- wx_ctor_params :validator, :name => 'textCtrl'
429
- end
430
-
431
- # wxHtmlWindow - Control for displaying HTML
432
- WxSugar.define_keyword_ctors('HtmlWindow') do
433
- wx_ctor_params :pos, :size, :style => Wx::HW_DEFAULT_STYLE
434
- wx_ctor_params :name => 'htmlWindow'
435
- end
436
-
437
- # wxHyperTextCtrl - display a clickable URL
438
- WxSugar.define_keyword_ctors('HyperlinkCtrl') do
439
- wx_ctor_params :label => ''
440
- wx_ctor_params :url => ''
441
- wx_ctor_params :pos, :size, :style => 0
442
- wx_ctor_params :name => 'hyperlink'
443
- end
@@ -1,267 +0,0 @@
1
- # = WxRuby Extensions - Keyword Constructors
2
- #
3
- # The *Keyword Constructors* extension allows the use of Ruby hash-style
4
- # keyword arguments in constructors of common WxWidgets Windows, Frame,
5
- # Dialog and Control classes.
6
- #
7
- # == Introduction
8
- #
9
- # Building a GUI in WxWidgets involves lots of calls to +new+, but
10
- # these methods often have long parameter lists. Often the default
11
- # values for many of these parameters are correct. For example, if
12
- # you're using a sizer-based layout, you usually don't want to specify a
13
- # size for widgets, but you still have to type
14
- #
15
- # Wx::TreeCtrl.new( parent, -1, Wx::DEFAULT_POSITION, Wx::DEFAULT_SIZE,
16
- # Wx::NO_BUTTONS )
17
- #
18
- # just to create a standard TreeCtrl with the 'no buttons' style. If you
19
- # want to specify the 'NO BUTTONS' style, you can't avoid all the typing
20
- # of DEFAULT_POSITION etc.
21
- #
22
- # == Basic Keyword Constructors
23
- #
24
- # With keyword_constructors, you could write the above as
25
- #
26
- # TreeCtrl.new(parent, :style => Wx::NO_BUTTONS)
27
- #
28
- # And it will assume you want the default id (-1), and the default size
29
- # and position. If you want to specify an explicit size, you can do so:
30
- #
31
- # TreeCtrl.new(parent, :size => Wx::Size.new(100, 300))
32
- #
33
- # For brevity, this module also allows you to specify positions and
34
- # sizes using a a two-element array:
35
- #
36
- # TreeCtrl.new(parent, :size => [100, 300])
37
- #
38
- # Similarly with position:
39
- #
40
- # TreeCtrl.new(parent, :pos => Wx::Point.new(5, 25))
41
- #
42
- # TreeCtrl.new(parent, :pos => [5, 25])
43
- #
44
- # You can have multiple keyword arguments:
45
- #
46
- # TreeCtrl.new(parent, :pos => [5, 25], :size => [100, 300] )
47
- #
48
- # == No ID required
49
- #
50
- # As with position and size, you usually don't want to deal with
51
- # assigning unique ids to every widget and frame you create - it's a C++
52
- # hangover that often seems clunky in Ruby. The *Event Connectors*
53
- # extension allows you to set up event handling without having to use
54
- # ids, and if no :id argument is supplied to a constructor, the default
55
- # (-1) will be passed.
56
- #
57
- # There are occasions when a specific ID does need to be used - for
58
- # example, to tell WxWidgets that a button is a 'stock' item, so that it
59
- # can be displayed using platform-standard text and icon. To do this,
60
- # simply pass an :id argument to the constructor - here, the system's
61
- # standard 'preview' button
62
- #
63
- # Wx::Button.new(parent, :id => Wx::ID_PREVIEW)
64
- #
65
- # == Class-specific arguments
66
- #
67
- # The arguments :size, :pos and :style are common to many WxWidgets
68
- # window classes. The +new+ methods of these classes also have
69
- # parameters that are specific to those classes; for example, the text
70
- # label on a button, or the initial value of a text control.
71
- #
72
- # Wx::Button.new(parent, :label => 'press me')
73
- # Wx::TextCtrl.new(parent, :value => 'type some text here')
74
- #
75
- # The keyword names of these arguments can be found by looking at the
76
- # WxRuby documentation, in the relevant class's +new+ method. You can
77
- # also get a string description of the class's +new+ method parameters
78
- # within Ruby by doing:
79
- #
80
- # puts Wx::TextCtrl.describe_constructor()
81
- #
82
- # This will print a list of the argument names expected by the class's
83
- # +new+ method, and the correct type for them.
84
- #
85
- # == Mixing positional and keyword arguments
86
- #
87
- # To support existing code, and to avoid forcing the use of more verbose
88
- # keyword-style arguments where they're not desired, you can mix
89
- # positional and keyword arguments, omitting or including +id+s as
90
- # desired.
91
- #
92
- # Wx::Button.new(parent, 'press me', :style => Wx::BU_RIGHT)
93
- #
94
- module WxSugar
95
- module KeywordConstructor
96
- module ClassMethods
97
- # Shorthand constructors
98
- TYPEMAP = {
99
- Wx::Size => lambda { | x | Wx::Size === x ? x : Wx::Size.new(*x) },
100
- Wx::Point => lambda { | x | Wx::Point === x ? x : Wx::Point.new(*x) }
101
- }
102
-
103
- # Common Wx constructor argument keywords, with their default values.
104
- STANDARD_DEFAULTS = {
105
- :id => -1,
106
- :size => Wx::DEFAULT_SIZE,
107
- :pos => Wx::DEFAULT_POSITION,
108
- :style => 0,
109
- :validator => Wx::DEFAULT_VALIDATOR,
110
- :choices => [] # for Choice, ComboBox etc
111
- }
112
-
113
- # Provide convenient convertors for Wx::Size and Wx::Point to be
114
- # specified as simple ruby array.
115
- #
116
- # instead of
117
- # :size => Wx::Size.new(150, 225)
118
- # just
119
- # :size => [ 150, 225 ]
120
- def map_type(in_obj, default)
121
- if TYPEMAP.include?(default.class)
122
- in_obj = TYPEMAP[default.class].call(in_obj)
123
- end
124
- in_obj
125
- end
126
-
127
- # A named parameter in a Wx constructor parameter list
128
- Parameter = Struct.new( :name, :default )
129
-
130
- attr_writer :param_spec
131
- def param_spec
132
- @param_spec ||= [ ]
133
- end
134
-
135
- attr_writer :param_flags
136
- def param_flags
137
- @param_flags ||= {}
138
- end
139
-
140
-
141
- # Adds a list of named parameters *params* to the parameter
142
- # specification for this Wx class's constructor. Each parameter
143
- # should be specified as a either a common known symbol, such as
144
- # +:size+ or +:pos:+ or +:style:+ (corresponding to the common
145
- # constructor arguments in WxWidgets API), or a single-key with the
146
- # key the name of the argument, and the value a default value.
147
- #
148
- # Parameters should be specified in the order they occur in the Wx
149
- # API constructor
150
- def wx_ctor_params(*params)
151
- self.param_spec += params.map do | param |
152
- param.kind_of?(Hash) ? Parameter[*param.to_a.flatten] :
153
- Parameter[param, STANDARD_DEFAULTS[param] ]
154
- end
155
- end
156
-
157
- # Add a named style constructor flag.
158
- def wx_ctor_flags(flags)
159
- param_flags.update(flags)
160
- end
161
-
162
- def args_as_list(*mixed_args)
163
- # get keyword arguments from mixed args if supplied, else empty
164
- kwa = mixed_args.last.kind_of?(Hash) ? mixed_args.pop : {}
165
- out_args = []
166
- param_spec.zip(mixed_args) do | param, arg |
167
- if arg # use the supplied list arg
168
- out_args << map_type(arg, param.default)
169
- elsif kwa.key?(param.name) # use the keyword arg
170
- out_args << map_type(kwa[param.name], param.default)
171
- else # use the default argument
172
- out_args << param.default
173
- end
174
- end
175
- out_args
176
- rescue
177
- Kernel.raise ArgumentError,
178
- "Bad arg composition of #{mixed_args.inspect}"
179
- end
180
-
181
- def args_as_hash(*mixed_args)
182
- kwa = mixed_args.last.kind_of?(Hash) ? mixed_args.pop : {}
183
- param_spec.zip(mixed_args) do | param, arg |
184
- kwa[param.name] = arg if arg
185
- end
186
- kwa
187
- end
188
-
189
- # Look through a set of keyword arguments +in_flags+ and return a
190
- # style parameter based on the known style flags applicable to this
191
- # widget type.
192
- # TODO - not currently used
193
- def style_constant(kw_args)
194
- # get the default flag for this style parameter
195
- base_style = kw_args[:style] ||
196
- param_spec.find { | x | x.name == :style }.default
197
-
198
- # go through each of the known style flags for this widget
199
- param_flags.each do | sym, const |
200
- next unless kw_args.key?(sym)
201
- # add or delete flag, depending on whether true or false
202
- kw_args[sym] ? base_style |= const : base_style &= ~const
203
- end
204
- base_style
205
- end
206
-
207
- def describe_constructor()
208
- param_spec.inject("") do | desc, param |
209
- desc << "#{param.name} (#{param.default.class.name})\n"
210
- end
211
- end
212
- end
213
-
214
- def self.included(klass)
215
- klass.extend ClassMethods
216
-
217
- klass.module_eval do
218
- alias :pre_wx_kwctor_init :initialize
219
-
220
- def initialize(parent, *mixed_args)
221
- if parent and not parent.is_a?(Wx::Window)
222
- Kernel.raise ArgumentError,
223
- "Parent must be a Wx::Window, not #{parent.inspect}"
224
- end
225
-
226
- # Allow classes to ignore :id argument in positional args
227
- unless self.class < Wx::Dialog
228
- if not mixed_args[0].kind_of?(Fixnum)
229
- mixed_args.unshift(-1)
230
- end
231
- end
232
-
233
- real_args = [ parent ] + self.class.args_as_list(*mixed_args)
234
-
235
-
236
- # deal with style flags
237
- # if mixed_args.last.kind_of?(Hash)
238
- # flags = self.class.style_constant(mixed_args.last)
239
- # style_param = self.class.param_spec.find { | param | param.name == :style }
240
- # real_args[ self.class.param_spec.index(style_param) + 1 ] = flags
241
- # end
242
-
243
- begin
244
- pre_wx_kwctor_init(*real_args)
245
- rescue
246
- Kernel.raise ArgumentError, "Error initializing #{self.inspect} \n" +
247
- "Sent parameters: #{real_args.inspect}\n" +
248
- "correct parameters are:\n" +
249
- self.class.describe_constructor()
250
- end
251
- end
252
- end
253
-
254
-
255
- # Any class inheriting from a class including this module must have
256
- # its own copy of the param_spec
257
- def klass.inherited(sub_klass)
258
- sub_klass.instance_variable_set(:@param_spec,
259
- self.instance_variable_get(:@param_spec) )
260
- sub_klass.instance_variable_set(:@param_flags,
261
- self.instance_variable_get(:@param_flags) )
262
- end
263
- end
264
- end
265
- end
266
-
267
- require 'wx_sugar/keyword_classes'
@@ -1,40 +0,0 @@
1
- class Wx::TreeCtrl
2
- # Recurses over the tree item +start_item+ and its descendants,
3
- # yielding each item in the tree in turn into the block. If
4
- # +start_item+ is not specified, this method will recurse over every
5
- # item within the tree, starting with the root item.
6
- #
7
- # In its simplest form, the method accepts a block with one parameter,
8
- # which will be the TreeItemId of the item. This is an opaque integer
9
- # value which uniquely identifies the tree item. It can be used as an
10
- # argument to many other methods within TreeCtrl (for example,
11
- # get_item_text).
12
- #
13
- # The block passed to +traverse+ may optionally receive two additional
14
- # parameters, +text+ and +data+. If these are specified, they will be
15
- # filled with the text label for the item and any ruby item data
16
- # associated with the item, respectively.
17
- def traverse(start_item = self.get_root_item, &block)
18
- case block.arity
19
- when 1
20
- block.call(start_item)
21
- when 2
22
- block.call(start_item,
23
- get_item_text(start_item))
24
- when 3
25
- block.call(start_item,
26
- get_item_text(start_item),
27
- get_item_data(start_item))
28
- else
29
- raise ArgumentError, "Invalid number of block parameters"
30
- end
31
-
32
- if item_has_children(start_item)
33
- child, cookie = get_first_child(start_item)
34
- while child.nonzero?
35
- traverse(child, &block)
36
- child = get_next_sibling(child)
37
- end
38
- end
39
- end
40
- end