diff --git a/CMakeLists.txt b/CMakeLists.txt index 0e6e7236..68d9b45f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,6 +268,8 @@ target_sources( src/utils/slider-spinbox.hpp src/utils/source-selection.cpp src/utils/source-selection.hpp + src/utils/striped-frame.cpp + src/utils/striped-frame.hpp src/utils/transition-selection.cpp src/utils/transition-selection.hpp src/utils/utility.cpp diff --git a/src/macro-core/macro-condition-cursor.cpp b/src/macro-core/macro-condition-cursor.cpp index 6c2ee651..09a16de8 100644 --- a/src/macro-core/macro-condition-cursor.cpp +++ b/src/macro-core/macro-condition-cursor.cpp @@ -334,18 +334,20 @@ void MacroConditionCursorEdit::SetupFrame() Qt::WindowStaysOnTopHint); _frame.setAttribute(Qt::WA_TranslucentBackground, true); - if (_entryData) { - QRect rect(_entryData->_minX, _entryData->_minY, - _entryData->_maxX - _entryData->_minX, - _entryData->_maxY - _entryData->_minY); - - if (rect.size().height() == 0 || rect.size().width() == 0) { - _frame.setGeometry(0, 0, 1, 1); - return; - } - - _frame.setGeometry(getScreenUnionRect().intersected(rect)); + if (!_entryData) { + return; } + + QRect rect(_entryData->_minX, _entryData->_minY, + _entryData->_maxX - _entryData->_minX, + _entryData->_maxY - _entryData->_minY); + + if (rect.size().height() <= 0 || rect.size().width() <= 0) { + _frame.setGeometry(0, 0, 1, 1); + return; + } + + _frame.setGeometry(getScreenUnionRect().intersected(rect)); } void MacroConditionCursorEdit::UpdateEntryData() diff --git a/src/macro-core/macro-condition-cursor.hpp b/src/macro-core/macro-condition-cursor.hpp index 46b5d8aa..6a7e0803 100644 --- a/src/macro-core/macro-condition-cursor.hpp +++ b/src/macro-core/macro-condition-cursor.hpp @@ -1,11 +1,11 @@ #pragma once #include "macro.hpp" +#include "striped-frame.hpp" #include #include #include #include -#include class MacroConditionCursor : public MacroCondition { public: @@ -86,6 +86,6 @@ private: void SetWidgetVisibility(); void SetupFrame(); QTimer _timer; - QFrame _frame; + StripedFrame _frame; bool _loading = true; }; diff --git a/src/utils/striped-frame.cpp b/src/utils/striped-frame.cpp new file mode 100644 index 00000000..1656d2de --- /dev/null +++ b/src/utils/striped-frame.cpp @@ -0,0 +1,37 @@ +#include "striped-frame.hpp" + +#include + +constexpr QColor stripeColor = QColor(255, 255, 255, 50); +constexpr int stripeWidth = 30; +constexpr int stripeSpacing = 30; +constexpr qreal sqrtOf2 = 1.41421356237309; +constexpr int painterVerticalOffset = stripeWidth / sqrtOf2 + 1; +constexpr int rotatedPainterSpacing = + (stripeWidth + stripeSpacing) / sqrtOf2 + 1; +constexpr qreal horizontalMoveStep = stripeWidth + stripeSpacing; +constexpr qreal verticalMoveStep = -horizontalMoveStep; + +void StripedFrame::paintEvent(QPaintEvent *event) +{ + QFrame::paintEvent(event); + + QPainter painter(this); + painter.setPen(Qt::NoPen); + painter.setBrush(stripeColor); + + const int biggerSideSize = width() > height() ? width() : height(); + const int numStripes = biggerSideSize / rotatedPainterSpacing + 1; + + painter.translate(0, -painterVerticalOffset); + painter.rotate(45); + + const qreal diagonalLength = + std::sqrt(width() * width() + height() * height()); + const qreal stripeLength = diagonalLength * 2; + + for (int i = 0; i < numStripes; ++i) { + painter.drawRect(0, 0, stripeWidth, stripeLength); + painter.translate(horizontalMoveStep, verticalMoveStep); + } +} diff --git a/src/utils/striped-frame.hpp b/src/utils/striped-frame.hpp new file mode 100644 index 00000000..f972bd08 --- /dev/null +++ b/src/utils/striped-frame.hpp @@ -0,0 +1,11 @@ +#pragma once +#include +#include + +class StripedFrame : public QFrame { +public: + StripedFrame(QWidget *parent = nullptr) : QFrame(parent) {} + +protected: + void paintEvent(QPaintEvent *event) override; +};