From f4605583e857c11247f557d665e267a1711d561b Mon Sep 17 00:00:00 2001
From: Shawn Rutledge <shawn.rutledge@digia.com>
Date: Fri, 22 Aug 2014 16:21:41 +0200
Subject: [PATCH] FileDialog: add sidebarVisible property and button

The sidebar takes up too much space on some devices, so now it is
possible for the application author to hide it by default.  The user
can also toggle it with a button similar to that used for the
Qt Creator sidebar, and this state is stored as a setting; however
if the application sets sidebarVisible: false, that overrides the setting.

[ChangeLog][QtQuick.Dialogs] FileDialog: added sidebarVisible property
and button

Task-number: QTBUG-39231
Change-Id: Ie8b379da02f4b12764732b2c01b79039722778ab
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
---
 .../dialogs/systemdialogs/FileDialogs.qml     |   7 +++
 src/dialogs/DefaultFileDialog.qml             |  17 ++++-
 src/dialogs/dialogs.pro                       |   2 +
 src/dialogs/qml/IconButtonStyle.qml           |  58 ++++++++++++++++++
 src/dialogs/qml/icons.ttf                     | Bin 0 -> 17372 bytes
 src/dialogs/qml/qmldir                        |   1 +
 src/dialogs/qquickabstractfiledialog.cpp      |   8 +++
 src/dialogs/qquickabstractfiledialog_p.h      |   5 ++
 src/dialogs/qquickplatformfiledialog.cpp      |  11 ++++
 9 files changed, 108 insertions(+), 1 deletion(-)
 create mode 100644 src/dialogs/qml/IconButtonStyle.qml
 create mode 100644 src/dialogs/qml/icons.ttf

diff --git a/examples/quick/dialogs/systemdialogs/FileDialogs.qml b/examples/quick/dialogs/systemdialogs/FileDialogs.qml
index 6bdaf7bc6..79a58b982 100644
--- a/examples/quick/dialogs/systemdialogs/FileDialogs.qml
+++ b/examples/quick/dialogs/systemdialogs/FileDialogs.qml
@@ -61,6 +61,7 @@ Item {
         selectFolder: fileDialogSelectFolder.checked
         nameFilters: [ "Image files (*.png *.jpg)", "All files (*)" ]
         selectedNameFilter: "All files (*)"
+        sidebarVisible: fileDialogSidebarVisible.checked
         onAccepted: {
             console.log("Accepted: " + fileUrls)
             if (fileDialogOpenFiles.checked)
@@ -106,6 +107,12 @@ Item {
             id: fileDialogOpenFiles
             text: "Open Files After Accepting"
         }
+        CheckBox {
+            id: fileDialogSidebarVisible
+            text: "Show Sidebar"
+            checked: fileDialog.sidebarVisible
+            Binding on checked { value: fileDialog.sidebarVisible }
+        }
         CheckBox {
             id: fileDialogVisible
             text: "Visible"
diff --git a/src/dialogs/DefaultFileDialog.qml b/src/dialogs/DefaultFileDialog.qml
index 278ee9dbe..7a91353f7 100644
--- a/src/dialogs/DefaultFileDialog.qml
+++ b/src/dialogs/DefaultFileDialog.qml
@@ -47,6 +47,7 @@ import QtQuick.Layouts 1.1
 import QtQuick.Window 2.1
 import Qt.labs.folderlistmodel 2.1
 import Qt.labs.settings 1.0
+import "qml"
 
 AbstractFileDialog {
     id: root
@@ -75,6 +76,7 @@ AbstractFileDialog {
         property alias height: root.height
         property alias sidebarWidth: sidebar.width
         property alias sidebarSplit: shortcuts.height
+        property alias sidebarVisible: root.sidebarVisible
         property variant favoriteFolders: []
     }
 
@@ -166,6 +168,7 @@ AbstractFileDialog {
                 Component.onCompleted: if (width < 1) width = sidebarSplitter.maxShortcutWidth
                 height: parent.height
                 width: 0 // initial width only; settings and onCompleted will override it
+                visible: root.sidebarVisible
                 SplitView {
                     id: sidebarSplitter
                     orientation: Qt.Vertical
@@ -414,11 +417,23 @@ AbstractFileDialog {
                 anchors.rightMargin: spacing
                 anchors.verticalCenter: parent.verticalCenter
                 spacing: 4
+                Button {
+                    id: toggleSidebarButton
+                    checkable: true
+                    style: IconButtonStyle { }
+                    text: "\u25E7"
+                    height: cancelButton.height
+                    width: height
+                    checked: root.sidebarVisible
+                    onClicked: {
+                        root.sidebarVisible = !root.sidebarVisible
+                    }
+                }
                 ComboBox {
                     id: filterField
                     model: root.nameFilters
                     visible: !selectFolder
-                    width: bottomBar.width - cancelButton.width - okButton.width - parent.spacing * 5
+                    width: bottomBar.width - toggleSidebarButton.width - cancelButton.width - okButton.width - parent.spacing * 6
                     anchors.verticalCenter: parent.verticalCenter
                     onCurrentTextChanged: {
                         root.selectNameFilter(currentText)
diff --git a/src/dialogs/dialogs.pro b/src/dialogs/dialogs.pro
index 4ad7888f5..c33fa7f78 100644
--- a/src/dialogs/dialogs.pro
+++ b/src/dialogs/dialogs.pro
@@ -51,7 +51,9 @@ DIALOGS_QML_FILES += \
     DefaultDialogWrapper.qml \
     qml/ColorSlider.qml \
     qml/DefaultWindowDecoration.qml \
+    qml/IconButtonStyle.qml \
     qml/qmldir \
+    qml/icons.ttf \
     images/critical.png \
     images/information.png \
     images/question.png \
diff --git a/src/dialogs/qml/IconButtonStyle.qml b/src/dialogs/qml/IconButtonStyle.qml
new file mode 100644
index 000000000..3af5b6cdf
--- /dev/null
+++ b/src/dialogs/qml/IconButtonStyle.qml
@@ -0,0 +1,58 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Quick Controls module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+**   * Redistributions of source code must retain the above copyright
+**     notice, this list of conditions and the following disclaimer.
+**   * Redistributions in binary form must reproduce the above copyright
+**     notice, this list of conditions and the following disclaimer in
+**     the documentation and/or other materials provided with the
+**     distribution.
+**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
+**     of its contributors may be used to endorse or promote products derived
+**     from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Private 1.0
+import QtQuick.Controls.Styles 1.1
+
+ButtonStyle {
+    FontLoader { id: iconFont; source: "icons.ttf" }
+
+    label: Text {
+        id: text
+        font.family: iconFont.name
+        font.pointSize: TextSingleton.font.pointSize * 1.5
+        renderType: Text.NativeRendering
+        text: control.text
+        color: SystemPaletteSingleton.buttonText(control.enabled)
+        verticalAlignment: Text.AlignVCenter
+        horizontalAlignment: Text.AlignHCenter
+    }
+}
diff --git a/src/dialogs/qml/icons.ttf b/src/dialogs/qml/icons.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..e94078eb5e466582118b8068c3d8a2e25b03f752
GIT binary patch
literal 17372
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

literal 0
HcmV?d00001

diff --git a/src/dialogs/qml/qmldir b/src/dialogs/qml/qmldir
index c2bf3e58e..184e80cec 100644
--- a/src/dialogs/qml/qmldir
+++ b/src/dialogs/qml/qmldir
@@ -1 +1,2 @@
 ColorSlider 1.0 ColorSlider.qml
+IconButtonStyle 1.0 IconButtonStyle.qml
diff --git a/src/dialogs/qquickabstractfiledialog.cpp b/src/dialogs/qquickabstractfiledialog.cpp
index 671f33f89..e7df94325 100644
--- a/src/dialogs/qquickabstractfiledialog.cpp
+++ b/src/dialogs/qquickabstractfiledialog.cpp
@@ -48,6 +48,7 @@ QQuickAbstractFileDialog::QQuickAbstractFileDialog(QObject *parent)
     , m_selectExisting(true)
     , m_selectMultiple(false)
     , m_selectFolder(false)
+    , m_sidebarVisible(true)
 {
     updateModes();
     connect(this, SIGNAL(accepted()), this, SIGNAL(selectionAccepted()));
@@ -155,6 +156,13 @@ void QQuickAbstractFileDialog::setSelectedNameFilterIndex(int idx)
     selectNameFilter(nameFilters().at(idx));
 }
 
+void QQuickAbstractFileDialog::setSidebarVisible(bool s)
+{
+    if (s == m_sidebarVisible) return;
+    m_sidebarVisible = s;
+    emit sidebarVisibleChanged();
+}
+
 QStringList QQuickAbstractFileDialog::selectedNameFilterExtensions() const
 {
     QString filterRaw = selectedNameFilter();
diff --git a/src/dialogs/qquickabstractfiledialog_p.h b/src/dialogs/qquickabstractfiledialog_p.h
index 499b645d5..aa740b120 100644
--- a/src/dialogs/qquickabstractfiledialog_p.h
+++ b/src/dialogs/qquickabstractfiledialog_p.h
@@ -65,6 +65,7 @@ class QQuickAbstractFileDialog : public QQuickAbstractDialog
     Q_PROPERTY(int selectedNameFilterIndex READ selectedNameFilterIndex WRITE setSelectedNameFilterIndex NOTIFY filterSelected)
     Q_PROPERTY(QUrl fileUrl READ fileUrl NOTIFY selectionAccepted)
     Q_PROPERTY(QList<QUrl> fileUrls READ fileUrls NOTIFY selectionAccepted)
+    Q_PROPERTY(bool sidebarVisible READ sidebarVisible WRITE setSidebarVisible NOTIFY sidebarVisibleChanged)
 
 public:
     QQuickAbstractFileDialog(QObject *parent = 0);
@@ -81,6 +82,7 @@ public:
     int selectedNameFilterIndex() const;
     QUrl fileUrl() const;
     virtual QList<QUrl> fileUrls() const;
+    bool sidebarVisible() const { return m_sidebarVisible; }
 
 public Q_SLOTS:
     void setVisible(bool v);
@@ -92,6 +94,7 @@ public Q_SLOTS:
     void setNameFilters(const QStringList &f);
     void selectNameFilter(const QString &f);
     void setSelectedNameFilterIndex(int idx);
+    void setSidebarVisible(bool s);
 
 Q_SIGNALS:
     void folderChanged();
@@ -99,6 +102,7 @@ Q_SIGNALS:
     void filterSelected();
     void fileModeChanged();
     void selectionAccepted();
+    void sidebarVisibleChanged();
 
 protected:
     void updateModes();
@@ -109,6 +113,7 @@ protected:
     bool m_selectExisting;
     bool m_selectMultiple;
     bool m_selectFolder;
+    bool m_sidebarVisible;
 
     Q_DISABLE_COPY(QQuickAbstractFileDialog)
 };
diff --git a/src/dialogs/qquickplatformfiledialog.cpp b/src/dialogs/qquickplatformfiledialog.cpp
index 4a52c485c..7ed4e3fbc 100644
--- a/src/dialogs/qquickplatformfiledialog.cpp
+++ b/src/dialogs/qquickplatformfiledialog.cpp
@@ -329,4 +329,15 @@ QPlatformFileDialogHelper *QQuickPlatformFileDialog::helper()
     The list of file paths which were selected by the user.
 */
 
+/*!
+    \qmlproperty bool FileDialog::sidebarVisible
+
+    This property holds whether the sidebar in the dialog containing shortcuts
+    and bookmarks is visible. By default it depends on the setting stored in
+    the \c QQControlsFileDialog section of the application's
+    \l {Qt.labs.settings::Settings} {Settings}.
+
+    \since 5.4
+*/
+
 QT_END_NAMESPACE
-- 
GitLab