diff --git a/glabels/TemplatePicker.cpp b/glabels/TemplatePicker.cpp index 7faa9b46..2a96892c 100644 --- a/glabels/TemplatePicker.cpp +++ b/glabels/TemplatePicker.cpp @@ -207,6 +207,7 @@ namespace glabels if ( auto* tItem = dynamic_cast( mModel->item( i, 0 ) ) ) { bool nameMask = tItem->tmplate().name().contains( searchString, Qt::CaseInsensitive ); + bool descMask = tItem->tmplate().description().contains( searchString, Qt::CaseInsensitive ); bool sizeMask = (isoMask && tItem->tmplate().isSizeIso()) || @@ -228,7 +229,7 @@ namespace glabels } - if ( nameMask && sizeMask && categoryMask ) + if ( (nameMask||descMask) && sizeMask && categoryMask ) { setRowHidden( i, false ); } diff --git a/model/CMakeLists.txt b/model/CMakeLists.txt index 11c577d7..72f48187 100644 --- a/model/CMakeLists.txt +++ b/model/CMakeLists.txt @@ -31,6 +31,7 @@ set (Model_sources FramePath.cpp FrameRect.cpp FrameRound.cpp + GenericTemplate.cpp Handle.cpp Layout.cpp Markup.cpp diff --git a/model/Db.cpp b/model/Db.cpp index 5c3ede3c..94bc5c16 100644 --- a/model/Db.cpp +++ b/model/Db.cpp @@ -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; diff --git a/model/Db.hpp b/model/Db.hpp index cdff4d09..692833c3 100644 --- a/model/Db.hpp +++ b/model/Db.hpp @@ -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 ); diff --git a/model/GenericTemplate.cpp b/model/GenericTemplate.cpp new file mode 100644 index 00000000..2b005433 --- /dev/null +++ b/model/GenericTemplate.cpp @@ -0,0 +1,134 @@ +// GenericTemplate.cpp +// +// Copyright (C) 2026 Jaye Evins +// +// 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 . +// + + +#include "GenericTemplate.hpp" + +#include "FrameRect.hpp" + +#include + + +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; + } + + +} diff --git a/model/GenericTemplate.hpp b/model/GenericTemplate.hpp new file mode 100644 index 00000000..7da0e0c2 --- /dev/null +++ b/model/GenericTemplate.hpp @@ -0,0 +1,59 @@ +// GenericTemplate.hpp +// +// Copyright (C) 2026 Jaye Evins +// +// 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 . +// + +#ifndef model_GenericTemplate_hpp +#define model_GenericTemplate_hpp + + +#include "Template.hpp" +#include "Paper.hpp" + +#include + + +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 diff --git a/model/Paper.cpp b/model/Paper.cpp index 0293e706..21b855db 100644 --- a/model/Paper.cpp +++ b/model/Paper.cpp @@ -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"; } } diff --git a/model/Paper.hpp b/model/Paper.hpp index 4ce672f5..f6a8e977 100644 --- a/model/Paper.hpp +++ b/model/Paper.hpp @@ -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; + }; } diff --git a/model/XmlPaperParser.cpp b/model/XmlPaperParser.cpp index ba6b54bb..40720fab 100644 --- a/model/XmlPaperParser.cpp +++ b/model/XmlPaperParser.cpp @@ -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 ); } diff --git a/templates/dymo-other-templates.xml b/templates/dymo-other-templates.xml index d06574bc..52075fe3 100644 --- a/templates/dymo-other-templates.xml +++ b/templates/dymo-other-templates.xml @@ -7,8 +7,8 @@ @@ -570,7 +570,7 @@