From 06dd30893c47709421a3fb13a50237f7d06b079d Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Thu, 8 Dec 2022 20:03:53 -0800 Subject: [PATCH] Editor: Allow using doodad settings buttons in Pan Tool --- .dockerignore | 2 ++ .gitignore | 2 ++ Dockerfile | 4 +-- Makefile | 4 +-- bootstrap.py | 4 +-- pkg/uix/canvas_editable.go | 62 +++++++++++++++++++++++++++++++++++++- 6 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..66349c0 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +bin/* +dist/* \ No newline at end of file diff --git a/.gitignore b/.gitignore index 4b94b9b..096cee2 100644 --- a/.gitignore +++ b/.gitignore @@ -6,11 +6,13 @@ bin/ dist/ rtp/ guidebook/ +docker-artifacts/ wasm/assets/ *.wasm *.doodad *.level *.levelpack +*.AppImage docker/ubuntu docker/debian docker/fedora diff --git a/Dockerfile b/Dockerfile index 842c18b..c21c84d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ ENV PATH /opt/go/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/go/bin RUN apt update && apt -y install git zip tar libsdl2-dev libsdl2-ttf-dev \ libsdl2-mixer-dev gcc-mingw-w64-x86-64 gcc make wget \ flatpak-builder ruby-dev gcc rpm libffi-dev \ - ruby-dev ruby-rubygems rpm libffi-dev rsync + ruby-dev ruby-rubygems rpm libffi-dev rsync file RUN gem install fpm; exit 0 # Download and install modern Go. @@ -80,7 +80,7 @@ ENV PATH /opt/go/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/go/bin RUN apt update && apt -y install git zip tar libsdl2-dev libsdl2-ttf-dev \ libsdl2-mixer-dev gcc-mingw-w64-i686 gcc make wget \ flatpak-builder ruby-dev gcc rpm libffi-dev \ - ruby-dev ruby-rubygems rpm libffi-dev + ruby-dev ruby-rubygems rpm libffi-dev rsync file RUN gem install fpm; exit 0 # Download and install modern Go. diff --git a/Makefile b/Makefile index 54629da..73281b1 100644 --- a/Makefile +++ b/Makefile @@ -171,7 +171,7 @@ dist: doodads build __dist-common .PHONY: docker docker: mkdir -p docker-artifacts - podman build -t doodle_docker . + podman build --cap-add SYS_ADMIN --device /dev/fuse -t doodle_docker . podman run --rm --mount type=bind,src=$(shell pwd)/docker-artifacts,dst=/mnt/export doodle_docker # `make dist-free` builds and tars up a release in shareware mode. @@ -193,4 +193,4 @@ __dist-common: # `make clean` cleans everything up. .PHONY: clean clean: - rm -rf bin dist docker/ubuntu docker/debian docker/fedora + rm -rf bin dist docker-artifacts diff --git a/bootstrap.py b/bootstrap.py index ac7f7fd..90d9c62 100755 --- a/bootstrap.py +++ b/bootstrap.py @@ -39,8 +39,8 @@ repos_github = { } # Software dependencies. -dep_fedora = ["make", "golang", "SDL2-devel", "SDL2_ttf-devel", "SDL2_mixer-devel"] -dep_debian = ["make", "golang", "libsdl2-dev", "libsdl2-ttf-dev", "libsdl2-mixer-dev"] +dep_fedora = ["make", "golang", "SDL2-devel", "SDL2_ttf-devel", "SDL2_mixer-devel", "zip", "rsync"] +dep_debian = ["make", "golang", "libsdl2-dev", "libsdl2-ttf-dev", "libsdl2-mixer-dev", "zip", "rsync"] dep_macos = ["golang", "sdl2", "sdl2_ttf", "sdl2_mixer", "pkg-config"] dep_arch = ["go", "sdl2", "sdl2_ttf", "sdl2_mixer"] diff --git a/pkg/uix/canvas_editable.go b/pkg/uix/canvas_editable.go index a985816..c8d9903 100644 --- a/pkg/uix/canvas_editable.go +++ b/pkg/uix/canvas_editable.go @@ -154,13 +154,14 @@ func (w *Canvas) loopEditable(ev *event.State) error { switch w.Tool { case drawtool.PanTool: // Pan tool = click to pan the level. + var delta render.Point if keybind.LeftClick(ev) || keybind.MiddleClick(ev) { if !w.scrollDragging { w.scrollDragging = true w.scrollStartAt = shmem.Cursor w.scrollWasAt = w.Scroll } else { - delta := shmem.Cursor.Compare(w.scrollStartAt) + delta = shmem.Cursor.Compare(w.scrollStartAt) w.Scroll = w.scrollWasAt w.Scroll.Subtract(delta) @@ -176,6 +177,65 @@ func (w *Canvas) loopEditable(ev *event.State) error { } } + // All the Pan tool to still interact with the Settings button on mouse-over + // of an actor. On touch devices it's difficult to access an actor's settings + // without accidentally dragging the actor, so the Pan Tool allows safe access. + // NOTE: code copied from Actor Tool but with delete and drag/drop hooks removed. + var WP = w.WorldIndexAt(cursor) + for _, actor := range w.actors { + + // Compute the bounding box on screen where this doodad + // visually appears. + var scrollBias = render.Point{ + X: w.Scroll.X, + Y: w.Scroll.Y, + } + if w.Zoom != 0 { + scrollBias.X = w.ZoomDivide(scrollBias.X) + scrollBias.Y = w.ZoomDivide(scrollBias.Y) + } + box := render.Rect{ + X: actor.Actor.Point.X - scrollBias.X - w.ZoomDivide(P.X), + Y: actor.Actor.Point.Y - scrollBias.Y - w.ZoomDivide(P.Y), + W: actor.Canvas.Size().W, + H: actor.Canvas.Size().H, + } + + // Mouse hover? + if WP.Inside(box) { + actor.Canvas.Configure(ui.Config{ + BorderSize: 1, + BorderColor: render.RGBA(153, 153, 153, 255), + BorderStyle: ui.BorderSolid, + Background: render.White, // TODO: cuz the border draws a bgcolor + }) + + // Show doodad buttons. + actor.Canvas.ShowDoodadButtons = true + + // Check for a mouse down event to begin dragging this + // canvas around. + if keybind.LeftClick(ev) && delta == render.Origin { + // Did they click onto the doodad buttons? + if shmem.Cursor.Inside(actor.Canvas.doodadButtonRect()) { + keybind.ClearLeftClick(ev) + if w.OnDoodadConfig != nil { + w.OnDoodadConfig(actor) + } else { + log.Error("OnDoodadConfig: handler not defined for parent canvas") + } + return nil + } + + break + } + } else { + actor.Canvas.SetBorderSize(0) + actor.Canvas.SetBackground(render.RGBA(0, 0, 1, 0)) // TODO + actor.Canvas.ShowDoodadButtons = false + } + } + case drawtool.PencilTool: // If no swatch is active, do nothing with mouse clicks. if w.Palette.ActiveSwatch == nil {