From 488942db2e55d673c4e44893e17f1f54f3a8a894 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Thu, 26 Mar 2026 22:14:57 +1100 Subject: [PATCH] Started working on proper parameters --- assets/js/controllers/edit_upload.js | 13 ++++++-- services/imgedit/processing.go | 48 +++++++++++++++++++++++++--- services/imgedit/service.go | 18 +++++++++-- 3 files changed, 69 insertions(+), 10 deletions(-) diff --git a/assets/js/controllers/edit_upload.js b/assets/js/controllers/edit_upload.js index 929b905..f1d472a 100644 --- a/assets/js/controllers/edit_upload.js +++ b/assets/js/controllers/edit_upload.js @@ -1,6 +1,10 @@ import Handlebars from "handlebars"; import {Controller} from "@hotwired/stimulus"; +Handlebars.registerHelper("submit_on", function (id, event) { + return `data-action="${event}->edit-upload#updateProcessor" data-edit-upload-id-param="${id}"` +}); + const processorFrame = Handlebars.compile(`
@@ -11,7 +15,7 @@ const processorFrame = Handlebars.compile(` >X
- {{{props}}} +
{{{props}}}
`); @@ -19,7 +23,12 @@ const processorFrame = Handlebars.compile(` const processorUIs = { "shadow": { label: "Shadow", - template: Handlebars.compile(`This processor has no properties.`), + template: Handlebars.compile(` +
+ + +
+ `), }, "resize": { label: "Resize", diff --git a/services/imgedit/processing.go b/services/imgedit/processing.go index 68f8b9d..378ead5 100644 --- a/services/imgedit/processing.go +++ b/services/imgedit/processing.go @@ -14,6 +14,34 @@ import ( "lmika.dev/lmika/weiro/models" ) +type imageProcessor struct { + newParams func() any + processImage func(ctx context.Context, srcImg image.Image, params any) (image.Image, error) +} + +type shadowProcessorArgs struct { + Color string `json:"color"` + OffsetY int `json:"offset_y"` +} + +var processors = map[string]imageProcessor{ + "shadow": { + newParams: func() any { + return &shadowProcessorArgs{ + Color: "#000000", + OffsetY: 0, + } + }, + processImage: func(ctx context.Context, srcImg image.Image, params any) (image.Image, error) { + p := params.(*shadowProcessorArgs) + + shadow := makeBoxShadow(srcImg, color.Black, 4, 10, p.OffsetY) + composit := imaging.OverlayCenter(shadow, srcImg, 1.0) + return composit, nil + }, + }, +} + func (s *Service) reprocess(ctx context.Context, session *models.ImageEditSession) (imageSource, error) { var img imageSource @@ -72,12 +100,22 @@ func (s *Service) processImage(ctx context.Context, srcImg image.Image, processo defer f.Close() return imaging.Decode(f) - case "shadow": - shadow := makeBoxShadow(srcImg, color.Black, 4, 10, 0) - composit := imaging.OverlayCenter(shadow, srcImg, 1.0) - return composit, nil + //case "shadow": + // shadow := makeBoxShadow(srcImg, color.Black, 4, 10, 0) + // composit := imaging.OverlayCenter(shadow, srcImg, 1.0) + // return composit, nil } - return nil, fmt.Errorf("unknown processor type: %v", processor.Type) + + proc, ok := processors[processor.Type] + if !ok { + return nil, fmt.Errorf("unknown processor type: %v", processor.Type) + } + + paramType := proc.newParams() + if err := json.Unmarshal(processor.Props, paramType); err != nil { + return nil, err + } + return proc.processImage(ctx, srcImg, paramType) } type imageSource interface { diff --git a/services/imgedit/service.go b/services/imgedit/service.go index 97603a8..d9f3ba4 100644 --- a/services/imgedit/service.go +++ b/services/imgedit/service.go @@ -3,6 +3,7 @@ package imgedit import ( "context" "encoding/json" + "fmt" "io" "time" @@ -97,10 +98,21 @@ func (s *Service) AddProcessor(ctx context.Context, sessionID string, req AddPro return nil, err } - // TODO: verify processor, etc. + proc, ok := processors[req.Type] + if !ok { + return nil, fmt.Errorf("unknown processor type: %v", req.Type) + } + + paramType := proc.newParams() + paramBytes, err := json.Marshal(paramType) + if err != nil { + return nil, err + } + session.Processors = append(session.Processors, models.ImageEditProcessor{ - ID: models.NewNanoID(), - Type: req.Type, + ID: models.NewNanoID(), + Type: req.Type, + Props: paramBytes, }) session.RecalcVersionIDs()