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:
Serhiy Mytrovtsiy
2021-03-30 20:34:50 +02:00
parent 9fe3c54805
commit 5eb709ccf3
16 changed files with 188 additions and 44 deletions

View File

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

View 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
})
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 */,

View File

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