AddressBook Folder

This commit is contained in:
vczh
2016-07-29 01:53:12 -07:00
parent b9811b60e0
commit 9d3382fa93
9 changed files with 220 additions and 10 deletions

View File

@@ -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);
}
}
};

View File

@@ -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>

View File

@@ -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)

View File

@@ -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