From e24a9ef2a2f68a2a2523101c810e89ce402af178 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 1 Aug 2020 19:56:57 +0200 Subject: [PATCH] - update settings view (moved all view to one scroll view) --- ModuleKit/settings.swift | 198 +++++++++++++++++++++++---------- Modules/Battery/settings.swift | 7 +- Modules/CPU/settings.swift | 4 +- Modules/Disk/settings.swift | 4 +- Modules/Memory/settings.swift | 4 +- Modules/Net/settings.swift | 7 +- Modules/Sensors/settings.swift | 4 +- 7 files changed, 157 insertions(+), 71 deletions(-) diff --git a/ModuleKit/settings.swift b/ModuleKit/settings.swift index aa539ea0..f678d82e 100644 --- a/ModuleKit/settings.swift +++ b/ModuleKit/settings.swift @@ -28,6 +28,8 @@ open class Settings: NSView, Settings_p { private let headerHeight: CGFloat = 42 private var widgetSelectorHeight: CGFloat = Constants.Widget.height + (Constants.Settings.margin*2) + private var settingsView: NSView = NSView() + private var widgetSelectorView: NSView? = nil private var widgetSettingsView: NSView? = nil private var moduleSettingsView: NSView? = nil @@ -50,8 +52,11 @@ open class Settings: NSView, Settings_p { NotificationCenter.default.addObserver(self, selector: #selector(externalModuleToggle), name: .toggleModule, object: nil) self.addHeader(state: enabled) + self.addSettings() + self.addWidgetSelector() self.addWidgetSettings() + if self.moduleSettings != nil { self.moduleSettings?.load(widget: self.activeWidget?.type ?? .unknown) self.addModuleSettings() @@ -62,66 +67,35 @@ open class Settings: NSView, Settings_p { NotificationCenter.default.removeObserver(self) } - @objc func externalModuleToggle(_ notification: Notification) { - if let name = notification.userInfo?["module"] as? String { - if name == self.config.pointee.name { - if let state = notification.userInfo?["state"] as? Bool { - ToggleNSControlState(self.enableControl, state: state ? .on : .off) - } - } - } + required public init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") } - private func addModuleSettings() { - guard self.moduleSettings?.frame.height != 0 else { - return - } - - let maxHeight: CGFloat = Constants.Settings.height - self.headerHeight - self.widgetSelectorHeight - (self.widgetSettingsView?.frame.height ?? 0) - (Constants.Settings.margin*3) - let h: CGFloat = self.moduleSettings!.frame.height > maxHeight ? maxHeight : self.moduleSettings!.frame.height - var y: CGFloat = Constants.Settings.height - self.headerHeight - self.widgetSelectorHeight - (self.widgetSettingsView?.frame.height ?? 0) - (Constants.Settings.margin*3) - h - if y == 0 { - y = Constants.Settings.margin - } - + private func addSettings() { let view: NSScrollView = NSScrollView(frame: NSRect( - x: Constants.Settings.margin, - y: y, - width: self.frame.width - (Constants.Settings.margin*2), - height: h + x: 0, + y: 0, + width: self.frame.width, + height: Constants.Settings.height - self.headerHeight )) view.wantsLayer = true - view.layer?.backgroundColor = .white - view.layer!.cornerRadius = 3 + view.backgroundColor = NSColor(hexString: "#ececec") + view.translatesAutoresizingMaskIntoConstraints = true view.borderType = .noBorder view.hasVerticalScroller = true + view.hasHorizontalScroller = false view.autohidesScrollers = true + view.horizontalScrollElasticity = .none - view.documentView = self.moduleSettings - view.documentView?.scroll(NSPoint(x: 0, y: view.documentView!.bounds.size.height)) + let settings: NSView = FlippedView(frame: NSRect(x: 0, y: 0, width: view.frame.width, height: 0)) + settings.wantsLayer = true + settings.layer?.backgroundColor = NSColor(hexString: "#ececec").cgColor + + view.documentView = settings self.addSubview(view) - self.moduleSettingsView = view - } - - private func addWidgetSettings() { - if self.activeWidget == nil { - return - } - - let view: NSView = NSView(frame: NSRect(x: Constants.Settings.margin, y: self.frame.height - headerHeight - widgetSelectorHeight - (Constants.Settings.margin*2), width: self.frame.width - (Constants.Settings.margin*2), height: 0)) - view.wantsLayer = true - view.layer?.backgroundColor = .white - view.layer!.cornerRadius = 3 - - self.activeWidget?.settings(superview: view) - - if view.frame.height != 0 { - view.setFrameOrigin(NSPoint(x: view.frame.origin.x, y: view.frame.origin.y - view.frame.height)) - self.addSubview(view) - self.widgetSettingsView = view - } + self.settingsView = settings } private func addWidgetSelector() { @@ -130,7 +104,12 @@ open class Settings: NSView, Settings_p { return } - let view: NSView = NSView(frame: NSRect(x: Constants.Settings.margin, y: self.frame.height - self.headerHeight - self.widgetSelectorHeight - Constants.Settings.margin, width: self.frame.width - (Constants.Settings.margin*2), height: self.widgetSelectorHeight)) + let view: NSView = NSView(frame: NSRect( + x : Constants.Settings.margin, + y: Constants.Settings.margin, + width: self.settingsView.frame.width - (Constants.Settings.margin*2), + height: self.widgetSelectorHeight + )) view.wantsLayer = true view.layer?.backgroundColor = .white view.layer!.cornerRadius = 3 @@ -153,8 +132,92 @@ open class Settings: NSView, Settings_p { } } - self.addSubview(view) + self.settingsView.addSubview(view) self.widgetSelectorView = view + self.resize() + } + + private func addWidgetSettings() { + if self.activeWidget == nil { + return + } + + var y: CGFloat = Constants.Settings.margin + if self.widgetSelectorView != nil { + y += self.widgetSelectorView!.frame.height + Constants.Settings.margin + } + + let view: NSView = NSView(frame: NSRect( + x: Constants.Settings.margin, + y: y, + width: self.settingsView.frame.width - (Constants.Settings.margin*2), + height: 0 + )) + view.wantsLayer = true + view.layer?.backgroundColor = .white + view.layer!.cornerRadius = 3 + + self.activeWidget?.settings(superview: view) + + if view.frame.height != 0 { + self.settingsView.addSubview(view) + self.widgetSettingsView = view + self.resize() + } + } + + private func addModuleSettings() { + if self.moduleSettings == nil || self.moduleSettings?.frame.height == 0 { + return + } + + var y: CGFloat = Constants.Settings.margin + if self.widgetSelectorView != nil { + y += self.widgetSelectorView!.frame.height + Constants.Settings.margin + } + if self.widgetSettingsView != nil { + y += self.widgetSettingsView!.frame.height + Constants.Settings.margin + } + + let view: NSView = NSView(frame: NSRect( + x: Constants.Settings.margin, + y: y, + width: self.settingsView.frame.width - (Constants.Settings.margin*2), + height: self.moduleSettings?.frame.height ?? 0 + )) + view.wantsLayer = true + view.layer?.backgroundColor = .white + view.layer!.cornerRadius = 3 + + view.addSubview(self.moduleSettings!) + + self.settingsView.addSubview(view) + self.moduleSettingsView = view + self.resize() + } + + private func resize() { + var height: CGFloat = Constants.Settings.margin + + self.settingsView.subviews.forEach({ (v: NSView) in + height += v.frame.height + Constants.Settings.margin + }) + + if height > Constants.Settings.height - self.headerHeight { + if let view = self.widgetSelectorView { + view.setFrameSize(NSSize(width: view.frame.width-Constants.Settings.margin, height: view.frame.height)) + } + if let view = self.widgetSettingsView { + view.setFrameSize(NSSize(width: view.frame.width-Constants.Settings.margin, height: view.frame.height)) + } + if let view = self.moduleSettingsView { + view.setFrameSize(NSSize(width: view.frame.width-Constants.Settings.margin, height: view.frame.height)) + } + } + + if self.settingsView.frame.height != height { + self.settingsView.setFrameSize(NSSize(width: self.settingsView.frame.width, height: height)) + } } private func recalculateWidgetSelectorOptionsWidth() { @@ -187,7 +250,7 @@ open class Settings: NSView, Settings_p { switchButton.state = state ? .on : .off switchButton.action = #selector(self.toggleEnable) switchButton.target = self - + toggle = switchButton } else { let button: NSButton = NSButton(frame: NSRect(x: self.frame.width-30, y: 0, width: 15, height: view.frame.height)) @@ -218,22 +281,35 @@ open class Settings: NSView, Settings_p { self.toggleCallback() } - public func setActiveWidget(_ widget: Widget_p?) { - self.activeWidget = widget - - self.subviews.filter{ $0 == self.widgetSettingsView || $0 == self.moduleSettingsView }.forEach{ $0.removeFromSuperview() } - self.addWidgetSettings() - if self.moduleSettings != nil { - self.moduleSettings?.load(widget: self.activeWidget?.type ?? .unknown) - addModuleSettings() + @objc func externalModuleToggle(_ notification: Notification) { + if let name = notification.userInfo?["module"] as? String { + if name == self.config.pointee.name { + if let state = notification.userInfo?["state"] as? Bool { + ToggleNSControlState(self.enableControl, state: state ? .on : .off) + } + } } } - required public init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") + public func setActiveWidget(_ widget: Widget_p?) { + self.activeWidget = widget + + self.widgetSettingsView?.removeFromSuperview() + self.moduleSettingsView?.removeFromSuperview() + + self.addWidgetSettings() + + if self.moduleSettings != nil { + self.moduleSettings?.load(widget: self.activeWidget?.type ?? .unknown) + self.addModuleSettings() + } } } +open class FlippedView: NSView { + open override var isFlipped: Bool { true } +} + class WidgetPreview: NSView { private let type: widget_t private var state: Bool diff --git a/Modules/Battery/settings.swift b/Modules/Battery/settings.swift index 7f266785..5347adef 100644 --- a/Modules/Battery/settings.swift +++ b/Modules/Battery/settings.swift @@ -32,7 +32,12 @@ internal class Settings: NSView, Settings_v { self.title = title self.store = store - super.init(frame: CGRect(x: Constants.Settings.margin, y: Constants.Settings.margin, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0)) + super.init(frame: CGRect( + x: 0, + y: 0, + width: Constants.Settings.width - (Constants.Settings.margin*2), + height: 0 + )) self.wantsLayer = true self.canDrawConcurrently = true diff --git a/Modules/CPU/settings.swift b/Modules/CPU/settings.swift index 9a4ff1d4..f2fd87fb 100644 --- a/Modules/CPU/settings.swift +++ b/Modules/CPU/settings.swift @@ -38,8 +38,8 @@ internal class Settings: NSView, Settings_v { } super.init(frame: CGRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin, + x: 0, + y: 0, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0 )) diff --git a/Modules/Disk/settings.swift b/Modules/Disk/settings.swift index d8cb5d57..15c2137b 100644 --- a/Modules/Disk/settings.swift +++ b/Modules/Disk/settings.swift @@ -35,8 +35,8 @@ internal class Settings: NSView, Settings_v { self.updateIntervalValue = store.pointee.string(key: "\(self.title)_updateInterval", defaultValue: self.updateIntervalValue) super.init(frame: CGRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin, + x: 0, + y: 0, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0 )) diff --git a/Modules/Memory/settings.swift b/Modules/Memory/settings.swift index 7913831a..a786c00f 100644 --- a/Modules/Memory/settings.swift +++ b/Modules/Memory/settings.swift @@ -29,8 +29,8 @@ internal class Settings: NSView, Settings_v { self.updateIntervalValue = store.pointee.string(key: "\(self.title)_updateInterval", defaultValue: self.updateIntervalValue) super.init(frame: CGRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin, + x: 0, + y: 0, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0 )) diff --git a/Modules/Net/settings.swift b/Modules/Net/settings.swift index 68d642a0..6132d7c2 100644 --- a/Modules/Net/settings.swift +++ b/Modules/Net/settings.swift @@ -27,7 +27,12 @@ internal class Settings: NSView, Settings_v { self.title = title self.store = store - super.init(frame: CGRect(x: Constants.Settings.margin, y: Constants.Settings.margin, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0)) + super.init(frame: CGRect( + x: 0, + y: 0, + width: Constants.Settings.width - (Constants.Settings.margin*2), + height: 0 + )) for interface in SCNetworkInterfaceCopyAll() as NSArray { if let bsdName = SCNetworkInterfaceGetBSDName(interface as! SCNetworkInterface), diff --git a/Modules/Sensors/settings.swift b/Modules/Sensors/settings.swift index 10c52daa..9e499789 100644 --- a/Modules/Sensors/settings.swift +++ b/Modules/Sensors/settings.swift @@ -30,8 +30,8 @@ internal class Settings: NSView, Settings_v { self.list = list super.init(frame: CGRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin, + x: 0, + y: 0, width: Constants.Settings.width - (Constants.Settings.margin*2), height: 0 ))