copy nodes with connections

This commit is contained in:
Sebastian
2024-10-26 16:31:23 +02:00
parent 53289bb9e2
commit cb08f69e3b
4 changed files with 112 additions and 45 deletions
+68 -43
View File
@@ -40,35 +40,36 @@ bool mouse_clicked = false;
bool mouse_touched = false;
bool mouse_dragging = false;
//#include "ui.h"
int main(){
srand(time(NULL));
InitWindow(2560, 1440, "VISEQ");
InitWindow(1920, 1080, "VISEQ");
int current_monitor = GetCurrentMonitor();
int monitor_width = GetMonitorWidth(current_monitor);
int monitor_height = GetMonitorHeight(current_monitor);
SetWindowMonitor(current_monitor);
SetWindowState(FLAG_WINDOW_RESIZABLE);
SetWindowSize(monitor_width - 300, monitor_height - 300);
//ToggleFullscreen();
app.ui.init();
int monitor = 1; //GetCurrentMonitor();
SetWindowMonitor(monitor);
app.settings.fps = 1.0f;
app.settings.fps = 60.0f;
app.settings.bpm = 120.0f;
app.settings.grid = 120.0f; //round(((app.settings.fps / (app.settings.bpm / 60.0f)) * app.settings.speed) / 4.0f); // from quarter notes to 16th notes = div by 4
// app.settings.speed = round((((app.settings.fps / (app.settings.bpm / 60.0f)) / app.settings.grid) / 4.0f) / 10.0f) * 10.0f;
app.settings.grid = 120.0f; // 120px for a 16th note
// 16th note = 120px (festgelegt)
// ganze note = 1920px
// ganze note bei 120bpm = 2s
// 120bpm = 960px/s
app.settings.speed = (app.settings.grid * 8.0f) * (app.settings.bpm / 120.f);
app.settings.width = GetMonitorWidth(monitor);
app.settings.height = GetMonitorHeight(monitor);
app.settings.width = monitor_width;
app.settings.height = monitor_height;
SetTargetFPS(60.0f);
SetTargetFPS(app.settings.fps);
camera.target = (Vector2){ app.settings.width/2.0f, app.settings.height/2.0f };
camera.offset = (Vector2){ app.settings.width/2.0f, app.settings.height/2.0f };
@@ -86,24 +87,15 @@ int main(){
app.cm.addConnection(app.nm.nodes[i].id, app.nm.nodes[(i+1) % 8].id);
}
app.sm.addSignalAtNode((app.nm.nodes | std::views::values).front().id);
app.sm.addSignalAtNode((app.nm.nodes | std::views::values).front().id);
app.sm.startSignalThread();
Vec2D<float> drag_offset;
Vec2D<float> cam_drag_offset;
Vec2D<float> cam_mouse_drag_offset;
double drag_timer = GetTime();
enum InteractionState {HOVER_CANVAS, HOVER_NODE, HOVER_CONNECTOR, DRAG_NODE, CONNECT_NODE, DRAW_SELECTION, DELETE_SELECTED_NODES};
enum InteractionState {HOVER_CANVAS, HOVER_NODE, HOVER_CONNECTOR, DRAG_NODE, CONNECT_NODE, DRAW_SELECTION, DELETE_SELECTED_NODES, COPY_SELECTED_NODES, PASTE_SELECTED_NODES};
InteractionState istate = HOVER_CANVAS;
Vec2D<float> select_start;
Rectangle selection;
ToggleFullscreen();
while(!WindowShouldClose()){
@@ -129,6 +121,7 @@ int main(){
Vec2D<float> delta = mouse_delta * (-1.0f/camera.zoom);
auto dragging_nodes = app.nm.nodes | std::ranges::views::values | std::ranges::views::filter([](Node n) { return n.dragging;});
auto copied_nodes = app.nm.nodes | std::ranges::views::values | std::ranges::views::filter([](Node n) { return n.copied;});
auto connecting_nodes = app.nm.nodes | std::ranges::views::values| std::ranges::views::filter([](Node n) { return n.connecting;});
auto selected_nodes = app.nm.nodes | std::ranges::views::values| std::ranges::views::filter([](Node n) { return n.selected && !n.dragging;});
auto hovering_nodes = app.nm.nodes | std::ranges::views::values| std::ranges::views::filter([&mouse_pos](Node n) { return CheckCollisionPointCircle(mouse_pos, n.position, n.radius);});
@@ -143,6 +136,9 @@ int main(){
if(!connecting_nodes.empty()) istate = InteractionState::CONNECT_NODE;
if(!selected_nodes.empty() && IsKeyPressed(KEY_DELETE)) istate = InteractionState::DELETE_SELECTED_NODES;
if(!selected_nodes.empty() && IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_C)) istate = InteractionState::COPY_SELECTED_NODES;
if(!copied_nodes.empty() && IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V)) istate = InteractionState::PASTE_SELECTED_NODES;
switch(istate){
case InteractionState::HOVER_CANVAS:
@@ -200,22 +196,31 @@ int main(){
}
case InteractionState::DRAG_NODE:
{
if(IsKeyDown(KEY_LEFT_CONTROL)) {
dragging_nodes.front().position = (Vec2D<float>){round((mouse_pos.x+dragging_nodes.front().drag_offset.x)/app.settings.grid)*app.settings.grid, round((mouse_pos.y+dragging_nodes.front().drag_offset.y)/app.settings.grid)*app.settings.grid};
} else {
dragging_nodes.front().position = mouse_pos + dragging_nodes.front().drag_offset;
}
for(auto &n : selected_nodes){
if(!n.picked_up) n.drag_offset = n.position - dragging_nodes.front().position;
n.picked_up = true;
n.position = dragging_nodes.front().position + n.drag_offset;
}
if(mouse_released) {
dragging_nodes.front().dragging = false;
if(!dragging_nodes.empty()){
for(auto &n : selected_nodes){
n.picked_up = false;
if(!n.picked_up) n.drag_offset = n.position - dragging_nodes.front().position;
n.picked_up = true;
}
if(IsKeyDown(KEY_LEFT_CONTROL)) {
dragging_nodes.front().position = (Vec2D<float>){round((mouse_pos.x+dragging_nodes.front().drag_offset.x)/app.settings.grid)*app.settings.grid, round((mouse_pos.y+dragging_nodes.front().drag_offset.y)/app.settings.grid)*app.settings.grid};
} else {
dragging_nodes.front().position = mouse_pos + dragging_nodes.front().drag_offset;
}
for(auto &n : selected_nodes){
n.position = dragging_nodes.front().position + n.drag_offset;
}
if(mouse_released) {
for(auto &n : dragging_nodes){
n.dragging = false;
n.picked_up = false;
}
for(auto &n : selected_nodes){
n.picked_up = false;
n.dragging = false;
}
}
}
break;
@@ -257,6 +262,26 @@ int main(){
app.removeNodes();
break;
}
case InteractionState::COPY_SELECTED_NODES:
{
for(auto &n: copied_nodes){
n.copied = false;
}
for(auto &n: selected_nodes){
n.copied = true;
n.selected = false;
}
break;
}
case InteractionState::PASTE_SELECTED_NODES:
{
for(auto &n: copied_nodes){
n.drag_offset = (n.position - copied_nodes.front().position);
}
// app.nm.copyNodes(mouse_pos);
app.copyNodesAndConnections(mouse_pos);
break;
}
};
float wheel = GetMouseWheelMove();