diff --git a/Modules/Disk/main.swift b/Modules/Disk/main.swift index 2b873dde..72656ae1 100644 --- a/Modules/Disk/main.swift +++ b/Modules/Disk/main.swift @@ -251,6 +251,11 @@ public class Disk: Module { } } + self.popupView.refreshCallback = { [weak self] uuid in + self?.capacityReader?.resetPurgableSpace(for: uuid) + self?.capacityReader?.read() + } + self.selectedDisk = Store.shared.string(key: "\(ModuleType.disk.stringValue)_disk", defaultValue: self.selectedDisk) self.settingsView.selectedDiskHandler = { [weak self] value in diff --git a/Modules/Disk/popup.swift b/Modules/Disk/popup.swift index d647c2cf..bbe87279 100644 --- a/Modules/Disk/popup.swift +++ b/Modules/Disk/popup.swift @@ -13,6 +13,8 @@ import Cocoa import Kit internal class Popup: PopupWrapper { + public var refreshCallback: ((String) -> Void) = {_ in } + private var readColorState: SColor = .secondBlue private var readColor: NSColor { self.readColorState.additional as? NSColor ?? NSColor.systemRed } private var writeColorState: SColor = .secondRed @@ -140,7 +142,8 @@ internal class Popup: PopupWrapper { free: drive.free, path: drive.path, smart: drive.smart, - resize: self.recalculateHeight + resize: self.recalculateHeight, + refresh: self.refreshCallback )) } } @@ -271,6 +274,7 @@ internal class Popup: PopupWrapper { internal class DiskView: NSStackView { internal var sizeCallback: (() -> Void) = {} + internal var refreshCallback: ((String) -> Void) = {_ in } public var name: String public var uuid: String @@ -287,8 +291,9 @@ internal class DiskView: NSStackView { set { Store.shared.set(key: "\(self.uuid)_details", value: newValue) } } - init(width: CGFloat, uuid: String = "", name: String = "", size: Int64 = 1, free: Int64 = 1, path: URL? = nil, smart: smart_t? = nil, resize: @escaping () -> Void) { + init(width: CGFloat, uuid: String, name: String, size: Int64 = 1, free: Int64 = 1, path: URL? = nil, smart: smart_t? = nil, resize: @escaping () -> Void, refresh: @escaping (String) -> Void) { self.sizeCallback = resize + self.refreshCallback = refresh self.uuid = uuid self.name = name self.width = width @@ -314,6 +319,10 @@ internal class DiskView: NSStackView { s.detailsState = !s.detailsState s.toggleDetails() } + self.nameView.refreshCallback = { [weak self] in + guard let uuid = self?.uuid else { return } + self?.refreshCallback(uuid) + } self.addArrangedSubview(self.nameView) self.addArrangedSubview(self.chartView) @@ -366,6 +375,7 @@ internal class DiskView: NSStackView { internal class NameView: NSStackView { internal var detailsCallback: (() -> Void) = {} + internal var refreshCallback: (() -> Void) = {} private let size: Int64 private let uri: URL? @@ -401,7 +411,7 @@ internal class NameView: NSStackView { nameField.contentTintColor = .labelColor nameField.action = #selector(self.openDisk) nameField.target = self - nameField.toolTip = localizedString("Control") + nameField.toolTip = name nameField.title = name nameField.cell?.truncatesLastVisibleLine = true @@ -429,21 +439,33 @@ internal class NameView: NSStackView { activity.addArrangedSubview(readState) activity.addArrangedSubview(writeState) - let button = NSButton() - button.frame = CGRect(x: (self.frame.width/3)-20, y: 10, width: 15, height: 15) - button.bezelStyle = .regularSquare - button.isBordered = false - button.imageScaling = NSImageScaling.scaleAxesIndependently - button.contentTintColor = .lightGray - button.action = #selector(self.toggleDetails) - button.target = self - button.toolTip = localizedString("Control") - button.image = Bundle(for: Module.self).image(forResource: "tune")! + let refreshButton = NSButton() + refreshButton.frame = CGRect(x: (self.frame.width/3)-40, y: 10, width: 15, height: 15) + refreshButton.bezelStyle = .regularSquare + refreshButton.isBordered = false + refreshButton.imageScaling = NSImageScaling.scaleAxesIndependently + refreshButton.contentTintColor = .lightGray + refreshButton.action = #selector(self.refreshDisk) + refreshButton.target = self + refreshButton.toolTip = localizedString("Refresh disk information") + refreshButton.image = Bundle(for: Module.self).image(forResource: "refresh")! + + let detailsButton = NSButton() + detailsButton.frame = CGRect(x: (self.frame.width/3)-20, y: 10, width: 15, height: 15) + detailsButton.bezelStyle = .regularSquare + detailsButton.isBordered = false + detailsButton.imageScaling = NSImageScaling.scaleAxesIndependently + detailsButton.contentTintColor = .lightGray + detailsButton.action = #selector(self.toggleDetails) + detailsButton.target = self + detailsButton.toolTip = localizedString("Disk details") + detailsButton.image = Bundle(for: Module.self).image(forResource: "tune")! self.addArrangedSubview(nameField) self.addArrangedSubview(activity) self.addArrangedSubview(NSView()) - self.addArrangedSubview(button) + self.addArrangedSubview(refreshButton) + self.addArrangedSubview(detailsButton) self.widthAnchor.constraint(equalToConstant: self.frame.width).isActive = true self.heightAnchor.constraint(equalToConstant: self.frame.height).isActive = true @@ -476,6 +498,10 @@ internal class NameView: NSStackView { @objc private func toggleDetails() { self.detailsCallback() } + + @objc private func refreshDisk() { + self.refreshCallback() + } } internal class ChartView: NSStackView { diff --git a/Modules/Disk/readers.swift b/Modules/Disk/readers.swift index 6402bd4f..c9b96d8e 100644 --- a/Modules/Disk/readers.swift +++ b/Modules/Disk/readers.swift @@ -97,6 +97,12 @@ internal class CapacityReader: Reader { self.callback(self.list) } + public func resetPurgableSpace(for uuid: String) { + if let disk = self.list.first(where: { $0.uuid == uuid }), let path = disk.path { + self.purgableSpace.removeValue(forKey: path) + } + } + private func freeDiskSpaceInBytes(_ path: URL) -> Int64 { var stat = statfs() if statfs(path.path, &stat) == 0 {