--- /dev/null
+import QtQuick 2.0
+import Sailfish.Silica 1.0
+import harbour.file.browser.FileModel 1.0
+import "functions.js" as Functions
+import "../components"
+
+Page {
+ id: page
+ allowedOrientations: Orientation.All
+ property string dir: "/"
+ property string initialDir: ""
+ property bool initial: false // this is set to true if the page is initial page
+ property int _selectedMenu: 0
+
+ FileModel {
+ id: fileModel
+ dir: page.dir
+ // page.status does not exactly work - root folder seems to be active always??
+ active: page.status === PageStatus.Active
+ }
+
+ SilicaListView {
+ id: fileList
+ anchors.fill: parent
+
+ model: fileModel
+
+ VerticalScrollDecorator { flickable: fileList }
+
+ PullDownMenu {
+ id: pullMenu;
+
+ onActiveChanged: {
+ switch (_selectedMenu) {
+ case 1:
+ Functions.cancel()
+ break;
+ case 2:
+ pageStack.push(Qt.resolvedUrl("SearchPage.qml"), { dir: page.dir });
+ break;
+ case 3:
+ fileModel.showAll = true
+ menuShowAll.visible = false
+ menuShowFiltered.visible = true
+ break;
+ case 4:
+ fileModel.showAll = false
+ menuShowFiltered.visible = false
+ menuShowAll.visible = true
+ break;
+ }
+ _selectedMenu = 0
+ }
+
+ MenuItem {
+ text: qsTr("Cancel")
+ onClicked: _selectedMenu = 1
+ }
+ MenuItem {
+ text: qsTr("Search")
+ onClicked: _selectedMenu = 2
+ }
+ MenuItem {
+ id: menuShowAll
+ visible: !fileModel.showAll
+ text: qsTr("Show all files")
+ onClicked: _selectedMenu = 3
+ }
+ MenuItem {
+ id: menuShowFiltered
+ visible: fileModel.showAll
+ text: qsTr("Show only ") + engine.extensionFilter + qsTr(" files")
+ onClicked: _selectedMenu = 4
+ }
+ }
+
+ header: PageHeader {
+ title: Functions.formatPathForTitle(page.dir) + " " +
+ Functions.unicodeBlackDownPointingTriangle()
+ MouseArea {
+ anchors.fill: parent
+ onClicked: dirPopup.show();
+ }
+ }
+
+ delegate: ListItem {
+ id: fileItem
+ menu: contextMenu
+ width: ListView.view.width
+ contentHeight: listLabel.height+listSize.height + 13
+
+ Image {
+ id: listIcon
+ anchors.left: parent.left
+ anchors.leftMargin: Theme.paddingLarge
+ anchors.top: parent.top
+ anchors.topMargin: 11
+ source: "../images/small-"+fileIcon+".png"
+ }
+ Label {
+ id: listLabel
+ anchors.left: listIcon.right
+ anchors.leftMargin: 10
+ anchors.right: parent.right
+ anchors.rightMargin: Theme.paddingLarge
+ anchors.top: parent.top
+ anchors.topMargin: 5
+ text: filename
+ elide: Text.ElideRight
+ }
+ Label {
+ id: listSize
+ anchors.left: listIcon.right
+ anchors.leftMargin: 10
+ anchors.top: listLabel.bottom
+ text: !(isLink && isDir) ? size : Functions.unicodeArrow()+" "+symLinkTarget
+ color: Theme.secondaryColor
+ font.pixelSize: Theme.fontSizeExtraSmall
+ }
+ Label {
+ visible: !(isLink && isDir)
+ anchors.top: listLabel.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: filekind+permissions
+ color: Theme.secondaryColor
+ font.pixelSize: Theme.fontSizeExtraSmall
+ }
+ Label {
+ visible: !(isLink && isDir)
+ anchors.top: listLabel.bottom
+ anchors.right: listLabel.right
+ text: modified
+ color: Theme.secondaryColor
+ font.pixelSize: Theme.fontSizeExtraSmall
+ }
+
+ onClicked: {
+ if (model.isDir) {
+ pageStack.push(Qt.resolvedUrl("DirectoryPage.qml"),
+ { dir: fileModel.appendPath(listLabel.text) });
+ }
+ else {
+ Functions.cancel()
+ Functions.fileSelect(fileModel.appendPath(listLabel.text))
+ //pageStack.push(Qt.resolvedUrl("FilePage.qml"),
+ // { file: fileModel.appendPath(listLabel.text) });
+ }
+ }
+
+ // delete file after remorse time
+ ListView.onRemove: animateRemoval(fileItem)
+ function deleteFile(deleteFilename) {
+ remorseAction(qsTr("Deleting"), function() {
+ progressPanel.showText(qsTr("Deleting"));
+ engine.deleteFiles([ deleteFilename ]);
+ }, 5000)
+ }
+
+ // context menu is activated with long press
+ Component {
+ id: contextMenu
+ ContextMenu {
+ MenuItem {
+ visible: true
+ text: qsTr("Properties")
+ onClicked: {
+ pageStack.push(Qt.resolvedUrl("FilePage.qml"),
+ { file: fileModel.fileNameAt(index) });
+ }
+ }
+ }
+ }
+ }
+
+ // text if no files or error message
+ Text {
+ width: parent.width
+ anchors.leftMargin: Theme.paddingLarge
+ anchors.rightMargin: Theme.paddingLarge
+ horizontalAlignment: Qt.AlignHCenter
+ y: -fileList.contentY + 100
+ visible: fileModel.fileCount === 0 || fileModel.errorMessage !== ""
+ text: fileModel.errorMessage !== "" ? fileModel.errorMessage : (fileModel.showAll ? qsTr("No files") : qsTr("No key files"))
+ color: Theme.highlightColor
+ }
+ }
+
+ // update cover
+ onStatusChanged: {
+ if (status === PageStatus.Activating) {
+ // go to Home on startup
+ if (page.initial) {
+ page.initial = false;
+ Functions.goToInitial(dir);
+ }
+ }
+ }
+
+ DirPopup {
+ id: dirPopup
+ anchors.fill: parent
+ menuTop: 100
+ }
+
+ // connect signals from engine to panels
+ Connections {
+ target: engine
+ onProgressChanged: progressPanel.text = engine.progressFilename
+ onWorkerDone: progressPanel.hide()
+ onWorkerErrorOccurred: {
+ // the error signal goes to all pages in pagestack, show it only in the active one
+ if (progressPanel.open) {
+ progressPanel.hide();
+ if (message === "Unknown error")
+ filename = qsTr("Trying to move between phone and SD Card? It doesn't work, try copying.");
+ else if (message === "Failure to write block")
+ filename = qsTr("Perhaps the storage is full?");
+
+ notificationPanel.showText(message, filename);
+ }
+ }
+ }
+
+ NotificationPanel {
+ id: notificationPanel
+ page: page
+ }
+
+ ProgressPanel {
+ id: progressPanel
+ page: page
+ onCancelled: engine.cancel()
+ }
+
+}
+
+