Skip to content

Commit 8a9ba9c

Browse files
committed
feat(core): add workspace-window tab plumbing
1 parent df35e28 commit 8a9ba9c

6 files changed

Lines changed: 1038 additions & 108 deletions

File tree

crates/taskers-control/src/controller.rs

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,113 @@ impl InMemoryController {
145145
true,
146146
)
147147
}
148+
ControlCommand::CreateWorkspaceWindowTab {
149+
workspace_id,
150+
workspace_window_id,
151+
} => {
152+
let (workspace_window_tab_id, pane_id) =
153+
model.create_workspace_window_tab(workspace_id, workspace_window_id)?;
154+
(
155+
ControlResponse::WorkspaceWindowTabCreated {
156+
pane_id,
157+
workspace_window_tab_id,
158+
},
159+
true,
160+
)
161+
}
162+
ControlCommand::FocusWorkspaceWindowTab {
163+
workspace_id,
164+
workspace_window_id,
165+
workspace_window_tab_id,
166+
} => {
167+
model.focus_workspace_window_tab(
168+
workspace_id,
169+
workspace_window_id,
170+
workspace_window_tab_id,
171+
)?;
172+
(
173+
ControlResponse::Ack {
174+
message: "workspace window tab focused".into(),
175+
},
176+
true,
177+
)
178+
}
179+
ControlCommand::MoveWorkspaceWindowTab {
180+
workspace_id,
181+
workspace_window_id,
182+
workspace_window_tab_id,
183+
to_index,
184+
} => {
185+
model.move_workspace_window_tab(
186+
workspace_id,
187+
workspace_window_id,
188+
workspace_window_tab_id,
189+
to_index,
190+
)?;
191+
(
192+
ControlResponse::Ack {
193+
message: "workspace window tab moved".into(),
194+
},
195+
true,
196+
)
197+
}
198+
ControlCommand::TransferWorkspaceWindowTab {
199+
workspace_id,
200+
source_workspace_window_id,
201+
workspace_window_tab_id,
202+
target_workspace_window_id,
203+
to_index,
204+
} => {
205+
model.transfer_workspace_window_tab(
206+
workspace_id,
207+
source_workspace_window_id,
208+
workspace_window_tab_id,
209+
target_workspace_window_id,
210+
to_index,
211+
)?;
212+
(
213+
ControlResponse::Ack {
214+
message: "workspace window tab transferred".into(),
215+
},
216+
true,
217+
)
218+
}
219+
ControlCommand::ExtractWorkspaceWindowTab {
220+
workspace_id,
221+
source_workspace_window_id,
222+
workspace_window_tab_id,
223+
target,
224+
} => {
225+
model.extract_workspace_window_tab(
226+
workspace_id,
227+
source_workspace_window_id,
228+
workspace_window_tab_id,
229+
target,
230+
)?;
231+
(
232+
ControlResponse::Ack {
233+
message: "workspace window tab extracted".into(),
234+
},
235+
true,
236+
)
237+
}
238+
ControlCommand::CloseWorkspaceWindowTab {
239+
workspace_id,
240+
workspace_window_id,
241+
workspace_window_tab_id,
242+
} => {
243+
model.close_workspace_window_tab(
244+
workspace_id,
245+
workspace_window_id,
246+
workspace_window_tab_id,
247+
)?;
248+
(
249+
ControlResponse::Ack {
250+
message: "workspace window tab closed".into(),
251+
},
252+
true,
253+
)
254+
}
148255
ControlCommand::FocusPane {
149256
workspace_id,
150257
pane_id,

crates/taskers-control/src/protocol.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use taskers_domain::{
66
AgentTarget, AppModel, AttentionState, Direction, NotificationDeliveryState, NotificationId,
77
PaneId, PaneKind, PaneMetadataPatch, PersistedSession, ProgressState, SignalEvent, SignalKind,
88
SplitAxis, SurfaceId, WindowId, WorkspaceColumnId, WorkspaceId, WorkspaceLogEntry,
9-
WorkspaceViewport, WorkspaceWindowId, WorkspaceWindowMoveTarget,
9+
WorkspaceViewport, WorkspaceWindowId, WorkspaceWindowMoveTarget, WorkspaceWindowTabId,
1010
};
1111

1212
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -46,6 +46,39 @@ pub enum ControlCommand {
4646
workspace_window_id: WorkspaceWindowId,
4747
target: WorkspaceWindowMoveTarget,
4848
},
49+
CreateWorkspaceWindowTab {
50+
workspace_id: WorkspaceId,
51+
workspace_window_id: WorkspaceWindowId,
52+
},
53+
FocusWorkspaceWindowTab {
54+
workspace_id: WorkspaceId,
55+
workspace_window_id: WorkspaceWindowId,
56+
workspace_window_tab_id: WorkspaceWindowTabId,
57+
},
58+
MoveWorkspaceWindowTab {
59+
workspace_id: WorkspaceId,
60+
workspace_window_id: WorkspaceWindowId,
61+
workspace_window_tab_id: WorkspaceWindowTabId,
62+
to_index: usize,
63+
},
64+
TransferWorkspaceWindowTab {
65+
workspace_id: WorkspaceId,
66+
source_workspace_window_id: WorkspaceWindowId,
67+
workspace_window_tab_id: WorkspaceWindowTabId,
68+
target_workspace_window_id: WorkspaceWindowId,
69+
to_index: usize,
70+
},
71+
ExtractWorkspaceWindowTab {
72+
workspace_id: WorkspaceId,
73+
source_workspace_window_id: WorkspaceWindowId,
74+
workspace_window_tab_id: WorkspaceWindowTabId,
75+
target: WorkspaceWindowMoveTarget,
76+
},
77+
CloseWorkspaceWindowTab {
78+
workspace_id: WorkspaceId,
79+
workspace_window_id: WorkspaceWindowId,
80+
workspace_window_tab_id: WorkspaceWindowTabId,
81+
},
4982
FocusPane {
5083
workspace_id: WorkspaceId,
5184
pane_id: PaneId,
@@ -573,6 +606,10 @@ pub enum ControlResponse {
573606
WorkspaceWindowCreated {
574607
pane_id: PaneId,
575608
},
609+
WorkspaceWindowTabCreated {
610+
pane_id: PaneId,
611+
workspace_window_tab_id: WorkspaceWindowTabId,
612+
},
576613
Status {
577614
session: PersistedSession,
578615
},

crates/taskers-domain/src/ids.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ define_id!(WindowId);
4343
define_id!(WorkspaceId);
4444
define_id!(WorkspaceColumnId);
4545
define_id!(WorkspaceWindowId);
46+
define_id!(WorkspaceWindowTabId);
4647
define_id!(PaneId);
4748
define_id!(SurfaceId);
4849
define_id!(SessionId);

crates/taskers-domain/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ pub mod signal;
77
pub use attention::AttentionState;
88
pub use ids::{
99
NotificationId, PaneId, SessionId, SurfaceId, WindowId, WorkspaceColumnId, WorkspaceId,
10-
WorkspaceWindowId,
10+
WorkspaceWindowId, WorkspaceWindowTabId,
1111
};
1212
pub use layout::{Direction, LayoutNode, SplitAxis};
1313
pub use model::{
@@ -19,5 +19,6 @@ pub use model::{
1919
SESSION_SCHEMA_VERSION, SurfaceRecord, WindowFrame, WindowRecord, Workspace,
2020
WorkspaceAgentState, WorkspaceAgentSummary, WorkspaceColumnRecord, WorkspaceLogEntry,
2121
WorkspaceSummary, WorkspaceViewport, WorkspaceWindowMoveTarget, WorkspaceWindowRecord,
22+
WorkspaceWindowTabRecord,
2223
};
2324
pub use signal::{SignalEvent, SignalKind, SignalPaneMetadata};

0 commit comments

Comments
 (0)