diff --git a/include/MainWindow.h b/include/MainWindow.h index 6c140a1e61d..1330de8c5cb 100644 --- a/include/MainWindow.h +++ b/include/MainWindow.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "ConfigManager.h" @@ -57,7 +58,7 @@ class MainWindow : public QMainWindow public: QMdiArea* workspace() { - return m_workspace; + return static_cast(m_workspace); } QWidget* toolBar() @@ -203,7 +204,22 @@ private slots: bool guiSaveProject(); bool guiSaveProjectAs( const QString & filename ); - QMdiArea * m_workspace; + class MovableQMdiArea : public QMdiArea + { + public: + MovableQMdiArea(QWidget* parent = nullptr); + ~MovableQMdiArea() {} + protected: + void mousePressEvent(QMouseEvent* event) override; + void mouseMoveEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + private: + bool m_isBeingMoved; + int m_lastX; + int m_lastY; + }; + + MovableQMdiArea * m_workspace; QWidget * m_toolBar; QGridLayout * m_toolBarLayout; @@ -258,7 +274,6 @@ private slots: } ; - } // namespace gui } // namespace lmms diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 48d2ddb3025..18c33d616c8 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -159,7 +159,7 @@ MainWindow::MainWindow() : sideBar->appendTab(new FileBrowser(root_paths.join("*"), FileItem::defaultFilters(), title, embed::getIconPixmap("computer").transformed(QTransform().rotate(90)), splitter, dirs_as_items)); - m_workspace = new QMdiArea(splitter); + m_workspace = new MovableQMdiArea(splitter); // Load background emit initProgress(tr("Loading background picture")); @@ -531,8 +531,6 @@ void MainWindow::finalize() } - - int MainWindow::addWidgetToToolBar( QWidget * _w, int _row, int _col ) { int col = ( _col == -1 ) ? m_toolBarLayout->columnCount() + 7 : _col; @@ -1611,5 +1609,43 @@ void MainWindow::onProjectFileNameChanged() this->resetWindowTitle(); } +MainWindow::MovableQMdiArea::MovableQMdiArea(QWidget* parent) : + QMdiArea(parent), + m_isBeingMoved(false), + m_lastX(0), + m_lastY(0) +{} + +void MainWindow::MovableQMdiArea::mousePressEvent(QMouseEvent* event) +{ + m_lastX = event->x(); + m_lastY = event->y(); + m_isBeingMoved = true; + setCursor(Qt::ClosedHandCursor); +} + +void MainWindow::MovableQMdiArea::mouseMoveEvent(QMouseEvent* event) +{ + if (m_isBeingMoved == false) { return; } + + + if (m_lastX != event->x()) + { + horizontalScrollBar()->setValue(horizontalScrollBar()->value() + m_lastX - event->x()); + m_lastX = event->x(); + } + + if (m_lastY != event->y()) + { + verticalScrollBar()->setValue(verticalScrollBar()->value() + m_lastY - event->y()); + m_lastY = event->y(); + } +} + +void MainWindow::MovableQMdiArea::mouseReleaseEvent(QMouseEvent* event) +{ + setCursor(Qt::ArrowCursor); + m_isBeingMoved = false; +} } // namespace lmms::gui