修复了拖拽bug

This commit is contained in:
codeboss 2024-02-10 15:09:02 +08:00
parent 75982278b4
commit 480b259a53
13 changed files with 92 additions and 93 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.15.0, 2024-02-09T16:03:39. --> <!-- Written by QtCreator 4.15.0, 2024-02-10T14:34:11. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>

View File

@ -1,4 +1,4 @@
#include "acceptpanel.h" #include "AcceptPanel.h"
#include <QDragMoveEvent> #include <QDragMoveEvent>
#include <QPainter> #include <QPainter>
@ -107,7 +107,7 @@ void accept_panel::AcceptPanel::dragEnterEvent(QDragEnterEvent *ev)
ev->acceptProposedAction(); ev->acceptProposedAction();
} }
#include "splitpanel.h" #include "SplitPanel.h"
#include <QDebug> #include <QDebug>
void accept_panel::AcceptPanel::dropEvent(QDropEvent *ev) void accept_panel::AcceptPanel::dropEvent(QDropEvent *ev)
{ {

View File

@ -3,7 +3,7 @@
#include <QMainWindow> #include <QMainWindow>
#include <QWidget> #include <QWidget>
#include "splitview_interface.h" #include "libSplitView.h"
namespace accept_panel { namespace accept_panel {
enum class HoverType{ enum class HoverType{

View File

@ -1,4 +1,4 @@
#include "dockpanel.h" #include "DockPanel.h"
#include <QApplication> #include <QApplication>
#include <QDebug> #include <QDebug>
@ -113,6 +113,11 @@ DockableView::DockableView(split_frame::ResManager *mgr, QWidget *present, bool
connect(this->title_header, &DragHeader::adjustRequest, this, &DockableView::adjustAccept); connect(this->title_header, &DragHeader::adjustRequest, this, &DockableView::adjustAccept);
} }
DockableView::~DockableView() {
manager_inst->removePresentView(this);
qDebug() << "view-deleted";
}
void DockableView::viewConfig(bool replace, bool close, bool retrieve) void DockableView::viewConfig(bool replace, bool close, bool retrieve)
{ {
this->m_replace = replace; this->m_replace = replace;
@ -155,18 +160,6 @@ void DockableView::retrieveAccept()
this->manager_inst->doRetrieve(this); this->manager_inst->doRetrieve(this);
} }
void DockableView::showEvent(QShowEvent *ev)
{
QWidget::showEvent(ev);
manager_inst->appendPresentView(this);
}
void DockableView::hideEvent(QHideEvent *ev)
{
QWidget::hideEvent(ev);
manager_inst->removePresentView(this);
}
split_frame::ResManager *DockableView::splitManager() const split_frame::ResManager *DockableView::splitManager() const
{ {
return this->manager_inst; return this->manager_inst;

View File

@ -1,7 +1,7 @@
#ifndef BASEVIEW_H #ifndef BASEVIEW_H
#define BASEVIEW_H #define BASEVIEW_H
#include "splitview_interface.h" #include "libSplitView.h"
#include <QFrame> #include <QFrame>
#include <QIcon> #include <QIcon>
#include <QLabel> #include <QLabel>
@ -62,6 +62,7 @@ namespace dock_panel {
* @param custom_header * @param custom_header
*/ */
DockableView(split_frame::ResManager*mgr, QWidget *present, bool drag_header = false); DockableView(split_frame::ResManager*mgr, QWidget *present, bool drag_header = false);
virtual ~DockableView();
/** /**
* @brief * @brief
* @param replace * @param replace
@ -82,10 +83,6 @@ namespace dock_panel {
void closeAccept(); void closeAccept();
void retrieveAccept(); void retrieveAccept();
protected:
void showEvent(QShowEvent *ev) override;
void hideEvent(QHideEvent *ev) override;
private: private:
DragHeader *const title_header; DragHeader *const title_header;
QWidget *const present_cube; QWidget *const present_cube;

View File

@ -1,5 +1,5 @@
#include "splitpanel.h" #include "SplitPanel.h"
#include "dockpanel.h" #include "DockPanel.h"
#include <QPainter> #include <QPainter>
#include <libConfig.h> #include <libConfig.h>
@ -80,10 +80,10 @@ bool SplitPanel::isVisible() const
void SplitPanel::initViews(ViewRes *a, ViewRes *b) void SplitPanel::initViews(ViewRes *a, ViewRes *b)
{ {
a->setParentRes(this); a->setParentRes(this);
manager_inst->appendPresentView(dynamic_cast<ViewBase*>(a));
b->setParentRes(this); b->setParentRes(this);
manager_inst->appendPresentView(dynamic_cast<ViewBase*>(b));
this->split_member = std::make_pair(a, b); this->split_member = std::make_pair(a, b);
this->sync_status();
} }
QWidget *SplitPanel::widget() const { return const_cast<SplitPanel *>(this); } QWidget *SplitPanel::widget() const { return const_cast<SplitPanel *>(this); }
@ -181,8 +181,11 @@ void SplitPanel::sync_status()
auto width_a = total_w * std::get<1>(split_info); auto width_a = total_w * std::get<1>(split_info);
auto width_b = total_w - width_a - std::get<2>(split_info); auto width_b = total_w - width_a - std::get<2>(split_info);
this->split_member.first->setOutline(QRectF(0, 0, width_a, total_h)); auto first = this->split_member.first;
this->split_member.second->setOutline(QRectF(width_a + std::get<2>(split_info), 0, width_b, total_h)); auto second = this->split_member.second;
first->setOutline(QRectF(0, 0, width_a, total_h));
second->setOutline(QRectF(width_a + std::get<2>(split_info), 0, width_b, total_h));
this->splitter_inst->setGeometry(QRect(width_a, 0, std::get<2>(split_info), total_h)); this->splitter_inst->setGeometry(QRect(width_a, 0, std::get<2>(split_info), total_h));
} break; } break;
case SplitType::SPLIT_V_BFIRST: case SplitType::SPLIT_V_BFIRST:
@ -190,8 +193,10 @@ void SplitPanel::sync_status()
auto height_a = total_h * std::get<1>(split_info); auto height_a = total_h * std::get<1>(split_info);
auto height_b = total_h - height_a - std::get<2>(split_info); auto height_b = total_h - height_a - std::get<2>(split_info);
split_member.first->setOutline(QRectF(0, 0, total_w, height_a)); auto first = this->split_member.first;
split_member.second->setOutline(QRectF(0, height_a + std::get<2>(split_info) - 1, total_w, height_b + 1)); auto second = this->split_member.second;
first->setOutline(QRectF(0, 0, total_w, height_a));
second->setOutline(QRectF(0, height_a + std::get<2>(split_info) - 1, total_w, height_b + 1));
splitter_inst->setGeometry(QRect(0, height_a, total_w, std::get<2>(split_info))); splitter_inst->setGeometry(QRect(0, height_a, total_w, std::get<2>(split_info)));
} break; } break;
} }

View File

@ -1,7 +1,7 @@
#ifndef SPLITPANEL #ifndef SPLITPANEL
#define SPLITPANEL #define SPLITPANEL
#include "splitwindow.h" #include "SplitWindow.h"
#include <QFrame> #include <QFrame>

View File

@ -1,6 +1,6 @@
#include "splitwindow.h" #include "SplitWindow.h"
#include "dockpanel.h" #include "DockPanel.h"
#include "splitpanel.h" #include "SplitPanel.h"
#include <QApplication> #include <QApplication>
#include <QDebug> #include <QDebug>
#include <QDrag> #include <QDrag>
@ -17,9 +17,7 @@
using namespace split_window; using namespace split_window;
using namespace split_frame; using namespace split_frame;
SplitWindow::SplitWindow(QWidget *parent) : QMainWindow(parent), accept_port(new accept_panel::AcceptPanel(this, this)), view_root(nullptr) {
SplitWindow::SplitWindow(QWidget *parent) : QMainWindow(parent), view_root(nullptr), accept_port(new accept_panel::AcceptPanel(this, this)) {
this->view_root = nullptr;
accept_port->setVisible(false); accept_port->setVisible(false);
} }
@ -33,11 +31,14 @@ void SplitWindow::tempShow(split_frame::DockType t, split_frame::ViewBase *targe
void SplitWindow::setPresentTarget(split_frame::ViewRes *inst) void SplitWindow::setPresentTarget(split_frame::ViewRes *inst)
{ {
if(inst){ if(inst && this->view_root != inst){
this->takeCentralWidget();
this->view_root = nullptr;
inst->setParentRes(nullptr); inst->setParentRes(nullptr);
inst->widget()->setParent(this);
this->setCentralWidget(inst->widget()); this->setCentralWidget(inst->widget());
} } else if (!inst) {
else{
this->takeCentralWidget(); this->takeCentralWidget();
} }
@ -129,18 +130,24 @@ void SplitWindow::doRetrieve(split_frame::ViewBase *inst)
inst->setParentRes(nullptr); inst->setParentRes(nullptr);
} }
else if(inst->parentRes() == view_root){ else if(inst->parentRes() == view_root){
auto pinst_root = inst->parentRes(); auto pinst = inst->parentRes();
auto remains = pinst_root->except(inst); auto remains = pinst->except(inst);
inst->setParentRes(nullptr); inst->setParentRes(nullptr);
remains.first->setParentRes(nullptr);
auto awidget = inst->widget()->parent();
auto cwidget = inst->widget()->parentWidget();
auto bwidget = inst->widget()->parent();
setPresentTarget(remains.first); setPresentTarget(remains.first);
delete pinst_root; delete pinst;
} }
else if(inst->parentRes()){ else if(inst->parentRes()){
auto pinst = inst->parentRes(); auto pinst = inst->parentRes();
auto remains = pinst->except(inst); auto remains = pinst->except(inst);
remains.first->setParentRes(nullptr);
inst->setParentRes(nullptr); inst->setParentRes(nullptr);
auto ppinst = pinst->parentRes(); auto ppinst = pinst->parentRes();
@ -166,7 +173,6 @@ void SplitWindow::doClose(split_frame::ViewBase *inst)
for(auto &lsn : listener_list) for(auto &lsn : listener_list)
lsn->aboutToBeDelete(inst); lsn->aboutToBeDelete(inst);
removePresentView(inst);
delete inst; delete inst;
} }
@ -181,7 +187,15 @@ void SplitWindow::siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori)
auto remains_frm = pos->parentRes(); auto remains_frm = pos->parentRes();
auto split_slot = new split_panel::SplitPanel(this, ori); auto split_slot = new split_panel::SplitPanel(this, ori);
if(pos == view_root){
setPresentTarget(split_slot);
}
else{
if(!remains_frm)
throw new Config::SimpleException<QString>("参数错误", "指定吸附视图父引用为空");
remains_frm->replaceView(split_slot, pos); remains_frm->replaceView(split_slot, pos);
}
switch (ori) { switch (ori) {
case SplitType::SPLIT_H_LFIRST: case SplitType::SPLIT_H_LFIRST:

View File

@ -1,8 +1,8 @@
#ifndef SPLITWINDOW_H #ifndef SPLITWINDOW_H
#define SPLITWINDOW_H #define SPLITWINDOW_H
#include "splitview_interface.h" #include "libSplitView.h"
#include "acceptpanel.h" #include "AcceptPanel.h"
#include <QMainWindow> #include <QMainWindow>
#include <QWidget> #include <QWidget>
@ -40,8 +40,7 @@ namespace split_window {
/** /**
* @brief * @brief * @param inst
* @param inst
*/ */
void setPresentTarget(split_frame::ViewRes *inst = nullptr); void setPresentTarget(split_frame::ViewRes *inst = nullptr);

View File

@ -1,15 +1,9 @@
#ifndef SPLITVIEW_INTERFACE_H #ifndef LIBSPLITVIEW_H
#define SPLITVIEW_INTERFACE_H #define LIBSPLITVIEW_H
#include <QtCore/qglobal.h>
#if defined(SPLITVIEW_LIBRARY)
# define SPLITVIEW_EXPORT Q_DECL_EXPORT
#else
# define SPLITVIEW_EXPORT Q_DECL_IMPORT
#endif
#include "libSplitView_Global.h"
#include <QWidget> #include <QWidget>
#include <QSizeF>
namespace split_frame { namespace split_frame {
class SplitView; class SplitView;
@ -128,16 +122,14 @@ namespace split_frame {
virtual ~SplitView() = default; virtual ~SplitView() = default;
/** /**
* @brief * @brief
* @param a a * @param a a
* @param b b * @param b b
*/ */
virtual void initViews(ViewRes *a, ViewRes *b) = 0; virtual void initViews(ViewRes *a, ViewRes *b) = 0;
/** /**
* @brief 使 * @brief * @param view * @param pos
* @param view
* @param pos
*/ */
virtual void replaceView(ViewRes *_new, ViewRes *_old) = 0; virtual void replaceView(ViewRes *_new, ViewRes *_old) = 0;
@ -232,31 +224,29 @@ namespace split_frame {
virtual void appendPresentView(ViewBase *inst) = 0; virtual void appendPresentView(ViewBase *inst) = 0;
/** /**
* @brief * @brief
* @param inst * @param inst
*/ */
virtual bool isPresented(ViewBase *inst) const = 0; virtual bool isPresented(ViewBase *inst) const = 0;
/** /**
* @brief * @brief * @param inst
* @param inst
*/ */
virtual void doRetrieve(ViewBase *inst) = 0; virtual void doRetrieve(ViewBase *inst) = 0;
/** /**
* @brief * @brief
* @param inst
*/ */
virtual void doClose(ViewBase *inst) = 0; virtual void doClose(ViewBase *inst) = 0;
/** /**
* @brief 使 * @brief
* @param view * @param view
* @param pos * @param old
*/ */
virtual void siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori) = 0; virtual void siblingAttach(ViewBase *view, ViewBase *pos, SplitType ori) = 0;
}; };
} // namespace SplitFrame } // namespace SplitFrame
#endif // SPLITVIEW_INTERFACE_H #endif // LIBSPLITVIEW_H

View File

@ -15,17 +15,18 @@ msvc{
} }
SOURCES += \ SOURCES += \
acceptpanel.cpp \ AcceptPanel.cpp \
dockpanel.cpp \ DockPanel.cpp \
splitpanel.cpp \ SplitPanel.cpp \
splitwindow.cpp SplitWindow.cpp
HEADERS += \ HEADERS += \
acceptpanel.h \ AcceptPanel.h \
dockpanel.h \ DockPanel.h \
splitpanel.h \ SplitPanel.h \
splitview_interface.h \ SplitWindow.h \
splitwindow.h libSplitView.h \
libSplitView_Global.h
# Default rules for deployment. # Default rules for deployment.
unix { unix {

View File

@ -10,23 +10,23 @@
#include <QStackedWidget> #include <QStackedWidget>
#include <QStyle> #include <QStyle>
#include <QToolBar> #include <QToolBar>
#include <dockpanel.h> #include <DockPanel.h>
#include <splitwindow.h> #include <SplitWindow.h>
#include <splitpanel.h> #include <SplitPanel.h>
#include <dockpanel.h> #include <DockPanel.h>
int main(int argc, char *argv[]) { int main(int argc, char *argv[]) {
QApplication a(argc, argv); QApplication a(argc, argv);
split_window::SplitWindow w; auto w = new split_window::SplitWindow;
auto spb = new split_panel::SplitPanel(&w, split_frame::SplitType::SPLIT_H_LFIRST); auto spb = new split_panel::SplitPanel(w, split_frame::SplitType::SPLIT_H_LFIRST);
auto bview = new dock_panel::DockableView(&w, new QWidget, true); auto bview = new dock_panel::DockableView(w, new QWidget, true);
auto dview = new dock_panel::DockableView(&w, new QWidget, true); auto dview = new dock_panel::DockableView(w, new QWidget, true);
spb->initViews(bview, dview); spb->initViews(bview, dview);
w.setPresentTarget(spb); w->setPresentTarget(spb);
a.installEventFilter(&w); a.installEventFilter(w);
w.show(); w->show();
return a.exec(); return a.exec();
} }

View File

@ -3,7 +3,7 @@
#include <QString> #include <QString>
#include <QWidget> #include <QWidget>
#include <splitwindow.h> #include <SplitWindow.h>
#endif // UNNNN_H #endif // UNNNN_H