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
124 changes: 124 additions & 0 deletions Rectangle.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

74 changes: 54 additions & 20 deletions Rectangle/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,22 +37,23 @@ class AppDelegate: NSObject, NSApplicationDelegate {

private var prevActiveAppObservation: NSKeyValueObservation?
private var prevActiveApp: NSRunningApplication?

private var additionalSizeMenuItems: [NSMenuItem] = []
private var dynamicMenuItemCount: Int = 0

@IBOutlet weak var mainStatusMenu: NSMenu!
@IBOutlet weak var unauthorizedMenu: NSMenu!
@IBOutlet weak var ignoreMenuItem: NSMenuItem!
@IBOutlet weak var viewLoggingMenuItem: NSMenuItem!
@IBOutlet weak var updatesMenuItem: NSMenuItem!
@IBOutlet weak var quitMenuItem: NSMenuItem!

var eighthsMenuItem: NSMenuItem?

static var instance: AppDelegate {
NSApp.delegate as! AppDelegate
}

func applicationDidFinishLaunching(_ aNotification: Notification) {
Defaults.loadFromSupportDir()
migrateShowEighthsInMenu()

checkVersion()
mainStatusMenu.delegate = self
Expand All @@ -77,7 +78,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {

mainStatusMenu.autoenablesItems = false
addWindowActionMenuItems()


NotificationCenter.default.addObserver(self, selector: #selector(rebuildMenu), name: .showAdditionalSizesInMenuChanged, object: nil)

updaterController = SPUStandardUpdaterController(updaterDelegate: nil, userDriverDelegate: self)

checkAutoCheckForUpdates()
Expand Down Expand Up @@ -379,6 +382,9 @@ extension AppDelegate: NSMenuDelegate {
}

func addWindowActionMenuItems() {
let additionalSizeCategories: Set<WindowActionCategory> = [.eighths, .ninths, .twelfths, .sixteenths]
let submenuOnlyWhenAdditional: Set<WindowActionCategory> = [.thirds, .size]
let showAdditional = Defaults.showAdditionalSizesInMenu.userEnabled
var menuIndex = 0
var categoryMenus: [CategoryMenu] = []
for action in WindowAction.active {
Expand All @@ -387,16 +393,23 @@ extension AppDelegate: NSMenuDelegate {
newMenuItem.representedObject = action

if !Defaults.showAllActionsInMenu.userEnabled, let category = action.category {
if menuIndex != 0 && action.firstInGroup {
let menu = NSMenu(title: category.displayName)
menu.autoenablesItems = false
categoryMenus.append(CategoryMenu(menu: menu, category: category))
// When additional sizes are off, keep Thirds and Size as flat items
if submenuOnlyWhenAdditional.contains(category) && !showAdditional {
// Fall through to flat item handling below
} else {
if menuIndex != 0 && action.firstInGroup {
let menu = NSMenu(title: category.displayName)
menu.autoenablesItems = false
categoryMenus.append(CategoryMenu(menu: menu, category: category))
}
categoryMenus.last?.menu.addItem(newMenuItem)
continue
}
categoryMenus.last?.menu.addItem(newMenuItem)
continue
}

if menuIndex != 0 && action.firstInGroup {

// Flat item - suppress extra separator for almostMaximize when Size is not a submenu
let showSeparator = action.firstInGroup && !(action == .almostMaximize && !showAdditional)
if menuIndex != 0 && showSeparator {
mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)
menuIndex += 1
}
Expand All @@ -407,31 +420,52 @@ extension AppDelegate: NSMenuDelegate {
if !categoryMenus.isEmpty {
mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)
menuIndex += 1

for categoryMenu in categoryMenus {

let sortedCategoryMenus = categoryMenus.sorted { $0.category.menuOrder < $1.category.menuOrder }
for categoryMenu in sortedCategoryMenus {
categoryMenu.menu.delegate = self
let menuMenuItem = NSMenuItem(title: categoryMenu.category.displayName, action: nil, keyEquivalent: "")
if categoryMenu.category == .eighths {
eighthsMenuItem = menuMenuItem
eighthsMenuItem?.isHidden = !Defaults.showEighthsInMenu.userEnabled
if additionalSizeCategories.contains(categoryMenu.category) {
menuMenuItem.isHidden = !Defaults.showAdditionalSizesInMenu.userEnabled
additionalSizeMenuItems.append(menuMenuItem)
}
mainStatusMenu.insertItem(menuMenuItem, at: menuIndex)
mainStatusMenu.setSubmenu(categoryMenu.menu, for: menuMenuItem)
menuIndex += 1
}
}

mainStatusMenu.insertItem(NSMenuItem.separator(), at: menuIndex)

menuIndex += 1
addTodoModeMenuItems(startingIndex: menuIndex)
// Track total dynamic items: window actions + separators + todo items (4 items + 1 separator)
dynamicMenuItemCount = menuIndex + 5
}


@objc func rebuildMenu() {
// Remove all dynamically added items
for _ in 0..<dynamicMenuItemCount {
mainStatusMenu.removeItem(at: 0)
}
dynamicMenuItemCount = 0
additionalSizeMenuItems.removeAll()
addWindowActionMenuItems()
}

private func migrateShowEighthsInMenu() {
let oldKey = "showEighthsInMenu"
let oldValue = UserDefaults.standard.integer(forKey: oldKey)
if oldValue != 0 && Defaults.showAdditionalSizesInMenu.notSet {
Defaults.showAdditionalSizesInMenu.enabled = (oldValue == 1)
}
}

struct CategoryMenu {
let menu: NSMenu
let category: WindowActionCategory
}

}

// todo mode
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomCenterLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomCenterLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomCenterNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomCenterRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomCenterRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomLeftNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomLeftSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomLeftTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomRightNinthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomRightSixteenthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"images" : [
{
"filename" : "bottomRightTwelfthTemplate.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading