/******************************************************************************* ** ** Copyright (C) 2023 Open Mobile Platform LLC. ** Contact: https://community.omprussia.ru/open-source ** ** This file is part of the DocumentConverter project. ** ** Redistribution and use in source and binary forms, ** with or without modification, are permitted provided ** that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer ** in the documentation and/or other materials provided with the distribution. ** * Neither the name of the copyright holder nor the names of its contributors ** may be used to endorse or promote products derived from this software ** without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, ** THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ** FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ** IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE ** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, ** OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; ** LOSS OF USE, DATA, OR PROFITS; ** OR BUSINESS INTERRUPTION) ** HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, ** EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ** *******************************************************************************/ import QtQuick 2.0 import Nemo.FileManager 1.0 import Sailfish.Silica 1.0 import Sailfish.Pickers 1.0 Page { id: loadPage objectName: "loadPage" SilicaListView { id: lisView property string currentPath property string resultFileName property string resultPath property string defaultPath property string directoryPath anchors.fill: parent model: fileModel header: PageHeader { title: fileModel.directoryName } delegate: ListItem { width: parent.width Image { id: icon anchors.verticalCenter: parent.verticalCenter x: Theme.horizontalPageMargin source: "image://theme/icon-m-file" + (model.isDir ? "-folder" : "-other") + (highlighted ? '?' + Theme.highlightColor : '') } Item { id: description anchors { verticalCenter: parent.verticalCenter verticalCenterOffset: -Theme.paddingMedium right: parent.right rightMargin: Theme.horizontalPageMargin left: icon.right leftMargin: Theme.paddingMedium } height: fileNameLabel.height baselineOffset: fileNameLabel.baselineOffset Label { id: fileNameLabel text: model.fileName color: highlighted ? Theme.highlightColor : Theme.primaryColor truncationMode: TruncationMode.Fade width: parent.width - sizeLabel.width - Theme.paddingMedium } Label { id: sizeLabel text: Format.formatFileSize(model.size) font.pixelSize: Theme.fontSizeExtraSmall anchors.right: parent.right anchors.baseline: parent.baseline color: highlighted ? Theme.highlightColor : Theme.primaryColor } } menu: ContextMenu { hasContent: !model.isDir && (fileName.lastIndexOf(".pdf") === -1) Repeater { model: listExtension(fileName) MenuItem { text: qsTr("Conver to %1").arg(modelData) onClicked: { lisView.currentPath = absolutePath lisView.resultFileName = createFileName(fileName, modelData) pageStack.push(folderPickerDialog) } } } } Row { spacing: Theme.paddingSmall anchors { top: description.bottom right: description.right } Label { opacity: 0.6 color: highlighted ? Theme.highlightColor : Theme.primaryColor font.pixelSize: Theme.fontSizeExtraSmall anchors.verticalCenter: parent.verticalCenter text: Format.formatDate(model.modified, Format.Timepoint) } } onClicked: { if (model.isDir) { fileModel.path = model.absolutePath } } } VerticalScrollDecorator {} } Component { id: folderPickerDialog FolderPickerPage { showSystemFiles: false dialogTitle: qsTr("Save as ...") onSelectedPathChanged: { lisView.resultPath = ("%1/%2").arg(selectedPath).arg(lisView.resultFileName) var loadPage_ = pageStack.find(function(page) { if (page.objectName === "loadPage") return page }) pageStack.replaceAbove(loadPage_, Qt.resolvedUrl("ConvertPage.qml"), { "fileSourcePath" : lisView.currentPath, "fileResultPath" : lisView.resultPath, "fileName": lisView.resultFileName }) } } } FileModel { id: fileModel active: true includeDirectories: true includeParentDirectory: false directorySort: FileModel.SortDirectoriesBeforeFiles nameFilters: ["*.doc", "*.docx", "*.pdf", "*.odt", "*.xls", "*.xlsx", "*.ods", "*.ppt", "*.pptx", "*.odp"] sortBy: FileModel.SortByName sortOrder: Qt.AscendingOrder path: StandardPaths.documents } function createFileName(fileName, extension){ var tmpIndex = fileName.lastIndexOf(".") fileName = fileName.slice(0, tmpIndex) return ("%1%2").arg(fileName).arg(extension) } function listExtension(fileName) { var exIndex = fileName.lastIndexOf(".") var extension = fileName.slice(exIndex) var listDocumentsExtension = [".doc", ".docx", ".odt", ".pdf"] var listTablesExtension = [".xls", ".xlsx", ".ods", ".pdf"] var listPresentationExtension = [".ppt", ".pptx", ".odp", ".pdf"] var listOfList = [listDocumentsExtension, listTablesExtension, listPresentationExtension] for (var i = 0; i < listOfList.length; i++) { var element = listOfList[i] var tmpIndex = element.indexOf(extension) if (tmpIndex !== -1 && extension !== ".pdf") { element.splice(tmpIndex, 1) return element } } } }