Add advanced page ranges (list of ranges)
This commit is contained in:
parent
3abd1e103f
commit
53ca370f92
15 changed files with 166 additions and 14 deletions
|
@ -34,6 +34,7 @@ DEFINES += PDF_CREATOR='\\"SeaPrint\ $$VERSION\\"'
|
|||
DEFINES += SEAPRINT_VERSION='\\"$$VERSION\\"'
|
||||
|
||||
SOURCES += src/harbour-seaprint.cpp \
|
||||
src/rangelistchecker.cpp \
|
||||
src/convertchecker.cpp \
|
||||
src/curlrequester.cpp \
|
||||
src/imageitem.cpp \
|
||||
|
@ -51,6 +52,7 @@ SOURCES += src/harbour-seaprint.cpp \
|
|||
|
||||
DISTFILES += qml/harbour-seaprint.qml \
|
||||
qml/components/DependentOn.qml \
|
||||
qml/components/RangeListInputDialog.qml \
|
||||
qml/cover/CoverPage.qml \
|
||||
qml/components/*qml \
|
||||
qml/pages/*.qml \
|
||||
|
@ -81,6 +83,7 @@ TRANSLATIONS += translations/harbour-seaprint-de.ts \
|
|||
translations/harbour-seaprint-pl.ts
|
||||
|
||||
HEADERS += \
|
||||
src/rangelistchecker.h \
|
||||
src/convertchecker.h \
|
||||
src/curlrequester.h \
|
||||
src/imageitem.h \
|
||||
|
|
2
ppm2pwg
2
ppm2pwg
|
@ -1 +1 @@
|
|||
Subproject commit 89cfaa0b424310f54355ee2415d3bee9ed786255
|
||||
Subproject commit fafcd9d21d646ee633cae38265a7f899902c8e33
|
|
@ -5,6 +5,7 @@ Setting {
|
|||
property int high
|
||||
property int choice_low: 1
|
||||
property int choice_high: 0
|
||||
property bool acceptRangeList: false
|
||||
|
||||
property bool suppressChange: false
|
||||
|
||||
|
@ -41,7 +42,7 @@ Setting {
|
|||
}
|
||||
|
||||
onChoiceChanged: {
|
||||
if(choice == undefined)
|
||||
if(choice == undefined || choice.constructor.name !== "Object")
|
||||
{
|
||||
suppressChange = true;
|
||||
low_slider.value = low_slider.minimumValue;
|
||||
|
@ -50,7 +51,39 @@ Setting {
|
|||
}
|
||||
}
|
||||
|
||||
displayValue: choice == undefined ? qsTr("all") : ""+choice.low+" - "+choice.high
|
||||
displayValue: prettify(choice)
|
||||
|
||||
function prettify(choice)
|
||||
{
|
||||
if(choice == undefined)
|
||||
{
|
||||
return qsTr("all");
|
||||
}
|
||||
else if(choice.constructor.name === "Object")
|
||||
{
|
||||
return (""+choice.low+" - "+choice.high)
|
||||
}
|
||||
else
|
||||
{
|
||||
var ret = "";
|
||||
for(var i = 0; i < choice.length; i++)
|
||||
{
|
||||
if(i!=0)
|
||||
{
|
||||
ret = ret+","
|
||||
}
|
||||
if(choice[i].low == choice[i].high)
|
||||
{
|
||||
ret=ret+choice[i].low
|
||||
}
|
||||
else
|
||||
{
|
||||
ret=ret+choice[i].low+"-"+choice[i].high
|
||||
}
|
||||
}
|
||||
return ret
|
||||
}
|
||||
}
|
||||
|
||||
menu: ContextMenu {
|
||||
MenuItem {
|
||||
|
@ -109,6 +142,17 @@ Setting {
|
|||
|
||||
}
|
||||
|
||||
MenuItem {
|
||||
visible: acceptRangeList
|
||||
text: qsTr("Advanced")
|
||||
onClicked: {var dialog = pageStack.push(Qt.resolvedUrl("RangeListInputDialog.qml"),
|
||||
{value: choice, title: prettyName});
|
||||
dialog.accepted.connect(function() {
|
||||
choice = dialog.value;
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -120,6 +120,7 @@ Page {
|
|||
|
||||
property var pdfpages: ConvertChecker.pdfPages(selectedFile)
|
||||
high: pdfpages == 0 ? 65535 : pdfpages
|
||||
acceptRangeList: true
|
||||
}
|
||||
ChoiceSetting {
|
||||
tag: IppMsg.Integer
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include <src/mimer.h>
|
||||
#include <src/convertchecker.h>
|
||||
#include <src/settings.h>
|
||||
#include <src/rangelistchecker.h>
|
||||
|
||||
Q_DECLARE_METATYPE(CURLcode)
|
||||
Q_DECLARE_METATYPE(Bytestream)
|
||||
|
@ -41,7 +42,9 @@ int main(int argc, char *argv[])
|
|||
qmlRegisterSingletonType<IppDiscovery>("seaprint.ippdiscovery", 1, 0, "IppDiscovery", singletontype_provider<IppDiscovery>);
|
||||
qmlRegisterSingletonType<Mimer>("seaprint.mimer", 1, 0, "Mimer", singletontype_provider<Mimer>);
|
||||
qmlRegisterSingletonType<ConvertChecker>("seaprint.convertchecker", 1, 0, "ConvertChecker", singletontype_provider<ConvertChecker>);
|
||||
qmlRegisterSingletonType<ConvertChecker>("seaprint.settings", 1, 0, "SeaPrintSettings", singletontype_provider<Settings>);
|
||||
qmlRegisterSingletonType<Settings>("seaprint.settings", 1, 0, "SeaPrintSettings", singletontype_provider<Settings>);
|
||||
qmlRegisterSingletonType<RangeListChecker>("seaprint.rangelistchecker", 1, 0, "RangeListChecker", singletontype_provider<RangeListChecker>);
|
||||
|
||||
qmlRegisterType<IppPrinter>("seaprint.ippprinter", 1, 0, "IppPrinter");
|
||||
qmlRegisterType<ImageItem>("seaprint.imageitem", 1, 0, "ImageItem");
|
||||
qmlRegisterUncreatableType<IppMsg>("seaprint.ippmsg", 1, 0, "IppMsg", "Only used to supply an enum type");
|
||||
|
|
|
@ -721,21 +721,24 @@ void IppPrinter::print(QJsonObject jobAttrs, QString filename)
|
|||
Params.hwResW = PrinterResolutionRef.toObject()["x"].toInt(Params.hwResW);
|
||||
Params.hwResH = PrinterResolutionRef.toObject()["y"].toInt(Params.hwResH);
|
||||
|
||||
if(jobAttrs.contains("page-ranges"))
|
||||
// Effected locally, unless it is Postscript which we cant't render
|
||||
if(jobAttrs.contains("page-ranges") && mimeType != Mimer::Postscript)
|
||||
{
|
||||
QJsonObject PageRanges = getAttrOrDefault(jobAttrs, "page-ranges").toObject();
|
||||
size_t fromPage = PageRanges["low"].toInt();
|
||||
size_t toPage = PageRanges["high"].toInt();
|
||||
if(fromPage != 0 || toPage != 0)
|
||||
QJsonArray tmp;
|
||||
QJsonValue pageRanges = getAttrOrDefault(jobAttrs, "page-ranges");
|
||||
if(pageRanges.isArray())
|
||||
{
|
||||
Params.pageRangeList = {{fromPage, toPage}};
|
||||
tmp = pageRanges.toArray();
|
||||
}
|
||||
|
||||
// Effected locally, unless it is Postscript which we cant't render
|
||||
if(targetFormat != Mimer::Postscript)
|
||||
else if(pageRanges.isObject())
|
||||
{
|
||||
jobAttrs.remove("page-ranges");
|
||||
tmp = {pageRanges.toObject()};
|
||||
}
|
||||
for(QJsonValueRef ref : tmp)
|
||||
{
|
||||
Params.pageRangeList.push_back({ref.toObject()["low"].toInt(), ref.toObject()["high"].toInt()});
|
||||
}
|
||||
jobAttrs.remove("page-ranges");
|
||||
}
|
||||
|
||||
adjustRasterSettings(filename, mimeType, jobAttrs, Params);
|
||||
|
|
41
src/rangelistchecker.cpp
Normal file
41
src/rangelistchecker.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include "rangelistchecker.h"
|
||||
|
||||
RangeListChecker::RangeListChecker()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
RangeListChecker::~RangeListChecker()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
RangeListChecker* RangeListChecker::m_Instance = 0;
|
||||
|
||||
RangeListChecker* RangeListChecker::instance()
|
||||
{
|
||||
static QMutex mutex;
|
||||
if (!m_Instance)
|
||||
{
|
||||
mutex.lock();
|
||||
|
||||
if (!m_Instance)
|
||||
m_Instance = new RangeListChecker;
|
||||
|
||||
mutex.unlock();
|
||||
}
|
||||
|
||||
return m_Instance;
|
||||
}
|
||||
|
||||
QJsonArray RangeListChecker::parse(QString str) const
|
||||
{
|
||||
PrintParameters params;
|
||||
params.setPageRange(str.toStdString());
|
||||
QJsonArray ret;
|
||||
for(const std::pair<size_t, size_t>& p : params.pageRangeList)
|
||||
{
|
||||
ret.append(QJsonObject {{"low", int(p.first)}, {"high", int(p.second)}});
|
||||
}
|
||||
return ret;
|
||||
}
|
29
src/rangelistchecker.h
Normal file
29
src/rangelistchecker.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
#ifndef RANGELISTCHECKER_H
|
||||
#define RANGELISTCHECKER_H
|
||||
|
||||
#include <QValidator>
|
||||
#include <QMutex>
|
||||
#include <QJsonArray>
|
||||
#include <QJsonObject>
|
||||
|
||||
#include "printparameters.h"
|
||||
|
||||
class RangeListChecker : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static RangeListChecker* instance();
|
||||
|
||||
Q_INVOKABLE QJsonArray parse(QString str) const;
|
||||
|
||||
private:
|
||||
static RangeListChecker* m_Instance;
|
||||
|
||||
RangeListChecker();
|
||||
~RangeListChecker();
|
||||
RangeListChecker(const RangeListChecker &);
|
||||
RangeListChecker& operator=(const RangeListChecker &);
|
||||
|
||||
};
|
||||
|
||||
#endif // RANGELISTCHECKER_H
|
|
@ -531,6 +531,10 @@ auf diesem Drucker</translation>
|
|||
<source>all</source>
|
||||
<translation>Alle</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -530,6 +530,10 @@
|
|||
<source>all</source>
|
||||
<translation>todos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -531,6 +531,10 @@ sur cette imprimante</translation>
|
|||
<source>all</source>
|
||||
<translation>tout</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -530,6 +530,10 @@
|
|||
<source>all</source>
|
||||
<translation>alles</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -530,6 +530,10 @@
|
|||
<source>all</source>
|
||||
<translation>wszystkie</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -530,6 +530,10 @@
|
|||
<source>all</source>
|
||||
<translation>全部</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
|
@ -530,6 +530,10 @@
|
|||
<source>all</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Advanced</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>Setting</name>
|
||||
|
|
Loading…
Reference in a new issue