Snake/src/Core/Crawl/layout.cpp

124 lines
2.5 KiB
C++

//#
//# Copyright (C) 2021-2021 QuasarApp.
//# Distributed under the GPLv3 software license, see the accompanying
//# Everyone is permitted to copy and distribute verbatim copies
//# of this license document, but changing it is not allowed.
//#
#include "layout.h"
#include "clasteritem.h"
#include <QtMath>
namespace CRAWL {
Layout::Layout() {
}
void Layout::add(ClasterItem *object) {
Claster::add(object);
updatePosition();
}
void Layout::remove(ClasterItem *object) {
Claster::remove(object);
updatePosition();
}
void Layout::changeLayout(const Refresh &fig) {
_shape = fig;
updatePosition();
}
void Layout::setDistance(int dist) {
_distance = dist;
updatePosition();
}
void Layout::updatePosition() {
switch (_shape) {
case CIRCLE:
drawCircle();
break;
case SQUARE:
drawSquare();
break;
case LINE:
drawLine();
break;
default:
break;
}
}
void Layout::drawCircle() {
if (objects().size() == 0) {
QuasarAppUtils::Params::log(QString("The number of objects is zero. Add object."), QuasarAppUtils::Error);
return;
}
float step = 360 / objects().size();
int temp = 0;
for (ClasterItem* object: objects()) {
float x = _distance * qCos(step*temp);
float y = _distance * qSin(step*temp);
GroupObject::updatePosition(object->guiId(), {x, y, 0});
temp++;
}
}
void Layout::drawSquare() {
if (objects().size() == 0) {
QuasarAppUtils::Params::log(QString("The number of objects is zero. Add object."), QuasarAppUtils::Error);
return;
}
int height = qFloor(qSqrt(objects().size()));
int indObject = 0;
for (auto idObj = objects().keyBegin(); idObj != objects().keyEnd(); idObj++) {
float x = indObject % height;
float y = qCeil(indObject / height);
GroupObject::updatePosition(*idObj, {x + _distance,
y + _distance,
0});
indObject++;
}
}
void Layout::drawLine() {
if (objects().size() == 0) {
QuasarAppUtils::Params::log(QString("The number of objects is zero. Add object."), QuasarAppUtils::Error);
return;
}
float xObject = 0;
for (ClasterItem* object: objects()) {
GroupObject::updatePosition(object->guiId(), {xObject + _distance, 0, 0});
xObject++;
}
}
}