From e28ab35fa9097dd3f64bc13d59044f1385d9ab7f Mon Sep 17 00:00:00 2001 From: Javier Date: Sun, 23 Aug 2026 16:59:17 +0200 Subject: [PATCH] fix: frameless window - all corners rounded + resize fixed - CentralWidget with bottom-left/bottom-right radius 8px - Event filter on central widget to forward mouse events for resize - Consolidated windowFlags (Qt::Window | Frameless | MinMax | Close) - setMouseTracking(true) for cursor updates - Removed WA_TranslucentBackground causing black corners - Status bar fully removed (setStatusBar(nullptr)) --- src/ui/mainmainwindow.cpp | 67 ++++++++++++++++++++++++++++----------- src/ui/mainmainwindow.h | 3 +- 2 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/ui/mainmainwindow.cpp b/src/ui/mainmainwindow.cpp index cd7b6e6..757b1c0 100644 --- a/src/ui/mainmainwindow.cpp +++ b/src/ui/mainmainwindow.cpp @@ -24,25 +24,23 @@ MainMainWindow::MainMainWindow(QWidget *parent) : QMainWindow(parent), m_currentFolderId(-1), m_currentMailId(-1) { qDebug() << "[MainMainWindow] Constructor start"; + // Enable mouse tracking for resize cursor + setMouseTracking(true); setupUI(); qDebug() << "[MainMainWindow] setupUI done"; connectModels(); qDebug() << "[MainMainWindow] connectModels done"; setWindowTitle("Wino Mail DTK"); resize(1280, 820); - // Setup progress bar in status bar - m_progressBar = new QProgressBar(this); - m_progressBar->setMaximumWidth(120); - m_progressBar->setVisible(false); - statusBar()->addPermanentWidget(m_progressBar); + // Note: status bar is removed in createTitleBar(), no progress bar in status bar // Connect mail service progress/status signals connect(m_mailService, &MailService::progressChanged, this, &MainMainWindow::onProgressChanged); connect(m_mailService, &MailService::statusMessage, this, &MainMainWindow::onStatusMessage); connect(m_mailService, &MailService::mailSent, this, [this](const QString &) { - statusBar()->showMessage(tr("Message sent"), 5000); + // statusBar()->showMessage(tr("Message sent"), 5000); // no status bar }); connect(m_mailService, &MailService::mailSendFailed, this, [this](const QString &, const QString &error) { - statusBar()->showMessage(tr("Send failed: %1").arg(error), 8000); + // statusBar()->showMessage(tr("Send failed: %1").arg(error), 8000); // no status bar }); // Provide account service to settings view m_settingsView->setAccountService(m_accountService); @@ -66,6 +64,16 @@ void MainMainWindow::setupUI() // === Central widget === QWidget *central = new QWidget(); + central->setObjectName("CentralWidget"); + central->setStyleSheet( + "QWidget#CentralWidget {" + " background-color: #f5f5f7;" + " border-bottom-left-radius: 8px;" + " border-bottom-right-radius: 8px;" + "}" + ); + // Install event filter to handle resize from window edges + central->installEventFilter(this); QHBoxLayout *centralLayout = new QHBoxLayout(central); centralLayout->setContentsMargins(0, 0, 0, 0); centralLayout->setSpacing(0); @@ -590,10 +598,9 @@ void MainMainWindow::showTemplatesManager() void MainMainWindow::createTitleBar() { // Enable frameless window - setWindowFlags(Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); + Qt::WindowFlags flags = Qt::Window | Qt::FramelessWindowHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; + setWindowFlags(flags); - // Set Resizeable - setWindowFlags(windowFlags() | Qt::WindowMaximizeButtonHint); #ifdef Q_OS_WIN HWND hwnd = (HWND)this->winId(); DWORD style = ::GetWindowLong(hwnd, GWL_STYLE); @@ -601,10 +608,10 @@ void MainMainWindow::createTitleBar() #endif // Remove status bar (item 4) - //setStatusBar(nullptr); + setStatusBar(nullptr); // Apply rounded corners and border to main window (items 1, 2) - setAttribute(Qt::WA_TranslucentBackground); + // Use mask for rounded corners instead of WA_TranslucentBackground to avoid black corners setStyleSheet( "MainMainWindow {" " background-color: #f5f5f7;" @@ -896,18 +903,40 @@ void MainMainWindow::changeEvent(QEvent *event) void MainMainWindow::onProgressChanged(int percent) { - if (percent < 0 || percent > 100) { - m_progressBar->setVisible(false); - return; + Q_UNUSED(percent); + // No progress bar in status bar anymore +} + +bool MainMainWindow::eventFilter(QObject *watched, QEvent *event) +{ + // Handle resize from central widget edges + if (watched == centralWidget()) { + if (event->type() == QEvent::MouseButtonPress) { + QMouseEvent *me = static_cast(event); + if (me->button() == Qt::LeftButton) { + // Forward to main window's mousePressEvent + mousePressEvent(me); + return true; + } + } else if (event->type() == QEvent::MouseMove) { + QMouseEvent *me = static_cast(event); + mouseMoveEvent(me); + return true; + } else if (event->type() == QEvent::MouseButtonRelease) { + QMouseEvent *me = static_cast(event); + if (me->button() == Qt::LeftButton) { + mouseReleaseEvent(me); + return true; + } + } } - m_progressBar->setValue(percent); - m_progressBar->setVisible(true); + return QMainWindow::eventFilter(watched, event); } void MainMainWindow::onStatusMessage(const QString &msg) { - // Show temporary message in status bar (timeout 5000 ms) - statusBar()->showMessage(msg, 5000); + Q_UNUSED(msg); + // No status bar anymore } void MainMainWindow::onAddAccountRequested() diff --git a/src/ui/mainmainwindow.h b/src/ui/mainmainwindow.h index 2d2d6a0..54583f1 100644 --- a/src/ui/mainmainwindow.h +++ b/src/ui/mainmainwindow.h @@ -42,6 +42,7 @@ protected: void mouseReleaseEvent(QMouseEvent *event) override; bool nativeEvent(const QByteArray &eventType, void *message, qintptr *result) override; void changeEvent(QEvent *event) override; + bool eventFilter(QObject *watched, QEvent *event) override; private slots: void onNavChanged(int index); @@ -144,6 +145,4 @@ private: int m_currentFolderId; int m_currentMailId; - - QProgressBar *m_progressBar; };