Hi Ralph,
First off, nice post! We need more of these types of tutorials on GUI
in clojure, they're very useful.
On make-login-widget you can probably do a doto when you do this part:
> (.addWidget layout (WLabel. "Login:") 0 0 )
> (.addWidget layout login-field 0 1 )
> (.addWidget layout (WLabel. "Password:") 1 0 )
> (.addWidget layout password-field 1 1)
> (.addWidget layout submit-button 2 0 1 2)
Can be like (doto layout (add ) (add))
I don't have any experience using Jwt, but with regard to listeners
and such, I've been using a 'continuation passing' style when writing
little toy applications using swing.
I guess the best way to explain it is that rather than using .trigger
on the signal in the do-login function block, you would just apply a
passed in (possibly anonymous) function. I can give an example:
Think of this as pseudocode that may or may not run, as I only have
Swing for ui on this computer.
(defn make-login-form [logged-in-fn wrong-creds-fn]
(let [layout (WGridLayout.)
container (WContainerWidget.)
password-field (doto (WLineEdit. container)
(.setEchoMode WLineEdit$EchoMode/Password ) )
password #(.getText password-field)
login-field (WLineEdit. container)
login #(.getText login-field)
do-login (fn [evt]
(if (authenticate (login) (password))
(logged-in-fn)
(wrong-creds-fn)))
submit-button (WPushButton. "Login")]
(-> submit-button .clicked
(.addListener container
( create-listener [mouse-event]
(do-login mouse-event))))
(doto layout
(.addWidget (WLabel. "Login:") 0 0 )
(.addWidget login-field 0 1 )
(.addWidget (WLabel. "Password:") 1 0 )
(.addWidget password-field 1 1)
(.addWidget submit-button 2 0 1 2))
(.setLayout container layout)
(.setFocus login-field)
container))
(defn make-login-app
([env continuation]
(let [wapp (new WApplication env)
root (.getRoot wapp)
result-text (WText. "")
user nil
dialog (WDialog. "test")
dialog-container (.getContents dialog)
app-screen (make-app-screen)
form (make-login-form
#(do (.remove dialog)
(.setText (-> app-screen .getLayout (.getItemAt 0)
.getWidget)
"Logged in!")
(continuation))
#(do (.setText (-> app-screen .getLayout (.getItemAt 0)
.getWidget)
"Wrong credentials!")))]
(.setTitle wapp "Login Example")
(doto dialog (.. getContents (addWidget form)) .show)
(.addWidget root app-screen)
wapp))
([env]
(make-login-app env identity)))
And so then, to get a dialog that is like a sequence of panels, you
can go through and do like:
(make-login-app env make-next-widget)
Anyway, is not particularly any better than using signal passing
technique,
but is another approach that you might consider in your application.
On Sep 4, 11:01 am, rb <[email protected]> wrote:
> Hi,
>
> In using the Jwt library, for which I only found examples in object
> oriented languages that structure the code in class definitions and do
> heavy usage of instance variables, I was in a situation where I
> wondered how I could best structure my code.
>
> With help on the IRC channel I got to a working solution which I
> document in a blog post
> athttp://www.nsa.be/index.php/eng/Blog/From-OO-to-Lisp-style-structurin...
>
> I'm interested in feedback and advices for improvements
>
> Thanks
>
> Raph
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---