//# //# 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++; } } }