Add generic templates (#307)
- Add generic full-page templates. (This feature from 3.4 was missing)
- Also add generic half-page, quarter-page, and envelope templates.
- Add several more common envelope sizes to page-sizes.xml
- Qt print backend does not need pwg_size.
- Replace with pwg_class, to distinguish between ISO and NA sizes
This commit is contained in:
@@ -31,6 +31,7 @@ set (Model_sources
|
||||
FramePath.cpp
|
||||
FrameRect.cpp
|
||||
FrameRound.cpp
|
||||
GenericTemplate.cpp
|
||||
Handle.cpp
|
||||
Layout.cpp
|
||||
Markup.cpp
|
||||
|
||||
+27
-5
@@ -24,6 +24,7 @@
|
||||
#include "Config.hpp"
|
||||
#include "StrUtil.hpp"
|
||||
#include "FileUtil.hpp"
|
||||
#include "GenericTemplate.hpp"
|
||||
#include "Settings.hpp"
|
||||
#include "XmlCategoryParser.hpp"
|
||||
#include "XmlPaperParser.hpp"
|
||||
@@ -87,6 +88,7 @@ namespace glabels::model
|
||||
readCategories();
|
||||
readVendors();
|
||||
readTemplates();
|
||||
createGenericTemplates();
|
||||
}
|
||||
|
||||
|
||||
@@ -470,11 +472,12 @@ namespace glabels::model
|
||||
for ( auto& paper : mPapers )
|
||||
{
|
||||
qDebug() << "paper "
|
||||
<< "id=" << paper.id() << ", "
|
||||
<< "name=" << paper.name() << ", "
|
||||
<< "width=" << paper.width().pt() << "pts, "
|
||||
<< "height=" << paper.height().pt() << "pts, "
|
||||
<< "pwg_size=" << paper.pwgSize();
|
||||
<< "id=" << paper.id() << ", "
|
||||
<< "name=" << paper.name() << ", "
|
||||
<< "width=" << paper.width().pt() << "pts, "
|
||||
<< "height=" << paper.height().pt() << "pts, "
|
||||
<< "pwg_class=" << paper.pwgClass()
|
||||
<< "type=" << paper.type();
|
||||
}
|
||||
|
||||
qDebug();
|
||||
@@ -697,6 +700,25 @@ namespace glabels::model
|
||||
}
|
||||
|
||||
|
||||
void Db::createGenericTemplates()
|
||||
{
|
||||
for ( auto& paper : papers() )
|
||||
{
|
||||
if ( paper.type() == Paper::SHEET )
|
||||
{
|
||||
registerTemplate( GenericTemplate::fullPage( paper ) );
|
||||
registerTemplate( GenericTemplate::halfPage1x2( paper ) );
|
||||
registerTemplate( GenericTemplate::halfPage2x1( paper ) );
|
||||
registerTemplate( GenericTemplate::quarterPage2x2( paper ) );
|
||||
}
|
||||
else if ( paper.type() == Paper::ENVELOPE )
|
||||
{
|
||||
registerTemplate( GenericTemplate::envelope( paper ) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Db::readUserTemplatesFromDir( const QDir& dir )
|
||||
{
|
||||
QStringList filters;
|
||||
|
||||
@@ -114,6 +114,8 @@ namespace glabels::model
|
||||
static void readTemplatesFromDir( const QDir& dir );
|
||||
static void registerTemplate( const Template& tmplate );
|
||||
|
||||
static void createGenericTemplates();
|
||||
|
||||
static void readUserTemplatesFromDir( const QDir& dir );
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,134 @@
|
||||
// GenericTemplate.cpp
|
||||
//
|
||||
// Copyright (C) 2026 Jaye Evins <evins@snaught.com>
|
||||
//
|
||||
// This file is part of gLabels-qt.
|
||||
//
|
||||
// gLabels-qt is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// gLabels-qt is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
|
||||
#include "GenericTemplate.hpp"
|
||||
|
||||
#include "FrameRect.hpp"
|
||||
|
||||
#include <QDebug>
|
||||
|
||||
|
||||
namespace glabels::model
|
||||
{
|
||||
|
||||
|
||||
Template GenericTemplate::fullPage( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 1, 1, QString( tr( "%1 full-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::halfPage1x2( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 1, 2, QString( tr( "%1 half-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::halfPage2x1( const Paper& paper )
|
||||
{
|
||||
return sheetTemplate( paper, 2, 1, QString( tr( "%1 half-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::quarterPage2x2( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = page size. (e.g. A4)
|
||||
return sheetTemplate( paper, 2, 2, QString( tr( "%1 quarter-page labels" ) ).arg( paper.name() ) );
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::envelope( const Paper& paper )
|
||||
{
|
||||
// TRANSLATORS
|
||||
//: %1 = envelope size. (e.g. DL)
|
||||
QString description = QString( tr( "%1 envelope" ) ).arg( paper.name() );
|
||||
|
||||
Template tmplate( tr("Generic"),
|
||||
paper.id() + "-ENV",
|
||||
description,
|
||||
paper.id(),
|
||||
paper.width(),
|
||||
paper.height() );
|
||||
|
||||
FrameRect frame( paper.width(),
|
||||
paper.height(),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
Layout layout( 1,
|
||||
1,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
frame.addLayout( layout );
|
||||
tmplate.addFrame( frame );
|
||||
|
||||
tmplate.addCategory( "mail" );
|
||||
|
||||
return tmplate;
|
||||
}
|
||||
|
||||
|
||||
Template GenericTemplate::sheetTemplate( const Paper& paper,
|
||||
int nx,
|
||||
int ny,
|
||||
const QString& description )
|
||||
{
|
||||
Template tmplate( tr("Generic"),
|
||||
QString( "%1-%2x%3" ).arg(paper.id()).arg(nx).arg(ny),
|
||||
description,
|
||||
paper.id(),
|
||||
paper.width(),
|
||||
paper.height() );
|
||||
|
||||
FrameRect frame( paper.width()/nx,
|
||||
paper.height()/ny,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ) );
|
||||
|
||||
Layout layout( nx,
|
||||
ny,
|
||||
Distance::pt( 0 ),
|
||||
Distance::pt( 0 ),
|
||||
paper.width()/nx,
|
||||
paper.height()/ny );
|
||||
|
||||
frame.addLayout( layout );
|
||||
tmplate.addFrame( frame );
|
||||
|
||||
tmplate.addCategory( "label" );
|
||||
tmplate.addCategory( "rectangle-label" );
|
||||
tmplate.addCategory( "card" );
|
||||
|
||||
return tmplate;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// GenericTemplate.hpp
|
||||
//
|
||||
// Copyright (C) 2026 Jaye Evins <evins@snaught.com>
|
||||
//
|
||||
// This file is part of gLabels-qt.
|
||||
//
|
||||
// gLabels-qt is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// gLabels-qt is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with gLabels-qt. If not, see <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
#ifndef model_GenericTemplate_hpp
|
||||
#define model_GenericTemplate_hpp
|
||||
|
||||
|
||||
#include "Template.hpp"
|
||||
#include "Paper.hpp"
|
||||
|
||||
#include <QCoreApplication>
|
||||
|
||||
|
||||
namespace glabels::model
|
||||
{
|
||||
|
||||
class GenericTemplate
|
||||
{
|
||||
Q_DECLARE_TR_FUNCTIONS(GenericTemplate)
|
||||
|
||||
public:
|
||||
GenericTemplate() = delete;
|
||||
|
||||
static Template fullPage( const Paper& paper );
|
||||
static Template halfPage1x2( const Paper& paper );
|
||||
static Template halfPage2x1( const Paper& paper );
|
||||
static Template quarterPage2x2( const Paper& paper );
|
||||
|
||||
static Template envelope( const Paper& paper );
|
||||
|
||||
|
||||
private:
|
||||
static Template sheetTemplate( const Paper& paper,
|
||||
int nx,
|
||||
int ny,
|
||||
const QString& description );
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
|
||||
#endif // model_GenericTemplate_hpp
|
||||
+14
-6
@@ -29,12 +29,14 @@ namespace glabels::model
|
||||
const QString& name,
|
||||
Distance width,
|
||||
Distance height,
|
||||
const QString& pwgSize )
|
||||
const QString& pwgClass,
|
||||
Type type )
|
||||
: mId(id),
|
||||
mName(name),
|
||||
mWidth(width),
|
||||
mHeight(height),
|
||||
mPwgSize(pwgSize)
|
||||
mPwgClass(pwgClass),
|
||||
mType(type)
|
||||
{
|
||||
// empty
|
||||
}
|
||||
@@ -64,21 +66,27 @@ namespace glabels::model
|
||||
}
|
||||
|
||||
|
||||
QString Paper::pwgSize() const
|
||||
QString Paper::pwgClass() const
|
||||
{
|
||||
return mPwgSize;
|
||||
return mPwgClass;
|
||||
}
|
||||
|
||||
|
||||
Paper::Type Paper::type() const
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
|
||||
bool Paper::isSizeIso() const
|
||||
{
|
||||
return mPwgSize.startsWith( "iso_" );
|
||||
return mPwgClass == "iso";
|
||||
}
|
||||
|
||||
|
||||
bool Paper::isSizeUs() const
|
||||
{
|
||||
return mPwgSize.startsWith( "na_" );
|
||||
return mPwgClass == "na";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+19
-4
@@ -32,13 +32,23 @@ namespace glabels::model
|
||||
|
||||
class Paper
|
||||
{
|
||||
public:
|
||||
enum Type
|
||||
{
|
||||
SHEET,
|
||||
ENVELOPE,
|
||||
ROLL
|
||||
};
|
||||
|
||||
|
||||
public:
|
||||
Paper() = default;
|
||||
Paper( const QString& id,
|
||||
const QString& name,
|
||||
Distance width,
|
||||
Distance height,
|
||||
const QString& pwgSize );
|
||||
const QString& pwgClass,
|
||||
Type type = SHEET );
|
||||
~Paper() = default;
|
||||
|
||||
QString id() const;
|
||||
@@ -50,18 +60,23 @@ namespace glabels::model
|
||||
/* Height */
|
||||
Distance height() const;
|
||||
|
||||
/* PWG 5101.1-2002 size name */
|
||||
QString pwgSize() const;
|
||||
/* PWG 5101.1-2023 class */
|
||||
QString pwgClass() const;
|
||||
|
||||
Type type() const;
|
||||
|
||||
bool isSizeIso() const;
|
||||
bool isSizeUs() const;
|
||||
|
||||
|
||||
private:
|
||||
QString mId;
|
||||
QString mName;
|
||||
Distance mWidth;
|
||||
Distance mHeight;
|
||||
QString mPwgSize;
|
||||
QString mPwgClass;
|
||||
Type mType;
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -99,9 +99,25 @@ namespace glabels::model
|
||||
Distance width = XmlUtil::getLengthAttr( node, "width", Distance(0) );
|
||||
Distance height = XmlUtil::getLengthAttr( node, "height", Distance(0) );
|
||||
|
||||
QString pwgSize = XmlUtil::getStringAttr( node, "pwg_size", "" );
|
||||
QString pwgClass = XmlUtil::getStringAttr( node, "pwg_class", "iso" );
|
||||
|
||||
return Paper( id, name, width, height, pwgSize );
|
||||
Paper::Type type;
|
||||
QString typeString = XmlUtil::getStringAttr( node, "type", "sheet" );
|
||||
if ( typeString == "sheet" )
|
||||
{
|
||||
type = Paper::SHEET;
|
||||
}
|
||||
else if ( typeString == "envelope" )
|
||||
{
|
||||
type = Paper::ENVELOPE;
|
||||
}
|
||||
else
|
||||
{
|
||||
qWarning() << "Warning: unknown paper type: " << typeString << ".";
|
||||
type = Paper::SHEET;
|
||||
}
|
||||
|
||||
return Paper( id, name, width, height, pwgClass, type );
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user