From 0a3c6e29c7fd9ab3d28462a32bee42219b2a09fc Mon Sep 17 00:00:00 2001 From: fourtf Date: Wed, 17 Jan 2018 01:19:42 +0100 Subject: [PATCH] added Alt+LeftClick to move splits around --- src/singletons/thememanager.cpp | 11 +++-- src/widgets/helper/channelview.cpp | 21 +++++++++ src/widgets/helper/notebooktab.cpp | 14 +++--- src/widgets/helper/splitheader.cpp | 28 +----------- src/widgets/split.cpp | 68 ++++++++++++++++++++++++++++++ src/widgets/split.hpp | 7 +++ src/widgets/splitcontainer.cpp | 1 + 7 files changed, 113 insertions(+), 37 deletions(-) diff --git a/src/singletons/thememanager.cpp b/src/singletons/thememanager.cpp index 6164c49bc..c729d04b3 100644 --- a/src/singletons/thememanager.cpp +++ b/src/singletons/thememanager.cpp @@ -96,15 +96,14 @@ void ThemeManager::actuallyUpdate(double hue, double multiplier) this->tabs.newMessage = { tabFg, - {QBrush(blendColors(themeColor, windowBg, 0.5), Qt::DiagCrossPattern), - QBrush(blendColors(themeColor, windowBg, 0.3), Qt::DiagCrossPattern), - QBrush(blendColors(themeColorNoSat, windowBg, 0.5), Qt::DiagCrossPattern)}}; + {QBrush(blendColors(themeColor, windowBg, 0.7), Qt::FDiagPattern), + QBrush(blendColors(themeColor, windowBg, 0.5), Qt::FDiagPattern), + QBrush(blendColors(themeColorNoSat, windowBg, 0.7), Qt::FDiagPattern)}}; this->tabs.highlighted = { tabFg, - {QBrush(blendColors(themeColor, windowBg, 0.5), Qt::DiagCrossPattern), - QBrush(blendColors(themeColor, windowBg, 0.3), Qt::DiagCrossPattern), - QBrush(blendColors(themeColorNoSat, windowBg, 0.5), Qt::DiagCrossPattern)}}; + {blendColors(themeColor, windowBg, 0.7), blendColors(themeColor, windowBg, 0.5), + blendColors(themeColorNoSat, windowBg, 0.7)}}; // Split bool flat = isLight; diff --git a/src/widgets/helper/channelview.cpp b/src/widgets/helper/channelview.cpp index a02dfab3f..d02b285b0 100644 --- a/src/widgets/helper/channelview.cpp +++ b/src/widgets/helper/channelview.cpp @@ -582,6 +582,13 @@ void ChannelView::leaveEvent(QEvent *) void ChannelView::mouseMoveEvent(QMouseEvent *event) { + if (event->modifiers() & (Qt::AltModifier | Qt::ControlModifier)) { + this->unsetCursor(); + + event->ignore(); + return; + } + if (singletons::SettingManager::getInstance().pauseChatHover.getValue()) { this->pause(300); } @@ -639,6 +646,13 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) void ChannelView::mousePressEvent(QMouseEvent *event) { + if (event->modifiers() & (Qt::AltModifier | Qt::ControlModifier)) { + this->unsetCursor(); + + event->ignore(); + return; + } + if (singletons::SettingManager::getInstance().linksDoubleClickOnly.getValue()) { this->pause(200); } @@ -689,6 +703,13 @@ void ChannelView::mousePressEvent(QMouseEvent *event) void ChannelView::mouseReleaseEvent(QMouseEvent *event) { + if (event->modifiers() & (Qt::AltModifier | Qt::ControlModifier)) { + this->unsetCursor(); + + event->ignore(); + return; + } + if (!this->isMouseDown) { // We didn't grab the mouse press, so we shouldn't be handling the mouse // release diff --git a/src/widgets/helper/notebooktab.cpp b/src/widgets/helper/notebooktab.cpp index 3de2674de..b7e2eef85 100644 --- a/src/widgets/helper/notebooktab.cpp +++ b/src/widgets/helper/notebooktab.cpp @@ -1,4 +1,4 @@ -//#include "widgets/helper/notebooktab.hpp" +#include "widgets/helper/notebooktab.hpp" #include "common.hpp" #include "debug/log.hpp" #include "singletons/settingsmanager.hpp" @@ -167,6 +167,7 @@ void NotebookTab::paintEvent(QPaintEvent *) // select the right tab colors singletons::ThemeManager::TabColors colors; + singletons::ThemeManager::TabColors regular = this->themeManager.tabs.regular; if (this->selected) { colors = this->themeManager.tabs.selected; @@ -181,11 +182,14 @@ void NotebookTab::paintEvent(QPaintEvent *) bool windowFocused = this->window() == QApplication::activeWindow(); // || SettingsDialog::getHandle() == QApplication::activeWindow(); + painter.fillRect(rect(), this->mouseOver ? regular.backgrounds.hover + : (windowFocused ? regular.backgrounds.regular + : regular.backgrounds.unfocused)); + // fill the tab background - painter.fillRect(rect(), - this->mouseOver ? colors.backgrounds.hover - : (windowFocused ? colors.backgrounds.regular - : colors.backgrounds.unfocused)); + painter.fillRect(rect(), this->mouseOver ? colors.backgrounds.hover + : (windowFocused ? colors.backgrounds.regular + : colors.backgrounds.unfocused)); // set the pen color painter.setPen(colors.text); diff --git a/src/widgets/helper/splitheader.cpp b/src/widgets/helper/splitheader.cpp index 6f2c21207..21815a378 100644 --- a/src/widgets/helper/splitheader.cpp +++ b/src/widgets/helper/splitheader.cpp @@ -184,32 +184,8 @@ void SplitHeader::mouseMoveEvent(QMouseEvent *event) if (this->dragging) { if (std::abs(this->dragStart.x() - event->pos().x()) > 12 || std::abs(this->dragStart.y() - event->pos().y()) > 12) { - auto page = static_cast(this->split->parentWidget()); - - if (page != nullptr) { - SplitContainer::isDraggingSplit = true; - SplitContainer::draggingSplit = this->split; - - auto originalLocation = page->removeFromLayout(this->split); - - // page->update(); - - QDrag *drag = new QDrag(this->split); - QMimeData *mimeData = new QMimeData; - - mimeData->setData("chatterino/split", "xD"); - - drag->setMimeData(mimeData); - - Qt::DropAction dropAction = drag->exec(Qt::MoveAction); - - if (dropAction == Qt::IgnoreAction) { - page->addToLayout(this->split, originalLocation); - } - - SplitContainer::isDraggingSplit = false; - this->dragging = false; - } + this->split->drag(); + this->dragging = false; } } } diff --git a/src/widgets/split.cpp b/src/widgets/split.cpp index d7900f1e5..7fc208f3a 100644 --- a/src/widgets/split.cpp +++ b/src/widgets/split.cpp @@ -16,10 +16,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -49,6 +51,8 @@ Split::Split(SplitContainer *parent, const std::string &_uuid) , flexSizeX(1) , flexSizeY(1) { + this->setMouseTracking(true); + this->vbox.setSpacing(0); this->vbox.setMargin(1); @@ -234,6 +238,43 @@ void Split::paintEvent(QPaintEvent *) painter.fillRect(this->rect(), this->themeManager.splits.background); } +void Split::mouseMoveEvent(QMouseEvent *event) +{ + this->handleModifiers(event, event->modifiers()); +} + +void Split::mousePressEvent(QMouseEvent *event) +{ + if (event->buttons() == Qt::LeftButton && event->modifiers() & Qt::AltModifier) { + this->drag(); + } +} + +void Split::keyPressEvent(QKeyEvent *event) +{ + this->view.unsetCursor(); + this->handleModifiers(event, event->modifiers()); +} + +void Split::keyReleaseEvent(QKeyEvent *event) +{ + this->view.unsetCursor(); + this->handleModifiers(event, event->modifiers()); +} + +void Split::handleModifiers(QEvent *event, Qt::KeyboardModifiers modifiers) +{ + if (modifiers == Qt::AltModifier) { + this->setCursor(Qt::SizeAllCursor); + event->accept(); + // } else if (modifiers == Qt::ControlModifier) { + // this->setCursor(Qt::SplitHCursor); + // event->accept(); + } else { + this->setCursor(Qt::ArrowCursor); + } +} + /// Slots void Split::doAddSplit() { @@ -509,5 +550,32 @@ void Split::doDecFlexY() { this->setFlexSizeY(this->getFlexSizeY() * (1 / 1.2)); } + +void Split::drag() +{ + auto container = dynamic_cast(this->parentWidget()); + + if (container != nullptr) { + SplitContainer::isDraggingSplit = true; + SplitContainer::draggingSplit = this; + + auto originalLocation = container->removeFromLayout(this); + + QDrag *drag = new QDrag(this); + QMimeData *mimeData = new QMimeData; + + mimeData->setData("chatterino/split", "xD"); + + drag->setMimeData(mimeData); + + Qt::DropAction dropAction = drag->exec(Qt::MoveAction); + + if (dropAction == Qt::IgnoreAction) { + container->addToLayout(this, originalLocation); + } + + SplitContainer::isDraggingSplit = false; + } +} } // namespace widgets } // namespace chatterino diff --git a/src/widgets/split.hpp b/src/widgets/split.hpp index 718b45272..83587d073 100644 --- a/src/widgets/split.hpp +++ b/src/widgets/split.hpp @@ -68,8 +68,14 @@ public: void layoutMessages(); void updateGifEmotes(); + void drag(); + protected: virtual void paintEvent(QPaintEvent *) override; + virtual void mouseMoveEvent(QMouseEvent *) override; + virtual void mousePressEvent(QMouseEvent *event) override; + virtual void keyPressEvent(QKeyEvent *) override; + virtual void keyReleaseEvent(QKeyEvent *) override; private: SplitContainer &parentPage; @@ -87,6 +93,7 @@ private: void setChannel(SharedChannel newChannel); void doOpenAccountPopupWidget(AccountPopupWidget *widget, QString user); void channelNameUpdated(const std::string &newChannelName); + void handleModifiers(QEvent *event, Qt::KeyboardModifiers modifiers); public slots: // Add new split to the notebook page that this chat widget is in diff --git a/src/widgets/splitcontainer.cpp b/src/widgets/splitcontainer.cpp index 590cd7342..abce8c66a 100644 --- a/src/widgets/splitcontainer.cpp +++ b/src/widgets/splitcontainer.cpp @@ -2,6 +2,7 @@ #include "common.hpp" #include "singletons/thememanager.hpp" #include "util/helpers.hpp" +#include "util/layoutcreator.hpp" #include "widgets/helper/notebooktab.hpp" #include "widgets/notebook.hpp" #include "widgets/split.hpp"