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:
Jaye Evins
2026-02-11 11:27:41 -05:00
committed by GitHub
parent 993e1e460d
commit e6673a0a24
15 changed files with 369 additions and 67 deletions
+1
View File
@@ -31,6 +31,7 @@ set (Model_sources
FramePath.cpp
FrameRect.cpp
FrameRound.cpp
GenericTemplate.cpp
Handle.cpp
Layout.cpp
Markup.cpp
+27 -5
View File
@@ -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;
+2
View File
@@ -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 );
+134
View File
@@ -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;
}
}
+59
View File
@@ -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
View File
@@ -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
View File
@@ -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;
};
}
+18 -2
View File
@@ -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 );
}