ClashX.Meta/ClashX/General/MenuItemFactory.swift

141 lines
5.2 KiB
Swift
Raw Normal View History

2018-08-04 21:49:32 +08:00
//
2018-11-30 22:14:20 +08:00
// MenuItemFactory.swift
2018-08-04 21:49:32 +08:00
// ClashX
//
// Created by CYC on 2018/8/4.
2018-08-08 13:47:38 +08:00
// Copyright © 2018 yichengchen. All rights reserved.
2018-08-04 21:49:32 +08:00
//
import Cocoa
import SwiftyJSON
import RxCocoa
2018-11-30 22:14:20 +08:00
class MenuItemFactory {
2018-08-04 21:49:32 +08:00
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-08 20:10:15 +08:00
for proxyGroup in dataDict.dictionaryValue.sorted(by: { $0.0 < $1.0}) {
var menu:NSMenuItem?
switch proxyGroup.value["type"].stringValue {
case "Selector": menu = self.generateSelectorMenuItem(json: dataDict, key: proxyGroup.key)
2018-10-02 12:25:53 +08:00
case "URLTest","Fallback": 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(json:JSON,key:String)->NSMenuItem? {
let proxyGroup:(key: String, value: JSON) = (key,json[key])
let isGlobalMode = ConfigManager.shared.currentConfig?.mode == .global
if (isGlobalMode) {
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)
var hasSelected = false
submenu.minimumWidth = 20
2018-08-08 20:10:15 +08:00
for proxy in proxyGroup.value["all"].arrayValue {
if isGlobalMode {
if json[proxy.stringValue]["type"] == "Selector" {
continue
}
}
2018-11-30 22:14:20 +08:00
let proxyItem = NSMenuItem(title: proxy.stringValue, action: #selector(MenuItemFactory.actionSelectProxy(sender:)), keyEquivalent: "")
proxyItem.target = MenuItemFactory.self
2018-10-19 23:32:36 +08:00
let delay = SpeedDataRecorder.shared.speedDict[proxy.stringValue]
let selected = proxy.stringValue == selectedName
proxyItem.state = selected ? .on : .off
let menuItemView = ProxyMenuItemView.create(proxy: proxy.stringValue, delay: delay)
menuItemView.isSelected = selected
menuItemView.onClick = { [weak proxyItem] in
guard let proxyItem = proxyItem else {return}
2018-11-30 22:14:20 +08:00
MenuItemFactory.actionSelectProxy(sender: proxyItem)
}
proxyItem.view = menuItemView
if selected {hasSelected = true}
submenu.addItem(proxyItem)
2018-10-19 23:32:36 +08:00
submenu.autoenablesItems = false
let fittitingWidth = menuItemView.fittingSize.width
if (fittitingWidth > submenu.minimumWidth) {
submenu.minimumWidth = fittitingWidth
}
}
for item in submenu.items {
item.view?.frame.size.width = submenu.minimumWidth
}
menu.submenu = submenu
if (!hasSelected && submenu.items.count>0) {
self.actionSelectProxy(sender: submenu.items[0])
}
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-11-30 22:14:20 +08:00
static func generateSwitchConfigMenuItems() -> [NSMenuItem] {
var items = [NSMenuItem]()
for config in ConfigManager.getConfigFilesList() {
let item = NSMenuItem(title: config, action: #selector(MenuItemFactory.actionSelectConfig(sender:)), keyEquivalent: "")
item.target = MenuItemFactory.self
item.state = ConfigManager.selectConfigName == config ? .on : .off
items.append(item)
}
return items
}
}
extension MenuItemFactory {
@objc static func actionSelectProxy(sender:NSMenuItem){
2018-08-04 21:49:32 +08:00
guard let proxyGroup = sender.menu?.title else {return}
let proxyName = sender.title
2018-08-04 21:49:32 +08:00
ApiRequest.updateProxyGroup(group: proxyGroup, selectProxy: proxyName) { (success) in
if (success) {
for items in sender.menu?.items ?? [NSMenuItem]() {
items.state = .off
}
sender.state = .on
// remember select proxy
ConfigManager.selectedProxyMap[proxyGroup] = proxyName
2018-08-04 21:49:32 +08:00
}
}
}
2018-11-30 22:14:20 +08:00
@objc static func actionSelectConfig(sender:NSMenuItem){
let config = sender.title
ConfigManager.selectConfigName = config
NotificationCenter.default.post(Notification(name: kShouldUpDateConfig))
}
2018-08-04 21:49:32 +08:00
}