Compare commits

...

2 commits

Author SHA1 Message Date
hippoz
93b33c433b
remove redundant computation for window_relative 2022-06-14 01:48:02 +03:00
hippoz
ac340869a7
switch to older example program for testing 2022-06-14 01:46:58 +03:00
3 changed files with 37 additions and 26 deletions

View file

@ -9,7 +9,7 @@
namespace Raven { namespace Raven {
Point Widget::window_relative() { Point Widget::compute_window_relative() {
Point point = { 0, 0 }; Point point = { 0, 0 };
for (Widget* parent = m_parent; parent; parent = parent->parent()) { for (Widget* parent = m_parent; parent; parent = parent->parent()) {
point.add(parent->rect().x(), parent->rect().y()); point.add(parent->rect().x(), parent->rect().y());
@ -51,10 +51,13 @@ void Widget::move_to(double x, double y) {
} }
void Widget::do_layout() { void Widget::do_layout() {
if (m_layout) if (m_layout) {
m_layout->run(); m_layout->run();
} }
m_window_relative = compute_window_relative();
}
void Widget::set_layout(std::shared_ptr<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

@ -58,7 +58,7 @@ public:
void set_rect(Box rect) { m_rect = rect; reflow(); } void set_rect(Box rect) { m_rect = rect; reflow(); }
void set_rect(Box rect, bool is_pure) { m_rect = rect; if (!is_pure) { reflow(); } } void set_rect(Box rect, bool is_pure) { m_rect = rect; if (!is_pure) { reflow(); } }
Point window_relative(); Point &window_relative() { return m_window_relative; };
WidgetType type() { return m_type; } WidgetType type() { return m_type; }
ControlWidgetType control_type() { return m_control_type; } ControlWidgetType control_type() { return m_control_type; }
@ -114,16 +114,19 @@ protected:
virtual void on_paint() {} virtual void on_paint() {}
void set_did_init(bool did_init) { m_did_init = did_init; } void set_did_init(bool did_init) { m_did_init = did_init; }
Point compute_window_relative();
void do_layout();
void repaint(); void repaint();
void reflow(); void reflow();
private: private:
void do_layout();
void handle_repaint_rect(RepaintRectEvent &event); void handle_repaint_rect(RepaintRectEvent &event);
void handle_relayout_subtree(RelayoutSubtreeEvent &event); void handle_relayout_subtree(RelayoutSubtreeEvent &event);
void handle_mouse_move_event(MouseMoveEvent &event); void handle_mouse_move_event(MouseMoveEvent &event);
void handle_mouse_button_event(MouseButtonEvent &event); void handle_mouse_button_event(MouseButtonEvent &event);
Point m_window_relative { 0, 0 };
Box m_rect { 0, 0, 0, 0 }; Box m_rect { 0, 0, 0, 0 };
std::vector<std::shared_ptr<Widget>> m_children; std::vector<std::shared_ptr<Widget>> m_children;
Widget *m_parent { nullptr }; Widget *m_parent { nullptr };

View file

@ -11,40 +11,45 @@
#include "src/Styles.hpp" #include "src/Styles.hpp"
#include <iostream> #include <iostream>
#include <memory> #include <memory>
#include <sstream>
#include <string> #include <string>
void update_count_label_text(std::shared_ptr<Raven::Label> label, int number) {
std::stringstream text;
text << "you have clicked the button " << std::to_string(number) << " times";
label->set_text(text.str());
}
int main() { int main() {
Raven::Window window {}; Raven::Window window {};
int number = 0;
window.spawn_window(); window.spawn_window();
auto main_widget = window.set_main_widget<Raven::Widget>(); auto main_widget = window.set_main_widget<Raven::Widget>();
main_widget->set_layout<Raven::DocumentLayout>(10.0); main_widget->set_layout<Raven::DocumentLayout>(10.0);
auto count_label = main_widget->add<Raven::Label>("you have clicked the button 0 times"); auto second_widget = main_widget->add<Raven::Widget>();
second_widget->set_layout<Raven::DocumentLayout>(20.0);
second_widget->resize(800, 800);
main_widget->add<Raven::Widget>(Raven::ControlWidgetType::NewRow); auto inner_widget = second_widget->add<Raven::Widget>();
inner_widget->set_layout<Raven::DocumentLayout>(8.0);
inner_widget->resize(600, 600);
auto increment_button = main_widget->add<Raven::Button>("click me"); int number = 0;
increment_button->set_style(&Raven::accent_button_style);
increment_button->on_click = [&]() { for (int i = 0; i < 250; i++) {
number++; auto button = inner_widget->add<Raven::Button>("click me");
update_count_label_text(count_label, number); button->set_style(&Raven::accent_button_style);
}; auto label = inner_widget->add<Raven::Label>("click one of the buttons!");
button->on_click = [&]() {
auto reset_button = main_widget->add<Raven::Button>("reset"); number += 10;
reset_button->on_click = [&]() {
number = 0; window.start_batch();
update_count_label_text(count_label, number); auto& children = inner_widget->children();
for (auto& child : children) {
if (child->type() == Raven::WidgetType::Button) {
std::static_pointer_cast<Raven::Button>(child)->set_text(std::to_string(number));
}
if (child->type() == Raven::WidgetType::Label) {
std::static_pointer_cast<Raven::Label>(child)->set_text(std::to_string(number));
}
}
window.end_batch();
}; };
}
window.run(true); window.run(true);
return 0; return 0;