Tidy up file browsing in video examples

* 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>
This commit is contained in:
Gareth Stockwell
2012-02-06 16:10:15 +00:00
committed by Qt by Nokia
parent 87ec3461c1
commit b6f54c8833
7 changed files with 680 additions and 640 deletions

View 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

View 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"
id: fileBrowser
color: "transparent"
signal openFile(string path)
property string folder
FolderListModel {
id: folders1
folder: 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);
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"
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: 52
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: 48; height: 48
Image {
source: "qrc:/images/folder.png"
anchors.centerIn: parent
visible: folders.isFolder(index)
}
}
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
}
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 }
}
]
}
}
width: root.width
height: 52
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) }
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("")
}
}
Item {
width: 48; height: 48
Image {
source: "qrc:/images/folder.png"
anchors.centerIn: parent
visible: folders.isFolder(index)
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)
}
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
}
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);
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();
}
}
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
}
BorderImage {
source: "qrc:/images/titlebar.sci";
width: parent.width;
height: 52
y: -7
id: titleBar
MouseArea {
id: mouseRegion
anchors.fill: parent
onPressed: {
root.showFocusHighlight = false;
wrapper.ListView.view.currentIndex = index;
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 }
}
]
}
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 }
Rectangle {
color: "gray"
x: 48
width: 1
height: 44
}
]
}
}
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: root.openFile("")
}
}
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 }
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
}
},
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) }
}
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 }
}
]
transitions: [
Transition {
to: "current"
SequentialAnimation {
NumberAnimation { properties: "x"; duration: 250 }
function down(path) {
if (folders == folders1) {
view = view2
folders = folders2;
view1.state = "exitLeft";
} else {
view = view1
folders = folders1;
view2.state = "exitLeft";
}
},
Transition {
NumberAnimation { properties: "x"; duration: 250 }
view.x = root.width;
view.state = "current";
view.focus = true;
folders.folder = path;
}
]
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();
}
}
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 }
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;
}
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
}
}
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 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;
}
}
}
}
}

View 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
}
}

View 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
}
}