Merge pull request #495 from ispyisail/feature-folio-template-variables

Folio properties: auto-add a title block's custom variables
This commit is contained in:
Laurent Trinques
2026-06-12 11:47:33 +02:00
committed by GitHub
3 changed files with 72 additions and 22 deletions
+11 -6
View File
@@ -1756,6 +1756,10 @@ QString TitleBlockTemplate::interpreteVariables(
QStringList TitleBlockTemplate::listOfVariables()
{
QStringList list;
// Match every "%{name}" placeholder. The bare "%name" form can't be
// extracted reliably without the variable list, and templates use the
// braced form, so only that is collected here.
static const QRegularExpression rx(QStringLiteral("%\\{([^}]+)\\}"));
// run through each individual cell
for (int j = 0 ; j < rows_heights_.count() ; ++ j) {
for (int i = 0 ; i < columns_width_.count() ; ++ i) {
@@ -1763,14 +1767,15 @@ QStringList TitleBlockTemplate::listOfVariables()
|| cells_[i][j] -> cell_type
== TitleBlockCell::EmptyCell)
continue;
#if TODO_LIST
#pragma message("@TODO not works on all cases...")
#endif
// TODO: not works on all cases...
list << cells_[i][j] -> value.name().replace("%","");
const QString cell_value = cells_[i][j] -> value.name();
auto it = rx.globalMatch(cell_value);
while (it.hasNext()) {
const QString name = it.next().captured(1);
if (!name.isEmpty() && !list.contains(name))
list << name;
}
}
}
qDebug() << list;
return list;
}
+58 -16
View File
@@ -24,6 +24,7 @@
#include "ui_titleblockpropertieswidget.h"
#include <QMenu>
#include <QSet>
#include <utility>
/**
@@ -162,7 +163,11 @@ void TitleBlockPropertiesWidget::setProperties(
}
ui -> m_tbt_cb -> setCurrentIndex(index);
m_dcw -> setContext(properties.context);
// Show the saved custom values, plus any of the template's custom variables
// that aren't defined yet, so the user only fills in the missing ones (#271).
DiagramContext context = properties.context;
addTemplateVariables(context, index);
m_dcw -> setContext(context);
}
/**
@@ -435,12 +440,15 @@ void TitleBlockPropertiesWidget::updateTemplateList()
}
/**
@brief TitleBlockPropertiesWidget::changeCurrentTitleBlockTemplate
Load the additional field of title block "text"
@brief TitleBlockPropertiesWidget::templateForIndex
@param index : index in the collection-type map (= the template combo index)
@return the TitleBlockTemplate currently selected for that collection, or
nullptr.
*/
void TitleBlockPropertiesWidget::changeCurrentTitleBlockTemplate(int index)
TitleBlockTemplate *TitleBlockPropertiesWidget::templateForIndex(int index) const
{
m_dcw -> clear();
if (index < 0 || index >= m_map_index_to_collection_type.count())
return nullptr;
QET::QetCollection qc = m_map_index_to_collection_type.at(index);
TitleBlockTemplatesCollection *collection = nullptr;
@@ -448,21 +456,55 @@ void TitleBlockPropertiesWidget::changeCurrentTitleBlockTemplate(int index)
if (c -> collection() == qc)
collection = c;
if (!collection) return;
if (!collection) return nullptr;
return collection -> getTemplate(ui -> m_tbt_cb -> currentText());
}
// get template
TitleBlockTemplate *tpl = collection -> getTemplate(ui -> m_tbt_cb -> currentText());
if(tpl != nullptr) {
// get all template fields
QStringList fields = tpl -> listOfVariables();
// set fields to additional_fields_ widget
DiagramContext templateContext;
for(int i =0; i<fields.count(); i++)
templateContext.addValue(fields.at(i), "");
m_dcw -> setContext(templateContext);
/**
@brief TitleBlockPropertiesWidget::addTemplateVariables
Add to @p context every CUSTOM variable used by the currently selected
template that is not already present, with an empty value — so the user
only has to fill in the values instead of declaring the variables (#271).
The standard fields (title, author, date, …) are handled by their own
widgets and are skipped. Existing values in @p context are preserved.
*/
void TitleBlockPropertiesWidget::addTemplateVariables(
DiagramContext &context, int index) const
{
TitleBlockTemplate *tpl = templateForIndex(index);
if (!tpl) return;
// Variables rendered from the dedicated standard-field widgets; they must
// not appear in the "Custom" tab.
static const QSet<QString> reserved {
QStringLiteral("author"), QStringLiteral("date"),
QStringLiteral("title"), QStringLiteral("filename"),
QStringLiteral("plant"), QStringLiteral("locmach"),
QStringLiteral("indexrev"), QStringLiteral("version"),
QStringLiteral("folio"), QStringLiteral("folio-id"),
QStringLiteral("folio-total"), QStringLiteral("auto_page_num"),
QStringLiteral("previous-folio-num"), QStringLiteral("next-folio-num")
};
const QStringList variables = tpl -> listOfVariables();
for (const QString &name : variables) {
if (name.isEmpty() || reserved.contains(name)) continue;
if (!context.contains(name)) context.addValue(name, "");
}
}
/**
@brief TitleBlockPropertiesWidget::changeCurrentTitleBlockTemplate
When the user picks a template, append its missing custom variables to the
"Custom" tab while keeping the values already entered (#271).
*/
void TitleBlockPropertiesWidget::changeCurrentTitleBlockTemplate(int index)
{
DiagramContext context = m_dcw -> context();
addTemplateVariables(context, index);
m_dcw -> setContext(context);
}
/**
@brief TitleBlockPropertiesWidget::on_m_date_now_pb_clicked
Set the date to current date
+3
View File
@@ -30,6 +30,7 @@ class NumerotationContext;
class QETProject;
class QMenu;
class TitleBlockTemplatesCollection;
class TitleBlockTemplate;
namespace Ui {
class TitleBlockPropertiesWidget;
@@ -77,6 +78,8 @@ class TitleBlockPropertiesWidget : public QWidget
void initDialog(const bool &current_date, QETProject *project);
int getIndexFor (const QString &tbt_name,
const QET::QetCollection collection) const;
TitleBlockTemplate *templateForIndex (int index) const;
void addTemplateVariables (DiagramContext &context, int index) const;
private slots:
void editCurrentTitleBlockTemplate();