mirror of
https://github.com/swiftbar/SwiftBar.git
synced 2024-10-27 00:50:16 +03:00
Adding support for refresh on click #241
This commit is contained in:
parent
19bac5613e
commit
e3b7b2425a
@ -210,6 +210,7 @@ A special tag can be used as an alternative to refresh interval defined in plugi
|
|||||||
|
|
||||||
#### Other Parameters
|
#### Other Parameters
|
||||||
|
|
||||||
|
* `#<swiftbar.refreshOnOpen>true</swiftbar.refreshOnOpen>` - refreshes plugin on click, before presenting the menu
|
||||||
* `<swiftbar.runInBash>false</swiftbar.runInBash>` - doesn't wrap plugins in Bash when running
|
* `<swiftbar.runInBash>false</swiftbar.runInBash>` - doesn't wrap plugins in Bash when running
|
||||||
* `<swiftbar.type>streamable</swiftbar.type>` - mark plugin as Streamable
|
* `<swiftbar.type>streamable</swiftbar.type>` - mark plugin as Streamable
|
||||||
* `<swiftbar.environment>[var1:default value, var2:default value, ... ]</swiftbar.environment>` - this variables will be passed in plugin's environment, in later release SwiftBar will provide a UI to change values for these variables.
|
* `<swiftbar.environment>[var1:default value, var2:default value, ... ]</swiftbar.environment>` - this variables will be passed in plugin's environment, in later release SwiftBar will provide a UI to change values for these variables.
|
||||||
|
@ -92,7 +92,7 @@ class MenubarItem: NSObject {
|
|||||||
contentUpdateCancellable = plugin?.contentUpdatePublisher
|
contentUpdateCancellable = plugin?.contentUpdatePublisher
|
||||||
.receive(on: menuUpdateQueue)
|
.receive(on: menuUpdateQueue)
|
||||||
.sink { [weak self] content in
|
.sink { [weak self] content in
|
||||||
guard self?.isOpen == false else {
|
guard self?.isOpen == false, plugin?.metadata?.refreshOnOpen == true else {
|
||||||
self?.refreshOnClose = true
|
self?.refreshOnClose = true
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -605,9 +605,31 @@ extension MenubarItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func showMenu() {
|
func showMenu() {
|
||||||
|
if plugin?.metadata?.refreshOnOpen == true, plugin?.type == .Executable {
|
||||||
|
refreshAndShowMenu()
|
||||||
|
return
|
||||||
|
}
|
||||||
barItem.menu = statusBarMenu
|
barItem.menu = statusBarMenu
|
||||||
barItem.button?.performClick(nil)
|
barItem.button?.performClick(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func refreshAndShowMenu() {
|
||||||
|
if #available(macOS 11.0, *) {
|
||||||
|
barItem.button?.image = NSImage(systemSymbolName: "hourglass", accessibilityDescription: nil)
|
||||||
|
barItem.button?.imagePosition = .imageLeft
|
||||||
|
} else {
|
||||||
|
barItem.button?.image = nil
|
||||||
|
barItem.button?.title = "..."
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
self?.barItem.button?.image = nil
|
||||||
|
self?.barItem.button?.title.removeAll()
|
||||||
|
self?.plugin?.refresh()
|
||||||
|
self?.updateMenu(content: self?.plugin?.content)
|
||||||
|
self?.barItem.menu = self?.statusBarMenu
|
||||||
|
self?.barItem.button?.performClick(nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@discardableResult func performItemAction(params: MenuLineParameters) -> Bool {
|
@discardableResult func performItemAction(params: MenuLineParameters) -> Bool {
|
||||||
if let href = params.href, let url = URL(string: href) {
|
if let href = params.href, let url = URL(string: href) {
|
||||||
|
@ -148,8 +148,7 @@ class ExecutablePlugin: Plugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@objc func scheduledContentUpdate() {
|
@objc func scheduledContentUpdate() {
|
||||||
content = invoke()
|
refresh()
|
||||||
enableTimer()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,12 +27,13 @@ enum PluginMetadataOption: String, CaseIterable {
|
|||||||
case hideSwiftBar
|
case hideSwiftBar
|
||||||
case environment
|
case environment
|
||||||
case runInBash
|
case runInBash
|
||||||
|
case refreshOnOpen
|
||||||
|
|
||||||
var optionType: [PluginMetadataType] {
|
var optionType: [PluginMetadataType] {
|
||||||
switch self {
|
switch self {
|
||||||
case .title, .version, .author, .github, .desc, .about, .image, .dependencies:
|
case .title, .version, .author, .github, .desc, .about, .image, .dependencies:
|
||||||
return [.bitbar, .xbar]
|
return [.bitbar, .xbar]
|
||||||
case .runInBash, .environment, .droptypes, .schedule, .type, .hideAbout, .hideRunInTerminal, .hideLastUpdated, .hideDisablePlugin, .hideSwiftBar:
|
case .runInBash, .environment, .droptypes, .schedule, .type, .hideAbout, .hideRunInTerminal, .hideLastUpdated, .hideDisablePlugin, .hideSwiftBar, .refreshOnOpen:
|
||||||
return [.swiftbar]
|
return [.swiftbar]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,6 +58,7 @@ class PluginMetadata: ObservableObject {
|
|||||||
@Published var hideSwiftBar: Bool
|
@Published var hideSwiftBar: Bool
|
||||||
@Published var environment: [String: String]
|
@Published var environment: [String: String]
|
||||||
@Published var runInBash: Bool
|
@Published var runInBash: Bool
|
||||||
|
@Published var refreshOnOpen: Bool
|
||||||
|
|
||||||
var isEmpty: Bool {
|
var isEmpty: Bool {
|
||||||
name.isEmpty
|
name.isEmpty
|
||||||
@ -74,7 +76,7 @@ class PluginMetadata: ObservableObject {
|
|||||||
return try? cron.next()
|
return try? cron.next()
|
||||||
}
|
}
|
||||||
|
|
||||||
init(name: String = "", version: String = "", author: String = "", github: String = "", desc: String = "", previewImageURL: URL? = nil, dependencies: [String] = [], aboutURL: URL? = nil, dropTypes: [String] = [], schedule: String = "", type: PluginType = .Executable, hideAbout: Bool = false, hideRunInTerminal: Bool = false, hideLastUpdated: Bool = false, hideDisablePlugin: Bool = false, hideSwiftBar: Bool = false, environment: [String: String] = [:], runInBash: Bool = true) {
|
init(name: String = "", version: String = "", author: String = "", github: String = "", desc: String = "", previewImageURL: URL? = nil, dependencies: [String] = [], aboutURL: URL? = nil, dropTypes: [String] = [], schedule: String = "", type: PluginType = .Executable, hideAbout: Bool = false, hideRunInTerminal: Bool = false, hideLastUpdated: Bool = false, hideDisablePlugin: Bool = false, hideSwiftBar: Bool = false, environment: [String: String] = [:], runInBash: Bool = true, refreshOnOpen: Bool = false) {
|
||||||
self.name = name
|
self.name = name
|
||||||
self.version = version
|
self.version = version
|
||||||
self.author = author
|
self.author = author
|
||||||
@ -93,6 +95,7 @@ class PluginMetadata: ObservableObject {
|
|||||||
self.hideSwiftBar = hideSwiftBar
|
self.hideSwiftBar = hideSwiftBar
|
||||||
self.environment = environment
|
self.environment = environment
|
||||||
self.runInBash = runInBash
|
self.runInBash = runInBash
|
||||||
|
self.refreshOnOpen = refreshOnOpen
|
||||||
}
|
}
|
||||||
|
|
||||||
var shouldRunInBash: Bool {
|
var shouldRunInBash: Bool {
|
||||||
@ -109,6 +112,9 @@ class PluginMetadata: ObservableObject {
|
|||||||
let closeTag = "</\(prefix).\(tag.rawValue)>"
|
let closeTag = "</\(prefix).\(tag.rawValue)>"
|
||||||
return script.slice(from: openTag, to: closeTag)
|
return script.slice(from: openTag, to: closeTag)
|
||||||
}
|
}
|
||||||
|
if tag == .refreshOnOpen {
|
||||||
|
print(values)
|
||||||
|
}
|
||||||
return values.last ?? ""
|
return values.last ?? ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,7 +155,9 @@ class PluginMetadata: ObservableObject {
|
|||||||
hideDisablePlugin: getTagValue(tag: .hideDisablePlugin) == "true",
|
hideDisablePlugin: getTagValue(tag: .hideDisablePlugin) == "true",
|
||||||
hideSwiftBar: getTagValue(tag: .hideSwiftBar) == "true",
|
hideSwiftBar: getTagValue(tag: .hideSwiftBar) == "true",
|
||||||
environment: environment,
|
environment: environment,
|
||||||
runInBash: getTagValue(tag: .runInBash) == "false" ? false : true)
|
runInBash: getTagValue(tag: .runInBash) == "false" ? false : true,
|
||||||
|
refreshOnOpen: getTagValue(tag: .refreshOnOpen) == "true" ? true: false
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func parser(fileURL: URL) -> PluginMetadata? {
|
static func parser(fileURL: URL) -> PluginMetadata? {
|
||||||
@ -215,6 +223,8 @@ class PluginMetadata: ObservableObject {
|
|||||||
value = environment.map { "\($0.key):\($0.value)" }.joined(separator: ",")
|
value = environment.map { "\($0.key):\($0.value)" }.joined(separator: ",")
|
||||||
case .runInBash:
|
case .runInBash:
|
||||||
value = runInBash ? "" : "false"
|
value = runInBash ? "" : "false"
|
||||||
|
case .refreshOnOpen:
|
||||||
|
value = refreshOnOpen ? "true" : ""
|
||||||
}
|
}
|
||||||
guard !value.isEmpty else { return }
|
guard !value.isEmpty else { return }
|
||||||
let tag = option
|
let tag = option
|
||||||
|
Loading…
Reference in New Issue
Block a user