[utilities/konsole] src: Add Split Settings: Toggle Visiblity and Dragger Size

Tomaz Canabrava null at kde.org
Thu Jul 2 09:35:00 BST 2020


Git commit 51883380af4c2fef061ceedae95a567b8f1d6f17 by Tomaz  Canabrava, on behalf of Tomaz Canabrava.
Committed on 02/07/2020 at 08:30.
Pushed by tcanabrava into branch 'master'.

Add Split Settings: Toggle Visiblity and Dragger Size

The Splitter is a great addition to konsole, but it lacked one
thing that always made KDE software proud: Configurability.
Some people like to have the header bar, some people don't,
some people prefer to have thin lines separating the views, some people
prefer to have the lines a bit thicker so it's easy to drag them with
the mouse.

This patch introduces those two settings in a new Tab on the Settings.

FIXED-IN: 20.08

FEATURE:

GUI:

CHANGELOG: Add Splitter settings for visibility and drag size

M  +1    -1    src/MainWindow.cpp
M  +9    -0    src/TerminalDisplay.cpp
M  +2    -0    src/TerminalDisplay.h
M  +40   -0    src/TerminalHeaderBar.cpp
M  +4    -0    src/TerminalHeaderBar.h
M  +17   -6    src/ViewSplitter.cpp
M  +136  -21   src/settings/TabBarSettings.ui
M  +20   -0    src/settings/konsole.kcfg

https://invent.kde.org/utilities/konsole/commit/51883380af4c2fef061ceedae95a567b8f1d6f17

diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index 5b6e441a..a56803cd 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -764,7 +764,7 @@ void MainWindow::showSettingsDialog(const bool showProfilePage)
     profilePage->setIcon(QIcon::fromTheme(QStringLiteral("preferences-system-profiles")));
     confDialog->addPage(profilePage, true);
 
-    const QString tabBarPageName = i18nc("@title Preferences page name", "Tab Bar");
+    const QString tabBarPageName = i18nc("@title Preferences page name", "Tab Bar / Splitters");
     auto tabBarPage = new KPageWidgetItem(new TabBarSettings(confDialog), tabBarPageName);
     tabBarPage->setIcon(QIcon::fromTheme(QStringLiteral("system-run")));
     confDialog->addPage(tabBarPage, true);
diff --git a/src/TerminalDisplay.cpp b/src/TerminalDisplay.cpp
index 5927a5af..58edde6a 100644
--- a/src/TerminalDisplay.cpp
+++ b/src/TerminalDisplay.cpp
@@ -22,6 +22,7 @@
 
 // Own
 #include "TerminalDisplay.h"
+#include "KonsoleSettings.h"
 
 // Config
 #include "config-konsole.h"
@@ -570,6 +571,8 @@ TerminalDisplay::TerminalDisplay(QWidget* parent)
 #ifndef QT_NO_ACCESSIBILITY
     QAccessible::installFactory(Konsole::accessibleInterfaceFactory);
 #endif
+
+    connect(KonsoleSettings::self(), &KonsoleSettings::configChanged, this, &TerminalDisplay::setupHeaderVisibility);
 }
 
 TerminalDisplay::~TerminalDisplay()
@@ -586,6 +589,12 @@ TerminalDisplay::~TerminalDisplay()
     _outputSuspendedMessageWidget = nullptr;
 }
 
+void TerminalDisplay::setupHeaderVisibility()
+{
+    _headerBar->applyVisibilitySettings();
+    calcGeometry();
+}
+
 void TerminalDisplay::hideDragTarget()
 {
     _drawOverlay = false;
diff --git a/src/TerminalDisplay.h b/src/TerminalDisplay.h
index 7587bd1a..e5c77f06 100644
--- a/src/TerminalDisplay.h
+++ b/src/TerminalDisplay.h
@@ -693,6 +693,8 @@ private:
 
     void paintFilters(QPainter &painter);
 
+    void setupHeaderVisibility();
+
     // returns a region covering all of the areas of the widget which contain
     // a hotspot
     QRegion hotSpotRegion() const;
diff --git a/src/TerminalHeaderBar.cpp b/src/TerminalHeaderBar.cpp
index 96db18ad..d06848fa 100644
--- a/src/TerminalHeaderBar.cpp
+++ b/src/TerminalHeaderBar.cpp
@@ -24,6 +24,8 @@
 #include "TerminalDisplay.h"
 #include "SessionController.h"
 #include "ViewProperties.h"
+#include "KonsoleSettings.h"
+#include "ViewSplitter.h"
 
 #include <KLocalizedString>
 #include <QBoxLayout>
@@ -250,4 +252,42 @@ QSize TerminalHeaderBar::minimumSizeHint() const
     return {height, height};
 }
 
+QSplitter *TerminalHeaderBar::getTopLevelSplitter()
+{
+    QWidget *p = parentWidget();
+    // This is expected.
+    if (qobject_cast<TerminalDisplay*>(p)) {
+        p = p->parentWidget();
+    }
+
+    // this is also expected.
+    auto *innerSplitter = qobject_cast<ViewSplitter*>(p);
+    if (!innerSplitter) {
+        return nullptr;
+    }
+
+    return innerSplitter->getToplevelSplitter();
+}
+
+void TerminalHeaderBar::applyVisibilitySettings()
+{
+    auto *settings = KonsoleSettings::self();
+    auto toVisibility = settings->splitViewVisibility();
+    switch (toVisibility)
+    {
+    case KonsoleSettings::AlwaysShowSplitHeader:
+        setVisible(true);
+    break;
+    case KonsoleSettings::ShowSplitHeaderWhenNeeded: {
+        const bool visible = !(getTopLevelSplitter()->findChildren<TerminalDisplay*>().count() == 1);
+        setVisible(visible);
+    }
+    break;
+    case KonsoleSettings::AlwaysHideSplitHeader:
+        setVisible(false);
+    default:
+        break;
+    }
+}
+
 }
diff --git a/src/TerminalHeaderBar.h b/src/TerminalHeaderBar.h
index 3118786f..4bcb4cbc 100644
--- a/src/TerminalHeaderBar.h
+++ b/src/TerminalHeaderBar.h
@@ -29,6 +29,8 @@
 class QLabel;
 class QToolButton;
 class QBoxLayout;
+class QSplitter;
+
 namespace Konsole {
     class TerminalDisplay;
     class ViewProperties;
@@ -40,6 +42,8 @@ public:
     explicit TerminalHeaderBar(QWidget *parent = nullptr);
     void finishHeaderSetup(ViewProperties *properties);
     QSize minimumSizeHint() const override;
+    void applyVisibilitySettings();
+    QSplitter *getTopLevelSplitter();
 
 public Q_SLOTS:
     void setFocusIndicatorState(bool focused);
diff --git a/src/ViewSplitter.cpp b/src/ViewSplitter.cpp
index 40bc0c48..9e553219 100644
--- a/src/ViewSplitter.cpp
+++ b/src/ViewSplitter.cpp
@@ -21,6 +21,7 @@
 
 // Own
 #include "ViewSplitter.h"
+#include "KonsoleSettings.h"
 
 // Qt
 #include <QChildEvent>
@@ -39,10 +40,24 @@ using Konsole::TerminalDisplay;
 
 //TODO: Connect the TerminalDisplay destroyed signal here.
 
+namespace {
+    int calculateHandleWidth(int settingsEnum) {
+        switch (settingsEnum) {
+            case Konsole::KonsoleSettings::SplitDragHandleLarge: return 10;
+            case Konsole::KonsoleSettings::SplitDragHandleMedium: return  5;
+            case Konsole::KonsoleSettings::SplitDragHandleSmall: return  1;
+            default: return  1;
+        }
+    }
+}
+
 ViewSplitter::ViewSplitter(QWidget *parent) :
     QSplitter(parent)
 {
     setAcceptDrops(true);
+    connect(KonsoleSettings::self(), &KonsoleSettings::configChanged, this, [this]{
+        setHandleWidth(calculateHandleWidth(KonsoleSettings::self()->splitDragHandleSize()));
+    });
 }
 
 /* This function is called on the toplevel splitter, we need to look at the actual ViewSplitter inside it */
@@ -130,12 +145,8 @@ void ViewSplitter::childEvent(QChildEvent *event)
     }
 
     auto terminals = getToplevelSplitter()->findChildren<TerminalDisplay*>();
-    if (terminals.size() == 1) {
-        terminals.at(0)->headerBar()->setVisible(false);
-    } else {
-        for(auto terminal : terminals) {
-            terminal->headerBar()->setVisible(true);
-        }
+    for(auto terminal : terminals) {
+        terminal->headerBar()->applyVisibilitySettings();
     }
 }
 
diff --git a/src/settings/TabBarSettings.ui b/src/settings/TabBarSettings.ui
index 3cf2fc18..a199f03d 100644
--- a/src/settings/TabBarSettings.ui
+++ b/src/settings/TabBarSettings.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>382</width>
-    <height>418</height>
+    <width>507</width>
+    <height>473</height>
    </rect>
   </property>
   <layout class="QVBoxLayout" name="verticalLayout">
@@ -29,7 +29,7 @@
    <item>
     <widget class="QTabWidget" name="tabs">
      <property name="currentIndex">
-      <number>0</number>
+      <number>2</number>
      </property>
      <widget class="QWidget" name="appearanceTab">
       <attribute name="title">
@@ -254,10 +254,10 @@
            <property name="enabled">
             <bool>false</bool>
            </property>
-           <property name="filter" stdset="0">
+           <property name="filter">
             <string>text/css</string>
            </property>
-           <property name="placeholderText" stdset="0">
+           <property name="placeholderText">
             <string comment="@item:intext Optional file path is empty">(none)</string>
            </property>
           </widget>
@@ -372,6 +372,119 @@
        </item>
       </layout>
      </widget>
+     <widget class="QWidget" name="splitTab">
+      <attribute name="title">
+       <string>Splits</string>
+      </attribute>
+      <layout class="QFormLayout" name="formLayout">
+       <item row="0" column="0">
+        <widget class="QLabel" name="label">
+         <property name="text">
+          <string>Show Header</string>
+         </property>
+        </widget>
+       </item>
+       <item row="0" column="1">
+        <widget class="QRadioButton" name="ShowSplitHeaderWhenNeeded">
+         <property name="text">
+          <string>When needed</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitViewVisibility</string>
+         </attribute>
+        </widget>
+       </item>
+       <item row="2" column="1">
+        <widget class="QRadioButton" name="AlwaysHideSplitHeader">
+         <property name="text">
+          <string>Never</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitViewVisibility</string>
+         </attribute>
+        </widget>
+       </item>
+       <item row="3" column="1">
+        <spacer name="verticalSpacer_2">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeType">
+          <enum>QSizePolicy::Fixed</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>16</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="4" column="0">
+        <widget class="QLabel" name="label_2">
+         <property name="text">
+          <string>Drag Handle Size</string>
+         </property>
+         <property name="margin">
+          <number>0</number>
+         </property>
+        </widget>
+       </item>
+       <item row="4" column="1">
+        <widget class="QRadioButton" name="SplitDragHandleSmall">
+         <property name="text">
+          <string>Small</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitDragHandleSize</string>
+         </attribute>
+        </widget>
+       </item>
+       <item row="5" column="1">
+        <widget class="QRadioButton" name="SplitDragHandleMedium">
+         <property name="text">
+          <string>Medium</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitDragHandleSize</string>
+         </attribute>
+        </widget>
+       </item>
+       <item row="6" column="1">
+        <widget class="QRadioButton" name="SplitDragHandleLarge">
+         <property name="text">
+          <string>Large</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitDragHandleSize</string>
+         </attribute>
+        </widget>
+       </item>
+       <item row="7" column="1">
+        <spacer name="verticalSpacer">
+         <property name="orientation">
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="1" column="1">
+        <widget class="QRadioButton" name="AlwaysShowSplitHeader">
+         <property name="text">
+          <string>Always</string>
+         </property>
+         <attribute name="buttonGroup">
+          <string notr="true">kcfg_SplitViewVisibility</string>
+         </attribute>
+        </widget>
+       </item>
+      </layout>
+     </widget>
     </widget>
    </item>
   </layout>
@@ -379,7 +492,7 @@
  <customwidgets>
   <customwidget>
    <class>KUrlRequester</class>
-   <extends>QFrame</extends>
+   <extends>QWidget</extends>
    <header>kurlrequester.h</header>
    <container>1</container>
   </customwidget>
@@ -405,7 +518,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>None</receiver>
+   <receiver>Bottom</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -421,7 +534,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>showCloseTabButtonLabel</receiver>
+   <receiver>kcfg_TabBarUseUserStyleSheet</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -437,7 +550,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>OnTabBar</receiver>
+   <receiver>miscellaneousAppearanceLabel</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -453,7 +566,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>Bottom</receiver>
+   <receiver>kcfg_ExpandTabWidth</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -499,10 +612,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>AlwaysHideTabBar</sender>
+   <sender>kcfg_TabBarUseUserStyleSheet</sender>
    <signal>toggled(bool)</signal>
-   <receiver>Top</receiver>
-   <slot>setDisabled(bool)</slot>
+   <receiver>kcfg_TabBarUserStyleSheetFile</receiver>
+   <slot>setEnabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
      <x>20</x>
@@ -517,7 +630,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>miscellaneousAppearanceLabel</receiver>
+   <receiver>Top</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -533,7 +646,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>kcfg_ExpandTabWidth</receiver>
+   <receiver>showCloseTabButtonLabel</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -549,7 +662,7 @@
   <connection>
    <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>kcfg_TabBarUseUserStyleSheet</receiver>
+   <receiver>OnTabBar</receiver>
    <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
@@ -563,10 +676,10 @@
    </hints>
   </connection>
   <connection>
-   <sender>kcfg_TabBarUseUserStyleSheet</sender>
+   <sender>AlwaysHideTabBar</sender>
    <signal>toggled(bool)</signal>
-   <receiver>kcfg_TabBarUserStyleSheetFile</receiver>
-   <slot>setEnabled(bool)</slot>
+   <receiver>None</receiver>
+   <slot>setDisabled(bool)</slot>
    <hints>
     <hint type="sourcelabel">
      <x>20</x>
@@ -612,9 +725,11 @@
   </connection>
  </connections>
  <buttongroups>
+  <buttongroup name="kcfg_SplitDragHandleSize"/>
   <buttongroup name="kcfg_TabBarVisibility"/>
-  <buttongroup name="kcfg_NewTabBehavior"/>
-  <buttongroup name="kcfg_CloseTabButton"/>
   <buttongroup name="kcfg_TabBarPosition"/>
+  <buttongroup name="kcfg_CloseTabButton"/>
+  <buttongroup name="kcfg_NewTabBehavior"/>
+  <buttongroup name="kcfg_SplitViewVisibility"/>
  </buttongroups>
 </ui>
diff --git a/src/settings/konsole.kcfg b/src/settings/konsole.kcfg
index abc31a5d..ac7c9b10 100644
--- a/src/settings/konsole.kcfg
+++ b/src/settings/konsole.kcfg
@@ -83,6 +83,26 @@
       <default>true</default>
     </entry>
   </group>
+  <group name="SplitView">
+    <entry name="SplitViewVisibility" type="Enum">
+      <label>Control the visibility of the whole tab bar</label>
+      <choices>
+        <choice name="AlwaysShowSplitHeader" />
+        <choice name="ShowSplitHeaderWhenNeeded" />
+        <choice name="AlwaysHideSplitHeader" />
+      </choices>
+      <default>ShowTabBarWhenNeeded</default>
+    </entry>
+    <entry name="SplitDragHandleSize" type="Enum">
+        <label> Control the size of the handle between panels </label>
+        <choices>
+            <choice name="SplitDragHandleSmall"/>
+            <choice name="SplitDragHandleMedium"/>
+            <choice name="SplitDragHandleLarge"/>
+        </choices>
+        <default>SplitDragHandleSmall</default>
+    </entry>
+  </group>
   <group name="TabBar">
     <entry name="TabBarVisibility" type="Enum">
       <label>Control the visibility of the whole tab bar</label>


More information about the kde-doc-english mailing list