IntelliJ is swing! Well, knock me other with a feather :). Still wouldn't
want to go anywhere near building a Swing app though :).
On 14 Jan 2015 01:36, "Colin Fleming" <colin.mailingl...@gmail.com> wrote:

> On 14 January 2015 at 05:50, Colin Yates <colin.ya...@gmail.com> wrote:
>
>> My evolution of Java UI was swing>JSP>struts>JSF>velocity then onto
>> JavaScript/ExtJS. My instinct now when I hear the words "Java" and
>> "UI" is to run a mile :).
>>
>
> This is where I point out that you're currently using a Swing app every
> day :-)
>
>
>
>> I haven't looked at JavaFX (I think I had bailed before that appeared).
>>
>>
>> On 13 January 2015 at 16:05, Timothy Baldridge <tbaldri...@gmail.com>
>> wrote:
>> > I've long thought that the Clojure world needs a JavaFX/React hybrid.
>> > JavaFX2's API is extremely consistent, making it quite easy to program
>> > against, but yes it still requires bindings and in-place mutation.
>> >
>> > However a React-like diff-ing engine on it would be quite impressive.
>> But
>> > now you're into the fun land of writing a library in order to write your
>> > app.
>> >
>> > On Tue, Jan 13, 2015 at 8:15 AM, Colin Yates <colin.ya...@gmail.com>
>> wrote:
>> >>
>> >> Wow, there is a lot to deal with :), so let me throw out some ideas:
>> >>  - have you considered building a web-app instead of a desktop app? If
>> so,
>> >> have a look at one of the react based languages (om or reagent would
>> be my
>> >> choice). Alternatively take a look at other
>> >> http://en.wikipedia.org/wiki/Functional_reactive_programming
>> libraries.
>> >>
>> >> It is a different way of working, but its programming model restricts
>> you
>> >> in a way that removes many problems (if you see what I mean).
>> >>
>> >> Also, I would be reaching for an in-memory database (assuming a server
>> >> isn't involved) about now, datatomic would be the obvious choice.
>> >>
>> >> I don't think what you are trying to do is stupid, I do think you might
>> >> want to do some thought experiments about different architectures and
>> >> paradigms (specifically FRP related paradigms).
>> >>
>> >> Oh, and have a quick scan through http://swannodette.github.io/,
>> there are
>> >> a few "mind-changing" posts.
>> >>
>> >> On Monday, 12 January 2015 18:53:07 UTC, MS wrote:
>> >>>
>> >>> (Cross-posted on StackOverflow)
>> >>>
>> >>> I'm trying to design a desktop UI for schematics, layout, drawing
>> stuff.
>> >>> Just looking for high level advice from actual software designers.
>> >>>
>> >>> Assuming an in-memory "database", (clojure map of arbitrary depth for
>> all
>> >>> user data, and possibly another one for application preferences,
>> etc.), I'm
>> >>> examining how to do the model-view-controller thing on these, where
>> the data
>> >>> may be rendered *and modified by* any one or more of:
>> >>>
>> >>>  1. A standalone text field that shows a single parameter, such as box
>> >>> width.
>> >>>  2. An "inspector" type of view that shows multiple parameters of a
>> >>> selected object, such as box width, height, color, checkboxes, etc.
>> >>>  3. A table/spreadsheet type of view that shows multiple parameters of
>> >>> multiple objects, potentially the whole database
>> >>>  4. A graphical rendering of the whole thing, such as both schematic
>> and
>> >>> layout view.
>> >>>
>> >>> Modifying any one of these should show up immediately in every other
>> >>> active view, both text and graphical, not after clicking "ok"... so
>> no modal
>> >>> boxes allowed.  If for some reason the table view, an inspector view,
>> and a
>> >>> graphical rendering are all in view, dragging the corner of the box
>> >>> graphically should immediately show up in the text, etc.
>> >>>
>> >>> The platform in question is JavaFX, but I'd like a clean separation
>> >>> between UI and everything else, so I want to avoid `bind`ing in the
>> JFX
>> >>> sense, as that ties my design data very tightly to JFX Properties,
>> increases
>> >>> the graininess of the model, and forces me to work outside the
>> standard
>> >>> clojure functions for dealing with data, and/or deal heavily with the
>> whole
>> >>> `getValue`/`setValue` world.
>> >>>
>> >>> I'm still assuming at least *some* statefulness/mutability, and the
>> use
>> >>> of built-in Clojure functionality such as the ability to `add-watch`
>> on an
>> >>> atom/var/ref and let the runtime signal dependent functions.
>> >>>
>> >>> Platform-specific interaction will rest tightly with the actual UI,
>> such
>> >>> as reifying `ActionListener`s, and dealing with `ObservableValue`s
>> etc., and
>> >>> will attempt to minimize the reliance on things like JavaFX
>> `Property` for
>> >>> actual application data.  I'm not entertaining FRP for this.
>> >>>
>> >>> I don't mind too much extending JFX interfaces or making up my own
>> >>> protocols to use application-specific `defrecord`s, but I'd prefer
>> for the
>> >>> application data to remain as straight Clojure data, unsullied by the
>> >>> platform.
>> >>>
>> >>> The question is how to set this all up, with closest adherence to the
>> >>> immutable model and minimal (or well-bounded) dependence on JFX.  I
>> see a
>> >>> few options:
>> >>>
>> >>>  1. Fine-grain: Each parameter value/primitive (ie Long, Double,
>> Boolean,
>> >>> or String) is an atom, and each view which can modify the value
>> "reaches in"
>> >>> as far as it needs to in the database to change the value.  This
>> could suck
>> >>> as there could potentially be thousands of individual values (for
>> example
>> >>> points on a hand-drawn curve), and will require lots of `(deref...)`
>> junk.
>> >>> I believe this is how JFX would want to do this, with giant arrays of
>> >>> Properties at the leaf nodes, etc., which feels bloated.  With this
>> approach
>> >>> it doesn't seem much better than just coding it up in Java/C++.
>> >>>  2. Medium-grain: Each object/record in the database is an atom of a
>> >>> Clojure map.  The entire map is replaced when any one of its values
>> changes.
>> >>> Fewer total atoms to deal with, and allows for example long arrays of
>> >>> straight-up numbers for various things.  But this gets complicated
>> when some
>> >>> objects in the database require more nesting than others.
>> >>>  3. Coarse-grain: There is just one atom: the database.  Any time
>> >>> anything changes, the entire database is replaced, and every view
>> needs to
>> >>> re-render its particular portion.  This feels a bit like using a
>> hammer to
>> >>> swat a fly, and a naive implementation would require everything to
>> re-render
>> >>> all the time.  But I still think this is the best trade off, as any
>> >>> primitive has a clear access path from the root node, whether it is
>> accessed
>> >>> on a per-primitive level or per-record level.
>> >>>
>> >>> I also need the ability for one data template to be instantiated many
>> >>> times.  So for example if the user changes a symbol or shape which is
>> used
>> >>> in multiple places, a single edit will apply everywhere.  I believe
>> this
>> >>> also requires some type of "pointer"-like behavior.  I think I can
>> store a
>> >>> atom to the model, then instantiate as needed, and it can work in any
>> of the
>> >>> above grain models.
>> >>>
>> >>> Any other approaches?  Is trying to do a GUI editor-like tool in a
>> >>> functional language just stupid?
>> >>> Thanks
>> >>
>> >> --
>> >> 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
>> >> ---
>> >> You received this message because you are subscribed to the Google
>> Groups
>> >> "Clojure" group.
>> >> To unsubscribe from this group and stop receiving emails from it, send
>> an
>> >> email to clojure+unsubscr...@googlegroups.com.
>> >> For more options, visit https://groups.google.com/d/optout.
>> >
>> >
>> >
>> >
>> > --
>> > “One of the main causes of the fall of the Roman Empire was that–lacking
>> > zero–they had no way to indicate successful termination of their C
>> > programs.”
>> > (Robert Firth)
>> >
>> > --
>> > 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
>> > ---
>> > You received this message because you are subscribed to a topic in the
>> > Google Groups "Clojure" group.
>> > To unsubscribe from this topic, visit
>> > https://groups.google.com/d/topic/clojure/Ut-HkNTqRUo/unsubscribe.
>> > To unsubscribe from this group and all its topics, send an email to
>> > clojure+unsubscr...@googlegroups.com.
>> > For more options, visit https://groups.google.com/d/optout.
>>
>> --
>> 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
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "Clojure" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clojure+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>  --
> 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
> ---
> You received this message because you are subscribed to a topic in the
> Google Groups "Clojure" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/clojure/Ut-HkNTqRUo/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to