2018-10-10 16:12:38 +03:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include "Event.h"
|
|
|
|
#include "Object.h"
|
2019-01-20 01:49:56 +03:00
|
|
|
#include <SharedGraphics/Rect.h>
|
|
|
|
#include <SharedGraphics/Color.h>
|
|
|
|
#include <SharedGraphics/Font.h>
|
2018-12-21 04:18:16 +03:00
|
|
|
#include <AK/AKString.h>
|
2018-10-10 16:12:38 +03:00
|
|
|
|
2019-01-09 04:06:04 +03:00
|
|
|
class GraphicsBitmap;
|
2018-10-12 02:03:22 +03:00
|
|
|
class Window;
|
|
|
|
|
2018-10-10 16:12:38 +03:00
|
|
|
class Widget : public Object {
|
|
|
|
public:
|
|
|
|
explicit Widget(Widget* parent = nullptr);
|
|
|
|
virtual ~Widget();
|
|
|
|
|
2019-01-09 04:06:04 +03:00
|
|
|
virtual void event(Event&) override;
|
2018-10-13 23:51:50 +03:00
|
|
|
virtual void paintEvent(PaintEvent&);
|
|
|
|
virtual void showEvent(ShowEvent&);
|
|
|
|
virtual void hideEvent(HideEvent&);
|
|
|
|
virtual void keyDownEvent(KeyEvent&);
|
|
|
|
virtual void keyUpEvent(KeyEvent&);
|
|
|
|
virtual void mouseMoveEvent(MouseEvent&);
|
|
|
|
virtual void mouseDownEvent(MouseEvent&);
|
|
|
|
virtual void mouseUpEvent(MouseEvent&);
|
2018-10-10 16:12:38 +03:00
|
|
|
|
2018-10-12 15:15:14 +03:00
|
|
|
Rect relativeRect() const { return m_relativeRect; }
|
|
|
|
Point relativePosition() const { return m_relativeRect.location(); }
|
2018-10-12 11:06:50 +03:00
|
|
|
|
2018-10-12 15:15:14 +03:00
|
|
|
int x() const { return m_relativeRect.x(); }
|
|
|
|
int y() const { return m_relativeRect.y(); }
|
|
|
|
int width() const { return m_relativeRect.width(); }
|
|
|
|
int height() const { return m_relativeRect.height(); }
|
|
|
|
|
|
|
|
Rect rect() const { return { 0, 0, width(), height() }; }
|
2019-01-09 06:46:16 +03:00
|
|
|
Size size() const { return m_relativeRect.size(); }
|
2018-10-10 17:49:36 +03:00
|
|
|
|
2018-10-10 16:12:38 +03:00
|
|
|
void update();
|
2018-10-12 20:39:48 +03:00
|
|
|
void repaint(const Rect&);
|
2018-10-10 16:12:38 +03:00
|
|
|
|
2018-10-13 18:52:47 +03:00
|
|
|
bool isFocused() const;
|
|
|
|
void setFocus(bool);
|
|
|
|
|
2018-10-10 17:49:36 +03:00
|
|
|
struct HitTestResult {
|
|
|
|
Widget* widget { nullptr };
|
|
|
|
int localX { 0 };
|
|
|
|
int localY { 0 };
|
|
|
|
};
|
|
|
|
HitTestResult hitTest(int x, int y);
|
|
|
|
|
2018-11-15 17:36:35 +03:00
|
|
|
virtual const char* class_name() const override { return "Widget"; }
|
2018-10-10 17:49:36 +03:00
|
|
|
|
2019-01-09 06:46:16 +03:00
|
|
|
void setWindowRelativeRect(const Rect&, bool should_update = true);
|
2018-10-10 17:49:36 +03:00
|
|
|
|
2018-10-11 02:48:09 +03:00
|
|
|
Color backgroundColor() const { return m_backgroundColor; }
|
|
|
|
Color foregroundColor() const { return m_foregroundColor; }
|
|
|
|
|
|
|
|
void setBackgroundColor(Color color) { m_backgroundColor = color; }
|
|
|
|
void setForegroundColor(Color color) { m_foregroundColor = color; }
|
|
|
|
|
2018-10-12 02:03:22 +03:00
|
|
|
Window* window()
|
|
|
|
{
|
|
|
|
if (auto* pw = parentWidget())
|
|
|
|
return pw->window();
|
|
|
|
return m_window;
|
|
|
|
}
|
|
|
|
|
|
|
|
const Window* window() const
|
|
|
|
{
|
|
|
|
if (auto* pw = parentWidget())
|
|
|
|
return pw->window();
|
|
|
|
return m_window;
|
|
|
|
}
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-12 03:41:27 +03:00
|
|
|
void setWindow(Window*);
|
|
|
|
|
2018-10-12 02:03:22 +03:00
|
|
|
Widget* parentWidget() { return static_cast<Widget*>(parent()); }
|
|
|
|
const Widget* parentWidget() const { return static_cast<const Widget*>(parent()); }
|
2018-10-11 17:52:40 +03:00
|
|
|
|
2018-10-14 01:21:42 +03:00
|
|
|
void setFillWithBackgroundColor(bool b) { m_fillWithBackgroundColor = b; }
|
|
|
|
bool fillWithBackgroundColor() const { return m_fillWithBackgroundColor; }
|
|
|
|
|
2018-10-14 14:06:05 +03:00
|
|
|
const Font& font() const { return *m_font; }
|
|
|
|
void setFont(RetainPtr<Font>&&);
|
|
|
|
|
2019-01-09 04:06:04 +03:00
|
|
|
virtual GraphicsBitmap* backing();
|
|
|
|
|
2018-10-10 16:12:38 +03:00
|
|
|
private:
|
2018-10-12 02:03:22 +03:00
|
|
|
Window* m_window { nullptr };
|
|
|
|
|
2018-10-12 15:15:14 +03:00
|
|
|
Rect m_relativeRect;
|
2019-01-13 08:25:30 +03:00
|
|
|
Color m_backgroundColor { 0xffffff };
|
|
|
|
Color m_foregroundColor { 0x000000 };
|
2018-10-14 14:06:05 +03:00
|
|
|
RetainPtr<Font> m_font;
|
2018-10-11 13:33:03 +03:00
|
|
|
|
|
|
|
bool m_hasPendingPaintEvent { false };
|
2019-01-13 08:25:30 +03:00
|
|
|
bool m_fillWithBackgroundColor { true };
|
2018-10-10 16:12:38 +03:00
|
|
|
};
|