66 lines
2.6 KiB
C++
66 lines
2.6 KiB
C++
#pragma once
|
|
#include "global.h"
|
|
namespace Flex_Qt {
|
|
template <typename T >
|
|
class Roll_Object : QObject {
|
|
public:
|
|
explicit Roll_Object(QObject* parent = nullptr) : QObject(parent) {}
|
|
explicit Roll_Object(std::vector<T*> values, std::function<void(T *)> enter, std::function<void(T *)> leave, QObject* parent) : QObject(parent), widgets(std::move(values)), enter_func(std::move(enter)), leave_func(std::move(leave)) {
|
|
if (enter_func && !widgets.empty())
|
|
enter_func(widgets.front());
|
|
}
|
|
int index = 0;
|
|
std::vector<T*> widgets;
|
|
std::function<void(T *)> enter_func;
|
|
std::function<void(T *)> leave_func;
|
|
T* cur() {
|
|
if (widgets.empty())
|
|
return nullptr;
|
|
return widgets[static_cast<std::size_t>(index)];
|
|
}
|
|
void set_cur(T* value) {
|
|
if (widgets.empty())
|
|
return;
|
|
auto found = std::find(widgets.begin(), widgets.end(), value);
|
|
if (found == widgets.end())
|
|
return;
|
|
if (leave_func)
|
|
leave_func(widgets[static_cast<std::size_t>(index)]);
|
|
index = static_cast<int>(std::distance(widgets.begin(), found));
|
|
if (enter_func)
|
|
enter_func(widgets[static_cast<std::size_t>(index)]);
|
|
widgets[static_cast<std::size_t>(index)]->update();
|
|
}
|
|
void roll_right() {
|
|
if (widgets.empty())
|
|
return;
|
|
if (leave_func)
|
|
leave_func(widgets[static_cast<std::size_t>(index)]);
|
|
widgets[static_cast<std::size_t>(index)]->update();
|
|
index = (index + 1) % static_cast<int>(widgets.size());
|
|
if (enter_func)
|
|
enter_func(widgets[static_cast<std::size_t>(index)]);
|
|
widgets[static_cast<std::size_t>(index)]->update();
|
|
}
|
|
void roll_left() {
|
|
if (widgets.empty())
|
|
return;
|
|
if (leave_func)
|
|
leave_func(widgets[static_cast<std::size_t>(index)]);
|
|
widgets[static_cast<std::size_t>(index)]->update();
|
|
index = index ? index - 1 : static_cast<int>(widgets.size()) - 1;
|
|
if (enter_func)
|
|
enter_func(widgets[static_cast<std::size_t>(index)]);
|
|
widgets[static_cast<std::size_t>(index)]->update();
|
|
}
|
|
QHBoxLayout* hbox_layout(int space) {
|
|
auto ret = new QHBoxLayout;
|
|
ret->setMargin(0);
|
|
ret->setSpacing(space);
|
|
for (T* widget : widgets)
|
|
ret->addWidget(widget, 1);
|
|
return ret;
|
|
}
|
|
};
|
|
} // Flex_Qt
|