- Calling
close()insideInternalWindowwould also close the parent placeholderfor list type controls should not require list type parameter- Added warning log message when
WorkspaceAppis called with aWorkspacesubclass as main view paramter - Fix bug caused by not properly removing nodes from
ToolBar - Fixed issues generating CSS for dashed strokes in shapes and borders
- Kotlin 1.2.31
- Workspace.navigateForward() made public
- Added missing pseudoclasses to CSS DSL
readonlyandcancelpseudoclasses added to type safe CSS- Added add/remove/toggle class for Tab
- ContextMenu.radiomenuitem (edvin#646)
- mutableList can now be bound to an ObservableMap
- CssSelectionBlock now has all relation selectors (see
CssSubRule.Relation)
- onEditCommit {} listens for changes in nested columns
- UIComponent.close() should be able to close primary stage as well (edvin#622)
- SmartResize.Policy manual resize broken (edvin#570)
- TableView bound to ListProperty should rebind when value changes
- Allow calling Workspace.disableNavigation() when workspace is empty
- Thread pools are reinitialized on App.start() to support stop/start multiple times within the same JVM
- ServiceLoader provided interceptors were added every time an App class was initialized
- inheritParamHolder and inheritScopeHolder are cleared on Application stop (edvin#602)
- smartResize throws exception for hidden columns (edvin#606)
- The getters and setters of horizontalPadding and verticalPadding did not correspond
- Kotlin 1.2.21
- Many internal refactorings
- AnchorPaneConstraint properties now accept any Number, not just Double
- AbstractField.textProperty was renamed to labelProperty to avoid confusion with the textProperty() exposed by textfields inside of a field
- ItemViewModel.bind
defaultValueparameter - Node builders inside of
MenuItemwill automatically assign the node to thegraphicproperty of the menu item - The App class (main application entrypoint) no longer requires a primary view parameter, in case you want to show a tray icon or determinine what view to show some other way
- Renamed tableview column builder for readonly non-observable properties to
readonlyColumn(edvin#599) - Renamed Node.index to Node.indexInParent to avoid subtle bugs (Partly fixes edvin#598)
- Removed CheckBoxCell in favor of inline cellFormat
- ValidationContext.validate has a new parameter failFast, which can optimize the validation-process.
- (Linked)HashMaps are generalized to (Mutable)Map
- ArrayList are generalized to (Mutable)List
- StackPane.connectWorkspaceActions() along with StackPane.contentProperty and various Workspace related functions and properties (edvin#604)
- TextInputControl.filterInput allows you to discriminate what kind of input should be accepted for a text input control
- String.isLong(), isInt(), isDouble() and isFloat()
- checkmenuitem builder accepts string for keycombination and selected property
- Node.index will tell you the Node's index in the parent container
- placeholder builder for TableView, TreeTableView, ListView
- obserableList() creates FXCollections.observableArrayList
- ResourceBundle.format() provides a short way to insert translations with variables in them
- ocpr is now available as extension function: attachTo
- Insets.copy(), Intsets.horizontal, Intsets.vertical, Intsets.all
- SortedFilteredList forwards setAll() to backing list
- withEach/mapEach/mapEachTo are the receiver-functions of forEach/map/mapTo.
runAsyncwould skip the success/fail steps if no work was done in the op block- TableView Pojo Column references support boolean "is" style properties (edvin#560)
- TabPane.tab inside of an UIComponent is now scope aware
- TreeView.lazyPopulate should never assign null list if filter results in no items
- Kotlin 1.2.10
- Node builders inside of
ButtonBasewill automatically assign the node to thegraphicproperty of the Button
- ConfigProperties (
config) is nowClosableso it can be used withuse
- Navigation button issue when already docked view was docked again (edvin#526)
- Internal thread pools are shutdown on app exit. Running threads in the default thread pool will still block application stop.
- ComboBox.makeAutoCompletable() inspects listView.prefWidth for being bound before attemting to set it (edvin#530)
- Wizard.canGoBack override caused NPE (edvin#211)
- Kotlin 1.2.0
- ItemViewModel.bindTo(itemFragment) supports all itemb fragments now, not just ListCellFragment
- lambda's that return unit are no longer nullable. use the default-lambda instead
- ChildInterceptor is now an Interface.
- Component.messages are fetched using the classloader that defined the Component subclass (edvin#553)
cellFragmentsupport for DataGrid- ObservableValue.isBlank() and ObservableValue.isNotBlank() which returns BooleanBinding. Useful for binding to TextField enabled/visible state
- Added
ownerandtitleparameters toalertand other dialog builders (edvin#522) - TextInputControl.editableWhen
multiSelect()for TreeView, TreeTableView, TableView and ListView- Stylesheets can now be added specificly to a
Parent- Node withaddStylesheet
- Fixed #434 leaf nodes are now getting set as expected for
lazypopulate. - Style builder can be applied to PopupControl, Tab, TableColumnBase (edvin#476)
- Better handling of Column.makeEditable() for properties that implement Property
- Refactoring: Moved all extension functions and properties targeting
TreeViewfromNodes.kttoTreeView.kt. alertbuilder accepts optional owner parameter (edvin#483)
fitToParentHeight/Width/Sizeas well asfitToHeight/Width/Size(region)helpers (edvin#519)beforeShutdownallows you to register shutdown hooksDataGridPaginatorcomponent to help with pagination forDataGrid- runAsync supports
daemonparameter to control thread characteristics (edvin#508) - Node.
runAsyncWithOverlay Latch, a subclass of CountdownLatch that exposes alockedPropertyand provides immediate release ability- Inline type safe stylesheet on Parent using the
stylesheetbuilder - Tab.close()
- JsonBuilder.add() supports Iterable (Turned into JsonArray)
- Added
customitemmenu item builder (edvin#488) - The default lefCheck for
lazypopulateis now also recognizing an empty list as a leaf. - menubutton builder (edvin#461)
- MenuButton.item builder
- Added Fragment support for
TreeCell
- Accessing last item in DataGridFocusModel was not possible
- Severe performance bug in SmartResize policy causing it to add exessive number of listeners (edvin#460)
- Parameters passed to Views will now be updated if you do another find() (edvin#443)
- SingleAssign now throws UninitializedPropertyAccessException instead of Exception
- Removed inc() and dec() from properties
- rangeTo from properties is now lazy
- loadFont size parameter is changed from Double to Number
- Lots of internal refactoring thanks to @tieskedh
- Kotlin 1.1.4
- Wizard and ViewModel are now internationalized
- imageview() builder accepts ObservableValue<Image?> (edvin/tornadofx-guide#43)
- added option to increment and decrement spinners by scrolling (edvin#425)
- onUndock is now called for the View currently embedded as the scene root of a Window when it closes (edvin#427)
- Launch helper for nicer main functions (edvin#431)
- TreeTableView.bindSelected()
- CheckMenuItem.bind()
- Button builders with text property support
- Collection Property Delegates (edvin#454)
- Workspace.create button and corresponding UIComponent onCreate callback and creatable property
- Lots of reified functions
- The default ErrorHandler shows structured information about failed HTTP requests
- RestException containing request, response and the underlying exception
- Added JsonBuilder.add(key, Iterable) to avoid having to call toJSON() on it (edvin#414)
- ViewModel partial rollback (edvin#420)
- FX.addChildInterceptor that can veto or custom add builder children to their parent. Useful for MigPane for example.
- Tab.select() for easier selection of tab without having to access tabPane.selectionModel
- TabPane.contains(UIComponent) and Iterable.contains(UIComponent)
- Override -fx-accent with type-safe CSS property accentColor
- Component.paramsProperty can be used to detec changes to incoming parameters (overriden on new find)
- the "params"-parameter of multiple functions accepts now a varargs of pairs as well
- Fieldset captions are gone (edvin#399)
- Fieldset padding is missing (edvin#401)
- AutoCompleteComboBoxSkin no longer throws upon reconfiguration
- AutoCompleteComboBoxSkin: Added an option to use automatic width for the popup
- weak delegate for easier construction of weak references that need a deinit callback
- The following extension functions (
managedWhen,visibleWhen,hiddenWhen,disableWhen,enableWhen,removeWhen,onHover) now return the node the are called on. - TableColumn.cellFragment to match ListView.cellFragment + SmartTableCell which encapsulate cellFormat, cellCache and cellFragment
- bindChildren(observableSet, converter) to completement the observableList version
- sequentialTransition, parallelTransition builders (edvin#373)
- ObservableList<*>.sizeProperty keeps track of the number of items in an ObservableList
- KeyboardLayout which can export to keyboard-layout-editor.com format
- ObservableValue.onChangeOnce() and ObservableValue.onChangeTimes(n) will disconnect listener after n events
- ViewModel.markDirty(property) to explicitly set a property dirty, for example when a bound list is changed internally
- ViewModel supports binding maps
MutableMap.toProperty(key) { generateProperty() }writes back into the map on change
- Form and Field properties got updated to the new more concise syntax propertyName() vs. property
- LazyTreeItem will now only set children once after getChildren is called.
- DataGrid properly updates when operating on a bound list (edvin#385)
- DataGrid reselects same index if item at selected index is removed (edvin#386)
- imageview builder now accepts null from an
ObservableValue<String> - TreeView.cellFormat now unbinds the textProperty and the graphicProperty
- Reified type parameter to ViewModel.bind() to solve properties that are null at the binding call (edvin#365)
- ViewModel.bind() for properties that are null at the binding call + now supports Long amd ObservableList as well
- Fixed Chart.series() bug (edvin#354)
- External/synced changes to bound ViewModel properties should not affect dirty state (edvin#358)
- showModal/showWindow now resizes the window before calling onDock, so the View can override placement easier (edvin#360)
- Avoid extension function confusion on
Configurableby introducing a newConfigPropertiessubclass and changing extension functions to member functions (edvin#362) - TreeTableView.resizeColumnsToFitContent() now waits until the skin is available instead of naively deferring to the next pulse
- Nested tableColumns with valueProvider lambda now nest correctly
- Kotlin 1.1.3-2
- DataGrid receives focus on click
- TableView refactoring, all cell manipulation functions are encapsulated in a SmartTableCell
- ItemViewModel's bind methods accept properties that return nullable values (edvin#389)
- ViewModel binding mechanism has been rewritten and supports lists much better now
- Stage.uiComponent()
- ViewModel.clearDecorators()
- Extensions for StringProperty and BooleanProperty
- Improved ProgressIndicator size for
runAsyncWithProgress
- Kotlin 1.1.3
openModalandopenWindowreturns the Stagedialogbuilder operates on a StageAwareFieldset so it can close the dialog easier by callingclose()- All JSON extractor functions support vararg keys, will pick the first available (edvin#350)
- ValidationContext.validate(decorateErrors = false) clears decorators
- Property.plus(), minus(), etc now return Bindings instead of Properties
- Extension functions to NumberProperty classes (obsNumOne + obsNumTwo etc)
- Reverted cellFormat change from 1.7.6 (edvin#349)
- Accessing json properties from app.config inside a view looked up view.config instead of app.config (edvin#346)
- UIComponent.forwardWorkspaceActions(target) will override the current receiver of button states and action callbacks
- replaceWith(component: KClass) accepts
sizeToSceneandcenterOnScreen - titledpane builder that accepts the title as ObservableValue
- TaskStatus.completed and FXTask.completedProperty can be used to listen to changes in completion state of a task
- runLater with optional delay:
runLater { }andrunLater(10.seconds) { .. } - ObservableValue.awaitUntil waits on the UI thread without blocking until a given value is set before resuming execution
- ViewModel.bind can create observable properties from mutable vars:
val name = bind(MyObject::name) - Rest.Response.Status enum with all official http status codes. (edvin#330)
hboxandvboxbuilders now have optionalalignmentparameterWorkspace.dockOnSelectWill automatically dock the givenUIComponentif theListMenuItemis selected.- Rest client supports Digest Authentication
- Inline commands can be defined with
command { }builder pattern - hyperlink builder has optional graphic parameter
- UIComponent has
currentStage,setWindowMinSize(width, height)andsetWindowMaxSize(width, height) - DrawerItem has
expandedPropertyandexpandedvar (edvin#332) - UIComponent.replaceWith has
centerOnScreenparameter - Shortcut overload for Commands:
shortcut(shortcut, command, param)
- TableColumn.useTextField() accepts Property<> - no longer requires ObjectProperty<>
- Workspace navigation now behaves more like a browser with regards to back/forward button functionality
- ConcurrentModificationException in EventBus fire mechanism
- UIComponent.headingProperty is bound to titleProperty by default, will be unbound if assigned value
- DefaultErrorHandler correctly handles errors with no stacktrace available (edvin#328)
- Non-bound properties inside ViewModels can locate it's ValidationContext, and hence can now be used with validators
- SortedFilteredList will not overwrite the backing list when column sorting is enabled in TableView (setAll disabled) (edvin#344)
- RowExpanders containing nested TableViews no longer inherits white label text when owning row is selected
- Calling
cellFormaton a TableCell that already has a formatter will now add the new formatter as a decorator instead of overwriting the old cellDecoratoronly decorates cells with items. It previously ran also when a cell item became null
- Kotlin 1.1.2-5
- Workspace will preemptively register for current scope in init()
runAsyncWithProgresswill display the progress indicator in thegraphicproperty if the parent isLabeled- Cleaned up menu and item builders, might require parameter adjustment in some cases
- UIComponent.currentWindow is fetched from
root.scene.stage, falls back tomodalStageorprimaryStage - ListMenu.activeItem accepts null to signal that no menu item is active
- Removed
childrenparameter fromhboxandvboxbuilders - they were early remnants from before we realized how powerful builders could be :) actiondelegate no longer hasActionEventas parameter so it can be used for no-args function references. Fallback tosetOnActionif you need the event.Injectablewas a misnomer and has been deprectated in favor ofScopedInstance- TaskStatus no longer disconnects the current task when the task is completed
Important notice: The field builder used to operate on the inputContainer inside the Field. This has been changed so that it now operates on the
field itself. If you did something like parent.isVisible = false to hide the field, you must now change your code to isVisible = false. This new
behavior is more as one would expect and hopefully the change won't cause any trouble to anyone.
- ListMenu.item builder gets tag parameter (can be used to identify the item)
- EventTarget.tag and tagProperty, useful for identifying Tabs, ListMenuItem and other components used in "selected" situations.
- Map.queryString creates an URL encoded query string from a Map. Useful for REST calls.
- Tab.enableWhen/disableWhen/visibleWhen
- TabPane.tab builder takes optional tag parameter. If no text parameter is supplied, tag.toString() is used
- Node.cache will create and cache a node inside another node. Useful for Cell implementations to reduce memory footprint.
graphic = cache { createNode() } - Rest client supports PATCH (edvin#320)
- warning(), error(), confirmation() and information() shortcuts to alert()
- Command bindings accepts optional parameter using invoke:
button { command = someCommand(someParam) }orbutton { command = someCommand with someParam } - ChoiceBox now supports Commanding
- TextField now supports Commanding
- TreeTableSmartResize.POLICY - activate with smartResize() (edvin#316)
- removeWhen/visibleWhen/enableWhen/disableWhen etc functions now also take an observable instead of a function that returns an observable.
- The
labelbuilder is now capable of taking a graphic nodelabel("some text", graphic) - ComboBoxBase.required() validator
- SmartResize.POLICY can now be installed by calling
smartResize()on anyTableView - SmartResize will automatically resize if the itemsProperty of the TableView changes value
- Workspace.showHeadingLabelProperty controls whether the heading is shown in the Workspace toolbar or not
- TableView/TreeTableView requestResize() will reapply SmartResize policy, useful after content change
- Column.makeEditable() works for all number subclasses
- Workspace
navigateForwardandnavigateBackexplicit functions - Style builder for MenuItem (edvin#327)
- imageview builder overloads that accepts observable urls or images
- AutoJsonModel supports String types
- HTTPUrlConnection based Rest Client Engine will read data from response even when not successful
- Support view reloading in OSGi environment
- Live Views did not reload changed classes correctly
- Fixed equals/hashCode in FXEventRegistration, could cause events to not fire on similar components
- lazyPopulate child factory was called on UI thread (edvin#318)
- SmartResize.requestResize() some times resulted in misaligned column headers
- JsonModelAuto supports more types and doesn't produce duplicates (before: name and nameProperty - now: just name)
- SmartResize flickers (edvin#321)
- Workspace navigation (viewPos index) stays intact even when views are manually removed from the
viewStack - ObservableValue.select() notice changes to outer property (edvin#326)
- Ignore duplicate onUndock call when both parent and scene are set to null
- Removed Workspace experimental warning
- alert content parameter is now optional
commandPropertyandcommandParameterPropertyare now writable so you can choose between bind or assign- CSS warning should not be issued in OSGi environment, since bundle activator installs CSS URL Handler
- All shape builders accepts
Numberinstead ofDoubleso you can writecircle(10, 10, 5)instead ofcircle(10.0, 10.0, 5.0) - ComboBox.validator moved to ComboBoxBase.validator to support ColorPicker and DatePicker as well
- Removed InstanceScoped and removed it from Wizard. It was not needed.
- Deprecated
menuitembuilders in favor ofitembuilders, which work the same way as other builders with respect to action (IDEA provides quick fix) - TreeView.lazyPopulate() is now data driven. If the returned list is observable, changes will be reflected in the tree (edvin#317)
- field builder now operates on the field itself instead of the inputContainer. You can now hide() the field directly in the function reference.
- TableColumn.useProgressBar() supports Number subtypes instead of only Double
wrapperbuilder which builds a node around the existing View rootListMenucontrol and correspondinglistmenubuildersvalidatorfunction takes optionalmodelparameter for use with properties not currently registered with the ViewModel (FXML support)ToggleGroup.selectedValueProperty()is a writable property of any type you choose. Settogglebutton(value)orradiobutton(value)to configure the value represented by each toggle.Wizard.enterProgresses = truewill go to next page when complete and finish on last page (edvin#310)ViewModel.onCommit(commits: List<Commit>)callback with more information about the commit- imageview builder that takes an image in addition to the existing one that takes a url
- fxml delegate supports setting optional root element
- Improved Java interop
- Java version of FX.find() can be called without specifying scope
Tab.whenSelectedcallback when the tab is selected
- Java version of Component.find() defaults to current component scope instead of DefaultScope
- NPE in layout debugger (edvin#305)
- Kotlin 1.1.2
- findParentOfType accepts subclasses
- splitpane() now has an optional orientation parameter
- Clicking outside of a modal InternalWindow click now play an error sound to indicate modality (edvin#308)
- ScrollPane.edgeToEdge boolean var to control the "edge-to-edge" style class (edvin#302)
- Android SDK compatibilty (See https://github.com/edvin/tornadofx-android-compat)
- Added
baseColorCSS property lazyContextmenuto add context menus that instantiate when the menu actually opens.
- Improved Java interop
- Removed faulty choicebox builder and replaced it with one similar to the combobox builder
authInterceptorwas deprecated in favor of better namedrequestInterceptor
- Fixed ViewModel validation bug for ComboBox, ChoiceBox and Spinner
- Autocomplete ComboBox listview matches width of ComboBox by default
- JsonStructure.save(path) actually saves (edvin#300)
shortpress/longpressactions (edvin#286)- Form layout supports arbitrary layout containers inside fieldsets (to support multiple rows of fields or any other form layout)
- radiomenuitem builder default argument for keyCombination (edvin#298)
- ViewModel bindings configured with autocommit must pass validation before the value is committed
- find takes op block to let you operate on the found Component directly
- Node.toggleButton behaves correctly if no togglegroup is available (edvin#296)
- ViewModel partial commit and validate:
commit(field1, field2) - Wizard component
- ViewModel.valid property will be updated as validators are added
- UIComponent.closeable property and corresponding default configuration in
Workspace.defaultCloseable - TabPane.add(SomeView::class) will bind towards title and closeable state of the UIComponent (edvin#294)
- TreeView.populate() is now data driven. If the returned list is observable, changes will be reflected in the tree
- Node.findParentOfType will now also find UIComponents
- Configurable default states for
savable,refreshableanddeletable(Workspace.defaultXXX property) Workspace.deletebutton andonDelete,deletableWhenandonDeleteonUIComponentTabPane.connectWorkspaceActionsmakes theTabPanea target for save/refresh/delete actions- Autocomplete tooltip mode for non editable ComboBox (edvin#293)
UIComponent.apppoints to the current application instanceconfigbase path configurable viaApp.configBasePath- Per component
configpath configurable viaUIComponent.configPath - Global configuration object
app.configworks like the one inUIComponent, saves toconf/app.propertiesby default - TabPane.contentUiComponent will retrieve the UIComponent embedded in the selected tab
- UIComponent callbacks for
onNavigateBackandonNavigateForwardcan veto Workspace navigation - Improved TableView.selectOnDrag (edvin#262)
- Functions to load and save Json objects and JsonModel
- Rest Client supports absolute URI's without appending base URI (edvin#289)
replaceWithgetssizeToSceneboolean parameter, defaults to false (edvin#283)shortcut("keyCombo") { .. }andshortcut(KeyCombo) { .. }configures key press initiated actions- UIComponent.accelerators map now works from any View, not just Views embedded in a Workspace (edvin#253)
- Added Scope.hasActiveWorkspace to check if the workspace inside the current scope has been activated
Button.shortcutalso works when button is embedded in sub view (edvin#253)- DataGrid correctly calculates horizontal scrollbar
- DataGrid.maxRows will constrain the max number of rows and override maxCellsInRow if needed (edvin#287)
- DataGrid properties are now StylableObjectProperties to make them bindable
configcan now read and write JsonObject and JsonArray- TableView.bindSelected uses listener instead of unidirectional binding
- Simplified ItemViewModel binding:
val name = bind(Customer::nameProperty)instead of the oldval name = bind { item?.nameProperty } - Any?.toProperty() will wrap any value in an observable property, even nullable properties
- TableColumnBase.style builder
- Node.managedWhen builder binding
- Int/Double Spinner builders merged into one Number builder for better compatibility
- Spinner builders have defaults for min (0), max(100), initialValue (property.value if supplied) (edvin#274)
- paddingLeft/paddingRight converted from Double to Number
- JsonObject.contains(text) and JsonModel.contains(text)
- Button.action() shortcut istead of Button.setOnAction()
- ObservableList.invalidate()
- Dialog.toFront()
- Node.whenVisible
- ListCellFragment.onEdit
- ItemViewModel allows passing in the itemProperty
- First togglebutton builder inside a togglegroup will be selected by default (disable with
selectFirst = false) - ToggleButton.whenSelected
- SortedFilteredList refilters when items change (add, remove, permutate)
- SortedFilteredList is editable and supports all functions of the ObservableList interface
- ObservableXXXValue.onChange functions should support nullable values
- Changed semantics of
Node.removeWhento switch visible/managed state instead of adding/removing from parent - Internal: ViewModel maintains a map between bound properties towards the ViewModel to support validators in a cleaner way without reflection calls to private APIs (edvin#276)
- Kotlin 1.1.1 and JvmTarget 1.8
- SortedFilteredList.refilter() causes the existing predicate to be reevaluated
- openModal(resizable) and openWindow(resizable) optional parameter
- TextInputControl.trimWhitespace() enforces on focus lost instead of onChange (prevented adding words with whitespace)
- ViewModel.bind accepts cast to IntegerProperty/DoubleProperty/FloatProperty/BooleanProperty even when binding is null at construction time
- Added
loadFonthelper function
- EventTarget.bindComponents(sourceList, converter) syncs the child nodes of the event target to the given observable list of UIComponents via the converter
- EventTarget.bindChildren(sourceList, converter) syncs the child nodes of the event target to the given observable list via the converter
- ObservableList.bind(sourceList, converter) syncs two lists and converts from one type to another on the fly
- API Break: Removed Node.margin helper because it shadowed margin property on Nodes which had their own margin property
- ValidationContext.validate() has optional
decorateErrorsparameter - ValidationContext and ViewModel has
validobservable boolean value - Kotlin 1.1 dependency
- Added MenuItem.visibleWhen
- Fixed:
workspace.dockInNewScope(params)operates on current scope instead of the new buttonbarbuilder informnow creates and operates on aButtonBarcontextmenubuilder now works on any Node, not just Control- EventBus
subscribe(times = n)parameter will unregister listener after it has firedntimes (http://stackoverflow.com/questions/42465786/how-to-unsubscribe-events-in-tornadofx) - TextInputControl
trimWhitespace(),stripWhitespace(),stripNonNumeric(),stripNonIntegercontinually strips or trims whitespace in inputs - JSON
datetimefunction has optionalmillisparameter to convert to/from milliseconds since epoch instead of seconds JsonConfig.DefaultDateTimeMillis = truewill causedatetimeto convert to/from milliseconds since epoch by default- Improved Form prefWidth calculations
- MenuItem.enableWhen function
- Custom tab support for Views. Views can be docked in tabs and even delegate to refreshable and savable for the surrounding View
- resources stream/url/get helpers are not non-nullable
- Added resources helper to App class
- Added TrayIcon support (https://gitallhub.com/edvin/tornadofx/issues/255)
- EventBus
fire()function is now available from the App class ComboBox.makeAutocompletable()
- resizeColumnsToFitContent takes nested columns into account
- SmartResize.POLICY takes nested columns into account
- scrollpane builder now has fitToWidth and fitToHeight params
- typesafe pojo column builders for TableView and TreeTableView eg. column( "Name", MyPojo::getName )
- spinner builders takes property param
include(fxmlFile)builder supportfxml()Views now supports nested includes / controllers injected viafxid()(name of controller isfx:id+ "Controler")- SqueezeBox.fillHeight property
- Added svgicon builder
- Removed Node.alignment helper, it was misleading
- Added collapsible parameter to titledpane builder
- Added Component.hostServices property to access a JavaFX HostServices instance
- Improved TableView.column builder so it finds mutable properties even when constructor params with same name is present (edvin#247)
- Workspace.viewStack is public
- Workspace detects dynamic components anywhere inside the WorkspaceArea
- TableView.selectOnDrag() will select rows or columns depending on the current selection mode
- resources.text, resources.image and resources.imageview helpers
- Workspace has NavigationMode Stack (default) and Tabs
closeModal()deprecated in favor ofclose()since it will also close tabs and non-modal + internal windows- SqueezeBox has multiselect option (still defaults to true)
- ContextMenu.checkboxmenuitem builder
- UIComponent.icon property used by Workspace and Drawer
- Workspace Drawer support (workspace.leftDrawer/rightDrawer)
- Drawer component
- SqueezeBox panes are now
closeable - Form buttonbar alignment is now working correctly
- UIComponent.currentWindow property
- openModal/openWindow defaults to currentWindow as owner (edvin#246)
- Accordion.fold has
expandedparameter - Fixed: ComboBox with cellFormat does not show bound element (edvin#245)
- whenSaved and whenRefreshed lambdas as alternative to overriding onSave and onRefresh
- Workspace onSave and onDock delegates to the docked View
- InputStream.toJSON and .toJSONArray + resources.json(key) and resources.jsonArray(key)
- Color.derive and Color.ladder
- Rest.Response implements Closeable so it can be
useed (edvin#237) - UIComponent
disableSave()anddisableRefresh() - can now bind to a pojo by providing only a single getter ( eg. person.observable( JavaPerson::getId ) )
- API break: previously returned a PojoProperty - now returns an ObjectProperty
- uses javafx.beans.property.adapter.JavaBeanObjectPropertyBuilder and will now propogate PropertyChangeEvents from the pojo
- UIComponent.headingProperty is ObservableValue for easier binding
fieldbuilder supportsorientationparameter which will cause input container to be a VBox instead of an HBox (edvin#190)- UIComponents can now be instantiated manually instead of via inject() and find()
- Input Control builders now support ObservableValue instead of just Property for automatic binding
- ListView.useCheckbox()
- ItemViewModel.asyncItem helper to reload the underlying item
- Corrected Workspace.dockInNewScope, docking was performed in the old scope (!)
- Workspaces (https://edvin.gitbooks.io/tornadofx-guide/content/16.%20Workspaces.html)
- OpenXXX functions: Windows opens centered over owner if owner is passed in as parameter (edvin#231)
- API break: View params are now map(property-ref, value) instead of vararg Pair(String, value)
- menu builder correctly supports sub-menus
- Introduced
itemmenu item builder, should be used in favor ofmenuitem, which took the onAction callback insteadof an operation on the MenuItem as the op block parameter (breaks with the other builders) - menu builder accepts graphic parameter
- ViewModel autocommit bindings doesn't affect dirty state any more
- buttonbar builder for forms
- InternalWindow now has
overlayPaintthat defaults `c("#000", 0.4) - builderInternalWindow added
- ItemViewModel constructor takes optional initial value
ObservableList.asyncItemsandListProperty.asyncItemsconfirm()function that executes an action if the user confirms- di delegate overload to support injecting a dependency by name (in addition to type)
builderFragmentandbuilderWindowbuilders - fragment and window by just supplying a title and builderObservableList<T>.onChangeto easy listening to change events from observable listssetInScope()now uses correct KClass when entering the injectable into the components mapItemViewModel.isEmptyboolean, complementsemptypropertysetStageIcon(icon)will replace all existing icons with the supplied (edvin#228)TableColumn.useCheckbox(editable = true)now fires edit/commit events when value is changed- Create nested, observable, writable properties using the
observableValue.select()function - ViewModel
bindhas optional parameterforceObjectPropertyto avoid creatingIntegerPropertyfor ints etc, so you can have nullable values TableView.onEditCommit()handler fires when a cell is edited. No need to manage domain object value, just add your business logic- Fixed scope support.
DefaultScope(MyController::class)orMyController::class.scope(DefaultScope) - TableColumn hasClass/addClass/removeClass/toggleClass supports type safe stylesheets
- Lots of functions that earlier accepted Double now accept Number
- TableView.enableCellEditing() makes table editable and enables cell selection
- TableView.regainFocusAfterEdit() - make sure TableView doesn't look focus after cell edit
- TableColumn.makeEditable(converter) - supply specific converter for editable fields
- TableColumn.converter(converter) - supply specific converter for read only text fields
- TableColumn.makeEditable() supports BigDecimal
- Added scope.set(injectable) as easier alternative to setInScope(injectable, scope)
- tableview builder that takes
ObservableValue<ObservableList<T>>, supporting automatic rebind when items change - vbox and hbox builders supports any Number as spacing parameter, not just Double
runAsyncexposesTaskStatusmodel for binding towards task states: running, message, title, progress, valuerunAsyncnow run in the context ofTaskso you can accessupdateMessage()etc- progressbar and progressindicator builders binds to
Property<Number>instead ofProperty<Double>to supportDoubleProperty - Added
insets()builder - Fixed a race condition in Slideshow with overlapping transitions (edvin#225)
- Node
onHover { doSomething() }helper, param is boolean indicating hover state - Node builder bindings: disableWhen, enableWhen, visibleWhen, hiddenWhen, removeWhen
- ObservableValue.toBinding() converts observable boolean to BooleanBinding
- TableCell.useCombobox now supports every kind of Property (bug)
- Observable padding properties for Region
paddingXXXProperty(top/right/bottom/left/vertical/horizontal/all) - Padding vars for Region: `paddingXXX' (top/right/bottom/left/vertical/horizontal/all)
- Added
proxyprophelper to create proxied properties - DataGrid
maxCellsInRowproperty (also CSS styleable as-fx-max-cells-in-row) - Added
DataGrid.asyncItemsto load items async with more concise syntax - Added
DataGrid.bindSelectedto bind selected item to another property or ViewModel - Fixed a ViewModel binding bug causing errors if external changes were made to a bound facade
- Added
squeezeboxbuilder. SqueezeBox is an accordion that allows multiple open titledpanes, added usingfold() cellCachesupports builders. Earlier, builders would be appended to the ListView, creating undesirable resultsScene.reloadViews()is removed from the public API, no need to call it manuallytitledpanebuilder now accepts op parameter like every other builder. node parameter is now optional- Fieldset.wrapWidth is now Number instead of Double
- UIComponent has
isdockedPropertyandisDockedboolean telling you if the ui component is currently docked - Added CSS elements to type safe stylesheets so you can now target f.ex HBox even if it doesn't have a CSS class
- Pass parameters to ui components using inject/find. Inject params via
val myParam : Int by param()in target view. - booleanBinding and stringBinding now adds observable receiver as dependency
- Eventbus:
FXEventclass withsubscribe(),unsubscribeandfirefunctions (https://edvin.gitbooks.io/tornadofx-guide/content/15.%20EventBus.html) - InternalWindow is public, close() will also close InternalWindow
setInScope(value, scope)allows you to preemptively configure an injectable property- Allow Labeled.bind() to work on ObservableValue instead of just Property
- HttpClientEngine now adds default json headers to request
- Fixed Bug: Unconsumed POST requests are not posted to the server completely
- Add Connection: Keep-Alive and User-Agent headers to the default rest client engine
- WritableValue.assignIfNull(creatorFn) assigns to the value by calling creator unless it is already non-null
- Button.accelerator(KeyCombination) adds shortcuts to buttons (edvin#205)
- Slideshow component and slideshow builder
- openInternalWindow(SomeOtherView::class) opens a window ontop of the current scene graph
- bindStringProperty respects given format (edvin#210)
- Proxy support for Rest client (Set
client.proxy = Proxy()) - Pane builder (edvin#208)
- Iterable.style will apply styles to all elements in collection
- Added
Node.alignmentproperty that knows how to apply alignment depending on the parent - Added
Node.marginproperty that knows how to apply margin depending on the parent - canvas builder
- All constraint builders no longer set default values for properties that are not overridden
- Added canvas() builder
- Kotlin 1.0.5-2
- Added
stackpaneConstraintsbuilder (margin/alignment) (edvin#206) - Added
Node.hgrowandNode.vgrowproperties (edvin#204) - ComboBox.cellFormat also formats button cell by default with option to override
- UIComponent.openWindow() opens a new modeless Window
- TreeView.bindSelected(itemProperty) and TreeView.bindSelected(itemViewModel)
- Rest POST supports InputStream (edvin#200)
- Removed deprecated
findFragment- usefindinstead - ViewModel.ignoreDirtyStateProperties list of properties that should not be considered when calculating dirty state
- Removed deprecated
replaceWithoverloads (edvin#199) - Scope support
- ViewModel is now
ComponentandInjectableso it supports injection. - addClass/removeClass/toggleClass now also works for pseudo classes (edvin#198)
- ItemViewModel().bindTo(listCellFragment)
- resources.stream("some-resource") locates InputStream for resource
- Added custom renderers to custom CSS Properties (edvin#203)
- Fixed LayoutDebugger not showing debugged scene correctly (edvin#192)
- App.shouldShowPrimaryStage() can be used to initially hide the primary stage
- Node.onDoubleClick handler
- chooseDirectory function
- ListView.bindSelected(itemProperty) and ListView.bindSelected(itemViewModel)
- TableView.bindSelected(itemProperty) and TableView.bindSelected(itemViewModel)
- Added ItemViewModel to reduce boiler plate for ViewModels with one source object
- SortedFilteredList now supports editing writeback to the underlying observable list
- View.replaceWith now updates scene property to support Live Views (edvin#191)
- ViewModel bind return value is now optional to support eventually available items
- ViewModel detects changes to the source object and applies to the model counterpart automatically
- ViewModel
bind(autocommit = true) { .. }option - Mnemonic in Field labels (form -> field -> input.mnemonicTarget())
- Added ItemFragment and ListCellFragment. Will add TableCellFragment etc shortly.
- Added TreeView.cellDecorator
- Node.hide and Node.show
- Node.toggleClass(class, observableBooleanValue)
- Removed cell as
thisforcellCache. The cell could change, so taking it into account was a mistake. - App MainView parameter can now be a
Fragmentas well asView - ListView
cellCacheprovider to create a cached graphic node per item - Kotlin 1.0.4
- The
di()delegate no longer calls out to theDIContainerfor every access, effectively caching the lookup - The
fxid()delegate can now inject any type, not justEventTargetsubclasses - Added non-null
onChangeoverrides for primitiveObservableValues - Fixed bug with
Node.fadereversed animations (was also affectingViewTransitions) - Deprecated confusing CSS
addfunction if favor ofand
- ViewModel.onCommit() function that will be called after a successful commit
- TableView SmartResize Policy (https://github.com/edvin/tornadofx/wiki/TableView-SmartResize)
dynamicContentbuilder that will replace content in a Node when an observable value changes- Alternative
TableView.columnbuilder with auto-conversion to observable value (column("Title", ReturnType::class) { value { it.value.somePropertyOrValue }) - DataGrid component
- TableColumn
cellCacheprovider to create a cached graphic node per item - Padding shortcuts (paddingRight, paddingLeft, paddingTop, paddingBottom) to Region
- TableView support for Nested Columns (
nestedColumn(title) { // add child columns here }) - TableView support for expanded row node (
rowExpander { // create node to show on expand here }) (https://edvin.gitbooks.io/tornadofx-guide/content/5.%20Builders%20II%20-%20Data%20Controls.html#row-expanders) - Fixed bug where image URLs defined in CSS were rendered wrong
- Added support for skipping snake-casing in CSS rules (names still have to be valid css identifiers)
- Fixed bug where CSS selectors defined with strings would have their capitalization changed (
".testThing"=>".test-thing",cssclass("testThing")=>.test-thing) - Updated the
ViewTransitioncode to be more flexible (including now working with anyNode, not justViews andFragments).- Also added several new built in
ViewTransitions
- Also added several new built in
- Added new
Nodeanimation helper functions for various transformations - FXML files can now contain
fx:controllerattribute to help with content assist, ifhasControllerAttribute = trueis passed to thefxmldelegate (edvin#179) - Fix exception in chooseFile when user cancels in Multi mode
- Stylesheets can be loaded via ServiceLoader (
META-INF/services/tornadofx.Stylesheetwith reference to the stylesheet class) - Default constructor was re-added to
tornadofx.Appto supportRun Viewin IDEA Plugin resizeColumnsToFitContenthasafterResizecallback parameter- SortedFilteredList.asyncItems function
- SortedFilteredList can now be assigned as items to tableview/listview builder without calling
bindTo DefaultErrorHandler.filterlistens to uncaught errors and can consume them to avoid the default error dialog.json.add(key, JsonModel)automatically converts to JSON- CSS DSL now supports imports through constructor parameters. e.g.
class DialogStyle : StyleSheet(BaseStyle::class) { ... } - Fixed a bug in
View.replaceWithwhich caused the whole scene to change even when for sub views
This release fixes an issue with type safe stylesheets. importStylesheet(Styles::class) would fail unless an OSGi runtime was available.
App.createPrimarySceneoverridable function to specify how the scene for the primary View is created- OSGI manifest metadata
- LayoutDebugger can edit new Node properties:
spacing - Stylesheets can be dynamically added at runtime and will affect all active scenes
- Convenience methods for creating bindings on any object. e.g.
stringBinding(person, person.firstNameProperty, person.lastNameProperty) { "$firstName, #lastName" } - View/Fragment takes optional title in constructor
- UIComponent.showModal now supports reopening even if modalStage was never removed
fieldsetblock now operates on anHBoxinstead ofPaneso you can writealignment = Pos.BASELINE_RIGHTto right-align buttons etc- Set modalStage before showAndWait() (edvin#151)
Parent.findandUIComponent.findrenamed tolookupfor better alignment with JavaFXlookupand to avoid confusion withfind(View::class)- Improved
BorderPanebuilders, they also now acceptUIComponentreferences instead of instances - Builders now operate on
EventTargetinstead ofPaneand as a result, many builders have improved syntax and functionality - Reduced boilerplate for
Appcreation (you can now useclass MyApp : App(MyView::class, Styles::class) - ViewModel
commitandrollbackrun on the UI thread because decorators might be invoked - ViewModel
commitaccepts a function that will be run if the commit is successful findcan now also findFragments, sofindFragmentis deprecatedlookuptakes an optional op that operates on the UIComponent it foundTreeTableView/TableView.populateaccepts any kind ofIterable<T>instead ofList
- Validation support
- Decoration support
- Node.removeFromParent()
- Dimension arithmetics (edvin#146)
- Get a reference to objects in other Components via
get(ComponentType::propertyName)and set them viaset(ComponentType::propertyName, value Node.replaceChildrenreplaces current children with new ones created with builderNode.runAsyncWithProgressshows a progress indicator instead of while async task is runningrunAsyncon Injectable class references (CustomerController::class.runAsync { listContacts(customerId) })runAsyncon Injectable class function references (CustomerController::listContacts.runAsync(customerId))ObservableValue.onChangelistenerUIComponent.whenDockedandUIComponent.whenUndocked- LayoutDebugger (https://github.com/edvin/tornadofx/wiki/Layout-Debugger)
- ViewModel (https://github.com/edvin/tornadofx/wiki/ViewModel)
- TableView
cellDecorator - ComboBox
cellFormatformatter function - TreeView
lazyPopulatealternative topopulatethat lazily creates children as needed - TreeItem nesting extension functions (edvin#134)
- TableView
selectWhere(),moveToTopWhere()andmoveToBottomWhere()(edvin#134) - Group builder
group - Improved tab for tabpane builder
tab("Name") { operateOnTab(); content { .. } } - Create bindings dependent on an ObservableValue:
objectBinding+integerBinding,longBindingetc for all applicable types - New, simplified method of creating properties
val nameProperty = SimpleStringProperty(); var name by nameProperty(edvin#143) - Extract a JsonObject and turn it into a JsonModel by with
json.jsonModel("key") kotlin-reflect.jaris now a default dependency. It can be removed if you don't use any of the TableView.columnfunctions. Over time, more features will probably require it.- Replace View function
UIComponent.replaceWithnow acceptsKClass<View>andKClass<Fragment>as well as UIComponent instances - label() and text() builders now accepts an ObservableValue for unidirectional binding
- Added non-null JSON getters (
getLong(key)returns Long whilelong(key)returns Long?) - Improved compatibility with ScenicView by not creating inline/crossinline cellformatters (https://youtrack.jetbrains.com/issue/KT-13148)
- ImageView builder now loads image lazily by default
- CSSUrlHandler force install moved to CSS.CompanionObject to make sure it happens in time
- addClass/removeClass now accepts vararg
- alert() function now returns Alert object
- Fixed bug: Inherited properties cannot be accessed via getProperty - NoSuchFieldException (edvin#141)
- Uncaught exceptions will now be logged to the console to ensure error message delivery even when UI is not initialized
- Fixed CheckBoxCell binding (edvin#140)
- Builder op block made optional on many builders (edvin#126)
- Fixed bug in chooseFile (returned list with null instead of empty list when nothing was selected
- Shape builders (edvin#129)
- Animation builders (edvin#131)
- Replace View function:
UIComponent.replaceWith fxid()specific fx:id name as optional parameter- webview builder
- Call
onUndockwhen UIComponent.modalStage closes - Rewrite of the CSS sub structure, cleaner selector syntax, negative dimensions, no need for
selectkeyword for single selectors
- Multivalue property support in type safe stylesheets (API break)
UIComponent.onDockandUIComponent.onUndock
- Default Rest Engine supports gzip/deflate
- Default Rest Engine adds Accept: application/json by default
- Moved box/c functions outside CssBlock so they can be used in Stylesheet companion object
- Better error reporting and logging for missing or wrong fx:id vs fxid() usage
- Convert Iterable to JsonArray (
Iterable<JsonModel>.toJSON()) - Clipboard functions (edvin#110)
- ContextMenu builder
- TreeTableView column builder that takes an observable value creator
- TreeTableView
rowItemaccessor - TreeTableView
onUserSelect - Preferences can be saved and loaded using the prefences function, see edvin#107
- Inline type safe styles
- Easier navigation of View to Node and Node to View (edvin#112)
- Fragments can be declaratively created via
fragmentdelegate - Type Safe CSS URL Handler will be force-installed if the JVM does not pick it up
- Upgrade to Kotlin 1.0.2
- Form Builder (edvin#111)
- openModal supports new optional
blockandownerparameters - Spinner builder (edvin#106)
- POJO Binding Support (edvin#104)
- App can be started without overriding
primaryView-> startup parameter--view-class=package.View - addClass, removeClass, toggleClass returns the Node it was applied to (for chaining support)
- Live Views no longer reloads nested UIComponents twice (edvin#98)
- Added log info message when a View is reloaded
openModaldid not configure tornadofx.scene correctly, causing issues with Live ViewsNode.setId(Styles.someId)did not set the correct value
- SingleViewApp increased framework complexity and had too many caveats so it was removed
- UIComponent.pack/unpack was removed because their function was not needed and not intuitive (edvin#98 (comment))
- Program parameters
--live-stylesheets,--live-views,--dump-stylesheetsand--dev-mode - Hot View Reload (edvin#96)
children(nodeList)builder helper to redirect built children to a specific node list (edvin#95)buttonbarbuilder (edvin#95)ButtonBar.buttonbuilder (edvin#95)togglegroupbuilder
- Type Safe CSS Builders (edvin#80) Docs here
- TableColumn/TreeTableColumn
addClass/hasClass/removeClass/toggleClassfunctions - Binding support (edvin#91)
FX.registerApplication(app, stage)function for easy integration with existing apps (edvin#89) Docs herecolorpickerbuilder (edvin#76)chooseFileFile Chooser (edvin#76)paginationbuilder (edvin#76)- Configurable alert dialog
Node.bindClassapplies an observable style class to a node (edvin#88)- Toolbar.spacer and ToolBar.separator builders
- Fixed dual instantiation of SingleViewApp
runAsyncreplacesbackgroundto avoid collisions withRegion.background.backgroundis now deprecated
- External dependency injection support - Guice, Spring++ (edvin#79)
SingleViewAppfor small/example applications (edvin#74)SortedFilteredListfor sorting and filtering data in list controls (edvin#62)TableView.makeIndexColumn(edvin#64)tableviewbuilder accepts optional item listTableColumncell factories:useComboBox,useTextField,useChoiceBox,useProgressBar,useCheckboxanduseDatePicker(edvin#67)TableColumn.enableTextWrap(edvin#65)TableColumncell factory that wrapsPropertyValueFactoryfor better POJO support (edvin#75)splitpanebuilder (edvin#72)anchorpanebuilder (edvin#84)accordionbuilder (edvin#73)JsonStructure.toPrettyString(edvin#77)textbuilder (edvin#76)textflowbuilder (edvin#76)htmleditorbuilder (edvin#83)hyperlinkbuilder (edvin#78)passwordfieldbuilder (edvin#78)radiobuttonbuilder (edvin#78)togglebuttonbuilder (edvin#78)sliderbuilder (edvin#81)separatorbuilder (edvin#82)choiceboxbuilder (edvin#82)
- Upgrade to Kotlin 1.0.1-2
Node.toggleClasscould potentially add duplicatesTableView/TreeTableView.resizeColumnsToFitContentscans 50 rows by default- HttpURLEngine correctly sets Content-Type header
- Som builders were not all lowercase (titledPane renamed to titledpane)
- Chart builders (edvin#55) Examples here
- Tooltip builder (edvin#58)
This version is binary incompatible if you used the REST Client, perform a clean build when upgrading.
As Apache HttpClient is no longer required, most of the HttpResponse extension functions
has been removed and reimplemented in the Rest.Response interface. If you accessed HttpClient
classes directly, you will need to adjust some code. See the REST Client documentation
for updated information.
- Injection support in the
Appclass (edvin#54) TableView/TreeTableView.resizeColumnsToFitContentfunction (edvin#48)TreeTableViewandTreeViewbuilders (edvin#47)- Easy access to application resources (edvin#44)
- Alternative view location for
fxml()delegate
- Upgrade to Kotlin 1.0.1
Apache HttpClientis now an optional dependency. Rest API usesHttpURLConnectionby default (edvin#40)
- @FXML delegate (edvin#34)
- i18n Support (edvin#29)
TableView.column()support forObservableValuemember fieldsFX.runAndWaitsync execution helperTableColumn.makeEditableextensionJsonModelAutoautomatically converts from JavaFX Properties to JSON (requires kotlin-reflect)- Menu/MenuItem builders
- More layout builders
- More constraints for builders
ListViewbuilderScrollPanebuilder
Fragmentshould not be injectable (edvin#31)
FXTableViewremoved,columnfunctions are now extensions onTableViewTableView.addColumnremoved, replaced by the newcolumnfunctions
- Arbitrary properties per
Component(edvin#23) singleAssign()property delegates (edvin#17)- Tests for
singleAssign() - BorderPane builder (edvin#16)
Node.gridpaneConstraintsextension function (edvin#12)Node.vboxConstraintsextension functionNode.hboxConstraintsextension functionTableViewbuilder (edvin#11)- Async loading of items for datadriven components (edvin#14)
task/uito run async jobs outside ofComponent
- Builder for Tab now require the content pane as input parameter to avoid confusion (edvin#8)
- UIComponent#openModal() no longer requests focus for root component - caller can decide instead
- Property delegate now produces non-nullable property types
GridPane.row()no long hogs the GridPaneuserDataobject to track rowId
- Delegates for JavaFX Properties (edvin#3)
- Changed Maven coordinates to
no.tornado:tornadofx - Recompiled for Kotlin 1.0
- Property support for builders, i.e
textfield(customer.nameProperty) - More builders
- Rest client now uses PoolingHttpClientConnectionManager to support multiple threads
- HttpResponse.consume() never throws exception
- Recompiled for Kotlin RC