Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion .github/workflows/setup_environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,14 @@ jobs:
if: ${{ inputs.build == true }}
timeout-minutes: 25

- name: Upload compile_commands.json
uses: actions/upload-artifact@v6
with:
name: compile_commands.json
path: |
build/*.json
if: ${{ inputs.lint_clazy }}

- name: Clazy-standalone
uses: MinyazevR/clazy-standalone-action@v0.3.3
with:
Expand All @@ -209,7 +217,9 @@ jobs:
database: 'build'
verbosity: 'info'
files-changed-only: true
ignore-tidy: '^(buildScripts|thirdparty|installer)$'
ignore-tidy: 'thirdparty|buildScripts|installer'
# Despite having the correct isystem path for googletests in compile_commands.json, it throws [clang-dignostic-error] file "gmock/gmock.h" not found. A temporary solution is to explicitly use these options as command-line arguments for clang-tidy
extra-args: '-isystem${{ github.workspace }}/qrtest/thirdparty/googletest/googletest/googlemock/include/ -isystem${{ github.workspace }}/qrtest/thirdparty/googletest/googletest/googletest/include/'

- name: Clang-tidy exit
if: ${{ inputs.lint_clazy && steps.linter.outputs.checks-failed > 0 }}
Expand Down
62 changes: 30 additions & 32 deletions plugins/robots/common/twoDModel/src/engine/items/ballItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@
#include "ballItem.h"

#include <QtGui/QIcon>
#include <QtWidgets/QAction>
#include <QtWidgets/QAction> //clazy:exclude=qt6-header-fixes
#include <QtSvg/QSvgRenderer>

#include <twoDModel/engine/model/constants.h>

using namespace twoDModel::items;
Expand Down Expand Up @@ -48,22 +47,19 @@ BallItem::BallItem(graphicsUtils::AbstractCoordinateSystem *metricSystem,
setTransformOriginPoint(boundingRect().center());
}

BallItem::~BallItem()
{
}
BallItem::~BallItem() = default;

QAction *BallItem::ballTool()
{
QAction * const result = new QAction(QIcon(":/icons/2d_ball.svg"), tr("Ball (B)"), nullptr);
auto * const result = new QAction(QIcon(":/icons/2d_ball.svg"), tr("Ball (B)"), nullptr);
result->setShortcuts({QKeySequence(Qt::Key_B), QKeySequence(Qt::Key_4)});
result->setCheckable(true);
return result;
}

QRectF BallItem::boundingRect() const
{
return QRectF({ -mDiameterPx / 2.0, -mDiameterPx / 2.0}
, QSizeF{mDiameterPx, mDiameterPx});
return {{ -mDiameterPx / 2.0, -mDiameterPx / 2.0}, QSizeF{mDiameterPx, mDiameterPx}};
}

void BallItem::drawItem(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
Expand All @@ -84,6 +80,26 @@ void BallItem::setPenBrushForExtraction(QPainter *painter, const QStyleOptionGra
}
}

void BallItem::setStartPosition(QPointF startPosition)
{
mStartPosition = startPosition;
}

void BallItem::setStartRotation(qreal startRotation)
{
mStartRotation = startRotation;
}

qreal BallItem::startRotation() const
{
return mStartRotation;
}

QPointF BallItem::startPosition() const
{
return mStartPosition;
}

void BallItem::drawExtractionForItem(QPainter *painter)
{
painter->drawEllipse(boundingRect());
Expand All @@ -98,19 +114,11 @@ void BallItem::savePos()
QDomElement BallItem::serialize(QDomElement &element) const
{
QDomElement ballNode = AbstractItem::serialize(element);
Serializer<BallItem>::serialize(ballNode);
SolidItem::serialize(ballNode);

auto *coordSystem = coordinateSystem();
ballNode.setTagName("ball");
ballNode.setAttribute("x",
QString::number(coordSystem->toUnit(x1() + scenePos().x())));
ballNode.setAttribute("y",
QString::number(coordSystem->toUnit(y1() + scenePos().y())));
ballNode.setAttribute("markerX",
QString::number(coordSystem->toUnit(x1() + mStartPosition.x())));
ballNode.setAttribute("markerY",
QString::number(coordSystem->toUnit(y1() + mStartPosition.y())));
ballNode.setAttribute("rotation", QString::number(rotation()));
ballNode.setAttribute("startRotation", QString::number(mStartRotation));
SolidItem::serialize(ballNode);
if (mDiameterPx.wasChanged()) {
ballNode.setAttribute("diameter", QString::number(coordSystem->toUnit(mDiameterPx)));
}
Expand All @@ -120,24 +128,14 @@ QDomElement BallItem::serialize(QDomElement &element) const
void BallItem::deserialize(const QDomElement &element)
{
AbstractItem::deserialize(element);
SolidItem::deserialize(element);
auto *coordSystem = coordinateSystem();
qreal x = coordSystem->toPx(element.attribute("x", "0").toDouble());
qreal y = coordSystem->toPx(element.attribute("y", "0").toDouble());
qreal markerX = coordSystem->toPx(element.attribute("markerX", "0").toDouble());
qreal markerY = coordSystem->toPx(element.attribute("markerY", "0").toDouble());
qreal rotation = element.attribute("rotation", "0").toDouble();
mStartRotation = element.attribute("startRotation", "0").toDouble();

if (element.hasAttribute("diameter")) {
setDiameter(coordSystem->toPx(
element.attribute("diameter").toDouble()));
}

SolidItem::deserialize(element);
setPos(QPointF(x, y));
setTransformOriginPoint(boundingRect().center());
mStartPosition = {markerX, markerY};
setRotation(rotation);
Serializer<BallItem>::deserialize(element);
Q_EMIT x1Changed(x1());
}

Expand Down Expand Up @@ -166,7 +164,7 @@ void BallItem::returnToStartPosition()

QPolygonF BallItem::collidingPolygon() const
{
return QPolygonF(boundingRect().adjusted(1, 1, -1, -1).translated(scenePos()));
return boundingRect().adjusted(1, 1, -1, -1).translated(scenePos());
}

QPainterPath BallItem::path() const
Expand Down
11 changes: 8 additions & 3 deletions plugins/robots/common/twoDModel/src/engine/items/ballItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,22 +16,23 @@

#include <qrutils/graphicsUtils/abstractItem.h>
#include "src/engine/items/solidItem.h"
#include "details/serializer.h"
#include <memory>

class QSvgRenderer;

namespace twoDModel {
namespace items {

class BallItem final: public graphicsUtils::AbstractItem, public SolidItem
class BallItem final: public graphicsUtils::AbstractItem, public SolidItem, public Serializer<BallItem>
{
Q_OBJECT
Q_DISABLE_COPY(BallItem)

public:
explicit BallItem(graphicsUtils::AbstractCoordinateSystem *metricSystem,
QPointF position);
~BallItem();
QPointF position);
~BallItem() override;

/// Creates and returns ball item for 2D model palette.
/// Transfers ownership.
Expand All @@ -51,6 +52,10 @@ class BallItem final: public graphicsUtils::AbstractItem, public SolidItem

void saveStartPosition();
void returnToStartPosition();
void setStartPosition(QPointF startPosition);
void setStartRotation(qreal startPosition);
qreal startRotation() const;
QPointF startPosition() const;

bool isCircle() const override;
BodyType bodyType() const override;
Expand Down
61 changes: 31 additions & 30 deletions plugins/robots/common/twoDModel/src/engine/items/cubeItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -100,24 +100,33 @@ void CubeItem::savePos()
RotateItem::savePos();
}

void CubeItem::setStartPosition(QPointF startPosition)
{
mStartPosition = startPosition;
}

void CubeItem::setStartRotation(qreal startRotation)
{
mStartRotation = startRotation;
}

qreal CubeItem::startRotation() const
{
return mStartRotation;
}

QPointF CubeItem::startPosition() const
{
return mStartPosition;
}

QDomElement CubeItem::serialize(QDomElement &element) const
{
QDomElement cubeNode = AbstractItem::serialize(element);
const auto &coordSystem = coordinateSystem();
cubeNode.setTagName("cube");
cubeNode.setAttribute("x",
QString::number(coordSystem->toUnit(scenePos().x())));
cubeNode.setAttribute("y",
QString::number(coordSystem->toUnit(scenePos().y())));
cubeNode.setAttribute("markerX",
QString::number(coordSystem->toUnit(mStartPosition.x())));
cubeNode.setAttribute("markerY",
QString::number(coordSystem->toUnit(mStartPosition.y())));
cubeNode.setAttribute("rotation", QString::number(rotation()));
cubeNode.setAttribute("startRotation", QString::number(mStartRotation));

Serializer<CubeItem>::serialize(cubeNode);
SolidItem::serialize(cubeNode);

cubeNode.setTagName("cube");
auto &&coordSystem = coordinateSystem();
if (mEdgeSizePx.wasChanged()) {
cubeNode.setAttribute("edgeSize", QString::number(coordSystem->toUnit(mEdgeSizePx)));
}
Expand All @@ -128,22 +137,18 @@ QDomElement CubeItem::serialize(QDomElement &element) const
void CubeItem::deserialize(const QDomElement &element)
{
AbstractItem::deserialize(element);
const auto &coordSystem = coordinateSystem();
const auto x = coordSystem->toPx(element.attribute("x", "0").toDouble());
const auto y = coordSystem->toPx(element.attribute("y", "0").toDouble());
const auto markerX = coordSystem->toPx(element.attribute("markerX", "0").toDouble());
const auto markerY = coordSystem->toPx(element.attribute("markerY", "0").toDouble());
const auto rotation = element.attribute("rotation", "0").toDouble();
mStartRotation = element.attribute("startRotation", "0").toDouble();
setPos(QPointF(x, y));
setTransformOriginPoint(boundingRect().center());
setRotation(rotation);
SolidItem::deserialize(element);

auto *coordSystem = coordinateSystem();
if (element.hasAttribute("edgeSize")) {
setEdgeSize(coordSystem->toPx(
element.attribute("edgeSize").toDouble()));
}
SolidItem::deserialize(element);
mStartPosition = {markerX, markerY};

Serializer<CubeItem>::deserialize(element);
// Update rotater position
RotateItem::init();
savePos();
Q_EMIT x1Changed(x1());
}

Expand Down Expand Up @@ -195,10 +200,6 @@ void CubeItem::setEdgeSize(const qreal edge)
setY1(-mEdgeSizePx / 2.0f);
setX2(x1() + mEdgeSizePx);
setY2(y1() + mEdgeSizePx);
setTransformOriginPoint(boundingRect().center());
// Update rotater position
RotateItem::init();
savePos();
}

SolidItem::BodyType CubeItem::bodyType() const
Expand Down
10 changes: 7 additions & 3 deletions plugins/robots/common/twoDModel/src/engine/items/cubeItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,23 +15,23 @@
#pragma once

#include <qrutils/graphicsUtils/rotateItem.h>

#include "details/serializer.h"
#include "src/engine/items/solidItem.h"

class QSvgRenderer;

namespace twoDModel {
namespace items {

class CubeItem final: public graphicsUtils::RotateItem, public SolidItem
class CubeItem final: public graphicsUtils::RotateItem, public SolidItem, public Serializer<CubeItem>
{
Q_OBJECT
Q_DISABLE_COPY(CubeItem)

public:
explicit CubeItem(graphicsUtils::AbstractCoordinateSystem *metricSystem,
QPointF position);
~CubeItem();
~CubeItem() override;

/// Creates and returns cube item for 2D model palette.
/// Transfers ownership.
Expand All @@ -45,6 +45,10 @@ class CubeItem final: public graphicsUtils::RotateItem, public SolidItem
void drawFieldForResizeItem(QPainter* painter) override { Q_UNUSED(painter) }
void resizeItem(QGraphicsSceneMouseEvent *event) override { Q_UNUSED(event) }
void savePos() override;
void setStartPosition(QPointF startPosition);
void setStartRotation(qreal startPosition);
qreal startRotation() const;
QPointF startPosition() const;

QDomElement serialize(QDomElement &element) const override;
void deserialize(const QDomElement &element) override;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,18 @@
#pragma once

#include <QObject>
#include <utility>

template<typename T>
class ItemProperty final
{
Q_DISABLE_COPY_MOVE(ItemProperty)
public:
explicit ItemProperty(const QString& name, const T& value)
: mName(name), mValue(value), mWasChanged(false) {}
explicit ItemProperty(QString name, const T& value)
: mName(std::move(name)), mValue(value), mWasChanged(false) {}

ItemProperty() = default;
operator const T() const & { return mValue; }
operator T() const & { return mValue; } // NOLINT(google-explicit-constructor)

QString name() const { return mName; }

Expand All @@ -41,5 +42,5 @@ class ItemProperty final
private:
QString mName;
T mValue;
bool mWasChanged;
bool mWasChanged {};
};
Loading
Loading