convenience function for adding layouts to a widget

This commit is contained in:
hippoz 2022-04-03 15:46:38 +03:00
parent 60a4dc51a7
commit 0aebfd6465
Signed by: hippoz
GPG key ID: 7C52899193467641
4 changed files with 19 additions and 9 deletions

View file

@ -11,6 +11,10 @@ public:
DocumentLayout() DocumentLayout()
: Layout() {} : Layout() {}
DocumentLayout(double margin)
: Layout()
, m_margin(margin) {}
void run(); void run();
double get_margin() { return m_margin; } double get_margin() { return m_margin; }

View file

@ -1,5 +1,6 @@
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>
#include <memory>
#include "Widget.hpp" #include "Widget.hpp"
#include "Events.hpp" #include "Events.hpp"
#include "Window.hpp" #include "Window.hpp"
@ -14,7 +15,7 @@ void Widget::do_layout() {
} }
} }
void Widget::set_layout(Layout *layout) { void Widget::set_layout(std::shared_ptr<Layout> layout) {
m_layout = layout; m_layout = layout;
m_layout->bind_to(this); m_layout->bind_to(this);
} }

View file

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <memory> #include <memory>
#include <utility>
#include <vector> #include <vector>
#include <string> #include <string>
#include "Box.hpp" #include "Box.hpp"
@ -36,8 +37,8 @@ private:
std::vector<Widget*> m_children; std::vector<Widget*> m_children;
Widget *m_parent { nullptr }; Widget *m_parent { nullptr };
Window *m_window { nullptr }; Window *m_window { nullptr };
std::shared_ptr<TopLevelStyles> m_styles = nullptr; std::shared_ptr<TopLevelStyles> m_styles { nullptr };
Layout *m_layout { nullptr }; std::shared_ptr<Layout> m_layout { nullptr };
bool m_did_init { false }; bool m_did_init { false };
bool m_is_focused { false }; bool m_is_focused { false };
bool m_is_active { false }; bool m_is_active { false };
@ -84,8 +85,8 @@ public:
bool get_accepts_events() { return m_accepts_events; } bool get_accepts_events() { return m_accepts_events; }
void set_accepts_events(bool accepts_events) { m_accepts_events = accepts_events; } void set_accepts_events(bool accepts_events) { m_accepts_events = accepts_events; }
void set_layout(Layout *layout); void set_layout(std::shared_ptr<Layout> layout);
Layout *get_layout() { return m_layout; } std::shared_ptr<Layout> get_layout() { return m_layout; }
WidgetType get_type() { return m_type; } WidgetType get_type() { return m_type; }
ControlWidgetType get_control_type() { return m_control_type; } ControlWidgetType get_control_type() { return m_control_type; }
@ -94,6 +95,13 @@ public:
void wants_repaint(); void wants_repaint();
void wants_relayout(); void wants_relayout();
template<typename T, class... Args>
std::shared_ptr<T> set_layout(Args&&... args) {
std::shared_ptr<T> layout = std::make_shared<T>(std::forward<T>(args)...);
set_layout(layout);
return layout;
}
virtual ~Widget() {}; virtual ~Widget() {};
protected: protected:
WidgetType m_type { WidgetType::Widget }; WidgetType m_type { WidgetType::Widget };

View file

@ -8,7 +8,6 @@
#include "src/DocumentLayout.hpp" #include "src/DocumentLayout.hpp"
int main() { int main() {
Raven::DocumentLayout main_layout {};
Raven::Widget new_row { Raven::ControlWidgetType::NewRow }; Raven::Widget new_row { Raven::ControlWidgetType::NewRow };
Raven::Window window {}; Raven::Window window {};
@ -19,16 +18,14 @@ int main() {
int number = 0; int number = 0;
window.spawn_window(); window.spawn_window();
add_button.set_current_geometry(Raven::Box(0, 0, 100, 30)); add_button.set_current_geometry(Raven::Box(0, 0, 100, 30));
subtract_button.set_current_geometry(Raven::Box(0, 0, 100, 30)); subtract_button.set_current_geometry(Raven::Box(0, 0, 100, 30));
label.set_current_geometry(Raven::Box(0, 0, 100, 20)); label.set_current_geometry(Raven::Box(0, 0, 100, 20));
main_layout.set_margin(6.0); main_widget.set_layout<Raven::DocumentLayout>(6.0);
main_widget.set_layout(&main_layout);
window.set_main_widget(&main_widget); window.set_main_widget(&main_widget);
add_button.on_click = [&]() { add_button.on_click = [&]() {