diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index be25cf1..b9c9d8d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -26,7 +26,3 @@ qtmediate_add_library(${PROJECT_NAME} AUTOGEN SKIP_AUTOMOC collections global text PREFIX QM_CORE ) - -if(QT_VERSION_MAJOR GREATER_EQUAL 6) - qm_link_qt(${PROJECT_NAME} PUBLIC Core5Compat) -endif() \ No newline at end of file diff --git a/src/core/global/qmsystem.h b/src/core/global/qmsystem.h index ab7793c..58a350e 100644 --- a/src/core/global/qmsystem.h +++ b/src/core/global/qmsystem.h @@ -6,7 +6,6 @@ #include #include #include -#include #include diff --git a/src/core/text/qmsimplevarexp.cpp b/src/core/text/qmsimplevarexp.cpp index bae7875..9d9b213 100644 --- a/src/core/text/qmsimplevarexp.cpp +++ b/src/core/text/qmsimplevarexp.cpp @@ -110,7 +110,11 @@ static QString parseExpression(QString s, const QHash &vars, int lastIndex = 0; while ((index = s.indexOf(reg, index, &match)) != -1) { hasMatch = true; +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(s).sliced(lastIndex, index - lastIndex); +#else result += s.midRef(lastIndex, index - lastIndex); +#endif const auto &name = match.captured(1); QString val; @@ -125,7 +129,11 @@ static QString parseExpression(QString s, const QHash &vars, index += match.captured(0).size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(s).sliced(lastIndex); +#else result += s.midRef(lastIndex); +#endif s = result; } while (hasMatch); s.replace(QStringLiteral("$$"), QStringLiteral("$")); diff --git a/src/widgets/kernel/qmdecoratorv2.cpp b/src/widgets/kernel/qmdecoratorv2.cpp index d99a8a6..95cce4a 100644 --- a/src/widgets/kernel/qmdecoratorv2.cpp +++ b/src/widgets/kernel/qmdecoratorv2.cpp @@ -557,10 +557,14 @@ QString QMDecoratorV2Private::replaceFontSizes(const QString &stylesheet, double QString result; result.reserve(stylesheet.size()); while ((index = stylesheet.indexOf(re, index, &match)) != -1) { - result += stylesheet.midRef(lastIndex, index - lastIndex); - QString matchString = match.captured(1); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex, index - lastIndex); + double size = QStringView(matchString).sliced(0, matchString.size() - 2).toDouble(); +#else + result += stylesheet.midRef(lastIndex, index - lastIndex); double size = matchString.midRef(0, matchString.size() - 2).toDouble(); +#endif size *= ratio; QString valueString = QStringLiteral("font-size: ") + (rounding ? QString::number(int(size)) : QString::number(size)) + @@ -569,7 +573,11 @@ QString QMDecoratorV2Private::replaceFontSizes(const QString &stylesheet, double index += match.captured().size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex); +#else result += stylesheet.midRef(lastIndex); +#endif return result; } @@ -582,10 +590,15 @@ QString QMDecoratorV2Private::replaceSizes(const QString &stylesheet, double rat QString result; result.reserve(stylesheet.size()); while ((index = stylesheet.indexOf(re, index, &match)) != -1) { - result += stylesheet.midRef(lastIndex, index - lastIndex); - QString matchString = match.captured(); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex, index - lastIndex); + double size = QStringView(matchString).sliced(0, matchString.size() - 2).toDouble(); +#else + result += stylesheet.midRef(lastIndex, index - lastIndex); double size = matchString.midRef(0, matchString.size() - 2).toDouble(); +#endif + size *= ratio; QString valueString = (rounding ? QString::number(int(size)) : QString::number(size)) + QStringLiteral("px"); @@ -594,7 +607,11 @@ QString QMDecoratorV2Private::replaceSizes(const QString &stylesheet, double rat index += matchString.size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex); +#else result += stylesheet.midRef(lastIndex); +#endif return result; } @@ -610,7 +627,11 @@ QString QMDecoratorV2Private::replaceCustomKeyWithQProperty(const QString &style QString result; result.reserve(stylesheet.size()); while ((index = stylesheet.indexOf(re, index, &match)) != -1) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex, index - lastIndex); +#else result += stylesheet.midRef(lastIndex, index - lastIndex); +#endif QString matchString = match.captured(); int capturedIndex = match.capturedStart(2) - index; @@ -623,7 +644,11 @@ QString QMDecoratorV2Private::replaceCustomKeyWithQProperty(const QString &style index += matchString.size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex); +#else result += stylesheet.midRef(lastIndex); +#endif return result; } @@ -640,7 +665,11 @@ QString QMDecoratorV2Private::replaceCssGrammars(const QString &stylesheet) { int index = 0; int lastIndex = 0; while ((index = stylesheet.indexOf(re, index, &match)) != -1) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex, index - lastIndex); +#else result += stylesheet.midRef(lastIndex, index - lastIndex); +#endif QString matchString = match.captured(); QString valueString = QStringLiteral(":!") + match.captured(1).trimmed(); @@ -648,7 +677,11 @@ QString QMDecoratorV2Private::replaceCssGrammars(const QString &stylesheet) { index += matchString.size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex); +#else result += stylesheet.midRef(lastIndex); +#endif } // Replace "svg(...);" to "url(\"[[...]].svgx\");" @@ -671,12 +704,20 @@ QString QMDecoratorV2Private::removeAllComments(const QString &stylesheet) { QString result; result.reserve(stylesheet.size()); while ((index = stylesheet.indexOf(re, index, &match)) != -1) { +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex, index - lastIndex); +#else result += stylesheet.midRef(lastIndex, index - lastIndex); +#endif index += match.captured(0).size(); lastIndex = index; } +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + result += QStringView(stylesheet).sliced(lastIndex); +#else result += stylesheet.midRef(lastIndex); +#endif return result; } diff --git a/src/widgets/widgets/ccombobox.cpp b/src/widgets/widgets/ccombobox.cpp index d6fd7bf..f2c7073 100644 --- a/src/widgets/widgets/ccombobox.cpp +++ b/src/widgets/widgets/ccombobox.cpp @@ -2,8 +2,21 @@ #include -CComboBox::CComboBox(QWidget *parent) : QComboBox(parent), m_enableWheel(false) { +#ifdef Q_OS_WINDOWS +# include +#endif + +static CComboBox::CornerPreference g_defaultCornerPreference = CComboBox::RoundSmall; + +CComboBox::CComboBox(QWidget *parent) + : QComboBox(parent), m_enableWheel(false), m_cornerPreference(g_defaultCornerPreference) { setView(new QListView()); + +#ifdef Q_OS_WINDOWS + if (auto *popup = view()->parentWidget()) { + popup->setWindowFlag(Qt::NoDropShadowWindowHint, true); + } +#endif } CComboBox::~CComboBox() { @@ -17,8 +30,48 @@ void CComboBox::setEnableWheel(bool enableWheel) { m_enableWheel = enableWheel; } +void CComboBox::setDefaultCornerPreference(CornerPreference preference) { + g_defaultCornerPreference = preference; +} + +CComboBox::CornerPreference CComboBox::defaultCornerPreference() { + return g_defaultCornerPreference; +} + +void CComboBox::setCornerPreference(CornerPreference preference) { + m_cornerPreference = preference; +} + +CComboBox::CornerPreference CComboBox::cornerPreference() const { + return m_cornerPreference; +} + void CComboBox::wheelEvent(QWheelEvent *event) { if (m_enableWheel) { QComboBox::wheelEvent(event); } } + +void CComboBox::showPopup() { + QComboBox::showPopup(); + +#ifdef Q_OS_WINDOWS + QWidget *popup = view() ? view()->window() : nullptr; + if (!popup || !popup->winId()) + return; + + constexpr int mgn = 1; + constexpr int DWMWA_USE_IMMERSIVE_DARK_MODE_ = 20; + constexpr int DWMWA_WINDOW_CORNER_PREFERENCE_ = 33; + DWMNCRENDERINGPOLICY ncrp = DWMNCRP_ENABLED; + INT dwcp = m_cornerPreference; + UINT dark = 1; + MARGINS margins = {mgn, mgn, mgn, mgn}; + + HWND hwnd = reinterpret_cast(popup->winId()); + DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &ncrp, sizeof(ncrp)); + DwmExtendFrameIntoClientArea(hwnd, &margins); + DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE_, &dark, sizeof(dark)); + DwmSetWindowAttribute(hwnd, DWMWA_WINDOW_CORNER_PREFERENCE_, &dwcp, sizeof(dwcp)); +#endif +} diff --git a/src/widgets/widgets/ccombobox.h b/src/widgets/widgets/ccombobox.h index 2c16be1..95df659 100644 --- a/src/widgets/widgets/ccombobox.h +++ b/src/widgets/widgets/ccombobox.h @@ -7,18 +7,31 @@ class QM_WIDGETS_EXPORT CComboBox : public QComboBox { Q_OBJECT + Q_PROPERTY(CornerPreference cornerPreference READ cornerPreference WRITE setCornerPreference) + public: + enum CornerPreference { Default = 0, DoNotRound = 1, Round = 2, RoundSmall = 3 }; + Q_ENUM(CornerPreference) + explicit CComboBox(QWidget *parent = nullptr); ~CComboBox(); bool enableWheel() const; void setEnableWheel(bool enableWheel); + static void setDefaultCornerPreference(CornerPreference preference); + static CornerPreference defaultCornerPreference(); + + void setCornerPreference(CornerPreference preference); + CornerPreference cornerPreference() const; + protected: void wheelEvent(QWheelEvent *event) override; + void showPopup() override; private: bool m_enableWheel; + CornerPreference m_cornerPreference; }; #endif // CCOMBOBOX_H diff --git a/src/widgets/widgets/cmenu.cpp b/src/widgets/widgets/cmenu.cpp index 25aa03d..e10c78c 100644 --- a/src/widgets/widgets/cmenu.cpp +++ b/src/widgets/widgets/cmenu.cpp @@ -483,11 +483,14 @@ void QMenuPrivate::ScrollerTearOffItem::updateScrollerRects(const QRect &rect) { // CMenuImpl // ====================================================================================== +static CMenu::CornerPreference g_defaultCornerPreference = CMenu::RoundSmall; + class CMenuPrivate : public QObject { public: CMenu *q; + CMenu::CornerPreference cornerPreference; - CMenuPrivate(CMenu *q) : q(q) { + CMenuPrivate(CMenu *q) : q(q), cornerPreference(g_defaultCornerPreference) { // Initialize Font q->setFont(qApp->font()); @@ -533,7 +536,7 @@ class CMenuPrivate : public QObject { constexpr int DWMWA_USE_IMMERSIVE_DARK_MODE_ = 20; constexpr int DWMWA_WINDOW_CORNER_PREFERENCE_ = 33; DWMNCRENDERINGPOLICY ncrp = DWMNCRP_ENABLED; - /*DWM_WINDOW_CORNER_PREFERENCE*/ INT dwcp = /*DWMWCP_ROUNDSMALL*/ 3; + INT dwcp = cornerPreference; UINT dark = 1; MARGINS margins = {mgn, mgn, mgn, mgn}; Q_ASSERT(this->q->winId()); @@ -553,7 +556,7 @@ class CMenuPrivate : public QObject { DwmSetWindowAttribute(reinterpret_cast(this->q->winId()), DWMWA_WINDOW_CORNER_PREFERENCE_, &dwcp, sizeof(dwcp)); // Disconnect this connection, don't run again - disconnect(q, &CMenu::aboutToShow, this, &CMenuPrivate::_q_menuFirstAboutToShow); + // disconnect(q, &CMenu::aboutToShow, this, &CMenuPrivate::_q_menuFirstAboutToShow); } #endif }; @@ -569,6 +572,22 @@ CMenu::~CMenu() { delete d; } +void CMenu::setDefaultCornerPreference(CornerPreference preference) { + g_defaultCornerPreference = preference; +} + +CMenu::CornerPreference CMenu::defaultCornerPreference() { + return g_defaultCornerPreference; +} + +void CMenu::setCornerPreference(CornerPreference preference) { + d->cornerPreference = preference; +} + +CMenu::CornerPreference CMenu::cornerPreference() const { + return d->cornerPreference; +} + bool CMenu::event(QEvent *event) { switch (event->type()) { case QEvent::ActionAdded: diff --git a/src/widgets/widgets/cmenu.h b/src/widgets/widgets/cmenu.h index beaba33..061c90e 100644 --- a/src/widgets/widgets/cmenu.h +++ b/src/widgets/widgets/cmenu.h @@ -9,11 +9,22 @@ class CMenuPrivate; class QM_WIDGETS_EXPORT CMenu : public QMenu { Q_OBJECT + Q_PROPERTY(CornerPreference cornerPreference READ cornerPreference WRITE setCornerPreference) + public: + enum CornerPreference { Default = 0, DoNotRound = 1, Round = 2, RoundSmall = 3 }; + Q_ENUM(CornerPreference) + explicit CMenu(QWidget *parent = nullptr); explicit CMenu(const QString &title, QWidget *parent = nullptr); ~CMenu(); + static void setDefaultCornerPreference(CornerPreference preference); + static CornerPreference defaultCornerPreference(); + + void setCornerPreference(CornerPreference preference); + CornerPreference cornerPreference() const; + protected: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; diff --git a/src/widgets/widgettools/cnavframe.cpp b/src/widgets/widgettools/cnavframe.cpp index d92ffe7..15dd397 100644 --- a/src/widgets/widgettools/cnavframe.cpp +++ b/src/widgets/widgettools/cnavframe.cpp @@ -51,11 +51,9 @@ CNavFrame::CNavFrame(QWidget *parent) : QFrame(parent), d_ptr(new CNavFramePriva // Left d->buttonLayout = new QVBoxLayout(); - d->buttonLayout->setMargin(0); d->buttonLayout->setSpacing(0); d->leftLayout = new QVBoxLayout(); - d->leftLayout->setMargin(0); d->leftLayout->setSpacing(0); d->leftLayout->addLayout(d->buttonLayout); @@ -67,7 +65,6 @@ CNavFrame::CNavFrame(QWidget *parent) : QFrame(parent), d_ptr(new CNavFramePriva // Right d->stack = new QStackedLayout(); - d->stack->setMargin(0); d->rightFrame = new QFrame(); d->rightFrame->setObjectName("right-frame"); @@ -84,9 +81,20 @@ CNavFrame::CNavFrame(QWidget *parent) : QFrame(parent), d_ptr(new CNavFramePriva d->splitter->setStretchFactor(1, 1); d->layout = new QHBoxLayout(); - d->layout->setMargin(0); d->layout->setSpacing(0); +#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) + d->buttonLayout->setContentsMargins({}); + d->leftLayout->setContentsMargins({}); + d->stack->setContentsMargins({}); + d->layout->setContentsMargins({}); +#else + d->buttonLayout->setMargin(0); + d->leftLayout->setMargin(0); + d->stack->setMargin(0); + d->layout->setMargin(0); +#endif + d->layout->addWidget(d->splitter); setLayout(d->layout);