mirror of
https://github.com/lil-org/tokenary.git
synced 2024-12-02 09:33:49 +03:00
Better windows management
This commit is contained in:
parent
5ad2750b9b
commit
ff9e0501bd
@ -3,29 +3,42 @@
|
|||||||
import Cocoa
|
import Cocoa
|
||||||
|
|
||||||
class Agent {
|
class Agent {
|
||||||
|
|
||||||
private var connectivity: NearbyConnectivity!
|
private var connectivity: NearbyConnectivity!
|
||||||
|
|
||||||
func start() {
|
func start() {
|
||||||
connectivity = NearbyConnectivity(delegate: self)
|
connectivity = NearbyConnectivity(delegate: self)
|
||||||
|
showInitialScreen(onAppStart: true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func reopen() {
|
||||||
|
showInitialScreen(onAppStart: false)
|
||||||
|
}
|
||||||
|
|
||||||
|
func showInitialScreen(onAppStart: Bool) {
|
||||||
|
let windowController: NSWindowController
|
||||||
|
if onAppStart, let currentWindowController = Window.current {
|
||||||
|
windowController = currentWindowController
|
||||||
|
Window.activate(windowController)
|
||||||
|
} else {
|
||||||
|
windowController = Window.showNew()
|
||||||
|
}
|
||||||
|
|
||||||
|
let accounts = AccountsService.getAccounts()
|
||||||
|
if !accounts.isEmpty {
|
||||||
|
windowController.contentViewController = AccountsListViewController.with(preloadedAccounts: accounts)
|
||||||
|
} else {
|
||||||
|
windowController.contentViewController = instantiate(ImportViewController.self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func showScreen() { // TODO: make private
|
|
||||||
NSApplication.shared.windows.forEach { $0.close() }
|
|
||||||
let storyboard = NSStoryboard(name: "Main", bundle: nil)
|
|
||||||
let windowController = storyboard.instantiateInitialController() as? NSWindowController
|
|
||||||
windowController?.showWindow(nil)
|
|
||||||
NSApp.activate(ignoringOtherApps: true)
|
|
||||||
windowController?.window?.makeKeyAndOrderFront(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Agent: NearbyConnectivityDelegate {
|
extension Agent: NearbyConnectivityDelegate {
|
||||||
|
|
||||||
func didFind(link: String) {
|
func didFind(link: String) {
|
||||||
globalLink = link
|
globalLink = link
|
||||||
showScreen()
|
// showScreen() // TODO: should show account selection
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -13,11 +13,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
|||||||
|
|
||||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||||
agent.start()
|
agent.start()
|
||||||
showScreen()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
|
func applicationShouldHandleReopen(_ sender: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
|
||||||
showScreen()
|
agent.reopen()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,7 +4,13 @@ import Cocoa
|
|||||||
|
|
||||||
class AccountsListViewController: NSViewController {
|
class AccountsListViewController: NSViewController {
|
||||||
|
|
||||||
private var accounts = AccountsService.getAccounts()
|
private var accounts = [Account]()
|
||||||
|
|
||||||
|
static func with(preloadedAccounts: [Account]) -> AccountsListViewController {
|
||||||
|
let new = instantiate(AccountsListViewController.self)
|
||||||
|
new.accounts = preloadedAccounts
|
||||||
|
return new
|
||||||
|
}
|
||||||
|
|
||||||
@IBOutlet weak var titleLabel: NSTextField!
|
@IBOutlet weak var titleLabel: NSTextField!
|
||||||
@IBOutlet weak var tableView: NSTableView! {
|
@IBOutlet weak var tableView: NSTableView! {
|
||||||
@ -21,12 +27,15 @@ class AccountsListViewController: NSViewController {
|
|||||||
menu.addItem(NSMenuItem(title: "Copy address", action: #selector(didClickCopyAddress(_:)), keyEquivalent: ""))
|
menu.addItem(NSMenuItem(title: "Copy address", action: #selector(didClickCopyAddress(_:)), keyEquivalent: ""))
|
||||||
menu.addItem(NSMenuItem(title: "Remove account", action: #selector(didClickRemoveAccount(_:)), keyEquivalent: ""))
|
menu.addItem(NSMenuItem(title: "Remove account", action: #selector(didClickRemoveAccount(_:)), keyEquivalent: ""))
|
||||||
tableView.menu = menu
|
tableView.menu = menu
|
||||||
|
|
||||||
|
if accounts.isEmpty {
|
||||||
|
accounts = AccountsService.getAccounts()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func addButtonTapped(_ sender: NSButton) {
|
@IBAction func addButtonTapped(_ sender: NSButton) {
|
||||||
if let importViewController = storyboard?.instantiateController(withIdentifier: "ImportViewController") as? ImportViewController {
|
let importViewController = instantiate(ImportViewController.self)
|
||||||
view.window?.contentViewController = importViewController
|
view.window?.contentViewController = importViewController
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func didClickCopyAddress(_ sender: AnyObject) {
|
@objc private func didClickCopyAddress(_ sender: AnyObject) {
|
||||||
|
@ -693,13 +693,10 @@
|
|||||||
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
|
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
|
||||||
</connections>
|
</connections>
|
||||||
</window>
|
</window>
|
||||||
<connections>
|
|
||||||
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
|
|
||||||
</connections>
|
|
||||||
</windowController>
|
</windowController>
|
||||||
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="75" y="253.5"/>
|
<point key="canvasLocation" x="-220" y="740"/>
|
||||||
</scene>
|
</scene>
|
||||||
<!--Import View Controller-->
|
<!--Import View Controller-->
|
||||||
<scene sceneID="hIz-AP-VOD">
|
<scene sceneID="hIz-AP-VOD">
|
||||||
@ -793,11 +790,11 @@ DQ
|
|||||||
<objects>
|
<objects>
|
||||||
<viewController storyboardIdentifier="AccountsListViewController" id="29s-Rd-OUf" customClass="AccountsListViewController" customModule="Encrypted_Ink" customModuleProvider="target" sceneMemberID="viewController">
|
<viewController storyboardIdentifier="AccountsListViewController" id="29s-Rd-OUf" customClass="AccountsListViewController" customModule="Encrypted_Ink" customModuleProvider="target" sceneMemberID="viewController">
|
||||||
<view key="view" id="Yjc-Zm-uZY">
|
<view key="view" id="Yjc-Zm-uZY">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="251" height="350"/>
|
<rect key="frame" x="0.0" y="0.0" width="250" height="350"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="dkh-kG-EFj">
|
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="dkh-kG-EFj">
|
||||||
<rect key="frame" x="54" y="292" width="144" height="34"/>
|
<rect key="frame" x="53" y="292" width="144" height="34"/>
|
||||||
<textFieldCell key="cell" controlSize="large" selectable="YES" alignment="center" title="Accounts" id="9No-vQ-vBK">
|
<textFieldCell key="cell" controlSize="large" selectable="YES" alignment="center" title="Accounts" id="9No-vQ-vBK">
|
||||||
<font key="font" metaFont="systemHeavy" size="29"/>
|
<font key="font" metaFont="systemHeavy" size="29"/>
|
||||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||||
@ -805,12 +802,12 @@ DQ
|
|||||||
</textFieldCell>
|
</textFieldCell>
|
||||||
</textField>
|
</textField>
|
||||||
<scrollView autohidesScrollers="YES" horizontalLineScroll="40" horizontalPageScroll="10" verticalLineScroll="40" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="7bs-Kr-ija">
|
<scrollView autohidesScrollers="YES" horizontalLineScroll="40" horizontalPageScroll="10" verticalLineScroll="40" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" horizontalScrollElasticity="none" translatesAutoresizingMaskIntoConstraints="NO" id="7bs-Kr-ija">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="251" height="272"/>
|
<rect key="frame" x="0.0" y="0.0" width="250" height="272"/>
|
||||||
<clipView key="contentView" id="RjU-hi-SHx">
|
<clipView key="contentView" ambiguous="YES" id="RjU-hi-SHx">
|
||||||
<rect key="frame" x="1" y="1" width="249" height="270"/>
|
<rect key="frame" x="1" y="1" width="248" height="270"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<subviews>
|
<subviews>
|
||||||
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="40" rowSizeStyle="automatic" viewBased="YES" id="glA-FK-Kdd">
|
<tableView verticalHuggingPriority="750" ambiguous="YES" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowHeight="40" rowSizeStyle="automatic" viewBased="YES" id="glA-FK-Kdd">
|
||||||
<rect key="frame" x="0.0" y="0.0" width="249" height="270"/>
|
<rect key="frame" x="0.0" y="0.0" width="249" height="270"/>
|
||||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||||
<size key="intercellSpacing" width="17" height="0.0"/>
|
<size key="intercellSpacing" width="17" height="0.0"/>
|
||||||
@ -872,6 +869,9 @@ DQ
|
|||||||
</tableView>
|
</tableView>
|
||||||
</subviews>
|
</subviews>
|
||||||
</clipView>
|
</clipView>
|
||||||
|
<constraints>
|
||||||
|
<constraint firstAttribute="width" constant="250" id="zxW-2l-wsU"/>
|
||||||
|
</constraints>
|
||||||
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="IT1-B8-OHF">
|
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="IT1-B8-OHF">
|
||||||
<rect key="frame" x="-100" y="-100" width="238" height="16"/>
|
<rect key="frame" x="-100" y="-100" width="238" height="16"/>
|
||||||
<autoresizingMask key="autoresizingMask"/>
|
<autoresizingMask key="autoresizingMask"/>
|
||||||
@ -882,7 +882,7 @@ DQ
|
|||||||
</scroller>
|
</scroller>
|
||||||
</scrollView>
|
</scrollView>
|
||||||
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ngQ-Bn-Kwd">
|
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ngQ-Bn-Kwd">
|
||||||
<rect key="frame" x="206" y="299" width="33" height="21"/>
|
<rect key="frame" x="205" y="299" width="33" height="21"/>
|
||||||
<buttonCell key="cell" type="inline" bezelStyle="inline" image="plus" catalog="system" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" id="JVh-da-a0h">
|
<buttonCell key="cell" type="inline" bezelStyle="inline" image="plus" catalog="system" imagePosition="only" alignment="center" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" id="JVh-da-a0h">
|
||||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||||
<font key="font" metaFont="systemBold" size="21"/>
|
<font key="font" metaFont="systemBold" size="21"/>
|
||||||
@ -911,7 +911,7 @@ DQ
|
|||||||
</viewController>
|
</viewController>
|
||||||
<customObject id="JTb-7y-Jwq" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
<customObject id="JTb-7y-Jwq" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||||
</objects>
|
</objects>
|
||||||
<point key="canvasLocation" x="400" y="740"/>
|
<point key="canvasLocation" x="380" y="740"/>
|
||||||
</scene>
|
</scene>
|
||||||
</scenes>
|
</scenes>
|
||||||
<resources>
|
<resources>
|
||||||
|
@ -33,14 +33,12 @@ class ImportViewController: NSViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func showAccountsList() {
|
private func showAccountsList() {
|
||||||
if let accounts = storyboard?.instantiateController(withIdentifier: "AccountsListViewController") as? AccountsListViewController {
|
let accountsListViewController = instantiate(AccountsListViewController.self)
|
||||||
view.window?.contentViewController = accounts
|
view.window?.contentViewController = accountsListViewController
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func cancelButtonTapped(_ sender: NSButton) {
|
@IBAction func cancelButtonTapped(_ sender: NSButton) {
|
||||||
showAccountsList()
|
showAccountsList()
|
||||||
// TODO: in some cases should close the window
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,19 @@ import Cocoa
|
|||||||
|
|
||||||
struct Window {
|
struct Window {
|
||||||
|
|
||||||
|
static func showNew() -> NSWindowController {
|
||||||
|
closeAll()
|
||||||
|
let windowController = new
|
||||||
|
activate(windowController)
|
||||||
|
return windowController
|
||||||
|
}
|
||||||
|
|
||||||
|
static func activate(_ windowController: NSWindowController) {
|
||||||
|
windowController.showWindow(nil)
|
||||||
|
NSApp.activate(ignoringOtherApps: true)
|
||||||
|
windowController.window?.makeKeyAndOrderFront(nil)
|
||||||
|
}
|
||||||
|
|
||||||
static func closeAll() {
|
static func closeAll() {
|
||||||
NSApplication.shared.windows.forEach { $0.close() }
|
NSApplication.shared.windows.forEach { $0.close() }
|
||||||
}
|
}
|
||||||
@ -14,4 +27,20 @@ struct Window {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static var current: NSWindowController? {
|
||||||
|
return NSApplication.shared.windows.first?.windowController
|
||||||
|
}
|
||||||
|
|
||||||
|
static var new: NSWindowController {
|
||||||
|
return NSStoryboard.main.instantiateInitialController() as! NSWindowController
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension NSStoryboard {
|
||||||
|
static let main = NSStoryboard(name: "Main", bundle: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func instantiate<ViewController: NSViewController>(_ type: ViewController.Type) -> ViewController {
|
||||||
|
return NSStoryboard.main.instantiateController(withIdentifier: String(describing: type)) as! ViewController
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user