diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index fec8109..a3de985 100644 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -378,6 +378,9 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } @IBAction func updateSubscribeAtLaunch(_ sender: NSMenuItem) { + let defaults = UserDefaults.standard + defaults.set(!defaults.bool(forKey: "AutoUpdateSubscribe"), forKey: "AutoUpdateSubscribe") + updateSubscribeAtLaunchMenuItem.state = defaults.bool(forKey: "AutoUpdateSubscribe") ? 1 : 0 } @@ -718,6 +721,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } serversMenuItem.submenu?.addItem(editSubscribeItem!) serversMenuItem.submenu?.addItem(autoUpdateSubscribeItem!) + autoUpdateSubscribeItem?.state = UserDefaults.standard.bool(forKey: "AutoUpdateSubscribe") ? 1 : 0 serversMenuItem.submenu?.addItem(updateSubscribeItem!) serversMenuItem.submenu?.addItem(showQRItem!) serversMenuItem.submenu?.addItem(scanQRItem!) diff --git a/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib index fbb57ab..8db75da 100644 --- a/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib +++ b/ShadowsocksX-NG/Base.lproj/SubscribePreferenceWindowController.xib @@ -10,7 +10,6 @@ - @@ -22,7 +21,7 @@ - + @@ -31,16 +30,8 @@ - - - - - - - - - + @@ -48,7 +39,7 @@ - + @@ -56,7 +47,7 @@ - + @@ -91,7 +82,7 @@ - + @@ -99,7 +90,7 @@ - + @@ -107,7 +98,7 @@ - + @@ -115,7 +106,7 @@ - + @@ -126,34 +117,21 @@ - + - - + - + - + @@ -168,7 +146,7 @@ DQ - + @@ -190,7 +168,7 @@ DQ + @@ -209,16 +200,16 @@ DQ - + - - + - + - + + @@ -232,6 +223,7 @@ DQ + diff --git a/ShadowsocksX-NG/Subscribe.swift b/ShadowsocksX-NG/Subscribe.swift index e007bdd..c958f9b 100644 --- a/ShadowsocksX-NG/Subscribe.swift +++ b/ShadowsocksX-NG/Subscribe.swift @@ -172,7 +172,10 @@ class Subscribe: NSObject{ fileprivate func pushNotification(){ } - fileprivate func isSame(source: Subscribe, target: Subscribe) -> Bool { + class func isSame(source: Subscribe, target: Subscribe) -> Bool { return source.subscribeFeed == target.subscribeFeed && source.token == target.token && source.maxCount == target.maxCount } + func isExist(_ target: Subscribe) -> Bool { + return self.subscribeFeed == target.subscribeFeed + } } diff --git a/ShadowsocksX-NG/SubscribeManager.swift b/ShadowsocksX-NG/SubscribeManager.swift index 758b6f5..6bd26ff 100644 --- a/ShadowsocksX-NG/SubscribeManager.swift +++ b/ShadowsocksX-NG/SubscribeManager.swift @@ -25,19 +25,25 @@ class SubscribeManager:NSObject{ } } func addSubscribe(oneSubscribe: Subscribe) -> Bool { + for (index, value) in subscribes.enumerated() { + if Subscribe.isSame(source: oneSubscribe, target: value) { + return true + } + if value.isExist(oneSubscribe) { + subscribes.replaceSubrange(Range(index.. Bool { - subscribes.enumerated().forEach({ (index, oneSubscribe) -> Void in - if(oneSubscribe.getFeed() == toDeleteSubscribe.getFeed()){ - subscribes.remove(at: index) - } - }) - defaults.set(subscribesToDefaults(data: subscribes), forKey: "Subscribes") + func deleteSubscribe(atIndex: Int) -> Bool { + subscribes.remove(at: atIndex) return true } + func save() { + defaults.set(subscribesToDefaults(data: subscribes), forKey: "Subscribes") + } fileprivate func subscribesToDefaults(data: [Subscribe]) -> [[String: AnyObject]]{ var ret : [[String: AnyObject]] = [] for value in data { diff --git a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift index 207f96c..c0398df 100644 --- a/ShadowsocksX-NG/SubscribePreferenceWindowController.swift +++ b/ShadowsocksX-NG/SubscribePreferenceWindowController.swift @@ -34,6 +34,7 @@ class SubscribePreferenceWindowController: NSWindowController sbMgr = SubscribeManager.instance defaults = UserDefaults.standard SubscribeTableView.reloadData() + updateSubscribeBoxVisible() } override func awakeFromNib() { @@ -42,14 +43,14 @@ 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() { - return shakeWindows() + if editingSubscribe != nil { + if !editingSubscribe.feedValidator() { + // Done Shake window + shakeWindows() + return + } } - _ = sbMgr.addSubscribe(oneSubscribe: subscribe) - subscribe.updateServerFromFeed() - SubscribeTableView.reloadData() + sbMgr.save() window?.performClose(self) } @@ -77,10 +78,12 @@ class SubscribePreferenceWindowController: NSWindowController if index >= 0 { SubscribeTableView.beginUpdates() for (_, toDeleteIndex) in SubscribeTableView.selectedRowIndexes.enumerated() { - print(sbMgr.subscribes.count) - sbMgr.subscribes.remove(at: toDeleteIndex - deleteCount) + _ = sbMgr.deleteSubscribe(atIndex: toDeleteIndex - deleteCount) SubscribeTableView.removeRows(at: IndexSet(integer: toDeleteIndex - deleteCount), withAnimation: .effectFade) deleteCount += 1 + if sbMgr.subscribes.count == 0 { + cleanField() + } } SubscribeTableView.endUpdates() } @@ -92,8 +95,16 @@ class SubscribePreferenceWindowController: NSWindowController func updateSubscribeBoxVisible() { if sbMgr.subscribes.count <= 0 { DeleteSubscribeBtn.isEnabled = false + FeedTextField.isEnabled = false + TokenTextField.isEnabled = false + GroupTextField.isEnabled = false + MaxCountTextField.isEnabled = false }else{ DeleteSubscribeBtn.isEnabled = true + FeedTextField.isEnabled = true + TokenTextField.isEnabled = true + GroupTextField.isEnabled = true + MaxCountTextField.isEnabled = true } } @@ -236,6 +247,13 @@ class SubscribePreferenceWindowController: NSWindowController } } + func cleanField(){ + FeedTextField.stringValue = "" + TokenTextField.stringValue = "" + GroupTextField.stringValue = "" + MaxCountTextField.stringValue = "" + } + func shakeWindows(){ let numberOfShakes:Int = 8 let durationOfShake:Float = 0.5 diff --git a/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings b/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings index e99808d..5f5fb0d 100644 --- a/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings +++ b/ShadowsocksX-NG/zh-Hans.lproj/SubscribePreferenceWindowController.strings @@ -3,13 +3,13 @@ "CfK-8Y-YNP.title" = "OK"; /* Class = "NSWindow"; title = "Window"; ObjectID = "F0z-JX-Cv5"; */ -"F0z-JX-Cv5.title" = "Window"; +"F0z-JX-Cv5.title" = "订阅设置"; /* Class = "NSTextFieldCell"; title = "Token"; ObjectID = "IrJ-D8-tlX"; */ -"IrJ-D8-tlX.title" = "Token"; +"IrJ-D8-tlX.title" = "口令"; /* Class = "NSTextFieldCell"; title = "Group"; ObjectID = "f2p-qb-uuE"; */ -"f2p-qb-uuE.title" = "Group"; +"f2p-qb-uuE.title" = "组名"; /* Class = "NSTextFieldCell"; title = "Text"; ObjectID = "ik7-wS-gok"; */ "ik7-wS-gok.title" = "Text"; @@ -18,7 +18,7 @@ "rMX-5B-Fvs.title" = "订阅设置"; /* Class = "NSTextFieldCell"; title = "Count"; ObjectID = "wbG-HT-bdN"; */ -"wbG-HT-bdN.title" = "Count"; +"wbG-HT-bdN.title" = "最大数量"; /* Class = "NSTextFieldCell"; title = "URL"; ObjectID = "yBp-oB-gbL"; */ -"yBp-oB-gbL.title" = "URL"; +"yBp-oB-gbL.title" = "订阅地址";