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
Original file line number Diff line number Diff line change
Expand Up @@ -5,75 +5,15 @@ import Foundation
@available(macOS 13.0, *)
@MainActor
public enum CMUXSidebarExtensionBrowserPresenter {
public static func present(from anchorView: NSView, title: String) {
public static func makeViewController(title: String) -> NSViewController {
let browserViewController = EXAppExtensionBrowserViewController()
browserViewController.title = title

let browserPanel = SidebarExtensionBrowserPanel(contentViewController: browserViewController)
browserPanel.title = title
browserPanel.styleMask = [.titled, .closable, .resizable, .utilityWindow]
browserPanel.contentMinSize = NSSize(width: 560, height: 460)
browserPanel.setContentSize(NSSize(width: 760, height: 600))
browserPanel.isFloatingPanel = true
browserPanel.hidesOnDeactivate = false
browserPanel.isReleasedWhenClosed = false

if let parentWindow = anchorView.window {
browserPanel.setFrameOrigin(Self.panelOrigin(anchorView: anchorView, parentWindow: parentWindow, panel: browserPanel))
} else {
browserPanel.center()
}
BrowserPanelController.shared.show(panel: browserPanel)
}

private static func panelOrigin(anchorView: NSView, parentWindow: NSWindow, panel: NSPanel) -> NSPoint {
let anchorFrame = anchorView.convert(anchorView.bounds, to: nil)
let anchorFrameInScreen = parentWindow.convertToScreen(anchorFrame)
let visibleFrame = parentWindow.screen?.visibleFrame ?? NSScreen.main?.visibleFrame ?? .zero
let proposedX = anchorFrameInScreen.minX
let proposedY = anchorFrameInScreen.minY - panel.frame.height - 8
let x = min(max(proposedX, visibleFrame.minX + 12), visibleFrame.maxX - panel.frame.width - 12)
let y = min(max(proposedY, visibleFrame.minY + 12), visibleFrame.maxY - panel.frame.height - 12)
return NSPoint(x: x, y: y)
}
}

@available(macOS 13.0, *)
@MainActor
private final class SidebarExtensionBrowserPanel: NSPanel {
override func cancelOperation(_ sender: Any?) {
close()
return browserViewController
}

override func performKeyEquivalent(with event: NSEvent) -> Bool {
if event.modifierFlags.intersection(.deviceIndependentFlagsMask) == .command,
event.charactersIgnoringModifiers == "w" {
close()
return true
}
return super.performKeyEquivalent(with: event)
}
}

@available(macOS 13.0, *)
@MainActor
private final class BrowserPanelController: NSObject, NSWindowDelegate {
static let shared = BrowserPanelController()

private var panel: NSPanel?

func show(panel: NSPanel) {
if let existingPanel = self.panel {
existingPanel.close()
}
self.panel = panel
panel.delegate = self
panel.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
}

func windowWillClose(_ notification: Notification) {
guard let window = notification.object as? NSWindow, window === panel else { return }
self.panel = nil
@available(*, unavailable, message: "Open the extension browser through the host app pane-tab flow.")
public static func present(from anchorView: NSView, title: String) {
_ = anchorView
_ = title
}
}
216 changes: 216 additions & 0 deletions Resources/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -166126,17 +166126,125 @@
"sidebar.extensions.browser.title": {
"extractionState": "manual",
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "امتدادات الشريط الجانبي"
}
},
"bs": {
"stringUnit": {
"state": "translated",
"value": "Ekstenzije bočne trake"
}
},
"da": {
"stringUnit": {
"state": "translated",
"value": "Sidepaneludvidelser"
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "Seitenleisten-Erweiterungen"
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Sidebar Extensions"
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "Extensiones de la barra lateral"
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "Extensions de la barre latérale"
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "Estensioni della barra laterale"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サイドバー拡張機能"
}
},
"km": {
"stringUnit": {
"state": "translated",
"value": "ផ្នែកបន្ថែមរបារចំហៀង"
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "사이드바 확장 프로그램"
}
},
"nb": {
"stringUnit": {
"state": "translated",
"value": "Sidefeltutvidelser"
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "Rozszerzenia paska bocznego"
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "Extensões da barra lateral"
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "Расширения боковой панели"
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "ส่วนขยายแถบด้านข้าง"
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "Kenar çubuğu uzantıları"
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "Розширення бічної панелі"
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "侧边栏扩展"
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "側邊欄擴充功能"
}
}
}
},
Expand Down Expand Up @@ -166398,17 +166506,125 @@
"sidebar.extensions.manage": {
"extractionState": "manual",
"localizations": {
"ar": {
"stringUnit": {
"state": "translated",
"value": "إدارة امتدادات الشريط الجانبي..."
}
},
"bs": {
"stringUnit": {
"state": "translated",
"value": "Upravljaj ekstenzijama bočne trake..."
}
},
"da": {
"stringUnit": {
"state": "translated",
"value": "Administrer sidepaneludvidelser..."
}
},
"de": {
"stringUnit": {
"state": "translated",
"value": "Seitenleisten-Erweiterungen verwalten..."
}
},
"en": {
"stringUnit": {
"state": "translated",
"value": "Manage Sidebar Extensions..."
}
},
"es": {
"stringUnit": {
"state": "translated",
"value": "Administrar extensiones de la barra lateral..."
}
},
"fr": {
"stringUnit": {
"state": "translated",
"value": "Gérer les extensions de la barre latérale..."
}
},
"it": {
"stringUnit": {
"state": "translated",
"value": "Gestisci estensioni della barra laterale..."
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "サイドバー拡張機能を管理..."
}
},
"km": {
"stringUnit": {
"state": "translated",
"value": "គ្រប់គ្រងផ្នែកបន្ថែមរបារចំហៀង..."
}
},
"ko": {
"stringUnit": {
"state": "translated",
"value": "사이드바 확장 프로그램 관리..."
}
},
"nb": {
"stringUnit": {
"state": "translated",
"value": "Administrer sidefeltutvidelser..."
}
},
"pl": {
"stringUnit": {
"state": "translated",
"value": "Zarządzaj rozszerzeniami paska bocznego..."
}
},
"pt-BR": {
"stringUnit": {
"state": "translated",
"value": "Gerenciar extensões da barra lateral..."
}
},
"ru": {
"stringUnit": {
"state": "translated",
"value": "Управление расширениями боковой панели..."
}
},
"th": {
"stringUnit": {
"state": "translated",
"value": "จัดการส่วนขยายแถบด้านข้าง..."
}
},
"tr": {
"stringUnit": {
"state": "translated",
"value": "Kenar çubuğu uzantılarını yönet..."
}
},
"uk": {
"stringUnit": {
"state": "translated",
"value": "Керувати розширеннями бічної панелі..."
}
},
"zh-Hans": {
"stringUnit": {
"state": "translated",
"value": "管理侧边栏扩展..."
}
},
"zh-Hant": {
"stringUnit": {
"state": "translated",
"value": "管理側邊欄擴充功能..."
}
}
}
},
Expand Down
16 changes: 16 additions & 0 deletions Sources/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13450,6 +13450,22 @@ final class AppDelegate: NSObject, NSApplicationDelegate, UNUserNotificationCent
return panelId
}

@discardableResult
func openSidebarExtensionBrowser(from anchorView: NSView?, title: String) -> UUID? {
let preferredWindow = anchorView?.window ?? NSApp.keyWindow ?? NSApp.mainWindow
let targetTabManager = synchronizeActiveMainWindowContext(preferredWindow: preferredWindow)
guard let workspace = targetTabManager?.selectedWorkspace,
let paneId = workspace.bonsplitController.focusedPaneId ?? workspace.bonsplitController.allPaneIds.first else {
return nil
}

return workspace.newSidebarExtensionBrowserSurface(
inPane: paneId,
title: title,
focus: true
)?.id
}

private func focusBrowserAddressBar(in panel: BrowserPanel) {
#if DEBUG
let requestId = panel.requestAddressBarFocus()
Expand Down
Loading
Loading