diff --git a/CMakeLists.txt b/CMakeLists.txt index c8721624..d62d2f85 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -157,6 +157,8 @@ target_sources( lib/utils/backup.hpp lib/utils/curl-helper.cpp lib/utils/curl-helper.hpp + lib/utils/cursor-shape-changer.cpp + lib/utils/cursor-shape-changer.hpp lib/utils/double-slider.cpp lib/utils/double-slider.hpp lib/utils/duration-control.cpp diff --git a/lib/macro/macro-tab.cpp b/lib/macro/macro-tab.cpp index 50ead5af..1edae7cf 100644 --- a/lib/macro/macro-tab.cpp +++ b/lib/macro/macro-tab.cpp @@ -1,5 +1,6 @@ #include "advanced-scene-switcher.hpp" #include "action-queue.hpp" +#include "cursor-shape-changer.hpp" #include "macro-action-edit.hpp" #include "macro-condition-edit.hpp" #include "macro-export-import-dialog.hpp" @@ -956,6 +957,22 @@ void AdvSceneSwitcher::SetupMacroTab() moveControlsToSplitter(ui->macroElseActionSplitter, 1, ui->macroActionsLayout->takeAt(1)); + // Override splitter cursor icon when hovering over controls in splitter + SetCursorOnWidgetHover(ui->conditionAdd, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->conditionRemove, + Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->conditionTop, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->conditionUp, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->conditionDown, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->conditionBottom, + Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionAdd, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionRemove, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionTop, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionUp, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionDown, Qt::CursorShape::ArrowCursor); + SetCursorOnWidgetHover(ui->actionBottom, Qt::CursorShape::ArrowCursor); + // Reserve more space for macro edit area than for the macro list ui->macroListMacroEditSplitter->setStretchFactor(0, 1); ui->macroListMacroEditSplitter->setStretchFactor(1, 4); diff --git a/lib/utils/cursor-shape-changer.cpp b/lib/utils/cursor-shape-changer.cpp new file mode 100644 index 00000000..3e0ec623 --- /dev/null +++ b/lib/utils/cursor-shape-changer.cpp @@ -0,0 +1,34 @@ +#include "cursor-shape-changer.hpp" + +#include +#include +#include + +namespace advss { + +CursorShapeChanger::CursorShapeChanger(QObject *parent, Qt::CursorShape shape) + : QObject(parent), + _shape(shape) +{ +} + +bool CursorShapeChanger::eventFilter(QObject *o, QEvent *e) +{ + if ((e->type() == QEvent::HoverEnter || e->type() == QEvent::Enter) && + !_overrideActive) { + _overrideActive = true; + QGuiApplication::setOverrideCursor(QCursor(_shape)); + } else if (_overrideActive && e->type() == QEvent::Leave) { + _overrideActive = false; + QGuiApplication::restoreOverrideCursor(); + } + + return QObject::eventFilter(o, e); +} + +void SetCursorOnWidgetHover(QWidget *widget, Qt::CursorShape shape) +{ + widget->installEventFilter(new CursorShapeChanger(widget, shape)); +} + +} // namespace advss diff --git a/lib/utils/cursor-shape-changer.hpp b/lib/utils/cursor-shape-changer.hpp new file mode 100644 index 00000000..f1f03b1b --- /dev/null +++ b/lib/utils/cursor-shape-changer.hpp @@ -0,0 +1,20 @@ +#pragma once +#include + +namespace advss { + +class CursorShapeChanger : public QObject { +public: + CursorShapeChanger(QObject *, Qt::CursorShape shape); + +protected: + bool eventFilter(QObject *o, QEvent *e) override; + +private: + Qt::CursorShape _shape; + std::atomic_bool _overrideActive = {false}; +}; + +void SetCursorOnWidgetHover(QWidget *widget, Qt::CursorShape shape); + +} // namespace advss diff --git a/lib/utils/list-controls.cpp b/lib/utils/list-controls.cpp index 44818903..1daadee9 100644 --- a/lib/utils/list-controls.cpp +++ b/lib/utils/list-controls.cpp @@ -37,7 +37,7 @@ void ListControls::AddActionHelper(const char *theme, const char *tooltip, auto button = new QToolButton(this); button->setToolTip(obs_module_text(tooltip)); button->setProperty("themeID", QVariant(QString(theme))); - auto action = addWidget(button); + (void)addWidget(button); button->connect(button, &QToolButton::clicked, this, signal); }