Skip to content

Commit

Permalink
Fix the maximization of sub windows (#7530)
Browse files Browse the repository at this point in the history
## Fix rendering of maximized sub windows

### Adjustments in paintEvent
In `SubWindow::paintEvent` don't paint anything if the sub window is
maximized . Otherwise some gradients are visible behind the maximized
child content.

### Adjustments in adjustTitleBar
In `SubWindow::adjustTitleBar` hide the title label and the buttons if the
sub window is maximized. Always show the title and close button if not
maximized. This is needed to reset the state correctly after
maximization.

Remove some calls to `isMaximized` where we already know that the sub
window is not maximized, i.e. where these calls would always return
`false`.

One adjustment would have resulted in a call to `setHidden(false)`. This
was changed to `setVisible(true)` to get rid of the double negation.

The other `false` would have gotten in an or statement and thus could be
removed completely.

### Add method addTitleButton
Add the helper method `SubWindow::addTitleButton` to reduce code
repetition in the constructor.

### Other changes
Remove a dependency on the `MdiArea` when checking if the sub window is
the active one. Query its own window state to find out if it is active.

When calling `setWindowFlags` in the constructor only adjust the existing
flags with the changes that we actually want to do. It was ensured that
all other flags that have been set before still apply with this change.
  • Loading branch information
michaelgregorius authored Oct 10, 2024
1 parent 066f6b5 commit 378ff8b
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 28 deletions.
2 changes: 2 additions & 0 deletions include/SubWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ class LMMS_EXPORT SubWindow : public QMdiSubWindow
void paintEvent( QPaintEvent * pe ) override;
void changeEvent( QEvent * event ) override;

QPushButton* addTitleButton(const std::string& iconName, const QString& toolTip);

signals:
void focusLost();

Expand Down
73 changes: 45 additions & 28 deletions src/gui/SubWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,28 +58,13 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags windowFlags) :
m_borderColor = Qt::black;

// close, maximize and restore (after maximizing) buttons
m_closeBtn = new QPushButton( embed::getIconPixmap( "close" ), QString(), this );
m_closeBtn->resize( m_buttonSize );
m_closeBtn->setFocusPolicy( Qt::NoFocus );
m_closeBtn->setCursor( Qt::ArrowCursor );
m_closeBtn->setAttribute( Qt::WA_NoMousePropagation );
m_closeBtn->setToolTip( tr( "Close" ) );
m_closeBtn = addTitleButton("close", tr("Close"));
connect( m_closeBtn, SIGNAL(clicked(bool)), this, SLOT(close()));

m_maximizeBtn = new QPushButton( embed::getIconPixmap( "maximize" ), QString(), this );
m_maximizeBtn->resize( m_buttonSize );
m_maximizeBtn->setFocusPolicy( Qt::NoFocus );
m_maximizeBtn->setCursor( Qt::ArrowCursor );
m_maximizeBtn->setAttribute( Qt::WA_NoMousePropagation );
m_maximizeBtn->setToolTip( tr( "Maximize" ) );
m_maximizeBtn = addTitleButton("maximize", tr("Maximize"));
connect( m_maximizeBtn, SIGNAL(clicked(bool)), this, SLOT(showMaximized()));

m_restoreBtn = new QPushButton( embed::getIconPixmap( "restore" ), QString(), this );
m_restoreBtn->resize( m_buttonSize );
m_restoreBtn->setFocusPolicy( Qt::NoFocus );
m_restoreBtn->setCursor( Qt::ArrowCursor );
m_restoreBtn->setAttribute( Qt::WA_NoMousePropagation );
m_restoreBtn->setToolTip( tr( "Restore" ) );
m_restoreBtn = addTitleButton("restore", tr("Restore"));
connect( m_restoreBtn, SIGNAL(clicked(bool)), this, SLOT(showNormal()));

// QLabel for the window title and the shadow effect
Expand All @@ -93,10 +78,9 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags windowFlags) :
m_windowTitle->setAttribute( Qt::WA_TransparentForMouseEvents, true );
m_windowTitle->setGraphicsEffect( m_shadow );

// disable the minimize button
setWindowFlags( Qt::SubWindow | Qt::WindowMaximizeButtonHint |
Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint |
Qt::CustomizeWindowHint );
// Disable the minimize button and make sure that the custom window hint is set
setWindowFlags((this->windowFlags() & ~Qt::WindowMinimizeButtonHint) | Qt::CustomizeWindowHint);

connect( mdiArea(), SIGNAL(subWindowActivated(QMdiSubWindow*)), this, SLOT(focusChanged(QMdiSubWindow*)));
}

Expand All @@ -111,12 +95,14 @@ SubWindow::SubWindow(QWidget *parent, Qt::WindowFlags windowFlags) :
*/
void SubWindow::paintEvent( QPaintEvent * )
{
// Don't paint any of the other stuff if the sub window is maximized
// so that only its child content is painted.
if (isMaximized()) { return; }

QPainter p( this );
QRect rect( 0, 0, width(), m_titleBarHeight );

bool isActive = mdiArea()
? mdiArea()->activeSubWindow() == this
: false;
const bool isActive = windowState() & Qt::WindowActive;

p.fillRect( rect, isActive ? activeColor() : p.pen().brush() );

Expand Down Expand Up @@ -295,9 +281,28 @@ void SubWindow::moveEvent( QMoveEvent * event )
*/
void SubWindow::adjustTitleBar()
{
// Don't show the title or any button if the sub window is maximized. Otherwise they
// might show up behind the actual maximized content of the child widget.
if (isMaximized())
{
m_closeBtn->hide();
m_maximizeBtn->hide();
m_restoreBtn->hide();
m_windowTitle->hide();

return;
}

// The sub window is not maximized, i.e. the title must be shown
// as well as some buttons.

// Title adjustments
m_windowTitle->show();

// button adjustments
m_maximizeBtn->hide();
m_restoreBtn->hide();
m_closeBtn->show();

const int rightSpace = 3;
const int buttonGap = 1;
Expand All @@ -322,12 +327,12 @@ void SubWindow::adjustTitleBar()
buttonBarWidth = buttonBarWidth + m_buttonSize.width() + buttonGap;
m_maximizeBtn->move( middleButtonPos );
m_restoreBtn->move( middleButtonPos );
m_maximizeBtn->setHidden( isMaximized() );
m_maximizeBtn->setVisible(true);
}

// we're keeping the restore button around if we open projects
// from older versions that have saved minimized windows
m_restoreBtn->setVisible( isMaximized() || isMinimized() );
m_restoreBtn->setVisible(isMinimized());
if( isMinimized() )
{
m_restoreBtn->move( m_maximizeBtn->isHidden() ? middleButtonPos : leftButtonPos );
Expand Down Expand Up @@ -403,5 +408,17 @@ void SubWindow::resizeEvent( QResizeEvent * event )
}
}

QPushButton* SubWindow::addTitleButton(const std::string& iconName, const QString& toolTip)
{
auto button = new QPushButton(embed::getIconPixmap(iconName), QString(), this);
button->resize(m_buttonSize);
button->setFocusPolicy(Qt::NoFocus);
button->setCursor(Qt::ArrowCursor);
button->setAttribute(Qt::WA_NoMousePropagation);
button->setToolTip(toolTip);

return button;
}


} // namespace lmms::gui
} // namespace lmms::gui

0 comments on commit 378ff8b

Please sign in to comment.