Fix activation and use toplevelstyles inside of widgets
This commit is contained in:
parent
61b76df08b
commit
736cef4667
7 changed files with 64 additions and 36 deletions
|
@ -1,3 +1,4 @@
|
|||
#include <iostream>
|
||||
#include "Button.hpp"
|
||||
#include "Box.hpp"
|
||||
#include "Window.hpp"
|
||||
|
@ -7,35 +8,38 @@
|
|||
namespace Raven {
|
||||
|
||||
void Button::on_init() {
|
||||
auto top_level_styles = get_top_level_styles();
|
||||
|
||||
set_text_fill_color(top_level_styles->get_text_color());
|
||||
set_active_background_fill_color(top_level_styles->get_button_active_color());
|
||||
set_focused_background_fill_color(top_level_styles->get_button_focused_color());
|
||||
set_normal_background_fill_color(top_level_styles->get_button_normal_color());
|
||||
|
||||
set_background_fill_color(get_styles()->get_button_normal_color());
|
||||
set_do_background_fill(true);
|
||||
set_background_fill_color(m_normal_background_fill_color);
|
||||
set_font_description(top_level_styles->get_controls_font_description());
|
||||
|
||||
set_did_init(true);
|
||||
}
|
||||
|
||||
void Button::update_color() {
|
||||
if (is_active()) {
|
||||
set_background_fill_color(get_styles()->get_button_active_color());
|
||||
} else if (is_focused()) {
|
||||
set_background_fill_color(get_styles()->get_button_focused_color());
|
||||
} else {
|
||||
set_background_fill_color(get_styles()->get_button_normal_color());
|
||||
}
|
||||
}
|
||||
|
||||
void Button::on_paint() {
|
||||
auto painter = get_window()->get_painter();
|
||||
|
||||
painter.source_rgb(m_text_fill_color);
|
||||
painter.set_pango_font_description(m_font_description);
|
||||
auto text_color = get_styles()->get_button_text_color();
|
||||
painter.source_rgb(text_color);
|
||||
painter.set_pango_font_description(get_styles()->get_controls_font_description());
|
||||
painter.text(get_current_geometry(), m_text, PaintTextAlign::Center);
|
||||
painter.fill();
|
||||
}
|
||||
|
||||
void Button::on_focus_update(FocusUpdateEvent &event) {
|
||||
if (is_focused()) {
|
||||
set_background_fill_color(m_focused_background_fill_color);
|
||||
} else {
|
||||
set_background_fill_color(m_normal_background_fill_color);
|
||||
update_color();
|
||||
}
|
||||
|
||||
void Button::on_activation_update(ActivationUpdateEvent &event) {
|
||||
update_color();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,14 +9,6 @@
|
|||
namespace Raven {
|
||||
|
||||
class Button : public Widget {
|
||||
DEF_WIDGET_STYLE_PROP(text_fill_color, RGB, 0.0, 0.0, 0.0)
|
||||
|
||||
DEF_WIDGET_STYLE_PROP(normal_background_fill_color, RGB, 0.0, 0.0, 0.0)
|
||||
DEF_WIDGET_STYLE_PROP(focused_background_fill_color, RGB, 0.0, 0.0, 0.0)
|
||||
DEF_WIDGET_STYLE_PROP(active_background_fill_color, RGB, 0.0, 0.0, 0.0)
|
||||
|
||||
DEF_WIDGET_STYLE_PROP(font_description, PangoFontDescription*, nullptr)
|
||||
|
||||
private:
|
||||
std::string m_text;
|
||||
public:
|
||||
|
@ -30,6 +22,9 @@ public:
|
|||
void on_paint();
|
||||
void on_init();
|
||||
void on_focus_update(FocusUpdateEvent &event);
|
||||
void on_activation_update(ActivationUpdateEvent &event);
|
||||
private:
|
||||
void update_color();
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -35,16 +35,20 @@ class MouseButtonEvent : public Event {
|
|||
private:
|
||||
bool m_was_left_button_pressed;
|
||||
bool m_was_right_button_pressed;
|
||||
Point m_point;
|
||||
public:
|
||||
MouseButtonEvent(bool was_left_button_pressed, bool was_right_button_pressed)
|
||||
MouseButtonEvent(bool was_left_button_pressed, bool was_right_button_pressed, Point point)
|
||||
: m_was_left_button_pressed(was_left_button_pressed)
|
||||
, m_was_right_button_pressed(was_right_button_pressed) {}
|
||||
, m_was_right_button_pressed(was_right_button_pressed)
|
||||
, m_point(point) {}
|
||||
|
||||
EventType get_type() { return EventType::MouseButton; }
|
||||
const char *get_name() { return "MouseButton"; }
|
||||
|
||||
bool get_was_left_button_pressed() { return m_was_left_button_pressed; }
|
||||
bool get_was_right_button_pressed() { return m_was_right_button_pressed; }
|
||||
|
||||
Point &get_point() { return m_point; }
|
||||
};
|
||||
|
||||
class MouseMoveEvent : public Event {
|
||||
|
|
|
@ -10,14 +10,20 @@ namespace Raven {
|
|||
class TopLevelStyles {
|
||||
DEF_WIDGET_STYLE_PROP(controls_font_description, PangoFontDescription*, nullptr)
|
||||
|
||||
/* FIXME: */
|
||||
/* right now, these colors are gruvbox */
|
||||
/* however the `accent_color_darkest` is a darkened version of `accent_color_darker` */
|
||||
DEF_WIDGET_STYLE_PROP(text_color, RGB, 0.0, 0.0, 0.0)
|
||||
DEF_WIDGET_STYLE_PROP(accent_color, RGB, 0.6941, 0.3843, 0.5254)
|
||||
DEF_WIDGET_STYLE_PROP(accent_color_darker, RGB, 0.5607, 0.2470, 0.4431)
|
||||
DEF_WIDGET_STYLE_PROP(accent_color_darkest, RGB, 0.48069, 0.1669, 0.3631)
|
||||
DEF_WIDGET_STYLE_PROP(background_color, RGB, 0.9764, 0.9607, 0.8431)
|
||||
|
||||
DEF_WIDGET_STYLE_PROP(button_text_color, RGB, m_text_color)
|
||||
DEF_WIDGET_STYLE_PROP(button_normal_color, RGB, m_accent_color)
|
||||
DEF_WIDGET_STYLE_PROP(button_focused_color, RGB, m_accent_color_darker)
|
||||
DEF_WIDGET_STYLE_PROP(button_active_color, RGB, m_accent_color_darker)
|
||||
DEF_WIDGET_STYLE_PROP(button_active_color, RGB, m_accent_color_darkest)
|
||||
DEF_WIDGET_STYLE_PROP(button_border_radius, double, 8.0)
|
||||
|
||||
private:
|
||||
Window *m_window;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include <algorithm>
|
||||
#include <iostream>
|
||||
#include "Widget.hpp"
|
||||
#include "Events.hpp"
|
||||
#include "Window.hpp"
|
||||
|
@ -7,7 +8,7 @@ namespace Raven {
|
|||
|
||||
void Widget::set_window(Window *window) {
|
||||
m_window = window;
|
||||
m_top_level_styles = m_window->get_top_level_styles();
|
||||
m_styles = m_window->get_top_level_styles();
|
||||
|
||||
on_init();
|
||||
}
|
||||
|
@ -94,8 +95,8 @@ void Widget::handle_mouse_move_event(MouseMoveEvent &event) {
|
|||
|
||||
m_is_focused = update_focus_to;
|
||||
auto focus_update_event = FocusUpdateEvent(update_focus_to);
|
||||
on_mouse_move(event);
|
||||
on_focus_update(focus_update_event);
|
||||
on_mouse_move(event);
|
||||
|
||||
if (m_is_focused && m_window)
|
||||
m_window->set_focused_widget(this);
|
||||
|
@ -105,13 +106,19 @@ void Widget::handle_mouse_move_event(MouseMoveEvent &event) {
|
|||
}
|
||||
|
||||
void Widget::handle_mouse_button_event(MouseButtonEvent &event) {
|
||||
// the mouse has updated its click state in our bounds
|
||||
m_is_active = event.get_was_left_button_pressed();
|
||||
bool update_activation_to = event.get_was_left_button_pressed();
|
||||
|
||||
auto activation_update_event = ActivationUpdateEvent(m_is_active);
|
||||
on_mouse_button(event);
|
||||
if (!m_current_geometry.contains_point(event.get_point())) {
|
||||
event.accept();
|
||||
return;
|
||||
}
|
||||
|
||||
m_is_active = update_activation_to;
|
||||
auto activation_update_event = ActivationUpdateEvent(update_activation_to);
|
||||
on_activation_update(activation_update_event);
|
||||
|
||||
on_mouse_button(event);
|
||||
|
||||
if (m_consumes_hits)
|
||||
event.accept();
|
||||
}
|
||||
|
|
|
@ -24,7 +24,7 @@ private:
|
|||
std::vector<Widget*> m_children;
|
||||
Widget *m_parent { nullptr };
|
||||
Window *m_window { nullptr };
|
||||
std::shared_ptr<TopLevelStyles> m_top_level_styles = nullptr;
|
||||
std::shared_ptr<TopLevelStyles> m_styles = nullptr;
|
||||
bool m_did_init { false };
|
||||
bool m_is_focused { false };
|
||||
bool m_is_active { false };
|
||||
|
@ -45,8 +45,8 @@ public:
|
|||
Window *get_window() { return m_window; }
|
||||
void set_window(Window *window);
|
||||
|
||||
std::shared_ptr<TopLevelStyles> get_top_level_styles() { return m_top_level_styles; }
|
||||
void set_top_level_styles(std::shared_ptr<TopLevelStyles> top_level_styles) { m_top_level_styles = top_level_styles; }
|
||||
std::shared_ptr<TopLevelStyles> get_styles() { return m_styles; }
|
||||
void set__styles(std::shared_ptr<TopLevelStyles> styles) { m_styles = styles; wants_repaint(); }
|
||||
|
||||
void set_did_init(bool did_init) { m_did_init = did_init; }
|
||||
bool get_did_init() { return m_did_init; }
|
||||
|
|
|
@ -112,6 +112,18 @@ void Window::run(bool block) {
|
|||
}
|
||||
break;
|
||||
}
|
||||
case ButtonRelease: {
|
||||
auto point = Point(e.xbutton.x, e.xbutton.y);
|
||||
auto event = MouseButtonEvent(false, false, std::move(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, std::move(point));
|
||||
dispatch_to_main_widget(event);
|
||||
break;
|
||||
}
|
||||
case MotionNotify: {
|
||||
auto point = Point(e.xmotion.x, e.xmotion.y);
|
||||
auto event = MouseMoveEvent(std::move(point));
|
||||
|
|
Loading…
Reference in a new issue