From 5097c843a6a2788329ab6b93bf204fc6706e2df4 Mon Sep 17 00:00:00 2001 From: Jarne Date: Sun, 27 Jul 2025 11:29:31 +0200 Subject: [PATCH 1/2] Add position attribute and sort feature to commands --- Commandoak/Model/Command.swift | 15 ++++++++++---- Commandoak/View/CommandsView.swift | 20 +++++++++++++++---- .../View/Menu/CommandsMenuBarView.swift | 2 +- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/Commandoak/Model/Command.swift b/Commandoak/Model/Command.swift index e6d58ef..6ccd56b 100644 --- a/Commandoak/Model/Command.swift +++ b/Commandoak/Model/Command.swift @@ -8,13 +8,20 @@ import SwiftData @Model final class Command { - var name: String - var icon: String - var execute: String + static let defaultName = "New command" + static let defaultIcon = "🕹️" + static let defaultExecute = "" + static let defaultPosition = 0 + + var name: String = defaultName + var icon: String = defaultIcon + var execute: String = defaultExecute + var position: Int = defaultPosition - init(name: String = "New command", icon: String = "🕹️", execute: String = "") { + init(name: String = defaultName, icon: String = defaultIcon, execute: String = defaultExecute, position: Int = defaultPosition) { self.name = name self.icon = icon self.execute = execute + self.position = position } } diff --git a/Commandoak/View/CommandsView.swift b/Commandoak/View/CommandsView.swift index b366231..493b0d3 100644 --- a/Commandoak/View/CommandsView.swift +++ b/Commandoak/View/CommandsView.swift @@ -8,7 +8,7 @@ import SwiftData struct CommandsView: View { @Environment(\.modelContext) private var modelContext - @Query private var commands: [Command] + @Query(sort: \Command.position) private var commands: [Command] var body: some View { NavigationSplitView { @@ -21,6 +21,7 @@ struct CommandsView: View { Text(cmd.name) } } + .onMove(perform: moveItems) .onDelete(perform: deleteItems) } .navigationSplitViewColumnWidth(min: 180, ideal: 200) @@ -38,12 +39,23 @@ struct CommandsView: View { private func addItem() { withAnimation { - let newItem = Command() - modelContext.insert(newItem) + let newCmd = Command(position: commands.count) + modelContext.insert(newCmd) + } + } + + private func moveItems(from source: IndexSet, to destination: Int) { + withAnimation { + var sortedCommands = commands + sortedCommands.move(fromOffsets: source, toOffset: destination) + + for (i, cmd) in sortedCommands.enumerated() { + cmd.position = i + } } } - private func deleteItems(offsets: IndexSet) { + private func deleteItems(at offsets: IndexSet) { withAnimation { for index in offsets { modelContext.delete(commands[index]) diff --git a/Commandoak/View/Menu/CommandsMenuBarView.swift b/Commandoak/View/Menu/CommandsMenuBarView.swift index f72a6fc..01c6aff 100644 --- a/Commandoak/View/Menu/CommandsMenuBarView.swift +++ b/Commandoak/View/Menu/CommandsMenuBarView.swift @@ -9,7 +9,7 @@ import SwiftData struct CommandsMenuBarView: View { @Environment(\.openWindow) private var openWindow - @Query private var commands: [Command] + @Query(sort: \Command.position) private var commands: [Command] var body: some View { ForEach(Array(commands.enumerated()), id: \.offset) { index, cmd in From 48a596f888152ff9472fdd7a0443b33ad3cfcbb6 Mon Sep 17 00:00:00 2001 From: Jarne Date: Sun, 27 Jul 2025 11:32:58 +0200 Subject: [PATCH 2/2] Fix code formatting lint issues --- Commandoak/Model/Command.swift | 9 +++++++-- Commandoak/View/CommandsView.swift | 8 ++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/Commandoak/Model/Command.swift b/Commandoak/Model/Command.swift index 6ccd56b..f1f947a 100644 --- a/Commandoak/Model/Command.swift +++ b/Commandoak/Model/Command.swift @@ -12,13 +12,18 @@ final class Command { static let defaultIcon = "🕹️" static let defaultExecute = "" static let defaultPosition = 0 - + var name: String = defaultName var icon: String = defaultIcon var execute: String = defaultExecute var position: Int = defaultPosition - init(name: String = defaultName, icon: String = defaultIcon, execute: String = defaultExecute, position: Int = defaultPosition) { + init( + name: String = defaultName, + icon: String = defaultIcon, + execute: String = defaultExecute, + position: Int = defaultPosition + ) { self.name = name self.icon = icon self.execute = execute diff --git a/Commandoak/View/CommandsView.swift b/Commandoak/View/CommandsView.swift index 493b0d3..0f175d4 100644 --- a/Commandoak/View/CommandsView.swift +++ b/Commandoak/View/CommandsView.swift @@ -43,14 +43,14 @@ struct CommandsView: View { modelContext.insert(newCmd) } } - + private func moveItems(from source: IndexSet, to destination: Int) { withAnimation { var sortedCommands = commands sortedCommands.move(fromOffsets: source, toOffset: destination) - - for (i, cmd) in sortedCommands.enumerated() { - cmd.position = i + + for (index, cmd) in sortedCommands.enumerated() { + cmd.position = index } } }