View Issue Details

IDProjectCategoryView StatusLast Update
0017571ScribusUser Interfacepublic2025-07-04 21:26
Reporternitramr Assigned Tonitramr  
PrioritynormalSeverityfeatureReproducibilityN/A
Status assignedResolutionopen 
PlatformDesktop PCOSUbuntuOS Version24.10 64-bit
Product Version1.7.1.svn 
Target Version1.7 milestone 
Summary0017571: Add button group ui widget
DescriptionI created a custom button group widget that assigns a proxy style to all tool buttons within the button group. The new style looks like a real visual group.

I also replaced some UI button groups with the new one.

Button group features
- Based on QButtonGroup
- All added buttons are automatically styled.
- When a button is added, deleted, or its visibility is changed, the button style of all buttons is regenerated.

Tested un Ubuntu (dark + light theme) and MacOS (light theme)
TagsNo tags attached.
PatchYes

Activities

nitramr

2025-07-04 21:26

developer  

buttongroup_2025-07-04_01.patch (19,671 bytes)   
diff --git a/scribus/CMakeLists_Sources.txt b/scribus/CMakeLists_Sources.txt
index 35422ba..cdb62da 100644
--- a/scribus/CMakeLists_Sources.txt
+++ b/scribus/CMakeLists_Sources.txt
@@ -561,6 +561,7 @@ set(SCRIBUS_SOURCES
 	ui/delegates/sclistitemdelegate.cpp
 	ui/docks/dock_centralwidget.cpp
 	ui/docks/dock_panelbase.cpp
+	ui/widgets/buttongroup.cpp
 	ui/widgets/color_button.cpp
 	ui/widgets/color_slider.cpp
 	ui/widgets/combo_blendmode.cpp
diff --git a/scribus/ui/propertiespalette_shape.cpp b/scribus/ui/propertiespalette_shape.cpp
index 0dcbd21..4414a23 100644
--- a/scribus/ui/propertiespalette_shape.cpp
+++ b/scribus/ui/propertiespalette_shape.cpp
@@ -25,6 +25,7 @@ for which a new license (GPL+exception) is in place.
 #include "scribusview.h"
 #include "selection.h"
 #include "units.h"
+#include "ui/widgets/buttongroup.h"
 
 PropertiesPalette_Shape::PropertiesPalette_Shape( QWidget* parent)
 	: QWidget(parent)
@@ -45,6 +46,13 @@ PropertiesPalette_Shape::PropertiesPalette_Shape( QWidget* parent)
 	textFlowMargins->toggleLabelVisibility(false);
 	textFlowMargins->setLinkValues(true);
 
+	ButtonGroup * bgFlow = new ButtonGroup();
+	bgFlow->addButton(textFlowDisabled);
+	bgFlow->addButton(textFlowUsesBoundingBox);
+	bgFlow->addButton(textFlowUsesContourLine);
+	bgFlow->addButton(textFlowUsesFrameShape);
+	bgFlow->addButton(textFlowUsesImageClipping);
+
 	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
 	connect(ScQApp, SIGNAL(localeChanged()), this, SLOT(localeChange()));
 	connect(ScQApp, SIGNAL(labelVisibilityChanged(bool)), this, SLOT(toggleLabelVisibility(bool)));
diff --git a/scribus/ui/alignselect.cpp b/scribus/ui/alignselect.cpp
index 725617a..c2c1968 100644
--- a/scribus/ui/alignselect.cpp
+++ b/scribus/ui/alignselect.cpp
@@ -16,7 +16,7 @@ for which a new license (GPL+exception) is in place.
 
 AlignSelect::AlignSelect(QWidget* parent) : FormWidget(parent)
 {
-	buttonGroup = new QButtonGroup(this);
+	buttonGroup = new ButtonGroup(this);
 
 	TextL = new QToolButton( this );
 	TextL->setCheckable( true );
@@ -45,6 +45,9 @@ AlignSelect::AlignSelect(QWidget* parent) : FormWidget(parent)
 	addWidget(TextB);
 	addWidget(TextF);
 
+	// Modifiy layout spacing. Layout is created by addWidget()
+	layout()->setSpacing(0);
+
 	iconSetChange();
 	languageChange();
 
diff --git a/scribus/ui/alignselect.h b/scribus/ui/alignselect.h
index 9bd60ff..54efb0c 100644
--- a/scribus/ui/alignselect.h
+++ b/scribus/ui/alignselect.h
@@ -14,6 +14,7 @@ for which a new license (GPL+exception) is in place.
 class QEvent;
 
 #include "scribusapi.h"
+#include "ui/widgets/buttongroup.h"
 #include "ui/widgets/form_widget.h"
 
 class SCRIBUS_API AlignSelect : public FormWidget
@@ -30,7 +31,7 @@ public:
 	int selectedId() const;
 
 	int selected { 0 };
-	QButtonGroup* buttonGroup { nullptr };
+	ButtonGroup* buttonGroup { nullptr };
 	QToolButton* TextL { nullptr };
 	QToolButton* TextR { nullptr };
 	QToolButton* TextC { nullptr };
diff --git a/scribus/ui/alignverticalselect.cpp b/scribus/ui/alignverticalselect.cpp
index 13a6234..f88d511 100644
--- a/scribus/ui/alignverticalselect.cpp
+++ b/scribus/ui/alignverticalselect.cpp
@@ -16,7 +16,7 @@ for which a new license (GPL+exception) is in place.
 
 AlignVerticalSelect::AlignVerticalSelect(QWidget* parent) : FormWidget(parent)
 {
-	buttonGroup = new QButtonGroup(this);
+	buttonGroup = new ButtonGroup(this);
 	buttonGroup->setExclusive(true);
 
 	TextT = new QToolButton( this );
@@ -36,6 +36,9 @@ AlignVerticalSelect::AlignVerticalSelect(QWidget* parent) : FormWidget(parent)
 	addWidget(TextC);
 	addWidget(TextB);
 
+	// Modifiy layout spacing. Layout is created by addWidget()
+	layout()->setSpacing(0);
+
 	iconSetChange();
 	languageChange();
 
diff --git a/scribus/ui/alignverticalselect.h b/scribus/ui/alignverticalselect.h
index 4a5d6b0..02782ed 100644
--- a/scribus/ui/alignverticalselect.h
+++ b/scribus/ui/alignverticalselect.h
@@ -14,6 +14,7 @@ for which a new license (GPL+exception) is in place.
 class QEvent;
 
 #include "scribusapi.h"
+#include "ui/widgets/buttongroup.h"
 #include "ui/widgets/form_widget.h"
 
 class SCRIBUS_API AlignVerticalSelect : public FormWidget
@@ -28,7 +29,7 @@ public:
 	void setStyle(int s);
 	int getStyle() const;
 
-	QButtonGroup* buttonGroup { nullptr };
+	ButtonGroup* buttonGroup { nullptr };
 	QToolButton* TextT { nullptr };
 	QToolButton* TextC { nullptr };
 	QToolButton* TextB { nullptr };
diff --git a/scribus/ui/directionselect.cpp b/scribus/ui/directionselect.cpp
index 24556ec..5d0aa59 100644
--- a/scribus/ui/directionselect.cpp
+++ b/scribus/ui/directionselect.cpp
@@ -15,7 +15,13 @@ for which a new license (GPL+exception) is in place.
 
 DirectionSelect::DirectionSelect(QWidget* parent) : FormWidget(parent)
 {
-	buttonGroup = new QButtonGroup(this);
+	buttonGroup = new ButtonGroup(this);
+
+	QHBoxLayout* lay = new QHBoxLayout();
+	lay->setContentsMargins(0, 0, 0, 0);
+	lay->setSpacing(0);
+	lay->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
+	setLayout(lay);
 
 	LTR = new QToolButton( this );
 	LTR->setCheckable( true );
@@ -28,11 +34,13 @@ DirectionSelect::DirectionSelect(QWidget* parent) : FormWidget(parent)
 	addWidget( RTL );
 	buttonGroup->addButton(RTL, 1);
 
-	resize(minimumSizeHint());
+	lay->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding));
 
 	iconSetChange();
 	languageChange();
 
+	resize(minimumSizeHint());
+
 	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
 	connect(buttonGroup, SIGNAL(idClicked(int)), this, SLOT(setTypeStyle(int)));
 }
diff --git a/scribus/ui/directionselect.h b/scribus/ui/directionselect.h
index 3d69cd6..23ad6c2 100644
--- a/scribus/ui/directionselect.h
+++ b/scribus/ui/directionselect.h
@@ -16,6 +16,7 @@ for which a new license (GPL+exception) is in place.
 class QEvent;
 
 #include "scribusapi.h"
+#include "ui/widgets/buttongroup.h"
 #include "ui/widgets/form_widget.h"
 
 class SCRIBUS_API DirectionSelect : public FormWidget
@@ -30,7 +31,7 @@ class SCRIBUS_API DirectionSelect : public FormWidget
 		int getStyle();
 		int selectedId();
 
-		QButtonGroup* buttonGroup { nullptr };
+		ButtonGroup* buttonGroup { nullptr };
 		QToolButton* RTL { nullptr };
 		QToolButton* LTR { nullptr };
 
diff --git a/scribus/ui/flopwidget.cpp b/scribus/ui/flopwidget.cpp
index 0b3a537..f5e2d94 100644
--- a/scribus/ui/flopwidget.cpp
+++ b/scribus/ui/flopwidget.cpp
@@ -23,10 +23,10 @@ FlopWidget::FlopWidget(QWidget* parent) : FormWidget(parent)
 	flopBaselineGrid = new QToolButton();
 	flopBaselineGrid->setCheckable(true);
 
-	flopGroup = new QButtonGroup();
+	flopGroup = new ButtonGroup();
 	flopGroup->setExclusive(true);
-	flopGroup->addButton(flopRealHeight,  RealHeightID);
 	flopGroup->addButton(flopFontAscent,  FontAscentID);
+	flopGroup->addButton(flopRealHeight,  RealHeightID);
 	flopGroup->addButton(flopLineSpacing, LineSpacingID);
 	flopGroup->addButton(flopBaselineGrid, BaselineGridID);
 
@@ -35,6 +35,9 @@ FlopWidget::FlopWidget(QWidget* parent) : FormWidget(parent)
 	addWidget(flopLineSpacing);
 	addWidget(flopBaselineGrid);
 
+	// Modifiy layout spacing. Layout is created by addWidget()
+	layout()->setSpacing(0);
+
 	iconSetChange();
 	languageChange();
 
diff --git a/scribus/ui/flopwidget.h b/scribus/ui/flopwidget.h
index cdb682d..d312cbf 100644
--- a/scribus/ui/flopwidget.h
+++ b/scribus/ui/flopwidget.h
@@ -9,7 +9,9 @@ for which a new license (GPL+exception) is in place.
 
 
 #include <QButtonGroup>
+#include <QHBoxLayout>
 #include <QToolButton>
+#include "ui/widgets/buttongroup.h"
 #include "ui/widgets/form_widget.h"
 
 class ScribusDoc;
@@ -31,7 +33,7 @@ public:
 	FlopWidget(QWidget* parent);
 	~FlopWidget() {};
 
-	QButtonGroup *flopGroup;
+	ButtonGroup *flopGroup;
 	QToolButton *flopRealHeight = {nullptr};
 	QToolButton *flopFontAscent = {nullptr};
 	QToolButton *flopLineSpacing = {nullptr};
diff --git a/scribus/ui/newdocdialog.cpp b/scribus/ui/newdocdialog.cpp
index c71ef70..9b14b16 100644
--- a/scribus/ui/newdocdialog.cpp
+++ b/scribus/ui/newdocdialog.cpp
@@ -142,12 +142,12 @@ void NewDocDialog::createNewDocPage()
 	comboSortSizes->addItem( tr("Size Desc"), PageSizeList::DimensionDesc);
 	comboSortSizes->setCurrentIndex(0);
 
-	pageOrientationButtons = new QButtonGroup();
+	pageOrientationButtons = new ButtonGroup();
 	pageOrientationButtons->addButton(buttonVertical, 0);
 	pageOrientationButtons->addButton(buttonHorizontal, 1);
 	pageOrientationButtons->button(orientation)->setChecked(true);
 
-	pageLayoutButtons = new QButtonGroup();
+	pageLayoutButtons = new ButtonGroup();
 	pageLayoutButtons->addButton(buttonSinglePage, 0);
 	pageLayoutButtons->addButton(buttonDoublePageLeft, 1);
 	pageLayoutButtons->addButton(buttonDoublePageRight, 2);
diff --git a/scribus/ui/newdocdialog.h b/scribus/ui/newdocdialog.h
index 50e9c95..6d7b962 100644
--- a/scribus/ui/newdocdialog.h
+++ b/scribus/ui/newdocdialog.h
@@ -34,6 +34,7 @@ class QSpinBox;
 #include "scribusstructs.h"
 #include "ui/customfdialog.h"
 #include "ui/nftwidget.h"
+#include "ui/widgets/buttongroup.h"
 
 #include "ui_newdocdialog.h"
 
@@ -119,8 +120,8 @@ private slots:
 protected:
 	PrefsManager& prefsManager;
 	QStringList recentDocList;
-	QButtonGroup* pageOrientationButtons;
-	QButtonGroup* pageLayoutButtons;
+	ButtonGroup* pageOrientationButtons;
+	ButtonGroup* pageLayoutButtons;
 
 	double m_unitRatio { 1.0 };
 	int m_orientation { 0 };
diff --git a/scribus/ui/propertiespalette_fill.cpp b/scribus/ui/propertiespalette_fill.cpp
index 7b7fc45..a5e425f 100644
--- a/scribus/ui/propertiespalette_fill.cpp
+++ b/scribus/ui/propertiespalette_fill.cpp
@@ -8,6 +8,7 @@
 #include "selection.h"
 #include "undomanager.h"
 #include "ui/colorpicker/colorpicker.h"
+#include "ui/widgets/buttongroup.h"
 
 PropertiesPalette_Fill::PropertiesPalette_Fill(QWidget *parent) :
 	QWidget(parent)
@@ -23,6 +24,10 @@ PropertiesPalette_Fill::PropertiesPalette_Fill(QWidget *parent) :
 
 	undoManager = UndoManager::instance();
 
+	ButtonGroup * fillRuleGroup = new ButtonGroup();
+	fillRuleGroup->addButton(evenOdd);
+	fillRuleGroup->addButton(nonZero);
+
 	iconSetChange();
 	languageChange();
 
diff --git a/scribus/ui/propertiespalette_line.cpp b/scribus/ui/propertiespalette_line.cpp
index 40060b2..e8bacf7 100644
--- a/scribus/ui/propertiespalette_line.cpp
+++ b/scribus/ui/propertiespalette_line.cpp
@@ -39,15 +39,15 @@ PropertiesPalette_Line::PropertiesPalette_Line( QWidget* parent) : QWidget(paren
 	setupUi(this);
 	setSizePolicy( QSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum));
 
-	buttonsCaps = new QButtonGroup();
+	buttonsCaps = new ButtonGroup();
 	buttonsCaps->addButton(buttonCapFlat, 0);
 	buttonsCaps->addButton(buttonCapSquare, 1);
 	buttonsCaps->addButton(buttonCapRound, 2);
 
-	buttonsJoins = new QButtonGroup();
+	buttonsJoins = new ButtonGroup();
 	buttonsJoins->addButton(buttonJoinMiter, 0);
-	buttonsJoins->addButton(buttonJoinBevel, 1);
 	buttonsJoins->addButton(buttonJoinRound, 2);
+	buttonsJoins->addButton(buttonJoinBevel, 1);
 
 	lineType->addItem( tr("Custom"));
 
diff --git a/scribus/ui/propertiespalette_line.h b/scribus/ui/propertiespalette_line.h
index d22b310..20350f3 100644
--- a/scribus/ui/propertiespalette_line.h
+++ b/scribus/ui/propertiespalette_line.h
@@ -12,6 +12,7 @@ for which a new license (GPL+exception) is in place.
 #include <QListWidgetItem>
 #include "scribusapi.h"
 #include "scguardedptr.h"
+#include "ui/widgets/buttongroup.h"
 #include "units.h"
 
 class ArrowChooser;
@@ -43,8 +44,8 @@ protected:
 	PageItem *m_item {nullptr};
 	ScribusMainWindow* m_ScMW {nullptr};
 	ScGuardedPtr<ScribusDoc> m_doc;
-	QButtonGroup *buttonsCaps;
-	QButtonGroup *buttonsJoins;
+	ButtonGroup *buttonsCaps;
+	ButtonGroup *buttonsJoins;
 	LineMarkerSelector *lineMarkerSelectorStart;
 	LineMarkerSelector *lineMarkerSelectorEnd;
 
diff --git a/scribus/ui/propertywidget_fontfeatures.cpp b/scribus/ui/propertywidget_fontfeatures.cpp
index 3e2dbd0..093cea3 100644
--- a/scribus/ui/propertywidget_fontfeatures.cpp
+++ b/scribus/ui/propertywidget_fontfeatures.cpp
@@ -16,6 +16,7 @@ for which a new license (GPL+exception) is in place.
 #include "scribusapp.h"
 #include "scribusdoc.h"
 #include "selection.h"
+#include "ui/widgets/buttongroup.h"
 
 #include "fonts/fontfeatures.h"
 
@@ -833,7 +834,7 @@ void PropertyWidget_FontFeatures::initWidgets()
 	OrdinalCheck->installEventFilter(this);
 	SlashedZeroCheck->installEventFilter(this);
 
-	QButtonGroup * groupCapitals = new QButtonGroup();
+	ButtonGroup * groupCapitals = new ButtonGroup();
 	groupCapitals->setExclusive(true);
 	groupCapitals->addButton(NormalCapRadio);
 	groupCapitals->addButton(SmallRadio);
@@ -845,19 +846,26 @@ void PropertyWidget_FontFeatures::initWidgets()
 	groupCapitals->addButton(UnicaseRadio);
 	groupCapitals->addButton(TitlingRadio);
 
-	QButtonGroup * groupFractions = new QButtonGroup();
+	ButtonGroup * groupPosition = new ButtonGroup();
+	groupPosition->setExclusive(true);
+	groupPosition->addButton(DefaultPosRadio);
+	groupPosition->addButton(SubscriptRadio);
+	groupPosition->addButton(SuperscriptRadio);
+	groupPosition->addButton(OrdinalCheck);
+
+	ButtonGroup * groupFractions = new ButtonGroup();
 	groupFractions->setExclusive(true);
 	groupFractions->addButton(DefaultFractionsRadio);
 	groupFractions->addButton(DiagonalRadio);
 	groupFractions->addButton(StackedRadio);
 
-	QButtonGroup * groupNumeralStyle = new QButtonGroup();
+	ButtonGroup * groupNumeralStyle = new ButtonGroup();
 	groupNumeralStyle->setExclusive(true);
 	groupNumeralStyle->addButton(DefaultStyleRadio);
 	groupNumeralStyle->addButton(LiningRadio);
 	groupNumeralStyle->addButton(OldStyleRadio);
 
-	QButtonGroup * groupNumeralWidth = new QButtonGroup();
+	ButtonGroup * groupNumeralWidth = new ButtonGroup();
 	groupNumeralWidth->setExclusive(true);
 	groupNumeralWidth->addButton(DefaultWidthRadio);
 	groupNumeralWidth->addButton(ProportionalRadio);
@@ -870,31 +878,10 @@ void PropertyWidget_FontFeatures::initWidgets()
 	HistoricalCheck->setChecked(false);
 	
 	NormalCapRadio->setChecked(true);
-	// SmallRadio->setChecked(false);
-	// SmallFromCRadio->setChecked(false);
-	// AllSmallCapsRadio->setChecked(false);
-	// PetiteRadio->setChecked(false);
-	// PetiteCapRadio->setChecked(false);
-	// AllPetiteCapsRadio->setChecked(false);
-	// UnicaseRadio->setChecked(false);
-	// TitlingRadio->setChecked(false);
-
 	DefaultStyleRadio->setChecked(true);
-	// LiningRadio->setChecked(false);
-	// OldStyleRadio->setChecked(false);
-
 	DefaultWidthRadio->setChecked(true);
-	// ProportionalRadio->setChecked(false);
-	// TabularRadio->setChecked(false);
-	
 	DefaultFractionsRadio->setChecked(true);
-	// DiagonalRadio->setChecked(false);
-	// StackedRadio->setChecked(false);
-
 	DefaultPosRadio->setChecked(true);
-	// SubscriptRadio->setChecked(false);
-	// SuperscriptRadio->setChecked(false);
-	// OrdinalCheck->setChecked(false);
 
 	SlashedZeroCheck->setChecked(false);
 
diff --git a/scribus/ui/smalignselect.cpp b/scribus/ui/smalignselect.cpp
index 25edea2..35d6064 100644
--- a/scribus/ui/smalignselect.cpp
+++ b/scribus/ui/smalignselect.cpp
@@ -4,24 +4,28 @@ to the COPYING file provided with the program. Following this notice may exist
 a copyright and/or license notice that predates the release of Scribus 1.3.2
 for which a new license (GPL+exception) is in place.
 */
+#include <QLayoutItem>
 #include <QToolTip>
 #include "smalignselect.h"
-#include "iconmanager.h"
-#include "scribusapp.h"
+#include "iconmanager.h"
+#include "scribusapp.h"
 
 SMAlignSelect::SMAlignSelect(QWidget *parent)
 	: AlignSelect(parent)
 {
+	QSpacerItem * spacer = new QSpacerItem(4, 0, QSizePolicy::Fixed);
+	layout()->addItem(spacer);
+
 	parentButton = new QToolButton(this);
-	parentButton->setText( "");
+	parentButton->setText( "");
 	parentButton->setToolTip( tr("Use parent style's alignment instead of overriding it"));
-	addWidget( parentButton );
+	addWidget( parentButton );
 	resize(minimumSizeHint());
 	parentButton->hide();
-
-	iconSetChange();
-
-	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
+
+	iconSetChange();
+
+	connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
 }
 
 void SMAlignSelect::setStyle(int a, int d)
@@ -79,9 +83,9 @@ void SMAlignSelect::pbPressed()
 {
 	m_useParentStyle = true;
 }
-
-void SMAlignSelect::iconSetChange()
-{
-	IconManager &im = IconManager::instance();
-	parentButton->setIcon(im.loadIcon("reset-style-changes"));
-}
+
+void SMAlignSelect::iconSetChange()
+{
+	IconManager &im = IconManager::instance();
+	parentButton->setIcon(im.loadIcon("reset-style-changes"));
+}
diff --git a/scribus/ui/styleselect.cpp b/scribus/ui/styleselect.cpp
index ab7c677..a1d6920 100644
--- a/scribus/ui/styleselect.cpp
+++ b/scribus/ui/styleselect.cpp
@@ -10,6 +10,7 @@ for which a new license (GPL+exception) is in place.
 #include "iconmanager.h"
 #include "scribusapp.h"
 #include "styleselect.h"
+#include "ui/widgets/buttongroup.h"
 
 StrikeValues::StrikeValues( QWidget* parent ) : QFrame( parent )
 {
@@ -130,7 +131,7 @@ void ShadowValues::languageChange()
 StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 {
 	ssLayout = new QHBoxLayout(this);
-	ssLayout->setSpacing(4);
+	ssLayout->setSpacing(0);
 	ssLayout->setContentsMargins(0, 0, 0, 0);
 
 	UnderlineVal = new UnderlineValues( nullptr );
@@ -144,12 +145,18 @@ StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 	underlineButton->setMenu(UnderlinePop);
 	underlineButton->setPopupMode(QToolButton::DelayedPopup);
 	ssLayout->addWidget( underlineButton );
+
+	ssLayout->addSpacing(4);
+
 	underlineWordButton = new QToolButton( this );
 	underlineWordButton->setText( "" );
 	underlineWordButton->setCheckable( true );
 	underlineWordButton->setMenu(UnderlinePop);
 	underlineWordButton->setPopupMode(QToolButton::DelayedPopup);
-	ssLayout->addWidget( underlineWordButton );	
+	ssLayout->addWidget( underlineWordButton );
+
+	ssLayout->addSpacing(4);
+
 	StrikeVal = new StrikeValues( nullptr );
 	StrikePop = new QMenu();
 	StrikeValAct = new QWidgetAction(this);
@@ -162,7 +169,7 @@ StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 	strikeoutButton->setPopupMode(QToolButton::DelayedPopup);
 	ssLayout->addWidget( strikeoutButton );
 
-	ssLayout->addSpacing(12);
+	ssLayout->addSpacing(16);
 
 	subscriptButton = new QToolButton( this );
 	subscriptButton->setText( "" );
@@ -173,7 +180,12 @@ StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 	superscriptButton->setCheckable( true );
 	ssLayout->addWidget( superscriptButton );
 
-	ssLayout->addSpacing(12);
+	ButtonGroup *bgSub = new ButtonGroup();
+	bgSub->setExclusive(false);
+	bgSub->addButton(subscriptButton);
+	bgSub->addButton(superscriptButton);
+
+	ssLayout->addSpacing(16);
 
 	allcapsButton = new QToolButton( this );
 	allcapsButton->setText("");
@@ -184,7 +196,12 @@ StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 	smallcapsButton->setCheckable( true );
 	ssLayout->addWidget( smallcapsButton );
 
-	ssLayout->addSpacing(12);
+	ButtonGroup *bgCaps = new ButtonGroup();
+	bgCaps->setExclusive(false);
+	bgCaps->addButton(allcapsButton);
+	bgCaps->addButton(smallcapsButton);
+
+	ssLayout->addSpacing(16);
 
 	OutlineVal = new OutlineValues( nullptr );
 	OutlinePop = new QMenu();
@@ -198,6 +215,8 @@ StyleSelect::StyleSelect(QWidget* parent) : QWidget(parent)
 	outlineButton->setPopupMode(QToolButton::DelayedPopup);
 	ssLayout->addWidget( outlineButton );
 
+	ssLayout->addSpacing(4);
+
 	ShadowVal = new ShadowValues( nullptr );
 	ShadowPop = new QMenu();
 	ShadowValAct = new QWidgetAction(this);
buttongroup_2025-07-04_01.patch (19,671 bytes)   
files.zip (13,836 bytes)
preview.png (9,894 bytes)   
preview.png (9,894 bytes)   

Issue History

Date Modified Username Field Change
2025-07-04 21:26 nitramr New Issue
2025-07-04 21:26 nitramr Status new => assigned
2025-07-04 21:26 nitramr Assigned To => nitramr
2025-07-04 21:26 nitramr File Added: buttongroup_2025-07-04_01.patch
2025-07-04 21:26 nitramr File Added: files.zip
2025-07-04 21:26 nitramr File Added: preview.png