From b1d15fb4ec62df40e0db3607d436e683208fac2a Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Tue, 28 Feb 2023 00:17:05 -0500 Subject: [PATCH] this piano is DOPE and PHAT and WAY COOL --- elements/basic/spacer.go | 21 +++++++++++---- elements/fun/piano.go | 6 ++--- theme/assets/wintergreen.png | Bin 2299 -> 3088 bytes theme/default.go | 48 ++++++++++++++++++++++++++++++----- theme/theme.go | 3 +++ 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/elements/basic/spacer.go b/elements/basic/spacer.go index 297ad71..4d710b3 100644 --- a/elements/basic/spacer.go +++ b/elements/basic/spacer.go @@ -2,7 +2,6 @@ package basicElements import "git.tebibyte.media/sashakoshka/tomo/theme" import "git.tebibyte.media/sashakoshka/tomo/config" -import "git.tebibyte.media/sashakoshka/tomo/artist/shapes" import "git.tebibyte.media/sashakoshka/tomo/elements/core" // Spacer can be used to put space between two elements.. @@ -22,7 +21,7 @@ func NewSpacer (line bool) (element *Spacer) { element = &Spacer { line: line } element.theme.Case = theme.C("basic", "spacer") element.Core, element.core = core.NewCore(element.draw) - element.core.SetMinimumSize(1, 1) + element.updateMinimumSize() return } @@ -30,6 +29,7 @@ func NewSpacer (line bool) (element *Spacer) { func (element *Spacer) SetLine (line bool) { if element.line == line { return } element.line = line + element.updateMinimumSize() if element.core.HasImage() { element.draw() element.core.DamageAll() @@ -50,6 +50,17 @@ func (element *Spacer) SetConfig (new config.Config) { element.redo() } +func (element *Spacer) updateMinimumSize () { + if element.line { + padding := element.theme.Padding(theme.PatternLine) + element.core.SetMinimumSize ( + padding.Horizontal(), + padding.Vertical()) + } else { + element.core.SetMinimumSize(1, 1) + } +} + func (element *Spacer) redo () { if !element.core.HasImage() { element.draw() @@ -61,10 +72,10 @@ func (element *Spacer) draw () { bounds := element.Bounds() if element.line { - color := element.theme.Color ( - theme.ColorForeground, + pattern := element.theme.Pattern ( + theme.PatternLine, theme.State { }) - shapes.FillColorRectangle(element.core, color, bounds) + pattern.Draw(element.core, bounds) } else { pattern := element.theme.Pattern ( theme.PatternBackground, diff --git a/elements/fun/piano.go b/elements/fun/piano.go index a11a3c2..4cba308 100644 --- a/elements/fun/piano.go +++ b/elements/fun/piano.go @@ -218,11 +218,11 @@ func (element *Piano) SetConfig (new config.Config) { } func (element *Piano) updateMinimumSize () { - padding := element.theme.Padding(theme.PatternSunken) + padding := element.theme.Padding(theme.PatternPinboard) element.core.SetMinimumSize ( pianoKeyWidth * 7 * element.countOctaves() + - padding[1] + padding[3], - 64 + padding[0] + padding[2]) + padding.Horizontal(), + 64 + padding.Vertical()) } func (element *Piano) countOctaves () int { diff --git a/theme/assets/wintergreen.png b/theme/assets/wintergreen.png index ea9871c51ee1691f327607243be0a615584d9712..bcee114d0044737c8439a19aa0ec37e907a8630b 100644 GIT binary patch delta 3034 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 delta 2239 zcmZuzdpOg58~<+8elzSh8CEot4(q9&$00ei&9=y)rcrt-yhaD5@+dl(!|ykeN@bm& zbTCm-p#wQowqBADDh*LhN(}Kb$35fOdp-ZX*ZaqP-Jk2aug~?lKlgqAaZ9KgW9t(F zUr!_ATp|F#$lJ@^Uzbr`NC`LqFh|$sY&mPa2_Zy!yK^@l`S@uooOzXQXqvSuzairJ z(l0Yt&meEf?t;Ki)!IV=m*Uvxh6v4JmIkuCGY^lLt$u4>c++3@>TE3k@DVo;V)l{) zH-=-=x?NB0k7uW54TconRhcKKN+@gIZ)YtmqMq^yUsmpsrr2CmeKYtGwSI$ZUH0ek z3ko4pWY%@*Wu>!+%T!*_Cr0=^OvS%yI|FtUoZuGklHW$)n0+(G$@|;rwOMx7TRI;I zA4F4J@r10^`0I|;VC9KPl--HJ;2$^~>GuC&D+t`*A-~o9L;@?v@LNbJT{G zsiopB^4tY31k=Kwla!OmUAwyMp z{h1W^hmy4qB@D9zOU!1!gMk)=NG@Vb*bVRIYdggbkJL0QTB;Ea-tixBGeiIBat-RQ87qE1jOQqhV`QnV7^jGwPzL-IQuCnp$jP@xIm> z&4gBgznHBUkZA`ppr5=o@pPLjj4n_C9|9BX8X$Qxi;X4{0ircQZBO@3`8jsR(}R#L zOeDs{1gIOq)VTa)19P*p6$8B4xMV2Z8U;ZJMLs3OfgbU#MYq=blp=Qh28wX;?a_{*q>UO0=?NDUd*uV8QfIn?#cf_s`VT1WC%Gxof(U>aQEv+nd`1 zVd4g>rs?gprZNyKxn?k~pxC?!>Iu}2GuQ2ySKUqo^(pbd9#THG9@l3{j9HR05#2^a zj~?Z$QPXkYD?fpw$%APHrbwIx@bb(#`t|;9HJ#Wy+*15Yayy%S;_TQU9a!?QQIo|2biOuZI2T{H-pOr7cZshBP`i$Uk1TP@#dPQuVlADK%926T9KB#~3xmbQUJYs11ioK_mX^vET z%N+bz9DzaXu8*buYAxt}HJ-3TR{sp;Y@@Eo;70QaF@ITHgnah>O61;h-`O;xw$W=q zA}@fEFU32ClCaNYbjh37u)wgqm|RF0y9*)c3Z*zN&`oKkLnho}4=)UcSN5|8LhM9L)c z#HifVdPpTMF)1yl4ILDA?b>Ghp?llI))B=?wTpf=8vyGr#5nsO;S-%N%18cvd@ zZ zVFi<#tAEDKt*aKUkMM5fm6ZVSGhLOrq@bo;iNF{!>c&t|> zj7ampPmq3K1j7vMu7j`VgH@H+^}JY7Y>YpAZ9UqI%cP@s-^H+`gyzpPGb5vbW!0L4 z8*DYVwZvS>!Z~AyjWpO}(Sn^lpn*Gi?B)t@R3-1#%Ozd&)d7vZbdf_0`f&ycah1Q* zU|k#GL4(%oOxuUQG2+59@9Y1up{s5WroiXD2I~O=u58g0+I{p!`weva9GmsSgsw?i zPo5Ya!<O5%OKkIjD@$ lfzRuKqps3CZS`Jk>c%GRX>e>2GIG=nen? diff --git a/theme/default.go b/theme/default.go index e953f7e..f7f6410 100644 --- a/theme/default.go +++ b/theme/default.go @@ -14,7 +14,7 @@ import "git.tebibyte.media/sashakoshka/tomo/artist/patterns" //go:embed assets/wintergreen.png var defaultAtlasBytes []byte var defaultAtlas canvas.Canvas -var defaultTextures [8][10]artist.Pattern +var defaultTextures [13][10]artist.Pattern func atlasCell (col, row int, border artist.Inset) { bounds := image.Rect(0, 0, 16, 16).Add(image.Pt(col, row).Mul(16)) @@ -37,19 +37,30 @@ func init () { // PatternDead atlasCol(0, artist.Inset { }) // PatternRaised - atlasCol(1, artist.Inset { 6, 6, 6, 6 }) // broken + atlasCol(1, artist.Inset { 6, 6, 6, 6 }) // PatternSunken atlasCol(2, artist.Inset { 4, 4, 4, 4 }) // PatternPinboard atlasCol(3, artist.Inset { 2, 2, 2, 2 }) // PatternButton - atlasCol(4, artist.Inset { 6, 6, 6, 6 }) // broken + atlasCol(4, artist.Inset { 6, 6, 6, 6 }) // PatternInput atlasCol(5, artist.Inset { 4, 4, 4, 4 }) // PatternGutter atlasCol(6, artist.Inset { 4, 4, 4, 4 }) // PatternHandle - atlasCol(7, artist.Inset { 6, 6, 6, 6 }) // broken + atlasCol(7, artist.Inset { 6, 6, 6, 6 }) + // PatternLine + atlasCol(8, artist.Inset { 1, 1, 1, 1 }) + + // PatternButton: basic.checkbox + atlasCol(9, artist.Inset { 3, 3, 3, 3 }) + // PatternRaised: basic.listEntry + atlasCol(10, artist.Inset { 3, 3, 3, 3 }) + // PatternRaised: fun.flatKey + atlasCol(11, artist.Inset { 3, 3, 5, 3 }) + // PatternRaised: fun.sharpKey + atlasCol(12, artist.Inset { 3, 3, 4, 3 }) } // Default is the default theme. @@ -93,13 +104,25 @@ func (Default) Pattern (id Pattern, state State, c Case) artist.Pattern { switch id { case PatternBackground: return patterns.Uhex(0xaaaaaaFF) case PatternDead: return defaultTextures[0][offset] - case PatternRaised: return defaultTextures[1][offset] + case PatternRaised: + if c == C("basic", "listEntry") { + return defaultTextures[10][offset] + } else { + return defaultTextures[1][offset] + } case PatternSunken: return defaultTextures[2][offset] case PatternPinboard: return defaultTextures[3][offset] - case PatternButton: return defaultTextures[4][offset] + case PatternButton: + switch c { + case C("basic", "checkbox"): return defaultTextures[9][offset] + case C("fun", "flatKey"): return defaultTextures[11][offset] + case C("fun", "sharpKey"): return defaultTextures[12][offset] + default: return defaultTextures[4][offset] + } case PatternInput: return defaultTextures[5][offset] case PatternGutter: return defaultTextures[6][offset] case PatternHandle: return defaultTextures[7][offset] + case PatternLine: return defaultTextures[8][offset] default: return patterns.Uhex(0xFF00FFFF) } } @@ -119,13 +142,26 @@ func (Default) Color (id Color, state State, c Case) color.RGBA { // Padding returns the default padding value for the given pattern. func (Default) Padding (id Pattern, c Case) artist.Inset { switch id { + case PatternRaised: + if c == C("basic", "listEntry") { + return artist.Inset { 4, 4, 4, 4 } + } else { + return artist.Inset { 8, 8, 8, 8 } + } case PatternSunken: if c == C("basic", "list") { + return artist.Inset { 3, 3, 3, 3 } + } else { + return artist.Inset { 8, 8, 8, 8 } + } + case PatternPinboard: + if c == C("fun", "piano") { return artist.Inset { 2, 2, 2, 2 } } else { return artist.Inset { 8, 8, 8, 8 } } case PatternGutter: return artist.Inset { } + case PatternLine: return artist.Inset { 1, 1, 1, 1 } default: return artist.Inset { 8, 8, 8, 8 } } } diff --git a/theme/theme.go b/theme/theme.go index b5ca38b..64a70f5 100644 --- a/theme/theme.go +++ b/theme/theme.go @@ -47,6 +47,9 @@ type Pattern int; const ( // PatternHandle is a handle that slides along a gutter. PatternHandle + + // PatternLine is an engraved line that separates things. + PatternLine ) type Color int; const (