forked from github_mirror/framelesshelper
quick module: minor improvements
Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
parent
201f54e7a5
commit
8460995d7f
|
@ -20,8 +20,13 @@ TODO
|
||||||
|
|
||||||
## Roadmap
|
## Roadmap
|
||||||
|
|
||||||
|
- 2.1
|
||||||
|
- [ ] All: Add cross-platform system menu for both Qt Widgets and Qt Quick. Support both light and dark theme. Can be triggered by right-clicking on the title bar area or pressing the system menu shortcut (ALT + SPACE).
|
||||||
|
- [ ] All: Add QtWebEngine demo applications for both Qt Widgets and Qt Quick.
|
||||||
|
- [ ] All: Make more settings and options configurable through environment variables and configuration files.
|
||||||
|
- Future versions
|
||||||
- [ ] Windows: Maximize button docking feature introduced in Windows 11
|
- [ ] Windows: Maximize button docking feature introduced in Windows 11
|
||||||
- [ ] All: Add cross-platform system menu. Support both light and dark theme. Can be triggered by right-click on the title bar area.
|
- [ ] More feature requests are welcome!
|
||||||
|
|
||||||
## Feedback
|
## Feedback
|
||||||
|
|
||||||
|
|
|
@ -56,12 +56,56 @@
|
||||||
static_cast<FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Enum>(static_cast<int>(Value))
|
static_cast<FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Enum>(static_cast<int>(Value))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef FRAMELESSHELPER_FLAGS_CORE_TO_QUICK
|
||||||
|
# define FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Enum, Value, In, Out) \
|
||||||
|
if (In & FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Enum::Value) { \
|
||||||
|
Out |= FRAMELESSHELPER_PREPEND_NAMESPACE(QuickGlobal)::Enum::Value; \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef FRAMELESSHELPER_FLAGS_QUICK_TO_CORE
|
||||||
|
# define FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Enum, Value, In, Out) \
|
||||||
|
if (In & FRAMELESSHELPER_PREPEND_NAMESPACE(QuickGlobal)::Enum::Value) { \
|
||||||
|
Out |= FRAMELESSHELPER_PREPEND_NAMESPACE(Global)::Enum::Value; \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
FRAMELESSHELPER_BEGIN_NAMESPACE
|
FRAMELESSHELPER_BEGIN_NAMESPACE
|
||||||
|
|
||||||
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_QUICK_URI[] = "org.wangwenx190.FramelessHelper";
|
[[maybe_unused]] static constexpr const char FRAMELESSHELPER_QUICK_URI[] = "org.wangwenx190.FramelessHelper";
|
||||||
|
|
||||||
struct FRAMELESSHELPER_QUICK_API QuickGlobal
|
struct FRAMELESSHELPER_QUICK_API QuickGlobal
|
||||||
{
|
{
|
||||||
|
enum class Option
|
||||||
|
{
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, ForceHideWindowFrameBorder)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, ForceShowWindowFrameBorder)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontDrawTopWindowFrameBorder)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, EnableRoundedWindowCorners)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, TransparentWindowBackground)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, MaximizeButtonDocking)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, CreateStandardWindowLayout)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, BeCompatibleWithQtFramelessWindowHint)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchQtInternals)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchWindowFrameBorderColor)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontInstallSystemMenuHook)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DisableSystemMenu)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, NoDoubleClickMaximizeToggle)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DisableResizing)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DisableDragging)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchCursorShape)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontMoveWindowToDesktopCenter)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTreatFullScreenAsZoomed)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchHighDpiScalingPolicy)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchScaleFactorRoundingPolicy)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontTouchProcessDpiAwarenessLevel)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, DontEnsureNonNativeWidgetSiblings)
|
||||||
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(Option, SyncNativeControlsThemeWithSystem)
|
||||||
|
};
|
||||||
|
Q_ENUM(Option)
|
||||||
|
Q_DECLARE_FLAGS(Options, Option)
|
||||||
|
Q_FLAG(Options)
|
||||||
|
|
||||||
enum class SystemTheme
|
enum class SystemTheme
|
||||||
{
|
{
|
||||||
FRAMELESSHELPER_QUICK_ENUM_VALUE(SystemTheme, Unknown)
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(SystemTheme, Unknown)
|
||||||
|
@ -93,7 +137,7 @@ struct FRAMELESSHELPER_QUICK_API QuickGlobal
|
||||||
|
|
||||||
enum class DwmColorizationArea
|
enum class DwmColorizationArea
|
||||||
{
|
{
|
||||||
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, None_) // Avoid name conflicts with X11 headers.
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, None_)
|
||||||
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, StartMenu_TaskBar_ActionCenter)
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, StartMenu_TaskBar_ActionCenter)
|
||||||
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, TitleBar_WindowBorder)
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, TitleBar_WindowBorder)
|
||||||
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, All)
|
FRAMELESSHELPER_QUICK_ENUM_VALUE(DwmColorizationArea, All)
|
||||||
|
@ -128,7 +172,8 @@ private:
|
||||||
#ifdef QML_UNCREATABLE
|
#ifdef QML_UNCREATABLE
|
||||||
QML_UNCREATABLE("The FramelessHelper namespace is not creatable, you can only use it to access it's enums.")
|
QML_UNCREATABLE("The FramelessHelper namespace is not creatable, you can only use it to access it's enums.")
|
||||||
#endif
|
#endif
|
||||||
Q_DISABLE_COPY_MOVE(QuickGlobal)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Q_DECLARE_OPERATORS_FOR_FLAGS(QuickGlobal::Options)
|
||||||
|
|
||||||
FRAMELESSHELPER_END_NAMESPACE
|
FRAMELESSHELPER_END_NAMESPACE
|
||||||
|
|
|
@ -47,6 +47,7 @@ class FRAMELESSHELPER_QUICK_API FramelessQuickWindow : public QQuickWindow
|
||||||
Q_PROPERTY(bool fullScreen READ isFullScreen NOTIFY fullScreenChanged FINAL)
|
Q_PROPERTY(bool fullScreen READ isFullScreen NOTIFY fullScreenChanged FINAL)
|
||||||
Q_PROPERTY(bool fixedSize READ fixedSize WRITE setFixedSize NOTIFY fixedSizeChanged FINAL)
|
Q_PROPERTY(bool fixedSize READ fixedSize WRITE setFixedSize NOTIFY fixedSizeChanged FINAL)
|
||||||
Q_PROPERTY(QColor frameBorderColor READ frameBorderColor NOTIFY frameBorderColorChanged FINAL)
|
Q_PROPERTY(QColor frameBorderColor READ frameBorderColor NOTIFY frameBorderColorChanged FINAL)
|
||||||
|
Q_PROPERTY(QuickGlobal::Options options READ options WRITE setOptions NOTIFY optionsChanged FINAL)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit FramelessQuickWindow(QWindow *parent = nullptr, const Global::UserSettings &settings = {});
|
explicit FramelessQuickWindow(QWindow *parent = nullptr, const Global::UserSettings &settings = {});
|
||||||
|
@ -63,6 +64,9 @@ public:
|
||||||
|
|
||||||
Q_NODISCARD QColor frameBorderColor() const;
|
Q_NODISCARD QColor frameBorderColor() const;
|
||||||
|
|
||||||
|
Q_NODISCARD QuickGlobal::Options options() const;
|
||||||
|
void setOptions(const QuickGlobal::Options value);
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void showMinimized2();
|
void showMinimized2();
|
||||||
void toggleMaximized();
|
void toggleMaximized();
|
||||||
|
@ -85,6 +89,7 @@ Q_SIGNALS:
|
||||||
void fixedSizeChanged();
|
void fixedSizeChanged();
|
||||||
void frameBorderColorChanged();
|
void frameBorderColorChanged();
|
||||||
void systemButtonStateChanged(const QuickGlobal::SystemButtonType, const QuickGlobal::ButtonState);
|
void systemButtonStateChanged(const QuickGlobal::SystemButtonType, const QuickGlobal::ButtonState);
|
||||||
|
void optionsChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QScopedPointer<FramelessQuickWindowPrivate> d_ptr;
|
QScopedPointer<FramelessQuickWindowPrivate> d_ptr;
|
||||||
|
|
|
@ -57,6 +57,7 @@ void FramelessHelper::Quick::registerTypes(QQmlEngine *engine)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
inited = true;
|
inited = true;
|
||||||
|
qRegisterMetaType<QuickGlobal::Options>();
|
||||||
qRegisterMetaType<QuickGlobal::SystemTheme>();
|
qRegisterMetaType<QuickGlobal::SystemTheme>();
|
||||||
qRegisterMetaType<QuickGlobal::SystemButtonType>();
|
qRegisterMetaType<QuickGlobal::SystemButtonType>();
|
||||||
qRegisterMetaType<QuickGlobal::ResourceType>();
|
qRegisterMetaType<QuickGlobal::ResourceType>();
|
||||||
|
|
|
@ -36,6 +36,64 @@ using namespace Global;
|
||||||
|
|
||||||
static constexpr const char QT_QUICKITEM_CLASS_NAME[] = "QQuickItem";
|
static constexpr const char QT_QUICKITEM_CLASS_NAME[] = "QQuickItem";
|
||||||
|
|
||||||
|
[[nodiscard]] static inline QuickGlobal::Options optionsCoreToQuick(const Options value)
|
||||||
|
{
|
||||||
|
QuickGlobal::Options result = {};
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, ForceHideWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, ForceShowWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontDrawTopWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, EnableRoundedWindowCorners, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, TransparentWindowBackground, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, MaximizeButtonDocking, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, CreateStandardWindowLayout, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, BeCompatibleWithQtFramelessWindowHint, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchQtInternals, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchWindowFrameBorderColor, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontInstallSystemMenuHook, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DisableSystemMenu, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, NoDoubleClickMaximizeToggle, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DisableResizing, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DisableDragging, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchCursorShape, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontMoveWindowToDesktopCenter, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTreatFullScreenAsZoomed, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchHighDpiScalingPolicy, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchScaleFactorRoundingPolicy, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontTouchProcessDpiAwarenessLevel, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, DontEnsureNonNativeWidgetSiblings, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_CORE_TO_QUICK(Option, SyncNativeControlsThemeWithSystem, value, result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] static inline Options optionsQuickToCore(const QuickGlobal::Options value)
|
||||||
|
{
|
||||||
|
Options result = {};
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, ForceHideWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, ForceShowWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontDrawTopWindowFrameBorder, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, EnableRoundedWindowCorners, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, TransparentWindowBackground, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, MaximizeButtonDocking, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, CreateStandardWindowLayout, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, BeCompatibleWithQtFramelessWindowHint, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchQtInternals, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchWindowFrameBorderColor, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontInstallSystemMenuHook, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DisableSystemMenu, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, NoDoubleClickMaximizeToggle, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DisableResizing, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DisableDragging, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchCursorShape, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontMoveWindowToDesktopCenter, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTreatFullScreenAsZoomed, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchHighDpiScalingPolicy, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchScaleFactorRoundingPolicy, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontTouchProcessDpiAwarenessLevel, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, DontEnsureNonNativeWidgetSiblings, value, result)
|
||||||
|
FRAMELESSHELPER_FLAGS_QUICK_TO_CORE(Option, SyncNativeControlsThemeWithSystem, value, result)
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
FramelessQuickWindowPrivate::FramelessQuickWindowPrivate(FramelessQuickWindow *q, const UserSettings &settings) : QObject(q)
|
FramelessQuickWindowPrivate::FramelessQuickWindowPrivate(FramelessQuickWindow *q, const UserSettings &settings) : QObject(q)
|
||||||
{
|
{
|
||||||
Q_ASSERT(q);
|
Q_ASSERT(q);
|
||||||
|
@ -278,6 +336,17 @@ void FramelessQuickWindowPrivate::snapToTopBorder(QQuickItem *item, const QuickG
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FramelessQuickWindowPrivate::setOptions(const QuickGlobal::Options value)
|
||||||
|
{
|
||||||
|
Q_Q(FramelessQuickWindow);
|
||||||
|
if (m_quickOptions == value) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_quickOptions = value;
|
||||||
|
m_settings.options = optionsQuickToCore(m_quickOptions);
|
||||||
|
Q_EMIT q->optionsChanged();
|
||||||
|
}
|
||||||
|
|
||||||
bool FramelessQuickWindowPrivate::eventFilter(QObject *object, QEvent *event)
|
bool FramelessQuickWindowPrivate::eventFilter(QObject *object, QEvent *event)
|
||||||
{
|
{
|
||||||
Q_ASSERT(object);
|
Q_ASSERT(object);
|
||||||
|
@ -439,32 +508,26 @@ void FramelessQuickWindowPrivate::initialize()
|
||||||
if (m_settings.options & Option::TransparentWindowBackground) {
|
if (m_settings.options & Option::TransparentWindowBackground) {
|
||||||
q->setColor(kDefaultTransparentColor);
|
q->setColor(kDefaultTransparentColor);
|
||||||
}
|
}
|
||||||
|
m_quickOptions = optionsCoreToQuick(m_settings.options);
|
||||||
FramelessWindowsManager * const manager = FramelessWindowsManager::instance();
|
FramelessWindowsManager * const manager = FramelessWindowsManager::instance();
|
||||||
manager->addWindow(m_settings, m_params);
|
manager->addWindow(m_settings, m_params);
|
||||||
q->installEventFilter(this);
|
q->installEventFilter(this);
|
||||||
QQuickItem * const rootItem = q->contentItem();
|
QQuickItem * const rootItem = q->contentItem();
|
||||||
const QQuickItemPrivate * const rootItemPrivate = QQuickItemPrivate::get(rootItem);
|
const QQuickItemPrivate * const rootItemPrivate = QQuickItemPrivate::get(rootItem);
|
||||||
m_topBorderRectangle.reset(new QQuickRectangle(rootItem));
|
m_topBorderRectangle.reset(new QQuickRectangle(rootItem));
|
||||||
|
m_topBorderRectangle->setColor(kDefaultTransparentColor);
|
||||||
|
m_topBorderRectangle->setHeight(0.0);
|
||||||
QQuickPen * const _border = m_topBorderRectangle->border();
|
QQuickPen * const _border = m_topBorderRectangle->border();
|
||||||
_border->setWidth(0.0);
|
_border->setWidth(0.0);
|
||||||
_border->setColor(kDefaultTransparentColor);
|
_border->setColor(kDefaultTransparentColor);
|
||||||
const bool frameBorderVisible = [this]() -> bool {
|
|
||||||
#ifdef Q_OS_WINDOWS
|
|
||||||
return (Utils::isWindowFrameBorderVisible() && !Utils::isWin11OrGreater()
|
|
||||||
&& !(m_settings.options & Option::DontDrawTopWindowFrameBorder));
|
|
||||||
#else
|
|
||||||
Q_UNUSED(this);
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
}();
|
|
||||||
if (frameBorderVisible) {
|
|
||||||
updateTopBorderHeight();
|
updateTopBorderHeight();
|
||||||
updateTopBorderColor();
|
updateTopBorderColor();
|
||||||
}
|
m_topBorderAnchors.reset(new QQuickAnchors(m_topBorderRectangle.data(), m_topBorderRectangle.data()));
|
||||||
connect(q, &FramelessQuickWindow::visibilityChanged, this, [this, q, frameBorderVisible](){
|
m_topBorderAnchors->setTop(rootItemPrivate->top());
|
||||||
if (frameBorderVisible) {
|
m_topBorderAnchors->setLeft(rootItemPrivate->left());
|
||||||
|
m_topBorderAnchors->setRight(rootItemPrivate->right());
|
||||||
|
connect(q, &FramelessQuickWindow::visibilityChanged, this, [this, q](){
|
||||||
updateTopBorderHeight();
|
updateTopBorderHeight();
|
||||||
}
|
|
||||||
Q_EMIT q->hiddenChanged();
|
Q_EMIT q->hiddenChanged();
|
||||||
Q_EMIT q->normalChanged();
|
Q_EMIT q->normalChanged();
|
||||||
Q_EMIT q->minimizedChanged();
|
Q_EMIT q->minimizedChanged();
|
||||||
|
@ -472,16 +535,10 @@ void FramelessQuickWindowPrivate::initialize()
|
||||||
Q_EMIT q->fullScreenChanged();
|
Q_EMIT q->fullScreenChanged();
|
||||||
});
|
});
|
||||||
connect(q, &FramelessQuickWindow::activeChanged, this, &FramelessQuickWindowPrivate::updateTopBorderColor);
|
connect(q, &FramelessQuickWindow::activeChanged, this, &FramelessQuickWindowPrivate::updateTopBorderColor);
|
||||||
connect(manager, &FramelessWindowsManager::systemThemeChanged, this, [this, q, frameBorderVisible](){
|
connect(manager, &FramelessWindowsManager::systemThemeChanged, this, [this, q](){
|
||||||
if (frameBorderVisible) {
|
|
||||||
updateTopBorderColor();
|
updateTopBorderColor();
|
||||||
}
|
|
||||||
Q_EMIT q->frameBorderColorChanged();
|
Q_EMIT q->frameBorderColorChanged();
|
||||||
});
|
});
|
||||||
m_topBorderAnchors.reset(new QQuickAnchors(m_topBorderRectangle.data(), m_topBorderRectangle.data()));
|
|
||||||
m_topBorderAnchors->setTop(rootItemPrivate->top());
|
|
||||||
m_topBorderAnchors->setLeft(rootItemPrivate->left());
|
|
||||||
m_topBorderAnchors->setRight(rootItemPrivate->right());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QRect FramelessQuickWindowPrivate::mapItemGeometryToScene(const QQuickItem * const item) const
|
QRect FramelessQuickWindowPrivate::mapItemGeometryToScene(const QQuickItem * const item) const
|
||||||
|
@ -608,6 +665,16 @@ void FramelessQuickWindowPrivate::doStartSystemMove2(QMouseEvent *event)
|
||||||
startSystemMove2(globalPos);
|
startSystemMove2(globalPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool FramelessQuickWindowPrivate::shouldDrawFrameBorder() const
|
||||||
|
{
|
||||||
|
#ifdef Q_OS_WINDOWS
|
||||||
|
return (Utils::isWindowFrameBorderVisible() && !Utils::isWin11OrGreater()
|
||||||
|
&& !(m_settings.options & Option::DontDrawTopWindowFrameBorder));
|
||||||
|
#else
|
||||||
|
return false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void FramelessQuickWindowPrivate::showEventHandler(QShowEvent *event)
|
void FramelessQuickWindowPrivate::showEventHandler(QShowEvent *event)
|
||||||
{
|
{
|
||||||
Q_ASSERT(event);
|
Q_ASSERT(event);
|
||||||
|
@ -711,9 +778,17 @@ void FramelessQuickWindowPrivate::mouseDoubleClickEventHandler(QMouseEvent *even
|
||||||
toggleMaximized();
|
toggleMaximized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QuickGlobal::Options FramelessQuickWindowPrivate::getOptions() const
|
||||||
|
{
|
||||||
|
return m_quickOptions;
|
||||||
|
}
|
||||||
|
|
||||||
void FramelessQuickWindowPrivate::updateTopBorderColor()
|
void FramelessQuickWindowPrivate::updateTopBorderColor()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
|
if (!shouldDrawFrameBorder()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
m_topBorderRectangle->setColor(getFrameBorderColor());
|
m_topBorderRectangle->setColor(getFrameBorderColor());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -721,6 +796,9 @@ void FramelessQuickWindowPrivate::updateTopBorderColor()
|
||||||
void FramelessQuickWindowPrivate::updateTopBorderHeight()
|
void FramelessQuickWindowPrivate::updateTopBorderHeight()
|
||||||
{
|
{
|
||||||
#ifdef Q_OS_WINDOWS
|
#ifdef Q_OS_WINDOWS
|
||||||
|
if (!shouldDrawFrameBorder()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
const qreal newHeight = (isNormal() ? 1.0 : 0.0);
|
const qreal newHeight = (isNormal() ? 1.0 : 0.0);
|
||||||
m_topBorderRectangle->setHeight(newHeight);
|
m_topBorderRectangle->setHeight(newHeight);
|
||||||
#endif
|
#endif
|
||||||
|
@ -781,6 +859,18 @@ QColor FramelessQuickWindow::frameBorderColor() const
|
||||||
return d->getFrameBorderColor();
|
return d->getFrameBorderColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QuickGlobal::Options FramelessQuickWindow::options() const
|
||||||
|
{
|
||||||
|
Q_D(const FramelessQuickWindow);
|
||||||
|
return d->getOptions();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FramelessQuickWindow::setOptions(const QuickGlobal::Options value)
|
||||||
|
{
|
||||||
|
Q_D(FramelessQuickWindow);
|
||||||
|
d->setOptions(value);
|
||||||
|
}
|
||||||
|
|
||||||
void FramelessQuickWindow::setTitleBarItem(QQuickItem *item)
|
void FramelessQuickWindow::setTitleBarItem(QQuickItem *item)
|
||||||
{
|
{
|
||||||
Q_ASSERT(item);
|
Q_ASSERT(item);
|
||||||
|
|
|
@ -71,6 +71,8 @@ public:
|
||||||
Q_INVOKABLE void mouseReleaseEventHandler(QMouseEvent *event);
|
Q_INVOKABLE void mouseReleaseEventHandler(QMouseEvent *event);
|
||||||
Q_INVOKABLE void mouseDoubleClickEventHandler(QMouseEvent *event);
|
Q_INVOKABLE void mouseDoubleClickEventHandler(QMouseEvent *event);
|
||||||
|
|
||||||
|
Q_INVOKABLE Q_NODISCARD QuickGlobal::Options getOptions() const;
|
||||||
|
|
||||||
public Q_SLOTS:
|
public Q_SLOTS:
|
||||||
void showMinimized2();
|
void showMinimized2();
|
||||||
void toggleMaximized();
|
void toggleMaximized();
|
||||||
|
@ -84,6 +86,7 @@ public Q_SLOTS:
|
||||||
void setFixedSize(const bool value, const bool force = false);
|
void setFixedSize(const bool value, const bool force = false);
|
||||||
void bringToFront();
|
void bringToFront();
|
||||||
void snapToTopBorder(QQuickItem *item, const QuickGlobal::Anchor itemAnchor, const QuickGlobal::Anchor topBorderAnchor);
|
void snapToTopBorder(QQuickItem *item, const QuickGlobal::Anchor itemAnchor, const QuickGlobal::Anchor topBorderAnchor);
|
||||||
|
void setOptions(const QuickGlobal::Options value);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Q_NODISCARD bool eventFilter(QObject *object, QEvent *event) override;
|
Q_NODISCARD bool eventFilter(QObject *object, QEvent *event) override;
|
||||||
|
@ -95,6 +98,7 @@ private:
|
||||||
Q_NODISCARD bool isInTitleBarDraggableArea(const QPoint &pos) const;
|
Q_NODISCARD bool isInTitleBarDraggableArea(const QPoint &pos) const;
|
||||||
Q_NODISCARD bool shouldIgnoreMouseEvents(const QPoint &pos) const;
|
Q_NODISCARD bool shouldIgnoreMouseEvents(const QPoint &pos) const;
|
||||||
void doStartSystemMove2(QMouseEvent *event);
|
void doStartSystemMove2(QMouseEvent *event);
|
||||||
|
Q_NODISCARD bool shouldDrawFrameBorder() const;
|
||||||
|
|
||||||
private Q_SLOTS:
|
private Q_SLOTS:
|
||||||
void updateTopBorderColor();
|
void updateTopBorderColor();
|
||||||
|
@ -111,6 +115,7 @@ private:
|
||||||
bool m_windowExposed = false;
|
bool m_windowExposed = false;
|
||||||
QPointer<QQuickItem> m_titleBarItem = nullptr;
|
QPointer<QQuickItem> m_titleBarItem = nullptr;
|
||||||
QList<QQuickItem *> m_hitTestVisibleItems = {};
|
QList<QQuickItem *> m_hitTestVisibleItems = {};
|
||||||
|
QuickGlobal::Options m_quickOptions = {};
|
||||||
};
|
};
|
||||||
|
|
||||||
FRAMELESSHELPER_END_NAMESPACE
|
FRAMELESSHELPER_END_NAMESPACE
|
||||||
|
|
Loading…
Reference in New Issue