Add advanced page ranges (list of ranges)

This commit is contained in:
Anton Thomasson 2022-08-13 16:30:13 +02:00
parent 3abd1e103f
commit 53ca370f92
15 changed files with 166 additions and 14 deletions

View file

@ -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 \

@ -1 +1 @@
Subproject commit 89cfaa0b424310f54355ee2415d3bee9ed786255
Subproject commit fafcd9d21d646ee633cae38265a7f899902c8e33

View file

@ -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;
})
}
}
}

View file

@ -120,6 +120,7 @@ Page {
property var pdfpages: ConvertChecker.pdfPages(selectedFile)
high: pdfpages == 0 ? 65535 : pdfpages
acceptRangeList: true
}
ChoiceSetting {
tag: IppMsg.Integer

View file

@ -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");

View file

@ -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
View 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
View 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

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -530,6 +530,10 @@
<source>all</source>
<translation></translation>
</message>
<message>
<source>Advanced</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>Setting</name>

View file

@ -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>