node deletion with connection deletion and signal redistribution implemented

This commit is contained in:
Sebastian
2024-10-26 02:14:41 +02:00
parent 658bc118ef
commit c25d5b2a1a
10 changed files with 167 additions and 84 deletions
+65 -2
View File
@@ -1,15 +1,21 @@
#pragma once
#include "connection.h"
#include "datatypes.h"
#include "node-manager.h"
#include "connection-manager.h"
#include "signal-manager.h"
#include "ui.h"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <ranges>
#include <vector>
class AppState{
public:
AppState() : sm(&cm, &mutex), ui(&settings, &nm, &cm, &sm) {}
AppState() : cm(&nm), sm(&nm, &cm, &mutex), ui(&settings, &nm, &cm, &sm) {}
enum States {IDLE, CONFIG};
@@ -26,7 +32,7 @@ class AppState{
AppUI ui;
void updateMidiPorts(){
for(auto&n : nm.nodes){
for(auto&n : nm.nodes | std::views::values){
for(auto& mo : sm.midi.midi_out_ports){
if(!n.midi_outs.contains(mo.number) && mo.enabled){
n.midi_outs[mo.number] = {mo.number, mo.port.port_name, false};
@@ -38,6 +44,63 @@ class AppState{
}
}
void removeNodes(){
for(auto &n : nm.nodes){
n.second.highlighted = false;
}
auto erase_nodes = nm.nodes | std::ranges::views::values | std::ranges::views::filter([](Node n){return n.erase;});
std::vector<int> erase_nodes_ids;
for(auto &e : erase_nodes){
erase_nodes_ids.push_back(e.id);
}
auto erase_connections = cm.connections | std::ranges::views::filter([erase_nodes_ids](Connection c){ return std::ranges::contains(erase_nodes_ids, c.v1) || std::ranges::contains(erase_nodes_ids, c.v2);});
std::vector<int> adjacent_nodes_ids;
for(auto &c : erase_connections){
if(!nm.nodes.at(c.v1).selected) adjacent_nodes_ids.push_back(c.v1);
if(!nm.nodes.at(c.v2).selected) adjacent_nodes_ids.push_back(c.v2);
}
// std::ranges::for_each(adjacent_nodes_ids, [this](int id){ nm.nodes.at(id).highlighted = true;} );
auto reroute_signals = sm.signals | std::ranges::views::filter([erase_nodes_ids](Signal s){
return std::ranges::contains(erase_nodes_ids, s.next);
});
for(auto &s : reroute_signals){
float dist = 10000000;
int next_id = -1;
for(int i : adjacent_nodes_ids){
if(nm.nodes.at(i).position.dist(&s.position) < dist) {
dist = nm.nodes.at(i).position.dist(&s.position);
next_id = i;
}
}
s.next = next_id;
s.last = next_id;
}
auto rebase_signals = sm.signals | std::ranges::views::filter([erase_nodes_ids](Signal s){
return std::ranges::contains(erase_nodes_ids, s.start);
});
for(auto &s : rebase_signals){
s.start = s.next;
}
for(auto &n : erase_nodes){
std::erase_if(cm.connections, [n](Connection c){ return c.v1 == n.id || c.v2 == n.id;});
}
std::erase_if(nm.nodes, [](std::pair<int, Node> n){ return n.second.erase;});
nm.keys.clear();
std::ranges::copy(nm.nodes | std::ranges::views::keys, std::back_inserter(nm.keys));
}
void draw(Vec2D<float> *mouse_pos, Camera2D *camera){
mutex.lock();
updateMidiPorts();