View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0017571 | Scribus | User Interface | public | 2025-07-04 21:26 | 2025-07-04 21:26 |
Reporter | nitramr | Assigned To | nitramr | ||
Priority | normal | Severity | feature | Reproducibility | N/A |
Status | assigned | Resolution | open | ||
Platform | Desktop PC | OS | Ubuntu | OS Version | 24.10 64-bit |
Product Version | 1.7.1.svn | ||||
Target Version | 1.7 milestone | ||||
Summary | 0017571: Add button group ui widget | ||||
Description | I 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) | ||||
Tags | No tags attached. | ||||
Patch | Yes | ||||
|
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); |
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 |