mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-10-03 01:04:13 +02:00
Merge pull request #1235 from ispyisail/fix/bugtracker-112-editor-snap-zoomed-out
Fix bugtracker #112: no snap in the symbol editor below 100 % zoom
This commit is contained in:
@@ -206,7 +206,13 @@ void ElementPrimitiveDecorator::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
||||
{
|
||||
// When moving the selection, consider the position of the first selected item
|
||||
QPointF current_position = scene_pos - mouse_offset_;
|
||||
QPointF rounded_current_position = snapConstPointToGrid(current_position);
|
||||
// Snap to the editor's grid, as a single part does (bugtracker
|
||||
// #112); Ctrl keeps the fine 1-unit step.
|
||||
ElementScene *element_scene = qobject_cast<ElementScene *>(scene());
|
||||
QPointF rounded_current_position =
|
||||
(element_scene && !(event->modifiers() & Qt::ControlModifier))
|
||||
? element_scene->snapToGrid(current_position)
|
||||
: snapConstPointToGrid(current_position);
|
||||
movement = rounded_current_position - decorated_items_.at(0) -> toItem() -> scenePos();
|
||||
|
||||
QRectF bounding_rect = modified_bounding_rect_;
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
*/
|
||||
#include "elementview.h"
|
||||
|
||||
#include "elementviewgrid.h"
|
||||
|
||||
#include "../qetapp.h"
|
||||
#include "UndoCommand/pastepartscommand.h"
|
||||
#include "ui/qetelementeditor.h"
|
||||
@@ -535,29 +537,12 @@ void ElementView::drawBackground(QPainter *p, const QRectF &r) {
|
||||
|
||||
// choisit la granularite de la grille en fonction du zoom en cours
|
||||
// selects the grid granularity according to the current zoom level
|
||||
int drawn_x_grid = 1;//scene_ -> xGrid();
|
||||
int drawn_y_grid = 1;//scene_ -> yGrid();
|
||||
bool draw_grid = true;
|
||||
bool draw_cross = false;
|
||||
const ElementViewGrid grid = ElementViewGrid::forZoom(zoom_factor);
|
||||
const int grid_step = grid.step;
|
||||
const bool draw_grid = grid.draw_grid;
|
||||
const bool draw_cross = grid.draw_cross;
|
||||
|
||||
if (zoom_factor < 1.0) { //< no grid
|
||||
draw_grid = false;
|
||||
} else if (zoom_factor < 4.0) { //< grid 10*10
|
||||
drawn_x_grid *= 10;
|
||||
drawn_y_grid *= 10;
|
||||
}else if (zoom_factor < 8.0) { //< grid 5*5
|
||||
drawn_x_grid *= 5;
|
||||
drawn_y_grid *= 5;
|
||||
draw_cross = true;
|
||||
} else if (zoom_factor < 10.0) { //< grid 2*2
|
||||
drawn_x_grid *= 2;
|
||||
drawn_y_grid *= 2;
|
||||
draw_cross = true;
|
||||
} else { //< grid 1*1
|
||||
draw_cross = true;
|
||||
}
|
||||
|
||||
m_scene->setGrid(drawn_x_grid, drawn_y_grid);
|
||||
m_scene->setGrid(grid_step, grid_step);
|
||||
|
||||
if (draw_grid) {
|
||||
// draw the dots of the grid
|
||||
@@ -587,12 +572,12 @@ void ElementView::drawBackground(QPainter *p, const QRectF &r) {
|
||||
qreal limit_y = r.y() + r.height();
|
||||
|
||||
int g_x = (int)ceil(r.x());
|
||||
while (g_x % drawn_x_grid) ++ g_x;
|
||||
while (g_x % grid_step) ++ g_x;
|
||||
int g_y = (int)ceil(r.y());
|
||||
while (g_y % drawn_y_grid) ++ g_y;
|
||||
while (g_y % grid_step) ++ g_y;
|
||||
|
||||
for (int gx = g_x ; gx < limit_x ; gx += drawn_x_grid) {
|
||||
for (int gy = g_y ; gy < limit_y ; gy += drawn_y_grid) {
|
||||
for (int gx = g_x ; gx < limit_x ; gx += grid_step) {
|
||||
for (int gy = g_y ; gy < limit_y ; gy += grid_step) {
|
||||
if (draw_cross) {
|
||||
if (!(gx % 10) && !(gy % 10)) {
|
||||
p -> drawLine(QLineF(gx - (pen.width()/4.0), gy, gx + (pen.width()/4.0), gy));
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/*
|
||||
Copyright 2006-2026 The QElectroTech Team
|
||||
This file is part of QElectroTech.
|
||||
|
||||
QElectroTech 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
QElectroTech 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 QElectroTech. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef ELEMENTVIEWGRID_H
|
||||
#define ELEMENTVIEWGRID_H
|
||||
|
||||
#include <QtGlobal>
|
||||
|
||||
/**
|
||||
The symbol editor's grid at a given zoom: the step parts snap to, and
|
||||
how the grid is drawn. The step gets finer as the view zooms in, so a
|
||||
small detail can be placed precisely.
|
||||
|
||||
Below 100 % the grid is not drawn (its dots would merge into a grey
|
||||
wash), but parts still snap every 10 units, as at 100 %. Snapping to 1
|
||||
unit there left everything dragged while zoomed out off the grid, with
|
||||
nothing on screen to show it (bugtracker #112).
|
||||
*/
|
||||
struct ElementViewGrid
|
||||
{
|
||||
int step = 10;
|
||||
bool draw_grid = true;
|
||||
bool draw_cross = false;
|
||||
|
||||
static ElementViewGrid forZoom(qreal zoom_factor)
|
||||
{
|
||||
ElementViewGrid grid;
|
||||
if (zoom_factor < 1.0) {
|
||||
grid.draw_grid = false;
|
||||
} else if (zoom_factor < 4.0) {
|
||||
grid.step = 10;
|
||||
} else if (zoom_factor < 8.0) {
|
||||
grid.step = 5;
|
||||
grid.draw_cross = true;
|
||||
} else if (zoom_factor < 10.0) {
|
||||
grid.step = 2;
|
||||
grid.draw_cross = true;
|
||||
} else {
|
||||
grid.step = 1;
|
||||
grid.draw_cross = true;
|
||||
}
|
||||
return grid;
|
||||
}
|
||||
};
|
||||
|
||||
#endif // ELEMENTVIEWGRID_H
|
||||
@@ -104,6 +104,13 @@ add_test(NAME tst_textgrid COMMAND tst_textgrid)
|
||||
target_include_directories(tst_textgrid PRIVATE ${QET_DIR}/sources)
|
||||
target_link_libraries(tst_textgrid PRIVATE Qt::Test)
|
||||
|
||||
# elementviewgrid.h is header-only: the symbol editor's snap step at each
|
||||
# zoom (bugtracker #112), tested without an editor window.
|
||||
add_executable(tst_elementviewgrid tst_elementviewgrid.cpp)
|
||||
add_test(NAME tst_elementviewgrid COMMAND tst_elementviewgrid)
|
||||
target_include_directories(tst_elementviewgrid PRIVATE ${QET_DIR}/sources)
|
||||
target_link_libraries(tst_elementviewgrid PRIVATE Qt::Test)
|
||||
|
||||
# alignment.h is header-only too (it builds on textgrid.h): the geometry
|
||||
# behind the align commands, tested without a scene.
|
||||
add_executable(tst_alignment tst_alignment.cpp)
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
#include <QtTest>
|
||||
|
||||
#include "editor/elementviewgrid.h"
|
||||
|
||||
// The symbol editor's snap step at each zoom (bugtracker #112): below
|
||||
// 100 % the grid is hidden but parts must still snap every 10 units.
|
||||
class tst_elementviewgrid : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
private slots:
|
||||
void stepAtZoom_data()
|
||||
{
|
||||
QTest::addColumn<qreal>("zoom");
|
||||
QTest::addColumn<int>("step");
|
||||
QTest::addColumn<bool>("drawGrid");
|
||||
QTest::addColumn<bool>("drawCross");
|
||||
|
||||
QTest::newRow("10 % (fit to a big symbol)") << 0.10 << 10 << false << false;
|
||||
QTest::newRow("62.5 %, the #112 case") << 0.625 << 10 << false << false;
|
||||
QTest::newRow("100 %") << 1.0 << 10 << true << false;
|
||||
QTest::newRow("200 %") << 2.0 << 10 << true << false;
|
||||
QTest::newRow("400 %") << 4.0 << 5 << true << true;
|
||||
QTest::newRow("800 %") << 8.0 << 2 << true << true;
|
||||
QTest::newRow("1000 %") << 10.0 << 1 << true << true;
|
||||
|
||||
// Just below each threshold: the comparisons are strict (<), so a
|
||||
// change to <= would move these rows into the next band.
|
||||
QTest::newRow("99.9 %") << 0.999 << 10 << false << false;
|
||||
QTest::newRow("399.9 %") << 3.999 << 10 << true << false;
|
||||
QTest::newRow("401 %") << 4.01 << 5 << true << true;
|
||||
QTest::newRow("799.9 %") << 7.999 << 5 << true << true;
|
||||
QTest::newRow("999.9 %") << 9.999 << 2 << true << true;
|
||||
}
|
||||
|
||||
void stepAtZoom()
|
||||
{
|
||||
QFETCH(qreal, zoom);
|
||||
QFETCH(int, step);
|
||||
QFETCH(bool, drawGrid);
|
||||
QFETCH(bool, drawCross);
|
||||
|
||||
const ElementViewGrid grid = ElementViewGrid::forZoom(zoom);
|
||||
QCOMPARE(grid.step, step);
|
||||
QCOMPARE(grid.draw_grid, drawGrid);
|
||||
QCOMPARE(grid.draw_cross, drawCross);
|
||||
}
|
||||
};
|
||||
|
||||
QTEST_APPLESS_MAIN(tst_elementviewgrid)
|
||||
|
||||
#include "tst_elementviewgrid.moc"
|
||||
Reference in New Issue
Block a user