diff --git a/QtNovelDesc.pro.user b/QtNovelDesc.pro.user index 112a888..e8b3a21 100644 --- a/QtNovelDesc.pro.user +++ b/QtNovelDesc.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId diff --git a/SplitView/splitview.cpp b/SplitView/splitview.cpp index f97c3b5..2882aab 100644 --- a/SplitView/splitview.cpp +++ b/SplitView/splitview.cpp @@ -78,7 +78,7 @@ void BaseView::setParentRect(SplitRect *pinst) { std::pair BaseView::child() const { return std::make_pair(nullptr, nullptr); } -void BaseView::replace(SplitRect *view, SplitRect *old) { throw new SimpleException("异常调用", "不能对ViewBase调用replace函数"); } +void BaseView::replaceComp(SplitRect *view, SplitRect *old) { throw new SimpleException("异常调用", "不能对ViewBase调用replace函数"); } float BaseView::splitterWidth() const { return 0; } @@ -104,7 +104,7 @@ void BaseView::installPerceptionHandle(ViewPresent *obj) { void BaseView::paintEvent(QPaintEvent *ev) { QWidget::paintEvent(ev); } -void BaseView::remove(SplitRect *child_inst) { throw new SimpleException("非法操作", "BaseView不支持retrieveComp操作"); } +void BaseView::removeComp(SplitRect *child_inst) { throw new SimpleException("非法操作", "BaseView不支持retrieveComp操作"); } AttachPanel::AttachPanel(ViewPresent *host) : QWidget(), size_host(host) { setWindowOpacity(50); @@ -188,41 +188,52 @@ void AttachPanel::dragEnterEvent(QDragEnterEvent *event) { void AttachPanel::dropEvent(QDropEvent *event) { QWidget::dropEvent(event); + event->acceptProposedAction(); auto xsource = size_host->adjustView(); - xsource->parentRect()->remove(xsource); auto target = this->attachTarget(); - auto ptarget = target->parentRect(); - SplitRect *newsplit = nullptr; - switch (this->active_comp) { - case ActiveArea::LEFT: { - newsplit = new SplitView(xsource, target, size_host); - newsplit->setSplitInfo(SplitType::SPLIT_H, target->outline().width() / 2, size_host->splitterWidth()); - } break; - case ActiveArea::RIGHT: { - newsplit = new SplitView(target, xsource, size_host); - newsplit->setSplitInfo(SplitType::SPLIT_H, target->outline().width() / 2, size_host->splitterWidth()); - } break; - case ActiveArea::TOP: { - newsplit = new SplitView(xsource, target, size_host); - newsplit->setSplitInfo(SplitType::SPLIT_V, target->outline().height() / 2, size_host->splitterWidth()); - } break; - case ActiveArea::BOTTOM: { - newsplit = new SplitView(target, xsource, size_host); - newsplit->setSplitInfo(SplitType::SPLIT_V, target->outline().height() / 2, size_host->splitterWidth()); - } break; - case ActiveArea::CENTER: { - newsplit = xsource; - } break; - default: - return; + if (target != xsource) { + SplitRect *newsplit = nullptr; + + if (xsource->parentRect()) + xsource->parentRect()->removeComp(xsource); + + auto ptarget = target->parentRect(); + auto target_rect = target->outline(); + + switch (this->active_comp) { + case ActiveArea::LEFT: { + newsplit = new SplitView(xsource, target, size_host); + newsplit->relayout(target_rect); + newsplit->setSplitInfo(SplitType::SPLIT_H, target_rect.width() / 2, size_host->splitterWidth()); + } break; + case ActiveArea::RIGHT: { + newsplit = new SplitView(target, xsource, size_host); + newsplit->relayout(target_rect); + newsplit->setSplitInfo(SplitType::SPLIT_H, target_rect.width() / 2, size_host->splitterWidth()); + } break; + case ActiveArea::TOP: { + newsplit = new SplitView(xsource, target, size_host); + newsplit->relayout(target_rect); + newsplit->setSplitInfo(SplitType::SPLIT_V, target_rect.height() / 2, size_host->splitterWidth()); + } break; + case ActiveArea::BOTTOM: { + newsplit = new SplitView(target, xsource, size_host); + newsplit->relayout(target_rect); + newsplit->setSplitInfo(SplitType::SPLIT_V, target_rect.height() / 2, size_host->splitterWidth()); + } break; + case ActiveArea::CENTER: { + newsplit = xsource; + } break; + default: + return; + } + + ptarget->replaceComp(newsplit, target); } - ptarget->replace(newsplit, target); this->setVisible(false); - - event->acceptProposedAction(); } std::tuple AttachPanel::view_rects() const { @@ -334,7 +345,7 @@ std::pair ViewPresent::child() const { return std::make_pair(inst0, inst1); } -void ViewPresent::replace(SplitRect *view, SplitRect *old) { +void ViewPresent::replaceComp(SplitRect *view, SplitRect *old) { if (!view_anchors.contains(old)) throw new SimpleException("参数错误", "指定替换的界面不属于此界面"); @@ -375,7 +386,7 @@ void ViewPresent::paintEvent(QPaintEvent *ev) { it->bind()->update(); } -void ViewPresent::remove(SplitRect *child_inst) { +void ViewPresent::removeComp(SplitRect *child_inst) { if (!view_anchors.contains(child_inst)) throw new SimpleException("参数非法", "回收的指定视图不属于本ViewPresent"); @@ -544,7 +555,7 @@ void SplitView::setSplitInfo(SplitType type, float pos, float width, bool relayo this->relayout(); } -void SplitView::replace(SplitRect *view, SplitRect *old) { +void SplitView::replaceComp(SplitRect *view, SplitRect *old) { if (child_store.contains(old) && !child_store.contains(view)) { auto index = child_store.indexOf(old); child_store.replace(index, view); @@ -560,7 +571,7 @@ void SplitView::relayout(const QRectF &outlinex) { update(); } -void SplitView::remove(SplitRect *child_inst) { +void SplitView::removeComp(SplitRect *child_inst) { auto pinst = parentRect(); auto sib = this->child().first; @@ -568,7 +579,7 @@ void SplitView::remove(SplitRect *child_inst) { sib = this->child().second; child_inst->bind()->setVisible(false); - pinst->replace(sib, this); + pinst->replaceComp(sib, this); child_inst->setParentRect(nullptr); delete this; @@ -731,7 +742,7 @@ DragHeader::DragHeader(BaseView *bind) : QFrame(bind->bind()), icon_store(new QL connect(hide, &QPushButton::clicked, [=]() { auto con = this->view_core->parentRect(); - con->remove(view_core); + con->removeComp(view_core); }); connect(close, &QPushButton::clicked, [=]() { diff --git a/SplitView/splitview.h b/SplitView/splitview.h index 56bdb52..5c118ba 100644 --- a/SplitView/splitview.h +++ b/SplitView/splitview.h @@ -54,7 +54,8 @@ namespace SplitFrame { virtual void setParentRect(SplitRect *pinst) = 0; virtual std::pair child() const = 0; - virtual void replace(SplitRect *view, SplitRect *old) = 0; + virtual void removeComp(SplitRect *child) = 0; + virtual void replaceComp(SplitRect *view, SplitRect *old) = 0; virtual float splitterWidth() const = 0; virtual float splitterPos() const = 0; virtual SplitType splitType() const = 0; @@ -62,7 +63,6 @@ namespace SplitFrame { virtual QRectF outline() const = 0; virtual void relayout(const QRectF &outline) = 0; - virtual void remove(SplitRect *child) = 0; virtual void paintEvent(QPaintEvent *ev) = 0; }; @@ -84,11 +84,11 @@ namespace SplitFrame { virtual float splitterPos() const override; virtual SplitType splitType() const override; virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout) override; - virtual void replace(SplitRect *view, SplitRect *old) override; + virtual void replaceComp(SplitRect *view, SplitRect *old) override; virtual QRectF outline() const override; virtual void relayout(const QRectF &outline) override; - virtual void remove(SplitRect *child_inst) override; + virtual void removeComp(SplitRect *child_inst) override; // QWidget interface protected: @@ -161,7 +161,7 @@ namespace SplitFrame { virtual SplitRect *parentRect() const override; virtual void setParentRect(SplitRect *pinst) override; virtual std::pair child() const override; - virtual void replace(SplitRect *view, SplitRect *old) override; + virtual void replaceComp(SplitRect *view, SplitRect *old) override; virtual float splitterWidth() const override; virtual float splitterPos() const override; virtual SplitType splitType() const override; @@ -170,7 +170,7 @@ namespace SplitFrame { virtual void relayout(const QRectF &outline) override; virtual void paintEvent(QPaintEvent *ev) override; - virtual void remove(SplitRect *child_inst) override; + virtual void removeComp(SplitRect *child_inst) override; private: DragHeader *title_header; @@ -214,14 +214,14 @@ namespace SplitFrame { virtual void setParentRect(SplitRect *pinst) override; virtual std::pair child() const override; - virtual void replace(SplitRect *view, SplitRect *old) override; + virtual void replaceComp(SplitRect *view, SplitRect *old) override; virtual float splitterWidth() const override; virtual float splitterPos() const override; virtual SplitType splitType() const override; virtual void setSplitInfo(SplitType type, float pos, float width, bool relayout) override; virtual QRectF outline() const override; virtual void relayout(const QRectF &outline) override; - virtual void remove(SplitRect *child_inst) override; + virtual void removeComp(SplitRect *child_inst) override; // QWidget interface protected: