summaryrefslogtreecommitdiffstats
path: root/basicsuite/mediaplayer/FileBrowser.qml
diff options
context:
space:
mode:
Diffstat (limited to 'basicsuite/mediaplayer/FileBrowser.qml')
-rw-r--r--basicsuite/mediaplayer/FileBrowser.qml415
1 files changed, 415 insertions, 0 deletions
diff --git a/basicsuite/mediaplayer/FileBrowser.qml b/basicsuite/mediaplayer/FileBrowser.qml
new file mode 100644
index 0000000..f9f2f81
--- /dev/null
+++ b/basicsuite/mediaplayer/FileBrowser.qml
@@ -0,0 +1,415 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import Qt.labs.folderlistmodel 2.0
+
+Rectangle {
+ id: fileBrowser
+ color: "transparent"
+
+ property string folder: "file:///data/videos"
+
+ signal fileSelected(string file)
+
+ function selectFile(file) {
+ if (file != "")
+ folder = loader.item.folders.folder
+ loader.sourceComponent = undefined
+ if (file != "")
+ fileBrowser.fileSelected("file://" + file)
+ }
+
+ Loader {
+ id: loader
+ }
+
+ function show() {
+ loader.sourceComponent = fileBrowserComponent
+ loader.item.parent = fileBrowser
+ loader.item.anchors.fill = fileBrowser
+ loader.item.folder = fileBrowser.folder
+ }
+
+ Component {
+ id: fileBrowserComponent
+
+ Rectangle {
+ id: root
+ gradient: Gradient {
+ GradientStop { position: 0; color: "#111111" }
+ GradientStop { position: 1; color: "#222222"}
+ }
+ property bool showFocusHighlight: false
+ property variant folders: folders1
+ property variant view: view1
+ property alias folder: folders1.folder
+ property color textColor: "white"
+
+ FolderListModel {
+ id: folders1
+ folder: folder
+ }
+
+ FolderListModel {
+ id: folders2
+ folder: folder
+ }
+
+ SystemPalette {
+ id: palette
+ }
+
+ Component {
+ id: folderDelegate
+
+ Rectangle {
+ id: wrapper
+ function launch() {
+ if (folders.isFolder(index))
+ down(filePath);
+ else
+ fileBrowser.selectFile(filePath)
+ }
+ width: root.width
+ height: 50
+ color: "transparent"
+
+ 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) }
+ }
+ }
+
+ Item {
+ width: 40; height: 40
+ y: 3
+ x: 5
+ Image {
+ source: "images/FileButton.png"
+ width: 34; height: 34
+ anchors.centerIn: parent
+ visible: folders.isFolder(index)
+ }
+ }
+
+ Text {
+ id: nameText
+ anchors.fill: parent; verticalAlignment: Text.AlignVCenter
+ text: fileName
+ anchors.leftMargin: 54
+ font.pixelSize: 24
+ color: (wrapper.ListView.isCurrentItem && root.showFocusHighlight) ? palette.highlightedText : textColor
+ elide: Text.ElideRight
+ }
+
+ 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 }
+ }
+ ]
+ }
+ }
+
+ ListView {
+ id: view1
+ anchors.top: titleBar.bottom
+ anchors.topMargin: 15
+ anchors.bottom: parent.bottom
+ 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
+ }
+ highlightMoveVelocity: 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)
+ }
+
+ ListView {
+ id: view2
+ anchors.top: titleBar.bottom
+ anchors.topMargin: 15
+ 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
+ }
+ highlightMoveVelocity: 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);
+ 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();
+ }
+ }
+
+ Rectangle {
+ width: parent.width;
+ height: 70
+ color: "#111111"
+ y: -7
+ id: titleBar
+
+ Rectangle {
+ id: upButton
+ width: 90
+ height: titleBar.height - 7
+ color: "transparent"
+ Image { anchors.centerIn: parent; source: "images/up.png"; width: 32; height: 32 }
+ MouseArea { id: upRegion; anchors.centerIn: parent
+ anchors.fill: parent
+ onClicked: if (folders.parentFolder != "") up()
+ }
+ states: [
+ State {
+ name: "pressed"
+ when: upRegion.pressed
+ PropertyChanges { target: upButton; color: palette.highlight }
+ }
+ ]
+ }
+
+// Rectangle {
+// color: "gray"
+// x: 70
+// width: 1
+// height: 63
+// }
+
+ Rectangle {
+ id: cancelButton
+ width: 100
+ height: titleBar.height - 7
+ color: "transparent"
+ anchors { left: upButton.right; leftMargin: 1; }
+
+ Text {
+ anchors { fill: parent; topMargin: 3 }
+ text: "Cancel"
+ color: "white"
+ horizontalAlignment: Text.AlignHCenter
+ verticalAlignment: Text.AlignVCenter
+ font.pixelSize: 22
+ }
+
+ MouseArea {
+ id: cancelRegion
+ anchors.fill: parent
+ onClicked: fileBrowser.selectFile("")
+ }
+
+ states: [
+ State {
+ name: "pressed"
+ when: cancelRegion.pressed
+ PropertyChanges { target: cancelButton; color: palette.highlight }
+ }
+ ]
+ }
+
+// Rectangle {
+// color: "gray"
+// x: 171
+// width: 1
+// height: 63
+// }
+
+ Text {
+ anchors.left: cancelButton.right; anchors.right: parent.right; height: parent.height
+ anchors.leftMargin: 4; anchors.rightMargin: 4
+ text: String(folders.folder).replace("file://", "")
+ color: "white"
+ elide: Text.ElideLeft; horizontalAlignment: Text.AlignRight; verticalAlignment: Text.AlignVCenter
+ font.pixelSize: 28
+ }
+
+ Rectangle {
+ width: parent.width
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 3
+ height: 2
+ color: palette.highlight
+ }
+ }
+
+ 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 = "file://" + 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;
+ }
+ }
+ }
+ }
+}