From 135a00ca6aa2134ccc750758403fa316eb7441d6 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Fri, 12 Apr 2024 21:53:42 +0200 Subject: [PATCH 1/2] adds pixel drag mode to move tool --- .../ui/cpwsarea/wsmap/pmap/editor/editor.go | 11 +++ .../app/ui/cpwsarea/wsmap/pmap/panel_tools.go | 1 + internal/app/ui/cpwsarea/wsmap/tools/move.go | 95 +++++++++++++------ internal/app/ui/cpwsarea/wsmap/tools/tools.go | 3 + 4 files changed, 83 insertions(+), 27 deletions(-) diff --git a/internal/app/ui/cpwsarea/wsmap/pmap/editor/editor.go b/internal/app/ui/cpwsarea/wsmap/pmap/editor/editor.go index 75be1c13..ca87389c 100644 --- a/internal/app/ui/cpwsarea/wsmap/pmap/editor/editor.go +++ b/internal/app/ui/cpwsarea/wsmap/pmap/editor/editor.go @@ -2,6 +2,7 @@ package editor import ( "sdmm/internal/app/command" + "sdmm/internal/app/prefs" "sdmm/internal/app/ui/cpwsarea/wsmap/pmap/canvas" "sdmm/internal/app/ui/cpwsarea/wsmap/pmap/overlay" "sdmm/internal/dmapi/dm" @@ -65,6 +66,8 @@ type app interface { SyncPrefabs() SyncVarEditor() + + Prefs() prefs.Prefs } type attachedMap interface { @@ -158,3 +161,11 @@ func (e *Editor) FocusCameraOnPosition(coord util.Point) { e.pMap.SetActiveLevel(coord.Z) e.OverlaySetTileFlick(coord) } + +func (e *Editor) ZoomLevel() float32 { + return e.pMap.Canvas().Render().Camera.Scale +} + +func (e *Editor) Prefs() prefs.Prefs { + return e.app.Prefs() +} diff --git a/internal/app/ui/cpwsarea/wsmap/pmap/panel_tools.go b/internal/app/ui/cpwsarea/wsmap/pmap/panel_tools.go index 5219ed40..a1fefe85 100644 --- a/internal/app/ui/cpwsarea/wsmap/pmap/panel_tools.go +++ b/internal/app/ui/cpwsarea/wsmap/pmap/panel_tools.go @@ -74,6 +74,7 @@ var ( w.TextFrame("4"), w.Separator(), w.Text("Move a singular object"), + w.Line(w.TextFrame("Hold Shift"), w.Text("Pixel/Step offset the selected object via dragging")), }, }, tools.TNPick: { diff --git a/internal/app/ui/cpwsarea/wsmap/tools/move.go b/internal/app/ui/cpwsarea/wsmap/tools/move.go index ac3b033a..9a5e27f2 100644 --- a/internal/app/ui/cpwsarea/wsmap/tools/move.go +++ b/internal/app/ui/cpwsarea/wsmap/tools/move.go @@ -1,17 +1,26 @@ package tools import ( + "sdmm/internal/app/prefs" "sdmm/internal/dmapi/dm" "sdmm/internal/dmapi/dmmap" + "sdmm/internal/dmapi/dmmap/dmmdata/dmmprefab" "sdmm/internal/dmapi/dmmap/dmminstance" + "sdmm/internal/dmapi/dmvars" + "sdmm/internal/imguiext" "sdmm/internal/util" + "strconv" + + "github.com/SpaiR/imgui-go" ) -// ToolPick can be used move a single object. +// ToolMove can be used move a single object. type ToolMove struct { tool instance *dmminstance.Instance lastTile *dmmap.Tile + lastMouseCoords imgui.Vec2 + lastOffsets [2]int } func (ToolMove) Name() string { @@ -34,43 +43,75 @@ func (t *ToolMove) onStart(util.Point) { if hoveredInstance := ed.HoveredInstance(); hoveredInstance != nil { ed.InstanceSelect(hoveredInstance) t.instance = hoveredInstance + t.lastMouseCoords = imgui.MousePos() + vars := t.instance.Prefab().Vars() + if ed.Prefs().Editor.NudgeMode == prefs.SaveNudgeModePixel { + t.lastOffsets = [2]int{vars.IntV("pixel_x", 0), vars.IntV("pixel_y", 0)} + } else { + t.lastOffsets = [2]int{vars.IntV("step_x", 0), vars.IntV("step_y", 0)} + } } } +func (t *ToolMove) process() { + if t.instance == nil || !imguiext.IsShiftDown() { + return + } + xAxis := "pixel_x" + yAxis := "pixel_y" + if ed.Prefs().Editor.NudgeMode == prefs.SaveNudgeModeStep { + xAxis = "step_x" + yAxis = "step_y" + } + origPrefab := t.instance.Prefab() + mouseCoords := imgui.MousePos() + offsetX := (mouseCoords.X - t.lastMouseCoords.X) / ed.ZoomLevel() + offsetY := (t.lastMouseCoords.Y - mouseCoords.Y) / ed.ZoomLevel() + + newVars := dmvars.Set(origPrefab.Vars(), xAxis, strconv.Itoa(t.lastOffsets[0] + int(offsetX))) + newVars = dmvars.Set(newVars, yAxis, strconv.Itoa(t.lastOffsets[1] + int(offsetY))) + t.instance.SetPrefab(dmmprefab.New(dmmprefab.IdNone, origPrefab.Path(), newVars)) + + ed.UpdateCanvasByCoords([]util.Point{t.instance.Coord()}) +} + func (t *ToolMove) onMove(coord util.Point) { - if t.instance != nil { - prefab := t.instance.Prefab() - if t.lastTile != nil { - t.lastTile.InstancesRegenerate() //should stop some issues - } - t.lastTile = ed.Dmm().GetTile(coord) - ed.InstanceDelete(t.instance) - t.lastTile.InstancesAdd(prefab) - t.lastTile.InstancesRegenerate() - for _, found := range t.lastTile.Instances() { - if found.Prefab().Id() == prefab.Id() { - t.instance = found - break - } + if(t.instance == nil || imguiext.IsShiftDown()) { + return + } + + prefab := t.instance.Prefab() + if t.lastTile != nil { + t.lastTile.InstancesRegenerate() //should stop some issues + } + t.lastTile = ed.Dmm().GetTile(coord) + ed.InstanceDelete(t.instance) + t.lastTile.InstancesAdd(prefab) + t.lastTile.InstancesRegenerate() + for _, found := range t.lastTile.Instances() { + if found.Prefab().Id() == prefab.Id() { + t.instance = found + break } - ed.UpdateCanvasByCoords([]util.Point{coord}) } + ed.UpdateCanvasByCoords([]util.Point{coord}) } func (t *ToolMove) onStop(util.Point) { - if t.instance != nil { - //remove other turfs if we moved a turf - if t.lastTile != nil { - if dm.IsPath(t.instance.Prefab().Path(), "/turf") { - for _, found := range t.lastTile.Instances() { - if dm.IsPath(found.Prefab().Path(), "/turf") && found != t.instance { - ed.InstanceDelete(found) - } + if t.instance == nil { + return + } + //remove other turfs if we moved a turf + if t.lastTile != nil { + if dm.IsPath(t.instance.Prefab().Path(), "/turf") { + for _, found := range t.lastTile.Instances() { + if dm.IsPath(found.Prefab().Path(), "/turf") && found != t.instance { + ed.InstanceDelete(found) } } } - t.instance = nil - t.lastTile = nil - go ed.CommitChanges("Moved Prefab") } + t.instance = nil + t.lastTile = nil + go ed.CommitChanges("Moved Prefab") } diff --git a/internal/app/ui/cpwsarea/wsmap/tools/tools.go b/internal/app/ui/cpwsarea/wsmap/tools/tools.go index 1e434f0f..61b38774 100644 --- a/internal/app/ui/cpwsarea/wsmap/tools/tools.go +++ b/internal/app/ui/cpwsarea/wsmap/tools/tools.go @@ -1,6 +1,7 @@ package tools import ( + "sdmm/internal/app/prefs" "sdmm/internal/app/window" "sdmm/internal/imguiext" @@ -60,6 +61,8 @@ type editor interface { TileDeleteSelected() TileDelete(util.Point) HoveredInstance() *dmminstance.Instance + ZoomLevel() float32 + Prefs() prefs.Prefs } var ( From d34492eed8123b43c6b7105b07a1591846e17350 Mon Sep 17 00:00:00 2001 From: jimmyl <70376633+mc-oofert@users.noreply.github.com> Date: Sat, 13 Apr 2024 10:20:14 +0200 Subject: [PATCH 2/2] format --- internal/app/ui/cpwsarea/wsmap/tools/move.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/app/ui/cpwsarea/wsmap/tools/move.go b/internal/app/ui/cpwsarea/wsmap/tools/move.go index 9a5e27f2..8459f591 100644 --- a/internal/app/ui/cpwsarea/wsmap/tools/move.go +++ b/internal/app/ui/cpwsarea/wsmap/tools/move.go @@ -17,10 +17,10 @@ import ( // ToolMove can be used move a single object. type ToolMove struct { tool - instance *dmminstance.Instance - lastTile *dmmap.Tile + instance *dmminstance.Instance + lastTile *dmmap.Tile lastMouseCoords imgui.Vec2 - lastOffsets [2]int + lastOffsets [2]int } func (ToolMove) Name() string { @@ -65,18 +65,18 @@ func (t *ToolMove) process() { } origPrefab := t.instance.Prefab() mouseCoords := imgui.MousePos() - offsetX := (mouseCoords.X - t.lastMouseCoords.X) / ed.ZoomLevel() - offsetY := (t.lastMouseCoords.Y - mouseCoords.Y) / ed.ZoomLevel() + offsetX := (mouseCoords.X - t.lastMouseCoords.X) / ed.ZoomLevel() + offsetY := (t.lastMouseCoords.Y - mouseCoords.Y) / ed.ZoomLevel() - newVars := dmvars.Set(origPrefab.Vars(), xAxis, strconv.Itoa(t.lastOffsets[0] + int(offsetX))) - newVars = dmvars.Set(newVars, yAxis, strconv.Itoa(t.lastOffsets[1] + int(offsetY))) + newVars := dmvars.Set(origPrefab.Vars(), xAxis, strconv.Itoa(t.lastOffsets[0]+int(offsetX))) + newVars = dmvars.Set(newVars, yAxis, strconv.Itoa(t.lastOffsets[1]+int(offsetY))) t.instance.SetPrefab(dmmprefab.New(dmmprefab.IdNone, origPrefab.Path(), newVars)) ed.UpdateCanvasByCoords([]util.Point{t.instance.Coord()}) } func (t *ToolMove) onMove(coord util.Point) { - if(t.instance == nil || imguiext.IsShiftDown()) { + if t.instance == nil || imguiext.IsShiftDown() { return }