// // Preferences.swift // V2rayU // // Created by yanue on 2018/10/19. // Copyright © 2018 yanue. All rights reserved. // import Cocoa import Preferences final class PreferenceSubscribeViewController: NSViewController, PreferencePane, NSTabViewDelegate { let preferencePaneIdentifier = PreferencePane.Identifier.subscribeTab let preferencePaneTitle = "Subscription" let toolbarItemIcon = NSImage(named: NSImage.userAccountsName)! let tableViewDragType: String = "v2ray.subscribe" var tip: String = "" @IBOutlet weak var remark: NSTextField! @IBOutlet weak var url: NSTextField! @IBOutlet var tableView: NSTableView! @IBOutlet weak var upBtn: NSButton! @IBOutlet weak var logView: NSView! @IBOutlet weak var subscribeView: NSView! @IBOutlet var logArea: NSTextView! @IBOutlet weak var hideLogs: NSButton! // our variable override var nibName: NSNib.Name? { return "PreferenceSubscription" } override func viewDidLoad() { super.viewDidLoad() // fix: https://github.com/sindresorhus/Preferences/issues/31 self.preferredContentSize = NSMakeSize(self.view.frame.size.width, self.view.frame.size.height); self.logView.isHidden = true self.subscribeView.isHidden = false self.logArea.string = "" // reload tableview V2raySubscription.loadConfig() // table view self.tableView.delegate = self self.tableView.dataSource = self self.tableView.reloadData() // set global hotkey NotificationCenter.default.addObserver(self, selector: #selector(self.updateTip), name: NOTIFY_UPDATE_SubSync, object: nil) } deinit { NotificationCenter.default.removeObserver(self,name: NOTIFY_UPDATE_SubSync, object: nil) } @objc func updateTip(notification: Notification) { self.tip += notification.object as? String ?? "" DispatchQueue.main.async { self.logArea.string = self.tip self.logArea.scrollToEndOfDocument("") } } @IBAction func addSubscribe(_ sender: Any) { var url = self.url.stringValue var remark = self.remark.stringValue // trim url = url.trimmingCharacters(in: .whitespacesAndNewlines) remark = remark.trimmingCharacters(in: .whitespacesAndNewlines) if url.count == 0 { self.url.becomeFirstResponder() return } // special char let charSet = NSMutableCharacterSet() charSet.formUnion(with: CharacterSet.urlQueryAllowed) charSet.addCharacters(in: "#") guard let rUrl = URL(string: url.addingPercentEncoding(withAllowedCharacters: charSet as CharacterSet)!) else { self.url.becomeFirstResponder() return } if rUrl.scheme == nil || rUrl.host == nil { self.url.becomeFirstResponder() return } if remark.count == 0 { self.remark.becomeFirstResponder() return } // add to server V2raySubscription.add(remark: remark, url: url) // reset self.remark.stringValue = "" self.url.stringValue = "" // reload tableview V2raySubscription.loadConfig() self.tableView.reloadData() } @IBAction func removeSubscribe(_ sender: Any) { let idx = self.tableView.selectedRow if self.tableView.selectedRow > -1 { if let item = V2raySubscription.loadSubItem(idx: idx) { print("remove sub item", item.name, item.url) // remove old v2ray servers by subscribe V2rayServer.remove(subscribe: item.name) } // remove subscribe V2raySubscription.remove(idx: idx) // selected prev row let cnt: Int = V2raySubscription.count() var rowIndex: Int = idx - 1 if idx > 0 && idx < cnt { rowIndex = idx } if rowIndex == -1 { rowIndex = 0 } // reload tableview V2raySubscription.loadConfig() self.tableView.reloadData() // fix if cnt > 0 { // selected row self.tableView.selectRowIndexes(NSIndexSet(index: rowIndex) as IndexSet, byExtendingSelection: true) } menuController.showServers() } } @IBAction func hideLogs(_ sender: Any) { self.subscribeView.isHidden = false self.logView.isHidden = true } // update servers from subscribe url list @IBAction func updateSubscribe(_ sender: Any) { self.upBtn.state = .on self.subscribeView.isHidden = true self.logView.isHidden = false self.logArea.string = "" self.tip = "" // update Subscription V2raySubSync.shared.sync() } } extension PreferenceSubscribeViewController: NSTableViewDataSource { func numberOfRows(in tableView: NSTableView) -> Int { return V2raySubscription.count() } func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { let identifier = tableColumn?.identifier as NSString? let data = V2raySubscription.list() if (identifier == "remarkCell") { let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "remarkCell"), owner: self) as! NSTableCellView cell.textField?.stringValue = data[row].remark return cell } else if (identifier == "urlCell") { let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "urlCell"), owner: self) as! NSTableCellView cell.textField?.stringValue = data[row].url return cell } return nil } // edit cell func tableView(_ tableView: NSTableView, setObjectValue: Any?, for forTableColumn: NSTableColumn?, row: Int) { print("edit row", forTableColumn, setObjectValue, row) } } extension PreferenceSubscribeViewController: NSTableViewDelegate { // For NSTableViewDelegate func tableViewSelectionDidChange(_ notification: Notification) { let idx = self.tableView.selectedRow if idx > -1 { if let item = V2raySubscription.loadSubItem(idx: idx) { // choose self.remark.stringValue = item.remark self.url.stringValue = item.url } } } }