Skip to content

Commit f21169e

Browse files
committed
🐛 Fix: Changing text display properties does not update the project's saved flag
1 parent 022d92b commit f21169e

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

src/components/textDisplayElementPanel.svelte

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
1-
<script lang="ts" context="module">
2-
import { TextDisplay } from '../outliner/textDisplay'
3-
import { events } from '../util/events'
4-
import { Valuable } from '../util/stores'
1+
<script lang="ts">
52
import { CodeJar } from '@novacbn/svelte-codejar'
3+
import { onDestroy } from 'svelte'
4+
import { type Unsubscriber } from 'svelte/store'
65
import {
7-
TEXT_DISPLAY_WIDTH_SLIDER,
8-
TEXT_DISPLAY_BACKGROUND_COLOR_PICKER,
9-
TEXT_DISPLAY_SHADOW_TOGGLE,
106
TEXT_DISPLAY_ALIGNMENT_SELECT,
7+
TEXT_DISPLAY_BACKGROUND_COLOR_PICKER,
118
TEXT_DISPLAY_SEE_THROUGH_TOGGLE,
9+
TEXT_DISPLAY_SHADOW_TOGGLE,
10+
TEXT_DISPLAY_WIDTH_SLIDER,
1211
} from '../interface/panel/textDisplayElement'
12+
import { TextDisplay } from '../outliner/textDisplay'
13+
import { events } from '../util/events'
1314
import { floatToHex } from '../util/misc'
15+
import { Valuable } from '../util/stores'
1416
import { translate } from '../util/translation'
1517
1618
function highlight(code: string, syntax?: string) {
1719
if (!syntax) return code
1820
return Prism.highlight(code, Prism.languages[syntax], syntax)
1921
}
20-
</script>
2122
22-
<script lang="ts">
23+
let lastSelected: TextDisplay | undefined
2324
let selected = TextDisplay.selected.at(0)
2425
2526
// @ts-expect-error
2627
let text = selected?._text ?? new Valuable('')
28+
let lastText: string | undefined = selected?.text
2729
// @ts-expect-error
2830
let error = selected?._textError ?? new Valuable('')
2931
@@ -34,12 +36,18 @@
3436
let seeThroughSlot: HTMLDivElement
3537
let codeJar: CodeJar
3638
37-
events.UPDATE_SELECTION.subscribe(() => {
39+
let unsubFromText: Unsubscriber | undefined
40+
41+
const unsubFromEvent = events.UPDATE_SELECTION.subscribe(() => {
42+
unsubFromText?.()
43+
44+
lastSelected = selected
3845
selected = TextDisplay.selected.at(0)
3946
if (!selected) return
4047
// This might be a bit hacky, but svelte seems to handle it fine.
4148
// @ts-ignore
4249
text = selected._text
50+
lastText = selected.text
4351
error = selected.textError
4452
4553
// Force the inputs to update
@@ -49,6 +57,18 @@
4957
TEXT_DISPLAY_SHADOW_TOGGLE.set(selected.shadow)
5058
TEXT_DISPLAY_ALIGNMENT_SELECT.set(selected.align)
5159
TEXT_DISPLAY_SEE_THROUGH_TOGGLE.set(selected.seeThrough)
60+
61+
unsubFromText = text.subscribe(value => {
62+
if (!Project) return
63+
if (lastSelected !== selected || lastSelected === undefined) {
64+
lastSelected = selected
65+
return
66+
}
67+
if (lastText === value) return
68+
console.log('Text changed')
69+
lastText = value
70+
Project.saved = false
71+
})
5272
})
5373
5474
requestAnimationFrame(() => {
@@ -65,6 +85,11 @@
6585
codeJar.$$.ctx[0].style.overflowWrap = 'unset'
6686
codeJar.$$.ctx[0].style.whiteSpace = 'nowrap'
6787
}
88+
89+
onDestroy(() => {
90+
unsubFromEvent()
91+
unsubFromText?.()
92+
})
6893
</script>
6994

7095
<p class="panel_toolbar_label label" style={!!selected ? '' : 'visibility:hidden; height: 0px;'}>

src/interface/panel/textDisplayElement.ts

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ export const TEXT_DISPLAY_WIDTH_SLIDER = new NumSlider(
3232
return selected.lineWidth
3333
},
3434
change(value) {
35+
if (!Project) return
3536
const selected = TextDisplay.selected[0]
3637
if (!selected) return
37-
selected.lineWidth = Math.clamp(value(selected.lineWidth), 1, 10000)
38+
const newLineWidth = Math.clamp(value(selected.lineWidth), 1, 10000)
39+
if (selected.lineWidth === newLineWidth) return
40+
selected.lineWidth = newLineWidth
41+
Project.saved = false
3842
},
3943
}
4044
)
@@ -70,10 +74,16 @@ TEXT_DISPLAY_BACKGROUND_COLOR_PICKER.change = function (
7074
this: ColorPicker,
7175
color: InstanceType<typeof tinycolor>
7276
) {
77+
if (!Project) return this
7378
const selected = TextDisplay.selected[0]
7479
if (!selected) return this
75-
selected.backgroundColor = color.toHexString()
76-
selected.backgroundAlpha = color.getAlpha()
80+
const newBackground = color.toHexString()
81+
const newAlpha = color.getAlpha()
82+
if (selected.backgroundColor === newBackground && selected.backgroundAlpha === newAlpha)
83+
return this
84+
selected.backgroundColor = newBackground
85+
selected.backgroundAlpha = newAlpha
86+
Project!.saved = false
7787
return this
7888
}
7989

@@ -86,11 +96,14 @@ export const TEXT_DISPLAY_SHADOW_TOGGLE = new Toggle(`${PACKAGE.name}:textDispla
8696
//
8797
},
8898
onChange() {
99+
if (!Project) return
89100
const scope = TEXT_DISPLAY_SHADOW_TOGGLE
90101
scope.setIcon(scope.value ? 'check_box' : 'check_box_outline_blank')
91102
const selected = TextDisplay.selected[0]
92103
if (!selected) return
104+
if (selected.shadow === TEXT_DISPLAY_SHADOW_TOGGLE.value) return
93105
selected.shadow = TEXT_DISPLAY_SHADOW_TOGGLE.value
106+
Project!.saved = false
94107
},
95108
})
96109
TEXT_DISPLAY_SHADOW_TOGGLE.set = function (value) {
@@ -144,11 +157,14 @@ export const TEXT_DISPLAY_SEE_THROUGH_TOGGLE = new Toggle(
144157
//
145158
},
146159
onChange() {
160+
if (!Project) return
147161
const scope = TEXT_DISPLAY_SEE_THROUGH_TOGGLE
148162
scope.setIcon(scope.value ? 'check_box' : 'check_box_outline_blank')
149163
const selected = TextDisplay.selected[0]
150164
if (!selected) return
165+
if (selected.seeThrough === TEXT_DISPLAY_SEE_THROUGH_TOGGLE.value) return
151166
selected.seeThrough = TEXT_DISPLAY_SEE_THROUGH_TOGGLE.value
167+
Project!.saved = false
152168
},
153169
}
154170
)

0 commit comments

Comments
 (0)