23 #include <QToolButton>
24 #include <QMouseEvent>
25 #include <QPushButton>
26 #include <QStyleOptionGroupBox>
27 #include <QScrollArea>
39 : QGroupBox( title, parent )
72 setFocusPolicy( Qt::StrongFocus );
96 if ( parent() && parent()->parent() )
106 QgsDebugMsgLevel( QStringLiteral(
"did not find a QScrollArea parent" ), 5 );
134 if ( event->modifiers() & ( Qt::AltModifier | Qt::ControlModifier | Qt::ShiftModifier )
143 QGroupBox::mousePressEvent( event );
148 mAltDown = (
event->modifiers() & ( Qt::AltModifier | Qt::ControlModifier ) );
149 mShiftDown = (
event->modifiers() & Qt::ShiftModifier );
163 QGroupBox::mouseReleaseEvent( event );
172 QGroupBox::changeEvent( event );
174 if ( event->type() == QEvent::EnabledChange && isEnabled() )
182 if ( !grp.isEmpty() )
184 tipTxt = tr(
"Ctrl (or Alt)-click to toggle all" ) +
'\n' + tr(
"Shift-click to expand, then collapse others" );
191 QStyleOptionGroupBox box;
192 initStyleOption( &box );
193 return style()->subControlRect( QStyle::CC_GroupBox, &box,
194 QStyle::SC_GroupBoxLabel,
this );
237 QgsDebugMsg( QStringLiteral(
"Alt or Shift key down, syncing group" ) );
239 if (
auto *lParentWidget = parentWidget() )
245 if (
mSyncParent->parentWidget()->objectName() != QLatin1String(
"QgisApp" ) )
264 if ( grpbox->syncGroup() ==
syncGroup() && grpbox->isEnabled() )
273 grpbox->setCollapsed(
mShiftDown ?
true : !thisCollapsed );
283 QgsDebugMsg( QStringLiteral(
"did not find a sync parent" ) );
302 #if QT_VERSION < QT_VERSION_CHECK(5, 12, 4)
304 QGroupBox::setStyleSheet( QString() );
306 QGroupBox::setStyleSheet( style );
311 setUpdatesEnabled(
false );
315 QStyleOptionGroupBox box;
316 initStyleOption( &box );
317 const QRect rectFrame = style()->subControlRect( QStyle::CC_GroupBox, &box,
318 QStyle::SC_GroupBoxFrame,
this );
322 const int marginLeft = 20;
323 const int marginRight = 5;
325 const int offsetStyle = QApplication::style()->objectName().contains( QLatin1String(
"macintosh" ) ) ? 8 : 0;
326 const int topBuffer = 1 + offsetStyle;
327 int offsetTop = topBuffer;
328 int offsetTopTri = topBuffer;
332 offsetTopTri += ( rectTitle.height() -
mCollapseButton->height() ) / 2;
342 if ( QApplication::style()->objectName().compare( QLatin1String(
"oxygen" ), Qt::CaseInsensitive ) == 0 )
344 QStyleOptionGroupBox box;
345 initStyleOption( &box );
346 const QRect rectFrame = style()->subControlRect( QStyle::CC_GroupBox, &box,
347 QStyle::SC_GroupBoxFrame,
this );
348 const QRect rectCheckBox = style()->subControlRect( QStyle::CC_GroupBox, &box,
349 QStyle::SC_GroupBoxCheckBox,
this );
350 if ( rectFrame.left() <= 0 )
351 offsetLeft = 6 + rectFrame.left();
352 if ( rectFrame.top() <= 0 )
357 offsetTop = ( rectCheckBox.height() / 2 ) -
359 offsetTopTri = offsetTop + 1;
363 offsetTop = 6 + rectFrame.top();
364 offsetTopTri = offsetTop;
369 QgsDebugMsgLevel( QStringLiteral(
"groupbox: %1 style: %2 offset: left=%3 top=%4 top2=%5" ).arg(
370 objectName(), QApplication::style()->objectName() ).arg( offsetLeft ).arg( offsetTop ).arg( offsetTopTri ), 5 );
374 if ( QApplication::style()->objectName().contains( QLatin1String(
"macintosh" ) ) )
376 ss += QLatin1String(
"QgsCollapsibleGroupBoxBasic, QgsCollapsibleGroupBox {" );
377 ss += QStringLiteral(
" margin-top: %1px;" ).arg( topBuffer + rectFrame.top() );
380 ss += QLatin1String(
"QgsCollapsibleGroupBoxBasic::title, QgsCollapsibleGroupBox::title {" );
381 ss += QLatin1String(
" subcontrol-origin: margin;" );
382 ss += QLatin1String(
" subcontrol-position: top left;" );
383 ss += QStringLiteral(
" margin-left: %1px;" ).arg( marginLeft );
384 ss += QStringLiteral(
" margin-right: %1px;" ).arg( marginRight );
385 ss += QStringLiteral(
" left: %1px;" ).arg( offsetLeft );
386 ss += QStringLiteral(
" top: %1px;" ).arg( offsetTop );
387 if ( QApplication::style()->objectName().contains( QLatin1String(
"macintosh" ) ) )
389 ss += QLatin1String(
" background-color: rgba(0,0,0,0)" );
396 ssd = QStringLiteral(
"QgsCollapsibleGroupBoxBasic > QToolButton#%1, QgsCollapsibleGroupBox > QToolButton#%1 {" ).arg(
mCollapseButton->objectName() );
397 ssd += QLatin1String(
" background-color: rgba(255, 255, 255, 0); border: none;" );
398 ssd += QStringLiteral(
"} QgsCollapsibleGroupBoxBasic > QToolButton#%1:focus, QgsCollapsibleGroupBox > QToolButton#%1:focus { border: 1px solid palette(highlight); }" ).arg(
mCollapseButton->objectName() );
400 if ( offsetLeft != 0 || offsetTopTri != 0 )
402 setUpdatesEnabled(
true );
428 setMaximumHeight( collapse ?
titleRect().bottom() + 6 : 16777215 );
435 QApplication::processEvents();
451 const char *hideKey =
"CollGrpBxHide";
453 QString ss = styleSheet();
462 const auto constChildren = children();
463 for ( QObject *child : constChildren )
465 QWidget *w = qobject_cast<QWidget *>( child );
468 w->setProperty( hideKey,
true );
481 const auto constChildren = children();
482 for ( QObject *child : constChildren )
484 QWidget *w = qobject_cast<QWidget *>( child );
487 if ( w->property( hideKey ).toBool() )
499 , mSettings( settings )
507 , mSettings( settings )
571 if ( objectName().isEmpty() || (
mSettingGroup.isEmpty() && window()->objectName().isEmpty() ) )
576 QString
saveKey =
'/' + objectName();
603 setUpdatesEnabled(
false );
607 const QVariant val =
mSettings->value( key +
"/checked" );
608 if ( ! val.isNull() )
609 setChecked( val.toBool() );
613 const QVariant val =
mSettings->value( key +
"/collapsed" );
614 if ( ! val.isNull() )
618 setUpdatesEnabled(
true );
634 mSettings->setValue( key + QStringLiteral(
"/checked" ), isChecked() );
642 mAltDown = (
event->modifiers() & ( Qt::AltModifier | Qt::ControlModifier ) );
643 mShiftDown = (
event->modifiers() & Qt::ShiftModifier );
644 QToolButton::mouseReleaseEvent( event );