1
0
Fork 0
x64dbg/x64_dbg_gui/Project/Src/Gui/TabBar.cpp

165 lines
4.8 KiB
C++

// Qt includes
#include <QApplication>
#include <QMouseEvent>
#include <QImage>
#include <QPainter>
#include <QPixmap>
#include <QPaintDevice>
#include <QDrag>
#include <QMimeData>
#include "tabbar.h"
#include "tabwidget.h"
//////////////////////////////////////////////////////////////
// Default Constructor
//////////////////////////////////////////////////////////////
MHTabBar::MHTabBar(QWidget* parent) : QTabBar(parent)
{
setAcceptDrops(true);
setElideMode(Qt::ElideRight);
setSelectionBehaviorOnRemove(QTabBar::SelectLeftTab);
setMovable(true);
}
//////////////////////////////////////////////////////////////
// Default Destructor
//////////////////////////////////////////////////////////////
MHTabBar::~MHTabBar(void)
{
}
void MHTabBar::contextMenuEvent(QContextMenuEvent* event)
{
QMenu wMenu(this);
QAction wDetach("&Detach", this);
wMenu.addAction(&wDetach);
if(wMenu.exec(event->globalPos()) == &wDetach)
{
QPoint p(0, 0);
OnDetachTab((int)tabAt(event->pos()), p);
}
}
/*
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton)
m_dragStartPos = event->pos();
m_dragDroppedPos.setX(0);
m_dragDroppedPos.setY(0);
m_dragMovedPos.setX(0);
m_dragMovedPos.setY(0);
m_dragInitiated = false;
QTabBar::mousePressEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::mouseMoveEvent(QMouseEvent* event)
{
// Distinguish a drag
if ( !m_dragStartPos.isNull() &&
((event->pos() - m_dragStartPos).manhattanLength() < QApplication::startDragDistance()) )
{
m_dragInitiated = true;
}
// The left button is pressed
// And the move could also be a drag
// And the mouse moved outside the tab bar
if ((event->buttons() & Qt::LeftButton) && m_dragInitiated && !geometry().contains(event->pos()))
{
// Stop the move to be able to convert to a drag
{
QMouseEvent finishMoveEvent(QEvent::MouseMove, event->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
QTabBar::mouseMoveEvent(&finishMoveEvent);
}
// A crude way to distinguish tab-reordering drops from other ones
QMimeData* mimeData = new QMimeData;
mimeData->setData("action", "application/tab-detach");
// Initiate Drag
QDrag* drag = new QDrag(this);
drag->setMimeData(mimeData);
// Create transparent screen dump
QPixmap pixmap = QPixmap::grabWindow(dynamic_cast<MHTabWidget*>(parentWidget())->currentWidget()->winId()).scaled(640, 480, Qt::KeepAspectRatio);
QPixmap targetPixmap(pixmap.size());
QPainter painter(&targetPixmap);
painter.setOpacity(0.5);
painter.drawPixmap(0, 0, pixmap);
painter.end();
drag->setPixmap(targetPixmap);
// Handle Detach and Move
Qt::DropAction dragged = drag->exec(Qt::MoveAction | Qt::CopyAction);
if (dragged == Qt::IgnoreAction)
{
event->accept();
OnDetachTab(tabAt(m_dragStartPos), QCursor::pos());
}
else if (dragged == Qt::MoveAction)
{
if (!m_dragDroppedPos.isNull())
{
event->accept();
OnMoveTab(tabAt(m_dragStartPos), tabAt(m_dragDroppedPos));
}
}
delete drag;
}
else
{
QTabBar::mouseMoveEvent(event);
}
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragEnterEvent(QDragEnterEvent* event)
{
// Only accept if it's an tab-reordering request (not a detach request)
const QMimeData* m = event->mimeData();
if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
{
event->acceptProposedAction();
}
QTabBar::dragEnterEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dragMoveEvent(QDragMoveEvent* event)
{
// Only accept if it's an tab-reordering request (not a detach request)
const QMimeData* m = event->mimeData();
if (m->formats().contains("action") && (m->data("action") != "application/tab-detach"))
{
m_dragMovedPos = event->pos();
event->acceptProposedAction();
}
QTabBar::dragMoveEvent(event);
}
//////////////////////////////////////////////////////////////////////////////
void MHTabBar::dropEvent(QDropEvent* event)
{
// If a dragged Event is dropped within this widget it is not a drag but a move.
m_dragDroppedPos = event->pos();
QTabBar::dropEvent(event);
}
*/