diff --git a/Tutorial/GacUI_Controls/AddressBook/Main.cpp b/Tutorial/GacUI_Controls/AddressBook/Main.cpp index 706d9aea..7e4b05b9 100644 --- a/Tutorial/GacUI_Controls/AddressBook/Main.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/Main.cpp @@ -3,12 +3,90 @@ using namespace vl::collections; using namespace vl::stream; +using namespace vl::reflection::description; +using namespace demo; int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow) { return SetupWindowsDirect2DRenderer(); } +class Category : public Object, public ICategory +{ +protected: + WString name; + list::ObservableList> folders; + +public: + WString GetName()override + { + return name; + } + + Ptr GetFolders()override + { + return folders.GetWrapper(); + } + + Ptr GetContacts()override + { + return nullptr; + } +}; + +class StaticCategory : public Category +{ +public: + WString GetName()override + { + return L"My Address Book"; + } +}; + +class RootCategory : public Object, public ICategory +{ +protected: + list::ObservableList> folders; + +public: + RootCategory() + { + folders.Add(new StaticCategory); + } + + WString GetName()override + { + return L""; + } + + Ptr GetFolders()override + { + return folders.GetWrapper(); + } + + Ptr GetContacts()override + { + return nullptr; + } +}; + +class ViewModel : public Object, public IViewModel +{ +protected: + Ptr rootCategory; + +public: + ViewModel() + { + rootCategory = new RootCategory; + } + + Ptr GetRootCategory()override + { + return rootCategory; + } +}; + void GuiMain() { { @@ -17,7 +95,7 @@ void GuiMain() auto resource = GuiResource::LoadPrecompiledBinary(fileStream, errors); GetResourceManager()->SetResource(L"Resource", resource); } - demo::MainWindow window; + MainWindow window(new ViewModel); window.MoveToScreenCenter(); GetApplication()->Run(&window); } \ No newline at end of file diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml b/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml index de51c513..ed4e4e41 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml @@ -13,6 +13,34 @@ + + NewContact.png NewFolder.png @@ -32,6 +60,7 @@ + @@ -101,9 +130,9 @@ - + - + @@ -139,9 +168,9 @@ - + - + diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp index eb6758fa..5a541b51 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp @@ -17,11 +17,28 @@ namespace vl namespace description { #define _ , + IMPL_CPP_TYPE_INFO(demo::ICategory) + IMPL_CPP_TYPE_INFO(demo::IViewModel) IMPL_CPP_TYPE_INFO(demo::MainWindow) + BEGIN_CLASS_MEMBER(demo::ICategory) + CLASS_MEMBER_BASE(vl::reflection::IDescriptable) + CLASS_MEMBER_METHOD(GetName, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetFolders, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetContacts, NO_PARAMETER); + CLASS_MEMBER_PROPERTY_READONLY(Name, GetName) + CLASS_MEMBER_PROPERTY_READONLY(Folders, GetFolders) + CLASS_MEMBER_PROPERTY_READONLY(Contacts, GetContacts) + END_CLASS_MEMBER(demo::ICategory) + + BEGIN_CLASS_MEMBER(demo::IViewModel) + CLASS_MEMBER_BASE(vl::reflection::IDescriptable) + CLASS_MEMBER_METHOD(GetRootCategory, NO_PARAMETER); + END_CLASS_MEMBER(demo::IViewModel) + BEGIN_CLASS_MEMBER(demo::MainWindow) CLASS_MEMBER_BASE(vl::presentation::controls::GuiWindow) - CLASS_MEMBER_CONSTRUCTOR(demo::MainWindow*(), NO_PARAMETER) + CLASS_MEMBER_CONSTRUCTOR(demo::MainWindow*(Ptr), { L"ViewModel" }) CLASS_MEMBER_GUIEVENT_HANDLER(commandBigIcon_Executed, vl::presentation::compositions::GuiEventArgs) CLASS_MEMBER_GUIEVENT_HANDLER(commandDeleteContact_Executed, vl::presentation::compositions::GuiEventArgs) @@ -33,6 +50,8 @@ namespace vl CLASS_MEMBER_GUIEVENT_HANDLER(commandNewFolder_Executed, vl::presentation::compositions::GuiEventArgs) CLASS_MEMBER_GUIEVENT_HANDLER(commandSmallIcon_Executed, vl::presentation::compositions::GuiEventArgs) CLASS_MEMBER_GUIEVENT_HANDLER(commandTile_Executed, vl::presentation::compositions::GuiEventArgs) + + CLASS_MEMBER_PROPERTY_READONLY_FAST(ViewModel) END_CLASS_MEMBER(demo::MainWindow) #undef _ @@ -42,6 +61,8 @@ namespace vl public: void Load(ITypeManager* manager) { + ADD_TYPE_INFO(demo::ICategory) + ADD_TYPE_INFO(demo::IViewModel) ADD_TYPE_INFO(demo::MainWindow) } diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h index 4ebe0d8f..59af076f 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h @@ -15,13 +15,30 @@ DO NOT MODIFY namespace demo { + class ICategory; + class IViewModel; class MainWindow; + class ICategory : public virtual vl::reflection::IDescriptable, public vl::reflection::Description + { + public: + virtual vl::WString GetName() = 0; + virtual vl::Ptr GetFolders() = 0; + virtual vl::Ptr GetContacts() = 0; + }; + + class IViewModel : public virtual vl::reflection::IDescriptable, public vl::reflection::Description + { + public: + virtual vl::Ptr GetRootCategory() = 0; + }; + template class MainWindow_ : public vl::presentation::controls::GuiWindow, public vl::presentation::GuiInstancePartialClass, public vl::reflection::Description { friend struct vl::reflection::description::CustomTypeDescriptorSelector; private: + Ptr ViewModel_; protected: vl::presentation::controls::GuiToolstripCommand* commandBigIcon; vl::presentation::controls::GuiToolstripCommand* commandDeleteContact; @@ -33,11 +50,12 @@ namespace demo vl::presentation::controls::GuiToolstripCommand* commandNewFolder; vl::presentation::controls::GuiToolstripCommand* commandSmallIcon; vl::presentation::controls::GuiToolstripCommand* commandTile; - vl::presentation::controls::GuiListView* listViewContacts; - vl::presentation::controls::GuiTreeView* treeViewFolders; + vl::presentation::controls::GuiBindableListView* listViewContacts; + vl::presentation::controls::GuiBindableTreeView* treeViewFolders; - void InitializeComponents() + void InitializeComponents(Ptr ViewModel) { + ViewModel_ = ViewModel; if (InitializeFromResource()) { GUI_INSTANCE_REFERENCE(commandBigIcon); @@ -55,6 +73,7 @@ namespace demo } else { + ViewModel_ = 0; } } public: @@ -75,6 +94,11 @@ namespace demo ,treeViewFolders(0) { } + + Ptr GetViewModel() + { + return ViewModel_; + } }; } @@ -84,6 +108,8 @@ namespace vl { namespace description { + DECL_TYPE_INFO(demo::ICategory) + DECL_TYPE_INFO(demo::IViewModel) DECL_TYPE_INFO(demo::MainWindow) } diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp index 7699bbb0..3dfe34c2 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp @@ -62,9 +62,9 @@ namespace demo // #endregion CLASS_MEMBER_GUIEVENT_HANDLER - MainWindow::MainWindow() + MainWindow::MainWindow(Ptr ViewModel) { - InitializeComponents(); + InitializeComponents(ViewModel); OnCreate(); } diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h index cfb70b3e..158e9ebc 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h @@ -34,7 +34,7 @@ namespace demo void OnDestroy(); // #endregion CLASS_MEMBER_GUIEVENT_HANDLER public: - MainWindow(); + MainWindow(Ptr ViewModel); ~MainWindow(); }; } diff --git a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin index 1cb37414..54887333 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin and b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin differ