DrawIcon
part of wslib
a Pen-based library system for drawing iconographic pictures.
Note : DrawIcon is partially compatible with GUI-style coding. Colors and text are not supported
DrawIcon contains a global library with pen functions. It draws the icon in a Rect you specify.
DrawIcon returns a Pen function.
Used by RoundButton an SCAlert
DrawIcon( iconName, rect ... extra args )
(
w = GUI.window.new( "DrawIcon" ).front;
w.drawHook = { |window| DrawIcon( \speaker, window.view.bounds.insetBy(10,10) ) };
w.refresh;
)
(
w.drawHook = { |window|
Color.red(0.5).alpha_(0.5).set;
DrawIcon( \speaker, window.view.bounds.insetBy(10,10) ) };
w.refresh;
)
The library of Pen functions is stored in drawFuncs
DrawIcon.names.dopostln; // post all available iconNames
(
w = GUI.window.new( "drawFuncs" ).front;
k = DrawIcon.drawFuncs.keys.asArray
.select({ |item| ['-', '!'].includes(item).not }) //SCPopUpMenu doesn't like '-' and '!'
.sort;
n = '+';
w.drawHook = { |window|
DrawIcon( n, window.view.bounds.insetBy(10,10) ) };
m = GUI.popUpMenu.new( w, Rect(5,5,80,20) )
.items_( k )
.action_({ |popUp|
n = k.at( popUp.value );
w.refresh; });
w.refresh;
)
Some of the drawFuncs have optional extra arguments. These can be added after the Rect in DrawIcon
(
// arrow has arguments 'direction' and 'mode'
w = SCWindow( "DrawIcon" ).front.decorate;
a = 0;
m = 'fill';
w.drawHook = { |window| DrawIcon( \arrow, window.view.bounds.insetBy(10,10), a, m ) };
b = SmoothSlider( w, 80@20)
.action_({ |sl| a = sl.value.linlin(0,1,0,2pi); w.refresh; });
c = RoundButton( w, 80@20 )
.states_([[ "fill" ], ["stroke"]])
.action_({ |bt| m = [\fill, \stroke][ bt.value]; w.refresh });
w.refresh;
)
(
// clock has arguments 'h', 'm' and 'secs'
w = SCWindow( "DrawIcon" ).front;
d = Date.localtime;
w.drawHook = { |window| DrawIcon( \clock, window.view.bounds.insetBy(10,10),
d.hour, d.minute, d.second ) };
t = Task({ loop { d.localtime;
{ if( w.notNil && { w.dataptr.notNil }) { w.refresh; } }.defer;
1.0.wait }
}).start;
w.onClose_({ t.stop; });
w.refresh;
)
(
// post all keyFuncs with extra argNames, with their default values
DrawIcon.drawFuncs.keys
.collect({ |key| [ key, DrawIcon.drawFuncs[ key ]] })
.select({ |item| item[1].def.argNames.size > 1 })
.do({ |item|
var argNames, argValues;
argNames = item[1].def.argNames[1..];
argValues = item[1].def.prototypeFrame[1..];
argNames = argNames.collect({ |name,i|
if( argValues[ i ].notNil )
{ name ++ " = " ++ argValues[ i ].asCompileString }
{ name }
});
"'%' ( % )\n".postf( item[0], argNames.join( ", ") )
}); "";
)
*symbolArgs
The symbolArgs creation method is a special creation mode where extra arguments
are encoded in the name of the drawFunc. This is used by RoundButton and SCAlert
The encoding goes as follows:
'iconName_firstArg_secondArg_etc'
The args are interpreted before they are used, so they can be expressions
(
w = GUI.window.new( "DrawIcon" ).front;
w.drawHook = { |window| DrawIcon.symbolArgs( 'arrow_0.5pi', window.view.bounds.insetBy(10,10) ) };
w.refresh;
)
(
w.drawHook = { |window| DrawIcon.symbolArgs( 'led_250', window.view.bounds.insetBy(10,10) ) };
w.refresh;
)
When args are symbols themselves you need to add \' signs
(
w.drawHook = { |window| DrawIcon.symbolArgs( 'play_\'stroke\'',
window.view.bounds.insetBy(10,10) ) };
w.refresh;
)