So, how hard would it be for a normal user like me, who knows little about the Pharo UI or Spec, to write a plain, simple Login dialog ?
It turns out it only takes 3 methods and some boilerplate code that is mostly
auto generated.
0. Make a subclass of ComposableModel with instance variables for the UI
elements that we need
ComposableModel subclass: #LoginModel
instanceVariableNames: 'usernameLabel usernameField passwordLabel
passwordField'
classVariableNames: ''
category: '_UnpackagedPackage'
1. Specify the layout of the UI
LoginModel class>>#defaultSpec
<spec: #default>
^ SpecLayout composed
newColumn: [ :col |
col
newRow: [ :row |
row
add: #usernameLabel width: 80;
add: #usernameField ]
height: self inputTextHeight;
newRow: [ :row |
row
add: #passwordLabel width: 80;
add: #passwordField ]
height: self inputTextHeight ];
yourself
2. Build the UI elements
LoginModel>>#initializeWidgets
usernameLabel := self newLabel.
usernameLabel text: 'Username'.
usernameField := self newTextInput.
usernameField autoAccept: true; ghostText: '[email protected]'.
passwordLabel := self newLabel.
passwordLabel text: 'Password'; yourself.
passwordField := self newTextInput.
passwordField beEncrypted; autoAccept: true; ghostText: '******'.
self focusOrder add: usernameField; add: passwordField
3. Open the UI as modal dialog
LoginModel class>>#getCredentials
"self getCredentials"
| login dialog |
login := self new.
dialog := login openDialogWithSpec.
dialog modalRelativeTo: self currentWorld.
dialog cancelled ifTrue: [ ^ nil ].
^ login credentials
X. Some boilerplate code
Auto-generate read accessors for the 4 instance variables.
LoginModel>>#title
^ 'Login'
LoginModel>>#initialExtent
^ 350 @ 150
LoginModel>>#credentials
^ usernameField text -> passwordField text
I think this is pretty cool. I really can't imagine how much easier, how much
less code this should take.
LoginModel.st
Description: Binary data
Let us all learn to use what we have, accept it the way it is, and make it better, together. Sven BTW: While writing this, following some senders/implementers, I found out that in Pharo 4, CredentialsEditor does almost the same thing. -- Sven Van Caekenberghe Proudly supporting Pharo http://pharo.org http://association.pharo.org http://consortium.pharo.org
