aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2018-09-22 00:17:53 +0800
committercrupest <crupest@outlook.com>2018-09-22 00:17:53 +0800
commite01800206050a0ed88cc4f4456fa3590021ab66f (patch)
treeaaa6118d614ead6cd1865e4b2d160cade91d8057
parent89f7277d47cd37f25a141ec2ebc13c4f6fceabd5 (diff)
downloadcru-e01800206050a0ed88cc4f4456fa3590021ab66f.tar.gz
cru-e01800206050a0ed88cc4f4456fa3590021ab66f.tar.bz2
cru-e01800206050a0ed88cc4f4456fa3590021ab66f.zip
Add button.
-rw-r--r--CruUI/CruUI.vcxproj2
-rw-r--r--CruUI/CruUI.vcxproj.filters6
-rw-r--r--CruUI/main.cpp30
-rw-r--r--CruUI/ui/control.cpp29
-rw-r--r--CruUI/ui/control.h5
-rw-r--r--CruUI/ui/controls/button.cpp33
-rw-r--r--CruUI/ui/controls/button.h36
-rw-r--r--CruUI/ui/window.cpp2
8 files changed, 127 insertions, 16 deletions
diff --git a/CruUI/CruUI.vcxproj b/CruUI/CruUI.vcxproj
index b1402f7a..78e24f9b 100644
--- a/CruUI/CruUI.vcxproj
+++ b/CruUI/CruUI.vcxproj
@@ -164,6 +164,7 @@
<ClInclude Include="ui\animations\animation.h" />
<ClInclude Include="ui\control.h" />
<ClInclude Include="global_macros.h" />
+ <ClInclude Include="ui\controls\button.h" />
<ClInclude Include="ui\controls\linear_layout.h" />
<ClInclude Include="ui\controls\text_block.h" />
<ClInclude Include="ui\controls\toggle_button.h" />
@@ -177,6 +178,7 @@
<ClCompile Include="base.cpp" />
<ClCompile Include="exception.cpp" />
<ClCompile Include="ui\animations\animation.cpp" />
+ <ClCompile Include="ui\controls\button.cpp" />
<ClCompile Include="ui\layout_base.cpp" />
<ClCompile Include="main.cpp" />
<ClCompile Include="graph\graph.cpp" />
diff --git a/CruUI/CruUI.vcxproj.filters b/CruUI/CruUI.vcxproj.filters
index b41bcb9f..f1cbe6e9 100644
--- a/CruUI/CruUI.vcxproj.filters
+++ b/CruUI/CruUI.vcxproj.filters
@@ -69,6 +69,9 @@
<ClInclude Include="ui\animations\animation.h">
<Filter>Header Files</Filter>
</ClInclude>
+ <ClInclude Include="ui\controls\button.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="application.cpp">
@@ -116,5 +119,8 @@
<ClCompile Include="base.cpp">
<Filter>Source Files</Filter>
</ClCompile>
+ <ClCompile Include="ui\controls\button.cpp">
+ <Filter>Source Files</Filter>
+ </ClCompile>
</ItemGroup>
</Project> \ No newline at end of file
diff --git a/CruUI/main.cpp b/CruUI/main.cpp
index 65e63af9..9cd566ab 100644
--- a/CruUI/main.cpp
+++ b/CruUI/main.cpp
@@ -3,6 +3,7 @@
#include "ui/controls/linear_layout.h"
#include "ui/controls/text_block.h"
#include "ui/controls/toggle_button.h"
+#include "ui/controls/button.h"
using cru::String;
@@ -14,6 +15,7 @@ using cru::ui::LayoutLength;
using cru::ui::controls::LinearLayout;
using cru::ui::controls::TextBlock;
using cru::ui::controls::ToggleButton;
+using cru::ui::controls::Button;
int APIENTRY wWinMain(
@@ -82,20 +84,28 @@ int APIENTRY wWinMain(
layout->AddChild(TextBlock::Create(L"Layout is clicked!"));
});
- const auto inner_layout = LinearLayout::Create(LinearLayout::Orientation::Horizontal);
- inner_layout->GetLayoutParams()->width.alignment = Alignment::End;
+ {
+ const auto inner_layout = LinearLayout::Create(LinearLayout::Orientation::Horizontal);
+ inner_layout->GetLayoutParams()->width.alignment = Alignment::End;
- layout->AddChild(inner_layout);
+ layout->AddChild(inner_layout);
- inner_layout->AddChild(TextBlock::Create(L"Toggle debug border"));
+ inner_layout->AddChild(TextBlock::Create(L"Toggle debug border"));
- const auto toggle_button = ToggleButton::Create();
- toggle_button->toggle_event.AddHandler([&window](cru::ui::events::ToggleEventArgs& args)
- {
- window.SetDebugDrawControlBorder(args.GetNewState());
- });
+ const auto toggle_button = ToggleButton::Create();
+ toggle_button->toggle_event.AddHandler([&window](cru::ui::events::ToggleEventArgs& args)
+ {
+ window.SetDebugDrawControlBorder(args.GetNewState());
+ });
- inner_layout->AddChild(toggle_button);
+ inner_layout->AddChild(toggle_button);
+ }
+
+ {
+ const auto button = Button::Create();
+ button->AddChild(TextBlock::Create(L"button"));
+ layout->AddChild(button);
+ }
auto&& create_text_block = [](const String& text, const LayoutLength& width = LayoutLength::Content(), const LayoutLength& height = LayoutLength::Content())
{
diff --git a/CruUI/ui/control.cpp b/CruUI/ui/control.cpp
index 2f5a7ef8..bfe3f7a7 100644
--- a/CruUI/ui/control.cpp
+++ b/CruUI/ui/control.cpp
@@ -382,8 +382,14 @@ namespace cru {
void Control::OnMouseLeaveCore(MouseEventArgs & args)
{
is_mouse_inside_ = false;
- for (auto& is_mouse_leave : is_mouse_leave_)
- is_mouse_leave.second = true;
+ for (auto& is_mouse_click_valid : is_mouse_click_valid_map_)
+ {
+ if (is_mouse_click_valid.second)
+ {
+ is_mouse_click_valid.second = false;
+ OnMouseClickEnd(is_mouse_click_valid.first);
+ }
+ }
}
void Control::OnMouseMoveCore(MouseEventArgs & args)
@@ -393,13 +399,18 @@ namespace cru {
void Control::OnMouseDownCore(MouseButtonEventArgs & args)
{
- is_mouse_leave_[args.GetMouseButton()] = false;
+ is_mouse_click_valid_map_[args.GetMouseButton()] = true;
+ OnMouseClickBegin(args.GetMouseButton());
}
void Control::OnMouseUpCore(MouseButtonEventArgs & args)
{
- if (!is_mouse_leave_[args.GetMouseButton()])
+ if (is_mouse_click_valid_map_[args.GetMouseButton()])
+ {
+ is_mouse_click_valid_map_[args.GetMouseButton()] = false;
RaiseMouseClickEvent(args);
+ OnMouseClickEnd(args.GetMouseButton());
+ }
}
void Control::OnMouseClickCore(MouseButtonEventArgs& args)
@@ -449,6 +460,16 @@ namespace cru {
mouse_click_event.Raise(args);
}
+ void Control::OnMouseClickBegin(MouseButton button)
+ {
+
+ }
+
+ void Control::OnMouseClickEnd(MouseButton button)
+ {
+
+ }
+
void Control::OnGetFocus(FocusChangeEventArgs& args)
{
diff --git a/CruUI/ui/control.h b/CruUI/ui/control.h
index 7b66ea57..44fbdfba 100644
--- a/CruUI/ui/control.h
+++ b/CruUI/ui/control.h
@@ -265,6 +265,9 @@ namespace cru
void RaiseMouseUpEvent(events::MouseButtonEventArgs& args);
void RaiseMouseClickEvent(events::MouseButtonEventArgs& args);
+ virtual void OnMouseClickBegin(MouseButton button);
+ virtual void OnMouseClickEnd(MouseButton button);
+
//*************** region: focus event ***************
virtual void OnGetFocus(events::FocusChangeEventArgs& args);
virtual void OnLoseFocus(events::FocusChangeEventArgs& args);
@@ -315,7 +318,7 @@ namespace cru
bool is_mouse_inside_ = false;
- std::unordered_map<MouseButton, bool> is_mouse_leave_
+ std::unordered_map<MouseButton, bool> is_mouse_click_valid_map_
{
{ MouseButton::Left, true },
{ MouseButton::Middle, true },
diff --git a/CruUI/ui/controls/button.cpp b/CruUI/ui/controls/button.cpp
new file mode 100644
index 00000000..b7614f93
--- /dev/null
+++ b/CruUI/ui/controls/button.cpp
@@ -0,0 +1,33 @@
+#include "button.h"
+
+#include "graph/graph.h"
+
+namespace cru::ui::controls
+{
+ using graph::CreateSolidBrush;
+
+ Button::Button() : Control(true)
+ {
+ normal_border_brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::RoyalBlue));
+ pressed_border_brush_ = CreateSolidBrush(D2D1::ColorF(D2D1::ColorF::MediumBlue));
+ current_border_brush_ = normal_border_brush_.Get();
+ }
+
+ void Button::OnDraw(ID2D1DeviceContext* device_context)
+ {
+ Control::OnDraw(device_context);
+ device_context->DrawRoundedRectangle(D2D1::RoundedRect(D2D1::RectF(0, 0, GetSize().width, GetSize().height), 6, 6), current_border_brush_, 2);
+ }
+
+ void Button::OnMouseClickBegin(MouseButton button)
+ {
+ current_border_brush_ = pressed_border_brush_.Get();
+ Repaint();
+ }
+
+ void Button::OnMouseClickEnd(MouseButton button)
+ {
+ current_border_brush_ = normal_border_brush_.Get();
+ Repaint();
+ }
+}
diff --git a/CruUI/ui/controls/button.h b/CruUI/ui/controls/button.h
new file mode 100644
index 00000000..f9ad7726
--- /dev/null
+++ b/CruUI/ui/controls/button.h
@@ -0,0 +1,36 @@
+#pragma once
+
+#include "ui/control.h"
+
+namespace cru::ui::controls
+{
+ class Button : public Control
+ {
+ public:
+ static Button* Create()
+ {
+ return new Button();
+ }
+
+ protected:
+ Button();
+
+ public:
+ Button(const Button& other) = delete;
+ Button(Button&& other) = delete;
+ Button& operator=(const Button& other) = delete;
+ Button& operator=(Button&& other) = delete;
+ ~Button() override = default;
+
+ protected:
+ void OnDraw(ID2D1DeviceContext* device_context) override;
+
+ void OnMouseClickBegin(MouseButton button) override final;
+ void OnMouseClickEnd(MouseButton button) override final;
+
+ private:
+ Microsoft::WRL::ComPtr<ID2D1Brush> normal_border_brush_;
+ Microsoft::WRL::ComPtr<ID2D1Brush> pressed_border_brush_;
+ ID2D1Brush* current_border_brush_;
+ };
+}
diff --git a/CruUI/ui/window.cpp b/CruUI/ui/window.cpp
index 21528d9d..b20abb61 100644
--- a/CruUI/ui/window.cpp
+++ b/CruUI/ui/window.cpp
@@ -16,7 +16,7 @@ namespace cru
WNDCLASSEX window_class;
window_class.cbSize = sizeof(WNDCLASSEX);
- window_class.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
+ window_class.style = CS_HREDRAW | CS_VREDRAW;
window_class.lpfnWndProc = window_proc;
window_class.cbClsExtra = 0;
window_class.cbWndExtra = 0;