Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 64 additions & 24 deletions Box42.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

6 changes: 1 addition & 5 deletions Box42/BoxWindowController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,12 @@ class BoxWindowController: NSWindowController, NSWindowDelegate {
windowInstance.title = "Box"
windowInstance.titlebarAppearsTransparent = true
windowInstance.titleVisibility = .hidden
windowInstance.isReleasedWhenClosed = false
windowInstance.isMovableByWindowBackground = true
windowInstance.isReleasedWhenClosed = false
windowInstance.standardWindowButton(.closeButton)?.isHidden = true
windowInstance.standardWindowButton(.miniaturizeButton)?.isHidden = true
windowInstance.standardWindowButton(.zoomButton)?.isHidden = true

if let zoomButton = windowInstance.standardWindowButton(.zoomButton) {
zoomButton.isHidden = true
}

let boxViewController = BoxBaseContainerViewController(nibName: nil, bundle: nil)
windowInstance.contentViewController = boxViewController
}
Expand Down
8 changes: 4 additions & 4 deletions Box42/FunctionButton/Model/FunctionButtonUI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,17 @@

import AppKit

struct FunctionButtonUI {
struct size {
enum FunctionButtonUI {
enum size {
static let font: CGFloat = 14
static let pinWidth: CGFloat = 89
static let pinHeight: CGFloat = 27
}

struct animation {
enum animation {
}

struct color {
enum color {
static let pinText = NSColor(hex: "#696969")
}
}
11 changes: 2 additions & 9 deletions Box42/FunctionButton/View/BoxFunctionViewGroup.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ import SnapKit

class BoxFunctionViewGroup: NSView {
lazy var preferenceButton: PreferenceButtonView = PreferenceButtonView(image: NSImage(imageLiteralResourceName: "plus"), completion: { self.preferenceAction?() })
lazy var pinButton: PinButtonView = PinButtonView(image: NSImage(imageLiteralResourceName: "Pin icon"), completion: { self.pinAction?() })
lazy var pinButton: PinButtonView = PinButtonView(image: NSImage(imageLiteralResourceName: "pin-box"), completion: { self.pinAction?() })
lazy var quitButton: QuitButtonView = QuitButtonView(image: NSImage(imageLiteralResourceName: "figure.snowboarding"), completion: { self.quitAction?() })
lazy var boxButton: BoxFunctionButtonView = BoxFunctionButtonView(image: NSImage(imageLiteralResourceName: "shippingbox"), completion: { self.boxAction?() })
lazy var divider: NSBox = TopDivider(completion: { self.dividerAction?() })

var preferenceAction: (() -> Void)?
var pinAction: (() -> Void)?
Expand All @@ -38,17 +37,11 @@ class BoxFunctionViewGroup: NSView {
self.addSubview(pinButton)
self.addSubview(quitButton)
self.addSubview(boxButton)
self.addSubview(divider)
}

private func setupConstraints() {
divider.snp.makeConstraints { make in
make.top.equalToSuperview()
make.left.right.equalToSuperview()
}

pinButton.snp.makeConstraints { make in
make.top.equalTo(divider).offset(10)
make.top.equalToSuperview()
make.bottom.equalToSuperview()
make.left.equalToSuperview()
make.width.equalTo(FunctionButtonUI.size.pinWidth)
Expand Down
18 changes: 9 additions & 9 deletions Box42/Main/BoxBaseContainerViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class BoxBaseContainerViewController: NSViewController {
var splitView: BoxBaseSplitView = BoxBaseSplitView()
var contentGroup: BoxContentsViewGroup = BoxContentsViewGroup()
var toolbarGroupVC: ToolbarViewController = ToolbarViewController()
// var quickSlotGroupVC: QuickSlotViewController = QuickSlotViewController()
var quickSlotGroupVC: QuickSlotViewController = QuickSlotViewController()
var functionGroupVC: BoxFunctionViewController = BoxFunctionViewController()
let windowViewGroupVC: WindowButtonViewController = WindowButtonViewController()
var leftContainer: MovableContainerView = MovableContainerView()
Expand Down Expand Up @@ -76,7 +76,7 @@ class BoxBaseContainerViewController: NSViewController {
leftContainer.addSubview(windowViewGroupVC.view)
leftContainer.addSubview(buttonGroupVC.view)
leftContainer.addSubview(toolbarGroupVC.view)
// leftContainer.addSubview(quickSlotGroupVC.view)
leftContainer.addSubview(quickSlotGroupVC.view)
leftContainer.addSubview(functionGroupVC.view)

leftContainerAutolayout()
Expand All @@ -101,15 +101,15 @@ class BoxBaseContainerViewController: NSViewController {
make.top.equalTo(toolbarGroupVC.view.snp.bottom).offset(Constants.UI.groupAutolayout)
make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout)
make.left.equalTo(leftContainer)
make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-Constants.UI.groupAutolayout)
make.bottom.equalTo(quickSlotGroupVC.view.snp.top).offset(-Constants.UI.groupAutolayout)
}

// quickSlotGroupVC.view.snp.makeConstraints { make in
// make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-27)
// make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout)
// make.left.equalTo(leftContainer)
// make.height.equalTo(178)
// }
quickSlotGroupVC.view.snp.makeConstraints { make in
make.bottom.equalTo(functionGroupVC.view.snp.top).offset(-27)
make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout)
make.left.equalTo(leftContainer)
make.height.equalTo(178)
}

functionGroupVC.view.snp.makeConstraints { make in
make.right.equalTo(leftContainer).offset(-Constants.UI.groupAutolayout)
Expand Down
2 changes: 1 addition & 1 deletion Box42/Menubar/MenubarViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ extension MenubarViewController: MenubarViewControllerDelegate {
}
window.level = .floating
}
boxWindowController?.showWindow(sender)
boxWindowController?.showWindow(sender)
}
}
}
Expand Down
1 change: 1 addition & 0 deletions Box42/Menubar/MenubarViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ class StatusBarViewModel {
case "lee": for i in (1...5) {statusBar.frames.append(NSImage(imageLiteralResourceName: "lee_\(i)"))}
case "box": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_\(i)"))}
case "fox": for i in (1...4) {statusBar.frames.append(NSImage(imageLiteralResourceName: "fox_page\(i)"))}
case "sitting_fox": for i in (0...3) {statusBar.frames.append(NSImage(imageLiteralResourceName: "sitting_fox\(i)"))}
case "box_oc": for i in (1...2) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42box_oc\(i)"))}
default : for i in (1...11) {statusBar.frames.append(NSImage(imageLiteralResourceName: "42flip_0\(i)"))}
}
Expand Down
1 change: 0 additions & 1 deletion Box42/Preferences/PreferencesViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@ class PreferencesViewController: NSViewController {
print("Error: \(error)")
}
}

}
}

Expand Down
57 changes: 57 additions & 0 deletions Box42/QuickSlot/Controller/QuickSlotScriptsLogicController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
//
// QuickSlotScriptsLogicController.swift
// Box42
//
// Created by Chanhee Kim on 8/28/23.
//

import AppKit

class ScriptsLogicController {

static let shared = ScriptsLogicController()

private init() {
NotificationCenter.default.addObserver(self, selector: #selector(handleButtonTapped), name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: nil)
}

@objc func handleButtonTapped(notification: NSNotification) {
if let button = notification.object as? NSButton {
let buttonTitle = button.title // 메인 스레드에서 타이틀을 캡쳐
print("Button with title \(buttonTitle) was tapped")

DispatchQueue.global(qos: .background).async { [weak self] in
if buttonTitle == "clean" {
self?.executeCleanScript()
}
}
}
}

private func executeCleanScript() {
if let scriptPath = Bundle.main.path(forResource: "cleanCache", ofType: "sh") {
let task = Process()
task.launchPath = "/bin/sh"
task.arguments = [scriptPath]

let outputPipe = Pipe()
task.standardOutput = outputPipe
task.standardError = outputPipe

task.launch()
task.waitUntilExit()

let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: outputData, encoding: .utf8) ?? ""

DispatchQueue.main.async {
print("Output: \(output)")
}
} else {
DispatchQueue.main.async {
print("Script not found")
}
}
}

}
32 changes: 32 additions & 0 deletions Box42/QuickSlot/Controller/QuickSlotViewController.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//
// QuickSlotViewController.swift
// Box42
//
// Created by Chanhee Kim on 8/25/23.
//

import AppKit

class QuickSlotViewController: NSViewController {
var viewModel: QuickSlotViewModel!
var buttonCollectionView: QuickSlotButtonCollectionViewController!

override func loadView() {
let quickSlotViewGroup = QuickSlotGroupView()
quickSlotViewGroup.headerAction = headerAction

NotificationCenter.default.addObserver(self, selector: #selector(handleButtonTapped), name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: nil)

self.view = quickSlotViewGroup
}

func headerAction() {
print("quick slot header")
}

@objc func handleButtonTapped(notification: NSNotification) {
if let button = notification.object as? NSButton {
print("Button with title \(button.title) was tapped")
}
}
}
19 changes: 19 additions & 0 deletions Box42/QuickSlot/Model/QuickSlotButtonModel.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//
// QuickSlotButtonModel.swift
// Box42
//
// Created by Chanhee Kim on 8/27/23.
//

import Foundation

// Model
struct QuickSlotButtonModel {
let id: UUID
var title: String

init(title: String = "Default") {
self.id = UUID()
self.title = title
}
}
24 changes: 24 additions & 0 deletions Box42/QuickSlot/Model/QuickSlotUI.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
//
// QuickSlotUI.swift
// Box42
//
// Created by Chanhee Kim on 8/27/23.
//

import AppKit

enum QuickSlotUI {
enum size {
static let font: CGFloat = CGFloat(16).pointsToPixels()
static let headerHeight: CGFloat = 35
static let button: CGFloat = 59
static let lineSpacing: CGFloat = 12
}

enum animation {
}

enum color {
// static let pinText = NSColor(hex: "#696969")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
//
// QuickSlotButtonCollectionViewController.swift
// Box42
//
// Created by Chanhee Kim on 8/27/23.
//

import Cocoa
import Combine

class QuickSlotButtonCollectionViewController: NSViewController {
@IBOutlet weak var quickSlotButtonCollectionView: NSCollectionView!
var viewModel: QuickSlotViewModel = QuickSlotViewModel()
var cancellables: Set<AnyCancellable> = []

override func viewDidLoad() {
super.viewDidLoad()
initializeCombine()

quickSlotButtonCollectionView.delegate = self
quickSlotButtonCollectionView.dataSource = self

quickSlotButtonCollectionView.register(NSNib(nibNamed: NSNib.Name("QuickSlotButtonViewItem"), bundle: nil), forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "QuickSlotButtonViewItem"))

initializeView()
}

override func viewDidLayout() {
super.viewDidLayout()
constraintsView()
}

override func awakeFromNib() {
super.awakeFromNib()
}

init() {
super.init(nibName: "QuickSlotButtonCollectionViewController", bundle: nil)
}

func initializeCombine() {
viewModel.$buttons
.sink { [weak self] _ in
self?.quickSlotButtonCollectionView.reloadData()
}
.store(in: &cancellables)
}

func initializeView() {
// MARK: - Setup FlowLayout View
let flowLayout: NSCollectionViewFlowLayout = NSCollectionViewFlowLayout()
flowLayout.itemSize = CGSize(width: QuickSlotUI.size.button, height: QuickSlotUI.size.button)
flowLayout.scrollDirection = .horizontal
flowLayout.minimumLineSpacing = QuickSlotUI.size.lineSpacing
flowLayout.sectionInset = NSEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
quickSlotButtonCollectionView.collectionViewLayout = flowLayout

// MARK: - Setup Collection View
quickSlotButtonCollectionView.wantsLayer = true
quickSlotButtonCollectionView.layer?.borderWidth = 0
quickSlotButtonCollectionView.layer?.borderColor = NSColor.clear.cgColor
quickSlotButtonCollectionView.backgroundColors = [NSColor.clear]

if let scrollView = quickSlotButtonCollectionView.enclosingScrollView {
// scrollView.hasVerticalScroller = false
// scrollView.hasHorizontalScroller = false
scrollView.backgroundColor = NSColor.clear
scrollView.drawsBackground = false
}
}

func constraintsView() {
quickSlotButtonCollectionView.frame = self.view.bounds
}

required init?(coder: NSCoder) {
super.init(coder: coder)
}
}

extension QuickSlotButtonCollectionViewController: NSCollectionViewDelegate, NSCollectionViewDataSource {

func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
return viewModel.buttons.count
}

func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "QuickSlotButtonViewItem"), for: indexPath)

if let customItem = item as? QuickSlotButtonViewItem {
let buttonModel = viewModel.buttons[indexPath.item]
let btn = NSButton()
// btn.title = "\(indexPath)"
btn.title = buttonModel.title
btn.action = #selector(collectionButtonTapped)
btn.target = self
btn.wantsLayer = true
btn.layer?.backgroundColor = NSColor.red.cgColor
customItem.view.addSubview(btn)
btn.frame = CGRect(x: 0, y: 0, width: QuickSlotUI.size.button, height: QuickSlotUI.size.button)
}
return item
}
}

extension QuickSlotButtonCollectionViewController {
@objc func collectionButtonTapped(_ sender: NSButton) {
NotificationCenter.default.post(name: NSNotification.Name(NotifConst.object.collectionButtonTapped), object: sender)
}
}
Loading