mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-12 15:14:12 +02:00
Never use a folio grid step below 1 from the settings
The folio grid steps, diagrameditor/Xgrid and Ygrid, are read from the settings in six places with a plain toInt() and used as they come. The preferences page cannot store anything below 1, but a hand-edited or damaged settings file can hold 0, a negative number or text: - Diagram::snapToGrid() divides by the step, so 0 is a SIGFPE on the first click that places a symbol; - Diagram::drawBackground() runs "while (g_x % xGrid)" and then loops "gx += xGrid", so 0 crashes every repaint and a negative step never ends; - the paste, duplicate and align paths divide by it or multiply with it. Add foliogrid.h, a header-only helper: FolioGrid::step() reads a settings entry and returns the built-in step (Diagram::xGrid, 10) when the entry is missing, not a number, below 1 or above what an int holds (QVariant::toInt() wraps such a value around). Every reader of the two keys goes through it; the settings page, which only writes the spin box values, is unchanged. No file-format change, and no change for any step the preferences page can produce. Tests: tst_foliogrid covers the helper: 1, 10, "7", int max are kept; missing, 0, -5, "ten", "", "nan", 99999999999 (as text and as a number) and int max + 1 fall back; 7.9 rounds to 8 as before; and the two settings keys through a QSettings scope of the test's own. The helper is new, so the test cannot fail on master; the six readers are the replacements in the diff. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Beat Hangartner <beat@hangartners.ch>
This commit is contained in:
+7
-12
@@ -45,6 +45,7 @@
|
||||
#include "diagramsortkeys.h"
|
||||
#include "itemgroups.h"
|
||||
#include "textgrid.h"
|
||||
#include "foliogrid.h"
|
||||
#include <QGraphicsView>
|
||||
#include <QTextStream>
|
||||
#include <algorithm>
|
||||
@@ -339,10 +340,8 @@ void Diagram::drawBackground(QPainter *p, const QRectF &r) {
|
||||
|
||||
p -> setBrush(Qt::NoBrush);
|
||||
|
||||
int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"),
|
||||
Diagram::xGrid).toInt();
|
||||
int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"),
|
||||
Diagram::yGrid).toInt();
|
||||
const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid);
|
||||
const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid);
|
||||
|
||||
qreal limit_x = rect.x() + rect.width();
|
||||
qreal limit_y = rect.y() + rect.height();
|
||||
@@ -2946,10 +2945,8 @@ DiagramPosition Diagram::convertPosition(const QPointF &pos) {
|
||||
QPointF Diagram::snapToGrid(const QPointF &p)
|
||||
{
|
||||
QSettings settings;
|
||||
int xGrid = settings.value(QStringLiteral("diagrameditor/Xgrid"),
|
||||
Diagram::xGrid).toInt();
|
||||
int yGrid = settings.value(QStringLiteral("diagrameditor/Ygrid"),
|
||||
Diagram::yGrid).toInt();
|
||||
const int xGrid = FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid);
|
||||
const int yGrid = FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid);
|
||||
|
||||
//Return a point rounded to the nearest pixel
|
||||
if (QApplication::keyboardModifiers().testFlag(Qt::ControlModifier))
|
||||
@@ -2981,10 +2978,8 @@ QPointF Diagram::snapToTextGrid(const QPointF &p)
|
||||
: settings.value(TextGrid::settings_key, 1).toReal();
|
||||
|
||||
return TextGrid::snap(p,
|
||||
settings.value(QStringLiteral("diagrameditor/Xgrid"),
|
||||
Diagram::xGrid).toInt(),
|
||||
settings.value(QStringLiteral("diagrameditor/Ygrid"),
|
||||
Diagram::yGrid).toInt(),
|
||||
FolioGrid::step(settings.value(FolioGrid::x_key), Diagram::xGrid),
|
||||
FolioGrid::step(settings.value(FolioGrid::y_key), Diagram::yGrid),
|
||||
divisor);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user