aboutsummaryrefslogtreecommitdiff
path: root/include/cru/ui
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-11-20 21:25:29 +0800
committercrupest <crupest@outlook.com>2021-11-20 21:25:29 +0800
commit1a53ed0791d9793ed8030d3a44e833e5e7c4542b (patch)
tree28aedaabee675b192e414489122349ad4985a31b /include/cru/ui
parenta9da4c10459e3c45115c8a42e771b00cb1caeab7 (diff)
downloadcru-1a53ed0791d9793ed8030d3a44e833e5e7c4542b.tar.gz
cru-1a53ed0791d9793ed8030d3a44e833e5e7c4542b.tar.bz2
cru-1a53ed0791d9793ed8030d3a44e833e5e7c4542b.zip
...
Diffstat (limited to 'include/cru/ui')
-rw-r--r--include/cru/ui/components/Menu.hpp29
-rw-r--r--include/cru/ui/controls/Popup.hpp8
-rw-r--r--include/cru/ui/host/WindowHost.hpp5
3 files changed, 39 insertions, 3 deletions
diff --git a/include/cru/ui/components/Menu.hpp b/include/cru/ui/components/Menu.hpp
index d60d38eb..96b21173 100644
--- a/include/cru/ui/components/Menu.hpp
+++ b/include/cru/ui/components/Menu.hpp
@@ -4,9 +4,9 @@
#include "cru/ui/controls/Button.hpp"
#include "cru/ui/controls/Control.hpp"
#include "cru/ui/controls/FlexLayout.hpp"
+#include "cru/ui/controls/Popup.hpp"
#include "cru/ui/controls/TextBlock.hpp"
-#include <string>
#include <vector>
namespace cru::ui::components {
@@ -40,6 +40,8 @@ class Menu : public Component {
~Menu();
public:
+ controls::Control* GetRootControl() override { return container_; }
+
gsl::index GetItemCount() const {
return static_cast<gsl::index>(items_.size());
}
@@ -57,4 +59,29 @@ class Menu : public Component {
controls::FlexLayout* container_;
std::vector<Component*> items_;
};
+
+class PopupMenu : public Component {
+ public:
+ explicit PopupMenu(controls::Control* attached_control = nullptr);
+
+ CRU_DELETE_COPY(PopupMenu)
+ CRU_DELETE_MOVE(PopupMenu)
+
+ ~PopupMenu();
+
+ public:
+ controls::Control* GetRootControl() override;
+
+ controls::Popup* GetPopup() { return popup_; }
+ Menu* GetMenu() { return menu_; }
+
+ void SetPosition(const Point& position);
+ void Show();
+
+ private:
+ controls::Control* attached_control_;
+
+ controls::Popup* popup_;
+ Menu* menu_;
+};
} // namespace cru::ui::components
diff --git a/include/cru/ui/controls/Popup.hpp b/include/cru/ui/controls/Popup.hpp
index 321bbbc6..cd5e1813 100644
--- a/include/cru/ui/controls/Popup.hpp
+++ b/include/cru/ui/controls/Popup.hpp
@@ -8,6 +8,12 @@
namespace cru::ui::controls {
class Popup : public RootControl {
public:
+ static constexpr StringView kControlType = u"Popup";
+
+ static Popup* Create(Control* attached_control = nullptr) {
+ return new Popup(attached_control);
+ }
+
explicit Popup(Control* attached_control = nullptr);
CRU_DELETE_COPY(Popup)
@@ -15,6 +21,8 @@ class Popup : public RootControl {
~Popup() override;
+ String GetControlType() const override { return kControlType.ToString(); }
+
protected:
gsl::not_null<platform::gui::INativeWindow*> CreateNativeWindow(
gsl::not_null<host::WindowHost*> host,
diff --git a/include/cru/ui/host/WindowHost.hpp b/include/cru/ui/host/WindowHost.hpp
index 258b0c4c..f3caeeef 100644
--- a/include/cru/ui/host/WindowHost.hpp
+++ b/include/cru/ui/host/WindowHost.hpp
@@ -59,7 +59,8 @@ class WindowHost : public Object {
}
void Relayout();
- void Relayout(const Size& available_size);
+ void RelayoutWithSize(const Size& available_size = Size::Infinate(),
+ bool set_window_size_to_fit_content = false);
void Repaint();
@@ -173,7 +174,7 @@ class WindowHost : public Object {
controls::Control* mouse_captured_control_ = nullptr;
- bool layout_prefer_to_fill_window_ = true;
+ bool layout_prefer_to_fill_window_ = false;
Event<platform::gui::INativeWindow*> native_window_change_event_;