LibreVNA/Software/PC_Application/Traces/Marker/markergroup.cpp

107 lines
2.3 KiB
C++
Raw Normal View History

#include "markergroup.h"
MarkerGroup::~MarkerGroup()
{
while(markers.size()) {
remove(*markers.begin());
}
}
bool MarkerGroup::add(Marker *m)
{
if(!applicable(m)) {
// can't add to group
return false;
}
if(m->getGroup()) {
// marker already in other group remove from it
m->getGroup()->remove(m);
}
connect(m, &Marker::positionChanged, this, &MarkerGroup::markerMoved);
connect(m, &Marker::typeChanged, this, &MarkerGroup::checkMarker);
connect(m, &Marker::domainChanged, this, &MarkerGroup::checkMarker);
connect(m, &Marker::deleted, [=](){
remove(m);
});
if(markers.size() > 0) {
m->setPosition((*markers.begin())->getPosition());
}
m->setGroup(this);
markers.insert(m);
return true;
}
bool MarkerGroup::remove(Marker *m)
{
if(markers.count(m)) {
// todo break connections, notify marker
disconnect(m, &Marker::positionChanged, this, &MarkerGroup::markerMoved);
disconnect(m, &Marker::typeChanged, this, &MarkerGroup::checkMarker);
disconnect(m, &Marker::domainChanged, this, &MarkerGroup::checkMarker);
m->setGroup(nullptr);
markers.erase(m);
if(markers.size() == 0) {
// all markers removed
emit emptied(this);
}
return true;
} else {
// not in group
return false;
}
}
bool MarkerGroup::applicable(Marker *m)
{
if(!m->isMovable()) {
// can't add automatic markers to group
return false;
}
if(markers.size() == 0) {
// first marker in group
domain = m->getDomain();
} else {
// check domain
if(domain != m->getDomain()) {
// only markers of the same domain are allowed in a group
return false;
}
}
return true;
}
void MarkerGroup::markerMoved(double newpos)
{
// moving the other markers will trigger additional calls to this slot.
// Set and check guard variable
if(adjustingMarkers) {
return;
}
adjustingMarkers = true;
for(auto m : markers) {
m->setPosition(newpos);
}
adjustingMarkers = false;
}
void MarkerGroup::checkMarker(Marker *m)
{
if(!applicable(m)) {
remove(m);
}
}
unsigned int MarkerGroup::getNumber() const
{
return number;
}