Browse Source

Allow printing directly to a non-default printer and convenience selector.

Neal Wilson 6 years ago
parent
commit
e8a8948115
4 changed files with 114 additions and 13 deletions
  1. 4
    2
      src/Typica.pro
  2. 87
    0
      src/printerselector.w
  3. 2
    0
      src/typica.w
  4. 21
    11
      src/webview.w

+ 4
- 2
src/Typica.pro View File

26
     scale.h \
26
     scale.h \
27
     draglabel.h \
27
     draglabel.h \
28
     daterangeselector.h \
28
     daterangeselector.h \
29
-    licensewindow.h
29
+    licensewindow.h \
30
+    printerselector.h
30
 SOURCES += typica.cpp \
31
 SOURCES += typica.cpp \
31
     helpmenu.cpp \
32
     helpmenu.cpp \
32
     abouttypica.cpp \
33
     abouttypica.cpp \
36
     scale.cpp \
37
     scale.cpp \
37
     draglabel.cpp \
38
     draglabel.cpp \
38
     daterangeselector.cpp \
39
     daterangeselector.cpp \
39
-    licensewindow.cpp
40
+    licensewindow.cpp \
41
+    printerselector.cpp
40
 
42
 
41
 RESOURCES += \
43
 RESOURCES += \
42
     resources.qrc
44
     resources.qrc

+ 87
- 0
src/printerselector.w View File

1
+@* Saved Printers.
2
+
3
+\noindent In most cases it's best to handle printing in a way that is common
4
+across many applications. Put a Print menu option in a File menu, bring up the
5
+platform's standard print dialog, and allow people to take full advantage of
6
+the flexibility this provides.
7
+
8
+In more specialized use cases, however, it may make more sense to provide
9
+faster access to a printer that might not be the default printer for that
10
+computer. The first use in Typica where this makes sense is in printing tags
11
+that can follow the coffee and uniquely identify that batch. Using a full sheet
12
+of paper for this might be excessive and time consuming. Instead, it might make
13
+sense to get a small, inexpensive thermal receipt printer to keep at the
14
+roaster. If this were not the default printer, it would quickly become tedious
15
+to bring up the print dialog and change the selected printer after every batch.
16
+
17
+In cases like this, it would be better to provide a combo box in the window
18
+where a printer can be selected and remembered as the default printer just for
19
+that particular use, and allowing people to print directly to that printer
20
+without going through extra steps.
21
+
22
+@(printerselector.h@>=
23
+#include <QPrinterInfo>
24
+#include <QComboBox>
25
+
26
+#ifndef TypicaPrinterSelectorHeader
27
+#define TypicaPrinterSelectorHeader
28
+
29
+class PrinterSelector : public QComboBox@/
30
+{
31
+	@[Q_OBJECT@]@;
32
+	public:
33
+		PrinterSelector();
34
+};
35
+
36
+#endif
37
+
38
+@ The main file also requires this header.
39
+
40
+@<Header files to include@>=
41
+#include "printerselector.h"
42
+
43
+@ Implementation of this class is in a separate file.
44
+
45
+@(printerselector.cpp@>=
46
+#include "printerselector.h"
47
+
48
+@<PrinterSelector implementation@>@;
49
+
50
+@ The constructor looks at the list of available printers and populates itself
51
+with these.
52
+
53
+@<PrinterSelector implementation@>=
54
+PrinterSelector::PrinterSelector() : QComboBox(NULL)
55
+{
56
+	QList<QPrinterInfo> printers = QPrinterInfo::availablePrinters();
57
+	foreach(QPrinterInfo info, printers)
58
+	{
59
+		addItem(info.printerName());
60
+	}
61
+}
62
+
63
+@ The host environment is informed of this class in the usual way starting with
64
+a constructor function prototype.
65
+
66
+@<Function prototypes for scripting@>=
67
+QScriptValue constructPrinterSelector(QScriptContext *context,
68
+                                      QScriptEngine *engine);
69
+
70
+@ The engine is informed of this function.
71
+
72
+@<Set up the scripting engine@>=
73
+constructor = engine->newFunction(constructPrinterSelector);
74
+engine->globalObject().setProperty("PrinterSelector", constructor);
75
+
76
+@ There is nothing special about the constructor. If there were additional
77
+properties needed beyond those supplied by |setQComboBoxProperties()| it would
78
+make sense to add another function to the chain for setting script value
79
+properties.
80
+
81
+@<Functions for scripting@>=
82
+QScriptValue constructPrinterSelector(QScriptContext *, QScriptEngine *engine)
83
+{
84
+	QScriptValue object = engine->newQObject(new PrinterSelector);
85
+	setQComboBoxProperties(object, engine);
86
+	return object;
87
+}

+ 2
- 0
src/typica.w View File

12752
 
12752
 
12753
 @i webview.w
12753
 @i webview.w
12754
 
12754
 
12755
+@i printerselector.w
12756
+
12755
 @* The Application class.
12757
 @* The Application class.
12756
 
12758
 
12757
 The |Application| class represents the \pn{} program. It is responsible for
12759
 The |Application| class represents the \pn{} program. It is responsible for

+ 21
- 11
src/webview.w View File

31
 	public:@/
31
 	public:@/
32
 		TypicaWebView();
32
 		TypicaWebView();
33
 		@[Q_INVOKABLE@,@, void@]@, load(const QString &url);@t\2\2@>@/
33
 		@[Q_INVOKABLE@,@, void@]@, load(const QString &url);@t\2\2@>@/
34
-		@[Q_INVOKABLE@,@, void@]@, print();@t\2\2@>@/
34
+		@[Q_INVOKABLE@,@, void@]@, print(const QString &printerName = QString());@t\2\2@>@/
35
 		@[Q_INVOKABLE@,@, void@]@, setHtml(const QString &html, const QUrl &baseUrl = QUrl());@t\2\2@>@/
35
 		@[Q_INVOKABLE@,@, void@]@, setHtml(const QString &html, const QUrl &baseUrl = QUrl());@t\2\2@>@/
36
 		@[Q_INVOKABLE@,@, void@]@, setContent(QIODevice *device);@t\2\2@>@/
36
 		@[Q_INVOKABLE@,@, void@]@, setContent(QIODevice *device);@t\2\2@>@/
37
 		@[Q_INVOKABLE@,@, QString@]@, saveXml();@t\2\2@>@/
37
 		@[Q_INVOKABLE@,@, QString@]@, saveXml();@t\2\2@>@/
115
 	QWebView::load(QUrl(url));
115
 	QWebView::load(QUrl(url));
116
 }
116
 }
117
 
117
 
118
-void TypicaWebView::print()
119
-{
120
-	QPrinter *printer = new QPrinter(QPrinter::HighResolution);
121
-	QPrintDialog printDialog(printer, NULL);
122
-	if(printDialog.exec() == QDialog::Accepted)
123
-	{
124
-		QWebView::print(printer);
125
-	}
126
-}
127
-
128
 void TypicaWebView::setHtml(const QString &html, const QUrl &baseUrl)
118
 void TypicaWebView::setHtml(const QString &html, const QUrl &baseUrl)
129
 {
119
 {
130
 	QWebView::setHtml(html, baseUrl);
120
 	QWebView::setHtml(html, baseUrl);
144
 	return page()->currentFrame()->documentElement().toOuterXml();
134
 	return page()->currentFrame()->documentElement().toOuterXml();
145
 }
135
 }
146
 
136
 
137
+@ Print functionality has been extended to allow an optional argument. If the
138
+name of a printer is passed in, the print dialog will be bypassed.
139
+
140
+@<TypicaWebView implementation@>=
141
+void TypicaWebView::print(const QString &printerName)
142
+{
143
+	QPrinter *printer = new QPrinter(QPrinter::HighResolution);
144
+	if(!printerName.isEmpty())
145
+	{
146
+		printer->setPrinterName(printerName);
147
+		QWebView::print(printer);
148
+		return;
149
+	}
150
+	QPrintDialog printDialog(printer, NULL);
151
+	if(printDialog.exec() == QDialog::Accepted)
152
+	{
153
+		QWebView::print(printer);
154
+	}
155
+}
156
+
147
 @ Web views are exposed to the host environment in the usual manner.
157
 @ Web views are exposed to the host environment in the usual manner.
148
 
158
 
149
 @<Set up the scripting engine@>=
159
 @<Set up the scripting engine@>=

Loading…
Cancel
Save