Igor Stasenko wrote:
Hello guys,
thinking, how to easily define styles, based on simple selection rules, i sketched the class, MorphStyle.
The principle how it works is simple:
- you creating a style, add adding actions to it - you then applying style to morph or group of morphs.
Example:
| style | style := MorphStyle new submorphs model: #Browser; color: Color red. style applyTo: World.
Let me describe in detail, what it does, when you applying it:
style applyTo: World.
Style initializing its current selection to be a collection with single element - { World }. Next thing, which it does is applying any actions , which we specified during building the style, namely:
'submorphs' - replacing the current selection by gathering all submorphs of it, i.e.
selection before: #( World ) selection after: #( World's submorphs )
'model: #Browser' - filter the current selection and leave only those entries, which respond to #model and model class name is #Browser
selection before: #( world's submorphs ) selection after: { Browser SystemWindow#1. Browser SystemWindow#2. Browser SystemWindow#3.Browser SystemWindow#4. }
'color: Color red'. - since there's no such method in MorphStyle, it is trapped by DNU handler and converted to a #sendMessage: action. A #sendMessage: action sends a specified message to current selection, i.e.:
{ Browser SystemWindow#1. .... Browser SystemWindow#N. } do: [:morph | message sendTo: morph ].
So, as result, if you doIt : | style | style := MorphStyle new submorphs model: #Browser; color: Color red. style applyTo: World.
all browser windows color will be changed to red color.
Some words about potential uses of this stuff.
- theming, (through defining own style sheets). In contrast to existing implementation, we're free to define anything, which morph understands , not just colors, border or fillstyle, but also, layout, fonts, position etc etc.
- defining styles in various ways: following snippet sets the 'browse' button color to red for all browser windows and illustrating how one style could reuse another one.
| browseButton buttonStyle browsers |
buttonStyle := MorphStyle new color: Color blue. browseButton := MorphStyle new allSubmorphs; has: #label equalTo: 'browse'. browsers := MorphStyle new model: #Browser.
browseButton style: buttonStyle. "browseButton reusing buttonStyle" browsers style: browseButton. "browser style reusing browseButton style"
browsers applyTo: World submorphs.
It can be easily integrated with Morphic when using some global theme, all we need is: - add Morph>>applyThemeStyles ^ World currentTheme applyStylesTo: self
- send #applyStyles to morph, when its added to World.
Also, we could integrate it with toolbuilder which will allow us to define morph layouts, fonts, colors & initial properties more flexibly than currently are . Non-morphic builders could just ignore the #setStyles: message.
Comments, suggestions , as always welcome.
-- Best regards, Igor Stasenko AKA sig.
+1 The builders and themes don't play nicely at present. There are 35 senders like: window := (SystemWindow labelled: labelString) model: self. So #labelled: creates a SystemWindow and asks the current UITheme to theme it, before it has any information to do so (model is still nil). So having more dynamic styles like this sounds a good way to sort this; I suspect it would also allow some theme related nasties to be removed. ...Stan -- View this message in context: http://n2.nabble.com/Styles-for-Morphic-tp4402731p4404007.html Sent from the Pharo Smalltalk mailing list archive at Nabble.com.