Allow creating multiple window tabs
This commit is contained in:
parent
f59c43afa7
commit
6f2b98ac31
|
@ -12,46 +12,12 @@ import Combine
|
|||
|
||||
@NSApplicationMain
|
||||
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
|
||||
// var window: NSWindow!
|
||||
|
||||
var windowControllers = [BrowserWindowController]()
|
||||
|
||||
let homePage = URL(string: "gemini://gemini.circumlunar.space/")!
|
||||
// private(set) lazy var navigationManager = NavigationManager(url: homePage)
|
||||
|
||||
// private var toolbarTextField: NSTextField!
|
||||
// private var toolbarUpdater: Cancellable?
|
||||
static let homePage = URL(string: "gemini://gemini.circumlunar.space/")!
|
||||
|
||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||
// // Create the SwiftUI view that provides the window contents.
|
||||
// let contentView = ContentView(navigator: navigationManager)
|
||||
//
|
||||
// // Create the window and set the content view.
|
||||
// window = NSWindow(
|
||||
// contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
|
||||
// styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
|
||||
// backing: .buffered, defer: false)
|
||||
// window.isReleasedWhenClosed = false
|
||||
// window.center()
|
||||
// window.setFrameAutosaveName("Main Window")
|
||||
// window.contentView = NSHostingView(rootView: contentView)
|
||||
//// window.title = "Gemini"
|
||||
//// let toolbar = NSToolbar()
|
||||
//// toolbar.delegate = self
|
||||
//// toolbar.displayMode = .iconAndLabel
|
||||
//// window.toolbar = toolbar
|
||||
// window.makeKeyAndOrderFront(nil)
|
||||
//
|
||||
// toolbarTextField = NSTextField(string: navigationManager.currentURL.absoluteString)
|
||||
// toolbarTextField.delegate = self
|
||||
//
|
||||
// toolbarTextField.widthAnchor.constraint(equalToConstant: 250).isActive = true
|
||||
//
|
||||
// toolbarUpdater = navigationManager.$currentURL.sink(receiveValue: { (newValue) in
|
||||
// self.toolbarTextField.stringValue = newValue.absoluteString
|
||||
// })
|
||||
|
||||
let wc = BrowserWindowController()
|
||||
windowControllers.append(wc)
|
||||
wc.showWindow(nil)
|
||||
|
@ -60,43 +26,22 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
|||
func applicationWillTerminate(_ aNotification: Notification) {
|
||||
// Insert code here to tear down your application
|
||||
}
|
||||
|
||||
func createNewWindowTab(attachedTo existingWindow: NSWindow) {
|
||||
let wc = BrowserWindowController()
|
||||
windowControllers.append(wc)
|
||||
|
||||
if let tabGroup = existingWindow.tabGroup {
|
||||
wc.window!.setFrame(existingWindow.frame, display: false)
|
||||
tabGroup.addWindow(wc.window!)
|
||||
tabGroup.selectedWindow = wc.window!
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func newTab(_ sender: Any?) {
|
||||
if let keyWindow = windowControllers.first(where: { $0.window != nil && $0.window!.isKeyWindow })?.window {
|
||||
createNewWindowTab(attachedTo: keyWindow)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//extension AppDelegate: NSToolbarDelegate {
|
||||
// func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
// return [
|
||||
// .flexibleSpace,
|
||||
// .urlField,
|
||||
// ]
|
||||
// }
|
||||
//
|
||||
// func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] {
|
||||
// return [
|
||||
// .flexibleSpace,
|
||||
// .urlField,
|
||||
// .flexibleSpace,
|
||||
// ]
|
||||
// }
|
||||
//
|
||||
// func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? {
|
||||
// if itemIdentifier == .urlField {
|
||||
// let item = NSToolbarItem(itemIdentifier: .urlField)
|
||||
// item.label = "URL"
|
||||
// item.view = toolbarTextField
|
||||
// return item
|
||||
// } else {
|
||||
// return NSToolbarItem(itemIdentifier: .urlField)
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//extension AppDelegate: NSTextFieldDelegate {
|
||||
// func controlTextDidEndEditing(_ obj: Notification) {
|
||||
// print("did end edting, new text: '\(toolbarTextField.stringValue)'")
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//extension NSToolbarItem.Identifier {
|
||||
// static let urlField = NSToolbarItem.Identifier("GeminiUrlField")
|
||||
//}
|
||||
|
|
|
@ -14,9 +14,10 @@ class BrowserWindowController: NSWindowController {
|
|||
@IBOutlet weak var toolbar: NSToolbar!
|
||||
|
||||
private var locationTextField: NSTextField?
|
||||
private var locationUpdater: Cancellable?
|
||||
|
||||
let navigator = NavigationManager(url: URL(string: "gemini://gemini.circumlunar.space/")!)
|
||||
private var urlUpdater: Cancellable?
|
||||
|
||||
let navigator = NavigationManager(url: AppDelegate.homePage)
|
||||
|
||||
convenience init() {
|
||||
self.init(windowNibName: "BrowserWindowController")
|
||||
|
@ -27,11 +28,17 @@ class BrowserWindowController: NSWindowController {
|
|||
|
||||
contentViewController = NSHostingController(rootView: ContentView(navigator: navigator))
|
||||
|
||||
locationUpdater = navigator.$currentURL.sink(receiveValue: self.updateLocationField(_:))
|
||||
urlUpdater = navigator.$currentURL.sink(receiveValue: self.currentURLChanged(_:))
|
||||
}
|
||||
|
||||
private func updateLocationField(_ newValue: URL) {
|
||||
private func currentURLChanged(_ newValue: URL) {
|
||||
locationTextField?.stringValue = newValue.absoluteString
|
||||
|
||||
window?.title = newValue.absoluteString
|
||||
}
|
||||
|
||||
override func newWindowForTab(_ sender: Any?) {
|
||||
(NSApp.delegate as! AppDelegate).createNewWindowTab(attachedTo: window!)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
</customObject>
|
||||
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
|
||||
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="BrowserWindow" animationBehavior="default" tabbingMode="preferred" toolbarStyle="unified" titleVisibility="hidden" id="F0z-JX-Cv5">
|
||||
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" frameAutosaveName="BrowserWindow" animationBehavior="default" tabbingIdentifier="BrowserWindow" tabbingMode="preferred" toolbarStyle="unified" titleVisibility="hidden" id="F0z-JX-Cv5">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="196" y="240" width="480" height="270"/>
|
||||
|
|
Loading…
Reference in New Issue