Get rid of the window status bar. Put the current URL at the bottom of the detail view.
This commit is contained in:
parent
1f614c3c6a
commit
2efcd7ea0c
|
@ -99,6 +99,7 @@
|
|||
84B99C9D1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */; };
|
||||
84BB4B771F11753300858766 /* Data.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; };
|
||||
84BB4B781F11753300858766 /* Data.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 84BB4B681F1174D400858766 /* Data.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||
84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */; };
|
||||
84DAEE301F86CAFE0058304B /* OPMLImporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DAEE2F1F86CAFE0058304B /* OPMLImporter.swift */; };
|
||||
84DAEE321F870B390058304B /* DockBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84DAEE311F870B390058304B /* DockBadge.swift */; };
|
||||
84E46C7D1F75EF7B005ECFB3 /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E46C7C1F75EF7B005ECFB3 /* AppDefaults.swift */; };
|
||||
|
@ -494,6 +495,7 @@
|
|||
84B99C9C1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeleteFromSidebarCommand.swift; sourceTree = "<group>"; };
|
||||
84BB4B611F1174D400858766 /* Data.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Data.xcodeproj; path = Frameworks/Data/Data.xcodeproj; sourceTree = "<group>"; };
|
||||
84CBDDAE1FD3674C005A61AA /* Technotes */ = {isa = PBXFileReference; lastKnownFileType = folder; path = Technotes; sourceTree = "<group>"; };
|
||||
84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailStatusBarView.swift; sourceTree = "<group>"; };
|
||||
84DAEE2F1F86CAFE0058304B /* OPMLImporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OPMLImporter.swift; sourceTree = "<group>"; };
|
||||
84DAEE311F870B390058304B /* DockBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = DockBadge.swift; path = Evergreen/DockBadge.swift; sourceTree = "<group>"; };
|
||||
84E46C7C1F75EF7B005ECFB3 /* AppDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDefaults.swift; path = Evergreen/AppDefaults.swift; sourceTree = "<group>"; };
|
||||
|
@ -715,6 +717,7 @@
|
|||
children = (
|
||||
849A977E1ED9EC42007D329B /* DetailViewController.swift */,
|
||||
849A977D1ED9EC42007D329B /* ArticleRenderer.swift */,
|
||||
84D52E941FE588BB00D14F5B /* DetailStatusBarView.swift */,
|
||||
);
|
||||
path = Detail;
|
||||
sourceTree = "<group>";
|
||||
|
@ -1402,6 +1405,7 @@
|
|||
84B99C9D1FAE83C600ECDEDB /* DeleteFromSidebarCommand.swift in Sources */,
|
||||
849A97541ED9EAC0007D329B /* AddFeedWindowController.swift in Sources */,
|
||||
849A976D1ED9EBC8007D329B /* TimelineTableView.swift in Sources */,
|
||||
84D52E951FE588BB00D14F5B /* DetailStatusBarView.swift in Sources */,
|
||||
84B99C671FAE35E600ECDEDB /* FeedListTreeControllerDelegate.swift in Sources */,
|
||||
84B99C691FAE36B800ECDEDB /* FeedListFolder.swift in Sources */,
|
||||
84F204DE1FAACB8B0076E152 /* FeedListTimelineViewController.swift in Sources */,
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="13770" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
|
||||
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="13771" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
|
||||
<dependencies>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13770"/>
|
||||
<capability name="box content view" minToolsVersion="7.0"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13771"/>
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
|
@ -238,7 +237,6 @@
|
|||
<toolbarItem reference="1Ql-WJ-KYi"/>
|
||||
</defaultToolbarItems>
|
||||
</toolbar>
|
||||
<contentBorderThickness minY="25"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="B8D-0N-5wS" id="JSn-lq-Uwe"/>
|
||||
</connections>
|
||||
|
@ -282,12 +280,12 @@
|
|||
<scene sceneID="ZPA-jO-OkH">
|
||||
<objects>
|
||||
<viewController id="reS-fe-pD8" sceneMemberID="viewController">
|
||||
<customView key="view" id="hWY-jP-A4m">
|
||||
<customView key="view" wantsLayer="YES" id="hWY-jP-A4m">
|
||||
<rect key="frame" x="0.0" y="0.0" width="581" height="300"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<containerView appearanceType="aqua" translatesAutoresizingMaskIntoConstraints="NO" id="K1o-Ws-XMQ">
|
||||
<rect key="frame" x="0.0" y="25" width="581" height="275"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="581" height="300"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
|
||||
<color key="value" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
|
@ -297,73 +295,12 @@
|
|||
<segue destination="wEf-EP-9Fq" kind="embed" id="IT3-aj-bSe"/>
|
||||
</connections>
|
||||
</containerView>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="FWz-dC-55q" customClass="StatusBarView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="581" height="25"/>
|
||||
<subviews>
|
||||
<popUpButton translatesAutoresizingMaskIntoConstraints="NO" id="k7g-zd-q4Q" userLabel="Gear Popup Button">
|
||||
<rect key="frame" x="2" y="3" width="42" height="19"/>
|
||||
<popUpButtonCell key="cell" type="bevel" bezelStyle="rounded" alignment="center" lineBreakMode="truncatingTail" state="on" imageScaling="proportionallyDown" inset="2" pullsDown="YES" selectedItem="Ijf-kL-7ym" id="z1h-lo-3qp">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
<font key="font" metaFont="menu"/>
|
||||
<menu key="menu" id="XUl-yC-HKz">
|
||||
<items>
|
||||
<menuItem state="on" image="NSActionTemplate" hidden="YES" id="Ijf-kL-7ym"/>
|
||||
<menuItem title="Do A Thing…" id="8O0-wC-JIP"/>
|
||||
</items>
|
||||
</menu>
|
||||
</popUpButtonCell>
|
||||
</popUpButton>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="749" translatesAutoresizingMaskIntoConstraints="NO" id="Vq0-Di-DO2">
|
||||
<rect key="frame" x="122" y="4" width="4" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingTail" selectable="YES" refusesFirstResponder="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" usesSingleLineMode="YES" id="cUs-6K-KXd">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="NOS-H9-Mdl" userLabel="URL Label">
|
||||
<rect key="frame" x="289" y="4" width="4" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" selectable="YES" refusesFirstResponder="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" usesSingleLineMode="YES" id="JqV-71-gHH">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" white="0.25" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<progressIndicator wantsLayer="YES" maxValue="100" displayedWhenStopped="NO" style="bar" translatesAutoresizingMaskIntoConstraints="NO" id="kVh-DT-vkQ">
|
||||
<rect key="frame" x="52" y="3" width="64" height="20"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="width" constant="64" id="AmG-EL-4l7"/>
|
||||
</constraints>
|
||||
</progressIndicator>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="NOS-H9-Mdl" firstAttribute="centerY" secondItem="FWz-dC-55q" secondAttribute="centerY" priority="999" id="0NZ-ry-RwE"/>
|
||||
<constraint firstItem="k7g-zd-q4Q" firstAttribute="centerY" secondItem="FWz-dC-55q" secondAttribute="centerY" id="16o-PL-Tu4"/>
|
||||
<constraint firstItem="Vq0-Di-DO2" firstAttribute="centerY" secondItem="FWz-dC-55q" secondAttribute="centerY" id="2sf-bK-T3N"/>
|
||||
<constraint firstItem="kVh-DT-vkQ" firstAttribute="centerY" secondItem="FWz-dC-55q" secondAttribute="centerY" id="4h2-eA-vEm"/>
|
||||
<constraint firstAttribute="height" constant="25" id="5Xu-xj-rhU"/>
|
||||
<constraint firstItem="NOS-H9-Mdl" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="Vq0-Di-DO2" secondAttribute="trailing" constant="8" id="Kdn-fY-Pg0"/>
|
||||
<constraint firstItem="k7g-zd-q4Q" firstAttribute="leading" secondItem="FWz-dC-55q" secondAttribute="leading" constant="2" id="WyI-Mr-ysi"/>
|
||||
<constraint firstItem="kVh-DT-vkQ" firstAttribute="leading" secondItem="k7g-zd-q4Q" secondAttribute="trailing" constant="8" id="g6B-We-Dqz"/>
|
||||
<constraint firstItem="Vq0-Di-DO2" firstAttribute="leading" secondItem="kVh-DT-vkQ" secondAttribute="trailing" constant="8" id="pcT-32-3jd"/>
|
||||
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="NOS-H9-Mdl" secondAttribute="trailing" constant="8" id="twV-E5-yKX"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="progressIndicator" destination="kVh-DT-vkQ" id="xDW-pX-IcH"/>
|
||||
<outlet property="progressLabel" destination="Vq0-Di-DO2" id="Vy6-2E-jBh"/>
|
||||
<outlet property="urlLabel" destination="NOS-H9-Mdl" id="ccW-m4-WXu"/>
|
||||
</connections>
|
||||
</customView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="FWz-dC-55q" secondAttribute="trailing" id="2ct-ld-H1L"/>
|
||||
<constraint firstItem="NOS-H9-Mdl" firstAttribute="centerX" secondItem="hWY-jP-A4m" secondAttribute="centerX" id="595-9t-wEe"/>
|
||||
<constraint firstItem="K1o-Ws-XMQ" firstAttribute="top" secondItem="hWY-jP-A4m" secondAttribute="top" id="JPX-I3-QMN"/>
|
||||
<constraint firstItem="K1o-Ws-XMQ" firstAttribute="leading" secondItem="hWY-jP-A4m" secondAttribute="leading" id="Vqi-IQ-2V0"/>
|
||||
<constraint firstAttribute="trailing" secondItem="K1o-Ws-XMQ" secondAttribute="trailing" id="Y9X-7J-odJ"/>
|
||||
<constraint firstAttribute="bottom" secondItem="FWz-dC-55q" secondAttribute="bottom" id="h7d-Nx-QQG"/>
|
||||
<constraint firstItem="K1o-Ws-XMQ" firstAttribute="bottom" secondItem="FWz-dC-55q" secondAttribute="top" id="n95-KK-lST"/>
|
||||
<constraint firstItem="FWz-dC-55q" firstAttribute="leading" secondItem="hWY-jP-A4m" secondAttribute="leading" id="tI7-n4-Eo1"/>
|
||||
<constraint firstAttribute="bottom" secondItem="K1o-Ws-XMQ" secondAttribute="bottom" id="spp-4y-rEm"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
</viewController>
|
||||
|
@ -637,14 +574,54 @@
|
|||
<scene sceneID="HMt-bN-oMN">
|
||||
<objects>
|
||||
<viewController id="Vho-7i-T8m" userLabel="Detail View Controller" customClass="DetailViewController" customModule="Evergreen" customModuleProvider="target" sceneMemberID="viewController">
|
||||
<box key="view" boxType="custom" borderType="none" title="Box" titlePosition="noTitle" id="ZqF-bf-2JN" customClass="DetailBox" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="444" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<view key="contentView" id="QLg-gD-24I">
|
||||
<rect key="frame" x="0.0" y="0.0" width="444" height="296"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
</view>
|
||||
</box>
|
||||
<customView key="view" id="37A-bp-izR">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="300"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="cJ9-6s-66u" customClass="DetailContainerView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="28" width="450" height="272"/>
|
||||
<userDefinedRuntimeAttributes>
|
||||
<userDefinedRuntimeAttribute type="color" keyPath="backgroundColor">
|
||||
<color key="value" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</userDefinedRuntimeAttribute>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</customView>
|
||||
<customView translatesAutoresizingMaskIntoConstraints="NO" id="xI5-lx-RD8" customClass="DetailStatusBarView" customModule="Evergreen" customModuleProvider="target">
|
||||
<rect key="frame" x="0.0" y="0.0" width="450" height="28"/>
|
||||
<subviews>
|
||||
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="Dim-ed-Dcz" userLabel="URL Label">
|
||||
<rect key="frame" x="18" y="6" width="414" height="17"/>
|
||||
<textFieldCell key="cell" lineBreakMode="truncatingMiddle" selectable="YES" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="center" usesSingleLineMode="YES" id="znU-Fh-L7H">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="secondaryLabelColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstItem="Dim-ed-Dcz" firstAttribute="centerY" secondItem="xI5-lx-RD8" secondAttribute="centerY" id="Hna-uB-3F7"/>
|
||||
<constraint firstAttribute="trailing" secondItem="Dim-ed-Dcz" secondAttribute="trailing" constant="20" symbolic="YES" id="O5q-ZN-DjZ"/>
|
||||
<constraint firstAttribute="height" constant="28" id="Sfk-Ri-WoD"/>
|
||||
<constraint firstItem="Dim-ed-Dcz" firstAttribute="leading" secondItem="xI5-lx-RD8" secondAttribute="leading" constant="20" symbolic="YES" id="Y9c-WR-ZBY"/>
|
||||
</constraints>
|
||||
<connections>
|
||||
<outlet property="urlLabel" destination="Dim-ed-Dcz" id="8fY-oo-cGT"/>
|
||||
</connections>
|
||||
</customView>
|
||||
</subviews>
|
||||
<constraints>
|
||||
<constraint firstAttribute="trailing" secondItem="xI5-lx-RD8" secondAttribute="trailing" id="9M9-ef-mCr"/>
|
||||
<constraint firstItem="cJ9-6s-66u" firstAttribute="leading" secondItem="37A-bp-izR" secondAttribute="leading" id="AM2-YB-J0B"/>
|
||||
<constraint firstAttribute="bottom" secondItem="xI5-lx-RD8" secondAttribute="bottom" id="DGH-Hk-TSv"/>
|
||||
<constraint firstItem="cJ9-6s-66u" firstAttribute="top" secondItem="37A-bp-izR" secondAttribute="top" id="DXp-ju-WpM"/>
|
||||
<constraint firstItem="xI5-lx-RD8" firstAttribute="top" secondItem="cJ9-6s-66u" secondAttribute="bottom" id="JJw-J8-N57"/>
|
||||
<constraint firstAttribute="trailing" secondItem="cJ9-6s-66u" secondAttribute="trailing" id="hUh-Uk-62r"/>
|
||||
<constraint firstItem="xI5-lx-RD8" firstAttribute="leading" secondItem="37A-bp-izR" secondAttribute="leading" id="oCj-Mo-oMU"/>
|
||||
</constraints>
|
||||
</customView>
|
||||
<connections>
|
||||
<outlet property="containerView" destination="cJ9-6s-66u" id="gXc-Pz-9sQ"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<customObject id="vzM-Vn-mEn" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
|
@ -652,7 +629,6 @@
|
|||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="NSActionTemplate" width="14" height="14"/>
|
||||
<image name="NSAddTemplate" width="11" height="11"/>
|
||||
<image name="NSGoLeftTemplate" width="9" height="12"/>
|
||||
<image name="NSGoRightTemplate" width="9" height="12"/>
|
||||
|
|
|
@ -0,0 +1,146 @@
|
|||
//
|
||||
// DetailStatusBarView.swift
|
||||
// Evergreen
|
||||
//
|
||||
// Created by Brent Simmons on 12/16/17.
|
||||
// Copyright © 2017 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
import DB5
|
||||
import Data
|
||||
|
||||
final class DetailStatusBarView: NSView {
|
||||
|
||||
@IBOutlet var urlLabel: NSTextField!
|
||||
|
||||
// private var didConfigureLayer = false
|
||||
|
||||
private var article: Article? {
|
||||
didSet {
|
||||
updateURLLabel()
|
||||
}
|
||||
}
|
||||
private var mouseoverLink: String? {
|
||||
didSet {
|
||||
updateURLLabel()
|
||||
}
|
||||
}
|
||||
|
||||
private let backgroundColor = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.statusBar.backgroundColor")
|
||||
|
||||
override var isFlipped: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
// override var wantsUpdateLayer: Bool {
|
||||
// return true
|
||||
// }
|
||||
//
|
||||
// override func updateLayer() {
|
||||
//
|
||||
// guard !didConfigureLayer else {
|
||||
// return
|
||||
// }
|
||||
// if let layer = layer {
|
||||
// let color = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.statusBar.backgroundColor")
|
||||
// layer.backgroundColor = color.cgColor
|
||||
// didConfigureLayer = true
|
||||
// }
|
||||
// }
|
||||
|
||||
override func awakeFromNib() {
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(timelineSelectionDidChange(_:)), name: .TimelineSelectionDidChange, object: nil)
|
||||
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(mouseDidEnterLink(_:)), name: .MouseDidEnterLink, object: nil)
|
||||
NotificationCenter.default.addObserver(self, selector: #selector(mouseDidExitLink(_:)), name: .MouseDidExitLink, object: nil)
|
||||
}
|
||||
|
||||
// MARK: - Notifications
|
||||
|
||||
@objc func mouseDidEnterLink(_ notification: Notification) {
|
||||
|
||||
guard let appInfo = AppInfo.pullFromUserInfo(notification.userInfo) else {
|
||||
return
|
||||
}
|
||||
guard let window = window, let notificationWindow = appInfo.view?.window, window === notificationWindow else {
|
||||
return
|
||||
}
|
||||
guard let link = appInfo.url else {
|
||||
return
|
||||
}
|
||||
mouseoverLink = link
|
||||
}
|
||||
|
||||
@objc func mouseDidExitLink(_ notification: Notification) {
|
||||
|
||||
guard let appInfo = AppInfo.pullFromUserInfo(notification.userInfo) else {
|
||||
return
|
||||
}
|
||||
guard let window = window, let notificationWindow = appInfo.view?.window, window === notificationWindow else {
|
||||
return
|
||||
}
|
||||
mouseoverLink = nil
|
||||
}
|
||||
|
||||
@objc func timelineSelectionDidChange(_ note: Notification) {
|
||||
|
||||
let timelineView = note.appInfo?.view
|
||||
if timelineView?.window === self.window {
|
||||
mouseoverLink = nil
|
||||
article = note.appInfo?.article
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: Drawing
|
||||
|
||||
private let lineColor = NSColor(calibratedWhite: 0.65, alpha: 1.0)
|
||||
|
||||
override func draw(_ dirtyRect: NSRect) {
|
||||
|
||||
backgroundColor.set()
|
||||
dirtyRect.fill()
|
||||
|
||||
// let path = NSBezierPath()
|
||||
// path.lineWidth = 1.0
|
||||
// path.move(to: NSPoint(x: NSMinX(bounds), y: NSMinY(bounds) + 0.5))
|
||||
// path.line(to: NSPoint(x: NSMaxX(bounds), y: NSMinY(bounds) + 0.5))
|
||||
// lineColor.set()
|
||||
// path.stroke()
|
||||
}
|
||||
}
|
||||
|
||||
private extension DetailStatusBarView {
|
||||
|
||||
// MARK: URL Label
|
||||
|
||||
func updateURLLabel() {
|
||||
|
||||
needsLayout = true
|
||||
|
||||
guard let article = article else {
|
||||
setURLLabel("")
|
||||
return
|
||||
}
|
||||
|
||||
if let mouseoverLink = mouseoverLink, !mouseoverLink.isEmpty {
|
||||
setURLLabel(mouseoverLink)
|
||||
return
|
||||
}
|
||||
|
||||
if let s = article.preferredLink {
|
||||
setURLLabel(s)
|
||||
}
|
||||
else {
|
||||
setURLLabel("")
|
||||
}
|
||||
}
|
||||
|
||||
func setURLLabel(_ link: String) {
|
||||
|
||||
urlLabel.stringValue = (link as NSString).rs_stringByStrippingHTTPOrHTTPSScheme()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -14,6 +14,8 @@ import RSWeb
|
|||
|
||||
final class DetailViewController: NSViewController, WKNavigationDelegate, WKUIDelegate {
|
||||
|
||||
@IBOutlet var containerView: DetailContainerView!
|
||||
|
||||
var webview: WKWebView!
|
||||
var noSelectionView: NoSelectionView!
|
||||
|
||||
|
@ -58,8 +60,7 @@ final class DetailViewController: NSViewController, WKNavigationDelegate, WKUIDe
|
|||
|
||||
noSelectionView = NoSelectionView(frame: self.view.bounds)
|
||||
|
||||
let boxView = self.view as! DetailBox
|
||||
boxView.viewController = self
|
||||
containerView.viewController = self
|
||||
|
||||
showOrHideWebView()
|
||||
}
|
||||
|
@ -109,12 +110,10 @@ final class DetailViewController: NSViewController, WKNavigationDelegate, WKUIDe
|
|||
|
||||
private func switchToView(_ view: NSView) {
|
||||
|
||||
let boxView = self.view as! DetailBox
|
||||
if boxView.contentView == view {
|
||||
if containerView.contentView == view {
|
||||
return
|
||||
}
|
||||
boxView.contentView = view
|
||||
boxView.rs_addFullSizeConstraints(forSubview: view)
|
||||
containerView.contentView = view
|
||||
}
|
||||
|
||||
// MARK: WKNavigationDelegate
|
||||
|
@ -170,10 +169,29 @@ extension DetailViewController: WKScriptMessageHandler {
|
|||
}
|
||||
}
|
||||
|
||||
final class DetailBox: NSBox {
|
||||
|
||||
weak var viewController: DetailViewController?
|
||||
|
||||
final class DetailContainerView: NSView {
|
||||
|
||||
weak var viewController: DetailViewController? = nil
|
||||
|
||||
private var didConfigureLayer = false
|
||||
|
||||
override var wantsUpdateLayer: Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
var contentView: NSView? {
|
||||
didSet {
|
||||
if let oldContentView = oldValue {
|
||||
oldContentView.removeFromSuperviewWithoutNeedingDisplay()
|
||||
}
|
||||
if let contentView = contentView {
|
||||
contentView.translatesAutoresizingMaskIntoConstraints = false
|
||||
addSubview(contentView)
|
||||
rs_addFullSizeConstraints(forSubview: contentView)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override func viewWillStartLiveResize() {
|
||||
|
||||
viewController?.viewWillStartLiveResize()
|
||||
|
@ -183,6 +201,18 @@ final class DetailBox: NSBox {
|
|||
|
||||
viewController?.viewDidEndLiveResize()
|
||||
}
|
||||
|
||||
override func updateLayer() {
|
||||
|
||||
guard !didConfigureLayer else {
|
||||
return
|
||||
}
|
||||
if let layer = layer {
|
||||
let color = appDelegate.currentTheme.color(forKey: "MainWindow.Detail.backgroundColor")
|
||||
layer.backgroundColor = color.cgColor
|
||||
didConfigureLayer = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
final class NoSelectionView: NSView {
|
||||
|
|
|
@ -10,7 +10,7 @@ import Cocoa
|
|||
|
||||
class MainWindowSplitView: NSSplitView {
|
||||
|
||||
private let splitViewDividerColor = NSColor(calibratedWhite: 0.75, alpha: 1.0)
|
||||
private let splitViewDividerColor = NSColor(calibratedWhite: 0.65, alpha: 1.0)
|
||||
|
||||
override var dividerColor: NSColor {
|
||||
get {
|
||||
|
|
|
@ -115,6 +115,13 @@
|
|||
<key>backgroundColor</key>
|
||||
<string>FFFFFF</string>
|
||||
</dict>
|
||||
<key>statusBar</key>
|
||||
<dict>
|
||||
<key>backgroundColor</key>
|
||||
<string>FFFFFF</string>
|
||||
</dict>
|
||||
<key>backgroundColor</key>
|
||||
<string>FFFFFF</string>
|
||||
</dict>
|
||||
</dict>
|
||||
</dict>
|
||||
|
|
Loading…
Reference in New Issue