Just out of curiosity, is there any technical reason that you decided to use signals instead of passing closures?
(Modularity; Efficiency; more idiomatic to Java?) On Sep 6, 5:29 am, rb <raphi...@gmail.com> wrote: > On Sep 4, 8:30 pm, Jonathan Smith <jonathansmith...@gmail.com> wrote: > > > 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)) > > yes, I didn't think of that! > > > 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. > > The first version of my code was like that (see > here:http://paste.lisp.org/display/86499), but then I decided to try using > signals. > > Thanks for your feedback. > > raph > > > > > 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 <raphi...@gmail.com> 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 clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~----------~----~----~----~------~----~------~--~---