Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 1 addition & 14 deletions crates/jackdaw_panels/src/tabs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,7 @@ pub struct DockTabPlugin;

impl Plugin for DockTabPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Update, (handle_dock_tab_clicks, show_close_on_hover))
.add_observer(on_close_button_click);
app.add_systems(Update, (handle_dock_tab_clicks, show_close_on_hover));
}
}

Expand Down Expand Up @@ -318,15 +317,3 @@ fn show_close_on_hover(
}
}
}

fn on_close_button_click(
trigger: On<Pointer<Click>>,
close_buttons: Query<&crate::area::DockTabCloseButton>,
mut tree: ResMut<DockTree>,
) {
let entity = trigger.event_target();
let Ok(close_btn) = close_buttons.get(entity) else {
return;
};
tree.remove_tab(close_btn.tab_id);
}
1 change: 1 addition & 0 deletions src/core_extension.rs
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,7 @@ impl JackdawExtension for JackdawCoreExtension {
crate::viewport::add_to_extension(ctx);
crate::command_palette::add_to_extension(ctx);
crate::document_ops::add_to_extension(ctx);
crate::dock_ops::add_to_extension(ctx);
}

fn register_input_context(&self, app: &mut App) {
Expand Down
66 changes: 66 additions & 0 deletions src/dock_ops.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
//! Operators for the panel docking system.

use bevy::picking::pointer::PointerButton;
use bevy::prelude::*;
use jackdaw_api::prelude::*;
use jackdaw_panels::area::{DockTab, DockTabCloseButton};
use jackdaw_panels::tree::{DockTree, TabId};

pub struct DockOpsPlugin;

impl Plugin for DockOpsPlugin {
fn build(&self, app: &mut App) {
app.add_observer(on_close_button_click)
.add_observer(on_tab_middle_click);
}
}

pub(crate) fn add_to_extension(ctx: &mut ExtensionContext) {
ctx.register_operator::<DockCloseTabOp>();
}

#[operator(
id = "dock.close_tab",
label = "Close Tab",
description = "Close the specified docked tab.",
allows_undo = false,
params(tab_id(i64, doc = "TabId of the tab to close."))
)]
pub(crate) fn dock_close_tab(
In(params): In<OperatorParameters>,
mut tree: ResMut<DockTree>,
) -> OperatorResult {
let Some(tab_id) = params.as_int("tab_id") else {
warn!("dock.close_tab: missing 'tab_id' parameter");
return OperatorResult::Cancelled;
};
tree.remove_tab(TabId(tab_id as u64));
OperatorResult::Finished
}

fn on_close_button_click(
trigger: On<Pointer<Click>>,
close_buttons: Query<&DockTabCloseButton>,
mut commands: Commands,
) {
let Ok(close_btn) = close_buttons.get(trigger.event_target()) else {
return;
};
commands
.operator(DockCloseTabOp::ID)
.param("tab_id", close_btn.tab_id.0 as i64)
.call();
}

fn on_tab_middle_click(trigger: On<Pointer<Click>>, tabs: Query<&DockTab>, mut commands: Commands) {
if trigger.event().button != PointerButton::Middle {
return;
}
let Ok(tab) = tabs.get(trigger.event_target()) else {
return;
};
commands
.operator(DockCloseTabOp::ID)
.param("tab_id", tab.tab_id.0 as i64)
.call();
}
2 changes: 2 additions & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ use std::{collections::BTreeMap, marker::PhantomData};

pub use inspector::{EditorCategory, EditorDescription, EditorHidden, SkipSerialization};
pub mod core_extension;
pub mod dock_ops;
pub mod document_ops;
pub mod ext_build;
mod extension_lifecycle;
Expand Down Expand Up @@ -313,6 +314,7 @@ impl Plugin for EditorCorePlugin {
.add_plugins(extensions_dialog::ExtensionsDialogPlugin)
.add_plugins(hot_reload::HotReloadPlugin)
.add_plugins(pie::PiePlugin)
.add_plugins(dock_ops::DockOpsPlugin)
// Force-exit on `AppExit`: bypass wgpu device cleanup
// and AsyncComputeTaskPool shutdown that otherwise hang
// the process after window close. Hosted here so every
Expand Down
Loading