QtNovelUI/libSplitView/AcceptPanel.cpp

163 lines
4.8 KiB
C++

#include "AcceptPanel.h"
#include <QDragMoveEvent>
#include <QPainter>
using namespace split_frame;
accept_panel::AcceptPanel::AcceptPanel(QMainWindow *win, split_frame::ResManager *mgr)
: QWidget(nullptr), bind_win(win), view_manager(mgr) {
this->setMouseTracking(true);
this->setAcceptDrops(true);
}
void accept_panel::AcceptPanel::bindWith(split_frame::ViewBase *target)
{
if (target) {
this->setParent(target->widget());
if(this->anchor_view != target || this->paint_panel.rect() != target->widget()->rect()){
this->paint_panel = target->widget()->grab();
}
this->setGeometry(QRect(QPoint(), target->widget()->size()));
}
else {
this->setParent(bind_win);
}
this->anchor_view = target;
}
void accept_panel::AcceptPanel::resizeEvent(QResizeEvent *ev)
{
QWidget::resizeEvent(ev);
auto render_width = this->width() / 3;
auto render_height = this->height() / 3;
this->cube_center = QRectF(render_width, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_left = QRectF(0, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_right = QRectF(this->width() - render_width, render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_top = QRectF(render_width, 0, render_width, render_height) - QMargins(15, 15, 15, 15);
this->cube_bottom = QRectF(render_width, this->height() - render_height, render_width, render_height) - QMargins(15, 15, 15, 15);
this->target_type = HoverType::CUBE_UNDEFINED;
}
#include <QDebug>
void accept_panel::AcceptPanel::paintEvent(QPaintEvent *ev)
{
QWidget::paintEvent(ev);
QPainter t(this);
t.fillRect(this->rect(), this->paint_panel);
switch(this->target_type){
case HoverType::CUBE_LEFT:
t.fillRect(this->cube_left + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_RIGHT:
t.fillRect(this->cube_right + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_TOP:
t.fillRect(this->cube_top+ QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_BOTTOM:
t.fillRect(this->cube_bottom + QMargins(15, 15, 15, 15), Qt::gray);
break;
case HoverType::CUBE_CENTER:
t.fillRect(this->cube_center + QMargins(15, 15, 15, 15), Qt::gray);
break;
default:
break;
}
t.fillRect(this->cube_left, Qt::green);
t.fillRect(this->cube_right, Qt::green);
t.fillRect(this->cube_top, Qt::green);
t.fillRect(this->cube_bottom, Qt::green);
t.fillRect(this->cube_center, Qt::green);
}
void accept_panel::AcceptPanel::dragMoveEvent(QDragMoveEvent *ev)
{
QWidget::dragMoveEvent(ev);
if(this->cube_left.contains(ev->pos()))
this->target_type = HoverType::CUBE_LEFT;
else if(this->cube_right.contains(ev->pos()))
this->target_type = HoverType::CUBE_RIGHT;
else if(this->cube_top.contains(ev->pos()))
this->target_type = HoverType::CUBE_TOP;
else if(this->cube_bottom.contains(ev->pos()))
this->target_type = HoverType::CUBE_BOTTOM;
else if(this->cube_center.contains(ev->pos()))
this->target_type = HoverType::CUBE_CENTER;
else
this->target_type = HoverType::CUBE_UNDEFINED;
this->update();
}
void accept_panel::AcceptPanel::dragEnterEvent(QDragEnterEvent *ev)
{
QWidget::dragEnterEvent(ev);
if(view_manager->adjustView())
ev->acceptProposedAction();
}
#include "SplitPanel.h"
#include <QDebug>
void accept_panel::AcceptPanel::dropEvent(QDropEvent *ev)
{
auto view = view_manager->adjustView();
if(view && anchor_view != view){
switch (target_type) {
case HoverType::CUBE_LEFT:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_H_LFIRST);
break;
case HoverType::CUBE_RIGHT:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_H_RFIRST);
break;
case HoverType::CUBE_TOP:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_V_TFIRST);
break;
case HoverType::CUBE_BOTTOM:
view_manager->doRetrieve(view);
view_manager->siblingAttach(view, anchor_view, SplitType::SPLIT_V_BFIRST);
break;
case HoverType::CUBE_CENTER:
view_manager->doRetrieve(view);
anchor_view->parentRes()->replaceView(view, anchor_view);
view_manager->doRetrieve(anchor_view);
break;
default:
break;
}
view_manager->setAdjustView();
target_type = HoverType::CUBE_UNDEFINED;
}
this->bindWith(nullptr);
}