//
// DocHubControllers.swift
// DocHub
//
// Created by Tristan Juricek on 6/10/14.
// Copyright (c) 2014 Perforce. All rights reserved.
//
import Foundation
import AppKit
// The controller deals with nearly all "application" events from the different
// views, well, since there's really only supposed to be one window.
class DocHubController : NSObject, NSApplicationDelegate, NSSplitViewDelegate,
LibraryViewDelegate {
var window: NSWindow
var mainSplitView: NSSplitView
var librarySourceListController: LibrarySourceListController
var libraryView: LibraryView
var navigatorController: NavigatorController
var toolbar: NSToolbar
var toolbarDelegate: DocHubToolbarDelegate?
var addPerforceController: AddPerforceController? = nil
let docHubLocation = DocHubLocation()
init() {
let winRect = NSRect(x: 50, y: 150, width: 1024, height: 800)
window = NSWindow(contentRect: winRect,
styleMask: NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask,
backing: NSBackingStoreType.Buffered,
defer: false)
mainSplitView = NSSplitView(frame: NSRect(x:0, y:0, width: 1024, height:800))
librarySourceListController = LibrarySourceListController(nibName: "LibrarySourceListView", bundle: nil, docHubLocation: docHubLocation)
libraryView = LibraryView(frame: NSRect(x: 0, y: 0, width: 200, height:800),
sourceList: librarySourceListController.view)
navigatorController = NavigatorController(nibName: "NavigatorView",
bundle: nil, docHubLocation: docHubLocation)
toolbar = NSToolbar(identifier: "DocHubToolbar")
super.init()
libraryView.delegate = self
}
func applicationDidFinishLaunching(aNotification: NSNotification?) {
docHubLocation.areaObserver.listeners.append({ self.areaChanged($0) })
docHubLocation.directoryObserver.listeners.append({ self.directoryChanged($0) })
toolbarDelegate = DocHubToolbarDelegate(mainController:self)
toolbar.delegate = toolbarDelegate
toolbar.sizeMode = NSToolbarSizeMode.Regular
toolbar.displayMode = NSToolbarDisplayMode.IconOnly
window.toolbar = toolbar
let libraryItem = toolbar.items
.findFirst({ $0.itemIdentifier == DocHubLibraryToolbarItemIdentifier })
as DocHubToolbarDelegate.LibraryItem
libraryItem.selected = true
mainSplitView.dividerStyle = NSSplitViewDividerStyle.Thin
mainSplitView.vertical = true
mainSplitView.delegate = self
mainSplitView.autoresizingMask = NSAutoresizingMaskOptions.ViewHeightSizable |
NSAutoresizingMaskOptions.ViewWidthSizable
mainSplitView.addSubview(libraryView)
mainSplitView.addSubview(navigatorController.view)
window.contentView.addSubview(mainSplitView)
window.title = NSLocalizedString("Document Hub", comment:"window.title")
window.makeKeyAndOrderFront(self)
mainSplitView.setPosition(200, ofDividerAtIndex: 0)
}
func areaChanged(area:Area) {
window.title = "\(area.library.name): \(area.name)"
}
func directoryChanged(directory:Directory) {
window.title = "\(directory.area.library.name): \(directory.name)"
}
func applicationWillTerminate(aNotification: NSNotification?) {
// Insert code here to tear down your application
}
func toggleLibrary() {
let isCollapsed = mainSplitView.isSubviewCollapsed(libraryView)
if isCollapsed {
uncollapseLibrary()
} else {
collapseLibrary()
}
}
func uncollapseLibrary() {
mainSplitView.setPosition(200, ofDividerAtIndex: 0)
libraryView.hidden = false
let libraryItem = toolbar.items
.findFirst({ $0.itemIdentifier == DocHubLibraryToolbarItemIdentifier })
as DocHubToolbarDelegate.LibraryItem
libraryItem.selected = true
}
func collapseLibrary() {
mainSplitView.setPosition(0, ofDividerAtIndex: 0)
libraryView.hidden = true
let libraryItem = toolbar.items
.findFirst({ $0.itemIdentifier == DocHubLibraryToolbarItemIdentifier })
as DocHubToolbarDelegate.LibraryItem
libraryItem.selected = false
}
func splitView(splitView: NSSplitView!,
canCollapseSubview subview: NSView!) -> Bool {
return subview === libraryView
}
func splitView(splitView: NSSplitView!,
shouldCollapseSubview subview: NSView!,
forDoubleClickOnDividerAtIndex dividerIndex: Int) -> Bool {
return dividerIndex == 0
}
func addPerforceServer() {
addPerforceController = AddPerforceController(windowNibName:"AddPerforceSheet")
NSApp.beginSheet(addPerforceController!.window, modalForWindow: window,
modalDelegate: self, didEndSelector: "addPerforceServerDone",
contextInfo: nil)
}
func addPerforceServerDone() {
addPerforceController!.window.orderOut(addPerforceController!)
addPerforceController = nil
librarySourceListController.reload()
}
} | # | Change | User | Description | Committed | |
|---|---|---|---|---|---|
| #12 | 9583 | tjuricek | Set up basic directory browsing. | ||
| #11 | 9560 | tjuricek |
Setup parent reference to Library protocol, and handle using a separate model class. Adds a "library" ID to the title bar, which may make sense. |
||
| #10 | 9556 | tjuricek | Add an informal "PropertyObserver" class to set up a typed bindings system, which in turn updates the window title at the moment. | ||
| #9 | 9555 | tjuricek | Changing how the main splitter is toggled | ||
| #8 | 9553 | tjuricek |
Adjust the library toolbar icon to act like a toggle switch, similar to XCode 6's toolbar buttons. I'm not 100% sure about the placement of the left 3 buttons, so this may end up requiring a lot of custom views to be more consistent with the inconsistency that is 10.10. |
||
| #7 | 9545 | tjuricek |
Use the left column to navigate p4 servers as "libraries" with their depots as "areas". I've had to stop using the output of login -p at the moment, since it doesn't quite work with the Objective-C API in lieu of a password. |
||
| #6 | 9469 | tjuricek | Add sheet view for collecting Perforce connection information. | ||
| #5 | 9438 | tjuricek |
Updated style of the library toolbar icon to match more of the Yosemite look and feel. Removed the "back/next" buttons. We should probably use a single view for them, and bring them back when they'll actually be used. |
||
| #4 | 9433 | tjuricek | Setup the library toggle mechanism to the toolbar. | ||
| #3 | 9432 | tjuricek | Added framework for a standard toolbar. | ||
| #2 | 9420 | tjuricek |
Minimal UI framework. Lesson learned: if you're not using nibs, thou shalt access thy application as NSApplication.sharedApplication, or thy will encounter strange resizing exceptions. |
||
| #1 | 9249 | tjuricek |
Added test p4d setup, and reorganized some core code. I've decided to not use InterfaceBuilder in this project, because I don't like that the .xib files are not very easy to merge, and the object lifetimes are a bit more difficult to trace. The DocHubController will operate as the app delegate, and will create views manually. Using the gradle toolchain to setup p4d. To use, execute: ./gradlew startPerforce ./gradlew initPerforce # only needed the first time This creates the p4d that uses build/perforce/work |
||
| //guest/tjuricek/DocHub/DocHub/AppDelegate.swift | |||||
| #1 | 9229 | tjuricek |
Basic project code for a prototype Assumes p4api library is available at /usr/local/p4api |
||