Adding support for refresh on click #241

This commit is contained in:
Alex Mazanov 2021-11-19 09:58:19 +01:00
parent 19bac5613e
commit e3b7b2425a
No known key found for this signature in database
GPG Key ID: FD35C3C7C1D34AB4
4 changed files with 38 additions and 6 deletions

View File

@ -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.

View File

@ -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) {

View File

@ -148,8 +148,7 @@ class ExecutablePlugin: Plugin {
} }
@objc func scheduledContentUpdate() { @objc func scheduledContentUpdate() {
content = invoke() refresh()
enableTimer()
} }
} }

View File

@ -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