let tunnelsManager: TunnelsManager
var tunnelsListVC: TunnelsListTableViewController?
+ var tunnelDetailVC: TunnelDetailTableViewController?
let tunnelDetailContainerView = NSView()
var tunnelDetailContentVC: NSViewController?
func tunnelSelected(tunnel: TunnelContainer) {
let tunnelDetailVC = TunnelDetailTableViewController(tunnelsManager: tunnelsManager, tunnel: tunnel)
setTunnelDetailContentVC(tunnelDetailVC)
+ self.tunnelDetailVC = tunnelDetailVC
}
func tunnelsListEmpty() {
let noTunnelsVC = NoTunnelsDetailViewController(tunnelsManager: tunnelsManager)
setTunnelDetailContentVC(noTunnelsVC)
+ self.tunnelDetailVC = nil
+ }
+}
+
+extension ManageTunnelsRootViewController {
+ override func keyDown(with event: NSEvent) {
+ let modifierFlags = event.modifierFlags.rawValue & NSEvent.ModifierFlags.deviceIndependentFlagsMask.rawValue
+ let isCmdOrCmdShiftDown = (modifierFlags == NSEvent.ModifierFlags.command.rawValue || modifierFlags == NSEvent.ModifierFlags.command.rawValue | NSEvent.ModifierFlags.shift.rawValue)
+
+ if event.specialKey == .delete {
+ tunnelsListVC?.handleRemoveTunnelAction()
+ } else if isCmdOrCmdShiftDown {
+ switch event.charactersIgnoringModifiers {
+ case "n":
+ tunnelsListVC?.handleAddEmptyTunnelAction()
+ case "i":
+ tunnelsListVC?.handleImportTunnelAction()
+ case "t":
+ tunnelDetailVC?.handleToggleActiveStatusAction()
+ case "e":
+ tunnelDetailVC?.handleEditTunnelAction()
+ default:
+ break
+ }
+ }
}
}
presentAsSheet(tunnelEditVC)
}
+ @objc func handleToggleActiveStatusAction() {
+ if tunnel.status == .inactive {
+ tunnelsManager.startActivation(of: tunnel)
+ } else if tunnel.status == .active {
+ tunnelsManager.startDeactivation(of: tunnel)
+ }
+ }
+
@objc func statusCheckboxToggled(sender: AnyObject?) {
guard let statusCheckbox = sender as? NSButton else { return }
if statusCheckbox.state == .on {