82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
#pragma once
|
|
#include <QAction>
|
|
#include "Background.h"
|
|
#include "Content.h"
|
|
// #define SETTER3(class_name, Type, prop, value) \
|
|
// Type prop;
|
|
//
|
|
// #define SETTER2(class_name, Type, prop) \
|
|
// class_name& set_##prop(const Type& prop) { this->##prop = prop; return *this;} \
|
|
// Type prop;
|
|
//
|
|
// #define SETTER(Type, prop, value) \
|
|
// auto& set_##prop(const Type& prop) { this->##prop = prop; return *this;} \
|
|
// Type prop = value;
|
|
struct Button : Base {
|
|
Q_OBJECT
|
|
public:
|
|
Background background;
|
|
Content content;
|
|
Button() {
|
|
paintAbles.push_back(&background);
|
|
paintAbles.push_back(&content);
|
|
}
|
|
[[nodiscard]] QSize sizeHint() const override {
|
|
auto ret = content.sizeHint();
|
|
if (background.border) {
|
|
int a = background.border->len * 2;
|
|
ret += QSize(a, a);
|
|
}
|
|
return ret;
|
|
}
|
|
};
|
|
inline Button* create_icon(const QString& path, const QColor& background, const Handle_Mouse& f) {
|
|
auto ret = new Button();
|
|
ret->content.set_icon(path, QColor(Qt::color0));
|
|
ret->background.set_color(background);
|
|
ret->background.mouse_handlers.push_back(f);
|
|
return ret;
|
|
};
|
|
struct Switch_Button : Base {
|
|
Q_OBJECT
|
|
public:
|
|
Background background;
|
|
Content content1;
|
|
Content content2;
|
|
Switch_Button() {
|
|
paintAbles.push_back(&background);
|
|
paintAbles.push_back(&content1);
|
|
paintAbles.push_back(&content2);
|
|
content1.show = true;
|
|
content2.show = false;
|
|
}
|
|
[[nodiscard]] QSize sizeHint() const override {
|
|
auto ret = content1.show ? content1.sizeHint() : content2.sizeHint();
|
|
if (background.border) {
|
|
int a = background.border->len * 2;
|
|
ret += QSize(a, a);
|
|
}
|
|
return ret;
|
|
}
|
|
};
|
|
inline Switch_Button* create_switch_icon(const QColor& background, const QString& path, const Handle_Mouse& f,
|
|
const QString& path2, const Handle_Mouse& f2) {
|
|
auto ret = new Switch_Button();
|
|
ret->content1.set_icon(path, QColor(Qt::color0));
|
|
ret->content2.set_icon(path2, QColor(Qt::color0));
|
|
ret->background.set_color(background);
|
|
ret->background.mouse_handlers.push_back([ret, f, f2](QEvent::Type t, QMouseEvent* e) {
|
|
if (t == QEvent::MouseButtonPress) {
|
|
if (ret->content1.show) {
|
|
f(t, e);
|
|
}
|
|
else {
|
|
f2(t, e);
|
|
}
|
|
std::swap(ret->content1.show, ret->content2.show);
|
|
ret->update();
|
|
}
|
|
});
|
|
return ret;
|
|
}
|