~ci-train-bot/ubuntu-settings-components/ubuntu-settings-components-ubuntu-zesty-2236

« back to all changes in this revision

Viewing changes to examples/Printers.qml

  • Committer: Bileto Bot
  • Date: 2017-02-21 16:16:01 UTC
  • mfrom: (176.2.56 printer-components)
  • Revision ID: ci-train-bot@canonical.com-20170221161601-b6xdyrpew24xfnpl
* packaging: suggest cups, depend on libcups2-dev
* adds cups bindings for printer/job management

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright 2017 Canonical Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU Lesser General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU Lesser General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU Lesser General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 *
 
16
 * Authored by Jonas G. Drange <jonas.drange@canonical.com>
 
17
 */
 
18
 
 
19
import QtQuick 2.4
 
20
import QtQuick.Layouts 1.1
 
21
import Ubuntu.Components 1.3
 
22
import Ubuntu.Components.Popups 1.3
 
23
import Ubuntu.Components.ListItems 1.3 as ListItems
 
24
import Ubuntu.Settings.Components 0.1
 
25
import Ubuntu.Settings.Printers 0.1
 
26
 
 
27
MainView {
 
28
    width: units.gu(50)
 
29
    height: units.gu(90)
 
30
 
 
31
    Component {
 
32
        id: printerPage
 
33
 
 
34
        Page {
 
35
            visible: false
 
36
            property var printer
 
37
            header: PageHeader {
 
38
                id: printerPageHeader
 
39
                title: printer.name
 
40
                flickable: printerFlickable
 
41
            }
 
42
 
 
43
            Component {
 
44
                id: printerPageNotYetLoaded
 
45
 
 
46
                Item {
 
47
                    anchors.fill: parent
 
48
                    ActivityIndicator {
 
49
                        anchors.centerIn: parent
 
50
                        running: true
 
51
                    }
 
52
                }
 
53
            }
 
54
 
 
55
            Component.onCompleted: {
 
56
                printer.description;
 
57
            }
 
58
 
 
59
            Flickable {
 
60
                id: printerFlickable
 
61
                anchors.fill: parent
 
62
 
 
63
                Loader {
 
64
                    id: printerPageBitsLoader
 
65
                    anchors.fill: parent
 
66
                    sourceComponent: printer.isLoaded ? printerPageLoaded : printerPageNotYetLoaded
 
67
                }
 
68
            }
 
69
 
 
70
            Component {
 
71
                id: printerPageLoaded
 
72
 
 
73
                Column {
 
74
                    spacing: units.gu(2)
 
75
                    anchors {
 
76
                        top: parent.top
 
77
                        topMargin: units.gu(2)
 
78
                        left: parent.left
 
79
                        right: parent.right
 
80
                    }
 
81
 
 
82
                    ListItems.Standard {
 
83
                        anchors {
 
84
                            left: parent.left
 
85
                            right: parent.right
 
86
                        }
 
87
                        text: "Enabled"
 
88
 
 
89
                        control: Switch {
 
90
                            checked: printer.printerEnabled
 
91
                            onCheckedChanged: printer.printerEnabled = checked
 
92
                        }
 
93
                    }
 
94
 
 
95
                    ListItems.Standard {
 
96
                        anchors {
 
97
                            left: parent.left
 
98
                            right: parent.right
 
99
                        }
 
100
                        text: "Accepting jobs"
 
101
 
 
102
                        control: Switch {
 
103
                            checked: printer.acceptJobs
 
104
                            onCheckedChanged: printer.acceptJobs = checked
 
105
                        }
 
106
                    }
 
107
 
 
108
                    ListItems.Standard {
 
109
                        anchors {
 
110
                            left: parent.left
 
111
                            right: parent.right
 
112
                        }
 
113
                        text: "Jobs"
 
114
                        progression: true
 
115
                        onClicked: pageStack.push(jobPage, { printer: printer })
 
116
                    }
 
117
 
 
118
                    Label {
 
119
                        anchors {
 
120
                            left: parent.left
 
121
                            right: parent.right
 
122
                            margins: units.gu(2)
 
123
                        }
 
124
                        text: "Description"
 
125
                    }
 
126
 
 
127
                    ListItems.SingleControl {
 
128
                        anchors {
 
129
                            left: parent.left
 
130
                            right: parent.right
 
131
                        }
 
132
 
 
133
                        control: TextField {
 
134
                           anchors {
 
135
                                margins: units.gu(1)
 
136
                                left: parent.left
 
137
                                right: parent.right
 
138
 
 
139
                            }
 
140
                            text: printer.description
 
141
                            onTextChanged: printer.description = text
 
142
                        }
 
143
                    }
 
144
 
 
145
 
 
146
                    ListItems.ValueSelector {
 
147
                        anchors {
 
148
                            left: parent.left
 
149
                            right: parent.right
 
150
                        }
 
151
                        enabled: values.length > 1
 
152
                        text: "Duplex"
 
153
                        values: printer.supportedDuplexModes
 
154
                        onSelectedIndexChanged: printer.duplexMode = selectedIndex
 
155
                        Component.onCompleted: {
 
156
                            if (enabled) {
 
157
                                selectedIndex = printer.duplexMode
 
158
                            }
 
159
                        }
 
160
                    }
 
161
 
 
162
                    ListItems.ValueSelector {
 
163
                        anchors {
 
164
                            left: parent.left
 
165
                            right: parent.right
 
166
                        }
 
167
                        text: "Page size"
 
168
                        values: printer.supportedPageSizes
 
169
                        onSelectedIndexChanged: printer.pageSize = selectedIndex
 
170
                        Component.onCompleted: selectedIndex = printer.supportedPageSizes.indexOf(printer.pageSize)
 
171
                    }
 
172
 
 
173
                    ListItems.ValueSelector {
 
174
                        anchors {
 
175
                            left: parent.left
 
176
                            right: parent.right
 
177
                        }
 
178
                        visible: printer.supportedColorModels.length
 
179
                        text: "Color model"
 
180
                        values: printer.supportedColorModels
 
181
                        enabled: values.length > 1
 
182
                        onSelectedIndexChanged: printer.colorModel = selectedIndex
 
183
                        Component.onCompleted: {
 
184
                            if (enabled)
 
185
                                selectedIndex = printer.colorModel
 
186
                        }
 
187
                    }
 
188
 
 
189
                    ListItems.ValueSelector {
 
190
                        anchors {
 
191
                            left: parent.left
 
192
                            right: parent.right
 
193
                        }
 
194
                        visible: printer.supportedPrintQualities.length
 
195
                        text: "Quality"
 
196
                        values: printer.supportedPrintQualities
 
197
                        enabled: values.length > 1
 
198
                        onSelectedIndexChanged: printer.printQuality = selectedIndex
 
199
                        Component.onCompleted: {
 
200
                            if (enabled)
 
201
                                selectedIndex = printer.printQuality
 
202
                        }
 
203
                    }
 
204
                }
 
205
            }
 
206
        }
 
207
    }
 
208
 
 
209
    Component {
 
210
        id: jobPage
 
211
        Page {
 
212
            property var printer
 
213
            header: PageHeader {
 
214
                id: jobPageHeader
 
215
                title: "%1 (%2 jobs)".arg(printer.name).arg(jobList.count)
 
216
                flickable: jobList
 
217
            }
 
218
 
 
219
            ListView {
 
220
                id: jobList
 
221
                anchors.fill: parent
 
222
                model: printer.jobs
 
223
                delegate: ListItem {
 
224
                    height: jobLayout.height + (divider.visible ? divider.height : 0)
 
225
                    ListItemLayout {
 
226
                        id: jobLayout
 
227
                        title.text: displayName
 
228
 
 
229
                        Icon {
 
230
                            id: icon
 
231
                            width: height
 
232
                            height: units.gu(2.5)
 
233
                            name: "stock_document"
 
234
                            SlotsLayout.position: SlotsLayout.First
 
235
                        }
 
236
                    }
 
237
                }
 
238
            }
 
239
        }
 
240
    }
 
241
 
 
242
 
 
243
    Component {
 
244
        id: allJobsPage
 
245
        Page {
 
246
            header: PageHeader {
 
247
                id: allJobsHeader
 
248
                title: "Printer jobs"
 
249
                flickable: jobsList
 
250
            }
 
251
 
 
252
            ListView {
 
253
                id: jobsList
 
254
                anchors.fill: parent
 
255
                model: Printers.printJobs
 
256
                delegate: ListItem {
 
257
                    height: jobsLayout.height + (divider.visible ? divider.height : 0)
 
258
                    ListItemLayout {
 
259
                        id: jobsLayout
 
260
                        title.text: displayName
 
261
 
 
262
                        Icon {
 
263
                            id: icon
 
264
                            width: height
 
265
                            height: units.gu(2.5)
 
266
                            name: "stock_document"
 
267
                            SlotsLayout.position: SlotsLayout.First
 
268
                        }
 
269
                    }
 
270
                }
 
271
            }
 
272
        }
 
273
    }
 
274
 
 
275
 
 
276
    PageStack {
 
277
        id: pageStack
 
278
 
 
279
        Component.onCompleted: push(printersPage)
 
280
 
 
281
        Page {
 
282
            id: printersPage
 
283
            header: PageHeader {
 
284
                title: "Printers"
 
285
                flickable: printerList
 
286
                trailingActionBar {
 
287
                    actions: [
 
288
                        Action {
 
289
                            iconName: "add"
 
290
                            text: "Add printer"
 
291
                            onTriggered: pageStack.push(addPrinterPageComponent)
 
292
                        },
 
293
                        Action {
 
294
                            iconName: "document-print"
 
295
                            text: "Printer jobs"
 
296
                            onTriggered: pageStack.push(allJobsPage)
 
297
                        }
 
298
                    ]
 
299
                }
 
300
            }
 
301
            visible: false
 
302
 
 
303
            ListView {
 
304
                id: printerList
 
305
                anchors { fill: parent }
 
306
                model: Printers.allPrintersWithPdf
 
307
                delegate: ListItem {
 
308
                    height: modelLayout.height + (divider.visible ? divider.height : 0)
 
309
                    trailingActions: ListItemActions {
 
310
                        actions: [
 
311
                            Action {
 
312
                                iconName: "delete"
 
313
                                onTriggered: {
 
314
                                    if (!Printers.removePrinter(model.name)) {
 
315
                                        console.error('failed to remove printer', Printers.lastMessage);
 
316
                                    }
 
317
                                }
 
318
                            },
 
319
                            Action {
 
320
                                iconName: model.default ? "starred" : "non-starred"
 
321
                                enabled: !model.default
 
322
                                onTriggered: Printers.defaultPrinterName = model.name
 
323
                            }
 
324
 
 
325
                        ]
 
326
                    }
 
327
                    ListItemLayout {
 
328
                        id: modelLayout
 
329
                        title.text: displayName
 
330
                        title.font.bold: model.default
 
331
 
 
332
                        Icon {
 
333
                            id: icon
 
334
                            width: height
 
335
                            height: units.gu(2.5)
 
336
                            name: "printer-symbolic"
 
337
                            SlotsLayout.position: SlotsLayout.First
 
338
                        }
 
339
 
 
340
                        ProgressionSlot {}
 
341
                    }
 
342
                    onClicked: pageStack.push(printerPage, { printer: model })
 
343
                }
 
344
            }
 
345
        }
 
346
    }
 
347
 
 
348
    Component {
 
349
        id: addPrinterPageComponent
 
350
        Page {
 
351
            id: addPrinterPage
 
352
            states: [
 
353
                State {
 
354
                    name: "success"
 
355
                    PropertyChanges {
 
356
                        target: okAction
 
357
                        enabled: false
 
358
                    }
 
359
                    PropertyChanges {
 
360
                        target: closeAction
 
361
                        enabled: false
 
362
                    }
 
363
                    PropertyChanges {
 
364
                        target: addPrinterCol
 
365
                        enabled: false
 
366
                    }
 
367
                    StateChangeScript {
 
368
                        script: okTimer.start()
 
369
                    }
 
370
                },
 
371
                State {
 
372
                    name: "failure"
 
373
                    PropertyChanges {
 
374
                        target: errorMessageContainer
 
375
                        visible: true
 
376
                    }
 
377
                }
 
378
            ]
 
379
            header: PageHeader {
 
380
                title: "Add printer"
 
381
                flickable: addPrinterFlickable
 
382
                leadingActionBar.actions: [
 
383
                    Action {
 
384
                        id: closeAction
 
385
                        iconName: "close"
 
386
                        text: "Abort"
 
387
                        onTriggered: pageStack.pop()
 
388
                    }
 
389
                ]
 
390
                trailingActionBar {
 
391
                    actions: [
 
392
                        Action {
 
393
                            id: okAction
 
394
                            iconName: "ok"
 
395
                            text: "Complete"
 
396
                            onTriggered: {
 
397
                                var ret;
 
398
                                if (driverSelector.selectedIndex == 0) {
 
399
                                    ret = Printers.addPrinter(
 
400
                                        printerName.text,
 
401
                                        driversView.selectedDriver,
 
402
                                        printerUri.text,
 
403
                                        printerDescription.text,
 
404
                                        printerLocation.text
 
405
                                    );
 
406
                                } else {
 
407
                                    ret = Printers.addPrinterWithPpdFile(
 
408
                                        printerName.text,
 
409
                                        printerPpd.text,
 
410
                                        printerUri.text,
 
411
                                        printerDescription.text,
 
412
                                        printerLocation.text
 
413
                                    );
 
414
                                }
 
415
                                if (ret) {
 
416
                                    addPrinterPage.state = "success"
 
417
                                } else {
 
418
                                    errorMessage.text = Printers.lastMessage;
 
419
                                    addPrinterPage.state = "failure"
 
420
                                }
 
421
                            }
 
422
                        }
 
423
                    ]
 
424
                }
 
425
            }
 
426
 
 
427
            Component.onCompleted: {
 
428
                Printers.prepareToAddPrinter();
 
429
            }
 
430
 
 
431
            Timer {
 
432
                id: okTimer
 
433
                interval: 2000
 
434
                onTriggered: pageStack.pop();
 
435
            }
 
436
 
 
437
            Flickable {
 
438
                id: addPrinterFlickable
 
439
                anchors.fill: parent
 
440
 
 
441
                Column {
 
442
                    id: addPrinterCol
 
443
                    property bool enabled: true
 
444
                    anchors {
 
445
                        left: parent.left
 
446
                        right: parent.right
 
447
                    }
 
448
 
 
449
                    Item {
 
450
                        id: errorMessageContainer
 
451
                        visible: false
 
452
                        anchors {
 
453
                            left: parent.left
 
454
                            right: parent.right
 
455
                            margins: units.gu(2)
 
456
                        }
 
457
                        height: units.gu(6)
 
458
                        Label {
 
459
                            id: errorMessage
 
460
                            anchors {
 
461
                                top: parent.top
 
462
                                topMargin: units.gu(2)
 
463
                                horizontalCenter: parent.horizontalCenter
 
464
                            }
 
465
                        }
 
466
 
 
467
                    }
 
468
 
 
469
                    ListItems.Standard {
 
470
                        text: "Device URI"
 
471
                        control: TextField {
 
472
                            id: printerUri
 
473
                            placeholderText: "ipp://server.local/my-queue"
 
474
                        }
 
475
                        enabled: parent.enabled
 
476
                    }
 
477
 
 
478
                    ListItems.ValueSelector {
 
479
                        id: driverSelector
 
480
                        anchors {
 
481
                            left: parent.left
 
482
                            right: parent.right
 
483
                        }
 
484
                        text: "Choose driver"
 
485
                        values: [
 
486
                            "Select printer from database",
 
487
                            "Provide PPD file"
 
488
                        ]
 
489
                        enabled: parent.enabled
 
490
                    }
 
491
 
 
492
                    ListItems.Standard {
 
493
                        anchors {
 
494
                            left: parent.left
 
495
                            right: parent.right
 
496
                        }
 
497
                        text: "Filter drivers"
 
498
                        control: TextField {
 
499
                            id: driverFilter
 
500
                            onTextChanged: Printers.driverFilter = text
 
501
                        }
 
502
                        visible: driverSelector.selectedIndex == 0
 
503
                        enabled: parent.enabled
 
504
                    }
 
505
 
 
506
                    ListView {
 
507
                        id: driversView
 
508
                        property string selectedDriver
 
509
                        property bool loading: true
 
510
                        visible: driverSelector.selectedIndex == 0
 
511
                        model: Printers.drivers
 
512
                        anchors { left: parent.left; right: parent.right }
 
513
                        height: units.gu(30)
 
514
                        clip: true
 
515
                        enabled: parent.enabled
 
516
                        highlightFollowsCurrentItem: false
 
517
                        highlight: Rectangle {
 
518
                            z: 0
 
519
                            y: driversView.currentItem.y
 
520
                            width: driversView.currentItem.width
 
521
                            height: driversView.currentItem.height
 
522
                            color: theme.palette.selected.background
 
523
                        }
 
524
                        delegate: ListItem {
 
525
                            height: driverLayout.height + (divider.visible ? divider.height : 0)
 
526
                            ListItemLayout {
 
527
                                id: driverLayout
 
528
                                title.text: displayName
 
529
                                subtitle.text: name
 
530
                                summary.text: deviceId
 
531
                            }
 
532
                            onClicked: {
 
533
                                driversView.selectedDriver = name
 
534
                                driversView.currentIndex = index
 
535
                            }
 
536
                        }
 
537
 
 
538
                        ActivityIndicator {
 
539
                            anchors.centerIn: parent
 
540
                            running: parent.loading
 
541
                        }
 
542
 
 
543
                        Connections {
 
544
                            target: driversView
 
545
                            onCountChanged: {
 
546
                                target = null;
 
547
                                driversView.loading = false;
 
548
                            }
 
549
                        }
 
550
                    }
 
551
 
 
552
                    ListItems.Standard {
 
553
                        text: "PPD File"
 
554
                        visible: driverSelector.selectedIndex == 1
 
555
                        control: TextField {
 
556
                            id: printerPpd
 
557
                            placeholderText: "/usr/share/cups/foo.ppd"
 
558
                        }
 
559
                        enabled: parent.enabled
 
560
                    }
 
561
 
 
562
                    ListItems.Standard {
 
563
                        anchors {
 
564
                            left: parent.left
 
565
                            right: parent.right
 
566
                        }
 
567
                        text: "Printer name"
 
568
                        control: TextField {
 
569
                            id: printerName
 
570
                            placeholderText: "laserjet"
 
571
                        }
 
572
                        enabled: parent.enabled
 
573
                    }
 
574
 
 
575
                    ListItems.Standard {
 
576
                        anchors {
 
577
                            left: parent.left
 
578
                            right: parent.right
 
579
                        }
 
580
                        text: "Description (optional)"
 
581
                        control: TextField {
 
582
                            id: printerDescription
 
583
                            placeholderText: "HP Laserjet with Duplexer"
 
584
                        }
 
585
                        enabled: parent.enabled
 
586
                    }
 
587
 
 
588
                    ListItems.Standard {
 
589
                        anchors {
 
590
                            left: parent.left
 
591
                            right: parent.right
 
592
                        }
 
593
                        text: "Location (optional)"
 
594
                        control: TextField {
 
595
                            id: printerLocation
 
596
                            placeholderText: "Lab 1"
 
597
                        }
 
598
                        enabled: parent.enabled
 
599
                    }
 
600
                }
 
601
            }
 
602
        }
 
603
    }
 
604
}