- Fixed:
#include <arm_acle.h>
is needed for__yield
inVlppOS.cpp
- Replace
LoadLibrary
withGetModuleHandle
inEnableCrossKernelCrashing
. GuiVirtualRepeatCompositionBase
.- Eliminate double
ForceCalculateSizeImmediately()
calls inTestCompositions_VirtualRepeat.cpp
(TODO) and related files.
- Eliminate double
- FakeDialogService
FakeDialogServiceBase::ShowModalDialogAndDelete
place the window in the center ofowner
instead of the screen.- Specify multiple extensions in one filter, exactly like Win32 API.
- Extensions not applied before checking file existance.
- Expanding collapsing tree nodes cause the whole list to rebuild, which glitch during multiple passes of layout.
- Only affected items need to rebuild.
- Bindable list control (optional)
- When a property referenced by
<att.XXXProperty>
is updated, the list item is not refreshed.- Need to find a way to listen to the event.
- When a property referenced by
- For all list controls, adding item could cause flashing during rendering for about 1 flame.
- If this issue is solved, remove document in
Breaking changes from 1.0
andList Controls
.
- If this issue is solved, remove document in
controller(Unr|R)elatedPlugins
inIGuiPlugin(Manager)?
lower dependency safety.- Change
GUI_PLUGIN_NAME
toGUI_PLUGIN_CONTROLLER_(UN)RELATED
. - Remove the two parameters from
IGuiPlugin
, the macro above already specified it clear enough. - Unrelated plugins are not allowed to depend on related plugins.
- Change
- Tests that assuming DarkSkin:
(H|V)(Tracker|Scroll)/Mouse
ToolstripSplitButton
GuiDatePicker/Mouse
- Tests that are OS awared:
GuiDatePicker
,GuiDateComboBox
, inject unit test specific time and locale object. Otherwise Window and Linux will see different printed date in snapshots.
- Same issue
(H|V)(Tracker|Scroll)/Mouse
- when
Drag to Center
the handler should be highlighted, because the mouse is right above the handler.
- when
GuiBindableDataGrid/ComboEditor
- When a data grid cell editor is created under the mouse, the editor does not receive
MouseEvent
event.
- When a data grid cell editor is created under the mouse, the editor does not receive
GuiScrollContainer
- Only calling
Set(Horizontal|Vertical)AlwaysVisible(false)
doesn't make scrolls disappear.SetVisible(false)
on scrolls are verified called. - When the content is changed, configuration needs 2 idle frames to be correctly configured.
- Only calling
GuiListItemTemplate/ArrangerAndAxis(WithScrolls)
- items are not aligned to proper corner when scrolls are invisible.
- Stop hard-coding coordinates:
GetListItemLocation
.GuiToolstripMenuBar/Cascade/ClickSubMenu
'sHover on File/New
try to avoid specifying relative coordinate just because half of the menu item is covered.
- GacUI Binary Resource (when new features are added)
- Upgrade GacUI XML Resource to 1.3, force on all resources instead of only depended or depending resource.
- Require binary pattern "[GXR-1.3]" at the beginning of the binary resource.
- Resource compiler and loader will check the version and only accept 1.3.
- GacUI
- Fix
Global Objects
inGacUI.h
. - Thinking about promote SyncDom data structures for unit test, and complete a diff algorithm.
- Unit test framework
- Diff algorithm based on
RenderingDom::domId
(begins from -1, not consecutive) - Mouse wheel trigger functions.
- Diff algorithm based on
- Unit Test Snapshot Viewer
- Show dom nodes in a tree view in the right side of the rendering tab optionally.
- Select dom node and jump to other tabs with highlight.
- Unit test framework
- Fix
- Remote protocol
- Investigate about generating data structure in flat memory layout, so that no effort needed for binary serialization
- Remote protocol channel
GuiRemoteController
-> remote protocol ->IRemoteProtocolSchedulerChannel<T>
->IRemoteProtocolSchedulerChannelAsync<T>
(another thread)IRemoteProtocolRendererChannelAsync<T>
(another thread) ->IRemoteProtocolRendererChannel<T>
-> remote protocol ->INativeController
- Use sync in unit test instead of the current implementation
- Refactor unit test
- Print remote protocol commands (Frame) in a separated file
- Print remote protocol commands (SyncDom) in a separated file
- Remote protocol redirection back to native rendering:
- In the test project, C++ side will expose the remote protocol via dll.
- Implement the remote protocol on a native
INativeController
instance.- It could not be used on
GuiHostedController
orGuiRemoteController
, which is not a native implementation.
- It could not be used on
- The experiment will only run a very simple UI that covers all implemented remote protocol so far.
- More unit test
- Ribbon Controls
GuiControl
and servives[TAB]
ControlThemeName
property- Multiple active
GuiWindow
, modal, order,Enabled
GuiTab
item manipulation and[TAB]
MouseWheel
- Behavior on scrolls, trackers, scroll containers and list controls
GuiListControl
item eventsGuiVirtualTreeListControl
node events
- A button calling a modal window
- GacUI
<RawRendering/>
element.- It will be mapped to
GDIElement
orDirect2DElement
in different renderers. - In remote protocol, it is an element with no extra properties.
- In HTML, it would open a
<div/>
and you can do whatever you want using JavaScript.
- It will be mapped to
- JavaScript rendering:
- Delete all
GacJS
code. This repo will be used to implement the HTML logic. - A codegen for remote protocol and print TypeScript code.
- In the test project, C++ side will start a HTTP service on Windows.
- JavaScript side will separate the rendering and the protocol.
- Try DOM.
- Try Canvas.
- https://github.com/WICG/canvas-formatted-text/blob/main/README.md
- layout provider could not be done until this is implemented.
- https://github.com/WICG/canvas-formatted-text/blob/main/README.md
- Try EsBuild to replace WebPack.
- The experiment will only run a very simple UI that covers all implemented remote protocol so far.
- Delete all
- Copy control unit tests, snapshots and snapshot viewer to
Release
repo.- Build and run test.
- Explain this in decicated
README.md
and mention it in the root one.
- Explain this in decicated
- Verify vcxproj contains all files.
- Ensure build woriflow tutorials.
- Update Win11 menu tutorial in
Release
repo to use new virtual control
- Build and run test.
- All control unit test (using DarkSkin)
- Tooltip.
- Dialogs.
- A mechanism to replace
vl::filesystem
implementation. - Add window resizing constraint messages.
- Implement
ColorizedTextElement
- Typing trigger functions in unit test framework.
GuiSinglelineTextBox
GuiMultilineTextBox
GuiBindableDataGrid
with predefined text box editor.- Ribbon with predefined text box toolstrip component.
- Implement
DocumentElement
.- Think about how to calculate size for document.
GuiDocumentViewer
GuiDocumentLable
<DocumentTextBox/>
- Check all control key operation, ensure accessibility.
- Cannot scroll
GuiScrollView
, key operations needed and also need to be disabled forGuiListControl
because it has already defined item selection keys. Gui(Bindable)TextList
cannot check or uncheck items by key (enter and space).GuiVirtualListView
cannot operate column headers by key.- Active menus without
Alt
assighed (TAB
and arrow keys?). GuiDateComboBox
does not receive focus property, so that when open year/month combo byALT
or mouse, list item cannot be selected only by key.- Add
Alt
and fixMouse
test cases after this is fixed.
- Add
- Cannot scroll
- Sample unit test project included in release.
- Reflection enabled
- Application and
LoadMainWindow
script in separated XML resource files. - Application and
LoadMainWindow
script in separated compiled resource files.
- Application and
- Reflection disabled
- Application in compiled C++ files.
- There is no
LoadMainWindow
in this case.
- Reflection enabled
- Document
- Unit test framework.
- Unit test framework in Vlpp.
- Remote Protocol.
- Implement
ColorizedTextElement
andDocumentElement
in all already implemented remote renderers.
- SyncObj architecture that streams ViewModel object changes.
- See README.md in Workflow repo (ViewModel Remoting C++ Codegen).
- GacGen offers Metadata of interfaces
- Network protocols are not included as default implementation
- New tutorials
- A GacUI D2D process connecting to a server process for streaming ViewModel
- ViewModel implements in C++ and C#
- A GacUI D2D process connecting to a server process for streaming ViewModel
- Document
- SyncObj.
- Fix
/doc/current/home.html
- Introduction to hosted / remote
- Fix
/doc/current/gacui/home.html
- Introduction to hosted / remote
- A remote protocol implementation on existing
INativeController
implementation.- Network protocols are not included as default implementation.
- Take care of
wchar_t
when server and client have different understanding to its size.
- New tutorials.
- A GacUI SyncDom process connecting to a server process for streaming graphics.
- GDI+ implements in C#.
- GDI/D2D implements in C++.
- A GacUI SyncDom process connecting to a server process for streaming graphics.
- Rewrite
GacBuild.ps1
andGacClear.ps1
in C++, but still keep them just doing redirection for backward compatibility. - Get rid of
Deploy.bat
inGacGen.ps1
andGacGen.exe
.
Variant
andUnion
with full support.- Document.
- Document
vl::Overloading
.
- Extensible CLI argument parser acception different OS convention, serialization and module dependencies.
- Structured error report.
- Extensible error message localization relying on GacUI XML Resource localization feature.
- Pre-made main function per OS, defining arguments for different renderers for the current OS, including remoting server with predefine protocols.
- More optimistic SyncDom strategy to reduce messages.
- Windows
- Ensure
INativeWindow::(Before|After)Closing()
is not called on non-main-window between the main window is closed and the application exits.
- Ensure
- Enlarging window slower than shrinking.
- vczh-libraries/Vlpp#9
- Strict check in different for-each loops.
- A new non-XML instance format
<eval Eval="expression"/>
tags.<ez:Layout/>
xmlns:ez
by default:presentation::composition::easy_layout::GuiEasy*Composition
presentation::composition::easy_layout::GuiEasy*Layout
- A
vl::presentation::composition::easy_layout::GuiEasyLayoutComposition
- with properties:
Top
,Bottom
,Left
,Right
: boolean of border visibilityPadding
: thickness of border and between all leaf containers
- accepting following tags as child:
<ez:Top/>
,<ez:Bottom/>
,<ez:Left/>
,<ez:Right/>
,<ez:Fill Percentage="1">
: Will be implemented by stack or table<ez:Row RowSpan="1" ColumnSpan="1"/>
,<ez:Column RowSpan="1" ColumnSpan="1"/>
: will be implemented by table
- properties of other
ez:
objectPadding
,-1
by default means inheriting the value from its parent, defining a new padding of its children
- with properties:
- Any
ez:
layout could have multipleez:
layout or one control/Composition- Such
control
orcomposition
will getAlignmentToParent
changed inBuildLayout
if all components are-1
at the moment - A flag will store into such object, so the second call of
BuildLayout
will know the value is set by itself, and update it propertly- Such flag could be the
<ez:Layout/>
itself passed to callingSetInternalProperty
- Such flag could be the
- Such
- There is no constraint about the number and their order of
ez:
child object- All consecutive rows or columns will be grouped into a table
- All direct child of rows of a rows, or columns of a column, are flattened
- Use stack if possible
- A
BuildLayout
method will be called after the layout tree is prepared. Changing the layout tree will not take effect without calling this method.
- Windows
INativeImage::SaveToStream
handle correctly for git format. It is possible that LoadFromStream need to process diff between git raw frames.
- UI Automation.
- Test Automation.
- Standard test for OS providers, may need a test purpose automation service to do https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendinput
IColumnItemView
.- Change column size from
int
to{minSize:int, columnOption:Absolute|Percentage, absolute:int, percentage:float}
- Column drag and drop.
- ListView: only raises an event, developers need to update column headers and data by themselves.
- DataGrid: swap column object, cells are changed due to binding.
- Change column size from
- ListView.
- Make a common template base class for
IItemProvider
implementation of bindable and non-bindable pair of the same virtual control:- The template argument would be the base class which implements the differences.
list::TextItemProvider
vsGuiBindableTextList::ItemSource
.list::ListViewItemProvider
vsGuiBindableListView::ItemSource
.- Extends to
list::DataProvider
.
- Extends to
tree::TreeViewItemRootProvider
vsGuiBindableTreeView::ItemSource
.
GuiBindableDataGrid
:- Add customizable row visualizer.
- The default (or
nullptr
) row visualizer displays cell visualizer and editor.
GuiBindableTreeDataGrid
:- Offer a default group header row visualizer when users only need one level of collapsable
GuiBindableDataGrid
. - Replace the new
list::DataProvider
's base class withtree::NodeItemProvider
offeringGuiBindableTreeView::ItemSource
to make a useful data source.
- Offer a default group header row visualizer when users only need one level of collapsable
- Make a common template base class for
- Upgraded Code editor (need VlppParser2)
- Touch support.
- Drag and Drop framework.
- Substitutable.
GuiFakeDragAndDropService
.- Activated by substitution when an OS dependent implementation is not available.
- Dock container.
- Use drag and drop to perform docking.
- A small framework for implementing dock guiding UI.
- A predefined dockable tool window for users that are fine with the default behavior about how to transfer content to the dock container.
- A "binary tree layout/control" for implementing VS-like dock container.
- 2D drawing API, optional at runtime.
- Default non-text element renderer using 2D drawing API.
- Activated only when 2D drawing API is available and renderer implementations are unavailable.
- Ensure OS providers without 2D drawing API still work.
- Default non-text element renderer using 2D drawing API.
- restriction-based Meta2DElement.
- If 2D drawing API is not available, display a text using
SolidLabel
.
- If 2D drawing API is not available, display a text using
- Meta3DElement and Meta3D data structure.
- Default Meta3DElement renderer using Meta2DElement with a surface sorting based algorithm.
- 2D Chart control based on Meta2DElement.
- 3D Chart control based on Meta3DElement.
- GIF player.
- video player.
- Port GacUI to other platforms:
- Unit Test (Remote)
- Windows
- GDI (Normal, Hosted, Remote)
- Direct2d (Normal, Hosted, Remote)
- UWP (Remote)
- Linux
- gGac repo: improve development process for release
- macOS
- iGac repo: improve development process for release
- Browser (Remote)
- HTTP for test purpose
- WebAssembly
- CLI (optional, needs dedicated skin)
- Command-line/Powershell in Windows (Remote)
- Ncurses on Ubuntu (Remote)
- Port GacUI to other languages:
- Applications written in other language can:
- Implement view model (SyncObj).
- Render the UI (Remote).
- Languages:
- JavaScript / TypeScript
- HTTP for test purpose
- WebAssembly
- .NET
- Python
- JavaScript / TypeScript
- Applications written in other language can:
- DarkSkin Color Theme.
- Create a
DarkSkinPalette
class with a static getter method to retrive default colors.- Update all
Style.xml
colors to useDarkSkinPalette
.
- Update all
- Add a static setter to
DarkSkinPalette
.- A window can be called to update all its controls' and components' template.
- The above function will be called inside the setter.
- Create a
INativeWindow
add callback for state changing.- Including
MaximizedBox
,MinimizedBox
,Border
,SizeBox
,IconVisible
,TitleBar
,Icon
,Title
,SizeState
. - In
GuiControlHost
orGuiWindow
, setting border or state doesn't update the control template, it is updated in that callback. - Delete
GuiControlHost
andGuiWindow
'sOnVisualStatusChanged
.
- Including
- FakeDialogService
- message box disable
X
button ifCancel
is not in the button list orOK
is the only button.
- message box disable
- GDI
- Big cursor of document empty line (GDI)
- In hosted mode, non-main window doesn't shrink when moving back to low DPI monitor.
- Hosted
- When dragging left/top border if the main window, the window move if the size is smaller than the minimum size.
- Rewrite calculator state machine demo, when "+" is pressed, jump into "WaitingAnotherOperandForPlus" state machine, instead of storing the operation in a loop. So there will be no loop except for waiting for numbers.
- Check makefile for ParserGen/GlrParserGen/CodePack/CppMerge/GacGen
- Write maketools.sh
- Add
MoveToScreenCenterAfterLayout
as what is done inFakeDialogServiceBase::ShowModalDialogAndDelete
. - New default control templates with animation, written in XML generated C++ code.
- Use the embedded data codegen / compress / decompress functions from
VlppParser2
to replace one inGacUI
. - Use collection interfaces on function signatures.
- Only if
Vlpp
decides to add collection interfaces.
- Only if
- Consider
-ani
binding, create an animation controller object that change the binded property, with predefined interpolation and other stuff.- All types that can do interpolation are value types, consider following formats:
- "NAME:initial value"
- "NAME(initial value in expression)"
- Need to be consistent with animation object
- Consider multiple
-ani
batch control, state configuration and transition, story board, connection to animation coroutine, etc.
- All types that can do interpolation are value types, consider following formats:
- In the final pass, only workflow scripts are printed.
- Use WorkflowCompiler.exe to do codegen externally.
- Remove all loader implementation, enabling custom control types from developers.
- Try not to include
GacUI.cpp
ifVCZH_DEBUG_METAONLY_REFLECTION
is on. mynamespaces::VirtualClasses_X
for adding virtual classes deriving frommynamespaces::X
.- Containing methods like:
GuiSelectableButton* CheckBox()
.
- Containing methods like:
mynamespaces::InstanceLoader_X
for implementing different kinds of properties / constructors that do not exist inmynamespaces::X
.- following a naming convention, e.g.
GuiTableComposition
's rows/columns properties. - searching for correct default control templates.
- following a naming convention, e.g.
- Try not to include
- Incremental build inside single resource.
- Calculate dependencies by only parsing.
- Cache workflow assembly per resource in file.
- Codegen c++ from multiple workflow assembly.
- Facade
- A facade is a class with following methods:
- AddChild: Accept a child facade or a child object.
- ApplyTo: Accept a parent object, which is not a facade.
- Initialize (optional): Called on the instance object between construction and
<ref.Ctor>
.
- A facade could have properties but only accept assignment or
-eval
binding. - A facade could have an optional InstanceFacadeVerifier executed on GacGen compile time.
- Built-in Layout and Form facade.
- If
<XFacade>
or<x:XFacade>
is an accessible and default constructible object, then<X>
or<x:X>
triggers a facade.
- A facade is a class with following methods:
- Run the editing GUI using remote protocol.
- Run the symbol server in a separate process.
- e.g. for rendering if all properties in a binding expression is observable, providing fast editing tool.
- Dedicated solution-project(dependency,external dependency)-item file format.
- Solution builds GacUI.xml
- Project builds GacUI XML Resource index file.
- Each file contains only one item.
- When create a UI object in a wizard, ask for:
- Localization item.
- Need to mark properties in reflection about if it needs localization.
- ViewModel item.
- ViewModel implementation item for testing.
- Localization item.
- Dedicated composition/control property sheet configuration for each class.