mirror of
https://github.com/vczh-libraries/Release.git
synced 2026-03-24 17:03:49 +08:00
AddressBook Folder
This commit is contained in:
@@ -14,8 +14,11 @@ int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
|
||||
Ptr<GuiImageData> folderImage;
|
||||
Ptr<GuiImageData> contactImage;
|
||||
|
||||
class ViewModel;
|
||||
|
||||
class Category : public Object, public ICategory
|
||||
{
|
||||
friend class ViewModel;
|
||||
protected:
|
||||
ICategory* parent;
|
||||
WString name;
|
||||
@@ -59,11 +62,7 @@ public:
|
||||
StaticCategory()
|
||||
:Category(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
WString GetName()override
|
||||
{
|
||||
return L"My Address Book";
|
||||
name = L"My Address Book";
|
||||
}
|
||||
};
|
||||
|
||||
@@ -137,10 +136,21 @@ public:
|
||||
|
||||
void AddCategory(WString name)
|
||||
{
|
||||
if (auto current = dynamic_cast<Category*>(selectedCategory.Obj()))
|
||||
{
|
||||
auto category = new Category(current);
|
||||
category->name = name;
|
||||
current->folders.Add(category);
|
||||
}
|
||||
}
|
||||
|
||||
void RemoveCategory()
|
||||
{
|
||||
if (auto parent = dynamic_cast<Category*>(selectedCategory->GetParent()))
|
||||
{
|
||||
parent->folders.Remove(selectedCategory.Obj());
|
||||
SetSelectedCategory(nullptr);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
<Instance name="MainWindowResource">
|
||||
<Instance ref.Class="demo::MainWindow">
|
||||
<ref.Parameter Name="ViewModel" Class="demo::IViewModel"/>
|
||||
<Window Text="AddressBook" ClientSize="x:480 y:320">
|
||||
<Window ref.Name="self" Text="AddressBook" ClientSize="x:480 y:320">
|
||||
<att.BoundsComposition-set PreferredMinSize="x:480 y:320"/>
|
||||
|
||||
<att.ViewModel-set>
|
||||
@@ -85,7 +85,21 @@
|
||||
|
||||
<ToolstripCommand ref.Name="commandNewFolder" Image-uri="res://Images/NewFolder">
|
||||
<att.Enabled-bind>ViewModel.SelectedCategory is not null</att.Enabled-bind>
|
||||
<ev.Executed-eval>{}</ev.Executed-eval>
|
||||
<ev.Executed-eval>
|
||||
<![CDATA[
|
||||
{
|
||||
var window = new demo::NewFolderWindow*();
|
||||
window.MoveToScreenCenter();
|
||||
window.ShowModalAndDelete(self, func():void
|
||||
{
|
||||
if (window.Ready)
|
||||
{
|
||||
ViewModel.AddCategory(window.FolderName);
|
||||
}
|
||||
});
|
||||
}
|
||||
]]>
|
||||
</ev.Executed-eval>
|
||||
</ToolstripCommand>
|
||||
<ToolstripCommand ref.Name="commandDeleteFolder" Image-uri="res://Images/Delete">
|
||||
<att.Enabled-bind>ViewModel.SelectedCategory is null ? false : ViewModel.SelectedCategory.Parent is not null</att.Enabled-bind>
|
||||
@@ -204,5 +218,52 @@
|
||||
</Window>
|
||||
</Instance>
|
||||
</Instance>
|
||||
|
||||
<Instance name="NewFolderWindowResource">
|
||||
<Instance ref.CodeBehind="false" ref.Class="demo::NewFolderWindow">
|
||||
<ref.Property Name="FolderName" Type="string" Value=""/>
|
||||
<ref.Property Name="Ready" Type="bool" Value="true"/>
|
||||
<Window ref.Name="self" Text="New Folder" ClientSize="x:240 y:120" MaximizedBox="false" MinimizedBox="false" SizeBox="false">
|
||||
<att.FolderName-bind>textBoxName.Text</att.FolderName-bind>
|
||||
|
||||
<Table CellPadding="5" AlignmentToParent="left:0 top:0 right:0 bottom:0">
|
||||
<att.Rows>
|
||||
<CellOption>composeType:MinSize</CellOption>
|
||||
<CellOption>composeType:Percentage percentage:1.0</CellOption>
|
||||
<CellOption>composeType:MinSize</CellOption>
|
||||
</att.Rows>
|
||||
<att.Columns>
|
||||
<CellOption>composeType:MinSize</CellOption>
|
||||
<CellOption>composeType:Percentage percentage:1.0</CellOption>
|
||||
<CellOption>composeType:MinSize</CellOption>
|
||||
<CellOption>composeType:MinSize</CellOption>
|
||||
</att.Columns>
|
||||
|
||||
<Cell Site="row:0 column:0" InternalMargin="top:6">
|
||||
<Label Text="Name:"/>
|
||||
</Cell>
|
||||
|
||||
<Cell Site="row:0 column:1 columnSpan:3">
|
||||
<DocumentTextBox ref.Name="textBoxName" EditMode="Editable" Text="New Folder">
|
||||
<att.BoundsComposition-set AlignmentToParent="left:0 top:0 right:0 bottom:0"/>
|
||||
</DocumentTextBox>
|
||||
</Cell>
|
||||
|
||||
<Cell Site="row:2 column:2">
|
||||
<Button Text="OK">
|
||||
<att.BoundsComposition-set AlignmentToParent="left:0 top:0 right:0 bottom:0" PreferredMinSize="x:60"/>
|
||||
<ev.Clicked-eval>{ self.Close(); }</ev.Clicked-eval>
|
||||
</Button>
|
||||
</Cell>
|
||||
<Cell Site="row:2 column:3">
|
||||
<Button Text="Cancel">
|
||||
<att.BoundsComposition-set AlignmentToParent="left:0 top:0 right:0 bottom:0" PreferredMinSize="x:60"/>
|
||||
<ev.Clicked-eval>{ self.Ready = false; self.Close(); }</ev.Clicked-eval>
|
||||
</Button>
|
||||
</Cell>
|
||||
</Table>
|
||||
</Window>
|
||||
</Instance>
|
||||
</Instance>
|
||||
</Folder>
|
||||
</Resource>
|
||||
@@ -10,6 +10,34 @@ DO NOT MODIFY
|
||||
|
||||
#include "Demo.h"
|
||||
|
||||
namespace demo
|
||||
{
|
||||
// #region CLASS_MEMBER_GUIEVENT_HANDLER (DO NOT PUT OTHER CONTENT IN THIS #region.)
|
||||
|
||||
void NewFolderWindow::OnCreate()
|
||||
{
|
||||
}
|
||||
|
||||
void NewFolderWindow::OnDestroy()
|
||||
{
|
||||
}
|
||||
|
||||
// #endregion CLASS_MEMBER_GUIEVENT_HANDLER
|
||||
|
||||
NewFolderWindow::NewFolderWindow()
|
||||
{
|
||||
InitializeComponents();
|
||||
OnCreate();
|
||||
}
|
||||
|
||||
NewFolderWindow::~NewFolderWindow()
|
||||
{
|
||||
OnDestroy();
|
||||
ClearSubscriptions();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace vl
|
||||
{
|
||||
namespace reflection
|
||||
@@ -20,6 +48,7 @@ namespace vl
|
||||
IMPL_CPP_TYPE_INFO(demo::ICategory)
|
||||
IMPL_CPP_TYPE_INFO(demo::IViewModel)
|
||||
IMPL_CPP_TYPE_INFO(demo::MainWindow)
|
||||
IMPL_CPP_TYPE_INFO(demo::NewFolderWindow)
|
||||
|
||||
BEGIN_CLASS_MEMBER(demo::ICategory)
|
||||
CLASS_MEMBER_BASE(vl::reflection::IDescriptable)
|
||||
@@ -62,6 +91,16 @@ namespace vl
|
||||
CLASS_MEMBER_PROPERTY_READONLY_FAST(ViewModel)
|
||||
END_CLASS_MEMBER(demo::MainWindow)
|
||||
|
||||
BEGIN_CLASS_MEMBER(demo::NewFolderWindow)
|
||||
CLASS_MEMBER_BASE(vl::presentation::controls::GuiWindow)
|
||||
CLASS_MEMBER_CONSTRUCTOR(demo::NewFolderWindow*(), NO_PARAMETER)
|
||||
|
||||
CLASS_MEMBER_EVENT(FolderNameChanged)
|
||||
CLASS_MEMBER_PROPERTY_EVENT_FAST(FolderName, FolderNameChanged)
|
||||
CLASS_MEMBER_EVENT(ReadyChanged)
|
||||
CLASS_MEMBER_PROPERTY_EVENT_FAST(Ready, ReadyChanged)
|
||||
END_CLASS_MEMBER(demo::NewFolderWindow)
|
||||
|
||||
#undef _
|
||||
|
||||
class DemoResourceLoader : public Object, public ITypeLoader
|
||||
@@ -72,6 +111,7 @@ namespace vl
|
||||
ADD_TYPE_INFO(demo::ICategory)
|
||||
ADD_TYPE_INFO(demo::IViewModel)
|
||||
ADD_TYPE_INFO(demo::MainWindow)
|
||||
ADD_TYPE_INFO(demo::NewFolderWindow)
|
||||
}
|
||||
|
||||
void Unload(ITypeManager* manager)
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace demo
|
||||
class ICategory;
|
||||
class IViewModel;
|
||||
class MainWindow;
|
||||
class NewFolderWindow;
|
||||
|
||||
class ICategory : public virtual vl::reflection::IDescriptable, public vl::reflection::Description<ICategory>
|
||||
{
|
||||
@@ -58,6 +59,7 @@ namespace demo
|
||||
vl::presentation::controls::GuiToolstripCommand* commandSmallIcon;
|
||||
vl::presentation::controls::GuiToolstripCommand* commandTile;
|
||||
vl::presentation::controls::GuiBindableListView* listViewContacts;
|
||||
vl::presentation::controls::GuiWindow* self;
|
||||
vl::presentation::controls::GuiBindableTreeView* treeViewFolders;
|
||||
|
||||
void InitializeComponents(Ptr<demo::IViewModel> ViewModel)
|
||||
@@ -76,6 +78,7 @@ namespace demo
|
||||
GUI_INSTANCE_REFERENCE(commandSmallIcon);
|
||||
GUI_INSTANCE_REFERENCE(commandTile);
|
||||
GUI_INSTANCE_REFERENCE(listViewContacts);
|
||||
GUI_INSTANCE_REFERENCE(self);
|
||||
GUI_INSTANCE_REFERENCE(treeViewFolders);
|
||||
}
|
||||
else
|
||||
@@ -98,6 +101,7 @@ namespace demo
|
||||
,commandSmallIcon(0)
|
||||
,commandTile(0)
|
||||
,listViewContacts(0)
|
||||
,self(0)
|
||||
,treeViewFolders(0)
|
||||
{
|
||||
}
|
||||
@@ -108,6 +112,66 @@ namespace demo
|
||||
}
|
||||
};
|
||||
|
||||
template<typename TImpl>
|
||||
class NewFolderWindow_ : public vl::presentation::controls::GuiWindow, public vl::presentation::GuiInstancePartialClass<vl::presentation::controls::GuiWindow>, public vl::reflection::Description<TImpl>
|
||||
{
|
||||
friend struct vl::reflection::description::CustomTypeDescriptorSelector<TImpl>;
|
||||
private:
|
||||
vl::WString FolderName_;
|
||||
bool Ready_;
|
||||
protected:
|
||||
vl::presentation::controls::GuiWindow* self;
|
||||
vl::presentation::controls::GuiDocumentLabel* textBoxName;
|
||||
|
||||
void InitializeComponents()
|
||||
{
|
||||
if (InitializeFromResource())
|
||||
{
|
||||
GUI_INSTANCE_REFERENCE(self);
|
||||
GUI_INSTANCE_REFERENCE(textBoxName);
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
public:
|
||||
NewFolderWindow_()
|
||||
:vl::presentation::GuiInstancePartialClass<vl::presentation::controls::GuiWindow>(L"demo::NewFolderWindow")
|
||||
,vl::presentation::controls::GuiWindow(vl::presentation::theme::GetCurrentTheme()->CreateWindowStyle())
|
||||
,self(0)
|
||||
,textBoxName(0)
|
||||
{
|
||||
this->FolderName_ = vl::reflection::description::UnboxValue<vl::WString>(vl::reflection::description::Value::From(L"", reflection::description::GetTypeDescriptor<vl::WString>()));
|
||||
this->Ready_ = vl::reflection::description::UnboxValue<bool>(vl::reflection::description::Value::From(L"true", reflection::description::GetTypeDescriptor<bool>()));
|
||||
}
|
||||
|
||||
vl::Event<void()> FolderNameChanged;
|
||||
|
||||
vl::WString GetFolderName()
|
||||
{
|
||||
return FolderName_;
|
||||
}
|
||||
|
||||
void SetFolderName(vl::WString value)
|
||||
{
|
||||
FolderName_ = value;
|
||||
FolderNameChanged();
|
||||
}
|
||||
|
||||
vl::Event<void()> ReadyChanged;
|
||||
|
||||
bool GetReady()
|
||||
{
|
||||
return Ready_;
|
||||
}
|
||||
|
||||
void SetReady(bool value)
|
||||
{
|
||||
Ready_ = value;
|
||||
ReadyChanged();
|
||||
}
|
||||
};
|
||||
|
||||
}
|
||||
namespace vl
|
||||
{
|
||||
@@ -118,9 +182,29 @@ namespace vl
|
||||
DECL_TYPE_INFO(demo::ICategory)
|
||||
DECL_TYPE_INFO(demo::IViewModel)
|
||||
DECL_TYPE_INFO(demo::MainWindow)
|
||||
DECL_TYPE_INFO(demo::NewFolderWindow)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
namespace demo
|
||||
{
|
||||
class NewFolderWindow : public demo::NewFolderWindow_<demo::NewFolderWindow>
|
||||
{
|
||||
friend class demo::NewFolderWindow_<demo::NewFolderWindow>;
|
||||
friend struct vl::reflection::description::CustomTypeDescriptorSelector<demo::NewFolderWindow>;
|
||||
protected:
|
||||
|
||||
// #region CLASS_MEMBER_GUIEVENT_HANDLER (DO NOT PUT OTHER CONTENT IN THIS #region.)
|
||||
void OnCreate();
|
||||
void OnDestroy();
|
||||
// #endregion CLASS_MEMBER_GUIEVENT_HANDLER
|
||||
public:
|
||||
NewFolderWindow();
|
||||
~NewFolderWindow();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user