修复了本视图拖动bug,修复了视图分割比例bug,修复了兄弟视图颠倒bug
This commit is contained in:
parent
cd6ff24d0e
commit
8458a1a0f3
|
@ -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>
|
||||
|
|
|
@ -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, [=]() {
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue