From 5a2eea1a3d4c2e7d2bf1406aa5c976e498e149a8 Mon Sep 17 00:00:00 2001 From: John Burwell Date: Fri, 29 May 2026 18:41:25 -0500 Subject: [PATCH] Restore list selection and improve sidebar header clicks --- .../UI/List/ItemListColumnViews.swift | 17 ++++++-- .../UI/Sidebar/SidebarColumnViews.swift | 42 ++++++++++--------- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/World Manager for Minecraft/UI/List/ItemListColumnViews.swift b/World Manager for Minecraft/UI/List/ItemListColumnViews.swift index 45d283b..721a67e 100644 --- a/World Manager for Minecraft/UI/List/ItemListColumnViews.swift +++ b/World Manager for Minecraft/UI/List/ItemListColumnViews.swift @@ -50,11 +50,8 @@ struct ItemListColumnView: View { .onDrop(of: [UTType.fileURL.identifier], isTargeted: $isDropTargeted, perform: dropAction) } else { List(items, selection: $selectedItemID) { item in - ContentRowView(item: item) + ContentRowView(item: item, dragProvider: dragProvider) .tag(item.id) - .onDrag { - dragProvider(item) - } .contextMenu { itemContextMenu(item) } @@ -143,10 +140,14 @@ private struct ItemListHeaderView: View { private struct ContentRowView: View { let item: MinecraftContentItem + let dragProvider: (MinecraftContentItem) -> NSItemProvider var body: some View { HStack(alignment: .center, spacing: 10) { ItemThumbnailView(iconURL: item.iconURL) + .onDrag { + dragProvider(item) + } VStack(alignment: .leading, spacing: 4) { Text(item.displayName) @@ -164,6 +165,14 @@ private struct ContentRowView: View { ProgressView() .controlSize(.small) } + + Image(systemName: "square.and.arrow.up") + .font(.caption) + .foregroundStyle(.tertiary) + .help("Drag Out as Minecraft Package") + .onDrag { + dragProvider(item) + } } .padding(.vertical, 2) .contentShape(Rectangle()) diff --git a/World Manager for Minecraft/UI/Sidebar/SidebarColumnViews.swift b/World Manager for Minecraft/UI/Sidebar/SidebarColumnViews.swift index 245b16e..200bf91 100644 --- a/World Manager for Minecraft/UI/Sidebar/SidebarColumnViews.swift +++ b/World Manager for Minecraft/UI/Sidebar/SidebarColumnViews.swift @@ -74,6 +74,8 @@ struct SourcesSidebarView: View { @ViewBuilder private func sourceSectionRows(for source: MinecraftSource) -> some View { + let sourceFilters = filters(source) + SourceHeaderRow( source: source, isSelected: selection == .source(sourceID: source.id), @@ -96,7 +98,7 @@ struct SourcesSidebarView: View { } } - ForEach(filters(source)) { filter in + ForEach(sourceFilters) { filter in SidebarFilterRow(filter: filter, isIndented: true) .tag(filter.selection as SidebarSelection?) } @@ -154,35 +156,37 @@ private struct SourceHeaderRow: View { @State private var isHovering = false var body: some View { - HStack(spacing: 8) { - Image(systemName: headerSymbolName) - .font(.system(size: 14, weight: .semibold)) - .foregroundStyle(titleColor) + Button(action: onSelect) { + HStack(spacing: 8) { + Image(systemName: headerSymbolName) + .font(.system(size: 14, weight: .semibold)) + .foregroundStyle(titleColor) - Text(source.displayName) - .font(.subheadline.weight(.semibold)) - .foregroundStyle(titleColor) + Text(source.displayName) + .font(.subheadline.weight(.semibold)) + .foregroundStyle(titleColor) - Spacer(minLength: 8) + Spacer(minLength: 8) - if let connection { - SourceConnectionBadge(connection: connection) - } + if let connection { + SourceConnectionBadge(connection: connection) + } - if let availabilityBadgeText { - SourceAvailabilityBadge(text: availabilityBadgeText, emphasis: availabilityBadgeEmphasis) - } + if let availabilityBadgeText { + SourceAvailabilityBadge(text: availabilityBadgeText, emphasis: availabilityBadgeEmphasis) + } - if showsStatusIndicator { - statusIndicator - .frame(width: 24, height: 24) + if showsStatusIndicator { + statusIndicator + .frame(width: 24, height: 24) + } } } + .buttonStyle(.plain) .padding(.horizontal, 10) .padding(.vertical, 8) .appSidebarRowSurface(isHighlighted: isHovering && !isSelected) .contentShape(Rectangle()) - .onTapGesture(perform: onSelect) .onHover { isHovering = $0 } }