CutBox.app

Coverage Report

Created: 2024-03-12 03:40

.../Source/App/SearchAndPreview/SearchViewControllerTableViewDelegate.swift
Line
Count
Source (jump to first uncovered line)
1
//
2
//  SearchViewControllerTableViewDelegate.swift
3
//  CutBox
4
//
5
//  Created by Jason Milkins on 31/3/18.
6
//  Copyright © 2018-2023 ocodo. All rights reserved.
7
//
8
9
import Cocoa
10
11
extension SearchViewController: NSTableViewDataSource {
12
141
    func numberOfRows(in tableView: NSTableView) -> Int {
13
141
        return self.historyService.count
14
141
    }
15
}
16
17
extension SearchViewController: NSTableViewDelegate {
18
77
    func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
19
77
        return 30
20
77
    }
21
22
1
    func tableViewSelectionDidChange(_ notification: Notification) {
23
1
        self.updateSearchItemPreview()
24
1
    }
25
26
73
    func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? {
27
73
        let rowView = ClipItemTableRowContainerView()
28
73
        rowView.searchView = self.searchView
29
73
        return rowView
30
73
    }
31
32
    func tableView(_ tableView: NSTableView,
33
147
                   viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
34
147
        guard let record = self.historyService.dict[safe: row],
35
147
              let column = tableColumn else {
36
0
            return nil
37
147
        }
38
147
39
147
        let theme = CutBoxPreferencesService.shared.currentTheme
40
147
        let rowView: ClipItemTableRowContainerView? = tableView
41
147
            .rowView(atRow: row, makeIfNecessary: false)
42
147
            as? ClipItemTableRowContainerView
43
147
44
147
        switch column.identifier.rawValue {
45
147
        case "icon":
46
73
            let rowImageView = tableView.getRowView() as ClipItemTableRowImageView
47
73
            rowImageView.data = record
48
73
            rowImageView.color = theme.clip.textColor
49
73
            rowView?.imageView = rowImageView
50
73
51
73
            return rowImageView
52
147
53
147
        case "string":
54
73
            let rowTextView = tableView.getRowView() as ClipItemTableRowTextView
55
73
            rowTextView.data = record
56
73
            rowTextView.color = theme.clip.textColor
57
73
            rowView?.textView = rowTextView
58
73
59
73
            return rowTextView
60
147
61
147
        default:
62
1
            return nil
63
147
        }
64
147
    }
65
66
    func tableView(_ tableView: NSTableView,
67
2
                   selectionIndexesForProposedSelection proposedSelectionIndexes: IndexSet) -> IndexSet {
68
2
        let proposed = proposedSelectionIndexes
69
2
70
2
        guard !proposed.isEmpty else {
71
0
            return proposedSelectionIndexes
72
2
        }
73
2
74
2
        let selected = self.searchView.itemsList.selectedRowIndexes
75
2
        let removed: IndexSet = selected.subtracting(proposed)
76
2
        let theme = CutBoxPreferencesService.shared.currentTheme
77
2
        let added: IndexSet = proposed.subtracting(selected)
78
2
79
2
        removed
80
2
            .map {
81
0
                tableView.rowView(atRow: $0,
82
0
                                  makeIfNecessary: true)
83
0
                  as? ItemTableRowContainerView
84
0
            }
85
2
            .forEach {
86
0
                $0?.imageView?.color = theme.clip.textColor
87
0
                $0?.textView?.color = theme.clip.textColor
88
0
        }
89
2
90
2
        added.forEach { self.orderedSelection.add($0) }
91
2
        removed.forEach { self.orderedSelection.remove($0) }
92
2
93
2
        var cruft: [Int] = []
94
2
95
2
        self.orderedSelection.all().forEach {
96
2
            if !proposed.contains($0) {
97
0
                cruft.append($0)
98
2
            }
99
2
        }
100
2
101
2
        cruft.forEach { self.orderedSelection.remove($0) }
102
2
103
2
        return proposedSelectionIndexes
104
2
    }
105
}