mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-08-03 10:34:14 +02:00
Add alphabetical auto-numbering (a, b, ... z, aa, ab, ...) (#579)
Adds a real base-26 incrementing part type to the autonumbering engine, alongside the 14 existing NumStrategy leaves. Unlike StringNum (a fixed, non-incrementing text segment), AlphaNum::next()/previous() carry/borrow entirely within the part's own value -- the composition loop in NumerotationContextCommands doesn't need to change, since (unlike #578's wrap-and-carry) nothing here needs to signal an adjacent part. - incrementAlpha()/decrementAlpha() implement the spreadsheet-column-name algorithm: increment carries right-to-left on 'z'/'Z' overflow, prepending a new leading letter if the whole value overflows (z -> aa, az -> ba). decrement is the exact inverse, including the symmetric shrink case (aa -> z) once every position has borrowed. A single letter already at "a"/"A" has no representable predecessor and is clamped rather than turned into "z" -- caught via manual testing, since the initial implementation mutated the string in the borrow loop before checking whether to clamp, silently discarding the original value. - Registered in NumerotationContext::validRegExpNum() but deliberately not in validRegExpNumber(), so addValue() doesn't force alphabetic values through int conversion. - New "Cyclique"-adjacent "Alphabétique" entry in numparteditorw's type dropdown, with its own letters-only QRegularExpressionValidator; the increase spinbox is disabled since the step is always exactly one letter, not a configurable amount. Also wires the new part type through to actual element/conductor labels, which turned out to be required for the feature to do anything visible beyond folio numbering (which applies a NumerotationContext's represented string directly). Element and conductor numbering instead go through a separate formula-substitution layer (autonum::sequentialNumbers + %sequ_/%seqt_/%seqh_-style placeholders in AssignVariables::assignSequence()) that numerotationContextToFormula() auto-populates. Without a matching placeholder, an "alpha" part would silently vanish from the generated formula and never reach the label, even though the underlying counter was advancing correctly: - sequentialNumbers gained an `alpha` QStringList member (copy ctor, operator=, operator==, toXml/fromXml, clear()). - numerotationContextToFormula() emits a new %seqa_N placeholder for alpha parts, the same way %sequ_N is emitted for unit parts. - setSequential()/setSequentialToList() populate seqStruct.alpha, passing the raw string through as-is rather than the .toInt()-based formatting used for the numeric part types. - AssignVariables::assignSequence() substitutes %seqa_N from seqStruct.alpha, mirroring the existing %sequ_N/%seqt_N/%seqh_N substitutions. No "alphafolio" variant was added, matching the discussion's scope (only unit/ten/hundred have folio-anchored variants). Verified against production code via the numbering config dialog's own Suivant/Précédent buttons: from "a", 25 clicks reached "z"; one more produced "aa"; 25 more reached "az"; one more produced "ba" (carry). Reversed: "ba"->"az"->(25 clicks)->"aa"->"z" (shrink)->(25 clicks)->"a". One more "previous" at "a" correctly stayed at "a" after the clamp fix. Also confirmed the Formule field auto-updates to "%seqa_1" the instant the type is switched to "Alphabétique", confirming the formula-generation wiring works live in the UI, not just at the engine level.
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
#include "numparteditorw.h"
|
||||
#include "ui_numparteditorw.h"
|
||||
|
||||
#include <QRegularExpressionValidator>
|
||||
|
||||
/**
|
||||
@brief NumPartEditorW::NumPartEditorW
|
||||
Constructor
|
||||
@@ -28,6 +30,7 @@ NumPartEditorW::NumPartEditorW(int type, QWidget *parent) :
|
||||
QWidget(parent),
|
||||
ui(new Ui::NumPartEditorW),
|
||||
intValidator (new QIntValidator(0,99999,this)),
|
||||
alphaValidator (new QRegularExpressionValidator(QRegularExpression("[A-Za-z]+"), this)),
|
||||
m_edited_type(type)
|
||||
{
|
||||
ui -> setupUi(this);
|
||||
@@ -51,6 +54,7 @@ NumPartEditorW::NumPartEditorW (NumerotationContext &context,
|
||||
QWidget(parent),
|
||||
ui(new Ui::NumPartEditorW),
|
||||
intValidator (new QIntValidator(0,99999,this)),
|
||||
alphaValidator (new QRegularExpressionValidator(QRegularExpression("[A-Za-z]+"), this)),
|
||||
m_edited_type(type)
|
||||
{
|
||||
ui -> setupUi(this);
|
||||
@@ -73,6 +77,8 @@ NumPartEditorW::NumPartEditorW (NumerotationContext &context,
|
||||
setType(NumPartEditorW::hundredfolio, true);
|
||||
else if (strl.at(0)=="wrap")
|
||||
setType(NumPartEditorW::wrap, true);
|
||||
else if (strl.at(0)=="alpha")
|
||||
setType(NumPartEditorW::alpha);
|
||||
else if (strl.at(0)=="string")
|
||||
setType(NumPartEditorW::string);
|
||||
else if (strl.at(0)=="idfolio")
|
||||
@@ -102,6 +108,7 @@ NumPartEditorW::NumPartEditorW (NumerotationContext &context,
|
||||
NumPartEditorW::~NumPartEditorW()
|
||||
{
|
||||
delete intValidator;
|
||||
delete alphaValidator;
|
||||
delete ui;
|
||||
}
|
||||
|
||||
@@ -115,6 +122,7 @@ void NumPartEditorW::setVisibleItems()
|
||||
<< tr("Chiffre 01")
|
||||
<< tr("Chiffre 001")
|
||||
<< tr("Cyclique (modulo)")
|
||||
<< tr("Alphabétique")
|
||||
<< tr("Texte");
|
||||
}
|
||||
else if (m_edited_type == 1)
|
||||
@@ -126,6 +134,7 @@ void NumPartEditorW::setVisibleItems()
|
||||
<< tr("Chiffre 001")
|
||||
<< tr("Chiffre 001 - Folio")
|
||||
<< tr("Cyclique (modulo)")
|
||||
<< tr("Alphabétique")
|
||||
<< tr("Texte")
|
||||
<< tr("N° folio")
|
||||
<< tr("Folio")
|
||||
@@ -140,6 +149,7 @@ void NumPartEditorW::setVisibleItems()
|
||||
<< tr("Chiffre 001")
|
||||
<< tr("Chiffre 001 - Folio")
|
||||
<< tr("Cyclique (modulo)")
|
||||
<< tr("Alphabétique")
|
||||
<< tr("Texte")
|
||||
<< tr("N° folio")
|
||||
<< tr("Folio")
|
||||
@@ -205,6 +215,9 @@ NumerotationContext NumPartEditorW::toNumContext()
|
||||
case wrap:
|
||||
type_str = "wrap";
|
||||
break;
|
||||
case alpha:
|
||||
type_str = "alpha";
|
||||
break;
|
||||
}
|
||||
if (type_str == "unitfolio"
|
||||
|| type_str == "tenfolio"
|
||||
@@ -278,6 +291,8 @@ void NumPartEditorW::on_type_cb_activated(int) {
|
||||
setType(elementprefix);
|
||||
else if (ui->type_cb->currentText() == tr("Cyclique (modulo)"))
|
||||
setType(wrap);
|
||||
else if (ui->type_cb->currentText() == tr("Alphabétique"))
|
||||
setType(alpha);
|
||||
emit changed();
|
||||
}
|
||||
|
||||
@@ -349,6 +364,7 @@ void NumPartEditorW::setType(NumPartEditorW::type t, bool fnum) {
|
||||
}
|
||||
//@t isn't a numeric type
|
||||
else if (t == string
|
||||
|| t == alpha
|
||||
|| t == folio
|
||||
|| t == idfolio
|
||||
|| t == elementline
|
||||
@@ -362,6 +378,13 @@ void NumPartEditorW::setType(NumPartEditorW::type t, bool fnum) {
|
||||
ui -> value_field -> setValidator(nullptr);
|
||||
ui -> value_field -> setEnabled(true);
|
||||
}
|
||||
else if (t==alpha) {
|
||||
//Alphabetic step is always exactly one letter (a, b, ...);
|
||||
//there is no numeric "increase" to configure, unlike the
|
||||
//digit-based part types.
|
||||
ui -> value_field -> setValidator(alphaValidator);
|
||||
ui -> value_field -> setEnabled(true);
|
||||
}
|
||||
else if (t==folio) {
|
||||
ui -> value_field -> setDisabled(true);
|
||||
ui -> increase_spinBox -> setDisabled(true);
|
||||
@@ -414,6 +437,8 @@ void NumPartEditorW::setCurrentIndex(NumPartEditorW::type t) {
|
||||
i = ui->type_cb->findText(tr("Chiffre 001"));
|
||||
else if (t == hundredfolio)
|
||||
i = ui->type_cb->findText(tr("Chiffre 001 - Folio"));
|
||||
else if (t == alpha)
|
||||
i = ui->type_cb->findText(tr("Alphabétique"));
|
||||
else if (t == string)
|
||||
i = ui->type_cb->findText(tr("Texte"));
|
||||
else if (t == idfolio)
|
||||
|
||||
@@ -47,6 +47,7 @@ class NumPartEditorW : public QWidget
|
||||
~NumPartEditorW() override;
|
||||
|
||||
enum type {unit,unitfolio,ten,tenfolio, hundred, hundredfolio,
|
||||
alpha,
|
||||
string,idfolio,folio,plant,locmach,
|
||||
elementline,elementcolumn,elementprefix,
|
||||
wrap,
|
||||
@@ -73,6 +74,7 @@ class NumPartEditorW : public QWidget
|
||||
private:
|
||||
Ui::NumPartEditorW *ui;
|
||||
QValidator *intValidator;
|
||||
QValidator *alphaValidator;
|
||||
int m_edited_type = -1; ///<0 == element : 1 == conductor : 2 == folio
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user