#ifndef COMNTOOLS_H #define COMNTOOLS_H #include "opstream.h" #include #include namespace Tools { class Run { public: Run(bool manual_flag, std::function judge, std::function execution); void exec(); private: bool manual; std::function judgement; std::function execution; }; class StatusSyncCore : public QObject { public: explicit StatusSyncCore(QObject *p = nullptr); virtual ~StatusSyncCore() = default; void widgetSync(QWidget* tar, std::function proc); void actionSync(QAction* tar, std::function proc); void registerAutoRun(std::function judge, std::function exec); Run* registerManualRun(std::function judge, std::function exec); void sync(); private: QHash> widget_trigger_map; QHash> action_trigger_map; QList alltriggers; }; template class ModelSyncs { public: ModelSyncs(QStandardItemModel *model_base, std::function _equal, std::function sync_proc) : model_present(model_base), sync_process(sync_proc), compare_process(_equal){} void presentSync(std::function(const BaseType &pnode)> items_peak) { auto default_pdata = BaseType(); auto datas = items_peak(default_pdata); Operate::OpStream([this](int &cnt, int idx)->QStandardItem*{ cnt = model_present->rowCount(); 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()); }); 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); } } private: QStandardItemModel *model_present; std::function sync_process; std::function compare_process; void layer_items_sync(const BaseType &data, QStandardItem *pnode, std::function(const BaseType &pnode)> items_peak){ auto datas = items_peak(data); Operate::OpStream([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()); }); 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); } } }; } #endif // COMNTOOLS_H