ClashX.Meta/ClashX/General/ProxyMenuItemFactory.swift

87 lines
3.1 KiB
Swift
Raw Normal View History

2018-08-04 21:49:32 +08:00
//
// ProxyMenuItemFactory.swift
// ClashX
//
// Created by CYC on 2018/8/4.
// Copyright © 2018 west2online. All rights reserved.
//
import Cocoa
import SwiftyJSON
import RxCocoa
class ProxyMenuItemFactory {
static func menuItems(completionHandler:@escaping (([NSMenuItem])->())){
ApiRequest.requestProxyGroupList { (res) in
let dataDict = JSON(res)
var menuItems = [NSMenuItem]()
if (ConfigManager.shared.currentConfig?.mode == .direct) {
completionHandler(menuItems)
return
}
2018-08-04 21:49:32 +08:00
for proxyGroup in dataDict.dictionaryValue {
var menu:NSMenuItem?
switch proxyGroup.value["type"].stringValue {
case "Selector": menu = self.generateSelectorMenuItem(proxyGroup: proxyGroup)
case "URLTest": menu = self.generateUrlTestMenuItem(proxyGroup: proxyGroup)
default: continue
}
if (menu != nil) {menuItems.append(menu!)}
2018-08-04 21:49:32 +08:00
}
completionHandler(menuItems.reversed())
2018-08-04 21:49:32 +08:00
}
}
static func generateSelectorMenuItem(proxyGroup:(key: String, value: JSON))->NSMenuItem? {
if (ConfigManager.shared.currentConfig?.mode == .global) {
if proxyGroup.key != "GLOBAL" {return nil}
} else {
if proxyGroup.key == "GLOBAL" {return nil}
}
let menu = NSMenuItem(title: proxyGroup.key, action: nil, keyEquivalent: "")
let selectedName = proxyGroup.value["now"].stringValue
let submenu = NSMenu(title: proxyGroup.key)
for proxy in proxyGroup.value["all"].arrayValue.reversed() {
let proxyItem = NSMenuItem(title: proxy.stringValue, action: #selector(ProxyMenuItemFactory.actionSelectProxy(sender:)), keyEquivalent: "")
proxyItem.target = ProxyMenuItemFactory.self
proxyItem.state = proxy.stringValue == selectedName ? .on : .off
submenu.addItem(proxyItem)
}
menu.submenu = submenu
return menu
}
static func generateUrlTestMenuItem(proxyGroup:(key: String, value: JSON))->NSMenuItem? {
let menu = NSMenuItem(title: proxyGroup.key, action: nil, keyEquivalent: "")
let selectedName = proxyGroup.value["now"].stringValue
let submenu = NSMenu(title: proxyGroup.key)
let nowMenuItem = NSMenuItem(title: "now:\(selectedName)", action: nil, keyEquivalent: "")
submenu.addItem(nowMenuItem)
menu.submenu = submenu
return menu
}
2018-08-04 21:49:32 +08:00
@objc static func actionSelectProxy(sender:NSMenuItem){
guard let proxyGroup = sender.menu?.title else {return}
let proxyName = sender.title
ApiRequest.updateProxyGroup(group: proxyGroup, selectProxy: proxyName) { (success) in
if (success) {
for items in sender.menu?.items ?? [NSMenuItem]() {
items.state = .off
}
sender.state = .on
}
}
}
}