@@ -271,6 +271,28 @@ struct WorkspaceQueueListView: View {
271271 }
272272 }
273273
274+ /// Move selected task back to backlog
275+ private func moveSelectedToBacklog( ) {
276+ guard let task = viewModel. highlightedTask ( in: visibleTasksInOrder) ,
277+ task. taskStatus != . backlog else { return }
278+
279+ // Find next task before changing status
280+ if let currentIndex = visibleTasksInOrder. firstIndex ( where: { $0. id == task. id } ) {
281+ let nextTask = currentIndex < visibleTasksInOrder. count - 1
282+ ? visibleTasksInOrder [ currentIndex + 1 ]
283+ : ( currentIndex > 0 ? visibleTasksInOrder [ currentIndex - 1 ] : nil )
284+
285+ task. updateStatusWithUndo ( . backlog)
286+
287+ // Select next task if the current one will disappear from this view
288+ if let next = nextTask, filter != . backlog && filter != . all {
289+ selectTask ( next)
290+ }
291+ } else {
292+ task. updateStatusWithUndo ( . backlog)
293+ }
294+ }
295+
274296 /// Move selected task up in priority (lower priority number = higher in list)
275297 private func moveSelectedPriorityUp( ) {
276298 guard let task = viewModel. highlightedTask ( in: visibleTasksInOrder) else { return }
@@ -394,6 +416,7 @@ struct WorkspaceQueueListView: View {
394416 onToggleExpand: toggleSelectedTaskExpansion,
395417 onMarkComplete: markSelectedComplete,
396418 onMarkCancelled: markSelectedCancelled,
419+ onMoveToBacklog: moveSelectedToBacklog,
397420 onMovePriorityUp: moveSelectedPriorityUp,
398421 onMovePriorityDown: moveSelectedPriorityDown,
399422 onRunSelected: runHighlightedTask
@@ -630,7 +653,11 @@ struct WorkspaceQueueListView: View {
630653 onMarkCompleted: {
631654 handleTaskStatusChange ( task)
632655 task. updateStatusWithUndo ( . completed)
633- }
656+ } ,
657+ onMoveToBacklog: task. taskStatus != . backlog ? {
658+ handleTaskStatusChange ( task)
659+ task. updateStatusWithUndo ( . backlog)
660+ } : nil
634661 ) {
635662 TextField (
636663 " Note details " ,
@@ -686,7 +713,11 @@ struct WorkspaceQueueListView: View {
686713 onMarkCompleted: {
687714 handleTaskStatusChange ( task)
688715 task. updateStatusWithUndo ( . completed)
689- }
716+ } ,
717+ onMoveToBacklog: task. taskStatus != . backlog ? {
718+ handleTaskStatusChange ( task)
719+ task. updateStatusWithUndo ( . backlog)
720+ } : nil
690721 ) {
691722 TextField (
692723 " Note details " ,
@@ -1174,6 +1205,7 @@ struct TaskListKeyboardModifier: ViewModifier {
11741205 var onToggleExpand : ( ) -> Void
11751206 var onMarkComplete : ( ) -> Void
11761207 var onMarkCancelled : ( ) -> Void
1208+ var onMoveToBacklog : ( ) -> Void
11771209 var onMovePriorityUp : ( ) -> Void
11781210 var onMovePriorityDown : ( ) -> Void
11791211 var onRunSelected : ( ) -> Void
@@ -1237,6 +1269,15 @@ struct TaskListKeyboardModifier: ViewModifier {
12371269 }
12381270 return . ignored
12391271 }
1272+ . onKeyPress ( keys: [ KeyEquivalent ( " b " ) ] , phases: . down) { keyPress in
1273+ guard expandedTaskId == nil else { return . ignored }
1274+ if keyPress. modifiers == . command {
1275+ // Cmd+B: move to backlog
1276+ onMoveToBacklog ( )
1277+ return . handled
1278+ }
1279+ return . ignored
1280+ }
12401281 . onKeyPress ( keys: [ KeyEquivalent ( " a " ) ] , phases: . down) { keyPress in
12411282 if keyPress. modifiers. contains ( . command) {
12421283 onSelectAll ( )
@@ -1293,6 +1334,7 @@ struct ExpandableRow<Item: ExpandableListItem, ExpandedContent: View>: View {
12931334 var onDelete : ( ( ) -> Void ) ? = nil
12941335 var onMarkCancelled : ( ( ) -> Void ) ? = nil
12951336 var onMarkCompleted : ( ( ) -> Void ) ? = nil
1337+ var onMoveToBacklog : ( ( ) -> Void ) ? = nil
12961338 let style : ExpandableRowStyle
12971339 let expandedContent : ( ) -> ExpandedContent
12981340 @State private var isStatusHovering : Bool = false
@@ -1308,6 +1350,7 @@ struct ExpandableRow<Item: ExpandableListItem, ExpandedContent: View>: View {
13081350 onDelete: ( ( ) -> Void ) ? = nil ,
13091351 onMarkCancelled: ( ( ) -> Void ) ? = nil ,
13101352 onMarkCompleted: ( ( ) -> Void ) ? = nil ,
1353+ onMoveToBacklog: ( ( ) -> Void ) ? = nil ,
13111354 style: ExpandableRowStyle = . default,
13121355 @ViewBuilder expandedContent: @escaping ( ) -> ExpandedContent
13131356 ) {
@@ -1319,6 +1362,7 @@ struct ExpandableRow<Item: ExpandableListItem, ExpandedContent: View>: View {
13191362 self . onDelete = onDelete
13201363 self . onMarkCancelled = onMarkCancelled
13211364 self . onMarkCompleted = onMarkCompleted
1365+ self . onMoveToBacklog = onMoveToBacklog
13221366 self . style = style
13231367 self . expandedContent = expandedContent
13241368 }
@@ -1464,7 +1508,16 @@ struct ExpandableRow<Item: ExpandableListItem, ExpandedContent: View>: View {
14641508 . keyboardShortcut ( " k " , modifiers: [ . command, . option] )
14651509 }
14661510
1467- if onRun != nil || onMarkCompleted != nil || onMarkCancelled != nil {
1511+ if let onMoveToBacklog {
1512+ Button {
1513+ onMoveToBacklog ( )
1514+ } label: {
1515+ Label ( " Move to Backlog " , systemImage: " tray " )
1516+ }
1517+ . keyboardShortcut ( " b " , modifiers: . command)
1518+ }
1519+
1520+ if onRun != nil || onMarkCompleted != nil || onMarkCancelled != nil || onMoveToBacklog != nil {
14681521 Divider ( )
14691522 }
14701523
0 commit comments