diff --git a/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib index 75224e9..fbb57ab 100644 --- a/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib +++ b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib @@ -8,6 +8,8 @@ + + @@ -47,7 +49,7 @@ - + @@ -71,6 +73,9 @@ + + + @@ -111,7 +119,7 @@ - + diff --git a/ShadowsocksX-NG/ServerProfileManager.swift b/ShadowsocksX-NG/ServerProfileManager.swift index 9293dfc..cd19a7c 100644 --- a/ShadowsocksX-NG/ServerProfileManager.swift +++ b/ShadowsocksX-NG/ServerProfileManager.swift @@ -71,6 +71,32 @@ class ServerProfileManager: NSObject { } } + func isExisted(profile: ServerProfile) -> (Bool, Int){ + for (index, value) in profiles.enumerated() { + let ret = value.serverHost == profile.serverHost + if ret { + return (ret, index) + } + } + return (false, -1) + } + + func isDuplicated(profile: ServerProfile) -> (Bool, Int){ + for (index, value) in profiles.enumerated() { + let ret = value.serverHost == profile.serverHost + && value.password == profile.password + && value.serverPort == profile.serverPort + && value.ssrProtocol == profile.ssrProtocol + && value.ssrObfs == profile.ssrObfs + && value.ssrObfsParam == value.ssrObfsParam + && value.ssrProtocolParam == value.ssrProtocolParam + if ret { + return (ret, index) + } + } + return (false, -1) + } + func importConfigFile() { let openPanel = NSOpenPanel() openPanel.title = "Choose Config Json File".localized diff --git a/ShadowsocksX-NG/Subscribe.swift b/ShadowsocksX-NG/Subscribe.swift index ab44661..e007bdd 100644 --- a/ShadowsocksX-NG/Subscribe.swift +++ b/ShadowsocksX-NG/Subscribe.swift @@ -135,11 +135,20 @@ class Subscribe: NSObject{ let ssrregexp = "ssr://([A-Za-z0-9_-]+)" let urls = splitor(url: decodeRes, regexp: ssrregexp) let maxN = self.maxCount == -1 ? urls.count: self.maxCount + // TODO change the loop into random pick for index in 0.. Bool{ // is the right format - return subscribeFeed != "" && groupName != "" && token != "" + return subscribeFeed != "" && groupName != "" } fileprivate func pushNotification(){ - } - fileprivate func isExisted(profile: ServerProfile) -> Bool{ - // using to url judge - // if existed update - for (_, value) in profileMgr.profiles.enumerated() { - let ret = value.serverHost == profile.serverHost - if ret { - return ret - } - } - return false - } - fileprivate func isDuplicated(profile: ServerProfile) -> Bool{ - // if duplicated skip - for (_, value) in profileMgr.profiles.enumerated() { - let ret = value.serverHost == profile.serverHost - && value.password == profile.password - && value.serverPort == profile.serverPort - && value.ssrProtocol == profile.ssrProtocol - && value.ssrObfs == profile.ssrObfs - && value.ssrObfsParam == value.ssrObfsParam - && value.ssrProtocolParam == value.ssrProtocolParam - if ret { - return ret - } - } - return false } fileprivate func isSame(source: Subscribe, target: Subscribe) -> Bool { return source.subscribeFeed == target.subscribeFeed && source.token == target.token && source.maxCount == target.maxCount diff --git a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift index 0a2d486..207f96c 100644 --- a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift +++ b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift @@ -20,6 +20,8 @@ class SubscribePreferenceWindowController: NSWindowController @IBOutlet weak var MaxCountTextField: NSTextField! @IBOutlet weak var SubscribeTableView: NSTableView! + @IBOutlet weak var AddSubscribeBtn: NSButton! + @IBOutlet weak var DeleteSubscribeBtn: NSButton! var sbMgr: SubscribeManager! var defaults: UserDefaults! @@ -42,14 +44,59 @@ class SubscribePreferenceWindowController: NSWindowController @IBAction func onOk(_ sender: NSButton) { // TODO append to manager and save let subscribe = Subscribe.init(initUrlString: FeedTextField.stringValue, initGroupName: GroupTextField.stringValue, initToken: TokenTextField.stringValue, initMaxCount: MaxCountTextField.integerValue) - if subscribe.feedValidator() { - _ = sbMgr.addSubscribe(oneSubscribe: subscribe) + if !subscribe.feedValidator() { + return shakeWindows() } + _ = sbMgr.addSubscribe(oneSubscribe: subscribe) subscribe.updateServerFromFeed() SubscribeTableView.reloadData() window?.performClose(self) } + @IBAction func onAdd(_ sender: NSButton) { + if editingSubscribe != nil && !editingSubscribe.feedValidator(){ + shakeWindows() + return + } + SubscribeTableView.beginUpdates() + let subscribe = Subscribe(initUrlString: "", initGroupName: "", initToken: "", initMaxCount: -1) + sbMgr.subscribes.append(subscribe) + + let index = IndexSet(integer: sbMgr.subscribes.count-1) + SubscribeTableView.insertRows(at: index, withAnimation: .effectFade) + + self.SubscribeTableView.scrollRowToVisible(self.sbMgr.subscribes.count-1) + self.SubscribeTableView.selectRowIndexes(index, byExtendingSelection: false) + SubscribeTableView.endUpdates() + updateSubscribeBoxVisible() + } + + @IBAction func onDelete(_ sender: NSButton) { + let index = Int(SubscribeTableView.selectedRowIndexes.first!) + var deleteCount = 0 + if index >= 0 { + SubscribeTableView.beginUpdates() + for (_, toDeleteIndex) in SubscribeTableView.selectedRowIndexes.enumerated() { + print(sbMgr.subscribes.count) + sbMgr.subscribes.remove(at: toDeleteIndex - deleteCount) + SubscribeTableView.removeRows(at: IndexSet(integer: toDeleteIndex - deleteCount), withAnimation: .effectFade) + deleteCount += 1 + } + SubscribeTableView.endUpdates() + } + self.SubscribeTableView.scrollRowToVisible(index - 1) + self.SubscribeTableView.selectRowIndexes(IndexSet(integer: index - 1), byExtendingSelection: false) + updateSubscribeBoxVisible() + } + + func updateSubscribeBoxVisible() { + if sbMgr.subscribes.count <= 0 { + DeleteSubscribeBtn.isEnabled = false + }else{ + DeleteSubscribeBtn.isEnabled = true + } + } + func bindSubscribe(_ index:Int) { if index >= 0 && index < sbMgr.subscribes.count { editingSubscribe = sbMgr.subscribes[index] @@ -69,7 +116,10 @@ class SubscribePreferenceWindowController: NSWindowController } func getDataAtRow(_ index:Int) -> String { - return sbMgr.subscribes[index].groupName + if sbMgr.subscribes[index].groupName != "" { + return sbMgr.subscribes[index].groupName + } + return sbMgr.subscribes[index].subscribeFeed } // MARK: For NSTableViewDataSource