diff --git a/WordsIDE/appcore.cpp b/WordsIDE/appcore.cpp index ac015e9..2227ff3 100644 --- a/WordsIDE/appcore.cpp +++ b/WordsIDE/appcore.cpp @@ -18,10 +18,11 @@ using namespace Components; using namespace Parse::Result; using namespace MakeTools; -AppCore::AppCore(MainWindow *win, bool record, QObject *parent) - : QObject(parent), disp_core(new Schedule::CommandsDispatcher(QDir::home(), record)), - views_holder(win), global_config(new Config::XMLConfig(this)), - makes_core(new StoryTool())//, docs_manager(new DocsManager(makes_core, this, win)) +AppCore::AppCore(MainWindow *win, QObject *parent) + : QObject(parent), views_holder(win), + global_config(new Config::XMLConfig(this)), + makes_core(new StoryTool()) //, docs_manager(new DocsManager(makes_core, + // this, win)) { global_config->loadFile(QDir(QApplication::applicationDirPath()).filePath(".software.xml")); @@ -39,7 +40,6 @@ AppCore::AppCore(MainWindow *win, bool record, QObject *parent) present_types << ins0 << ins1 << ins2 << ins3 << ins4 << new DefaultTextPresent(); - } void AppCore::registerHighlightType(Enhancement::HighlightFeature *base_type) diff --git a/WordsIDE/appcore.h b/WordsIDE/appcore.h index e0ebfe6..8286b91 100644 --- a/WordsIDE/appcore.h +++ b/WordsIDE/appcore.h @@ -48,10 +48,8 @@ namespace Core { */ class AppCore : public QObject, public Schedule::AccessibleObject { - public: - Schedule::CommandsDispatcher *const disp_core; - - AppCore(MainWindow *win, bool record, QObject *parent = nullptr); + public: + AppCore(MainWindow *win, QObject *parent = nullptr); virtual ~AppCore() = default; void registerHighlightType(Enhancement::HighlightFeature *base_type); diff --git a/WordsIDE/command_list.cpp b/WordsIDE/command_list.cpp index ced85de..f5d75dd 100644 --- a/WordsIDE/command_list.cpp +++ b/WordsIDE/command_list.cpp @@ -382,3 +382,24 @@ QString StoryconceptJumpTo::toText() const { return navi_path.join("/"); } void StoryconceptJumpTo::fromText(const QString &line) { navi_path = line.split("/"); } + +StoryfragmentJumpTo::StoryfragmentJumpTo(const QList &path) { + navi_path.append(path); +} + +QString StoryfragmentJumpTo::name() const { return NAME(StoryfragmentJumpTo); } + +void StoryfragmentJumpTo::run(Schedule::CommandsDispatcher *core) const { + auto core_ins = core->get(NAME(AppCore)); + + auto unit_ins = core_ins->parseCore()->queryStoryUnit(navi_path[0]).first(); + auto unit_doc = unit_ins->doc(); + + auto vmgr = + core_ins->disp_core->get(NAME(DocumentsManager)); + + auto index = vmgr->projectManager()->queryIndex(unit_doc->filePath()); + auto route = vmgr->converter(index); + vmgr->openFile(route); + vmgr->activePresentOf(route)->jumpTo(navi_path); +} diff --git a/WordsIDE/command_list.h b/WordsIDE/command_list.h index 9ab6bd1..d58e114 100644 --- a/WordsIDE/command_list.h +++ b/WordsIDE/command_list.h @@ -210,6 +210,21 @@ namespace CommandList { QList navi_path; }; + class StoryfragmentJumpTo : public Schedule::GeCommand { + public: + StoryfragmentJumpTo(const QList &path); + + // GeCommand interface + public: + virtual QString name() const override; + virtual void run(Schedule::CommandsDispatcher *core) const override; + virtual QString toText() const override; + virtual void fromText(const QString &line) override; + + private: + QList navi_path; + }; + } // namespace CommandList #endif // COMMAND_LIST_H diff --git a/WordsIDE/fragmentsorderview.cpp b/WordsIDE/fragmentsorderview.cpp index 7ee4e09..a69e91a 100644 --- a/WordsIDE/fragmentsorderview.cpp +++ b/WordsIDE/fragmentsorderview.cpp @@ -1,87 +1,75 @@ #include "fragmentsorderview.h" #include "DocsManager.h" +#include "command_list.h" #include "manager_docs.h" -#include -#include #include +#include +#include using namespace Components; using namespace Parse; -FragmentsOrderView::FragmentsOrderView(Core::AppCore *core, QWidget *parent) - : QWidget(parent), core_ins(core), table_view(new QTableView(this)), - table_base(new QStandardItemModel(this)) -{ - this->table_view->setModel(table_base); - table_base->setHorizontalHeaderLabels(QStringList() << "情节名称" << "单元名称" << "索引值"); +FragmentsOrderView::FragmentsOrderView(Schedule::CommandsDispatcher *core, + QWidget *parent) + : QWidget(parent), core_ins(core), table_view(new QTableView(this)) { + auto backend = + core->get(NAME(FragmentsOrderviewModel)); + + this->table_view->setModel(backend->tableModel()); auto layout = new QVBoxLayout(this); layout->addWidget(table_view); connect(this->table_view, &QTableView::doubleClicked, this, &FragmentsOrderView::double_click); } -void FragmentsOrderView::refresh() -{ - table_base->clear(); - table_base->setHorizontalHeaderLabels(QStringList() << "情节名称" << "单元名称" << "索引值"); - - auto node_list = core_ins->parseCore()->queryOrdersFragment(); - - for(auto &ins : node_list){ - QList row; - row << new QStandardItem(ins.first->name()[0]); - row << new QStandardItem(ins.first->name()[1]); - row << new QStandardItem(QString("%1").arg(ins.second, 8, 'f')); - - for(auto &i : row) i->setEditable(false); - - table_base->appendRow(row); - } -} - +using namespace CommandList; void FragmentsOrderView::double_click(const QModelIndex &index) { if(!index.isValid()) return; - auto frag = table_base->item(index.row()); - auto unit = table_base->item(index.row(), 1); - QList path; - path << unit->text() << frag->text(); + path << index.sibling(index.row(), 0).data().toString(); + path << index.sibling(index.row(), 1).data().toString(); + core_ins->postCommand(StoryfragmentJumpTo(path)); +} - auto unit_ins = this->core_ins->parseCore()->queryStoryUnit(path[0]).first(); - auto unit_doc = unit_ins->doc(); +QString FragmentsOrderView::name() const { return NAME(FragmentsOrderView); } - auto vmgr = this->core_ins->disp_core->get(NAME(DocumentsManager)); - index = vmgr->converter(QFileInfo()) +FragmentsOrderviewModel::FragmentsOrderviewModel(Core::AppCore *core) + : core_ins(core), table_base(new QStandardItemModel) { - this->core_ins->getDocsManager()->openTextDocument(unit_doc->filePath(), unit_doc->docName()); - auto present = this->core_ins->getDocsManager()->queryTextComponent(QFileInfo(unit_doc->filePath())); + table_base->setHorizontalHeaderLabels(QStringList() << "情节名称" + << "单元名称" + << "索引值"); +} - if(path.size()){ - present->jumpTo(path); +void FragmentsOrderviewModel::refreshTable() { + table_base->clear(); + table_base->setHorizontalHeaderLabels(QStringList() << "情节名称" + << "单元名称" + << "索引值"); + + auto node_list = core_ins->parseCore()->queryOrdersFragment(); + + for (auto &ins : node_list) { + QList row; + row << new QStandardItem(ins.first->name()[0]); + row << new QStandardItem(ins.first->name()[1]); + row << new QStandardItem(QString("%1").arg(ins.second, 8, 'f')); + + for (auto &i : row) + i->setEditable(false); + + table_base->appendRow(row); } } -QString FragmentsOrderView::name() const -{ - return NAME(FragmentsOrderView); +QStandardItemModel *FragmentsOrderviewModel::tableModel() const { + return table_base; } - - - - - - - - - - - - - - - +QString FragmentsOrderviewModel::name() const { + return NAME(FragmentsOrderviewModel); +} diff --git a/WordsIDE/fragmentsorderview.h b/WordsIDE/fragmentsorderview.h index 53bd590..5a6aae1 100644 --- a/WordsIDE/fragmentsorderview.h +++ b/WordsIDE/fragmentsorderview.h @@ -10,27 +10,40 @@ namespace Components { + class FragmentsOrderviewModel : public Schedule::AccessibleObject { + public: + FragmentsOrderviewModel(Core::AppCore *core); + + void refreshTable(); + + QStandardItemModel *tableModel() const; + + private: + Core::AppCore *const core_ins; + QStandardItemModel *const table_base; + + // AccessibleObject interface + public: + virtual QString name() const override; + }; + class FragmentsOrderView : public QWidget, public Schedule::AccessibleObject { Q_OBJECT - public: - explicit FragmentsOrderView(Core::AppCore *core, QWidget *parent = nullptr); - - void refresh(); + public: + explicit FragmentsOrderView(Schedule::CommandsDispatcher *core, + QWidget *parent = nullptr); void double_click(const QModelIndex &index); - private: - Core::AppCore *const core_ins; + private: + Schedule::CommandsDispatcher *const core_ins; QTableView *const table_view; - QStandardItemModel *const table_base; - // AccessibleObject interface - public: + public: virtual QString name() const override; }; -} - +} // namespace Components #endif // FRAGMENTSORDERVIEW_H diff --git a/WordsIDE/storyconceptspresent.cpp b/WordsIDE/storyconceptspresent.cpp index 8fbe3ee..b42e560 100644 --- a/WordsIDE/storyconceptspresent.cpp +++ b/WordsIDE/storyconceptspresent.cpp @@ -74,6 +74,10 @@ void StoryconceptsPresent::jump_to(const QModelIndex &curr) { core_ins->postCommand(StoryconceptJumpTo(path)); } +QString StoryconceptsPresent::name() const { + return NAME(StoryconceptsPresent); +} + StoryconceptsPresentModel::StoryconceptsPresentModel(Core::AppCore *core) : core_ins(core), model_base(new QStandardItemModel), detail_backend(new QTextDocument) { diff --git a/WordsIDE/storyconceptspresent.h b/WordsIDE/storyconceptspresent.h index dea77c9..8692019 100644 --- a/WordsIDE/storyconceptspresent.h +++ b/WordsIDE/storyconceptspresent.h @@ -46,6 +46,10 @@ namespace Components { void show_details(const QModelIndex &curr); void jump_to(const QModelIndex &curr); + + // AccessibleObject interface + public: + virtual QString name() const override; }; }