修复了本视图拖动bug,修复了视图分割比例bug,修复了兄弟视图颠倒bug

This commit is contained in:
玉宇清音 2023-08-21 22:40:26 +08:00
parent cd6ff24d0e
commit 8458a1a0f3
3 changed files with 56 additions and 45 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.15.0, 2023-08-21T11:28:09. -->
<!-- Written by QtCreator 4.15.0, 2023-08-21T22:09:20. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>

View File

@ -78,7 +78,7 @@ void BaseView::setParentRect(SplitRect *pinst) {
std::pair<SplitRect *, SplitRect *> BaseView::child() const { return std::make_pair<SplitRect *, SplitRect *>(nullptr, nullptr); }
void BaseView::replace(SplitRect *view, SplitRect *old) { throw new SimpleException<QString>("异常调用", "不能对ViewBase调用replace函数"); }
void BaseView::replaceComp(SplitRect *view, SplitRect *old) { throw new SimpleException<QString>("异常调用", "不能对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<QString>("非法操作", "BaseView不支持retrieveComp操作"); }
void BaseView::removeComp(SplitRect *child_inst) { throw new SimpleException<QString>("非法操作", "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<QRectF, QRectF, QRectF, QRectF, QRectF> AttachPanel::view_rects() const {
@ -334,7 +345,7 @@ std::pair<SplitRect *, SplitRect *> 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<QString>("参数错误", "指定替换的界面不属于此界面");
@ -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<QString>("参数非法", "回收的指定视图不属于本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, [=]() {

View File

@ -54,7 +54,8 @@ namespace SplitFrame {
virtual void setParentRect(SplitRect *pinst) = 0;
virtual std::pair<SplitRect *, SplitRect *> 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<SplitRect *, SplitRect *> 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<SplitRect *, SplitRect *> 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: