harbour-seaprint/qml/pages/FirstPage.qml

488 lines
18 KiB
QML
Raw Permalink Normal View History

2021-03-06 18:13:21 +03:00
import QtQuick 2.6
2019-12-01 17:40:10 +03:00
import Sailfish.Silica 1.0
2019-12-01 17:55:55 +03:00
import Sailfish.Pickers 1.0
import seaprint.ippdiscovery 1.0
2020-05-11 21:44:53 +03:00
import seaprint.convertchecker 1.0
2019-12-01 17:55:55 +03:00
import seaprint.ippprinter 1.0
import seaprint.imageitem 1.0
import seaprint.mimer 1.0
2019-12-01 17:55:55 +03:00
import "utils.js" as Utils
2019-12-01 17:40:10 +03:00
Page {
id: page
allowedOrientations: Orientation.All
2019-12-17 22:33:21 +03:00
property string selectedFile: ""
2020-01-03 14:45:51 +03:00
property string selectedFileType
2019-12-01 17:55:55 +03:00
2021-02-14 16:38:35 +03:00
Connections {
target: wifi
2019-12-02 22:56:38 +03:00
onConnectedChanged: {
2021-02-14 16:38:35 +03:00
if(wifi.connected) {
var favourites = db.getFavourites(wifi.ssid);
IppDiscovery.favourites = favourites;
2019-12-02 22:56:38 +03:00
}
else {
IppDiscovery.favourites = []
2019-12-02 22:56:38 +03:00
}
2019-12-01 22:21:36 +03:00
}
property bool initialSSIDchange: true
onSsidChanged: {
if(!initialSSIDchange)
{
IppDiscovery.reset();
}
initialSSIDchange = false;
}
2019-12-01 17:55:55 +03:00
}
2020-10-10 18:55:01 +03:00
Label {
text: qsTr("Not on WiFi")
color: Theme.highlightColor
anchors.centerIn: parent
visible: !wifi.connected
}
2020-10-10 18:38:53 +03:00
property bool initialized: false
onVisibleChanged: {
if (visible)
{
if(initialized)
page.refreshed()
initialized = true
}
}
2019-12-17 22:20:09 +03:00
signal refreshed()
signal noFileSelected()
2019-12-17 22:20:09 +03:00
2019-12-01 17:55:55 +03:00
Component.onCompleted: {
IppDiscovery.discover();
if(selectedFile != "")
{
var type = Mimer.get_type(selectedFile);
selectedFileType = type;
}
2019-12-01 17:55:55 +03:00
}
2020-06-07 15:28:54 +03:00
property bool nagged: false
onStatusChanged: {
if(status==PageStatus.Active && !nagged && nagScreenSetting.value != nagScreenSetting.expectedValue)
{
2021-11-20 19:31:03 +03:00
if(expectCalligra && !ConvertChecker.calligra)
2020-06-07 15:28:54 +03:00
{
nagged=true
pageStack.push(Qt.resolvedUrl("NagScreen.qml"))
}
}
}
2019-12-01 17:40:10 +03:00
// To enable PullDownMenu, place our content in a SilicaFlickable
SilicaFlickable {
anchors.top: parent.top
width: parent.width
anchors.bottom: fileDock.top
clip: true
2019-12-01 17:40:10 +03:00
// PullDownMenu and PushUpMenu must be declared in SilicaFlickable, SilicaListView or SilicaGridView
PullDownMenu {
MenuItem {
2019-12-13 23:36:39 +03:00
text: qsTr("About SeaPrint")
onClicked: pageStack.push(Qt.resolvedUrl("AboutPage.qml"))
2020-06-07 18:05:46 +03:00
}
MenuItem {
text: qsTr("Settings")
onClicked: pageStack.push(Qt.resolvedUrl("SettingsPage.qml"))
}
2019-12-01 17:40:10 +03:00
MenuItem {
2019-12-01 17:55:55 +03:00
text: qsTr("Add by URL")
2019-12-02 22:56:38 +03:00
enabled: wifi.connected
2019-12-02 22:23:44 +03:00
onClicked: {
2021-02-15 20:03:35 +03:00
var dialog = pageStack.push(Qt.resolvedUrl("AddPrinterDialog.qml"));
2019-12-02 22:23:44 +03:00
dialog.accepted.connect(function() {
2019-12-02 22:56:38 +03:00
db.addFavourite(wifi.ssid, dialog.value);
2021-02-15 20:03:35 +03:00
IppDiscovery.favourites = db.getFavourites(dialog.ssid);
2019-12-02 22:23:44 +03:00
})
2019-12-01 17:55:55 +03:00
}
}
MenuItem {
text: qsTr("Refresh")
2019-12-01 22:21:36 +03:00
onClicked: {
IppDiscovery.discover();
2019-12-17 22:20:09 +03:00
page.refreshed();
2019-12-01 22:21:36 +03:00
}
2019-12-01 17:40:10 +03:00
}
}
2019-12-01 17:55:55 +03:00
SilicaListView {
id: listView
anchors.fill: parent
model: IppDiscovery
2019-12-01 17:55:55 +03:00
spacing: Theme.paddingSmall
2020-08-09 16:23:05 +03:00
header: PageHeader {
id: pageHeader
title: "SeaPrint"
description: qsTr("Available printers")
}
2019-12-08 15:55:56 +03:00
delegate: ListItem {
2019-12-01 17:55:55 +03:00
id: delegate
2019-12-08 15:55:56 +03:00
contentItem.height: visible ? Math.max(column.implicitHeight, Theme.itemSizeLarge+2*Theme.paddingMedium) : 0
2019-12-13 21:14:50 +03:00
IppPrinter {
id: printer
url: model.display
}
visible: Object.keys(printer.attrs).length !== 0
property string name: Utils.unknownForEmptyString(printer.attrs["printer-name"].value)
2021-07-11 15:18:50 +03:00
property var supported_formats: Utils.supported_formats(printer, considerAdditionalFormatsSetting.value)
property bool canPrint: supported_formats.mimetypes.indexOf(selectedFileType) != -1
2019-12-13 21:14:50 +03:00
Connections {
target: printer
onAttrsChanged: {
if(Object.keys(printer.attrs).length === 0) {
delegate.visible = false
}
else {
delegate.visible = true
}
}
}
2019-12-17 22:20:09 +03:00
Connections {
target: page
onRefreshed: {
printer.refresh()
}
}
2020-01-26 15:27:56 +03:00
Timer
{
id: debugCountReset
interval: 666
repeat: false
onTriggered:
{
debugCount = 0;
}
}
property int debugCount: 0
2021-03-21 00:45:58 +03:00
function maybeGetParams()
{
if(printer.attrs.hasOwnProperty("printer-uuid"))
{
2021-03-21 14:49:54 +03:00
return JSON.parse(db.getJobSettings(printer.attrs["printer-uuid"].value, selectedFileType));
2021-03-21 00:45:58 +03:00
}
else
{
return new Object();
}
}
2019-12-01 17:55:55 +03:00
onClicked: {
2020-05-09 15:24:51 +03:00
2020-01-26 15:27:56 +03:00
if(++debugCount == 5)
{
pageStack.push(Qt.resolvedUrl("DebugPage.qml"), {printer: printer})
return;
}
debugCountReset.restart();
if(selectedFile == "")
2019-12-01 17:55:55 +03:00
{
noFileSelected();
}
else if(!canPrint)
{
return;
2019-12-01 17:55:55 +03:00
}
else
{
pageStack.push(Qt.resolvedUrl("PrinterPage.qml"), {printer: printer, selectedFile: selectedFile, jobParams: maybeGetParams()})
2019-12-01 17:55:55 +03:00
}
}
2019-12-01 17:40:10 +03:00
ImageItem {
2019-12-01 17:55:55 +03:00
id: icon
anchors.top: parent.top
anchors.left: parent.left
anchors.topMargin: Theme.paddingMedium
anchors.leftMargin: Theme.paddingMedium
height: Theme.itemSizeLarge
width: Theme.itemSizeLarge
image: printer.icon
Image {
id: placeholder
anchors.fill: parent
sourceSize.height: height
sourceSize.width: width
2020-01-26 15:27:56 +03:00
visible: !parent.valid
2022-02-21 20:14:04 +03:00
source: "icon-seaprint-nobg.svg"
}
2019-12-01 17:55:55 +03:00
}
Image {
id: warningIcon
source: "image://theme/icon-lock-warning"
anchors.bottom: icon.bottom
anchors.right: icon.right
visible: Utils.isWaringState(printer)
}
2019-12-01 17:55:55 +03:00
Column {
id: column
anchors.left: icon.right
anchors.leftMargin: Theme.paddingMedium
Label {
id: name_label
2020-05-09 15:24:51 +03:00
color: canPrint || selectedFile == "" ? Theme.primaryColor : Theme.secondaryColor
2019-12-13 21:14:50 +03:00
text: name
2019-12-01 17:55:55 +03:00
}
Label {
id: mm_label
2020-05-09 15:24:51 +03:00
color: canPrint || selectedFile == "" ? Theme.primaryColor : Theme.secondaryColor
2019-12-01 17:55:55 +03:00
font.pixelSize: Theme.fontSizeExtraSmall
2021-02-13 19:30:19 +03:00
text: Utils.unknownForEmptyString(printer.attrs["printer-make-and-model"].value)
2021-06-21 21:20:09 +03:00
+ (Utils.existsAndNotEmpty("printer-location", printer) ? " • "+printer.attrs["printer-location"].value : "")
2019-12-01 17:55:55 +03:00
}
Label {
id: uri_label
color: canPrint || selectedFile == "" ? Theme.highlightColor : Theme.secondaryColor
font.pixelSize: Theme.fontSizeTiny
text: printer.url
2019-12-01 17:55:55 +03:00
}
Row {
spacing: Theme.paddingMedium
Label {
id: format_unsupported_label
2021-06-12 13:45:58 +03:00
visible: !supported_formats.pdf && !supported_formats.postscript && !supported_formats.plaintext
&& !supported_formats.office && !supported_formats.images
color: "red"
font.pixelSize: Theme.fontSizeExtraSmall
text: qsTr("No compatible formats supported")
}
HighlightImage {
height: Theme.itemSizeExtraSmall/2
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.pdf
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-pdf"
}
HighlightImage {
height: Theme.itemSizeExtraSmall/2
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.postscript
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-other"
}
2021-06-12 13:45:58 +03:00
HighlightImage {
height: Theme.itemSizeExtraSmall/2
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.plaintext
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-document"
}
HighlightImage {
height: Theme.itemSizeExtraSmall/2
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.office
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-formatted"
}
HighlightImage {
height: Theme.itemSizeExtraSmall/2
2021-06-12 17:54:17 +03:00
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.office
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-presentation"
}
HighlightImage {
height: Theme.itemSizeExtraSmall/2
width: Theme.itemSizeExtraSmall/2
visible: supported_formats.images
highlightColor: "red"
highlighted: !(selectedFile == "" || canPrint)
source: "image://theme/icon-m-file-image"
}
2019-12-01 17:55:55 +03:00
}
2019-12-01 17:55:55 +03:00
}
2019-12-01 17:40:10 +03:00
RemorseItem {
id: removeRemorse
}
2019-12-08 15:55:56 +03:00
menu: ContextMenu {
MenuItem {
text: qsTr("View jobs")
onClicked: pageStack.push(Qt.resolvedUrl("JobsPage.qml"), {printer: printer})
}
2020-09-29 22:47:37 +03:00
MenuItem {
2020-09-30 21:57:05 +03:00
text: qsTr("Printer details")
onClicked: pageStack.push(Qt.resolvedUrl("DetailsPage.qml"), {printer: printer})
2020-09-29 22:47:37 +03:00
}
2019-12-13 21:14:50 +03:00
MenuItem {
text: qsTr("Remove printer")
visible: db.isFavourite(wifi.ssid, model.display)
onClicked: {
removeRemorse.execute(delegate, qsTr("Removing printer"),
function() {db.removeFavourite(wifi.ssid, model.display);
IppDiscovery.favourites = db.getFavourites(wifi.ssid)})
2019-12-13 21:14:50 +03:00
}
}
2019-12-08 15:55:56 +03:00
}
2019-12-01 17:40:10 +03:00
}
2019-12-01 17:55:55 +03:00
}
}
2022-06-06 10:47:17 +03:00
Rectangle {
2019-12-01 17:55:55 +03:00
id: fileDock
2021-03-06 18:13:21 +03:00
height: panelColumn.implicitHeight
2019-12-01 17:55:55 +03:00
width: parent.width
2022-06-06 10:47:17 +03:00
anchors.bottom: parent.bottom
gradient: Gradient {
GradientStop { position: 0.0; color: Theme.rgba(Theme.highlightBackgroundColor, 0.15) }
GradientStop { position: 1.0; color: Theme.rgba(Theme.highlightBackgroundColor, 0.3) }
}
2019-12-01 17:55:55 +03:00
2021-03-06 18:13:21 +03:00
Column {
id: panelColumn
width: parent.width
spacing: Theme.paddingLarge
topPadding: page.isPortrait && !warningRow.visible ? 2*Theme.paddingLarge : Theme.paddingLarge
2021-03-06 18:13:21 +03:00
bottomPadding: page.isPortrait ? 2*Theme.paddingLarge : Theme.paddingLarge
Row {
id: warningRow
2021-03-06 18:13:21 +03:00
anchors.horizontalCenter: parent.horizontalCenter
visible: Mimer.isOffice(page.selectedFileType)
HighlightImage {
source: "image://theme/icon-s-warning"
highlighted: true
highlightColor: Theme.highlightColor
}
Label
{
text: qsTr("This format may not render correctly")
font.pixelSize: Theme.fontSizeExtraSmall
color: Theme.highlightColor
}
}
Label {
id: fileLabel
2021-06-01 19:35:44 +03:00
width: parent.width
2021-05-28 21:10:49 +03:00
leftPadding: Theme.paddingLarge
2021-06-01 19:35:44 +03:00
rightPadding: Theme.paddingLarge
2020-08-09 16:29:50 +03:00
2021-03-06 18:13:21 +03:00
horizontalAlignment: contentWidth > width ? Text.AlignRight : Text.AlignHCenter
truncationMode: TruncationMode.Fade
text: selectedFile != "" ? selectedFile : qsTr("No file selected")
SequentialAnimation {
id: noFileSelectedAnimation
loops: 3
ColorAnimation {target: fileLabel; property: "color"; from: Theme.primaryColor; to: Theme.highlightColor; duration: 200 }
ColorAnimation {target: fileLabel; property: "color"; from: Theme.highlightColor; to: Theme.primaryColor; duration: 200 }
}
Connections {
target: page
onNoFileSelected: {
noFileSelectedAnimation.start()
}
}
2020-08-09 16:29:50 +03:00
}
2020-05-01 00:05:46 +03:00
2021-03-06 18:13:21 +03:00
Row {
width: parent.width
IconButton {
id: folderButton
icon.source: "image://theme/icon-m-file-document"
width: parent.width/2
onClicked: pageStack.push(documentPickerPage)
}
IconButton {
id: imageButton
icon.source: "image://theme/icon-m-file-image"
width: parent.width/2
onClicked: pageStack.push(imagePickerPage)
}
2020-08-09 16:29:50 +03:00
2020-05-01 00:05:46 +03:00
}
2019-12-01 17:55:55 +03:00
}
Component {
2021-02-13 20:07:43 +03:00
id: documentPickerPage
DocumentPickerPage {
2020-08-06 18:34:14 +03:00
allowedOrientations: Orientation.All
2021-04-10 15:42:54 +03:00
Component.onCompleted: {
2021-04-18 10:28:33 +03:00
var thingy = Qt.createComponent(ConvertChecker.calligra ? "../components/DocumentFilterOffice.notqml" : "../components/DocumentFilter.notqml");
2021-04-10 15:42:54 +03:00
if (thingy.status == Component.Ready) {
_contentModel.contentFilter = thingy.createObject(this);
}
}
2021-02-13 22:43:03 +03:00
2020-05-01 00:05:46 +03:00
title: qsTr("Choose file")
2019-12-01 17:55:55 +03:00
onSelectedContentPropertiesChanged: {
2021-02-13 20:07:43 +03:00
var mimeType = Mimer.get_type(selectedContentProperties.filePath)
2021-06-12 13:45:58 +03:00
if(mimeType == Mimer.PDF || mimeType == Mimer.Postscript || mimeType == Mimer.Plaintext || Mimer.isOffice(mimeType))
2021-02-13 20:07:43 +03:00
{
page.selectedFile = selectedContentProperties.filePath
page.selectedFileType = mimeType
}
else
{
notifier.notify(qsTr("Unsupported document format"))
page.selectedFile = ""
page.selectedFileType = ""
}
2019-12-01 17:55:55 +03:00
}
2019-12-01 17:40:10 +03:00
}
}
2020-05-01 00:05:46 +03:00
Component {
id: imagePickerPage
ImagePickerPage {
2020-08-06 18:34:14 +03:00
allowedOrientations: Orientation.All
2020-05-01 00:05:46 +03:00
onSelectedContentPropertiesChanged: {
page.selectedFile = selectedContentProperties.filePath
page.selectedFileType = Mimer.get_type(selectedContentProperties.filePath)
}
}
}
2019-12-01 17:40:10 +03:00
}
}