Make tab movement visible (#10733)

The nice hand-made solution for moving tabs has made its time. Use Qt's feature
instead from now on.
This commit is contained in:
Guillaume Munch 2018-10-04 19:52:21 -04:00 committed by Richard Kimberly Heck
parent 17b7eab0cc
commit 1979496399
2 changed files with 9 additions and 114 deletions

View File

@ -1556,19 +1556,19 @@ TabWorkArea::TabWorkArea(QWidget * parent)
this, SLOT(closeCurrentBuffer()));
setCornerWidget(closeBufferButton, Qt::TopRightCorner);
// setup drag'n'drop
QTabBar* tb = new DragTabBar;
connect(tb, SIGNAL(tabMoveRequested(int, int)),
this, SLOT(moveTab(int, int)));
// set TabBar behaviour
QTabBar * tb = tabBar();
tb->setTabsClosable(!lyxrc.single_close_tab_button);
tb->setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab);
tb->setElideMode(Qt::ElideNone);
setTabBar(tb);
// allow dragging tabs
tb->setMovable(true);
// make us responsible for the context menu of the tabbar
tb->setContextMenuPolicy(Qt::CustomContextMenu);
connect(tb, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(showContextMenu(const QPoint &)));
this, SLOT(showContextMenu(const QPoint &)));
connect(tb, SIGNAL(tabCloseRequested(int)),
this, SLOT(closeTab(int)));
this, SLOT(closeTab(int)));
setUsesScrollButtons(true);
}
@ -2083,7 +2083,7 @@ void TabWorkArea::updateTabTexts()
void TabWorkArea::showContextMenu(const QPoint & pos)
{
// which tab?
clicked_tab_ = static_cast<DragTabBar *>(tabBar())->tabAt(pos);
clicked_tab_ = tabBar()->tabAt(pos);
if (clicked_tab_ == -1)
return;
@ -2112,84 +2112,6 @@ void TabWorkArea::moveTab(int fromIndex, int toIndex)
}
DragTabBar::DragTabBar(QWidget* parent)
: QTabBar(parent)
{
setAcceptDrops(true);
setTabsClosable(!lyxrc.single_close_tab_button);
}
void DragTabBar::mousePressEvent(QMouseEvent * event)
{
if (event->button() == Qt::LeftButton)
dragStartPos_ = event->pos();
QTabBar::mousePressEvent(event);
}
void DragTabBar::mouseMoveEvent(QMouseEvent * event)
{
// If the left button isn't pressed anymore then return
if (!(event->buttons() & Qt::LeftButton))
return;
// If the distance is too small then return
if ((event->pos() - dragStartPos_).manhattanLength()
< QApplication::startDragDistance())
return;
// did we hit something after all?
int tab = tabAt(dragStartPos_);
if (tab == -1)
return;
// simulate button release to remove highlight from button
int i = currentIndex();
QMouseEvent me(QEvent::MouseButtonRelease, dragStartPos_,
event->button(), event->buttons(), 0);
QTabBar::mouseReleaseEvent(&me);
setCurrentIndex(i);
// initiate Drag
QDrag * drag = new QDrag(this);
QMimeData * mimeData = new QMimeData;
// a crude way to distinguish tab-reodering drops from other ones
mimeData->setData("action", "tab-reordering") ;
drag->setMimeData(mimeData);
// get tab pixmap as cursor
QRect r = tabRect(tab);
QPixmap pixmap(r.size());
render(&pixmap, - r.topLeft());
drag->setPixmap(pixmap);
drag->exec();
}
void DragTabBar::dragEnterEvent(QDragEnterEvent * event)
{
// Only accept if it's an tab-reordering request
QMimeData const * m = event->mimeData();
QStringList formats = m->formats();
if (formats.contains("action")
&& m->data("action") == "tab-reordering")
event->acceptProposedAction();
}
void DragTabBar::dropEvent(QDropEvent * event)
{
int fromIndex = tabAt(dragStartPos_);
int toIndex = tabAt(event->pos());
// Tell interested objects that
if (fromIndex != toIndex)
tabMoveRequested(fromIndex, toIndex);
event->acceptProposedAction();
}
GuiWorkAreaContainer::GuiWorkAreaContainer(GuiWorkArea * wa, QWidget * parent)
: QWidget(parent), wa_(wa)
{

View File

@ -276,33 +276,6 @@ private:
}; // TabWorkArea
class DragTabBar : public QTabBar
{
Q_OBJECT
public:
///
DragTabBar(QWidget * parent = 0);
protected:
///
void mousePressEvent(QMouseEvent * event);
///
void mouseMoveEvent(QMouseEvent * event);
///
void dragEnterEvent(QDragEnterEvent * event);
///
void dropEvent(QDropEvent * event);
private:
///
QPoint dragStartPos_;
Q_SIGNALS:
///
void tabMoveRequested(int fromIndex, int toIndex);
};
class GuiWorkAreaContainer : public QWidget, public Ui::WorkAreaUi
{
Q_OBJECT