libui: Handle other mouse events
This commit is contained in:
parent
35c7011997
commit
d6f63c0a5d
@ -4,11 +4,28 @@
|
|||||||
struct ColorWidget : public ui::Widget
|
struct ColorWidget : public ui::Widget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ColorWidget(ui::Color color) : m_color(color)
|
ColorWidget(ui::Color first, ui::Color second) : m_color(first), m_first_color(first), m_second_color(second)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<ui::EventResult> handle_mousemove(ui::Point) override
|
Result<ui::EventResult> handle_mouse_move(ui::Point) override
|
||||||
|
{
|
||||||
|
m_color = m_second_color;
|
||||||
|
return ui::EventResult::DidHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<ui::EventResult> handle_mouse_leave(ui::Point) override
|
||||||
|
{
|
||||||
|
m_color = m_first_color;
|
||||||
|
return ui::EventResult::DidHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<ui::EventResult> handle_mouse_down(ui::Point, int) override
|
||||||
|
{
|
||||||
|
return ui::EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<ui::EventResult> handle_mouse_up(ui::Point, int) override
|
||||||
{
|
{
|
||||||
return ui::EventResult::DidNotHandle;
|
return ui::EventResult::DidNotHandle;
|
||||||
}
|
}
|
||||||
@ -21,6 +38,8 @@ struct ColorWidget : public ui::Widget
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
ui::Color m_color;
|
ui::Color m_color;
|
||||||
|
ui::Color m_first_color;
|
||||||
|
ui::Color m_second_color;
|
||||||
};
|
};
|
||||||
|
|
||||||
Result<int> luna_main(int argc, char** argv)
|
Result<int> luna_main(int argc, char** argv)
|
||||||
@ -37,17 +56,17 @@ Result<int> luna_main(int argc, char** argv)
|
|||||||
ui::HorizontalLayout layout;
|
ui::HorizontalLayout layout;
|
||||||
window->set_main_widget(layout);
|
window->set_main_widget(layout);
|
||||||
|
|
||||||
ColorWidget green(ui::GREEN);
|
ColorWidget green(ui::GREEN, ui::WHITE);
|
||||||
layout.add_widget(green);
|
layout.add_widget(green);
|
||||||
ColorWidget blue(ui::BLUE);
|
ColorWidget blue(ui::BLUE, ui::GRAY);
|
||||||
layout.add_widget(blue);
|
layout.add_widget(blue);
|
||||||
|
|
||||||
ui::VerticalLayout sublayout;
|
ui::VerticalLayout sublayout;
|
||||||
layout.add_widget(sublayout);
|
layout.add_widget(sublayout);
|
||||||
|
|
||||||
ColorWidget red(ui::RED);
|
ColorWidget red(ui::RED, ui::CYAN);
|
||||||
sublayout.add_widget(red);
|
sublayout.add_widget(red);
|
||||||
ColorWidget white(ui::WHITE);
|
ColorWidget white(ui::WHITE, ui::GREEN);
|
||||||
sublayout.add_widget(white);
|
sublayout.add_widget(white);
|
||||||
|
|
||||||
window->draw();
|
window->draw();
|
||||||
|
@ -20,7 +20,10 @@ namespace ui
|
|||||||
|
|
||||||
void set_widget(Widget& widget);
|
void set_widget(Widget& widget);
|
||||||
|
|
||||||
Result<EventResult> handle_mousemove(Point position) override;
|
Result<EventResult> handle_mouse_move(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_leave(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_down(Point position, int buttons) override;
|
||||||
|
Result<EventResult> handle_mouse_up(Point position, int buttons) override;
|
||||||
Result<void> draw(Canvas& canvas) override;
|
Result<void> draw(Canvas& canvas) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -84,7 +84,10 @@ namespace ui
|
|||||||
public:
|
public:
|
||||||
static Result<OwnedPtr<ImageWidget>> load(const os::Path& path);
|
static Result<OwnedPtr<ImageWidget>> load(const os::Path& path);
|
||||||
|
|
||||||
Result<EventResult> handle_mousemove(Point position) override;
|
Result<EventResult> handle_mouse_move(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_leave(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_down(Point position, int buttons) override;
|
||||||
|
Result<EventResult> handle_mouse_up(Point position, int buttons) override;
|
||||||
Result<void> draw(Canvas& canvas) override;
|
Result<void> draw(Canvas& canvas) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -30,7 +30,10 @@ namespace ui
|
|||||||
public:
|
public:
|
||||||
HorizontalLayout(AdjustHeight adjust_height = AdjustHeight::Yes, AdjustWidth adjust_width = AdjustWidth::Yes);
|
HorizontalLayout(AdjustHeight adjust_height = AdjustHeight::Yes, AdjustWidth adjust_width = AdjustWidth::Yes);
|
||||||
|
|
||||||
Result<EventResult> handle_mousemove(Point position) override;
|
Result<EventResult> handle_mouse_move(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_leave(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_down(Point position, int buttons) override;
|
||||||
|
Result<EventResult> handle_mouse_up(Point position, int buttons) override;
|
||||||
|
|
||||||
Result<void> draw(Canvas& canvas) override;
|
Result<void> draw(Canvas& canvas) override;
|
||||||
|
|
||||||
@ -48,7 +51,10 @@ namespace ui
|
|||||||
public:
|
public:
|
||||||
VerticalLayout(AdjustHeight adjust_height = AdjustHeight::Yes, AdjustWidth adjust_width = AdjustWidth::Yes);
|
VerticalLayout(AdjustHeight adjust_height = AdjustHeight::Yes, AdjustWidth adjust_width = AdjustWidth::Yes);
|
||||||
|
|
||||||
Result<EventResult> handle_mousemove(Point position) override;
|
Result<EventResult> handle_mouse_move(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_leave(Point position) override;
|
||||||
|
Result<EventResult> handle_mouse_down(Point position, int buttons) override;
|
||||||
|
Result<EventResult> handle_mouse_up(Point position, int buttons) override;
|
||||||
|
|
||||||
Result<void> draw(Canvas& canvas) override;
|
Result<void> draw(Canvas& canvas) override;
|
||||||
|
|
||||||
|
21
libui/include/ui/Mouse.h
Normal file
21
libui/include/ui/Mouse.h
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/**
|
||||||
|
* @file Mouse.h
|
||||||
|
* @author apio (cloudapio.eu)
|
||||||
|
* @brief Mouse buttons.
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2023, the Luna authors.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <moon/Mouse.h>
|
||||||
|
|
||||||
|
namespace ui
|
||||||
|
{
|
||||||
|
enum MouseButtons
|
||||||
|
{
|
||||||
|
LEFT = moon::Left,
|
||||||
|
MIDDLE = moon::Middle,
|
||||||
|
RIGHT = moon::Right,
|
||||||
|
};
|
||||||
|
}
|
@ -26,7 +26,10 @@ namespace ui
|
|||||||
class Widget
|
class Widget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual Result<EventResult> handle_mousemove(Point position);
|
virtual Result<EventResult> handle_mouse_move(Point position);
|
||||||
|
virtual Result<EventResult> handle_mouse_down(Point position, int buttons);
|
||||||
|
virtual Result<EventResult> handle_mouse_up(Point position, int buttons);
|
||||||
|
virtual Result<EventResult> handle_mouse_leave(Point position);
|
||||||
|
|
||||||
virtual Result<void> draw(Canvas& canvas);
|
virtual Result<void> draw(Canvas& canvas);
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#include <luna/OwnedPtr.h>
|
#include <luna/OwnedPtr.h>
|
||||||
#include <luna/StringView.h>
|
#include <luna/StringView.h>
|
||||||
#include <ui/Canvas.h>
|
#include <ui/Canvas.h>
|
||||||
|
#include <ui/Mouse.h>
|
||||||
#include <ui/Rect.h>
|
#include <ui/Rect.h>
|
||||||
#include <ui/Widget.h>
|
#include <ui/Widget.h>
|
||||||
|
|
||||||
@ -45,7 +46,8 @@ namespace ui
|
|||||||
void close();
|
void close();
|
||||||
|
|
||||||
Result<void> draw();
|
Result<void> draw();
|
||||||
Result<void> handle_mousemove(ui::Point position);
|
Result<void> handle_mouse_move(ui::Point position);
|
||||||
|
Result<void> handle_mouse_buttons(ui::Point position, int buttons);
|
||||||
|
|
||||||
int id() const
|
int id() const
|
||||||
{
|
{
|
||||||
@ -59,5 +61,6 @@ namespace ui
|
|||||||
Canvas m_canvas;
|
Canvas m_canvas;
|
||||||
Widget* m_main_widget { nullptr };
|
Widget* m_main_widget { nullptr };
|
||||||
Color m_background { ui::BLACK };
|
Color m_background { ui::BLACK };
|
||||||
|
Option<int> m_old_mouse_buttons;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ namespace ui
|
|||||||
MouseEventRequest request;
|
MouseEventRequest request;
|
||||||
TRY(m_client->recv_typed(request));
|
TRY(m_client->recv_typed(request));
|
||||||
auto* window = find_window(request.window);
|
auto* window = find_window(request.window);
|
||||||
window->handle_mousemove(request.position);
|
window->handle_mouse_move(request.position);
|
||||||
window->draw();
|
window->draw();
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,24 @@ namespace ui
|
|||||||
widget.rect() = ui::align(m_rect, widget.rect(), m_valign, m_halign);
|
widget.rect() = ui::align(m_rect, widget.rect(), m_valign, m_halign);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<EventResult> Container::handle_mousemove(Point position)
|
Result<EventResult> Container::handle_mouse_move(Point position)
|
||||||
{
|
{
|
||||||
return m_widget->handle_mousemove(position);
|
return m_widget->handle_mouse_move(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> Container::handle_mouse_leave(Point position)
|
||||||
|
{
|
||||||
|
return m_widget->handle_mouse_leave(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> Container::handle_mouse_down(Point position, int buttons)
|
||||||
|
{
|
||||||
|
return m_widget->handle_mouse_down(position, buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> Container::handle_mouse_up(Point position, int buttons)
|
||||||
|
{
|
||||||
|
return m_widget->handle_mouse_up(position, buttons);
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<void> Container::draw(Canvas& canvas)
|
Result<void> Container::draw(Canvas& canvas)
|
||||||
|
@ -40,7 +40,22 @@ namespace ui
|
|||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<EventResult> ImageWidget::handle_mousemove(Point)
|
Result<EventResult> ImageWidget::handle_mouse_move(Point)
|
||||||
|
{
|
||||||
|
return EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> ImageWidget::handle_mouse_leave(Point)
|
||||||
|
{
|
||||||
|
return EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> ImageWidget::handle_mouse_up(Point, int)
|
||||||
|
{
|
||||||
|
return EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> ImageWidget::handle_mouse_down(Point, int)
|
||||||
{
|
{
|
||||||
return EventResult::DidNotHandle;
|
return EventResult::DidNotHandle;
|
||||||
}
|
}
|
||||||
|
@ -17,11 +17,42 @@ namespace ui
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<EventResult> HorizontalLayout::handle_mousemove(Point position)
|
Result<EventResult> HorizontalLayout::handle_mouse_move(Point position)
|
||||||
|
{
|
||||||
|
EventResult result = ui::EventResult::DidNotHandle;
|
||||||
|
|
||||||
|
for (auto widget : m_widgets)
|
||||||
|
{
|
||||||
|
if (widget->rect().contains(position)) result = TRY(widget->handle_mouse_move(position));
|
||||||
|
else
|
||||||
|
TRY(widget->handle_mouse_leave(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> HorizontalLayout::handle_mouse_leave(Point position)
|
||||||
|
{
|
||||||
|
for (auto widget : m_widgets) TRY(widget->handle_mouse_leave(position));
|
||||||
|
|
||||||
|
return ui::EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> HorizontalLayout::handle_mouse_up(Point position, int buttons)
|
||||||
{
|
{
|
||||||
for (auto widget : m_widgets)
|
for (auto widget : m_widgets)
|
||||||
{
|
{
|
||||||
if (widget->rect().contains(position)) return widget->handle_mousemove(position);
|
if (widget->rect().contains(position)) return widget->handle_mouse_up(position, buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ui::EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> HorizontalLayout::handle_mouse_down(Point position, int buttons)
|
||||||
|
{
|
||||||
|
for (auto widget : m_widgets)
|
||||||
|
{
|
||||||
|
if (widget->rect().contains(position)) return widget->handle_mouse_down(position, buttons);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ui::EventResult::DidNotHandle;
|
return ui::EventResult::DidNotHandle;
|
||||||
@ -75,11 +106,42 @@ namespace ui
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<EventResult> VerticalLayout::handle_mousemove(Point position)
|
Result<EventResult> VerticalLayout::handle_mouse_move(Point position)
|
||||||
|
{
|
||||||
|
EventResult result = ui::EventResult::DidNotHandle;
|
||||||
|
|
||||||
|
for (auto widget : m_widgets)
|
||||||
|
{
|
||||||
|
if (widget->rect().contains(position)) result = TRY(widget->handle_mouse_move(position));
|
||||||
|
else
|
||||||
|
TRY(widget->handle_mouse_leave(position));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> VerticalLayout::handle_mouse_leave(Point position)
|
||||||
|
{
|
||||||
|
for (auto widget : m_widgets) TRY(widget->handle_mouse_leave(position));
|
||||||
|
|
||||||
|
return ui::EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> VerticalLayout::handle_mouse_up(Point position, int buttons)
|
||||||
{
|
{
|
||||||
for (auto widget : m_widgets)
|
for (auto widget : m_widgets)
|
||||||
{
|
{
|
||||||
if (widget->rect().contains(position)) return widget->handle_mousemove(position);
|
if (widget->rect().contains(position)) return widget->handle_mouse_up(position, buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ui::EventResult::DidNotHandle;
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<EventResult> VerticalLayout::handle_mouse_down(Point position, int buttons)
|
||||||
|
{
|
||||||
|
for (auto widget : m_widgets)
|
||||||
|
{
|
||||||
|
if (widget->rect().contains(position)) return widget->handle_mouse_down(position, buttons);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ui::EventResult::DidNotHandle;
|
return ui::EventResult::DidNotHandle;
|
||||||
|
@ -101,9 +101,24 @@ namespace ui
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Result<void> Window::handle_mousemove(ui::Point position)
|
Result<void> Window::handle_mouse_move(ui::Point position)
|
||||||
{
|
{
|
||||||
if (m_main_widget) TRY(m_main_widget->handle_mousemove(position));
|
if (!m_main_widget) return {};
|
||||||
|
TRY(m_main_widget->handle_mouse_move(position));
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
Result<void> Window::handle_mouse_buttons(ui::Point position, int buttons)
|
||||||
|
{
|
||||||
|
if (!m_main_widget) return {};
|
||||||
|
if (buttons) TRY(m_main_widget->handle_mouse_down(position, buttons));
|
||||||
|
if (m_old_mouse_buttons.has_value())
|
||||||
|
{
|
||||||
|
int old_buttons = m_old_mouse_buttons.value();
|
||||||
|
int diff = old_buttons & ~buttons;
|
||||||
|
if (diff) TRY(m_main_widget->handle_mouse_up(position, diff));
|
||||||
|
}
|
||||||
|
m_old_mouse_buttons = buttons;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user