add scrolling widgets
This commit is contained in:
parent
0b4b3b1332
commit
b0315b76be
10 changed files with 51 additions and 27 deletions
|
@ -11,6 +11,7 @@ executable(
|
|||
'./src/Painter.cpp',
|
||||
'./src/Window.cpp',
|
||||
'./src/Widget.cpp',
|
||||
'./src/ScrollContainer.cpp',
|
||||
'./src/Button.cpp',
|
||||
'./src/DocumentLayout.cpp',
|
||||
'./src/HorizontalBoxLayout.cpp',
|
||||
|
|
|
@ -58,6 +58,11 @@ void Box::set_height(double height) {
|
|||
}
|
||||
}
|
||||
|
||||
void Box::update() {
|
||||
set_width(m_width);
|
||||
set_height(m_height);
|
||||
}
|
||||
|
||||
Box Box::max_geometry() {
|
||||
auto max_width = m_max_width == -1 ? m_width : m_max_width;
|
||||
auto max_height = m_max_height == -1 ? m_height : m_max_height;
|
||||
|
|
|
@ -56,6 +56,8 @@ public:
|
|||
void set_min_width(double min_width) { m_min_width = min_width; set_width(m_width); }
|
||||
void set_min_height(double min_height) { m_min_height = min_height; set_height(m_height); }
|
||||
|
||||
void update();
|
||||
|
||||
bool contains_point(double x, double y) const;
|
||||
bool contains_point(const Point &point) const;
|
||||
bool contains_box(const Box &other) const;
|
||||
|
|
|
@ -31,11 +31,15 @@ class MouseButtonEvent : public Event {
|
|||
private:
|
||||
bool m_was_left_button_pressed;
|
||||
bool m_was_right_button_pressed;
|
||||
bool m_did_scroll_up;
|
||||
bool m_did_scroll_down;
|
||||
Point m_point;
|
||||
public:
|
||||
MouseButtonEvent(bool was_left_button_pressed, bool was_right_button_pressed, Point point)
|
||||
MouseButtonEvent(bool was_left_button_pressed, bool was_right_button_pressed, bool did_scroll_up, bool did_scroll_down, Point point)
|
||||
: m_was_left_button_pressed(was_left_button_pressed)
|
||||
, m_was_right_button_pressed(was_right_button_pressed)
|
||||
, m_did_scroll_up(did_scroll_up)
|
||||
, m_did_scroll_down(did_scroll_down)
|
||||
, m_point(point) {}
|
||||
|
||||
EventType type() { return EventType::MouseButton; }
|
||||
|
@ -43,6 +47,8 @@ public:
|
|||
|
||||
bool was_left_button_pressed() { return m_was_left_button_pressed; }
|
||||
bool was_right_button_pressed() { return m_was_right_button_pressed; }
|
||||
bool did_scroll_up() { return m_did_scroll_up; }
|
||||
bool did_scroll_down() { return m_did_scroll_down; }
|
||||
|
||||
Point &point() { return m_point; }
|
||||
};
|
||||
|
|
|
@ -47,6 +47,17 @@ GenericStyle accent_widget_style {
|
|||
false
|
||||
};
|
||||
|
||||
GenericStyle clear_widget_style {
|
||||
pango_font_description_from_string("sans-serif"),
|
||||
black6,
|
||||
white2,
|
||||
white2,
|
||||
white2,
|
||||
0.0,
|
||||
false,
|
||||
false
|
||||
};
|
||||
|
||||
GenericStyle default_button_style {
|
||||
pango_font_description_from_string("sans-serif"),
|
||||
black6,
|
||||
|
@ -64,7 +75,7 @@ GenericStyle accent_button_style {
|
|||
accent2,
|
||||
accent1,
|
||||
accent0,
|
||||
5.0,
|
||||
0.0,
|
||||
true,
|
||||
true
|
||||
};
|
||||
|
|
|
@ -26,6 +26,7 @@ extern RGB accent2;
|
|||
|
||||
extern GenericStyle default_widget_style;
|
||||
extern GenericStyle accent_widget_style;
|
||||
extern GenericStyle clear_widget_style;
|
||||
extern GenericStyle default_button_style;
|
||||
extern GenericStyle accent_button_style;
|
||||
extern GenericStyle default_label_style;
|
||||
|
|
|
@ -67,14 +67,6 @@ void Widget::move_to(double x, double y) {
|
|||
reflow();
|
||||
}
|
||||
|
||||
void Widget::do_layout() {
|
||||
if (m_layout) {
|
||||
m_layout->run();
|
||||
}
|
||||
|
||||
m_window_relative = compute_window_relative();
|
||||
}
|
||||
|
||||
void Widget::set_layout(std::shared_ptr<Layout> layout) {
|
||||
m_layout = layout;
|
||||
m_layout->bind_to(this);
|
||||
|
@ -182,10 +174,16 @@ void Widget::handle_repaint_rect(RepaintRectEvent &event) {
|
|||
}
|
||||
|
||||
void Widget::handle_relayout_subtree(RelayoutSubtreeEvent &event) {
|
||||
on_layout(); // hack
|
||||
for (auto child : m_children) {
|
||||
child->dispatch_event(event);
|
||||
}
|
||||
do_layout();
|
||||
|
||||
if (m_layout) {
|
||||
m_layout->run();
|
||||
}
|
||||
|
||||
m_window_relative = compute_window_relative();
|
||||
}
|
||||
|
||||
void Widget::handle_mouse_move_event(MouseMoveEvent &event) {
|
||||
|
@ -246,7 +244,7 @@ void Widget::handle_mouse_button_event(MouseButtonEvent &event) {
|
|||
|
||||
if (!m_consumes_hits) {
|
||||
// translate the event's point to our coordinate space because the position of all children is relative to the origin of their parent
|
||||
auto local_event = MouseButtonEvent(event.was_left_button_pressed(), event.was_right_button_pressed(), Point(
|
||||
auto local_event = MouseButtonEvent(event.was_left_button_pressed(), event.was_right_button_pressed(), event.did_scroll_up(), event.did_scroll_down(), Point(
|
||||
event.point().x() - m_rect.x(),
|
||||
event.point().y() - m_rect.y()
|
||||
));
|
||||
|
|
|
@ -113,12 +113,11 @@ protected:
|
|||
virtual void on_focus_update(FocusUpdateEvent &event) {}
|
||||
virtual void on_activation_update(ActivationUpdateEvent &event) {}
|
||||
virtual void on_paint() {}
|
||||
virtual void on_layout() {}
|
||||
|
||||
void set_did_init(bool did_init) { m_did_init = did_init; }
|
||||
Point compute_window_relative();
|
||||
|
||||
void do_layout();
|
||||
|
||||
void repaint();
|
||||
void reflow();
|
||||
private:
|
||||
|
|
|
@ -172,13 +172,13 @@ void Window::run(bool block) {
|
|||
}
|
||||
case ButtonRelease: {
|
||||
auto point = Point(e.xbutton.x, e.xbutton.y);
|
||||
auto event = MouseButtonEvent(false, false, point);
|
||||
auto event = MouseButtonEvent(false, false, false, false, point);
|
||||
dispatch_to_main_widget(event);
|
||||
break;
|
||||
}
|
||||
case ButtonPress: {
|
||||
auto point = Point(e.xbutton.x, e.xbutton.y);
|
||||
auto event = MouseButtonEvent(e.xbutton.button == Button1, e.xbutton.button == Button2, point);
|
||||
auto event = MouseButtonEvent(e.xbutton.button == Button1, e.xbutton.button == Button2, e.xbutton.button == Button4, e.xbutton.button == Button5, point);
|
||||
dispatch_to_main_widget(event);
|
||||
break;
|
||||
}
|
||||
|
|
23
src/main.cpp
23
src/main.cpp
|
@ -9,6 +9,7 @@
|
|||
#include "DocumentLayout.hpp"
|
||||
#include "Events.hpp"
|
||||
#include "src/HorizontalBoxLayout.hpp"
|
||||
#include "src/ScrollContainer.hpp"
|
||||
#include "src/Styles.hpp"
|
||||
#include "src/VerticalBoxLayout.hpp"
|
||||
#include <iostream>
|
||||
|
@ -22,18 +23,18 @@ int main() {
|
|||
auto main_widget = window.set_main_widget<Raven::Widget>();
|
||||
main_widget->set_layout<Raven::VerticalBoxLayout>(6.0);
|
||||
|
||||
for (int i = 0; i < 12; i++) {
|
||||
auto row = main_widget->add<Raven::Widget>();
|
||||
row->set_layout<Raven::HorizontalBoxLayout>(6.0);
|
||||
for (int i = 0; i < 12; i++) {
|
||||
auto button = row->add<Raven::Button>("0");
|
||||
auto scroll_container = main_widget->add<Raven::ScrollContainer>();
|
||||
scroll_container->set_scroll(Raven::Point(0, 0));
|
||||
scroll_container->resize_fixed(100, 100);
|
||||
scroll_container->set_style(&Raven::accent_widget_style);
|
||||
|
||||
button->on_click = [button]() {
|
||||
int number = std::stoi(button->text());
|
||||
button->set_text(std::to_string(++number));
|
||||
};
|
||||
}
|
||||
}
|
||||
auto target = scroll_container->make_target();
|
||||
target->set_layout<Raven::DocumentLayout>(6.0);
|
||||
|
||||
auto hello_button = target->add<Raven::Button>("hello");
|
||||
hello_button->set_style(&Raven::accent_button_style);
|
||||
auto bye_button = target->add<Raven::Button>("bye");
|
||||
bye_button->set_style(&Raven::accent_button_style);
|
||||
|
||||
window.run(true);
|
||||
return 0;
|
||||
|
|
Loading…
Reference in a new issue