Releases: jMonkeyEngine-Contributions/Lemur
Lemur version 1.7.1
This release includes some InputMapper enhancements that make it easier to inspect existing mappings and functions. This is useful for implementing configuration UIs or making smarter default mappings.
Also, the scene picking system now supports layers for the different viewports to make it easier to manage the order in which viewports are picked.
Finally, this is the last release that will work with jMonkeyEngine prior to alpha4. All future releases will be alpha4+ compatible only. jME has refactored the Application class into an interface so all app states or anything else referencing the Application class need to be recompiled.
Updates in this release:
- Added InputMapper.hasMappings() method to return true if a FunctionId
has inputs associated with it. - Added InputMapper.getMappings(FunctionId) to return all of the input
mappings currently associated with a particular function. - Added InputMapper.getFunctionIds() to return all FunctionIds that
are registered with the InputMapper, either associated with inputs
or with function listeners. (Useful for displaying configuration screens.) - Added InputMapper support for InputConfigListener so that applications can
choose to be notified about changes to input mappings. - Added Label.setMaxWidth() which is a stylable attribute that constrains
the width of the lable, forcing text to wrap and grow vertically if it
exceeds that width. This helps with setting up layouts that include
Labels that might wrap anyway because of other layout constraints.
Because of the single-shot nature of preferred size calculation, it
can't deal with components that change height because their width
was constrained later. - Refactored MouseAppState and TouchAppState to share a common base class
that contains the duplicate code. - Added a PickState interface that can be used to grab either the MouseAppState
or TouchAppState depending on which is being used. This insulates applications
from having to care. - Modified the pick states and pick session to support a 'pick layers' concept to
provide better control over the order in which the layers are checked for collisions.
By default, the GUI layer is checked and then the SCENE layer but the applications
can now add their own layers by changing this ordering with PickState.setPickLayerOrder() - Pegged the JME dependency at alpha3 since the next version will be alpha4+ specific.
LemurProto version 1.6.1
This is functionally equivalent to the 1.5.1 release except that it has been recompiled to work with jME v3.1.0 alpha4 or better.
jME 3.1.0 alpha4 has reorganizing the Application classes and requires a recompile for anything referring to Application like app states, etc..
Lemur version 1.6.1
This release includes some minor fixes over the last one and a few improvements. The only real new feature is the effects and animation system that allows for styled animations to be added to any GUI element.
This should be a safe drop-in replacement for 1.5.x
This release is also the first to be posted to the public jcenter repository and can now easily be directly incorporated into gradle or maven builds:
com.simsilica:lemur:1.6.1
Updates in this release:
- Fixed an issue in DefaultRangedValueModel where the 'value' field
was used directly instead of calling getValue(). This made it harder
for subclasses to implement custom behavior. - Added a Slider(model, ElementId) constructor.
- Modified the style Attributes class to auto-merge Map-based attribute values
using the same override logic that the Attributes class itself uses. - Added a basic animation system and GUI element stylable effects API.
- Added a setEffects() method to Panel that is stylable. Also added a few
other runEffect(), addEffect(), etc. methods related to the new animation
system. - Modified Button to automatically attempt to run effects for the various
button events. - Modified CommandMap to support null values in the addCommands() call
that can be used to clear out any previously added values. - Fixed a bug in Container where children that called removeFromParent()
left the layout in an inconsistent state. Now a regular detachChild()
will check the layout first before detaching the child. - Added getLastVersion() and getObjectVersion() methods to VersionedReference.
- Converted some System.out.println() warnings in InputMapper to actual log
warns. - Added AnimationState to the default states setup in GuiGlobals.
- Fixed joystick axis event processing to pay attention to the reported dead
zone of the axis. It will take the max of the specific axis' dead zone and the global
InputManager.getAxisDeadZone(). - Fixed a bug in InputMapper where key mappings that had negative scale
weren't triggering negative state in state listeners. - Fixed QuadBackgroundComponent and TbtQuadBackgroundComponent to allow setting
the alpha even if the color has not been set. Color defaults to white in that
case. - Updated TextField and TextEntryComponent to support a 'preferred line count'
property which helps set the preferred height of a text field based on the
current font and a line count. - Modified TextEntryComponent to properly implement ColoredComponent and support
alpha. - Fixed an IndexOutOfBoundsException in TextEntryComponent when setting text to "".
- Added Button constructor that takes just text and ElementId.
- Modified scene picking to deal with ortho cameras correctly. Now it's only
the Gui bucket that is special case. - Modified scene picking to adhere to camera viewport limits.
- Fixed DragHandler to allow external z-value changes in 2D dragging.
- Added textureCoordinateScale property to QuadBackgroundComponent.
LemurProto version 1.5.1
A minor feature release over 1.4.x mostly to sync up with the new maven/gradle public repo release in jcenter.
Can now be retrieved from jcenter with the following maven/gradle dependency:
com.simsilica:lemur-proto:1.5.1
Updates:
- Modified OptionPanel and OptionPanelState to run effects on
open or close. - Added a VersionedReferenceList that can be used to watch several
VersionedReferences for changes.
Lemur version 1.5.2
This has just a few bug fixes and small improvements over version 1.5.1:
https://github.com/jMonkeyEngine-Contributions/Lemur/releases/tag/v1.5.1
It should be a safe drop-in replacement.
This release is a baselining before adding some new features that will bump the major version up.
Note: if you find this project useful to you in they "Hey, I'd like to buy that guy lunch sometime" kind of way... consider becoming a patron: https://www.patreon.com/pspeed42
Current required dependencies (same as 1.5.1):
guava (newer than 12)
slf4j-api-1.7.5 (and a logging adapter)
jme core 3.1
optionally: groovy-all.jar 2.1.9 or later if you want style file support
Bug fixes and patches in this release:
- Added Documented annotation to StyleAttribute so that it shows up in the javadoc. (oops)
- Fixed bug in Panel where insets were not applied during setInsets() if an InsetsComponent had been previously set (or insets were set a second time).
- Fixed a bug with up/down event processing in Button. It was possible to receive up events when no down event was received. Now every down gets an up and there are no ups without downs.
- Added an additional constructor to Container that takes a layout and elementId.
- Added a simplified SpringGridLayout constructor that just takes the axes for axis ordering.
- Modified DefaultMouseListener to have more configurable click detection. A click threshold can be specified on the constructor instead of being hard-coded to three. Also, the click detection is done with an easily overridable method.
- Fixed IconComponent to allow setting the alpha value even if a color has not been set. Color defaults to white in that case.
LemurProto version 1.4.2
This is a minor bug fix and small enhancement update over version 1.4.1.
https://github.com/jMonkeyEngine-Contributions/Lemur/releases/tag/proto-v1.4.1
Was built with Lemur 1.5.2 but should still be compatible with 1.5.1.
Note: if you find this project useful to you in they "Hey, I'd like to buy that guy lunch sometime" kind of way... consider becoming a patron: https://www.patreon.com/pspeed42
Changelog:
- Added an additional constructor to OptionPanel to allow specification of the ElementId for the panel.
- Fixed ListBox to properly set the alpha of the selector.
- Fixed GridPanel to set the alpha of its children when they are added if the panel has an alpha configured.
- Added some additional show() methods to OptionPanelState that allow the panel's ElementId to be specified.
LemurProto version 1.4.1
Post project conversion and move release... lots of new stuff over the last proto release.
This is an add-on to the regular Lemur distribution that has some components that are currently in "prototype" state. These will eventually be moved to the main library after they have been properly broken in.
Depends on Lemur 1.5.1 or better.
Note: if you find this project useful to you in they "Hey, I'd like to buy that guy lunch sometime" kind of way... consider becoming a patron: https://www.patreon.com/pspeed42
Changelog:
- Added Action and ActionButton for having a more general
way of passing around "actions" that can be reused in
various buttons. Eventually this gets expanded into
toolbar buttons, menu buttons, etc. - Added an OptionPanel similar to Swing's JOptionPane. It
can be used to present a message or simple set of
options to the user. - Added an OptionPanelState that can be used to modally
present OptionPanel's to the user. - Added setSelection() and getSelection() to list.SelectionModel
for more easily setting/getting a single selection. - Fixed GridPanel to update its displayed values if the model
has changed. Prior to this, add/remove/set on the model
was not reflected properly in the grid. - Fixed ListBox to reset its slider range when the list model
changes. - Fixed ListBox to reset the selector element if the grid has
been reshaped() (ie: children have been laid out again)
This fixes a bug where the selector wasn't resized when
the list resized. It also fixes a bug where the selector
disappeared if newly moved to the end of the list because
of model changes. - Fixed ListBox to clamp the selection to the end of the list
if the model changes. - Fixed ListBox to keep the list in the same place if items
are added after the current visible base. - Added a ProtoDemo to demonstrate (and test) some of the proto
elements. - Fixed ListBox to properly apply its outer style as "list.container"
instead of just "list" - Added a glass-styles.groovy to augment the default glass style
with styling for the ListBox and OptionPanel elements. These
styles are automatically loaded when the glass style is
loaded. - Fixed ListBox to properly pass style through on all constructors
that take style as a parameter. - Added ListBox.set/getCellRenderer() for changing the cell rendering
strategy at runtime. - Modified DefaultCellRenderer to take an optional Function<T, String> for
doing the value to string transform. Also moved the value to String
conversion into its own protected method to make it easy for subclasses
to do more advanced custom behavior if desired. - Fixed a bug where the initial internal setModel() was failing to set
the default empty model when the passed model was null... because null
was the same as the existing model. - Added style attribute support for ListBox.visibleItems and ListBox.cellRenderer.
- Fixed some bugs where applying styles was throwing NPEs because there was
no model or selector yet. - Debounced some update churn in SelectionModel when calling add() and fixed
the simmilar check in setSelection() - Fixed a bug in ListBox where the item selector might start out the wrong size
when first displayed. - Added EmptyAction for cases where an action button is desired with no action.
Useful for stubbing out actions for UIs or passing a null action to the option
panel for "Ok". - Added CallMethodAction that delegates to a specified method on some object.
- Added a ColorChooser component that presents an HS selection panel and a separate
B slider.
LemurProps version 1.0.1
Post project conversion and move release of the LemurProps extension.
This library adds a simple property panel that uses reflection to auto-build a panel of property editors.
Depends on Lemur v1.5.1 or better.
Note: if you find this project useful to you in they "Hey, I'd like to buy that guy lunch sometime" kind of way... consider becoming a patron: https://www.patreon.com/pspeed42
Lemur version 1.5.1 with JME SDK 3.1 compatibility
Finally! Another Lemur release. This release includes a ton of changes that have been waiting for JME 3.1 to be in released state. (This is my first github release, so be gentle.)
Now that the project has been moved to github, it's a good time to get new binaries up and start a new versioning scheme. Given that there were only 4 official releases prior to this, I've seeding the minor version with 5.
Note: if you find this project useful to you in they "Hey, I'd like to buy that guy lunch sometime" kind of way... consider becoming a patron: https://www.patreon.com/pspeed42
Current required dependencies:
- guava (newer than 12)
- slf4j-api-1.7.5 (and a logging adapter)
- jme core 3.1
- optionally: groovy-all.jar 2.1.9 or later if you want style file support
The changes in this release, in no particular order:
- Fixed an error message in SpringGridLayout to refer to itself properly.
- Modified GuiGlobals to have a protected getAssetManager() field.
- Fixed a bug in PickEventSession when using non-Viewport root pick roots.
- Added setters/getters for MouseAppState's includeDefaultNodes field that
controls if pick roots are automatically added during initialize. - Fixed Slider to not add the drag handler to the slider range. It was a
leftover from when drag events weren't delivered to the capture properly
and now left the strange behavior of dragging in the slider range causing
the button to move. - Added Axis.getDirection() to return one of the constant Vector3f.UNIT_X,
UNIT_Y, or UNIT_Z depending on the axis value. - Added Slider.getValueForLocation() which can be used to calculate where
in the model's range a particular local coordinate represents. Useful
for a variety of range-related listener behavior. - Updated GuiControl.setPreferredSize() to throw an illegal argument exception
if the specified size is negative. - Fixed GuiControl.setSize() to not mutate the passed in size.
- GuiControl.setSize() passes the original size to GuiControl listeners instead
of the child-mutated size. - Fixed a small sizing issue in BorderLayout where it was always passing
through 0 for the z size when setting the size of children. Now it passes
through the size that was passed to reshape. - Added Button.removeClickCommands()
- Added Container.clearChildren()
- Modified PickEventSession to keep its pick roots in a SafeArrayList for
garbage-free iteration. - Added setAlpha()/getAlpha() to ColoredComponent and modified all ColoredComponent
implementors to have the new methods. - Added Panel.setAlpha() and Panel.getAlpha() for setting the alpha of just
the panel and it's components or of all children recursively. Useful
for fading in/out entire UI hierarchies. - Fixed a bug in DefaultRangedValueModel where changes to min and max value weren't
incrementing the version. - Added some more trace level logging to the Styles class to help users debug
style issues. - Added styling attributes for Panel.alpha and Panel.preferredSize
- Added vec3() and vec2() functions to the style API
- Fixed GuiControl to clamp the passed size to min 0,0,0 during reshape.
- Added a check for negative sizes to GuiControl.setSize().
- Refactored how named layer ordering is done in GuiControl by creating a separte
ComponentStack class that can enforce a total ordering based on named layers.
Soooo much simpler. All of the other GUI elements were modified to use it.
The breaking change is for any custom GUI element that relied on the old weird
component ordering methods as they are now gone. - Added setIcon() to label to set an icon-layer component. (This was made easy
by the above refactoring and is long overdue.) - Breaking fix: modified how TextComponent's z offset is used to be more sensible
and to properly affect the next layer in the stack. This directly affects
shadowOffset and any styling using shadowOffset probably needs the sign of
its z component flipped. The new default shadow offset is now (1, -1, -1) - Added FocusChangeListener and FocusChangeEvent support. GuiControl now has
add/removeFocusChangeListener() methods for registering listeners that will
be notified when the control loses or gains focus. - Fixed a bug in SpringGridLayout where a minorFill wasn't getting handled
right if major file was set to ForcedEven and minorFill was not. - Fixed a bug in CursorEvent deliver if the captured spatial was removed before
the up event was received. The attempt to deliver move events was throwing
NPEs. Now it just returns the current event consumption state instead. - Panel now has a "border" property in addition to "background", so all
regular GUI elements can now have separate borders and backgrounds. - GuiControl can now be "focusable" even if none of it's child components are
by using the setFocusable() method. - Added a Slider constructor that takes Axis, ElementId, and style.
- Gave TbtQuadBackgroundComponent a proper toString() method.
- Gave SpringGridLayout a proper toString() method.
- Added some style-less constructors for Label and Container.
- Modified IconComponent and QuadBackgroundComponent to set AlphaDiscardThreshold
instead of just alphaTest since alphaTest is a no-op in JME 3.1. (Note: this
is a breaking change for 3.0 because it's Unshaded.j3md doesn't have an
AlphaDiscardThreshold.) - Styles.DEFAULT_STYLE changed to Styles.ROOT_STYLE to better reflect what it's
for... also the constant was changed from "default" to "root". - Styles now supports a user-defined default style that will be used for style
application when no other style is defined. Useful for globally setting
a UI's look and feel. - Modified some Styles trace logging to include more info.
- GuiGlobals font loading modified to set AlphaDiscardThreshold in addition to
alphaTest since alphaTest is a no-op in JME 3.1. (Note: this
is a breaking change for 3.0 because it's Unshaded.j3md doesn't have an
AlphaDiscardThreshold.) - Added a TextField constructor that takes just text and element ID.
- Fixed a syntax error in StyleApi.groovy's vec2() helper function.