chore: baseline usable version
This commit is contained in:
122
src/qEmbyApp/components/moderndialogbase.cpp
Normal file
122
src/qEmbyApp/components/moderndialogbase.cpp
Normal file
@@ -0,0 +1,122 @@
|
||||
#include "moderndialogbase.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
|
||||
|
||||
#include <QWKWidgets/widgetwindowagent.h>
|
||||
#include <widgetframe/windowbar.h>
|
||||
#include <widgetframe/windowbutton.h>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
namespace {
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
using DwmSetWindowAttributePtr =
|
||||
HRESULT(WINAPI *)(HWND, DWORD, LPCVOID, DWORD);
|
||||
|
||||
void setWindowTransitionsDisabled(WId windowId, bool disabled)
|
||||
{
|
||||
static const HMODULE dwmapi = LoadLibraryW(L"dwmapi.dll");
|
||||
if (!dwmapi || !windowId) {
|
||||
return;
|
||||
}
|
||||
|
||||
static const auto dwmSetWindowAttribute =
|
||||
reinterpret_cast<DwmSetWindowAttributePtr>(
|
||||
GetProcAddress(dwmapi, "DwmSetWindowAttribute"));
|
||||
if (!dwmSetWindowAttribute) {
|
||||
return;
|
||||
}
|
||||
|
||||
constexpr DWORD kDwmwaTransitionsForcedDisabled = 3;
|
||||
const BOOL value = disabled ? TRUE : FALSE;
|
||||
dwmSetWindowAttribute(reinterpret_cast<HWND>(windowId),
|
||||
kDwmwaTransitionsForcedDisabled,
|
||||
&value, sizeof(value));
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
ModernDialogBase::ModernDialogBase(QWidget *parent,
|
||||
bool disableNativeTransitions)
|
||||
: QDialog(parent) {
|
||||
|
||||
setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
||||
|
||||
|
||||
setAttribute(Qt::WA_StyledBackground, true);
|
||||
|
||||
auto *mainLayout = new QVBoxLayout(this);
|
||||
|
||||
mainLayout->setContentsMargins(0, 0, 0, 0);
|
||||
mainLayout->setSpacing(0);
|
||||
|
||||
|
||||
m_titleBarWidget = new QWidget(this);
|
||||
m_titleBarWidget->setObjectName("dialog-titlebar");
|
||||
|
||||
auto *titleBarLayout = new QHBoxLayout(m_titleBarWidget);
|
||||
#if defined(Q_OS_MACOS) || defined(Q_OS_MAC)
|
||||
|
||||
titleBarLayout->setContentsMargins(52, 0, 16, 0);
|
||||
#else
|
||||
|
||||
titleBarLayout->setContentsMargins(16, 0, 0, 0);
|
||||
#endif
|
||||
titleBarLayout->setSpacing(0);
|
||||
|
||||
m_titleLabel = new QLabel(m_titleBarWidget);
|
||||
m_titleLabel->setObjectName("dialog-title");
|
||||
|
||||
|
||||
auto *agent = new QWK::WidgetWindowAgent(this);
|
||||
agent->setup(this);
|
||||
#if defined(Q_OS_MACOS) || defined(Q_OS_MAC)
|
||||
agent->setWindowAttribute("no-system-buttons", false);
|
||||
agent->setWindowAttribute("macos-close-button-only", true);
|
||||
#endif
|
||||
|
||||
#if !defined(Q_OS_MACOS) && !defined(Q_OS_MAC)
|
||||
|
||||
auto *closeBtn = new QWK::WindowButton(m_titleBarWidget);
|
||||
closeBtn->setObjectName("dialog-close-btn");
|
||||
closeBtn->setProperty("system-button", true);
|
||||
connect(closeBtn, &QWK::WindowButton::clicked, this, &QDialog::reject);
|
||||
#endif
|
||||
|
||||
titleBarLayout->addWidget(m_titleLabel);
|
||||
titleBarLayout->addStretch();
|
||||
#if !defined(Q_OS_MACOS) && !defined(Q_OS_MAC)
|
||||
titleBarLayout->addWidget(closeBtn);
|
||||
#endif
|
||||
|
||||
|
||||
agent->setTitleBar(m_titleBarWidget);
|
||||
#if !defined(Q_OS_MACOS) && !defined(Q_OS_MAC)
|
||||
agent->setSystemButton(QWK::WindowAgentBase::Close, closeBtn);
|
||||
#endif
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
if (disableNativeTransitions) {
|
||||
setWindowTransitionsDisabled(winId(), true);
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(disableNativeTransitions);
|
||||
#endif
|
||||
|
||||
|
||||
m_contentLayout = new QVBoxLayout();
|
||||
m_contentLayout->setContentsMargins(20, 10, 20, 20);
|
||||
|
||||
mainLayout->addWidget(m_titleBarWidget);
|
||||
mainLayout->addLayout(m_contentLayout);
|
||||
}
|
||||
|
||||
void ModernDialogBase::setTitle(const QString &title) {
|
||||
m_titleLabel->setText(title);
|
||||
}
|
||||
Reference in New Issue
Block a user