diff --git a/V2rayU.xcodeproj/project.pbxproj b/V2rayU.xcodeproj/project.pbxproj index ccfc1dc..f9e74c4 100644 --- a/V2rayU.xcodeproj/project.pbxproj +++ b/V2rayU.xcodeproj/project.pbxproj @@ -8,7 +8,7 @@ /* Begin PBXBuildFile section */ 660D0E5A216E0158000C2922 /* Server.swift in Sources */ = {isa = PBXBuildFile; fileRef = 660D0E59216E0158000C2922 /* Server.swift */; }; - 6612ACC0216DB6DC00A8BF83 /* Config.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6612ACBF216DB6DC00A8BF83 /* Config.xib */; }; + 660D0E5C216EFEFA000C2922 /* Config.xib in Resources */ = {isa = PBXBuildFile; fileRef = 660D0E5B216EFEFA000C2922 /* Config.xib */; }; 664EB375216C9A5E00B6AE0D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664EB374216C9A5E00B6AE0D /* AppDelegate.swift */; }; 664EB377216C9A5F00B6AE0D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 664EB376216C9A5F00B6AE0D /* Assets.xcassets */; }; 664EB37A216C9A5F00B6AE0D /* Menu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 664EB378216C9A5F00B6AE0D /* Menu.xib */; }; @@ -19,7 +19,7 @@ /* Begin PBXFileReference section */ 660D0E59216E0158000C2922 /* Server.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Server.swift; sourceTree = ""; }; - 6612ACBF216DB6DC00A8BF83 /* Config.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = Config.xib; sourceTree = ""; }; + 660D0E5B216EFEFA000C2922 /* Config.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Config.xib; sourceTree = ""; }; 664EB371216C9A5E00B6AE0D /* V2rayU.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = V2rayU.app; sourceTree = BUILT_PRODUCTS_DIR; }; 664EB374216C9A5E00B6AE0D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 664EB376216C9A5F00B6AE0D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -63,7 +63,7 @@ children = ( 660D0E59216E0158000C2922 /* Server.swift */, 664EB390216CA9E800B6AE0D /* Config.swift */, - 6612ACBF216DB6DC00A8BF83 /* Config.xib */, + 660D0E5B216EFEFA000C2922 /* Config.xib */, 664EB374216C9A5E00B6AE0D /* AppDelegate.swift */, 664EB376216C9A5F00B6AE0D /* Assets.xcassets */, 664EB378216C9A5F00B6AE0D /* Menu.xib */, @@ -134,7 +134,7 @@ buildActionMask = 2147483647; files = ( 664EB397216CB48400B6AE0D /* About.xib in Resources */, - 6612ACC0216DB6DC00A8BF83 /* Config.xib in Resources */, + 660D0E5C216EFEFA000C2922 /* Config.xib in Resources */, 664EB377216C9A5F00B6AE0D /* Assets.xcassets in Resources */, 664EB37A216C9A5F00B6AE0D /* Menu.xib in Resources */, ); diff --git a/V2rayU/Config.swift b/V2rayU/Config.swift index d08ed35..5f30057 100644 --- a/V2rayU/Config.swift +++ b/V2rayU/Config.swift @@ -10,150 +10,162 @@ import Cocoa import WebKit -class ConfigWindow: NSWindowController,NSTextFieldDelegate { +class ConfigWindow: NSWindowController { let configServer = ConfigServer() - @IBAction func edit(_ sender: Any) { - print("edit") - } override var windowNibName: String? { return "Config" // no extension .xib here } + @IBOutlet weak var tableView: NSTableView! - @IBOutlet weak var remark: NSTextFieldCell! @IBOutlet weak var addRemoveButton: NSSegmentedControl! - + @IBAction func addRemoveServer(_ sender: NSSegmentedCell) { // 0 add,1 remove let seg = addRemoveButton.indexOfSelectedItem let appDelegate = NSApplication.shared.delegate as! AppDelegate switch seg { - // add server config + // add server config case 0: // add _ = configServer.add() - + // reload data self.tableView.reloadData() // selected current row - self.tableView.selectRowIndexes(NSIndexSet(index: configServer.count()-1) as IndexSet, byExtendingSelection: false) - + self.tableView.selectRowIndexes(NSIndexSet(index: configServer.count() - 1) as IndexSet, byExtendingSelection: false) + // refresh menu // appDelegate.showServers(list:list) // self.openEdit(tableView.NSTextFieldCell) - + break - - // delete server config + + // delete server config case 1: // get seleted index let idx = self.tableView.selectedRow - + // remove let list = configServer.remove(idx: idx) // reload self.tableView.reloadData() - + // selected prev row - let cnt:Int = configServer.count() - var rowIndex:Int = idx-1 + let cnt: Int = configServer.count() + var rowIndex: Int = idx - 1 if rowIndex < 0 { - rowIndex = cnt-1 + rowIndex = cnt - 1 } if rowIndex >= 0 { self.tableView.selectRowIndexes(NSIndexSet(index: rowIndex) as IndexSet, byExtendingSelection: false) } - + // refresh menu - appDelegate.showServers(list:list) - // let serverItems : NSMenuItem = NSMenuItem() + appDelegate.showServers(list: list) break - // unknown action - default : + // unknown action + default: return } } - + @IBAction func editCell(_ sender: NSTextFieldCell) { print("open edit") } - + @IBAction func ok(_ sender: NSButton) { // todo save - + // self close self.close() // hide dock icon and close all opened windows NSApp.setActivationPolicy(.accessory) } - + @IBAction func cancel(_ sender: NSButton) { // self close self.close() // hide dock icon and close all opened windows NSApp.setActivationPolicy(.accessory) } - + override func windowDidLoad() { super.windowDidLoad() - self.tableView.delegate = self as? NSTableViewDelegate + self.tableView.delegate = self self.tableView.dataSource = self + self.tableView.reloadData() + self.tableView.action = #selector(onItemClicked) self.tableView.doubleAction = #selector(onDoubleClicked) - -// self.remark.action = #selector(onEdit) -// self.tableView.target } + @objc private func onEdit() { print("onEdit") } + @objc private func onDoubleClicked() { print("onDoubleClicked row \(tableView.clickedRow), col \(tableView.clickedColumn) clicked") } - - @objc private func onItemClicked() { -// print("row \(tableView.clickedRow), col \(tableView.clickedColumn) clicked") + + @objc func onItemClicked() { + print("row \(tableView.clickedRow), col \(tableView.clickedColumn) clicked") } - + func windowWillClose(_ notification: Notification) { // hide dock icon and close all opened windows NSApp.setActivationPolicy(.accessory) } - func controlTextDidChange(_ obj: Notification) { - print("controlTextDidChange") - - // Get the data every time the user writes a character - } - - func tableViewSelectionDidChange(_ notification: Notification) { - let tableView = notification.object as! NSTableView - - if let identifier = tableView.identifier, identifier.rawValue == "remark" { - print("myTableView1") - } - let selectedRow = self.tableView.selectedRow - print("selectedRow",selectedRow) - // If the user selected a row. (When no row is selected, the index is -1) - if (selectedRow > -1) { - // let myCell = self.tableView.view(atColumn: self.tableView!.column(withIdentifier: "remark"), row: selectedRow, makeIfNecessary: true) as! NSTableCellView - // - // // Get the textField to detect and add it the delegate - // let textField = myCell.textField - // textField?.delegate = self - } - } - } +// NSTableViewDataSource extension ConfigWindow: NSTableViewDataSource { func numberOfRows(in tableView: NSTableView) -> Int { return configServer.count() } +} + +// NSTableViewDelegate +extension ConfigWindow: NSTableViewDelegate { - func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { + // _ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let tableViewData = configServer.list() - return tableViewData[row][(tableColumn?.identifier.rawValue)!] + + // get cell Identifier (name is "remark") + let cellIdentifier: NSUserInterfaceItemIdentifier = NSUserInterfaceItemIdentifier(rawValue: (tableColumn?.identifier)!.rawValue) + + if let cell = tableView.makeView(withIdentifier: cellIdentifier, owner: nil) as? NSTableCellView { + // set cell val + cell.textField?.stringValue = tableViewData[row][cellIdentifier.rawValue]! + return cell + } + + return nil + } + + //当添加行时调用的回调 + func tableView(_ tableView: NSTableView, didAdd rowView: NSTableRowView, forRow row: Int) { + print("addRow") + } + //当移除行时调用的回调 + func tableView(_ tableView: NSTableView, didRemove rowView: NSTableRowView, forRow row: Int) { + print("removeRow") + } + + func tableView(_ tableView: NSTableView, setObjectValue object: Any?, for tableColumn: NSTableColumn?, row: Int){ + print("edit") + } + + func selectionShouldChange(in tableView: NSTableView) -> Bool { + print("selectionShouldChange") + return true + } + + func tableViewSelectionDidChange(_ notification: Notification) { +// print("changed") + // updateStatus() } } diff --git a/V2rayU/Config.xib b/V2rayU/Config.xib index b029107..f9c406f 100644 --- a/V2rayU/Config.xib +++ b/V2rayU/Config.xib @@ -5,42 +5,169 @@ - + - + + - + - + - - + + - - + + - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + +