1ConfigSpecs(3) User Contributed Perl Documentation ConfigSpecs(3)
2
3
4
6 Tk::ConfigSpecs - Defining behaviour of 'configure' for composite
7 widgets.
8
10 sub Populate
11 {
12 my ($composite,$args) = @_;
13 ...
14 $composite->ConfigSpecs('-attribute' => [ where,dbName,dbClass,default ]);
15 $composite->ConfigSpecs('-alias' => '-otherattribute');
16 $composite->ConfigSpecs('DEFAULT' => [ where ]);
17 $composite->ConfigSpecs($subwidget->ConfigSpecs);
18 ...
19 }
20
21 $composite->configure(-attribute => value);
22
24 The aim is to make the composite widget configure method look as much
25 like a regular Tk widget's configure as possible. (See Tk::options for
26 a description of this behaviour.) To enable this the attributes that
27 the composite as a whole accepts needs to be defined.
28
29 Defining the ConfigSpecs for a class.
30 Typically a widget will have one or more calls like the following
31
32 $composite->ConfigSpecs(-attribute => [where,dbName,dbClass,default]);
33
34 in its Populate method. When ConfigSpecs is called this way (with
35 arguments) the arguments are used to construct or augment/replace a
36 hash table for the widget. (More than one -option=>value pair can be
37 specified to a single call.)
38
39 dbName, dbClass and default are only used by ConfigDefault described
40 below, or to respond to 'inquiry' configure commands.
41
42 It may be either one of the values below, or a list of such values
43 enclosed in [].
44
45 The currently permitted values of where are:
46
47 'ADVERTISED'
48 Apply configure to advertised subwidgets.
49
50 'DESCENDANTS'
51 Apply configure recursively to all descendants.
52
53 'CALLBACK'
54 Setting the attribute does "Tk::Callback->new($value)" before
55 storing in "$composite->{Configure}{-attribute}". This is
56 appropriate for "-command => ..." attributes that are handled by
57 the composite and not forwarded to a subwidget. (E.g. Tk::Tiler has
58 "-yscrollcommand" to allow it to have scrollbar attached.)
59
60 This may be the first of several 'validating' keywords (e.g. font,
61 cursor, anchor etc.) that core Tk makes special for C code.
62
63 'CHILDREN'
64 Apply configure to all children. (Children are the immediate
65 descendants of a widget.)
66
67 'METHOD'
68 Call "$cw->attribute(value)"
69
70 This is the most general case. Simply have a method of the
71 composite class with the same name as the attribute. The method
72 may do any validation and have whatever side-effects you like. (It
73 is probably worth 'queueing' using afterIdle for more complex side-
74 effects.)
75
76 'PASSIVE'
77 Simply store value in "$composite->{Configure}{-attribute}".
78
79 This form is also a useful placeholder for attributes which you
80 currently only handle at create time.
81
82 'SELF'
83 Apply configure to the core widget (e.g. Frame) that is the basis
84 of the composite. (This is the default behaviour for most
85 attributes which makes a simple Frame behave the way you would
86 expect.) Note that once you have specified ConfigSpecs for an
87 attribute you must explicitly include 'SELF' in the list if you
88 want the attribute to apply to the composite itself (this avoids
89 nasty infinite recursion problems).
90
91 $reference (blessed)
92 Call $reference->configure(-attribute => value)
93
94 A common case is where $reference is a subwidget.
95
96 $reference may also be result of
97
98 Tk::Config->new(setmethod,getmethod,args,...);
99
100 Tk::Config class is used to implement all the above keyword types.
101 The class has "configure" and "cget" methods so allows higher level
102 code to always just call one of those methods on an object of some
103 kind.
104
105 hash reference
106 Defining:
107
108 $cw->ConfigSpecs(
109 ...
110 -option => [ { -optionX=>$w1, -optionY=>[$w2, $w3] },
111 dbname dbclass default ],
112 ...
113 );
114
115 So "$cw->configure(-option => value)" actually does
116
117 $w1->configure(-optionX => value);
118 $w2->configure(-optionY => value);
119 $w3->configure(-optionY => value);
120
121 'otherstring'
122 Call
123
124 $composite->Subwidget('otherstring')->configure( -attribute => value );
125
126 While this is here for backward compatibility with Tk-b5, it is
127 probably better just to use the subwidget reference directly. The
128 only case for retaining this form is to allow an additional layer
129 of abstraction - perhaps having a 'current' subwidget - this is
130 unproven.
131
132 Aliases
133 "ConfigSpecs( -alias => '-otherattribute' )" is used to make
134 "-alias" equivalent to "-otherattribute". For example the aliases
135
136 -fg => '-foreground',
137 -bg => '-background'
138
139 are provided automatically (if not already specified).
140
141 Delegating all options of a widget class to a subwidget
142 $composite->ConfigSpecs($subwidget->ConfigSpecs);
143
144 The above generates a list of composite ConfigSpecs arguments, one for
145 each valid option in $subwidget's class, and delegates said option to
146 $subwidget. See Tk::Widget and the widget method ConfigSpecs.
147 Duplicating composite ConfigSpecs and widget ConfigSpecs keys will
148 yield undefined results.
149
150 Default values
151 When the Populate method returns ConfigDefault is called. This calls
152
153 $composite->ConfigSpecs;
154
155 (with no arguments) to return a reference to a hash. Entries in the
156 hash take the form:
157
158 '-attribute' => [ where, dbName, dbClass, default ]
159
160 ConfigDefault ignores 'where' completely (and also the DEFAULT entry)
161 and checks the 'options' database on the widget's behalf, and if an
162 entry is present matching dbName/dbClass
163
164 -attribute => value
165
166 is added to the list of options that new will eventually apply to the
167 widget. Likewise if there is not a match and default is defined this
168 default value will be added.
169
170 Alias entries in the hash are used to convert user-specified values for
171 the alias into values for the real attribute.
172
173 New()-time configure
174 Once control returns to new, the list of user-supplied options
175 augmented by those from ConfigDefault are applied to the widget using
176 the configure method below.
177
178 Widgets are most flexible and most Tk-like if they handle the majority
179 of their attributes this way.
180
181 Configuring composites
182 Once the above have occurred calls of the form:
183
184 $composite->configure( -attribute => value );
185
186 should behave like any other widget as far as end-user code is
187 concerned. configure will be handled by Tk::Derived::configure as
188 follows:
189
190 $composite->ConfigSpecs;
191
192 is called (with no arguments) to return a reference to a hash
193 -attribute is looked up in this hash, if -attribute is not present in
194 the hash then 'DEFAULT' is looked for instead. (Aliases are tried as
195 well and cause redirection to the aliased attribute). The result
196 should be a reference to a list like:
197
198 [ where, dbName, dbClass, default ]
199
200 at this stage only where is of interest, it maps to a list of object
201 references (maybe only one) foreach one
202
203 $object->configure( -attribute => value );
204
205 is evaled.
206
207 Inquiring attributes of composites
208 $composite->cget( '-attribute' );
209
210 This is handled by Tk::Derived::cget in a similar manner to configure.
211 At present if where is a list of more than one object it is ignored
212 completely and the "cached" value in
213
214 $composite->{Configure}{-attribute}.
215
216 is returned.
217
219 The "-background" and "-foreground" option values are automatically
220 propagated down to all composite widget's children. This may be
221 sometimes not desirable, especially if some subwidgets should use own
222 color schemes, either by using explicit options or by option database
223 definitions. If this is the case, then just add
224
225 -foreground => 'SELF',
226 -background => 'SELF',
227
228 to "ConfigSpecs".
229
230 It is the author's intention to port as many of the "Tix" composite
231 widgets as make sense. The mechanism described above may have to evolve
232 in order to make this possible, although now aliases are handled I
233 think the above is sufficient.
234
236 Tk::composite, Tk::options, Tk::Widget
237
238
239
240perl v5.32.0 2020-07-28 ConfigSpecs(3)