It's been a while. This release has several bug fixes accumulated over the last year. Thanks to: @MIvanchev, @mpietrzak, @schmee, @gudmunduregill, @violahs, @ypsilon-takai, @ska2342, @marcliberatore, @jes5199.
seesaw.core/confirmfunction for confirmation dialogs. Thanks to @ummels
:listenoptions when constructing a frame
(seesaw.table/value-at)when row index is out of bounds (#113)
(seesaw.table/update-at!)when given multiple arguments (#110)
add!for Mig layout
:layout-orientationsupport to listbox
:all-files?option on file chooser. Thanks @kotarak.
(listen)to accept vars (presumably pointing to functions) as handlers in addition to functions. This can make working the repl a little more pleasant because you can redefine handler functions after they've been registered.
:fontproperty of styled-text. Issue #81
examples/substance. It's standalone because I'm not adding Insubstantial to the Seesaw deps just yet, or wrapping it.
This release is primarily bug fixes and minor API extension driven by the Overtone widget effort.
(seesaw.core/paintable)must now be a class. Passing the name of a widget constructor function no londer works. So instead of
(paintable label ...), do
(paintable javax.swing.JLabel ...)instead. Note below that everything supports the
:paintoption now so
paintableisn't really needed anymore.
with-widgetwhich was a failed extensibility experiment. If you want to customize an Swing existing class, just subclass it, instantiate it, and call
:paintoption originally only supported by
seesaw.core/request-focus!function which correctly gives keyboard focus to a widget.
(seesaw.core/paintable)is now deprecated (also see change below).
:user-dataoption at creation time which associates an arbitrary value with the widget. Accessible later with
(listen)now. Note that the returned object is still a
Bindable, it's just also callable as a function now.
seesaw.mousewith some helper functions for dealing with the mouse.
(seesaw.graphics/style)to accept Paint objects instead of just colors. This allows use of gradients.
:location-on-screenproperty of widgets.
This release includes several new features and bug fixes:
(seesaw.dev/show-events)which can be used at a REPL to query a widget for all supported options or events, respectively. This is part of an effort to reduce the level of Swing knowledge needed for Seesaw. See here for example output.
(seesaw.core.value!). This is a more convenient and sometimes more powerful unification of the existing
configand friends can now be invoked on any Swing widget, even those not created with a Seesaw widget constructor.
lein run -m seesaw.test.examples.launcherand you'll get a list of all available examples.
(seesaw.widgets.log-window). This is generally useful, but mostly an experiment is how painful custom widget development is in Seesaw vs. raw Java.
:layoutoption. Gets/sets widget layout manager.
(seesaw.core/with-widgets)from issue #68.
mig-panelthat broke most common options
bindsupport for spinner and spinner models.
(seesaw.invoke/signaller*)and added helper macro.
label-options. This allows them to be reused as well as inspected. The whole
with-widgetthing just isn't working out.
(seesaw.dev/debug!)to initialize. After that, any unhandled exceptions in the UI thread will pop up a window with info, rather than possibly being lost or not noticed in the console.
(seesaw.tree/simple-tree-model). Thanks to Stuart Campbell for this contribution.
:borderoption can now take an i18n keyword to create a titled border.
seesaw.bind/b-do, which is a binding equivalent of
clojure.core/do. Execute arbitrary code when triggered by a change in a bound value.
:selectionevent wasn't implemented on
group-by-idto easily grab several widgets in a hierarchy. See doc and notes in Selectors.
invoke-soonwhich runs code immediately if already on the swing thread, otherwise sends it over with `invoke-later.
:mnemonicsupport for all buttons, not just actions. This includes all buttons, menu items, etc.
(all-frames)function that nominally returns all frames in the JVM. Only useful for debugging and live editing. See doc.
(select-with)which acts a more powerful version of
(partial (to-widget x) select).
(bind/funnel)support. Multiplex multiple binding chains together into a vector.
(bind/b-swap!)support. Friendlier use of atoms as in binding chains.
(seesaw.chooser/choose-file). Thanks to Odyssomay
(config)function which is dual of
(config!), i.e. it can read options from widgets. For example,
(config my-panel :items)will return a sequence of the items in the given panel. The implementation isn't complete for every option on every widget type, but the biggies are covered. If you hit one that's missing, let me know.
(listen :selection), for text widgets.
(scroll! table :to :end). See
:textoption of any widget will now slurp that value into the text value. So, you can point text areas at files or URLs or whatever to populate them.
ToWidgetprotocol was broken into two pieces,
MakeWidget. This should only affect users that implemented
:textoption were automatically passed through
(str). This is no longer the case. If you want a non-string value in a label or whatever, convert it manually.
(id-of)now always returns a keyword regardless of whether a string or keyword was given as the
:idoption on widget construction. This makes for more readable, consistent code.
Well, that's embarrassing:
(progress-bar :value)and a couple broken examples.
Lots of outside help on this one:
(seesaw.core/styled-text). Contributed by Odyssomay
(seesaw.core/card-panel). Contributed by Odyssomay
(seesaw.chooser/choose-file). Conributed by frericksm
(seesaw.forms). Contributed by Meikel Brandmeyer
(seesaw.table/value-at). This provides an easy mechanism for associating hidden data with rows.
(paintable)for custom painting on widgets
(flow-panel :cursor :hand)to use the "hand" cursor on a panel.
:divider-locationnow works on split panels, use a double or ratio.