QtNovelUI/WordsIDE/tools.h

133 lines
4.5 KiB
C
Raw Normal View History

2022-11-29 03:47:12 +00:00
#ifndef COMNTOOLS_H
#define COMNTOOLS_H
#include "opstream.h"
#include <QStandardItemModel>
#include <functional>
namespace Tools {
2023-03-11 04:48:34 +00:00
class Run {
public:
Run(bool manual_flag, std::function<bool()> judge,
std::function<void(bool)> execution);
2022-12-01 13:54:04 +00:00
void exec();
2023-03-11 04:48:34 +00:00
private:
2022-12-01 13:54:04 +00:00
bool manual;
std::function<bool()> judgement;
std::function<void(bool)> execution;
};
2023-03-11 04:48:34 +00:00
class StatusSyncCore : public QObject {
public:
2022-12-01 13:54:04 +00:00
explicit StatusSyncCore(QObject *p = nullptr);
virtual ~StatusSyncCore() = default;
2023-03-11 04:48:34 +00:00
void widgetSync(QWidget *tar, std::function<bool()> proc);
void actionSync(QAction *tar, std::function<bool()> proc);
void registerAutoRun(std::function<bool()> judge,
std::function<void(bool)> exec);
Run *registerManualRun(std::function<bool()> judge,
std::function<void(bool)> exec);
2022-12-01 13:54:04 +00:00
void sync();
2023-03-11 04:48:34 +00:00
private:
QHash<QWidget *, std::function<bool()>> widget_trigger_map;
QHash<QAction *, std::function<bool()>> action_trigger_map;
QList<Run *> alltriggers;
2022-12-01 13:54:04 +00:00
};
2023-03-11 04:48:34 +00:00
template <class BaseType> class TreeSyncs {
public:
TreeSyncs(
QStandardItemModel *model_base,
std::function<bool(const BaseType &n, QStandardItem *p)> _equal,
std::function<void(const BaseType &n, QStandardItem *p)> sync_proc)
: model_present(model_base), sync_process(sync_proc),
compare_process(_equal) {}
void presentSync(
std::function<QList<BaseType>(const BaseType &pnode)> items_peak) {
2022-11-29 03:47:12 +00:00
auto default_pdata = BaseType();
auto datas = items_peak(default_pdata);
2023-03-11 04:48:34 +00:00
Operate::OpStream<QStandardItem *>(
[this](int &cnt, int idx) -> QStandardItem * {
cnt = model_present->rowCount();
if (cnt <= 0)
return nullptr;
return model_present->item(idx);
})
.filter([&datas, this](QStandardItem *const &it) -> bool {
for (auto &d : datas)
if (compare_process(d, it))
return false;
return true;
})
.forEach([this](QStandardItem *const &it) {
model_present->removeRow(it->row());
});
2022-11-29 03:47:12 +00:00
for (auto idx = 0; idx < datas.size(); ++idx) {
if (idx >= model_present->rowCount()) {
auto ins = new QStandardItem();
ins->setEditable(false);
model_present->appendRow(ins);
}
auto &data = datas[idx];
auto item = model_present->item(idx);
sync_process(data, item);
layer_items_sync(data, item, items_peak);
}
}
2023-03-11 04:48:34 +00:00
private:
2022-11-29 03:47:12 +00:00
QStandardItemModel *model_present;
std::function<void(const BaseType &n, QStandardItem *p)> sync_process;
2023-03-11 04:48:34 +00:00
std::function<bool(const BaseType &n, QStandardItem *p)>
compare_process;
2022-11-29 03:47:12 +00:00
2023-03-11 04:48:34 +00:00
void layer_items_sync(
const BaseType &data, QStandardItem *pnode,
std::function<QList<BaseType>(const BaseType &pnode)> items_peak) {
2022-11-29 03:47:12 +00:00
auto datas = items_peak(data);
2023-03-11 04:48:34 +00:00
Operate::OpStream<QStandardItem *>(
[pnode](int &cnt, int idx) -> QStandardItem * {
cnt = pnode->rowCount();
return pnode->child(idx);
})
.filter([&datas, this](QStandardItem *const &it) -> bool {
for (auto &d : datas)
if (compare_process(d, it))
return false;
return true;
})
.forEach([pnode](QStandardItem *const &it) {
pnode->removeRow(it->row());
});
2022-11-29 03:47:12 +00:00
for (auto idx = 0; idx < datas.size(); ++idx) {
if (idx >= pnode->rowCount()) {
auto ins = new QStandardItem();
ins->setEditable(false);
pnode->appendRow(ins);
}
auto &data = datas[idx];
auto item = pnode->child(idx);
sync_process(data, item);
layer_items_sync(data, item, items_peak);
}
}
};
2023-03-11 04:48:34 +00:00
} // namespace Tools
2022-11-29 03:47:12 +00:00
#endif // COMNTOOLS_H