Warning, /graphics/peruse/src/app/qml/viewers/ViewerBase.qml is written in an unsupported language. File is not indexed.

0001 /*
0002  * Copyright (C) 2015 Dan Leinir Turthra Jensen <admin@leinir.dk>
0003  *
0004  * This library is free software; you can redistribute it and/or
0005  * modify it under the terms of the GNU Lesser General Public
0006  * License as published by the Free Software Foundation; either
0007  * version 2.1 of the License, or (at your option) version 3, or any
0008  * later version accepted by the membership of KDE e.V. (or its
0009  * successor approved by the membership of KDE e.V.), which shall
0010  * act as a proxy defined in Section 6 of version 3 of the license.
0011  *
0012  * This library is distributed in the hope that it will be useful,
0013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
0015  * Lesser General Public License for more details.
0016  *
0017  * You should have received a copy of the GNU Lesser General Public
0018  * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
0019  *
0020  */
0021 
0022 import QtQuick 2.12
0023 import QtQuick.Controls 2.12 as QtControls
0024 import QtQuick.Layouts 1.12 as QtLayouts
0025 import org.kde.kirigami 2.13 as Kirigami
0026 
0027 /**
0028  * @brief a base for holding the image browser.
0029  * 
0030  * It keeps track of the comic data and deals with all sorts
0031  * of side functions like keeping track of the current page,
0032  * right to left mode and the controls.
0033  * 
0034  * This is slightly different between filetypes.
0035  */
0036 Item {
0037     id: root;
0038     signal goNextPage();
0039     signal goPreviousPage();
0040     signal goPage(int pageNumber);
0041     // Fired when the viewer has completed loading the file.
0042     // Success is true if this was successful, and false otherwise.
0043     signal loadingCompleted(bool success);
0044     property string file;
0045     property string title;
0046     property int currentPage: -1;
0047     property bool rtlMode: false;
0048     property int zoomMode: 0;
0049     property int pageCount;
0050     property var pagesModel;
0051     property list<QtObject> viewerActions;
0052     property Component thumbnailComponent;
0053     signal restoreCurrentPage();
0054 
0055     /**
0056      * Whether or not the viewer supports frame based navigation
0057      */
0058     property bool hasFrames: false;
0059     signal nextFrame();
0060     signal previousFrame();
0061 
0062     // This all looks a little silly, however, without this, we can't double-click on the
0063     // page (which is, these days, used for zooming purposes). It also works around some
0064     // minor small annoyances, like accidental swiping when the finger doesn't leave the
0065     // surface of the page when switching occurs.
0066     function startToggleControls() {
0067         controlsToggler.start();
0068     }
0069     function abortToggleControls() {
0070         controlsToggler.stop();
0071     }
0072     Timer {
0073         id: controlsToggler;
0074         interval: 500;
0075         running: false;
0076         repeat: false;
0077         onTriggered: {
0078             if(applicationWindow().controlsVisible === true) {
0079                 applicationWindow().controlsVisible = false;
0080             }
0081             else {
0082                 applicationWindow().controlsVisible = true;
0083             }
0084         }
0085     }
0086 
0087     function activateExternalLink(link) {
0088         linkActivator.showLink(link);
0089     }
0090 
0091     Kirigami.OverlaySheet {
0092         id: linkActivator
0093         function showLink(link) {
0094             linkActivator.link = link;
0095             open();
0096         }
0097         showCloseButton: true
0098         header: QtLayouts.RowLayout {
0099             Kirigami.Heading {
0100                 text: i18nc("Title for a dialog offering the user to open a link to some external resource", "Open External Link?")
0101                 QtLayouts.Layout.fillWidth: true;
0102                 elide: Text.ElideRight;
0103             }
0104             QtControls.ToolButton {
0105                 icon.name: "dialog-ok";
0106                 text: i18nc("label for a button which activates an external link", "Open Link");
0107                 onClicked: {
0108                     Qt.openUrlExternally(linkActivator.link);
0109                     linkActivator.close();
0110                 }
0111             }
0112         }
0113         property string link
0114         QtLayouts.ColumnLayout {
0115             QtLayouts.Layout.preferredWidth: root.width * .7
0116             QtControls.Label {
0117                 QtLayouts.Layout.fillWidth: true
0118                 text: i18n("The link you just clicked points to somewhere outside of the book. Please check the details of the link below, to make sure that you really do want to open it, or just close this sheet.")
0119                 wrapMode: Text.Wrap
0120             }
0121             QtControls.Label {
0122                 id: httpOrFileLink
0123                 // For the http(s) case, if we got to here, we can assume we have been given a reasonably laid out link
0124                 visible: linkActivator.link.toLowerCase().startsWith("http") || linkActivator.link.toLowerCase().startsWith("file:")
0125                 textFormat: Text.PlainText
0126                 QtLayouts.Layout.fillWidth: true
0127                 wrapMode: Text.Wrap
0128                 horizontalAlignment: Text.AlignHCenter
0129                 text: linkActivator.link
0130             }
0131             QtControls.Label {
0132                 id: mailtoLink
0133                 visible: linkActivator.link.toLowerCase().startsWith("mailto:")
0134                 textFormat: Text.PlainText
0135                 QtLayouts.Layout.fillWidth: true
0136                 wrapMode: Text.Wrap
0137                 text: {
0138                     if (theThings.length > 2) {
0139                         // This is a weird one, and likely means there's things like a BCC or whatnot in there,
0140                         // so let's just show people the entire link
0141                         return i18n("Compose an email to %1, based on the following link:\n\n%2", email, linkActivator.link);
0142                     } else if (subject.length > 0 && body.length > 0) {
0143                         return i18n("Compose an email for %1 with the subject \"%2\" and the following body:\n\n%3", email, subject, body);
0144                     } else if (subject.length > 0) {
0145                         return i18n("Compose an email for %1 with the subject \"%2\"", email, subject);
0146                     } else {
0147                         return i18n("Compose email for: %1", email)
0148                     }
0149                 }
0150                 property string email: linkActivator.link.slice(0, linkActivator.link.indexOf("?") - 1)
0151                 property string subject: getThingValue("subject", theThings)
0152                 property string body: getThingValue("body", theThings)
0153 
0154                 property var theThings: linkActivator.link.slice(linkActivator.link.indexOf("?")).split("&")
0155                 // Technically we could just refer to theThings directly, but this way we can use this bindingly
0156                 function getThingValue(whatThing, fromWhat) {
0157                     var theValue = "";
0158                     for (var i = 0; i < fromWhat.length; ++i) {
0159                         if (fromWhat[i].toLowerCase().startsWith(whatThing + "=")) {
0160                             theValue = fromWhat[i].slice(whatThing.length);
0161                         }
0162                     }
0163                     return theValue;
0164                 }
0165             }
0166             QtControls.Label {
0167                 visible: mailtoLink.visible === false && httpOrFileLink.visible === false
0168                 textFormat: Text.PlainText
0169                 QtLayouts.Layout.fillWidth: true
0170                 wrapMode: Text.Wrap
0171                 text: linkActivator.link
0172             }
0173         }
0174     }
0175 }