163 lines
4.8 KiB
C++
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);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|