mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
feat: init Label widget (#376)
feat: removed labels option from `Bar, Line and Pie chart` widgets feat: added `Label widget` to the all modules feat: removed another UnsafeMutablePointer
This commit is contained in:
@@ -13,7 +13,7 @@ import Cocoa
|
||||
import StatsKit
|
||||
|
||||
public class BarChart: WidgetWrapper {
|
||||
private var labelState: Bool = true
|
||||
private var labelState: Bool = false
|
||||
private var boxState: Bool = true
|
||||
private var frameState: Bool = false
|
||||
private var colorState: widget_c = .systemAccent
|
||||
|
||||
71
ModuleKit/Widgets/Label.swift
Normal file
71
ModuleKit/Widgets/Label.swift
Normal file
@@ -0,0 +1,71 @@
|
||||
//
|
||||
// Label.swift
|
||||
// ModuleKit
|
||||
//
|
||||
// Created by Serhiy Mytrovtsiy on 30/03/2021.
|
||||
// Using Swift 5.0.
|
||||
// Running on macOS 10.15.
|
||||
//
|
||||
// Copyright © 2021 Serhiy Mytrovtsiy. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
import StatsKit
|
||||
|
||||
public class Label: WidgetWrapper {
|
||||
private var label: String
|
||||
|
||||
public init(title: String, config: NSDictionary, preview: Bool = false) {
|
||||
if let title = config["Title"] as? String {
|
||||
self.label = title
|
||||
} else {
|
||||
self.label = title
|
||||
}
|
||||
|
||||
super.init(.label, title: title, frame: CGRect(
|
||||
x: 0,
|
||||
y: Constants.Widget.margin.y,
|
||||
width: 6 + (2*Constants.Widget.margin.x),
|
||||
height: Constants.Widget.height - (2*Constants.Widget.margin.y)
|
||||
))
|
||||
|
||||
self.canDrawConcurrently = true
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
public override func draw(_ dirtyRect: NSRect) {
|
||||
super.draw(dirtyRect)
|
||||
|
||||
let size: CGSize = CGSize(width: 6, height: self.frame.height / 3)
|
||||
var margin: CGPoint = CGPoint(x: Constants.Widget.margin.x, y: 0)
|
||||
let style = NSMutableParagraphStyle()
|
||||
style.alignment = .center
|
||||
|
||||
let stringAttributes = [
|
||||
NSAttributedString.Key.font: NSFont.systemFont(ofSize: 7, weight: .regular),
|
||||
NSAttributedString.Key.foregroundColor: NSColor.textColor,
|
||||
NSAttributedString.Key.paragraphStyle: style
|
||||
]
|
||||
|
||||
for char in String(self.label.prefix(3)).uppercased().reversed() {
|
||||
let rect = CGRect(x: margin.x, y: margin.y, width: size.width, height: size.height)
|
||||
let str = NSAttributedString.init(string: "\(char)", attributes: stringAttributes)
|
||||
str.draw(with: rect)
|
||||
margin.y += size.height
|
||||
}
|
||||
}
|
||||
|
||||
public func setLabel(_ new: String) {
|
||||
if self.label == new {
|
||||
return
|
||||
}
|
||||
|
||||
self.label = new
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.needsDisplay = true
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ import Cocoa
|
||||
import StatsKit
|
||||
|
||||
public class LineChart: WidgetWrapper {
|
||||
private var labelState: Bool = true
|
||||
private var labelState: Bool = false
|
||||
private var boxState: Bool = true
|
||||
private var frameState: Bool = false
|
||||
private var valueState: Bool = false
|
||||
|
||||
@@ -13,7 +13,7 @@ import Cocoa
|
||||
import StatsKit
|
||||
|
||||
public class PieChart: WidgetWrapper {
|
||||
private var labelState: Bool = true
|
||||
private var labelState: Bool = false
|
||||
|
||||
private var chart: PieChartView = PieChartView(
|
||||
frame: NSRect(
|
||||
|
||||
@@ -275,6 +275,9 @@ internal class WidgetPreview: NSStackView {
|
||||
private var widget: UnsafeMutablePointer<Widget>
|
||||
private var size: CGFloat {
|
||||
get {
|
||||
if self.widget.pointee.type == .label {
|
||||
return Constants.Widget.spacing*2
|
||||
}
|
||||
return self.widget.pointee.isActive ? Constants.Widget.height + (Constants.Widget.spacing*3) + 1 : Constants.Widget.spacing*2
|
||||
}
|
||||
}
|
||||
@@ -321,7 +324,7 @@ internal class WidgetPreview: NSStackView {
|
||||
container.addSubview(widget.pointee.preview)
|
||||
|
||||
self.addArrangedSubview(container)
|
||||
if self.widget.pointee.isActive {
|
||||
if self.widget.pointee.isActive && self.widget.pointee.type != .label {
|
||||
self.addArrangedSubview(self.separator)
|
||||
if let button = self.button {
|
||||
self.addArrangedSubview(button)
|
||||
@@ -412,15 +415,17 @@ internal class WidgetPreview: NSStackView {
|
||||
self.widget.pointee.toggle()
|
||||
self.stateCallback()
|
||||
|
||||
if self.widget.pointee.isActive {
|
||||
self.addArrangedSubview(self.separator)
|
||||
if let button = self.button {
|
||||
self.addArrangedSubview(button)
|
||||
}
|
||||
} else {
|
||||
self.removeView(self.separator)
|
||||
if let button = self.button {
|
||||
self.removeView(button)
|
||||
if self.widget.pointee.type != .label {
|
||||
if self.widget.pointee.isActive {
|
||||
self.addArrangedSubview(self.separator)
|
||||
if let button = self.button {
|
||||
self.addArrangedSubview(button)
|
||||
}
|
||||
} else {
|
||||
self.removeView(self.separator)
|
||||
if let button = self.button {
|
||||
self.removeView(button)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ public enum widget_t: String {
|
||||
case battery = "battery"
|
||||
case sensors = "sensors"
|
||||
case memory = "memory"
|
||||
case label = "label"
|
||||
|
||||
public func new(module: String, config: NSDictionary, defaultWidget: widget_t) -> Widget? {
|
||||
var preview: widget_p? = nil
|
||||
@@ -69,6 +70,10 @@ public enum widget_t: String {
|
||||
preview = MemoryWidget(title: module, config: widgetConfig, preview: true)
|
||||
item = MemoryWidget(title: module, config: widgetConfig, preview: false)
|
||||
break
|
||||
case .label:
|
||||
preview = Label(title: module, config: widgetConfig, preview: true)
|
||||
item = Label(title: module, config: widgetConfig, preview: false)
|
||||
break
|
||||
default: break
|
||||
}
|
||||
|
||||
@@ -90,6 +95,7 @@ public enum widget_t: String {
|
||||
case .battery: return LocalizedString("Battery widget")
|
||||
case .sensors: return LocalizedString("Text widget")
|
||||
case .memory: return LocalizedString("Memory widget")
|
||||
case .label: return LocalizedString("Label widget")
|
||||
default: return ""
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<true/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mini</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -32,7 +39,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>bar_chart</key>
|
||||
<dict>
|
||||
@@ -51,14 +58,14 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>battery</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<true/>
|
||||
<key>Order</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<true/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mini</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -22,7 +29,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>line_chart</key>
|
||||
<dict>
|
||||
@@ -35,7 +42,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>bar_chart</key>
|
||||
<dict>
|
||||
@@ -53,14 +60,14 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
<key>pie_chart</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>3</integer>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,15 @@
|
||||
<true/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Title</key>
|
||||
<string>SSD</string>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mini</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -26,7 +35,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>bar_chart</key>
|
||||
<dict>
|
||||
@@ -54,7 +63,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>memory</key>
|
||||
<dict>
|
||||
@@ -66,14 +75,12 @@
|
||||
<string>47.85 GB, 184.84 GB</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
<key>speed</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>3</integer>
|
||||
<key>Icon</key>
|
||||
<string>characters</string>
|
||||
<key>Symbols</key>
|
||||
@@ -81,6 +88,8 @@
|
||||
<string>W</string>
|
||||
<string>R</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<false/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>sensors</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -18,7 +25,7 @@
|
||||
<string>2160 RPM,1990 RPM</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<false/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mini</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -22,7 +29,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>line_chart</key>
|
||||
<dict>
|
||||
@@ -35,7 +42,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>bar_chart</key>
|
||||
<dict>
|
||||
@@ -53,7 +60,7 @@
|
||||
<string>pressure</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,24 +8,31 @@
|
||||
<true/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>speed</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<true/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<key>Symbols</key>
|
||||
<array>
|
||||
<string>U</string>
|
||||
<string>D</string>
|
||||
</array>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>network_chart</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<true/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>mini</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -18,7 +25,7 @@
|
||||
<string>0.58</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>line_chart</key>
|
||||
<dict>
|
||||
@@ -27,7 +34,7 @@
|
||||
<key>Color</key>
|
||||
<string>systemAccent</string>
|
||||
<key>Order</key>
|
||||
<integer>1</integer>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
<key>bar_chart</key>
|
||||
<dict>
|
||||
@@ -51,14 +58,14 @@
|
||||
<string>0.48</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>2</integer>
|
||||
<integer>3</integer>
|
||||
</dict>
|
||||
<key>pie_chart</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>3</integer>
|
||||
<integer>4</integer>
|
||||
</dict>
|
||||
<key>memory</key>
|
||||
<dict>
|
||||
@@ -70,7 +77,7 @@
|
||||
<string>7.75 GB, 8.25 GB</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>4</integer>
|
||||
<integer>5</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -8,6 +8,13 @@
|
||||
<false/>
|
||||
<key>Widgets</key>
|
||||
<dict>
|
||||
<key>label</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
<false/>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>sensors</key>
|
||||
<dict>
|
||||
<key>Default</key>
|
||||
@@ -18,7 +25,7 @@
|
||||
<string>38°,41°</string>
|
||||
</dict>
|
||||
<key>Order</key>
|
||||
<integer>0</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
9A58DE9E24B363D800716A9F /* popup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58DE9D24B363D800716A9F /* popup.swift */; };
|
||||
9A58DEA024B363F300716A9F /* settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58DE9F24B363F300716A9F /* settings.swift */; };
|
||||
9A58DEA424B3647600716A9F /* settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58DEA324B3647600716A9F /* settings.swift */; };
|
||||
9A599701261121F00043560F /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A599700261121F00043560F /* Label.swift */; };
|
||||
9A5AF11B2469CE9B00684737 /* popup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5AF11A2469CE9B00684737 /* popup.swift */; };
|
||||
9A65295825B78056005E2DE4 /* NetworkChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A65295725B78056005E2DE4 /* NetworkChart.swift */; };
|
||||
9A65654A253F20EF0096B607 /* settings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A656549253F20EF0096B607 /* settings.swift */; };
|
||||
@@ -403,6 +404,7 @@
|
||||
9A58DE9D24B363D800716A9F /* popup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = popup.swift; sourceTree = "<group>"; };
|
||||
9A58DE9F24B363F300716A9F /* settings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = settings.swift; sourceTree = "<group>"; };
|
||||
9A58DEA324B3647600716A9F /* settings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = settings.swift; sourceTree = "<group>"; };
|
||||
9A599700261121F00043560F /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = "<group>"; };
|
||||
9A5AF11A2469CE9B00684737 /* popup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = popup.swift; sourceTree = "<group>"; };
|
||||
9A5F0503256A9135002FF75F /* nb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nb; path = nb.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
9A65295725B78056005E2DE4 /* NetworkChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkChart.swift; sourceTree = "<group>"; };
|
||||
@@ -715,6 +717,7 @@
|
||||
9ABFF911248BF39500C9041A /* Battery.swift */,
|
||||
9AE29AFD249A82B70071B02D /* Sensors.swift */,
|
||||
9A41530B24ABC3AF00A2BDA7 /* Memory.swift */,
|
||||
9A599700261121F00043560F /* Label.swift */,
|
||||
);
|
||||
path = Widgets;
|
||||
sourceTree = "<group>";
|
||||
@@ -1524,6 +1527,7 @@
|
||||
9A20E6DA2575555100AC2302 /* PieChart.swift in Sources */,
|
||||
9A944D55244920690058F32A /* reader.swift in Sources */,
|
||||
9A65295825B78056005E2DE4 /* NetworkChart.swift in Sources */,
|
||||
9A599701261121F00043560F /* Label.swift in Sources */,
|
||||
9A7C61B42440DF810032695D /* Mini.swift in Sources */,
|
||||
9AE29AFE249A82B70071B02D /* Sensors.swift in Sources */,
|
||||
9A944D5D24492A8B0058F32A /* popup.swift in Sources */,
|
||||
|
||||
@@ -60,7 +60,7 @@ class SettingsWindow: NSWindow, NSWindowDelegate {
|
||||
}
|
||||
|
||||
public func setModules() {
|
||||
self.viewController.setModules(&modules)
|
||||
self.viewController.setModules(modules)
|
||||
if modules.filter({ $0.enabled != false && $0.available != false }).count == 0 {
|
||||
self.setIsVisible(true)
|
||||
}
|
||||
@@ -95,7 +95,7 @@ private class SettingsViewController: NSViewController {
|
||||
super.viewDidLoad()
|
||||
}
|
||||
|
||||
public func setModules(_ list: UnsafeMutablePointer<[Module]>) {
|
||||
public func setModules(_ list: [Module]) {
|
||||
self.settings.setModules(list)
|
||||
}
|
||||
|
||||
@@ -105,7 +105,7 @@ private class SettingsViewController: NSViewController {
|
||||
}
|
||||
|
||||
private class SettingsView: NSView {
|
||||
private var modules: UnsafeMutablePointer<[Module]>?
|
||||
private var modules: [Module] = []
|
||||
|
||||
private let sidebarWidth: CGFloat = 180
|
||||
private let navigationHeight: CGFloat = 45
|
||||
@@ -188,8 +188,8 @@ private class SettingsView: NSView {
|
||||
})
|
||||
}
|
||||
|
||||
public func setModules(_ list: UnsafeMutablePointer<[Module]>) {
|
||||
list.pointee.forEach { (m: Module) in
|
||||
public func setModules(_ list: [Module]) {
|
||||
list.forEach { (m: Module) in
|
||||
if !m.available { return }
|
||||
let n: Int = self.menuView.subviews.count - 1
|
||||
let menu: NSView = MenuView(n: n, icon: m.config.icon, title: m.config.name)
|
||||
@@ -202,7 +202,7 @@ private class SettingsView: NSView {
|
||||
if let title = notification.userInfo?["module"] as? String {
|
||||
var view: NSView = NSView()
|
||||
|
||||
if let detectedModule = self.modules?.pointee.first(where: { $0.config.name == title }) {
|
||||
if let detectedModule = self.modules.first(where: { $0.config.name == title }) {
|
||||
if let v = detectedModule.settings {
|
||||
view = v
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user