#include "AcceptPanel.h" #include #include 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 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 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); auto pinst = anchor_view->parentRes(); if(pinst){ pinst->replaceView(view, anchor_view); view_manager->doRetrieve(anchor_view); dynamic_cast(view_manager)->freedomHasBeenRemoved(view); }else{ view_manager->doRetrieve(anchor_view); dynamic_cast(view_manager)->setPresentTarget(view); } view->setVisible(true); } break; default: break; } view_manager->setAdjustView(); target_type = HoverType::CUBE_UNDEFINED; } this->bindWith(nullptr); }