openMSX
OSDWidget.hh
Go to the documentation of this file.
1#ifndef OSDWIDGET_HH
2#define OSDWIDGET_HH
3
4#include "TclObject.hh"
5#include "gl_vec.hh"
6#include <array>
7#include <span>
8#include <string_view>
9#include <vector>
10#include <memory>
11
12namespace openmsx {
13
14class Display;
15class OutputSurface;
16class Interpreter;
17
19{
20 using SubWidgets = std::vector<std::unique_ptr<OSDWidget>>;
21
22protected:
23 static constexpr auto widgetProperties = [] {
24 using namespace std::literals;
25 return std::array{
26 "-type"sv, "-x"sv, "-y"sv, "-z"sv, "-relx"sv, "-rely"sv, "-scaled"sv,
27 "-clip"sv, "-mousecoord"sv, "-suppressErrors"sv,
28 };
29 }();
30
31public:
32 virtual ~OSDWidget() = default;
33
34 [[nodiscard]] std::string_view getName() const { return name.getString(); }
35 [[nodiscard]] virtual gl::vec2 getPos() const { return pos; }
36 [[nodiscard]] gl::vec2 getRelPos() const { return relPos; }
37 [[nodiscard]] float getZ() const { return z; }
38
39 [[nodiscard]] OSDWidget* getParent() { return parent; }
40 [[nodiscard]] const OSDWidget* getParent() const { return parent; }
41 [[nodiscard]] const SubWidgets& getChildren() const { return subWidgets; }
42 void addWidget(std::unique_ptr<OSDWidget> widget);
43 void deleteWidget(OSDWidget& widget);
44
45 [[nodiscard]] virtual std::span<const std::string_view> getProperties() const {
46 return widgetProperties;
47 }
48 virtual void setProperty(Interpreter& interp,
49 std::string_view name, const TclObject& value);
50 virtual void getProperty(std::string_view name, TclObject& result) const;
51 [[nodiscard]] virtual float getRecursiveFadeValue() const;
52 [[nodiscard]] virtual bool isRecursiveFading() const = 0;
53 [[nodiscard]] virtual std::string_view getType() const = 0;
54
56 void paintRecursive(OutputSurface& output);
57
58 [[nodiscard]] int getScaleFactor(const OutputSurface& output) const;
59 [[nodiscard]] gl::vec2 transformPos(const OutputSurface& output,
60 gl::vec2 pos, gl::vec2 relPos) const;
61 void getBoundingBox(const OutputSurface& output,
62 gl::vec2& pos, gl::vec2& size) const;
63 [[nodiscard]] virtual gl::vec2 getSize(const OutputSurface& output) const = 0;
64
65 // Is visible? Or may become visible (fading-in).
66 [[nodiscard]] virtual bool isVisible() const = 0;
67
68 [[nodiscard]] Display& getDisplay() const { return display; }
69
70protected:
71 OSDWidget(Display& display, TclObject name);
72 void invalidateChildren();
73 [[nodiscard]] bool needSuppressErrors() const;
74
75 virtual void invalidateLocal() = 0;
76 virtual void paint(OutputSurface& output) = 0;
77
78private:
79 [[nodiscard]] gl::vec2 getMouseCoord() const;
80 [[nodiscard]] gl::vec2 transformReverse(const OutputSurface& output,
81 gl::vec2 pos) const;
82 void setParent(OSDWidget* parent_) { parent = parent_; }
83 void resortUp (OSDWidget* elem);
84 void resortDown(OSDWidget* elem);
85
86private:
89 SubWidgets subWidgets;
90
91 Display& display;
92 OSDWidget* parent = nullptr;
93
94 TclObject name;
95 gl::vec2 pos;
96 gl::vec2 relPos;
97 float z = 0.0f;
98 bool scaled = false;
99 bool clip = false;
100 bool suppressErrors = false;
101};
102
103} // namespace openmsx
104
105#endif
Represents the output window/screen of openMSX.
Definition Display.hh:32
virtual void getProperty(std::string_view name, TclObject &result) const
Definition OSDWidget.cc:210
void addWidget(std::unique_ptr< OSDWidget > widget)
Definition OSDWidget.cc:100
static constexpr auto widgetProperties
Definition OSDWidget.hh:23
void deleteWidget(OSDWidget &widget)
Definition OSDWidget.cc:123
Display & getDisplay() const
Definition OSDWidget.hh:68
int getScaleFactor(const OutputSurface &output) const
Definition OSDWidget.cc:281
void getBoundingBox(const OutputSurface &output, gl::vec2 &pos, gl::vec2 &size) const
Definition OSDWidget.cc:354
gl::vec2 transformPos(const OutputSurface &output, gl::vec2 pos, gl::vec2 relPos) const
Definition OSDWidget.cc:292
const SubWidgets & getChildren() const
Definition OSDWidget.hh:41
virtual bool isVisible() const =0
virtual float getRecursiveFadeValue() const
Definition OSDWidget.cc:238
virtual void paint(OutputSurface &output)=0
virtual std::string_view getType() const =0
gl::vec2 getRelPos() const
Definition OSDWidget.hh:36
virtual ~OSDWidget()=default
virtual std::span< const std::string_view > getProperties() const
Definition OSDWidget.hh:45
std::string_view getName() const
Definition OSDWidget.hh:34
virtual gl::vec2 getSize(const OutputSurface &output) const =0
void paintRecursive(OutputSurface &output)
Definition OSDWidget.cc:265
bool needSuppressErrors() const
Definition OSDWidget.cc:256
const OSDWidget * getParent() const
Definition OSDWidget.hh:40
OSDWidget * getParent()
Definition OSDWidget.hh:39
virtual void setProperty(Interpreter &interp, std::string_view name, const TclObject &value)
Definition OSDWidget.cc:166
virtual void invalidateLocal()=0
void invalidateRecursive()
Definition OSDWidget.cc:243
void invalidateChildren()
Definition OSDWidget.cc:249
virtual bool isRecursiveFading() const =0
virtual gl::vec2 getPos() const
Definition OSDWidget.hh:35
float getZ() const
Definition OSDWidget.hh:37
A frame buffer where pixels can be written to.
zstring_view getString() const
Definition TclObject.cc:142
This file implemented 3 utility functions:
Definition Autofire.cc:9