Skip to content

Commit

Permalink
Remove old undo/redo code; inadvertantly fix snapping
Browse files Browse the repository at this point in the history
  • Loading branch information
rj45 committed Jul 9, 2024
1 parent f45eb81 commit 5071ac9
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 501 deletions.
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ set(DIGILOGIC_SRCS
src/ux/ux.c
src/ux/input.c
src/ux/snap.c
src/ux/undo.c
src/ux/actions.c
src/ui/ui.c
src/view/view.c
src/import/digital.c
Expand Down
2 changes: 1 addition & 1 deletion build.zig
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ pub fn build(b: *std.Build) void {
"ux/ux.c",
"ux/input.c",
"ux/snap.c",
"ux/undo.c",
"ux/actions.c",
"view/view.c",
"import/digital.c",
"autoroute/autoroute.c",
Expand Down
140 changes: 140 additions & 0 deletions src/ux/actions.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
/*
Copyright 2024 Ryan "rj45" Sanche
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "core/core.h"
#include "handmade_math.h"
#include "stb_ds.h"
#include "view/view.h"

#include "ux.h"

#define LOG_LEVEL LL_INFO
#include "log.h"

void ux_move_selection(
CircuitUX *ux, HMM_Vec2 oldCenter, HMM_Vec2 newCenter, bool snap) {
log_debug(
"Performing move selection: %f %f -> %f %f", oldCenter.X, oldCenter.Y,
newCenter.X, newCenter.Y);
HMM_Vec2 initialDelta = HMM_SubV2(newCenter, oldCenter);
HMM_Vec2 updatedCenter = newCenter;
if (arrlen(ux->view.selected) == 1 && snap) {
updatedCenter = ux_calc_snap(ux, newCenter);
}

for (size_t i = 0; i < arrlen(ux->view.selected); i++) {
ID id = ux->view.selected[i];
if (circ_type_for_id(&ux->view.circuit, id) == TYPE_SYMBOL) {
circ_set_symbol_position(&ux->view.circuit, id, updatedCenter);
} else if (circ_type_for_id(&ux->view.circuit, id) == TYPE_WAYPOINT) {
circ_set_waypoint_position(&ux->view.circuit, id, updatedCenter);
}
}
ux_route(ux);
ux->view.selectionBox.center =
HMM_AddV2(ux->view.selectionBox.center, initialDelta);
ux->downStart = HMM_AddV2(ux->downStart, initialDelta);
ux->selectionCenter = newCenter;
}

void ux_select_item(CircuitUX *ux, ID id) {
log_debug("Performing select item: %x", id);
arrput(ux->view.selected, id);
ux->selectionCenter = ux_calc_selection_center(ux);
}

void ux_select_area(CircuitUX *ux, Box area) {
log_debug(
"Performing select area: %f %f %f %f", area.center.X, area.center.Y,
area.halfSize.X, area.halfSize.Y);
ux->view.selectionBox = area;
arrsetlen(ux->view.selected, 0);

ux->bvhQuery = bvh_query(&ux->bvh, area, ux->bvhQuery);
for (size_t i = 0; i < arrlen(ux->bvhQuery); i++) {
ID id = ux->bvhQuery[i].item;
EntityType type = circ_type_for_id(&ux->view.circuit, id);
if (type == TYPE_SYMBOL || type == TYPE_WAYPOINT) {
arrput(ux->view.selected, id);
}
}
}

void ux_deselect_item(CircuitUX *ux, ID id) {
log_debug("Performing deselect item: %x", id);
for (size_t i = 0; i < arrlen(ux->view.selected); i++) {
if (ux->view.selected[i] == id) {
arrdel(ux->view.selected, i);
break;
}
}
}

void ux_deselect_area(CircuitUX *ux, Box area) {
log_debug(
"Performing deselect area: %f %f %f %f", area.center.X, area.center.Y,
area.halfSize.X, area.halfSize.Y);
arrsetlen(ux->view.selected, 0);
ux->view.selectionBox = (Box){0};
}

void ux_add_symbol(CircuitUX *ux, ID parentID, HMM_Vec2 center) {
log_debug("Performing add symbol: %x %f %f", parentID, center.X, center.Y);

ID id = circ_add_symbol(&ux->view.circuit, ux->view.circuit.top, parentID);
circ_set_symbol_position(&ux->view.circuit, id, center);
}

void ux_del_symbol(CircuitUX *ux, ID id) {
log_debug("Performing del symbol: %x", id);
circ_remove_symbol(&ux->view.circuit, id);
}

void ux_add_waypoint(CircuitUX *ux, ID parentID, HMM_Vec2 center) {
log_debug("Performing add waypoint: %x %f %f", parentID, center.X, center.Y);
ID id = circ_add_waypoint(&ux->view.circuit, parentID);
circ_set_waypoint_position(&ux->view.circuit, id, center);
}

void ux_del_waypoint(CircuitUX *ux, ID id) {
log_debug("Performing del waypoint: %x", id);
circ_remove_waypoint(&ux->view.circuit, id);
}

void ux_undo(CircuitUX *ux) {
if (ux->tool == TOOL_SYMBOL) {
// will crash if we allow this
return;
}

circ_undo(&ux->view.circuit);
ux_route(ux);
ux_build_bvh(ux);
return;
}

void ux_redo(CircuitUX *ux) {
if (ux->tool == TOOL_SYMBOL) {
// will crash if we allow this
return;
}

// ux_perform_command(ux, undoCmd);
circ_redo(&ux->view.circuit);
ux_route(ux);
ux_build_bvh(ux);
return;
}
23 changes: 9 additions & 14 deletions src/ux/input.c
Original file line number Diff line number Diff line change
Expand Up @@ -256,14 +256,13 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {
case STATE_DRAG_WIRING:
// rebuild the BVH after wiring things
ux_build_bvh(ux);
circ_commit(&ux->view.circuit);
break;

case STATE_ADD_COMPONENT: {
// "drop" the symbol here and start adding a new one
SymbolKindID kindID =
circ_get(&ux->view.circuit, ux->addingSymbol, SymbolKindID);
Position pos = circ_get(&ux->view.circuit, ux->addingSymbol, Position);
ux_do(ux, undo_cmd_add_symbol(pos, ux->addingSymbol, kindID));
circ_commit(&ux->view.circuit);
ux_start_adding_symbol(ux, kindID);

Expand All @@ -280,15 +279,14 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {
case STATE_SELECT_ONE: // fallthrough
case STATE_DESELECT:
if (HMM_LenSqrV2(ux->view.selectionBox.halfSize) > 0.001f) {
ux_do(ux, undo_cmd_deselect_area(ux->view.selectionBox));
ux_deselect_area(ux, ux->view.selectionBox);
} else {
if (
state == STATE_DESELECT ||
(ux->input.modifiers & MODIFIER_SHIFT) == 0) {
while (arrlen(ux->view.selected) > 0) {
ux_do(
ux, undo_cmd_deselect_item(
ux->view.selected[arrlen(ux->view.selected) - 1]));
ux_deselect_item(
ux, ux->view.selected[arrlen(ux->view.selected) - 1]);
}
}
}
Expand All @@ -310,8 +308,7 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {
}
}
if (found != NO_ID) {
ux_do(ux, undo_cmd_select_item(found));
ux->selectionCenter = ux_calc_selection_center(ux);
ux_select_item(ux, found);
}
}
break;
Expand Down Expand Up @@ -370,7 +367,7 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {

case STATE_ADD_WAYPOINT:
log_debug("add waypoint");
ux_add_waypoint(ux, worldMousePos);
ux_add_waypoint_near_mouse(ux, worldMousePos);
ux_route(ux);
ux_build_bvh(ux);
circ_commit(&ux->view.circuit);
Expand All @@ -394,10 +391,8 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {
HMM_Vec2 oldCenter = ux->selectionCenter;
HMM_Vec2 newCenter = HMM_AddV2(oldCenter, delta);
if (HMM_LenSqrV2(delta) > 0.01f) {
ux_do(
ux,
undo_cmd_move_selection(
oldCenter, newCenter, (ux->input.modifiers & MODIFIER_CTRL) == 0));
ux_move_selection(
ux, oldCenter, newCenter, (ux->input.modifiers & MODIFIER_CTRL) == 0);
}

break;
Expand All @@ -411,7 +406,7 @@ static void ux_mouse_down_state_machine(CircuitUX *ux, HMM_Vec2 worldMousePos) {
ux->selectionCenter = area.center;
}

ux_do(ux, undo_cmd_select_area(area));
ux_select_area(ux, area);
break;
}

Expand Down
2 changes: 1 addition & 1 deletion src/ux/snap.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#include "ux.h"

#define SNAP_DISTANCE_THRESHOLD 500
#define SNAP_DISTANCE 8
#define SNAP_DISTANCE 12

HMM_Vec2 ux_calc_snap(CircuitUX *ux, HMM_Vec2 newCenter) {
ID selected = ux->view.selected[0];
Expand Down
Loading

0 comments on commit 5071ac9

Please sign in to comment.