~elopio/ubuntu-filemanager-app/ubuntusdk_emulator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*
 * Copyright (C) 2013 Canonical Ltd
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authored by: Arto Jalkanen <ajalkane@gmail.com>
 */
import QtQuick 2.0
import Ubuntu.Components 0.1
import Ubuntu.Components.Popups 0.1
import org.nemomobile.folderlistmodel 1.0

ListView {
    id: root

    property FolderListModel folderListModel
    property string path: folderListModel.path
    model: folderListModel

    Component {
        id: confirmSingleDeleteDialog
        ConfirmDialog {
            property string filePath
            property string fileName
            title: i18n.tr("Delete?")
            text: i18n.tr("Are you sure you want to permanently delete") + " '" + fileName + "'?"

            onAccepted: {
                console.log("Delete accepted for filePath, fileName", filePath, fileName)

                PopupUtils.open(Qt.resolvedUrl("FileOperationProgressDialog.qml"),
                                root,
                                {
                                    title: i18n.tr("Deleting files"),
                                    // descriptionPrepend: i18n.tr("Operation in progress"),
                                    folderListModel: folderListModel
                                 }
                                )

                console.log("Doing delete")
                folderListModel.rm(filePath)
            }
        }
    }

    Component {
        id: confirmRenameDialog
        ConfirmDialogWithInput {
            // IMPROVE: this does not seem good: the backend excepts row and new name.
            // But what if new files are added/deleted in the background while user is
            // entering the new name? The indices change and wrong file is renamed.
            // Perhaps the backend should take as parameters the "old name" and "new name"?
            // This is not currently a problem since the backend does not poll changes in
            // the filesystem, but may be a problem in the future.
            property int modelRow

            title: i18n.tr("Rename?")
            text: i18n.tr("Enter a new name")

            onAccepted: {
                console.log("Rename accepted", inputText)
                if (inputText !== '') {
                    console.log("Rename commensed, modelRow/inputText", modelRow, inputText)
                    if (pageModel.rename(modelRow, inputText) === false) {
                        PopupUtils.open(Qt.resolvedUrl("NotifyDialog.qml"), delegate,
                                        {
                                            title: i18n.tr("Could not rename"),
                                            text: i18n.tr("Insufficient permissions or name already exists?")
                                         })

                    }
                } else {
                    console.log("Empty new name given, ignored")
                }
            }
        }
    }

    ActionSelectionPopover {
        id: actionSelectionPopover
        property var model
        actions: ActionList {
            Action {
                text: i18n.tr("Show details")
                onTriggered: {
                    print(text)
                    PopupUtils.open(Qt.resolvedUrl("FileDetailsPopover.qml"),
                                    actionSelectionPopover.caller,
                                        { "model": actionSelectionPopover.model
                                        }
                                    )
                }
            }
            Action {
                text: i18n.tr("Copy")
                // TODO: temporary.
                iconSource: "/usr/share/icons/Humanity/actions/48/edit-copy.svg"

                onTriggered: {
                    console.log("Copy on row called for", actionSelectionPopover.model.fileName, actionSelectionPopover.model.index)
                    model.copyIndex(actionSelectionPopover.model.index)
                    console.log("CliboardUrlsCounter after copy", folderListModel.clipboardUrlsCounter)
                }
            }
            Action {
                text: i18n.tr("Cut")
                // TODO: temporary
                iconSource: "/usr/share/icons/Humanity/actions/48/edit-cut.svg"
                onTriggered: {
                    console.log("Cut on row called for", actionSelectionPopover.model.fileName, actionSelectionPopover.model.index)
                    model.cutIndex(actionSelectionPopover.model.index)
                    console.log("CliboardUrlsCounter after copy", folderListModel.clipboardUrlsCounter)
                }
            }
            Action {
                text: i18n.tr("Delete")
                // TODO: temporary
                iconSource: "/usr/share/icons/Humanity/actions/48/edit-delete.svg"
                onTriggered: {
                    print(text)
                    PopupUtils.open(confirmSingleDeleteDialog, actionSelectionPopover.caller,
                                    { "filePath" : actionSelectionPopover.model.filePath,
                                      "fileName" : actionSelectionPopover.model.fileName }
                                    )
                }
            }            
            Action {
                text: i18n.tr("Rename")
                // TODO: temporary
                iconSource: "/usr/share/icons/Humanity/actions/48/rotate.svg"
                onTriggered: {
                    print(text)
                    PopupUtils.open(confirmRenameDialog, actionSelectionPopover.caller,
                                    { "modelRow"  : actionSelectionPopover.model.index,
                                      "inputText" : actionSelectionPopover.model.fileName
                                    })
                }
            }

        }
        // TODO: problem: clicking outside popup makes the click go through to the
        // folder listview, so for example you'd change directory while only trying
        // to dismiss the popup. Maybe SDK bug, if not have to do workarounds.
        // grabDismissAreaEvents seemed promising, but at least with onPressAndHold
        // makes background view scroll when moving mouse as if mouse button was still down.
        // grabDismissAreaEvents: false
        // Without this the popover jumps up at the start of the application. SDK bug?
        // Bug report has been made of these https://bugs.launchpad.net/ubuntu-ui-toolkit/+bug/1152270
        visible: false
    }

    delegate: FolderListDelegate {
        id: delegate

        onClicked: {
            if (model.isDir) {
                if (model.isReadable && model.isExecutable) {
                    console.log("Changing to dir", model.filePath)
                    folderListModel.path = model.filePath
                } else {
                    PopupUtils.open(Qt.resolvedUrl("NotifyDialog.qml"), delegate,
                                    {
                                        title: i18n.tr("Folder not accessible"),
                                        text: i18n.tr("Can not access ") + model.fileName

                                     })
                }
            } else {
                console.log("Non dir clicked")
                PopupUtils.open(Qt.resolvedUrl("FileActionDialog.qml"), root,
                                {
                                    fileName: model.fileName,
                                    filePath: model.filePath,
                                    folderListModel: root.folderListModel
                                 })
            }
        }

        onPressAndHold: {
            console.log("FolderListDelegate onPressAndHold")
            actionSelectionPopover.caller = delegate
            actionSelectionPopover.model = model
            actionSelectionPopover.show();
        }
    }

    Scrollbar {
        flickableItem: root
        align: Qt.AlignTrailing
    }
}