From 2185bf284d0eba3b249b9eade88c21030ba008df Mon Sep 17 00:00:00 2001 From: DaSol Kim Date: Wed, 23 Aug 2023 21:36:26 +0900 Subject: [PATCH] refactor: refactoring to NSTable with NSbuttons. --- .../Box/BoxBaseContainerViewController.swift | 5 + Box42/Box/View/BoxButtonViewGroup.swift | 223 +++++++++++++++++- Box42/Box/View/BoxContentsViewGroup.swift | 2 +- Box42/Window/BoxWindowController.swift | 1 - 4 files changed, 226 insertions(+), 5 deletions(-) diff --git a/Box42/Box/BoxBaseContainerViewController.swift b/Box42/Box/BoxBaseContainerViewController.swift index 538078f..92c29d6 100644 --- a/Box42/Box/BoxBaseContainerViewController.swift +++ b/Box42/Box/BoxBaseContainerViewController.swift @@ -18,19 +18,24 @@ class BoxBaseContainerViewController: NSViewController { override func loadView() { self.view = NSView() +// self.view.wantsLayer = true +// self.view.layer?.backgroundColor = NSColor.red.cgColor self.view.addSubview(splitView) splitView.delegate = self buttonGroup = BoxButtonViewGroupInit() + leftContainerInit() viewInit() } func BoxButtonViewGroupInit() -> BoxButtonViewGroup { + let buttonGroup = BoxButtonViewGroup { sender in self.clickBtn(sender: sender) } + return buttonGroup } diff --git a/Box42/Box/View/BoxButtonViewGroup.swift b/Box42/Box/View/BoxButtonViewGroup.swift index 44a2299..c115950 100644 --- a/Box42/Box/View/BoxButtonViewGroup.swift +++ b/Box42/Box/View/BoxButtonViewGroup.swift @@ -8,6 +8,12 @@ import Cocoa import SnapKit +class CustomTableCellView: NSTableCellView { + var button: NSButton! + var deleteButton: NSButton! + var rowIndex: Int! +} + class BoxButtonViewGroup: NSView { var boxVM: WebViewModel! = WebViewModel() var pinSwitch : NSSwitch = NSSwitch() @@ -15,10 +21,99 @@ class BoxButtonViewGroup: NSView { var lastAddedButton: NSView? var loginInfo: NSView? + let tableView: NSTableView = { + let tableView = NSTableView() + tableView.autoresizingMask = [.width, .height] + tableView.headerView = nil + + let column = NSTableColumn(identifier: NSUserInterfaceItemIdentifier("column1")) + column.title = "" + column.width = tableView.frame.size.width + column.resizingMask = .autoresizingMask + + tableView.addTableColumn(column) + + return tableView + }() + + let scrollView: NSScrollView = { + let scrollView = NSScrollView() + scrollView.borderType = .bezelBorder + return scrollView + }() + + private var isDeleteButtonsVisible: Bool = false + let toggleDeleteButton: NSButton = { + let button = NSButton(title: "-", target: nil, action: nil) + button.bezelStyle = .rounded + return button + }() + + @objc func toggleDeleteButtons() { + print("toggleDeleteButtons") + isDeleteButtonsVisible.toggle() + + let numberOfRows = tableView.numberOfRows + for row in 0.. Void) { + print("init") self.clickAction = clickAction super.init(frame: BoxSizeManager.shared.buttonGroupSizeNSRect) - setupButtons() + // setupButtons() + + for item in boxVM.webViewURL.URLstring { + buttonArray.append(item.name) + } + + scrollView.documentView = tableView + super.addSubview(scrollView) + scrollView.snp.makeConstraints { make in + make.edges.equalToSuperview() + } + + tableView.dataSource = self + tableView.delegate = self + tableView.registerForDraggedTypes([NSPasteboard.PasteboardType.string]) + + super.addSubview(toggleDeleteButton) + toggleDeleteButton.target = self + toggleDeleteButton.action = #selector(toggleDeleteButtons) + toggleDeleteButton.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalToSuperview().offset(0) + } + + super.addSubview(addButton) + addButton.target = self + addButton.action = #selector(addCell) + addButton.snp.makeConstraints { make in + make.centerX.equalToSuperview() + make.bottom.equalTo(toggleDeleteButton.snp.top).offset(-10) + + } + } + + @objc func addCell() { + buttonArray.append("New Cell") // 'New Cell'은 신규 셀의 이름입니다. 필요에 따라 변경하십시오. + tableView.reloadData() } required init?(coder: NSCoder) { @@ -33,11 +128,12 @@ class BoxButtonViewGroup: NSView { for subview in self.subviews { subview.removeFromSuperview() } - + for (name, _) in boxVM.webViewURL.URLstring { self.createButton(name) } } + @objc private func clickBtn(sender: NSButton) { clickAction?(sender) } @@ -69,7 +165,7 @@ class BoxButtonViewGroup: NSView { button.font = NSFont.systemFont(ofSize: fontSize) button.setButtonType(.momentaryLight) button.translatesAutoresizingMaskIntoConstraints = false - + button.snp.makeConstraints { make in make.centerX.equalToSuperview() make.leading.equalToSuperview().offset(10) @@ -90,3 +186,124 @@ class BoxButtonViewGroup: NSView { lastAddedButton = button } } + +//NSTableViewDelegate +extension BoxButtonViewGroup: NSTableViewDataSource, NSTableViewDelegate { + func numberOfRows(in tableView: NSTableView) -> Int { + return buttonArray.count + } + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + let cellView = CustomTableCellView() + cellView.layer?.backgroundColor = NSColor.red.cgColor + cellView.rowIndex = row + + let button = NSButton(title: buttonArray[row], target: self, action: #selector(buttonClicked(_:))) + button.tag = row + cellView.addSubview(button) + + let fontSize: CGFloat = 16.0 + button.font = NSFont.systemFont(ofSize: fontSize) + button.setButtonType(.momentaryLight) + button.bezelStyle = .shadowlessSquare + + button.wantsLayer = true + button.layer?.borderWidth = 0 + button.layer?.cornerRadius = 10 + button.layer?.backgroundColor = NSColor.orange.cgColor + + button.snp.makeConstraints { make in + make.width.equalTo(100) + make.height.equalTo(50) + make.top.bottom.equalToSuperview().inset(5) + } + + let deleteButton = NSButton(title: "삭제", target: self, action: #selector(deleteButtonClicked(_:))) + deleteButton.tag = row + deleteButton.bezelStyle = .shadowlessSquare + deleteButton.wantsLayer = true + deleteButton.layer?.borderWidth = 0 + deleteButton.layer?.cornerRadius = 10 + deleteButton.layer?.backgroundColor = NSColor.red.cgColor + + cellView.addSubview(deleteButton) + deleteButton.snp.makeConstraints { make in + make.trailing.equalToSuperview().offset(-5) + make.top.bottom.equalToSuperview().inset(5) + } + cellView.deleteButton = deleteButton + cellView.deleteButton.isHidden = !isDeleteButtonsVisible + + return cellView + } + + + @objc func deleteButtonClicked(_ sender: NSButton) { + let row = sender.tag + print("Delete button clicked in row: \(row)") + + // 데이터 목록에서 항목 제거 + buttonArray.remove(at: row) + tableView.reloadData() + // 테이블 뷰에서 행 제거 및 셀 인덱스 업데이트 + tableView.removeRows(at: IndexSet(integer: row), withAnimation: .effectFade) + for (_, subview) in tableView.subviews.enumerated() { + guard let cellView = subview as? CustomTableCellView else { + continue + } + + cellView.rowIndex = tableView.row(for: cellView) + cellView.button.tag = cellView.rowIndex + cellView.deleteButton.tag = cellView.rowIndex + + cellView.button.title = buttonArray[cellView.rowIndex] + } + } + + + func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat { + return 40.0 + } + + @objc func buttonClicked(_ sender: NSButton) { + let row = sender.tag + print("Button clicked in row: \(row)") + } + + // Drag and Drop methods + func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? { + let pasteboardItem = NSPasteboardItem() + pasteboardItem.setString(String(row), forType: .string) + return pasteboardItem + } + + func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation { + if dropOperation == .above { + return .move + } else { + return [] + } + } + + func tableView(_ aTableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool { + guard let str = info.draggingPasteboard.string(forType: .string), let from = Int(str) else { + return false + } + + let to = (from < row) ? row - 1 : row + let item = buttonArray[from] + buttonArray.remove(at: from) + buttonArray.insert(item, at: to) + tableView.reloadData() + + for (_, subview) in tableView.subviews.enumerated() { + guard let cellView = subview as? CustomTableCellView else { + continue + } + + cellView.button.title = buttonArray[cellView.rowIndex] + } + + return true + } +} diff --git a/Box42/Box/View/BoxContentsViewGroup.swift b/Box42/Box/View/BoxContentsViewGroup.swift index 215d0ce..596a5d1 100644 --- a/Box42/Box/View/BoxContentsViewGroup.swift +++ b/Box42/Box/View/BoxContentsViewGroup.swift @@ -22,7 +22,7 @@ class BoxContentsViewGroup: NSView { self.wantsLayer = true self.addSubview(webVC!.view) - + webVC?.view.translatesAutoresizingMaskIntoConstraints = false webVC?.view.snp.makeConstraints { make in make.edges.equalTo(self) diff --git a/Box42/Window/BoxWindowController.swift b/Box42/Window/BoxWindowController.swift index dc69045..fde61fa 100644 --- a/Box42/Window/BoxWindowController.swift +++ b/Box42/Window/BoxWindowController.swift @@ -8,7 +8,6 @@ import Cocoa class BoxWindowController: NSWindowController, NSToolbarDelegate, NSWindowDelegate { - override init(window: NSWindow?) { let contentRect = BoxSizeManager.shared.boxViewSizeNSRect let styleMask: NSWindow.StyleMask = [.resizable, .closable, .miniaturizable, .fullSizeContentView, .titled]