diff --git a/Tutorial/GacUI_Controls/AddressBook/Main.cpp b/Tutorial/GacUI_Controls/AddressBook/Main.cpp index 22f2322d..b9c15ff6 100644 --- a/Tutorial/GacUI_Controls/AddressBook/Main.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/Main.cpp @@ -12,7 +12,8 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi } Ptr folderImage; -Ptr contactImage; +Ptr contactBigImage; +Ptr contactSmallImage; class ViewModel; @@ -23,6 +24,7 @@ protected: ICategory* parent; WString name; list::ObservableList> folders; + list::ObservableList> contacts; public: Category(ICategory* _parent) @@ -52,7 +54,66 @@ public: Ptr GetContacts()override { - return nullptr; + return contacts.GetWrapper(); + } +}; + +class Contact : public Object, public IContact +{ +protected: + Category* category; + WString name; + DateTime birthday; + WString phone; + WString address; + +public: + Contact(Category* _category) + :category(_category) + { + } + + Category* GetCategory() + { + return category; + } + + WString GetName()override + { + return name; + } + + Ptr GetBigImage()override + { + return contactBigImage; + } + + Ptr GetSmallImage()override + { + return contactSmallImage; + } + + DateTime GetBirthday()override + { + return birthday; + } + + WString GetPhone()override + { + return phone; + } + + WString GetAddress() + { + return address; + } + + void Update(WString _name, DateTime _birthday, WString _phone, WString _address)override + { + name = _name; + birthday = _birthday; + phone = _phone; + address = _address; } }; @@ -108,6 +169,7 @@ class ViewModel : public Object, public IViewModel protected: Ptr rootCategory; Ptr selectedCategory; + Ptr selectedContact; public: ViewModel() @@ -134,6 +196,20 @@ public: } } + Ptr GetSelectedContact()override + { + return selectedContact; + } + + void SetSelectedContact(Ptr value)override + { + if (selectedContact != value) + { + selectedContact = value; + SelectedContactChanged(); + } + } + void AddCategory(WString name) { if (auto current = dynamic_cast(selectedCategory.Obj())) @@ -152,6 +228,28 @@ public: SetSelectedCategory(nullptr); } } + + Ptr CreateContact()override + { + if (auto parent = dynamic_cast(selectedCategory.Obj())) + { + return new Contact(parent); + } + return nullptr; + } + + void AddContact(vl::Ptr contact)override + { + dynamic_cast(contact.Obj())->GetCategory()->contacts.Add(contact); + } + + void RemoveContact()override + { + if (auto contact = dynamic_cast(selectedContact.Obj())) + { + contact->GetCategory()->contacts.Remove(selectedContact.Obj()); + } + } }; void GuiMain() @@ -163,12 +261,14 @@ void GuiMain() GetResourceManager()->SetResource(L"Resource", resource); folderImage = resource->GetImageByPath(L"Images/Folder"); - contactImage = resource->GetImageByPath(L"Images/Contact"); + contactBigImage = resource->GetImageByPath(L"Images/ContactBig"); + contactSmallImage = resource->GetImageByPath(L"Images/ContactSmall"); } MainWindow window(new ViewModel); window.MoveToScreenCenter(); GetApplication()->Run(&window); folderImage = nullptr; - contactImage = nullptr; + contactBigImage = nullptr; + contactSmallImage = nullptr; } \ No newline at end of file diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Contact.png b/Tutorial/GacUI_Controls/AddressBook/UI/ContactBig.png similarity index 100% rename from Tutorial/GacUI_Controls/AddressBook/UI/Contact.png rename to Tutorial/GacUI_Controls/AddressBook/UI/ContactBig.png diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/ContactSmall.png b/Tutorial/GacUI_Controls/AddressBook/UI/ContactSmall.png new file mode 100644 index 00000000..b1382443 Binary files /dev/null and b/Tutorial/GacUI_Controls/AddressBook/UI/ContactSmall.png differ diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml b/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml index 7fd8a6e3..6964ac1d 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Resource.xml @@ -15,43 +15,76 @@ @@ -61,7 +94,8 @@ Delete.png Folder.png - Contact.png + ContactBig.png + ContactSmall.png Edit.png ListView_Big.png @@ -102,17 +136,36 @@ - ViewModel.SelectedCategory is null ? false : ViewModel.SelectedCategory.Parent is not null - { ViewModel.RemoveCategory(); } + ViewModel.SelectedCategory.Parent is not null ?? false + + + - commandNewContact_Executed + ViewModel.SelectedCategory is not null + + + - commandDeleteContact_Executed + ViewModel.SelectedContact is not null + + + - + commandBigIcon_Executed diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp index 47dad4f7..902e1478 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.cpp @@ -46,6 +46,7 @@ namespace vl { #define _ , IMPL_CPP_TYPE_INFO(demo::ICategory) + IMPL_CPP_TYPE_INFO(demo::IContact) IMPL_CPP_TYPE_INFO(demo::IViewModel) IMPL_CPP_TYPE_INFO(demo::MainWindow) IMPL_CPP_TYPE_INFO(demo::NewFolderWindow) @@ -64,15 +65,39 @@ namespace vl CLASS_MEMBER_PROPERTY_READONLY(Contacts, GetContacts) END_CLASS_MEMBER(demo::ICategory) + BEGIN_CLASS_MEMBER(demo::IContact) + CLASS_MEMBER_BASE(vl::reflection::IDescriptable) + CLASS_MEMBER_METHOD(GetName, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetBigImage, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetSmallImage, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetBirthday, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetPhone, NO_PARAMETER); + CLASS_MEMBER_METHOD(GetAddress, NO_PARAMETER); + CLASS_MEMBER_METHOD(Update, { L"name" _ L"birthday" _ L"phone" _ L"address" }); + CLASS_MEMBER_PROPERTY_READONLY(Name, GetName) + CLASS_MEMBER_PROPERTY_READONLY(BigImage, GetBigImage) + CLASS_MEMBER_PROPERTY_READONLY(SmallImage, GetSmallImage) + CLASS_MEMBER_PROPERTY_READONLY(Birthday, GetBirthday) + CLASS_MEMBER_PROPERTY_READONLY(Phone, GetPhone) + CLASS_MEMBER_PROPERTY_READONLY(Address, GetAddress) + END_CLASS_MEMBER(demo::IContact) + BEGIN_CLASS_MEMBER(demo::IViewModel) CLASS_MEMBER_BASE(vl::reflection::IDescriptable) CLASS_MEMBER_METHOD(GetRootCategory, NO_PARAMETER); CLASS_MEMBER_METHOD(GetSelectedCategory, NO_PARAMETER); CLASS_MEMBER_METHOD(SetSelectedCategory, { L"value" }); CLASS_MEMBER_EVENT(SelectedCategoryChanged) + CLASS_MEMBER_METHOD(GetSelectedContact, NO_PARAMETER); + CLASS_MEMBER_METHOD(SetSelectedContact, { L"value" }); + CLASS_MEMBER_EVENT(SelectedContactChanged) CLASS_MEMBER_METHOD(AddCategory, { L"name" }); CLASS_MEMBER_METHOD(RemoveCategory, NO_PARAMETER); + CLASS_MEMBER_METHOD(CreateContact, NO_PARAMETER); + CLASS_MEMBER_METHOD(AddContact, { L"contact" }); + CLASS_MEMBER_METHOD(RemoveContact, NO_PARAMETER); CLASS_MEMBER_PROPERTY_EVENT(SelectedCategory, GetSelectedCategory, SetSelectedCategory, SelectedCategoryChanged) + CLASS_MEMBER_PROPERTY_EVENT(SelectedContact, GetSelectedContact, SetSelectedContact, SelectedContactChanged) END_CLASS_MEMBER(demo::IViewModel) BEGIN_CLASS_MEMBER(demo::MainWindow) @@ -80,11 +105,9 @@ namespace vl 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) CLASS_MEMBER_GUIEVENT_HANDLER(commandDetail_Executed, vl::presentation::compositions::GuiEventArgs) CLASS_MEMBER_GUIEVENT_HANDLER(commandInformation_Executed, vl::presentation::compositions::GuiEventArgs) CLASS_MEMBER_GUIEVENT_HANDLER(commandList_Executed, vl::presentation::compositions::GuiEventArgs) - CLASS_MEMBER_GUIEVENT_HANDLER(commandNewContact_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) @@ -109,6 +132,7 @@ namespace vl void Load(ITypeManager* manager) { ADD_TYPE_INFO(demo::ICategory) + ADD_TYPE_INFO(demo::IContact) ADD_TYPE_INFO(demo::IViewModel) ADD_TYPE_INFO(demo::MainWindow) ADD_TYPE_INFO(demo::NewFolderWindow) diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h index dd9196bd..6d548dd1 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/DemoPartialClasses.h @@ -15,11 +15,24 @@ DO NOT MODIFY namespace demo { + class IContact; class ICategory; class IViewModel; class MainWindow; class NewFolderWindow; + class IContact : public virtual vl::reflection::IDescriptable, public vl::reflection::Description + { + public: + virtual vl::WString GetName() = 0; + virtual vl::Ptr GetBigImage() = 0; + virtual vl::Ptr GetSmallImage() = 0; + virtual vl::DateTime GetBirthday() = 0; + virtual vl::WString GetPhone() = 0; + virtual vl::WString GetAddress() = 0; + virtual void Update(vl::WString name, vl::DateTime birthday, vl::WString phone, vl::WString address) = 0; + }; + class ICategory : public virtual vl::reflection::IDescriptable, public vl::reflection::Description { public: @@ -37,8 +50,14 @@ namespace demo virtual vl::Ptr GetSelectedCategory() = 0; virtual void SetSelectedCategory(vl::Ptr value) = 0; vl::Event SelectedCategoryChanged; + virtual vl::Ptr GetSelectedContact() = 0; + virtual void SetSelectedContact(vl::Ptr value) = 0; + vl::Event SelectedContactChanged; virtual void AddCategory(vl::WString name) = 0; virtual void RemoveCategory() = 0; + virtual vl::Ptr CreateContact() = 0; + virtual void AddContact(vl::Ptr contact) = 0; + virtual void RemoveContact() = 0; }; template @@ -180,6 +199,7 @@ namespace vl namespace description { DECL_TYPE_INFO(demo::ICategory) + DECL_TYPE_INFO(demo::IContact) DECL_TYPE_INFO(demo::IViewModel) DECL_TYPE_INFO(demo::MainWindow) DECL_TYPE_INFO(demo::NewFolderWindow) diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp index 67fd0f5e..53841df0 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.cpp @@ -16,10 +16,6 @@ namespace demo { } - void MainWindow::commandDeleteContact_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments) - { - } - void MainWindow::commandDetail_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments) { } @@ -32,10 +28,6 @@ namespace demo { } - void MainWindow::commandNewContact_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments) - { - } - void MainWindow::commandSmallIcon_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments) { } diff --git a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h index 86742185..bfc91ab3 100644 --- a/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h +++ b/Tutorial/GacUI_Controls/AddressBook/UI/Source/MainWindow.h @@ -21,11 +21,9 @@ namespace demo // #region CLASS_MEMBER_GUIEVENT_HANDLER (DO NOT PUT OTHER CONTENT IN THIS #region.) void commandBigIcon_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); - void commandDeleteContact_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void commandDetail_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void commandInformation_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void commandList_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); - void commandNewContact_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void commandSmallIcon_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void commandTile_Executed(GuiGraphicsComposition* sender, vl::presentation::compositions::GuiEventArgs& arguments); void OnCreate(); diff --git a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin index 5f863679..356c4168 100644 Binary files a/Tutorial/GacUI_Controls/UIRes/AddressBook.bin and b/Tutorial/GacUI_Controls/UIRes/AddressBook.bin differ