New in version 6.0.0

  • New widgets

  • Form Builder

    • Performance improved significantly.
    • Form Builder informs you if you try to place inappropriate control onto another one.
    • Removed mandatory requirement for configuration file. Form Builder now can find packages itself.
    • Settings are saved only when they changed(were saved each time Form Builder finishes its work).
    • Added possibility to use untransformable controls.
    • Form layouts directory is now called FormLayouts(was Forms) and can be placed not only in the same folder where Form Builder is but also one or two levels up.
    • Fix: deleted from a form control and components not always were deleted from internal Form Builder storage and this was cause an error sometimes.
    • Fix: missing header files in exported form class.
    • Fix: font name without L in exported form class.
    • Fix: add correct prefix to custom enums in exported form class.
    • Fix: add correct prefix to state names in exported form class.
    • Fix: missing {} in RectC values in exported form class.
    • Fix: load forms with preloading name and position properties.
    • Fix: set names before any other properties in exported form class.
  • Added

    • Graphics3D module with lots of entities dealing with 3D graphics.
    • OpenGL package with 3D controls and materials.
    • dot() function to calculate dot product of vectors.
    • TVec2 template to work with 2D vectors.
    • TVec3 template to work with 3D vectors.
    • TVec4 template to work with quaternions(4D vectors with the fourth component equal to 1).
    • TMat2 template to work with 2x2 matrices.
    • TMat3 template to work with 3x3 matrices.
    • TMat4 template to work with 4x4 matrices.
    • Helper methods to TTensor template to allow to convert between different data types.
    • TPlane template, which is being used to describe plane, has got new methods and operators. It is also assumed that plane's normal is always normalized.
    • Helper methods to TPoint template to allow to convert between different data types and compare points with specified tolerance.
    • Helper methods to TRect template to allow to convert between different data types and compare rectangles with specified tolerance.
    • RestoreState() method to IRenderer interface and corresponding platform implementations. It allows restore required renderer state after custom changes(for example, after using OpenGL functions directly for drawing 3D graphics).
    • isAcceptChild() helper method to IControl to allow the control to check if specific child can be placed on it.
    • IPicture can now load images directly into ITexture.
    • average() method to calculate grayscale value of the pixel in TPixel template.
    • Renderer can now return interface to access native graphics functions. Such an interface could be fetched via getNativeGraphics() method of IRenderer. This feature is optional because of not all renderers have native interface and thus you have to check whether the method return nullptr before start using native functions.
  • Fixed

    • Rotation around X and Y axis matrix building functions in Mathematical module.
    • Memory leak in Android IPicture implementation of JPEG image loading.
    • Some inaccuracy in comparison functions of Mathematical module.
    • CFont class Copy() method didn't free assigned platform font and the changes was not displayed.
    • Repaint of Label control when it's font changes.
    • Array support in json_decode() function.
    • Property BackgroundColorInEditor of Container control has been removed from export into form class.
    • Update hovered control on the form is called only once now during lock-unlock repaint mechanism(was called each time if CLockRepaint helper was used).
    • Transform and AssignedTo properties order in UpDown and UpDownEx widgets used in the Form Builder.
    • Out of range caret position in Built-in TextArea.
    • Unlock repaint in form destroy notification which was caused access to destroyed controls sometimes.
  • Improved

    • Control's form and parent/child control acceptance methods.
    • Multiple package support in Form Builder.
    • Package controls can now control whether they can be transformed in form editor part of the Form Builder. The isTransformable() method of the IPackageControl is used for it.
    • Package entities describing widgets for the Form Builder.
    • CBuiltInDropDown built-in control properties was separated for editable and non-editable ones.
    • Gradients comparison is now using soft comparison for point positions which are the floating point values.
    • CTransform is now using soft comparison.
  • Removed

    • distance_normalized() method from TPlane.
    • Unused getOrientation() method from IFontProperties.
    • Unused OnChangeOrientation event from IFont.
    • Unused setOrientation() method from IFont.
    • The second argument of CLockRepaint helper(const bool update_hovered_control = false) has been removed and should not be used anymore.

Migration from previous version

Instead of removed from TPlane method distance_normalized() use distance() one. The plane normal is always assumed to be normalized(has length 1).

You have to add method isTransformable() to all your package controls. This simple method should return true if the control could be transformed visually in the form Builder(by mouse) or false if it couldn't. The true is used most often for common controls. For more information see IPackageControl interface.

If you have custom form layouts for the Form Builder, move them into the directory called FormLayouts located in the root of the framework.

Wherever you used getOrientation() method or IFontProperties and IFont interfaces and setOrientation() method of IFont interface you have to remove these calls. These methods were not used in either way and are removed at all now.

When working with Built-in DropDown control use different methods for editable and non-editable modes. For example, before this release you could use one method to get arrow color Color getArrowColor(const STATE state, const bool editable) const;. Since the release 6.0.0 you have to use different methods: Color getArrowColor(const STATE state) const; for non-editable mode and Color getArrowColorEditable(const STATE state) const; for editable mode. The same is true for all methods that had const bool editable parameter.