Add jumping to a folio cell such as B13 from Ctrl+G (#1034)

Typing a cell reference into the "Atteindre un élément" popup now offers
"Case B13"; Enter zooms the view onto that cell with one cell of margin.
The cell is read the way the border labels it: row letter(s) then column
number, honouring the "columns start at 0" setting and multi-letter rows
(AA, AB...). Cells outside the folio are not offered.

BorderTitleBlock::cellRect() is the reverse of convertPosition(); a
round trip over every cell of a 30x23 folio, under both column-numbering
settings, returned the same cell for all 1380.

When an element is labelled exactly like the cell (K1), the element stays
first so Enter keeps its old meaning; the cell is listed after it.

DiagramView::zoomToRect() re-centres from a queued call: zooming in makes
the scroll bars appear, and the viewport resize that follows is anchored
under the mouse (setResizeAnchor(AnchorUnderMouse)), which otherwise
scrolls the view away from the cell straight after the zoom.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01G2d2Zi8BfrYRPX88zhaoFG
This commit is contained in:
ispyisail
2026-09-26 07:37:38 +12:00
parent 5f0b015186
commit ce0e7e6867
6 changed files with 111 additions and 2 deletions
+41
View File
@@ -29,6 +29,7 @@
#include <QLocale>
#include <QPainter>
#include <QRegularExpression>
#include <utility>
#define MIN_COLUMN_COUNT 3
@@ -935,6 +936,46 @@ void BorderTitleBlock::updateDiagramContextForTitleBlock(
m_titleblock_template_renderer -> setContext(context);
}
/**
@brief BorderTitleBlock::cellRect
Convert a cell written the way the border labels it (ex : B13, the row
letter(s) then the column number) to its rect in scene coordinate.
This is the reverse of convertPosition().
@param cell : the cell to convert, case and surrounding spaces ignored
@return the rect of the cell, or a null QRectF if \a cell is not a
cell reference or lies outside of the border.
*/
QRectF BorderTitleBlock::cellRect(const QString &cell) const
{
static const QRegularExpression cell_re(
QStringLiteral("^\\s*([A-Za-z]+)\\s*(\\d{1,4})\\s*$"));
const QRegularExpressionMatch match = cell_re.match(cell);
if (!match.hasMatch())
return QRectF();
//Row letters count like A..Z, AA, AB... (see incrementLetters())
int row = 0;
for (const QChar c : match.captured(1).toUpper()) {
row = row * 26 + (c.unicode() - 'A' + 1);
if (row > rows_count_)
return QRectF();
}
int column = match.captured(2).toInt();
QSettings settings;
if (settings.value("border-columns_0", true).toBool())
++column;
if (row < 1 || column < 1 || column > columns_count_)
return QRectF();
const QPointF top_left = insideBorderRect().topLeft();
return QRectF(top_left.x() + (column - 1) * columns_width_,
top_left.y() + (row - 1) * rows_height_,
columns_width_,
rows_height_);
}
/**
@brief BorderTitleBlock::incrementLetters
increments string with Letters A to Z