Skip to content

Commit b1273ab

Browse files
authored
feat: configurable Klipper Save & Restart action (#1647)
Signed-off-by: Pedro Lamas <[email protected]>
1 parent 0806e5b commit b1273ab

File tree

6 files changed

+89
-25
lines changed

6 files changed

+89
-25
lines changed

src/components/settings/FileEditorSettings.vue

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88
dense
99
class="mb-4"
1010
>
11-
<app-setting
12-
:title="$t('app.setting.label.confirm_dirty_editor_close')"
13-
>
11+
<app-setting :title="$t('app.setting.label.confirm_dirty_editor_close')">
1412
<v-switch
1513
v-model="confirmDirtyEditorClose"
1614
hide-details
@@ -36,9 +34,7 @@
3634

3735
<v-divider />
3836

39-
<app-setting
40-
:title="$t('app.setting.label.save_and_restore_view_state')"
41-
>
37+
<app-setting :title="$t('app.setting.label.save_and_restore_view_state')">
4238
<v-select
4339
v-model="restoreViewState"
4440
filled
@@ -50,9 +46,7 @@
5046

5147
<v-divider />
5248

53-
<app-setting
54-
:title="$t('app.setting.label.show_code_lens')"
55-
>
49+
<app-setting :title="$t('app.setting.label.show_code_lens')">
5650
<v-switch
5751
v-model="codeLens"
5852
hide-details
@@ -62,6 +56,18 @@
6256

6357
<v-divider />
6458

59+
<app-setting :title="$t('app.setting.label.klipper_save_and_restart_action')">
60+
<v-select
61+
v-model="klipperSaveAndRestartAction"
62+
filled
63+
dense
64+
hide-details="auto"
65+
:items="availableKlipperSaveAndRestartActions"
66+
/>
67+
</app-setting>
68+
69+
<v-divider />
70+
6571
<app-setting :title="$t('app.setting.label.reset')">
6672
<app-btn
6773
outlined
@@ -80,11 +86,9 @@
8086
import { Component, Mixins } from 'vue-property-decorator'
8187
import StateMixin from '@/mixins/state'
8288
import { defaultState } from '@/store/config/state'
83-
import type { RestoreViewState } from '@/store/config/types'
89+
import type { KlipperSaveAndRestartAction, RestoreViewState } from '@/store/config/types'
8490
85-
@Component({
86-
components: {}
87-
})
91+
@Component({})
8892
export default class FileEditorSettings extends Mixins(StateMixin) {
8993
get confirmDirtyEditorClose (): boolean {
9094
return this.$typedState.config.uiSettings.editor.confirmDirtyEditorClose
@@ -153,6 +157,35 @@ export default class FileEditorSettings extends Mixins(StateMixin) {
153157
})
154158
}
155159
160+
get klipperSaveAndRestartAction (): KlipperSaveAndRestartAction {
161+
return this.$typedState.config.uiSettings.editor.klipperSaveAndRestartAction
162+
}
163+
164+
set klipperSaveAndRestartAction (value: KlipperSaveAndRestartAction) {
165+
this.$typedDispatch('config/saveByPath', {
166+
path: 'uiSettings.editor.klipperSaveAndRestartAction',
167+
value,
168+
server: true
169+
})
170+
}
171+
172+
get availableKlipperSaveAndRestartActions (): { value: KlipperSaveAndRestartAction, text: string }[] {
173+
return [
174+
{
175+
value: 'firmware-restart',
176+
text: this.$tc('app.setting.label.firmware_restart')
177+
},
178+
{
179+
value: 'host-restart',
180+
text: this.$tc('app.setting.label.host_restart')
181+
},
182+
{
183+
value: 'service-restart',
184+
text: this.$tc('app.setting.label.service_restart')
185+
}
186+
]
187+
}
188+
156189
handleReset () {
157190
this.$typedDispatch('config/saveByPath', {
158191
path: 'uiSettings.editor',

src/components/widgets/filesystem/FileSystem.vue

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ import { getFilesFromDataTransfer, hasFilesInDataTransfer } from '@/util/file-sy
153153
import { getFileDataTransferDataFromDataTransfer, hasFileDataTransferTypeInDataTransfer, setFileDataTransferDataInDataTransfer } from '@/util/file-data-transfer'
154154
import { consola } from 'consola'
155155
import type { DataTableHeader } from 'vuetify'
156+
import type { KlipperSaveAndRestartAction } from '@/store/config/types'
156157
157158
/**
158159
* Represents the filesystem, bound to moonrakers supplied roots.
@@ -912,22 +913,44 @@ export default class FileSystem extends Mixins(StateMixin, FilesMixin, ServicesM
912913
}
913914
}
914915
915-
async handleSaveFileChanges (contents: string, restart: string) {
916+
async handleSaveFileChanges (contents: string, serviceToRestart?: string) {
916917
const file = new File([contents], this.fileEditorDialogState.filename)
917-
if (!restart && this.fileEditorDialogState.open) this.fileEditorDialogState.loading = true
918+
919+
if (this.fileEditorDialogState.open) {
920+
this.fileEditorDialogState.loading = true
921+
}
918922
919923
await this.uploadFile(file, this.visiblePath, this.currentRoot, false)
924+
920925
this.fileEditorDialogState.loading = false
921-
if (restart) {
922-
if (restart === 'moonraker') {
926+
927+
switch (serviceToRestart) {
928+
case 'moonraker':
923929
this.serviceRestartMoonraker()
924-
return
925-
}
926-
if (restart === 'klipper') {
927-
this.firmwareRestartKlippy()
928-
return
930+
break
931+
932+
case 'klipper': {
933+
const klipperSaveAndRestartAction: KlipperSaveAndRestartAction = this.$typedState.config.uiSettings.editor.klipperSaveAndRestartAction
934+
935+
switch (klipperSaveAndRestartAction) {
936+
case 'host-restart':
937+
this.restartKlippy()
938+
break
939+
940+
case 'service-restart':
941+
this.serviceRestartKlipper()
942+
break
943+
944+
default:
945+
this.firmwareRestartKlippy()
946+
}
947+
break
929948
}
930-
this.serviceRestartByName(restart)
949+
950+
default:
951+
if (serviceToRestart) {
952+
this.serviceRestartByName(serviceToRestart)
953+
}
931954
}
932955
}
933956

src/locales/en.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,7 @@ app:
620620
enable_xy_homing: Enable XY Homing
621621
expression: Expression
622622
extrusion_line_width: Extrusion Line Width
623+
firmware_restart: Firmware Restart
623624
flip_horizontal: Horizontal Flip
624625
flip_vertical: Vertical Flip
625626
fill_color: Fill color
@@ -631,11 +632,13 @@ app:
631632
height: Height
632633
hide_single_part_bounding_box: Hide part bounding box when printing a single part
633634
gcode_coords: Use GCode Coordinates
635+
host_restart: Host Restart
634636
icon: Icon
635637
invert_x_control: Invert X control
636638
invert_y_control: Invert Y control
637639
invert_z_control: Invert Z control
638640
keyboard_shortcuts: Keyboard shortcuts
641+
klipper_save_and_restart_action: Klipper Save & Restart action
639642
language: Display Language
640643
last_result: Last result
641644
left_y: Left Y-Axis
@@ -661,6 +664,7 @@ app:
661664
right_y: Right Y-Axis
662665
save_and_restore_view_state: Save and restore view state
663666
sections_to_ignore_pending_configuration_changes: Sections to ignore Pending Configuration Changes
667+
service_restart: Service Restart
664668
show_animations: Show animations
665669
show_barometric_pressure: Show barometric pressure
666670
show_chart: Show chart

src/store/config/state.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ export const defaultState = (): ConfigState => {
8383
confirmDirtyEditorClose: true,
8484
autoEditExtensions: ['.cfg', '.conf', '.ini', '.log', '.sh', '.txt'],
8585
restoreViewState: 'session',
86-
codeLens: true
86+
codeLens: true,
87+
klipperSaveAndRestartAction: 'firmware-restart'
8788
},
8889
dashboard: {
8990
tempPresets: []

src/store/config/types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,14 @@ export interface ThemeLogo {
148148

149149
export type RestoreViewState = 'never' | 'session' | 'local'
150150

151+
export type KlipperSaveAndRestartAction = 'firmware-restart' | 'host-restart' | 'service-restart'
152+
151153
export interface EditorConfig {
152154
confirmDirtyEditorClose: boolean;
153155
autoEditExtensions: string[];
154156
restoreViewState: RestoreViewState,
155157
codeLens: boolean;
158+
klipperSaveAndRestartAction: KlipperSaveAndRestartAction;
156159
}
157160

158161
export interface Axis {

src/store/server/getters.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export const getters = {
7575
const instanceIds = rootState.server.system_info?.instance_ids
7676

7777
return {
78-
serviceSupported: (instanceIds && itemService in instanceIds) || getters.getServices.some((i: ServiceInfo) => i.name === itemService),
78+
serviceSupported: (instanceIds && itemService in instanceIds) || (getters.getServices as ServiceInfo[]).some(i => i.name === itemService),
7979
...item
8080
}
8181
}

0 commit comments

Comments
 (0)