Tidy up file browsing in video examples
authorGareth Stockwell <ext-gareth.stockwell@nokia.com>
Mon, 6 Feb 2012 16:10:15 +0000 (16:10 +0000)
committerQt by Nokia <qt-info@nokia.com>
Wed, 8 Feb 2012 21:30:34 +0000 (22:30 +0100)
* Use QStandardPaths to determine the initial folder displayed when
  the file browser is launched
* Persist folder between file browser invocations

Change-Id: I5b86dd3d304c3f33802f3189716e1d360774198d
Reviewed-by: Jonas Rabbe <jonas.rabbe@nokia.com>
examples/video/qmlvideo/main.cpp
examples/video/qmlvideo/qml/qmlvideo/FileBrowser.qml
examples/video/qmlvideo/qml/qmlvideo/main.qml
examples/video/qmlvideofx/main.cpp
examples/video/qmlvideofx/qml/qmlvideofx/FileBrowser.qml
examples/video/qmlvideofx/qml/qmlvideofx/main-largescreen.qml
examples/video/qmlvideofx/qml/qmlvideofx/main-smallscreen.qml

index 85a7af045c2035510e7278a57fc2f50ecfc8033d..495dc02992196e76b63291ae9738bd8972b73eae 100644 (file)
 **
 ****************************************************************************/
 
+#include <QtCore/QStandardPaths>
 #include <QtCore/QString>
 #include <QtCore/QStringList>
+#include <QtDeclarative/QDeclarativeContext>
 #include <QtGui/QGuiApplication>
 #include <QtQuick/QQuickItem>
 #include "qmlapplicationviewer.h"
@@ -124,6 +126,12 @@ int main(int argc, char *argv[])
                      rootObject, SLOT(qmlFramePainted()));
 #endif
 
+    QString videoPath;
+    const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
+    if (!moviesLocation.isEmpty())
+        videoPath = moviesLocation.first();
+    viewer.rootContext()->setContextProperty("videoPath", videoPath);
+
     QMetaObject::invokeMethod(rootObject, "init");
 
     viewer.showExpanded();
index 50985adf8d8e7a8440a5859d6326f5818cbb120a..6467ba08506b1b3a0e9142be7f57e832febc3bf4 100644 (file)
@@ -43,312 +43,341 @@ import QtQuick 2.0
 import Qt.labs.folderlistmodel 1.0
 
 Rectangle {
-    id: root
-    color: "white"
-    property bool showFocusHighlight: false
-    property variant folders: folders1
-    property variant view: view1
-    property alias folder: folders1.folder
-    property color textColor: "black"
-
-    signal openFile(string path)
-
-    FolderListModel {
-        id: folders1
-        folder: folder
+    id: fileBrowser
+    color: "transparent"
+
+    property string folder
+
+    signal fileSelected(string file)
+
+    function selectFile(file) {
+        if (file != "")
+            folder = loader.item.folders.folder
+        loader.sourceComponent = undefined
+        fileBrowser.fileSelected(file)
     }
 
-    FolderListModel {
-        id: folders2
-        folder: folder
+    Loader {
+        id: loader
     }
 
-    SystemPalette {
-        id: palette
+    function show() {
+        loader.sourceComponent = fileBrowserComponent
+        loader.item.parent = fileBrowser
+        loader.item.anchors.fill = fileBrowser
+        loader.item.folder = fileBrowser.folder
     }
 
     Component {
-        id: folderDelegate
+        id: fileBrowserComponent
 
         Rectangle {
-            id: wrapper
-            function launch() {
-                if (folders.isFolder(index))
-                    down(filePath);
-                else
-                    root.openFile(filePath);
-            }
-            width: root.width
-            height: 52
-            color: "transparent"
+            id: root
+            color: "white"
+            property bool showFocusHighlight: false
+            property variant folders: folders1
+            property variant view: view1
+            property alias folder: folders1.folder
+            property color textColor: "black"
 
-            Rectangle {
-                id: highlight; visible: false
-                anchors.fill: parent
-                color: palette.highlight
-                gradient: Gradient {
-                    GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                    GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
-                }
+            FolderListModel {
+                id: folders1
+                folder: folder
             }
 
-            Item {
-                width: 48; height: 48
-                Image {
-                    source: "qrc:/images/folder.png"
-                    anchors.centerIn: parent
-                    visible: folders.isFolder(index)
-                }
+            FolderListModel {
+                id: folders2
+                folder: folder
             }
 
-            Text {
-                id: nameText
-                anchors.fill: parent; verticalAlignment: Text.AlignVCenter
-                text: fileName
-                anchors.leftMargin: 54
-                font.pixelSize: 32
-                color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor
-                elide: Text.ElideRight
+            SystemPalette {
+                id: palette
             }
 
-            MouseArea {
-                id: mouseRegion
-                anchors.fill: parent
-                onPressed: {
-                    root.showFocusHighlight = false;
-                    wrapper.ListView.view.currentIndex = index;
-                }
-                onClicked: { if (folders == wrapper.ListView.view.model) launch() }
-            }
+            Component {
+                id: folderDelegate
 
-            states: [
-                State {
-                    name: "pressed"
-                    when: mouseRegion.pressed
-                    PropertyChanges { target: highlight; visible: true }
-                    PropertyChanges { target: nameText; color: palette.highlightedText }
-                }
-            ]
-        }
-    }
+                Rectangle {
+                    id: wrapper
+                    function launch() {
+                        if (folders.isFolder(index))
+                            down(filePath);
+                        else
+                            fileBrowser.selectFile(filePath)
+                    }
+                    width: root.width
+                    height: 52
+                    color: "transparent"
 
-    Rectangle {
-        id: cancelButton
-        width: 100
-        height: titleBar.height - 7
-        color: "black"
-        anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter }
+                    Rectangle {
+                        id: highlight; visible: false
+                        anchors.fill: parent
+                        color: palette.highlight
+                        gradient: Gradient {
+                            GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                            GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                        }
+                    }
 
-        Text {
-            anchors { fill: parent; margins: 4 }
-            text: "Cancel"
-            color: "white"
-            horizontalAlignment: Text.AlignHCenter
-            verticalAlignment: Text.AlignVCenter
-            font.pixelSize: 20
-        }
+                    Item {
+                        width: 48; height: 48
+                        Image {
+                            source: "qrc:/images/folder.png"
+                            anchors.centerIn: parent
+                            visible: folders.isFolder(index)
+                        }
+                    }
 
-        MouseArea {
-            anchors.fill: parent
-            onClicked: root.openFile("")
-        }
-    }
+                    Text {
+                        id: nameText
+                        anchors.fill: parent; verticalAlignment: Text.AlignVCenter
+                        text: fileName
+                        anchors.leftMargin: 54
+                        font.pixelSize: 32
+                        color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor
+                        elide: Text.ElideRight
+                    }
 
-    ListView {
-        id: view1
-        anchors.top: titleBar.bottom
-        anchors.bottom: cancelButton.top
-        x: 0
-        width: parent.width
-        model: folders1
-        delegate: folderDelegate
-        highlight: Rectangle {
-            color: palette.highlight
-            visible: root.showFocusHighlight && view1.count != 0
-            gradient: Gradient {
-                GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
-            }
-            width: view1.currentItem == null ? 0 : view1.currentItem.width
-        }
-        highlightMoveSpeed: 1000
-        pressDelay: 100
-        focus: true
-        state: "current"
-        states: [
-            State {
-                name: "current"
-                PropertyChanges { target: view1; x: 0 }
-            },
-            State {
-                name: "exitLeft"
-                PropertyChanges { target: view1; x: -root.width }
-            },
-            State {
-                name: "exitRight"
-                PropertyChanges { target: view1; x: root.width }
-            }
-        ]
-        transitions: [
-            Transition {
-                to: "current"
-                SequentialAnimation {
-                    NumberAnimation { properties: "x"; duration: 250 }
+                    MouseArea {
+                        id: mouseRegion
+                        anchors.fill: parent
+                        onPressed: {
+                            root.showFocusHighlight = false;
+                            wrapper.ListView.view.currentIndex = index;
+                        }
+                        onClicked: { if (folders == wrapper.ListView.view.model) launch() }
+                    }
+
+                    states: [
+                        State {
+                            name: "pressed"
+                            when: mouseRegion.pressed
+                            PropertyChanges { target: highlight; visible: true }
+                            PropertyChanges { target: nameText; color: palette.highlightedText }
+                        }
+                    ]
                 }
-            },
-            Transition {
-                NumberAnimation { properties: "x"; duration: 250 }
-                NumberAnimation { properties: "x"; duration: 250 }
             }
-        ]
-        Keys.onPressed: root.keyPressed(event.key)
-    }
 
-    ListView {
-        id: view2
-        anchors.top: titleBar.bottom
-        anchors.bottom: parent.bottom
-        x: parent.width
-        width: parent.width
-        model: folders2
-        delegate: folderDelegate
-        highlight: Rectangle {
-            color: palette.highlight
-            visible: root.showFocusHighlight && view2.count != 0
-            gradient: Gradient {
-                GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+            Rectangle {
+                id: cancelButton
+                width: 100
+                height: titleBar.height - 7
+                color: "black"
+                anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter }
+
+                Text {
+                    anchors { fill: parent; margins: 4 }
+                    text: "Cancel"
+                    color: "white"
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 20
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+                    onClicked: fileBrowser.selectFile("")
+                }
             }
-            width: view1.currentItem == null ? 0 : view1.currentItem.width
-        }
-        highlightMoveSpeed: 1000
-        pressDelay: 100
-        states: [
-            State {
-                name: "current"
-                PropertyChanges { target: view2; x: 0 }
-            },
-            State {
-                name: "exitLeft"
-                PropertyChanges { target: view2; x: -root.width }
-            },
-            State {
-                name: "exitRight"
-                PropertyChanges { target: view2; x: root.width }
+
+            ListView {
+                id: view1
+                anchors.top: titleBar.bottom
+                anchors.bottom: cancelButton.top
+                x: 0
+                width: parent.width
+                model: folders1
+                delegate: folderDelegate
+                highlight: Rectangle {
+                    color: palette.highlight
+                    visible: root.showFocusHighlight && view1.count != 0
+                    gradient: Gradient {
+                        GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                        GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                    }
+                    width: view1.currentItem == null ? 0 : view1.currentItem.width
+                }
+                highlightMoveSpeed: 1000
+                pressDelay: 100
+                focus: true
+                state: "current"
+                states: [
+                    State {
+                        name: "current"
+                        PropertyChanges { target: view1; x: 0 }
+                    },
+                    State {
+                        name: "exitLeft"
+                        PropertyChanges { target: view1; x: -root.width }
+                    },
+                    State {
+                        name: "exitRight"
+                        PropertyChanges { target: view1; x: root.width }
+                    }
+                ]
+                transitions: [
+                    Transition {
+                        to: "current"
+                        SequentialAnimation {
+                            NumberAnimation { properties: "x"; duration: 250 }
+                        }
+                    },
+                    Transition {
+                        NumberAnimation { properties: "x"; duration: 250 }
+                        NumberAnimation { properties: "x"; duration: 250 }
+                    }
+                ]
+                Keys.onPressed: root.keyPressed(event.key)
             }
-        ]
-        transitions: [
-            Transition {
-                to: "current"
-                SequentialAnimation {
-                    NumberAnimation { properties: "x"; duration: 250 }
+
+            ListView {
+                id: view2
+                anchors.top: titleBar.bottom
+                anchors.bottom: parent.bottom
+                x: parent.width
+                width: parent.width
+                model: folders2
+                delegate: folderDelegate
+                highlight: Rectangle {
+                    color: palette.highlight
+                    visible: root.showFocusHighlight && view2.count != 0
+                    gradient: Gradient {
+                        GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                        GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                    }
+                    width: view1.currentItem == null ? 0 : view1.currentItem.width
                 }
-            },
-            Transition {
-                NumberAnimation { properties: "x"; duration: 250 }
+                highlightMoveSpeed: 1000
+                pressDelay: 100
+                states: [
+                    State {
+                        name: "current"
+                        PropertyChanges { target: view2; x: 0 }
+                    },
+                    State {
+                        name: "exitLeft"
+                        PropertyChanges { target: view2; x: -root.width }
+                    },
+                    State {
+                        name: "exitRight"
+                        PropertyChanges { target: view2; x: root.width }
+                    }
+                ]
+                transitions: [
+                    Transition {
+                        to: "current"
+                        SequentialAnimation {
+                            NumberAnimation { properties: "x"; duration: 250 }
+                        }
+                    },
+                    Transition {
+                        NumberAnimation { properties: "x"; duration: 250 }
+                    }
+                ]
+                Keys.onPressed: root.keyPressed(event.key)
             }
-        ]
-        Keys.onPressed: root.keyPressed(event.key)
-    }
 
-    Keys.onPressed: {
-        root.keyPressed(event.key);
-        if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) {
-            view.currentItem.launch();
-            event.accepted = true;
-        } else if (event.key == Qt.Key_Left) {
-            up();
-        }
-    }
+            Keys.onPressed: {
+                root.keyPressed(event.key);
+                if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) {
+                    view.currentItem.launch();
+                    event.accepted = true;
+                } else if (event.key == Qt.Key_Left) {
+                    up();
+                }
+            }
 
-    BorderImage {
-        source: "qrc:/images/titlebar.sci";
-        width: parent.width;
-        height: 52
-        y: -7
-        id: titleBar
+            BorderImage {
+                source: "qrc:/images/titlebar.sci";
+                width: parent.width;
+                height: 52
+                y: -7
+                id: titleBar
 
-        Rectangle {
-            id: upButton
-            width: 48
-            height: titleBar.height - 7
-            color: "transparent"
-            Image { anchors.centerIn: parent; source: "qrc:/images/up.png" }
-            MouseArea { id: upRegion; anchors.centerIn: parent
-                width: 56
-                height: 56
-                onClicked: if (folders.parentFolder != "") up()
-            }
-            states: [
-                State {
-                    name: "pressed"
-                    when: upRegion.pressed
-                    PropertyChanges { target: upButton; color: palette.highlight }
+                Rectangle {
+                    id: upButton
+                    width: 48
+                    height: titleBar.height - 7
+                    color: "transparent"
+                    Image { anchors.centerIn: parent; source: "qrc:/images/up.png" }
+                    MouseArea { id: upRegion; anchors.centerIn: parent
+                        width: 56
+                        height: 56
+                        onClicked: if (folders.parentFolder != "") up()
+                    }
+                    states: [
+                        State {
+                            name: "pressed"
+                            when: upRegion.pressed
+                            PropertyChanges { target: upButton; color: palette.highlight }
+                        }
+                    ]
                 }
-            ]
-        }
 
-        Rectangle {
-            color: "gray"
-            x: 48
-            width: 1
-            height: 44
-        }
+                Rectangle {
+                    color: "gray"
+                    x: 48
+                    width: 1
+                    height: 44
+                }
 
-        Text {
-            anchors.left: upButton.right; anchors.right: parent.right; height: parent.height
-            anchors.leftMargin: 4; anchors.rightMargin: 4
-            text: folders.folder
-            color: "white"
-            elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
-            font.pixelSize: 32
-        }
-    }
+                Text {
+                    anchors.left: upButton.right; anchors.right: parent.right; height: parent.height
+                    anchors.leftMargin: 4; anchors.rightMargin: 4
+                    text: folders.folder
+                    color: "white"
+                    elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 32
+                }
+            }
 
-    function down(path) {
-        if (folders == folders1) {
-            view = view2
-            folders = folders2;
-            view1.state = "exitLeft";
-        } else {
-            view = view1
-            folders = folders1;
-            view2.state = "exitLeft";
-        }
-        view.x = root.width;
-        view.state = "current";
-        view.focus = true;
-        folders.folder = path;
-    }
+            function down(path) {
+                if (folders == folders1) {
+                    view = view2
+                    folders = folders2;
+                    view1.state = "exitLeft";
+                } else {
+                    view = view1
+                    folders = folders1;
+                    view2.state = "exitLeft";
+                }
+                view.x = root.width;
+                view.state = "current";
+                view.focus = true;
+                folders.folder = path;
+            }
 
-    function up() {
-        var path = folders.parentFolder;
-        if (folders == folders1) {
-            view = view2
-            folders = folders2;
-            view1.state = "exitRight";
-        } else {
-            view = view1
-            folders = folders1;
-            view2.state = "exitRight";
-        }
-        view.x = -root.width;
-        view.state = "current";
-        view.focus = true;
-        folders.folder = path;
-    }
+            function up() {
+                var path = folders.parentFolder;
+                if (folders == folders1) {
+                    view = view2
+                    folders = folders2;
+                    view1.state = "exitRight";
+                } else {
+                    view = view1
+                    folders = folders1;
+                    view2.state = "exitRight";
+                }
+                view.x = -root.width;
+                view.state = "current";
+                view.focus = true;
+                folders.folder = path;
+            }
 
-    function keyPressed(key) {
-        switch (key) {
-            case Qt.Key_Up:
-            case Qt.Key_Down:
-            case Qt.Key_Left:
-            case Qt.Key_Right:
-                root.showFocusHighlight = true;
-            break;
-            default:
-                // do nothing
-            break;
+            function keyPressed(key) {
+                switch (key) {
+                    case Qt.Key_Up:
+                    case Qt.Key_Down:
+                    case Qt.Key_Left:
+                    case Qt.Key_Right:
+                        root.showFocusHighlight = true;
+                    break;
+                    default:
+                        // do nothing
+                    break;
+                }
+            }
         }
     }
 }
index 86dddd8b780964fe2073ea0662a838d0ba93927d..261a3357bba867f329c494de5e736f51b2910ad4 100644 (file)
@@ -56,7 +56,6 @@ Rectangle {
 
     QtObject {
         id: d
-        property int fileIndex
         property int itemHeight: 40
         property int buttonHeight: 0.8 * itemHeight
         property int margins: 10
@@ -99,7 +98,7 @@ Rectangle {
             }
             height: d.buttonHeight
             text: (root.source1 == "") ? "Select file 1" : root.source1
-            onClicked: showFileBrowser(1)
+            onClicked: fileBrowser1.show()
         }
 
         Button {
@@ -112,7 +111,7 @@ Rectangle {
             }
             height: d.buttonHeight
             text: (root.source2 == "") ? "Select file 2" : root.source2
-            onClicked: showFileBrowser(2)
+            onClicked: fileBrowser2.show()
         }
 
         Button {
@@ -187,8 +186,26 @@ Rectangle {
         ignoreUnknownSignals: true
     }
 
-    Loader {
-        id: fileBrowserLoader
+    FileBrowser {
+        id: fileBrowser1
+        anchors.fill: root
+        onFolderChanged: fileBrowser2.folder = folder
+        Component.onCompleted: fileSelected.connect(root.openFile1)
+    }
+
+    FileBrowser {
+        id: fileBrowser2
+        anchors.fill: root
+        onFolderChanged: fileBrowser1.folder = folder
+        Component.onCompleted: fileSelected.connect(root.openFile2)
+    }
+
+    function openFile1(path) {
+        root.source1 = path
+    }
+
+    function openFile2(path) {
+        root.source2 = path
     }
 
     ErrorDialog {
@@ -200,6 +217,8 @@ Rectangle {
     // Called from main() once root properties have been set
     function init() {
         performanceLoader.init()
+        fileBrowser1.folder = videoPath
+        fileBrowser2.folder = videoPath
     }
 
     function qmlFramePainted() {
@@ -207,26 +226,6 @@ Rectangle {
             performanceLoader.item.qmlFramePainted()
     }
 
-    function showFileBrowser(index) {
-        console.log("[qmlvideo] main.showFileBrowser")
-        d.fileIndex = index
-        fileBrowserLoader.source = "FileBrowser.qml"
-        fileBrowserLoader.item.parent = root
-        fileBrowserLoader.item.anchors.fill = root
-        fileBrowserLoader.item.openFile.connect(root.openFile)
-        inner.visible = false
-    }
-
-    function openFile(path) {
-        console.log("[qmlvideo] main.openFile " + d.fileIndex + " \"" + path + "\"")
-        fileBrowserLoader.source = ""
-        if (1 == d.fileIndex)
-            root.source1 = path
-        else if (2 == d.fileIndex)
-            root.source2 = path
-        inner.visible = true
-    }
-
     function closeScene() {
         console.log("[qmlvideo] main.closeScene")
         sceneSelectionPanel.sceneSource = ""
index a7157c821e188b50b1bb93eb875895596946c9b3..1b4f17eacbf9fe9f9e3446ecf50f348847ca8cdf 100644 (file)
@@ -39,6 +39,7 @@
 **
 ****************************************************************************/
 
+#include <QtCore/QStandardPaths>
 #include <QtCore/QStringList>
 #include <QtDeclarative/QDeclarativeContext>
 #include <QtGui/QGuiApplication>
@@ -116,6 +117,18 @@ int main(int argc, char *argv[])
     FileReader fileReader;
     viewer.rootContext()->setContextProperty("fileReader", &fileReader);
 
+    QString imagePath = "../../images";
+    const QStringList picturesLocation = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
+    if (!picturesLocation.isEmpty())
+        imagePath = picturesLocation.first();
+    viewer.rootContext()->setContextProperty("imagePath", imagePath);
+
+    QString videoPath;
+    const QStringList moviesLocation = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation);
+    if (!moviesLocation.isEmpty())
+        videoPath = moviesLocation.first();
+    viewer.rootContext()->setContextProperty("videoPath", videoPath);
+
 #ifdef SMALL_SCREEN_PHYSICAL
     viewer.showFullScreen();
 #else
index 50985adf8d8e7a8440a5859d6326f5818cbb120a..6467ba08506b1b3a0e9142be7f57e832febc3bf4 100644 (file)
@@ -43,312 +43,341 @@ import QtQuick 2.0
 import Qt.labs.folderlistmodel 1.0
 
 Rectangle {
-    id: root
-    color: "white"
-    property bool showFocusHighlight: false
-    property variant folders: folders1
-    property variant view: view1
-    property alias folder: folders1.folder
-    property color textColor: "black"
-
-    signal openFile(string path)
-
-    FolderListModel {
-        id: folders1
-        folder: folder
+    id: fileBrowser
+    color: "transparent"
+
+    property string folder
+
+    signal fileSelected(string file)
+
+    function selectFile(file) {
+        if (file != "")
+            folder = loader.item.folders.folder
+        loader.sourceComponent = undefined
+        fileBrowser.fileSelected(file)
     }
 
-    FolderListModel {
-        id: folders2
-        folder: folder
+    Loader {
+        id: loader
     }
 
-    SystemPalette {
-        id: palette
+    function show() {
+        loader.sourceComponent = fileBrowserComponent
+        loader.item.parent = fileBrowser
+        loader.item.anchors.fill = fileBrowser
+        loader.item.folder = fileBrowser.folder
     }
 
     Component {
-        id: folderDelegate
+        id: fileBrowserComponent
 
         Rectangle {
-            id: wrapper
-            function launch() {
-                if (folders.isFolder(index))
-                    down(filePath);
-                else
-                    root.openFile(filePath);
-            }
-            width: root.width
-            height: 52
-            color: "transparent"
+            id: root
+            color: "white"
+            property bool showFocusHighlight: false
+            property variant folders: folders1
+            property variant view: view1
+            property alias folder: folders1.folder
+            property color textColor: "black"
 
-            Rectangle {
-                id: highlight; visible: false
-                anchors.fill: parent
-                color: palette.highlight
-                gradient: Gradient {
-                    GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                    GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
-                }
+            FolderListModel {
+                id: folders1
+                folder: folder
             }
 
-            Item {
-                width: 48; height: 48
-                Image {
-                    source: "qrc:/images/folder.png"
-                    anchors.centerIn: parent
-                    visible: folders.isFolder(index)
-                }
+            FolderListModel {
+                id: folders2
+                folder: folder
             }
 
-            Text {
-                id: nameText
-                anchors.fill: parent; verticalAlignment: Text.AlignVCenter
-                text: fileName
-                anchors.leftMargin: 54
-                font.pixelSize: 32
-                color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor
-                elide: Text.ElideRight
+            SystemPalette {
+                id: palette
             }
 
-            MouseArea {
-                id: mouseRegion
-                anchors.fill: parent
-                onPressed: {
-                    root.showFocusHighlight = false;
-                    wrapper.ListView.view.currentIndex = index;
-                }
-                onClicked: { if (folders == wrapper.ListView.view.model) launch() }
-            }
+            Component {
+                id: folderDelegate
 
-            states: [
-                State {
-                    name: "pressed"
-                    when: mouseRegion.pressed
-                    PropertyChanges { target: highlight; visible: true }
-                    PropertyChanges { target: nameText; color: palette.highlightedText }
-                }
-            ]
-        }
-    }
+                Rectangle {
+                    id: wrapper
+                    function launch() {
+                        if (folders.isFolder(index))
+                            down(filePath);
+                        else
+                            fileBrowser.selectFile(filePath)
+                    }
+                    width: root.width
+                    height: 52
+                    color: "transparent"
 
-    Rectangle {
-        id: cancelButton
-        width: 100
-        height: titleBar.height - 7
-        color: "black"
-        anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter }
+                    Rectangle {
+                        id: highlight; visible: false
+                        anchors.fill: parent
+                        color: palette.highlight
+                        gradient: Gradient {
+                            GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                            GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                        }
+                    }
 
-        Text {
-            anchors { fill: parent; margins: 4 }
-            text: "Cancel"
-            color: "white"
-            horizontalAlignment: Text.AlignHCenter
-            verticalAlignment: Text.AlignVCenter
-            font.pixelSize: 20
-        }
+                    Item {
+                        width: 48; height: 48
+                        Image {
+                            source: "qrc:/images/folder.png"
+                            anchors.centerIn: parent
+                            visible: folders.isFolder(index)
+                        }
+                    }
 
-        MouseArea {
-            anchors.fill: parent
-            onClicked: root.openFile("")
-        }
-    }
+                    Text {
+                        id: nameText
+                        anchors.fill: parent; verticalAlignment: Text.AlignVCenter
+                        text: fileName
+                        anchors.leftMargin: 54
+                        font.pixelSize: 32
+                        color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor
+                        elide: Text.ElideRight
+                    }
 
-    ListView {
-        id: view1
-        anchors.top: titleBar.bottom
-        anchors.bottom: cancelButton.top
-        x: 0
-        width: parent.width
-        model: folders1
-        delegate: folderDelegate
-        highlight: Rectangle {
-            color: palette.highlight
-            visible: root.showFocusHighlight && view1.count != 0
-            gradient: Gradient {
-                GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
-            }
-            width: view1.currentItem == null ? 0 : view1.currentItem.width
-        }
-        highlightMoveSpeed: 1000
-        pressDelay: 100
-        focus: true
-        state: "current"
-        states: [
-            State {
-                name: "current"
-                PropertyChanges { target: view1; x: 0 }
-            },
-            State {
-                name: "exitLeft"
-                PropertyChanges { target: view1; x: -root.width }
-            },
-            State {
-                name: "exitRight"
-                PropertyChanges { target: view1; x: root.width }
-            }
-        ]
-        transitions: [
-            Transition {
-                to: "current"
-                SequentialAnimation {
-                    NumberAnimation { properties: "x"; duration: 250 }
+                    MouseArea {
+                        id: mouseRegion
+                        anchors.fill: parent
+                        onPressed: {
+                            root.showFocusHighlight = false;
+                            wrapper.ListView.view.currentIndex = index;
+                        }
+                        onClicked: { if (folders == wrapper.ListView.view.model) launch() }
+                    }
+
+                    states: [
+                        State {
+                            name: "pressed"
+                            when: mouseRegion.pressed
+                            PropertyChanges { target: highlight; visible: true }
+                            PropertyChanges { target: nameText; color: palette.highlightedText }
+                        }
+                    ]
                 }
-            },
-            Transition {
-                NumberAnimation { properties: "x"; duration: 250 }
-                NumberAnimation { properties: "x"; duration: 250 }
             }
-        ]
-        Keys.onPressed: root.keyPressed(event.key)
-    }
 
-    ListView {
-        id: view2
-        anchors.top: titleBar.bottom
-        anchors.bottom: parent.bottom
-        x: parent.width
-        width: parent.width
-        model: folders2
-        delegate: folderDelegate
-        highlight: Rectangle {
-            color: palette.highlight
-            visible: root.showFocusHighlight && view2.count != 0
-            gradient: Gradient {
-                GradientStop { id: t1; position: 0.0; color: palette.highlight }
-                GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+            Rectangle {
+                id: cancelButton
+                width: 100
+                height: titleBar.height - 7
+                color: "black"
+                anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter }
+
+                Text {
+                    anchors { fill: parent; margins: 4 }
+                    text: "Cancel"
+                    color: "white"
+                    horizontalAlignment: Text.AlignHCenter
+                    verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 20
+                }
+
+                MouseArea {
+                    anchors.fill: parent
+                    onClicked: fileBrowser.selectFile("")
+                }
             }
-            width: view1.currentItem == null ? 0 : view1.currentItem.width
-        }
-        highlightMoveSpeed: 1000
-        pressDelay: 100
-        states: [
-            State {
-                name: "current"
-                PropertyChanges { target: view2; x: 0 }
-            },
-            State {
-                name: "exitLeft"
-                PropertyChanges { target: view2; x: -root.width }
-            },
-            State {
-                name: "exitRight"
-                PropertyChanges { target: view2; x: root.width }
+
+            ListView {
+                id: view1
+                anchors.top: titleBar.bottom
+                anchors.bottom: cancelButton.top
+                x: 0
+                width: parent.width
+                model: folders1
+                delegate: folderDelegate
+                highlight: Rectangle {
+                    color: palette.highlight
+                    visible: root.showFocusHighlight && view1.count != 0
+                    gradient: Gradient {
+                        GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                        GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                    }
+                    width: view1.currentItem == null ? 0 : view1.currentItem.width
+                }
+                highlightMoveSpeed: 1000
+                pressDelay: 100
+                focus: true
+                state: "current"
+                states: [
+                    State {
+                        name: "current"
+                        PropertyChanges { target: view1; x: 0 }
+                    },
+                    State {
+                        name: "exitLeft"
+                        PropertyChanges { target: view1; x: -root.width }
+                    },
+                    State {
+                        name: "exitRight"
+                        PropertyChanges { target: view1; x: root.width }
+                    }
+                ]
+                transitions: [
+                    Transition {
+                        to: "current"
+                        SequentialAnimation {
+                            NumberAnimation { properties: "x"; duration: 250 }
+                        }
+                    },
+                    Transition {
+                        NumberAnimation { properties: "x"; duration: 250 }
+                        NumberAnimation { properties: "x"; duration: 250 }
+                    }
+                ]
+                Keys.onPressed: root.keyPressed(event.key)
             }
-        ]
-        transitions: [
-            Transition {
-                to: "current"
-                SequentialAnimation {
-                    NumberAnimation { properties: "x"; duration: 250 }
+
+            ListView {
+                id: view2
+                anchors.top: titleBar.bottom
+                anchors.bottom: parent.bottom
+                x: parent.width
+                width: parent.width
+                model: folders2
+                delegate: folderDelegate
+                highlight: Rectangle {
+                    color: palette.highlight
+                    visible: root.showFocusHighlight && view2.count != 0
+                    gradient: Gradient {
+                        GradientStop { id: t1; position: 0.0; color: palette.highlight }
+                        GradientStop { id: t2; position: 1.0; color: Qt.lighter(palette.highlight) }
+                    }
+                    width: view1.currentItem == null ? 0 : view1.currentItem.width
                 }
-            },
-            Transition {
-                NumberAnimation { properties: "x"; duration: 250 }
+                highlightMoveSpeed: 1000
+                pressDelay: 100
+                states: [
+                    State {
+                        name: "current"
+                        PropertyChanges { target: view2; x: 0 }
+                    },
+                    State {
+                        name: "exitLeft"
+                        PropertyChanges { target: view2; x: -root.width }
+                    },
+                    State {
+                        name: "exitRight"
+                        PropertyChanges { target: view2; x: root.width }
+                    }
+                ]
+                transitions: [
+                    Transition {
+                        to: "current"
+                        SequentialAnimation {
+                            NumberAnimation { properties: "x"; duration: 250 }
+                        }
+                    },
+                    Transition {
+                        NumberAnimation { properties: "x"; duration: 250 }
+                    }
+                ]
+                Keys.onPressed: root.keyPressed(event.key)
             }
-        ]
-        Keys.onPressed: root.keyPressed(event.key)
-    }
 
-    Keys.onPressed: {
-        root.keyPressed(event.key);
-        if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) {
-            view.currentItem.launch();
-            event.accepted = true;
-        } else if (event.key == Qt.Key_Left) {
-            up();
-        }
-    }
+            Keys.onPressed: {
+                root.keyPressed(event.key);
+                if (event.key == Qt.Key_Return || event.key == Qt.Key_Select || event.key == Qt.Key_Right) {
+                    view.currentItem.launch();
+                    event.accepted = true;
+                } else if (event.key == Qt.Key_Left) {
+                    up();
+                }
+            }
 
-    BorderImage {
-        source: "qrc:/images/titlebar.sci";
-        width: parent.width;
-        height: 52
-        y: -7
-        id: titleBar
+            BorderImage {
+                source: "qrc:/images/titlebar.sci";
+                width: parent.width;
+                height: 52
+                y: -7
+                id: titleBar
 
-        Rectangle {
-            id: upButton
-            width: 48
-            height: titleBar.height - 7
-            color: "transparent"
-            Image { anchors.centerIn: parent; source: "qrc:/images/up.png" }
-            MouseArea { id: upRegion; anchors.centerIn: parent
-                width: 56
-                height: 56
-                onClicked: if (folders.parentFolder != "") up()
-            }
-            states: [
-                State {
-                    name: "pressed"
-                    when: upRegion.pressed
-                    PropertyChanges { target: upButton; color: palette.highlight }
+                Rectangle {
+                    id: upButton
+                    width: 48
+                    height: titleBar.height - 7
+                    color: "transparent"
+                    Image { anchors.centerIn: parent; source: "qrc:/images/up.png" }
+                    MouseArea { id: upRegion; anchors.centerIn: parent
+                        width: 56
+                        height: 56
+                        onClicked: if (folders.parentFolder != "") up()
+                    }
+                    states: [
+                        State {
+                            name: "pressed"
+                            when: upRegion.pressed
+                            PropertyChanges { target: upButton; color: palette.highlight }
+                        }
+                    ]
                 }
-            ]
-        }
 
-        Rectangle {
-            color: "gray"
-            x: 48
-            width: 1
-            height: 44
-        }
+                Rectangle {
+                    color: "gray"
+                    x: 48
+                    width: 1
+                    height: 44
+                }
 
-        Text {
-            anchors.left: upButton.right; anchors.right: parent.right; height: parent.height
-            anchors.leftMargin: 4; anchors.rightMargin: 4
-            text: folders.folder
-            color: "white"
-            elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
-            font.pixelSize: 32
-        }
-    }
+                Text {
+                    anchors.left: upButton.right; anchors.right: parent.right; height: parent.height
+                    anchors.leftMargin: 4; anchors.rightMargin: 4
+                    text: folders.folder
+                    color: "white"
+                    elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
+                    font.pixelSize: 32
+                }
+            }
 
-    function down(path) {
-        if (folders == folders1) {
-            view = view2
-            folders = folders2;
-            view1.state = "exitLeft";
-        } else {
-            view = view1
-            folders = folders1;
-            view2.state = "exitLeft";
-        }
-        view.x = root.width;
-        view.state = "current";
-        view.focus = true;
-        folders.folder = path;
-    }
+            function down(path) {
+                if (folders == folders1) {
+                    view = view2
+                    folders = folders2;
+                    view1.state = "exitLeft";
+                } else {
+                    view = view1
+                    folders = folders1;
+                    view2.state = "exitLeft";
+                }
+                view.x = root.width;
+                view.state = "current";
+                view.focus = true;
+                folders.folder = path;
+            }
 
-    function up() {
-        var path = folders.parentFolder;
-        if (folders == folders1) {
-            view = view2
-            folders = folders2;
-            view1.state = "exitRight";
-        } else {
-            view = view1
-            folders = folders1;
-            view2.state = "exitRight";
-        }
-        view.x = -root.width;
-        view.state = "current";
-        view.focus = true;
-        folders.folder = path;
-    }
+            function up() {
+                var path = folders.parentFolder;
+                if (folders == folders1) {
+                    view = view2
+                    folders = folders2;
+                    view1.state = "exitRight";
+                } else {
+                    view = view1
+                    folders = folders1;
+                    view2.state = "exitRight";
+                }
+                view.x = -root.width;
+                view.state = "current";
+                view.focus = true;
+                folders.folder = path;
+            }
 
-    function keyPressed(key) {
-        switch (key) {
-            case Qt.Key_Up:
-            case Qt.Key_Down:
-            case Qt.Key_Left:
-            case Qt.Key_Right:
-                root.showFocusHighlight = true;
-            break;
-            default:
-                // do nothing
-            break;
+            function keyPressed(key) {
+                switch (key) {
+                    case Qt.Key_Up:
+                    case Qt.Key_Down:
+                    case Qt.Key_Left:
+                    case Qt.Key_Right:
+                        root.showFocusHighlight = true;
+                    break;
+                    default:
+                        // do nothing
+                    break;
+                }
+            }
         }
     }
 }
index 6d643a1e2f727e309e91ace5bd1d1e5f41e206ee..d7e1b12f13badaaa392706af501ff47e7946f21e 100644 (file)
@@ -51,11 +51,6 @@ Rectangle {
     property bool perfMonitorsLogging: false
     property bool perfMonitorsVisible: false
 
-    QtObject {
-        id: d
-        property string openFileType
-    }
-
     Rectangle {
         id: inner
         anchors.fill: parent
@@ -131,8 +126,16 @@ Rectangle {
         }
     }
 
-    Loader {
-        id: fileBrowserLoader
+    FileBrowser {
+        id: imageFileBrowser
+        anchors.fill: root
+        Component.onCompleted: fileSelected.connect(content.openImage)
+    }
+
+    FileBrowser {
+        id: videoFileBrowser
+        anchors.fill: root
+        Component.onCompleted: fileSelected.connect(content.openVideo)
     }
 
     Component.onCompleted: {
@@ -144,12 +147,12 @@ Rectangle {
 
     function init() {
         console.log("[qmlvideofx] main.init")
+        imageFileBrowser.folder = imagePath
+        videoFileBrowser.folder = videoPath
         content.init()
         performanceLoader.init()
-        if (fileName != "") {
-            d.openFileType = "video"
-            openFile(fileName)
-        }
+        if (fileName != "")
+            content.openVideo(fileName)
     }
 
     function qmlFramePainted() {
@@ -158,13 +161,11 @@ Rectangle {
     }
 
     function openImage() {
-        d.openFileType = "image"
-        showFileBrowser("../../images")
+        imageFileBrowser.show()
     }
 
     function openVideo() {
-        d.openFileType = "video"
-        showFileBrowser("../../videos")
+        videoFileBrowser.show()
     }
 
     function openCamera() {
@@ -174,24 +175,4 @@ Rectangle {
     function close() {
         content.openImage("qrc:/images/qt-logo.png")
     }
-
-    function showFileBrowser(path) {
-        fileBrowserLoader.source = "FileBrowser.qml"
-        fileBrowserLoader.item.parent = root
-        fileBrowserLoader.item.anchors.fill = root
-        fileBrowserLoader.item.openFile.connect(root.openFile)
-        fileBrowserLoader.item.folder = path
-        inner.visible = false
-    }
-
-    function openFile(path) {
-        fileBrowserLoader.source = ""
-        if (path != "") {
-            if (d.openFileType == "image")
-                content.openImage(path)
-            else if (d.openFileType == "video")
-                content.openVideo(path)
-        }
-        inner.visible = true
-    }
 }
index 51237242852ae0d553d2ad5fb05a26ee5cfed01d..e9cf446787e8d098351f0fd6197443858736726c 100644 (file)
@@ -51,11 +51,6 @@ Rectangle {
     property bool perfMonitorsLogging: false
     property bool perfMonitorsVisible: false
 
-    QtObject {
-        id: d
-        property string openFileType
-    }
-
     // Create ScreenSaver element via Loader, so this app will still run if the
     // SystemInfo module is not available
     Loader {
@@ -344,21 +339,30 @@ Rectangle {
         fileOpen.close.connect(close)
     }
 
-    Loader {
-        id: fileBrowserLoader
+    FileBrowser {
+        id: imageFileBrowser
+        anchors.fill: root
+        Component.onCompleted: fileSelected.connect(content.openImage)
+    }
+
+    FileBrowser {
+        id: videoFileBrowser
+        anchors.fill: root
+        Component.onCompleted: fileSelected.connect(content.openVideo)
     }
 
     // Called from main() once root properties have been set
     function init() {
         console.log("[qmlvideofx] main.init")
+        imageFileBrowser.folder = imagePath
+        videoFileBrowser.folder = videoPath
         content.init()
         performanceLoader.init()
         if (fileName != "") {
             fileOpenMouseArea.hintEnabled = false
             effectSelectionPanelMouseArea.hintEnabled = false
             splashScreen.state = "hidden"
-            d.openFileType = "video"
-            openFile(fileName)
+            content.openVideo(fileName)
         }
     }
 
@@ -369,14 +373,12 @@ Rectangle {
 
     function openImage() {
         fileOpenContainer.state = "baseState"
-        d.openFileType = "image"
-        showFileBrowser("../../images")
+        imageFileBrowser.show()
     }
 
     function openVideo() {
         fileOpenContainer.state = "baseState"
-        d.openFileType = "video"
-        showFileBrowser("../../videos")
+        videoFileBrowser.show()
     }
 
     function openCamera() {
@@ -388,25 +390,4 @@ Rectangle {
         fileOpenContainer.state = "baseState"
         content.openImage("qrc:/images/qt-logo.png")
     }
-
-    function showFileBrowser(path) {
-        content.stop()
-        fileBrowserLoader.source = "FileBrowser.qml"
-        fileBrowserLoader.item.parent = root
-        fileBrowserLoader.item.anchors.fill = root
-        fileBrowserLoader.item.openFile.connect(root.openFile)
-        fileBrowserLoader.item.folder = path
-        inner.visible = false
-    }
-
-    function openFile(path) {
-        fileBrowserLoader.source = ""
-        if (path != "") {
-            if (d.openFileType == "image")
-                content.openImage(path)
-            else if (d.openFileType == "video")
-                content.openVideo(path)
-        }
-        inner.visible = true
-    }
 }