mirror of
https://github.com/jankae/LibreVNA.git
synced 2026-04-06 06:53:37 +00:00
Marker improvements: linked marker groups
This commit is contained in:
parent
cf401fcb01
commit
a232be3443
31 changed files with 755 additions and 318 deletions
106
Software/PC_Application/Traces/Marker/markergroup.cpp
Normal file
106
Software/PC_Application/Traces/Marker/markergroup.cpp
Normal file
|
|
@ -0,0 +1,106 @@
|
|||
#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
|
||||
isTimeDomain = m->isTimeDomain();
|
||||
} else {
|
||||
// check domain
|
||||
if(isTimeDomain != m->isTimeDomain()) {
|
||||
// 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue