Skip to content

Commit 1529abe

Browse files
committed
Merge branch 'develop'
Signed-off-by: Pedro Lamas <[email protected]>
2 parents 5975193 + e2cf2a5 commit 1529abe

File tree

17 files changed

+1281
-66
lines changed

17 files changed

+1281
-66
lines changed

src/components/ui/AppNamedSlider.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ export default class AppNamedSlider extends Mixins(BrowserMixin) {
190190
// Apply a min and max rule as per the slider.
191191
const rules = [
192192
...this.rules || [],
193+
this.$rules.required,
193194
this.$rules.numberValid,
194195
this.$rules.numberGreaterThanOrEqual(this.min)
195196
]

src/components/ui/AppTextFieldWithCopy.vue

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838

3939
<script lang="ts">
4040
import { Component, VModel, Vue } from 'vue-property-decorator'
41+
import clipboardCopy from '@/util/clipboard-copy'
42+
import sleep from '@/util/sleep'
4143
4244
@Component({
4345
inheritAttrs: false
@@ -47,19 +49,23 @@ export default class AppTextFieldWithCopy extends Vue {
4749
inputValue!: unknown
4850
4951
hasCopied = false
52+
abortController: AbortController | null = null
5053
51-
handleCopy () {
52-
if (
53-
this.inputValue &&
54-
navigator.clipboard
55-
) {
56-
navigator.clipboard.writeText(this.inputValue.toString())
54+
async handleCopy () {
55+
if (this.inputValue) {
56+
if (await clipboardCopy(this.inputValue.toString(), this.$el)) {
57+
this.abortController?.abort()
5758
58-
this.hasCopied = true
59+
this.hasCopied = true
5960
60-
setTimeout(() => {
61-
this.hasCopied = false
62-
}, 2000)
61+
try {
62+
const abortController = this.abortController = new AbortController()
63+
64+
await sleep(2000, abortController.signal)
65+
66+
this.hasCopied = false
67+
} catch {}
68+
}
6369
}
6470
}
6571
}

src/components/widgets/thermals/HeaterContextMenu.vue

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,62 @@
99
right
1010
>
1111
<v-list dense>
12-
<v-list-item @click="$emit('pid-calibrate', heater)">
12+
<v-list-item
13+
:disabled="!klippyReady || printerPrinting"
14+
@click="$emit('turn-off', heater)"
15+
>
1316
<v-list-item-icon>
1417
<v-icon>
15-
$pidCalibrate
18+
$snowflake
1619
</v-icon>
1720
</v-list-item-icon>
1821
<v-list-item-content>
19-
<v-list-item-title>{{ $t('app.chart.label.pid_calibration') }}</v-list-item-title>
22+
<v-list-item-title>{{ $t('app.chart.label.turn_off') }}</v-list-item-title>
23+
</v-list-item-content>
24+
</v-list-item>
25+
26+
<v-divider v-if="supportsPidCalibrate || supportsMpcCalibrate" />
27+
28+
<v-list-item
29+
v-if="supportsPidCalibrate"
30+
:disabled="!klippyReady || printerPrinting"
31+
@click="$emit('pid-calibrate', heater)"
32+
>
33+
<v-list-item-icon>
34+
<v-icon>
35+
$tools
36+
</v-icon>
37+
</v-list-item-icon>
38+
<v-list-item-content>
39+
<v-list-item-title>PID_CALIBRATE</v-list-item-title>
40+
</v-list-item-content>
41+
</v-list-item>
42+
43+
<v-list-item
44+
v-if="supportsMpcCalibrate"
45+
:disabled="!klippyReady || printerPrinting"
46+
@click="$emit('mpc-calibrate', heater)"
47+
>
48+
<v-list-item-icon>
49+
<v-icon>
50+
$tools
51+
</v-icon>
52+
</v-list-item-icon>
53+
<v-list-item-content>
54+
<v-list-item-title>MPC_CALIBRATE</v-list-item-title>
2055
</v-list-item-content>
2156
</v-list-item>
2257
</v-list>
2358
</v-menu>
2459
</template>
2560

2661
<script lang="ts">
27-
import { Component, Vue, Prop, VModel } from 'vue-property-decorator'
28-
import type { Heater } from '@/store/printer/types'
62+
import { Component, Prop, VModel, Mixins } from 'vue-property-decorator'
63+
import StateMixin from '@/mixins/state'
64+
import type { Heater, KlippyApp } from '@/store/printer/types'
2965
3066
@Component({})
31-
export default class HeaterContextMenu extends Vue {
67+
export default class HeaterContextMenu extends Mixins(StateMixin) {
3268
@VModel({ type: Boolean })
3369
open?: boolean
3470
@@ -40,5 +76,20 @@ export default class HeaterContextMenu extends Vue {
4076
4177
@Prop({ type: Object, required: true })
4278
readonly heater!: Heater
79+
80+
get klippyApp (): KlippyApp {
81+
return this.$store.getters['printer/getKlippyApp'] as KlippyApp
82+
}
83+
84+
get supportsPidCalibrate () {
85+
return ['pid', 'pid_v'].includes(this.heater.config?.control)
86+
}
87+
88+
get supportsMpcCalibrate () {
89+
return (
90+
this.klippyApp.isKalicoOrDangerKlipper &&
91+
this.heater.config?.control === 'mpc'
92+
)
93+
}
4394
}
4495
</script>
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<template>
2+
<app-dialog
3+
v-model="open"
4+
:title="$t('app.chart.title.mpc_calibrate', { name: heater.prettyName })"
5+
max-width="480"
6+
@save="handleSave"
7+
>
8+
<v-card-text class="pa-0">
9+
<app-setting :title="$t('app.chart.label.target_temperature')">
10+
<v-text-field
11+
v-model.number="targetTemperature"
12+
type="number"
13+
filled
14+
dense
15+
single-line
16+
hide-details="auto"
17+
:rules="[
18+
$rules.required,
19+
$rules.numberValid,
20+
$rules.numberGreaterThan(0)
21+
]"
22+
suffix="°C"
23+
/>
24+
</app-setting>
25+
26+
<v-divider />
27+
28+
<app-setting :title="$t('app.chart.label.fan_breakpoints')">
29+
<v-text-field
30+
v-model.number="fanBreakpoints"
31+
type="number"
32+
filled
33+
dense
34+
single-line
35+
hide-details="auto"
36+
:rules="[
37+
$rules.numberValid,
38+
$rules.numberGreaterThan(0)
39+
]"
40+
/>
41+
</app-setting>
42+
</v-card-text>
43+
</app-dialog>
44+
</template>
45+
46+
<script lang="ts">
47+
import type { Heater } from '@/store/printer/types'
48+
import type { NullableOrEmpty } from '@/util/is-null-or-empty'
49+
import { Component, Vue, VModel, Prop, Watch } from 'vue-property-decorator'
50+
51+
@Component({})
52+
export default class HeaterMpcCalibrateDialog extends Vue {
53+
targetTemperature = 100
54+
fanBreakpoints: NullableOrEmpty<number> = null
55+
56+
@Watch('fanBreakpoints')
57+
onfanBreakpoints (value: string) {
58+
console.log({ value })
59+
}
60+
61+
@VModel({ type: Boolean })
62+
open?: boolean
63+
64+
@Prop({ type: Object, required: true })
65+
readonly heater!: Heater
66+
67+
handleSave () {
68+
this.$emit('save', this.heater, this.targetTemperature, this.fanBreakpoints)
69+
this.open = false
70+
}
71+
}
72+
</script>

src/components/widgets/thermals/HeaterPidCalibrateDialog.vue

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,26 @@
22
<app-dialog
33
v-model="open"
44
:title="$t('app.chart.title.pid_calibrate', { name: heater.prettyName })"
5-
max-width="320"
5+
max-width="480"
66
@save="handleSave"
77
>
8-
<v-card-text>
9-
<v-text-field
10-
v-model.number="targetTemperature"
11-
autofocus
12-
outlined
13-
:label="$t('app.chart.label.target_temperature')"
14-
:rules="[
15-
$rules.required,
16-
$rules.numberValid,
17-
$rules.numberGreaterThan(0)
18-
]"
19-
required
20-
/>
8+
<v-card-text class="pa-0">
9+
<app-setting :title="$t('app.chart.label.target_temperature')">
10+
<app-text-field
11+
v-model.number="targetTemperature"
12+
type="number"
13+
autofocus
14+
dense
15+
filled
16+
hide-details="auto"
17+
:rules="[
18+
$rules.required,
19+
$rules.numberValid,
20+
$rules.numberGreaterThan(0)
21+
]"
22+
suffix="°C"
23+
/>
24+
</app-setting>
2125
</v-card-text>
2226
</app-dialog>
2327
</template>

src/components/widgets/thermals/TemperaturePresetsMenu.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
<v-list-item @click="$emit('applyOff')">
3535
<v-list-item-icon>
3636
<v-icon color="info">
37-
$snowflakeAlert
37+
$snowflake
3838
</v-icon>
3939
</v-list-item-icon>
4040
<v-list-item-content>

0 commit comments

Comments
 (0)