diff options
Diffstat (limited to 'src/ui/controls/list_item.hpp')
| -rw-r--r-- | src/ui/controls/list_item.hpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/ui/controls/list_item.hpp b/src/ui/controls/list_item.hpp new file mode 100644 index 00000000..1de89b5f --- /dev/null +++ b/src/ui/controls/list_item.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include <map> +#include <initializer_list> + +#include "ui/control.hpp" + +namespace cru::ui::controls +{ + class ListItem : public Control + { + public: + static constexpr auto control_type = L"ListItem"; + + enum class State + { + Normal, + Hover, + Select + }; + + private: + struct StateBrush + { + Microsoft::WRL::ComPtr<ID2D1Brush> border_brush; + Microsoft::WRL::ComPtr<ID2D1Brush> fill_brush; + }; + + public: + static ListItem* Create(const std::initializer_list<Control*>& children) + { + const auto list_item = new ListItem(); + for (auto control : children) + list_item->AddChild(control); + return list_item; + } + + private: + ListItem(); + public: + ListItem(const ListItem& other) = delete; + ListItem(ListItem&& other) = delete; + ListItem& operator=(const ListItem& other) = delete; + ListItem& operator=(ListItem&& other) = delete; + ~ListItem() override = default; + + StringView GetControlType() const override; + + State GetState() const + { + return state_; + } + + void SetState(State state); + + protected: + void OnDrawForeground(ID2D1DeviceContext* device_context) override; + + void OnMouseEnterCore(events::MouseEventArgs& args) override final; + void OnMouseLeaveCore(events::MouseEventArgs& args) override final; + void OnMouseClickCore(events::MouseButtonEventArgs& args) override final; + + private: + State state_ = State::Normal; + std::map<State, StateBrush> brushes_{}; + }; +} |
