diff --git a/QtNovelDesc.pro b/QtNovelDesc.pro index cb79ad9..ecb9006 100644 --- a/QtNovelDesc.pro +++ b/QtNovelDesc.pro @@ -6,5 +6,5 @@ SUBDIRS += \ WordsIDE \ libConfig \ libProjectManager \ - libTextEdit \ + # libTextEdit \ u_test diff --git a/QtNovelDesc.pro.user b/QtNovelDesc.pro.user index 8c98337..9f739d4 100644 --- a/QtNovelDesc.pro.user +++ b/QtNovelDesc.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/WordsIDE/command_list.cpp b/WordsIDE/command_list.cpp index 8bbc9b0..c8b3319 100644 --- a/WordsIDE/command_list.cpp +++ b/WordsIDE/command_list.cpp @@ -24,10 +24,7 @@ void NewProject::fromText(const QString &line) { name_val = list[1]; } -NewPackage::NewPackage(const QString &path_string) -{ - sequence = path_string.split("/"); -} +NewPackage::NewPackage(const QString &path_string) { sequence = path_string.split("/", QString::SplitBehavior::SkipEmptyParts); } QString NewPackage::name() const { @@ -188,3 +185,23 @@ void CloseProject::run(Schedule::CommandsDispatcher *core) const { QString CloseProject::toText() const { return ""; } void CloseProject::fromText(const QString &line) {} + +DeleteTarget::DeleteTarget(const Core::Route &target) : node_path(target) {} + +DeleteTarget::DeleteTarget(const QModelIndex &target) : node_index(target) {} + +QString DeleteTarget::name() const { return NAME(DeleteTarget); } + +void DeleteTarget::run(Schedule::CommandsDispatcher *core) const { + auto vmgr = core->get(NAME(DocumentsManager)); + if (!node_index.isValid()) + vmgr->deleteNode(node_path); + else { + auto node_path = vmgr->convertPath(node_index); + vmgr->deleteNode(node_path); + } +} + +QString DeleteTarget::toText() const { return node_path.links().join("/"); } + +void DeleteTarget::fromText(const QString &line) { Route::collect(line.split("/", QString::SplitBehavior::SkipEmptyParts)); } diff --git a/WordsIDE/command_list.h b/WordsIDE/command_list.h index 38238ee..05576f3 100644 --- a/WordsIDE/command_list.h +++ b/WordsIDE/command_list.h @@ -3,6 +3,7 @@ #include "route.h" +#include #include namespace Presents { @@ -85,8 +86,26 @@ namespace CommandList { virtual QString toText() const override; virtual void fromText(const QString &line) override; }; + + class DeleteTarget : public Schedule::GeCommand { + public: + DeleteTarget(const Core::Route &target); + DeleteTarget(const QModelIndex &target); + + // 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: + QModelIndex node_index = QModelIndex(); + Core::Route node_path; + }; + class OpenFile : public Schedule::GeCommand { - public: + public: OpenFile(const Core::Route &path_node); OpenFile(const QFileInfo &f); diff --git a/WordsIDE/manager_docs.cpp b/WordsIDE/manager_docs.cpp index 9871dd1..8710024 100644 --- a/WordsIDE/manager_docs.cpp +++ b/WordsIDE/manager_docs.cpp @@ -97,9 +97,14 @@ void DocumentsManager::openFile(const QList &doc_paths) { view->load(info); view->applySetting(it.links().last()); - for (auto con : present_ui) - if (con->avaliable(view)) + for (auto &con : present_ui) + if (con->avaliable(view)) { con->append(view); + return; + } + + // 默认第一个打开 + present_ui.first()->append(view); } } @@ -158,7 +163,7 @@ QList DocumentsManager::actives() const { return doc_openning.keys(); } void DocumentsManager::active(const Core::Route &node_path) { if (doc_openning.contains(node_path)) { auto inst = convertPresent(node_path); - for (auto vit : present_ui) + for (auto &vit : present_ui) if (vit->contains(inst)) vit->active(inst); } diff --git a/WordsIDE/presentcontainerview.cpp b/WordsIDE/presentcontainerview.cpp index 4455eda..7d8ed95 100644 --- a/WordsIDE/presentcontainerview.cpp +++ b/WordsIDE/presentcontainerview.cpp @@ -26,9 +26,11 @@ PresentContainerView::PresentContainerView(ViewPresent *host) layout->addWidget(title_store, 0, 0, 1, 3); layout->addWidget(close_btn, 0, 3); close_btn->setMaximumSize(QSize(30, 30)); + close_btn->setEnabled(false); items_store << welcome_list; stack_container->addWidget(welcome_list->widget()); + layout->addWidget(stack_container, 1, 0, 1, 4); title_store->addItem(welcome_list->name()); layout->setRowStretch(0, 0); @@ -51,12 +53,15 @@ void PresentContainerView::append(FilePresent *ins) { if (!items_store.contains(ins)) { items_store.append(ins); title_store->addItem(ins->name()); + ins->widget()->setParent(nullptr); stack_container->addWidget(ins->widget()); - } - throw new SimpleException("非法操作", "重复添加视图:" + ins->name()); + active(ins); + } else + throw new SimpleException("非法操作", "重复添加视图:" + ins->name()); } +#include bool PresentContainerView::active(const FilePresent *ins) { if (!items_store.contains(ins)) return false; @@ -87,9 +92,10 @@ bool PresentContainerView::contains(const FilePresent *ins) const { } bool PresentContainerView::avaliable(FilePresent *vins) { - if (!QApplication::activeWindow()) + auto global_test = QApplication::activeWindow(); + if (!global_test) return true; - return this->hasFocus(); + return this->isActiveWindow(); } void PresentContainerView::change_view(int view_index) { diff --git a/WordsIDE/presentcontainerview.h b/WordsIDE/presentcontainerview.h index 12e51e1..df95b7b 100644 --- a/WordsIDE/presentcontainerview.h +++ b/WordsIDE/presentcontainerview.h @@ -3,6 +3,7 @@ #include "manager_docs.h" #include +#include #include #include diff --git a/WordsIDE/projectview.cpp b/WordsIDE/projectview.cpp index 9c5a0d7..1e93254 100644 --- a/WordsIDE/projectview.cpp +++ b/WordsIDE/projectview.cpp @@ -55,7 +55,7 @@ void ProjectView::menu_popup(const QPoint &p) } m.addSeparator(); - m.addAction("移除节点"); + m.addAction("移除节点", [&index, this]() { source->postCommand(DeleteTarget(index)); }); } diff --git a/WordsIDE/srcedit_storyboard.cpp b/WordsIDE/srcedit_storyboard.cpp index 32dacee..7c3d3ce 100644 --- a/WordsIDE/srcedit_storyboard.cpp +++ b/WordsIDE/srcedit_storyboard.cpp @@ -15,7 +15,6 @@ QString StorySourceEdit::file_suffix = "storyboard"; StorySourceEdit::StorySourceEdit(DocumentsManager *mgr, const Route &p, QObject *parent) : FilePresent(parent), mgr_inst(mgr), path_store(p), edit_square(new QTextEdit) { - // words_highlighter->setDocument(this->edit_square->document()); connect(edit_square, &QTextEdit::textChanged, [this](){ emit this->dataChanged(filepath_store); }); diff --git a/WordsIDE/welcomepanel.cpp b/WordsIDE/welcomepanel.cpp index 7ce03f7..625e9ea 100644 --- a/WordsIDE/welcomepanel.cpp +++ b/WordsIDE/welcomepanel.cpp @@ -1,10 +1,17 @@ #include "welcomepanel.h" +#include + using namespace Core; using namespace Presents; WelcomePanel::WelcomePanel(QWidget *parent) : QWidget(parent) {} +void WelcomePanel::paintEvent(QPaintEvent *event) { + QPainter p(this); + p.fillRect(this->rect(), Qt::green); +} + QWidget *WelcomePanel::widget() const { return (QWidget *)this; } QString WelcomePanel::name() const { return "WelcomePanel"; } diff --git a/WordsIDE/welcomepanel.h b/WordsIDE/welcomepanel.h index 7effd74..32eadb9 100644 --- a/WordsIDE/welcomepanel.h +++ b/WordsIDE/welcomepanel.h @@ -11,6 +11,9 @@ namespace Presents { public: WelcomePanel(QWidget *parent = nullptr); + protected: + virtual void paintEvent(QPaintEvent *event) override; + // FilePresent interface public: virtual QWidget *widget() const override; diff --git a/WordsIDE/xapp.cpp b/WordsIDE/xapp.cpp index 47794f7..615838a 100644 --- a/WordsIDE/xapp.cpp +++ b/WordsIDE/xapp.cpp @@ -50,6 +50,7 @@ void XApp::init_commands(Schedule::CommandsDispatcher *host) { host->registerCommand(new OpenFile(Route())); host->registerCommand(new OpenProject("")); host->registerCommand(new SaveAll()); + host->registerCommand(new DeleteTarget(Route())); } CommandsDispatcher *const XApp::disp_core = new CommandsDispatcher(QDir("./"), true); diff --git a/libTextEdit/blockdatas.cpp b/libTextEdit/blockdatas.cpp new file mode 100644 index 0000000..4131340 --- /dev/null +++ b/libTextEdit/blockdatas.cpp @@ -0,0 +1,24 @@ +#include "blockdatas.h" + +using namespace PresentDatas; + +DisplayGroup::DisplayGroup(const QString &uid) : SpecificEntityData(EntityType::DISPLAY_GROUP, uid) {} + +QString DisplayGroup::styledText() const { + QString retvs = QString("\n").arg(this->uID()); + for (auto &i : children()) + retvs += i->styledText(); + + retvs += "\n"; + return retvs; +} + +QString DisplayGroup::plainText() const { + QString retvs = ""; + for (auto &i : children()) + retvs += i->plainText(); + retvs += "\n"; + return retvs; +} + +TextRange::TextRange(const QString &uid) : SpecificEntityData(EntityType::TEXT_RANGE, uid) {} diff --git a/libTextEdit/blockdatas.h b/libTextEdit/blockdatas.h new file mode 100644 index 0000000..100b7a7 --- /dev/null +++ b/libTextEdit/blockdatas.h @@ -0,0 +1,46 @@ +#ifndef BLOCKDATAS_H +#define BLOCKDATAS_H + +#include "entitydata.h" + +namespace PresentDatas { + /* enum class EntityType { + TEXT_RANGE, // 字符集合,包含段落和句子 + IMAGE_CUBE, // 图片展示块 + HREF_FRAGS, // 超链接 + TABLE_VIEW, // 表格视图 + LIST_VIEW, // 列表视图 + INTERACTIVE_EXTENSION, // 交互式拓展插件视图 + DISPLAY_GROUP, // 元素混合组织成包 + DOCUMENT_ENTITY + };*/ + + class DisplayGroup : public SpecificEntityData { + public: + DisplayGroup(const QString &uid); + + public: + // EntityData interface + public: + virtual QString styledText() const override; + virtual QString plainText() const override; + }; + + class TextRange : public SpecificEntityData { + public: + TextRange(const QString &uid); + + void setStyledText(const QString &content); + void setPlainText(const QString &content); + + // EntityData interface + public: + virtual QString styledText() const override; + virtual QString plainText() const override; + + private: + }; + +} // namespace PresentDatas + +#endif // BLOCKDATAS_H diff --git a/libTextEdit/entitydata.cpp b/libTextEdit/entitydata.cpp index d870823..78edd9f 100644 --- a/libTextEdit/entitydata.cpp +++ b/libTextEdit/entitydata.cpp @@ -1,12 +1,22 @@ #include "entitydata.h" - +#include using namespace PresentDatas; -SpecificEntityData::SpecificEntityData(EntityType type, const QString &uid) : type_store(type), document_id(uid) {} +SpecificEntityData::SpecificEntityData(EntityType type, const QString &uid) : type_store(type), document_id(uid) { + visible_bool = true; + oritation_store = MemberOri::H_LEFT_TO_RIGHT; +} void SpecificEntityData::resetContentLayout(MemberOri oritation, MemberType child_type) { this->oritation_store = oritation; this->layout_type = child_type; + this->layout_type = MemberType::BLOCKS; + this->anchor_info = std::make_tuple(AnchorTarget::NONE, nullptr, AnchorPos::POINT_LEFT_TOP, 0, 0); + this->size_min = QSizeF(20, 20); +} + +void SpecificEntityData::setVisible(bool state){ + this->visible_bool = state; } void SpecificEntityData::setAnchorTo(AnchorTarget type, EntityData *tptr) { @@ -17,6 +27,21 @@ void SpecificEntityData::setAnchorPos(AnchorPos point, offset_h hoffset, offset_ anchor_info = std::make_tuple(std::get<0>(anchor_info), std::get<1>(anchor_info), point, hoffset, v_offset); } +void SpecificEntityData::insertChild(EntityData *inst, int index) { + if (index >= 0 && index < children_store.size()) + this->children_store.insert(index, inst); + else + this->children_store.append(inst); +} + +void SpecificEntityData::removeChild(EntityData *inst) { this->children_store.removeAll(inst); } + +void SpecificEntityData::setMinSizeHint(const QSizeF &hint) { this->size_min = hint; } + +void SpecificEntityData::setMaxSizeHint(const QSizeF &hint) { this->size_max = hint; } + +void SpecificEntityData::setStretchHint(const std::pair &hint) { this->stretch_pair = hint; } + QString SpecificEntityData::uID() const { return document_id; } EntityType SpecificEntityData::type() const { return type_store; } @@ -33,8 +58,40 @@ std::tuple SpecificEntity return std::make_tuple(std::get<2>(anchor_info), std::get<3>(anchor_info), std::get<4>(anchor_info)); } -DocumentData::DocumentData(const QString &name) : SpecificEntityData(EntityType::DOCUMENT_ENTITY, "Document-Unique") { +QList SpecificEntityData::children() const { return children_store; } + +bool SpecificEntityData::isVisible() const { return visible_bool; } + +QSizeF SpecificEntityData::minSizeHint() const { return this->size_min; } + +QSizeF SpecificEntityData::maxSizeHint() const { return this->size_max; } + +std::pair SpecificEntityData::sizeStretchHint() const { return stretch_pair; } + +Document::Document(const QString &name) : SpecificEntityData(EntityType::DOCUMENT_ENTITY, "Document-Unique") { resetContentLayout(MemberOri::H_LEFT_TO_RIGHT, MemberType::BLOCKS); } -void DocumentData::resetContentLayout(MemberOri oritation, MemberType) { SpecificEntityData::resetContentLayout(oritation, MemberType::BLOCKS); } +QString Document::styledText() const +{ + QString values = "\n"; + for(auto &i : children()) + values += i->styledText(); + values += ""; + + return values; +} + +QString Document::plainText() const +{ + QString values = ""; + for(auto &i : children()) + if(i->isVisible()) + values += i->plainText(); + + return values; +} + + + +void Document::resetContentLayout(MemberOri oritation, MemberType) { SpecificEntityData::resetContentLayout(oritation, MemberType::BLOCKS); } diff --git a/libTextEdit/entitydata.h b/libTextEdit/entitydata.h index 2d73e4f..e4f2ba2 100644 --- a/libTextEdit/entitydata.h +++ b/libTextEdit/entitydata.h @@ -1,6 +1,7 @@ #ifndef ENTITYDATA_H #define ENTITYDATA_H +#include #include #include #include @@ -124,19 +125,9 @@ namespace PresentDatas { */ virtual std::tuple anchorPos() const = 0; - /** - * @brief 计算最小尺寸 - * @param outline - * @return - */ - virtual QSizeF minSizeHint(const QRectF &outline) const = 0; - - /** - * @brief 计算当前尺寸 - * @param outline - * @return - */ - virtual QSizeF sizeHint(const QRectF &outline) const = 0; + virtual QSizeF minSizeHint() const = 0; + virtual QSizeF maxSizeHint() const = 0; + virtual std::pair sizeStretchHint() const = 0; /** * @brief 子元素数据,安装元素书序 @@ -160,6 +151,12 @@ namespace PresentDatas { */ virtual void resetContentLayout(MemberOri oritation, MemberType child_type); + /** + * @brief 设置显示标志 + * @param state + */ + virtual void setVisible(bool state); + /** * @brief 设置相对布局元素 * @param type @@ -187,43 +184,56 @@ namespace PresentDatas { */ virtual void removeChild(EntityData *inst); + virtual void setMinSizeHint(const QSizeF &hint); + virtual void setMaxSizeHint(const QSizeF &hint); + virtual void setStretchHint(const std::pair &hint); + + virtual void setStyledText(const QString &content) = 0; + virtual void setPlainText(const QString &content) = 0; + // EntityData ==================================================== - virtual QString uID() const; - virtual EntityType type() const; - virtual MemberOri oritation() const; - virtual MemberType displayType() const; - virtual std::pair anchorTarget() const; - virtual std::tuple anchorPos() const; - virtual QList children() const; + virtual QString uID() const override; + virtual EntityType type() const override; + virtual MemberOri oritation() const override; + virtual MemberType displayType() const override; + virtual std::pair anchorTarget() const override; + virtual std::tuple anchorPos() const override; + virtual QList children() const override; + virtual bool isVisible() const override; + virtual QSizeF minSizeHint() const override; + virtual QSizeF maxSizeHint() const override; + virtual std::pair sizeStretchHint() const override; private: + bool visible_bool; EntityType type_store; QString document_id; MemberOri oritation_store; MemberType layout_type; std::tuple anchor_info; + QList children_store; + QSizeF size_min, size_max; + std::pair stretch_pair; + + protected: + float appoint_layout_minvalue() const; }; /** * @brief 文档数据模型 */ - class DocumentData : public SpecificEntityData { + class Document : public SpecificEntityData { public: - DocumentData(const QString &name); + Document(const QString &name); // EntityData interface public: virtual QString styledText() const override; virtual QString plainText() const override; - virtual bool isVisible() const override; - virtual QSizeF minSizeHint(const QRectF &outline) const override; - virtual QSizeF sizeHint(const QRectF &outline) const override; // SpecificEntityData interface public: virtual void resetContentLayout(MemberOri oritation, MemberType) override; - - private: }; } // namespace PresentDatas diff --git a/libTextEdit/libTextEdit.pro b/libTextEdit/libTextEdit.pro index 51ede69..867aa92 100644 --- a/libTextEdit/libTextEdit.pro +++ b/libTextEdit/libTextEdit.pro @@ -10,10 +10,12 @@ CONFIG += c++11 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ + blockdatas.cpp \ entitydata.cpp \ libtextedit.cpp HEADERS += \ + blockdatas.h \ entitydata.h \ libTextEdit_global.h \ libtextedit.h diff --git a/u_test/main.cpp b/u_test/main.cpp index 658e492..0efe7b5 100644 --- a/u_test/main.cpp +++ b/u_test/main.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -23,61 +24,72 @@ int main(int argc, char *argv[]) { // qDebug() << QString("%1").arg((int)XEnum::ONE); auto win = new QMainWindow(); - win->setMinimumSize(800, 600); - win->menuBar()->addMenu("文件"); - auto tbar = new QToolBar(); - win->addToolBar(Qt::ToolBarArea::LeftToolBarArea, tbar); + // win->setMinimumSize(800, 600); + // win->menuBar()->addMenu("文件"); + // auto tbar = new QToolBar(); + // win->addToolBar(Qt::ToolBarArea::LeftToolBarArea, tbar); - auto conv = new ViewPresent(); - auto aview = new XWidget(conv, Qt::black); - auto bview = new XWidget(conv, Qt::green); - auto cview = new XWidget(conv, Qt::yellow); - auto dview = new YWidget(conv); + // auto conv = new ViewPresent(); + // auto aview = new XWidget(conv, Qt::black); + // auto bview = new XWidget(conv, Qt::green); + // auto cview = new XWidget(conv, Qt::yellow); + // auto dview = new YWidget(conv); - auto rect0 = conv->appendView(aview, QIcon(), "hello0"); - auto rect1 = conv->appendView(bview, QIcon(), "hello1"); - auto rect2 = conv->appendView(cview, QIcon(), "hello2"); - auto rect3 = conv->appendView(dview, QIcon(), "hello3"); - conv->markFreedom(rect0); - conv->markFreedom(rect1); - conv->markFreedom(rect2); - conv->markFreedom(rect3); + // auto rect0 = conv->appendView(aview, QIcon(), "hello0"); + // auto rect1 = conv->appendView(bview, QIcon(), "hello1"); + // auto rect2 = conv->appendView(cview, QIcon(), "hello2"); + // auto rect3 = conv->appendView(dview, QIcon(), "hello3"); + // conv->markFreedom(rect0); + // conv->markFreedom(rect1); + // conv->markFreedom(rect2); + // conv->markFreedom(rect3); - conv->objsRelateRebuild(); - conv->resetEngross(static_cast(rect3)); + // conv->objsRelateRebuild(); + // conv->resetEngross(static_cast(rect3)); - win->setCentralWidget(conv->bind()); + // win->setCentralWidget(conv->bind()); - auto b_left = tbar->addAction("左侧添加"); - win->connect(b_left, &QAction::triggered, [=](bool v) { - auto items = conv->freedomViews(); - if (items.size()) { - conv->temporaryVisible(SplitFrame::DockType::LEFT, items.last()); - } - }); - auto b_right = tbar->addAction(" 右侧添加"); - win->connect(b_right, &QAction::triggered, [=](bool v) { - auto items = conv->freedomViews(); - if (items.size()) { - conv->temporaryVisible(SplitFrame::DockType::RIGHT, items.last()); - } - }); - auto b_top = tbar->addAction("上侧添加"); - win->connect(b_top, &QAction::triggered, [=](bool v) { - auto items = conv->freedomViews(); - if (items.size()) { - conv->temporaryVisible(SplitFrame::DockType::TOP, items.last()); - } - }); - auto b_bottom = tbar->addAction("下侧添加"); - win->connect(b_bottom, &QAction::triggered, [=](bool v) { - auto items = conv->freedomViews(); - if (items.size()) { - conv->temporaryVisible(SplitFrame::DockType::BOTTOM, items.last()); - } - }); + // auto b_left = tbar->addAction("左侧添加"); + // win->connect(b_left, &QAction::triggered, [=](bool v) { + // auto items = conv->freedomViews(); + // if (items.size()) { + // conv->temporaryVisible(SplitFrame::DockType::LEFT, items.last()); + // } + // }); + // auto b_right = tbar->addAction(" 右侧添加"); + // win->connect(b_right, &QAction::triggered, [=](bool v) { + // auto items = conv->freedomViews(); + // if (items.size()) { + // conv->temporaryVisible(SplitFrame::DockType::RIGHT, items.last()); + // } + // }); + // auto b_top = tbar->addAction("上侧添加"); + // win->connect(b_top, &QAction::triggered, [=](bool v) { + // auto items = conv->freedomViews(); + // if (items.size()) { + // conv->temporaryVisible(SplitFrame::DockType::TOP, items.last()); + // } + // }); + // auto b_bottom = tbar->addAction("下侧添加"); + // win->connect(b_bottom, &QAction::triggered, [=](bool v) { + // auto items = conv->freedomViews(); + // if (items.size()) { + // conv->temporaryVisible(SplitFrame::DockType::BOTTOM, items.last()); + // } + // }); win->show(); + QWidget *firstPageWidget = new XWidget(nullptr, Qt::GlobalColor::green); + QWidget *secondPageWidget = new XWidget(nullptr, Qt::black); + QWidget *thirdPageWidget = new XWidget(nullptr, Qt::black); + + QStackedWidget *stackedWidget = new QStackedWidget; + stackedWidget->addWidget(firstPageWidget); + stackedWidget->addWidget(secondPageWidget); + stackedWidget->addWidget(thirdPageWidget); + + win->setCentralWidget(stackedWidget); + return a.exec(); }