diff options
author | Alexander Golubev <fatzer2@gmail.com> | 2025-10-13 02:10:36 +0300 |
---|---|---|
committer | Alexander Golubev <fatzer2@gmail.com> | 2025-10-13 03:09:44 +0300 |
commit | 2d94ad5f3efc1d21e3823fd5eea1886ce11eaa18 (patch) | |
tree | 7c38eceb5bf61f12cb8549934665a1b94c2ec3c9 | |
parent | 0116807fc0ae8fe936b70871dbdd99b8eedd15a0 (diff) | |
download | tdebase-feat/tray-margin.tar.gz tdebase-feat/tray-margin.zip |
kicker: add an option to set external margin for tray iconsfeat/tray-margin
This commit adds an option to set both: margin (space from an icon to
the border) and spacing (space between two neighbouring icons). The
option to tweak spacing was previously introduced in fa284a4598 and was
called "margin" the actual margin was reduced to 0. Unfortunately that
had its own unwanted side-effects listed in #647. Before fa284a4598 the
margin and spacing were fixed to be 1.
This commit restores old defaults for margin & spacing i.e. 1 to better
conform to config of older systems. Effectively this resolved most
issues raised in #647 and eliminates any regressions, though there are
some caveat cases when the behaviour is not ideal e.g. next settings:
panel_width=47
spacing=1
margin=0
result in next layout:
[0px][icon][2px][icon][1px]
when ideal would be:
[1px][icon][1px][icon][1px]
On the other hand in such a case a user should probably just use
margin=spacing=1.
Besides that commit contains some minor refactoring.
Bug: https://mirror.git.trinitydesktop.org/gitea/TDE/tdebase/issues/647
Signed-off-by: Alexander Golubev <fatzer2@gmail.com>
-rw-r--r-- | kicker/applets/systemtray/systemtrayapplet.cpp | 111 | ||||
-rw-r--r-- | kicker/applets/systemtray/systemtrayapplet.h | 4 |
2 files changed, 74 insertions, 41 deletions
diff --git a/kicker/applets/systemtray/systemtrayapplet.cpp b/kicker/applets/systemtray/systemtrayapplet.cpp index 3ca721792..27ec27078 100644 --- a/kicker/applets/systemtray/systemtrayapplet.cpp +++ b/kicker/applets/systemtray/systemtrayapplet.cpp @@ -38,6 +38,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include <tqpainter.h> #include <tqimage.h> #include <tqlayout.h> +#include <tqwhatsthis.h> #include <dcopclient.h> #include <tdeapplication.h> @@ -91,6 +92,8 @@ SystemTrayApplet::SystemTrayApplet(const TQString& configFile, Type type, int ac m_showClockSettingCB(nullptr), m_iconMargin(1), m_iconMarginSB(nullptr), + m_iconSpacing(1), + m_iconSpacingSB(nullptr), m_layout(nullptr) { DCOPObject::setObjId("SystemTrayApplet"); @@ -257,16 +260,18 @@ void SystemTrayApplet::preferences() connect(m_settingsDialog, TQ_SIGNAL(okClicked()), this, TQ_SLOT(applySettings())); connect(m_settingsDialog, TQ_SIGNAL(finished()), this, TQ_SLOT(settingsDialogFinished())); - TQGrid *settingsGrid = m_settingsDialog->makeGridMainWidget( 3, TQt::Vertical); + TQWidget *settingsWidget = m_settingsDialog->makeMainWidget(); + TQVBoxLayout *settingsLayout = new TQVBoxLayout(settingsWidget); - m_showClockSettingCB = new TQCheckBox(i18n("Show Clock in Tray"), settingsGrid); + m_showClockSettingCB = new TQCheckBox(i18n("Show clock in tray"), settingsWidget); m_showClockSettingCB->setChecked(m_showClockInTray); + settingsLayout->addWidget(m_showClockSettingCB); + settingsLayout->setSpacing(m_settingsDialog->spacingHint()); - //m_iconSelector = new TDEActionSelector(m_settingsDialog); - m_iconSelector = new TDEActionSelector(settingsGrid); + m_iconSelector = new TDEActionSelector(settingsWidget); m_iconSelector->setAvailableLabel(i18n("Hidden icons:")); m_iconSelector->setSelectedLabel(i18n("Visible icons:")); - //m_settingsDialog->setMainWidget(m_iconSelector); + settingsLayout->addWidget(m_iconSelector); TQListBox *hiddenListBox = m_iconSelector->availableListBox(); TQListBox *shownListBox = m_iconSelector->selectedListBox(); @@ -293,12 +298,37 @@ void SystemTrayApplet::preferences() } } - TQHBox *hbox = new TQHBox(settingsGrid); - hbox->setSizePolicy(TQSizePolicy::Maximum, TQSizePolicy::Maximum); - TQLabel *iconMarginL = new TQLabel(i18n("Icon margin: "), hbox); - m_iconMarginSB = new TQSpinBox(0, 20, 1, hbox); + TQGridLayout *marginGrid = new TQGridLayout(2, 3); + marginGrid->setSpacing(m_settingsDialog->spacingHint()); + marginGrid->setColStretch(2,1); // last empty column operates as a spacer + + TQLabel *iconMarginL = new TQLabel(i18n("Icon &margin:"), settingsWidget); + m_iconMarginSB = new TQSpinBox(0, 20, 1, settingsWidget); m_iconMarginSB->setSuffix(i18n(" px")); m_iconMarginSB->setValue(m_iconMargin); + iconMarginL->setBuddy(m_iconMarginSB); + TQWhatsThis::add(iconMarginL, i18n( "Preferred margin between icons in system tray and outer border.<br>" + "Note that the actual margins can be either larger (in case there is " + "extra free space on the panel) or smaller (in case the panel is " + "not able to fit a single raw).") ); + + marginGrid->addWidget(iconMarginL, 0, 0); + marginGrid->addWidget(m_iconMarginSB, 0, 1); + + TQLabel *iconSpacingL = new TQLabel(i18n("Icon &spacing:"), settingsWidget); + m_iconSpacingSB = new TQSpinBox(0, 20, 1, settingsWidget); + m_iconSpacingSB->setSuffix(i18n(" px")); + m_iconSpacingSB->setValue(m_iconSpacing); + iconSpacingL->setBuddy(m_iconSpacingSB); + TQWhatsThis::add(iconSpacingL, i18n( "Minimal spacing between neighbouring icons in system tray.<br>" + "Note that the actual spacing can be larger (in case there is " + "extra free space on the panel).") ); + + + marginGrid->addWidget(iconSpacingL, 1, 0); + marginGrid->addWidget(m_iconSpacingSB, 1, 1); + + settingsLayout->addLayout(marginGrid); m_settingsDialog->show(); } @@ -319,6 +349,7 @@ void SystemTrayApplet::applySettings() m_showClockInTray = m_showClockSettingCB->isChecked(); m_iconMargin = m_iconMarginSB->value(); + m_iconSpacing = m_iconSpacingSB->value(); TDEConfig *conf = config(); @@ -369,6 +400,7 @@ void SystemTrayApplet::applySettings() conf->setGroup("System Tray"); conf->writeEntry("ShowClockInTray", m_showClockInTray); conf->writeEntry("IconMargin", m_iconMargin); + conf->writeEntry("IconSpacing", m_iconSpacing); conf->sync(); @@ -530,6 +562,7 @@ void SystemTrayApplet::loadSettings() m_iconSize = conf->readNumEntry("systrayIconWidth", 22); m_showClockInTray = conf->readNumEntry("ShowClockInTray", false); m_iconMargin = conf->readNumEntry("IconMargin", 1); + m_iconSpacing = conf->readNumEntry("IconSpacing", 1); } void SystemTrayApplet::systemTrayWindowAdded( WId w ) @@ -810,7 +843,7 @@ int SystemTrayApplet::maxIconHeight() const int largest = m_iconSize; TrayEmbedList::const_iterator lastEmb = m_shownWins.end(); - for (TrayEmbedList::const_iterator emb = m_shownWins.begin(); emb != m_shownWins.end(); ++emb) + for (TrayEmbedList::const_iterator emb = m_shownWins.begin(); emb != lastEmb; ++emb) { if (*emb == 0) { @@ -934,20 +967,10 @@ void SystemTrayApplet::layoutTray() { setUpdatesEnabled(false); - int iconCount = m_shownWins.count(); - - if (m_showHidden) - { - iconCount += m_hiddenWins.count(); - } - - /* heightWidth = height or width in pixels (depends on orientation()) - * nbrOfLines = number of rows or cols (depends on orientation()) - * line = what line to draw an icon in */ - int i = 0, line, nbrOfLines, heightWidth; + int i = 0; bool showExpandButton = m_expandButton && m_expandButton->isVisibleTo(this); delete m_layout; - m_layout = new TQGridLayout(this, 1, 1, 0, m_iconMargin); + m_layout = new TQGridLayout(this, 1, 1, m_iconMargin, m_iconSpacing); if (m_expandButton) { @@ -966,22 +989,28 @@ void SystemTrayApplet::layoutTray() int col = 0; // - // The margin and spacing specified in the layout implies that: - // [-- m_iconMargin pixels --] [-- first icon --] [-- m_iconMargin pixels --] ... [-- m_iconMargin pixels --] [-- last icon --] [-- m_iconMargin pixels --] + // The margin and spacing specified in the layout implies that it looks like: // - // So, if we say that iconWidth is the icon width plus the m_iconMargin pixels spacing, then the available width for the icons - // is the widget width minus m_iconMargin pixels margin. Forgetting these m_iconMargin pixels broke the layout algorithm in KDE <= 3.5.9. + // [-- m_iconMargin px --] [-- first icon --] [-- m_iconSpacing px --] ... [-- m_iconSpacing px --] [-- last icon --] [-- m_iconMargin px --] // - // This fix makes the workarounds in the heightForWidth() and widthForHeight() methods unneeded. + // So, the width of this layout should conform to the relation: // + // width() == iconSize*nbrOfLines + 2*m_iconMargin + (nbrOfLines-1)*m_iconSpacing. + // + // Solving it for number of lines we get: + // + // width() - 2*m_iconMargin + m_iconSpacing + // nbrOfLines = ------------------------------------------ + // iconSize + m_iconSpacing if (orientation() == TQt::Vertical) { - int iconWidth = maxIconWidth() + m_iconMargin * 2; // +2 for the margins that implied by the layout - heightWidth = width() - m_iconMargin * 2; - // to avoid nbrOfLines=0 we ensure heightWidth >= iconWidth! - heightWidth = heightWidth < iconWidth ? iconWidth : heightWidth; - nbrOfLines = heightWidth / iconWidth; + int nbrOfLines = (width() - 2*m_iconMargin + m_iconSpacing) / + (maxIconWidth() + m_iconSpacing); + if (nbrOfLines < 1) { + nbrOfLines = 1; // avoid nbrOfLines==0 or negative (in case m_iconMargin is unreasonably large) + m_layout->setMargin( (width() - maxIconWidth()) / 2); // also adjust the margins, so the icons won't get shifted beyond visibility + } m_layout->addMultiCellWidget(m_leftSpacer, 0, 0, @@ -1004,7 +1033,7 @@ void SystemTrayApplet::layoutTray() for (TrayEmbedList::const_iterator emb = m_hiddenWins.begin(); emb != lastEmb; ++emb) { - line = i % nbrOfLines; + int line = i % nbrOfLines; (*emb)->show(); m_layout->addWidget((*emb), col, line, TQt::AlignHCenter | TQt::AlignVCenter); @@ -1022,7 +1051,7 @@ void SystemTrayApplet::layoutTray() for (TrayEmbedList::const_iterator emb = m_shownWins.begin(); emb != lastEmb; ++emb) { - line = i % nbrOfLines; + int line = i % nbrOfLines; (*emb)->show(); m_layout->addWidget((*emb), col, line, TQt::AlignHCenter | TQt::AlignVCenter); @@ -1054,10 +1083,12 @@ void SystemTrayApplet::layoutTray() } else // horizontal { - int iconHeight = maxIconHeight() + m_iconMargin * 2; // +2 for the margins that implied by the layout - heightWidth = height() - m_iconMargin * 2; - heightWidth = heightWidth < iconHeight ? iconHeight : heightWidth; // to avoid nbrOfLines=0 - nbrOfLines = heightWidth / iconHeight; + int nbrOfLines = (height() - 2*m_iconMargin + m_iconSpacing) / + (maxIconHeight() + m_iconSpacing); + if (nbrOfLines < 1) { + nbrOfLines = 1; // avoid nbrOfLines==0 or negative (in case m_iconMargin is unreasonably large) + m_layout->setMargin( (height() - maxIconHeight()) / 2); // also adjust the margins, so the icons won't shift beyond viability + } m_layout->addMultiCellWidget(m_leftSpacer, 0, nbrOfLines - 1, @@ -1079,7 +1110,7 @@ void SystemTrayApplet::layoutTray() TrayEmbedList::const_iterator lastEmb = m_hiddenWins.end(); for (TrayEmbedList::const_iterator emb = m_hiddenWins.begin(); emb != lastEmb; ++emb) { - line = i % nbrOfLines; + int line = i % nbrOfLines; (*emb)->show(); m_layout->addWidget((*emb), line, col, TQt::AlignHCenter | TQt::AlignVCenter); @@ -1097,7 +1128,7 @@ void SystemTrayApplet::layoutTray() for (TrayEmbedList::const_iterator emb = m_shownWins.begin(); emb != lastEmb; ++emb) { - line = i % nbrOfLines; + int line = i % nbrOfLines; (*emb)->show(); m_layout->addWidget((*emb), line, col, TQt::AlignHCenter | TQt::AlignVCenter); diff --git a/kicker/applets/systemtray/systemtrayapplet.h b/kicker/applets/systemtray/systemtrayapplet.h index d06d42b72..581cd10b0 100644 --- a/kicker/applets/systemtray/systemtrayapplet.h +++ b/kicker/applets/systemtray/systemtrayapplet.h @@ -120,8 +120,10 @@ private: int m_iconSize; bool m_showClockInTray; TQCheckBox *m_showClockSettingCB; - uint m_iconMargin; + int m_iconMargin; TQSpinBox *m_iconMarginSB; + int m_iconSpacing; + TQSpinBox *m_iconSpacingSB; TQGridLayout* m_layout; }; |