├── .gitignore ├── BUILD.md ├── Itsycal.xcodeproj └── project.pbxproj ├── Itsycal ├── AgendaViewController.h ├── AgendaViewController.m ├── AppDelegate.h ├── AppDelegate.m ├── Base.lproj │ └── MainMenu.xib ├── Colors.xcassets │ ├── Contents.json │ ├── HighlightedDOWBackgroundColor.colorset │ │ └── Contents.json │ ├── MainBackgroundColor.colorset │ │ └── Contents.json │ ├── PendingBackgroundColor.colorset │ │ └── Contents.json │ ├── ResizeHandleForegroundColor.colorset │ │ └── Contents.json │ ├── TodayCellColor.colorset │ │ └── Contents.json │ └── WindowBorderColor.colorset │ │ └── Contents.json ├── DatePickerVC.h ├── DatePickerVC.m ├── EventCenter.h ├── EventCenter.m ├── EventViewController.h ├── EventViewController.m ├── HighlightPicker.h ├── HighlightPicker.m ├── IconIsConfigurableTransformer.h ├── IconIsConfigurableTransformer.m ├── Images.xcassets │ ├── AppIcon.appiconset │ │ ├── AppIcon128.png │ │ ├── AppIcon128@2x.png │ │ ├── AppIcon16.png │ │ ├── AppIcon16@2x.png │ │ ├── AppIcon256.png │ │ ├── AppIcon256@2x.png │ │ ├── AppIcon32.png │ │ ├── AppIcon32@2x.png │ │ ├── AppIcon512.png │ │ ├── AppIcon512@2x.png │ │ └── Contents.json │ ├── Contents.json │ ├── PrefsAboutVC.imageset │ │ ├── Contents.json │ │ ├── PrefsAboutVC.png │ │ └── PrefsAboutVC@2x.png │ ├── PrefsAppearanceVC.imageset │ │ ├── Contents.json │ │ ├── PrefsAppearanceVC.png │ │ └── PrefsAppearanceVC@2x.png │ ├── PrefsGeneralVC.imageset │ │ ├── Contents.json │ │ ├── PrefsGeneralVC.png │ │ └── PrefsGeneralVC@2x.png │ ├── btnAdd.imageset │ │ ├── Contents.json │ │ ├── btnAdd.png │ │ └── btnAdd@2x.png │ ├── btnCal.imageset │ │ ├── Contents.json │ │ ├── btnCal.png │ │ └── btnCal@2x.png │ ├── btnNext.imageset │ │ ├── Contents.json │ │ ├── btnNext.png │ │ └── btnNext@2x.png │ ├── btnNextAlt.imageset │ │ ├── Contents.json │ │ ├── btnNextAlt.png │ │ └── btnNextAlt@2x.png │ ├── btnOpt.imageset │ │ ├── Contents.json │ │ ├── btnOpt.png │ │ └── btnOpt@2x.png │ ├── btnPin.imageset │ │ ├── Contents.json │ │ ├── btnPin.png │ │ └── btnPin@2x.png │ ├── btnPinAlt.imageset │ │ ├── Contents.json │ │ ├── btnPinAlt.png │ │ └── btnPinAlt@2x.png │ ├── btnPrev.imageset │ │ ├── Contents.json │ │ ├── btnPrev.png │ │ └── btnPrev@2x.png │ ├── btnPrevAlt.imageset │ │ ├── Contents.json │ │ ├── btnPrevAlt.png │ │ └── btnPrevAlt@2x.png │ ├── btnToday.imageset │ │ ├── Contents.json │ │ ├── btnToday.png │ │ └── btnToday@2x.png │ ├── btnTodayAlt.imageset │ │ ├── Contents.json │ │ ├── btnTodayAlt.png │ │ └── btnTodayAlt@2x.png │ ├── meetOutline.imageset │ │ ├── Contents.json │ │ ├── meetOutline.png │ │ └── meetOutline@2x.png │ ├── meetSolid.imageset │ │ ├── Contents.json │ │ ├── meetSolid.png │ │ └── meetSolid@2x.png │ ├── menubaricon0.imageset │ │ ├── Contents.json │ │ ├── menubaricon0.png │ │ └── menubaricon0@2x.png │ ├── menubaricon1.imageset │ │ ├── Contents.json │ │ ├── menubaricon1.png │ │ └── menubaricon1@2x.png │ ├── menubaricon2.imageset │ │ ├── Contents.json │ │ ├── menubaricon2.png │ │ └── menubaricon2@2x.png │ ├── menubaricon3.imageset │ │ ├── Contents.json │ │ ├── menubaricon3.png │ │ └── menubaricon3@2x.png │ ├── move.imageset │ │ ├── Contents.json │ │ └── move.png │ ├── video14.imageset │ │ ├── Contents.json │ │ ├── video14.png │ │ └── video14@2x.png │ ├── video16.imageset │ │ ├── Contents.json │ │ ├── video16.png │ │ └── video16@2x.png │ └── video18.imageset │ │ ├── Contents.json │ │ ├── video18.png │ │ └── video18@2x.png ├── Info.plist ├── Itsycal.entitlements ├── Itsycal.h ├── Itsycal.m ├── ItsycalWindow.h ├── ItsycalWindow.m ├── MoButton.h ├── MoButton.m ├── MoCalCell.h ├── MoCalCell.m ├── MoCalGrid.h ├── MoCalGrid.m ├── MoCalResizeHandle.h ├── MoCalResizeHandle.m ├── MoCalToolTipWC.h ├── MoCalToolTipWC.m ├── MoCalTooltipProvider.h ├── MoCalendar.h ├── MoCalendar.m ├── MoDate.h ├── MoDate.m ├── MoLoginItem.h ├── MoLoginItem.m ├── MoTableView.h ├── MoTableView.m ├── MoTextField.h ├── MoTextField.m ├── MoUtils.h ├── MoUtils.m ├── MoVFLHelper.h ├── MoVFLHelper.m ├── PrefsAboutVC.h ├── PrefsAboutVC.m ├── PrefsAppearanceVC.h ├── PrefsAppearanceVC.m ├── PrefsGeneralVC.h ├── PrefsGeneralVC.m ├── PrefsVC.h ├── PrefsVC.m ├── SBCalendar.h ├── Sizer.h ├── Sizer.m ├── Themer.h ├── Themer.m ├── TooltipViewController.h ├── TooltipViewController.m ├── ViewController.h ├── ViewController.m ├── _fonts │ └── Mow.otf ├── _frameworks │ ├── MASShortcut.framework │ │ ├── Headers │ │ ├── MASShortcut │ │ ├── Modules │ │ ├── Resources │ │ └── Versions │ │ │ ├── A │ │ │ ├── Headers │ │ │ │ ├── MASDictionaryTransformer.h │ │ │ │ ├── MASKeyCodes.h │ │ │ │ ├── MASShortcut.h │ │ │ │ ├── MASShortcutBinder.h │ │ │ │ ├── MASShortcutMonitor.h │ │ │ │ ├── MASShortcutValidator.h │ │ │ │ ├── MASShortcutView+Bindings.h │ │ │ │ ├── MASShortcutView.h │ │ │ │ ├── MASShortcutViewButtonCell.h │ │ │ │ └── Shortcut.h │ │ │ ├── MASShortcut │ │ │ ├── Modules │ │ │ │ └── module.modulemap │ │ │ ├── Resources │ │ │ │ ├── Info.plist │ │ │ │ ├── de.lproj │ │ │ │ │ └── Localizable.strings │ │ │ │ ├── en.lproj │ │ │ │ │ └── Localizable.strings │ │ │ │ ├── es.lproj │ │ │ │ │ └── Localizable.strings │ │ │ │ ├── fr.lproj │ │ │ │ │ └── Localizable.strings │ │ │ │ ├── it.lproj │ │ │ │ │ └── Localizable.strings │ │ │ │ └── zh-Hans.lproj │ │ │ │ │ └── Localizable.strings │ │ │ └── _CodeSignature │ │ │ │ └── CodeResources │ │ │ └── Current │ └── Sparkle.framework │ │ ├── Headers │ │ ├── Modules │ │ ├── PrivateHeaders │ │ ├── Resources │ │ ├── Sparkle │ │ └── Versions │ │ ├── A │ │ ├── Headers │ │ │ ├── SPUDownloadData.h │ │ │ ├── SPUDownloader.h │ │ │ ├── SPUDownloaderDelegate.h │ │ │ ├── SPUDownloaderProtocol.h │ │ │ ├── SPUDownloaderSession.h │ │ │ ├── SPUURLRequest.h │ │ │ ├── SUAppcast.h │ │ │ ├── SUAppcastItem.h │ │ │ ├── SUCodeSigningVerifier.h │ │ │ ├── SUErrors.h │ │ │ ├── SUExport.h │ │ │ ├── SUStandardVersionComparator.h │ │ │ ├── SUUpdater.h │ │ │ ├── SUUpdaterDelegate.h │ │ │ ├── SUVersionComparisonProtocol.h │ │ │ ├── SUVersionDisplayProtocol.h │ │ │ └── Sparkle.h │ │ ├── Modules │ │ │ └── module.modulemap │ │ ├── PrivateHeaders │ │ │ └── SUUnarchiver.h │ │ ├── Resources │ │ │ ├── Autoupdate.app │ │ │ │ └── Contents │ │ │ │ │ ├── Info.plist │ │ │ │ │ ├── MacOS │ │ │ │ │ ├── Autoupdate │ │ │ │ │ └── fileop │ │ │ │ │ ├── PkgInfo │ │ │ │ │ ├── Resources │ │ │ │ │ ├── AppIcon.icns │ │ │ │ │ ├── Base.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── SUStatus.nib │ │ │ │ │ ├── de.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── es.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── fr.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── it.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ ├── zh_CN.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ └── zh_TW.lproj │ │ │ │ │ │ └── Sparkle.strings │ │ │ │ │ └── _CodeSignature │ │ │ │ │ └── CodeResources │ │ │ ├── Base.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.nib │ │ │ │ ├── SUUpdateAlert.nib │ │ │ │ ├── SUUpdatePermissionPrompt.nib │ │ │ │ │ ├── keyedobjects-101400.nib │ │ │ │ │ └── keyedobjects-110000.nib │ │ │ │ └── Sparkle.strings │ │ │ ├── Info.plist │ │ │ ├── ReleaseNotesColorStyle.css │ │ │ ├── SUModelTranslation.plist │ │ │ ├── SUStatus.nib │ │ │ ├── de.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ │ ├── en.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ └── SUUpdatePermissionPrompt.strings │ │ │ ├── es.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ │ ├── fr.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ │ ├── it.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ │ ├── zh_CN.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ │ └── zh_TW.lproj │ │ │ │ ├── SUAutomaticUpdateAlert.strings │ │ │ │ ├── SUUpdateAlert.strings │ │ │ │ ├── SUUpdatePermissionPrompt.strings │ │ │ │ └── Sparkle.strings │ │ ├── Sparkle │ │ └── _CodeSignature │ │ │ └── CodeResources │ │ └── Current ├── _psd │ ├── btnDel.acorn │ ├── btnDel@2x.acorn │ ├── delete.psd │ └── delete@2x.psd ├── _sketch │ ├── AppIcon.sketch │ ├── btns.sketch │ ├── menubaricon.sketch │ ├── move.sketch │ ├── nav.sketch │ └── prefs.sketch ├── _translations │ ├── Itsycal │ │ ├── de.xliff │ │ ├── es.xliff │ │ ├── fr.xliff │ │ └── it.xliff │ └── README.txt ├── beep.mp3 ├── de.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.strings ├── es.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.strings ├── fr.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.strings ├── it.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.strings ├── main.m └── zh-Hans.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── MainMenu.strings ├── LICENSE.txt ├── README.txt └── make_zips_and_appcast.sh /.gitignore: -------------------------------------------------------------------------------- 1 | ## User settings 2 | xcuserdata/ 3 | 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /BUILD.md: -------------------------------------------------------------------------------- 1 | ### Build and Notarize 2 | 3 | 1. In Xcode, choose Product > Archive 4 | 5 | 2. In Xcode Organizer, choose Distribute App and follow flow 6 | for uploading Developer ID app for notarization. The default 7 | selections should be ok. 8 | 9 | 3. Wait for notification that app is successfully notarized. 10 | 11 | 4. Export notarized app to the Desktop. 12 | 13 | 5. Run ./make_zips_and_appcast.sh 14 | 15 | ### Resources 16 | 17 | [Notarizing Your App Before Distribution](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution?language=objc) 18 | 19 | [Customizing the Notarization Workflow](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/customizing_the_notarization_workflow?language=objc) 20 | 21 | [Resolving Common Notarization Issues](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution/resolving_common_notarization_issues?language=objc) 22 | 23 | -------------------------------------------------------------------------------- /Itsycal/AgendaViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // AgendaViewController.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/18/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoTableView.h" 11 | 12 | @protocol AgendaDelegate; 13 | 14 | @interface AgendaViewController : NSViewController 15 | 16 | @property (nonatomic, weak) NSCalendar *nsCal; 17 | @property (nonatomic) MoTableView *tv; 18 | @property (nonatomic) NSArray *events; 19 | @property (nonatomic, weak) id delegate; 20 | @property (nonatomic) BOOL showLocation; 21 | 22 | - (void)reloadData; 23 | - (void)dimEventsIfNecessary; 24 | - (BOOL)clickFirstActiveZoomButton; 25 | 26 | @end 27 | 28 | @class EKEvent; 29 | 30 | @protocol AgendaDelegate 31 | 32 | @optional 33 | - (void)agendaHoveredOverRow:(NSInteger)row; 34 | - (void)agendaWantsToDeleteEvent:(EKEvent *)event; 35 | - (void)agendaShowCalendarAppAtDate:(NSDate *)date; 36 | - (CGFloat)agendaMaxPossibleHeight; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Itsycal/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/4/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AppDelegate : NSObject 12 | 13 | @end 14 | 15 | -------------------------------------------------------------------------------- /Itsycal/Base.lproj/MainMenu.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/HighlightedDOWBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "mac", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.940", 13 | "alpha" : "1.000", 14 | "blue" : "0.940", 15 | "green" : "0.940" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "mac", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.235", 31 | "alpha" : "1.000", 32 | "blue" : "0.235", 33 | "green" : "0.235" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/MainBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "mac", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "1.000", 13 | "alpha" : "1.000", 14 | "blue" : "1.000", 15 | "green" : "1.000" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "mac", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.150", 31 | "alpha" : "1.000", 32 | "blue" : "0.170", 33 | "green" : "0.160" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/PendingBackgroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "color" : { 5 | "color-space" : "srgb", 6 | "components" : { 7 | "alpha" : "0.250", 8 | "blue" : "0.740", 9 | "green" : "0.740", 10 | "red" : "0.740" 11 | } 12 | }, 13 | "idiom" : "mac" 14 | }, 15 | { 16 | "appearances" : [ 17 | { 18 | "appearance" : "luminosity", 19 | "value" : "dark" 20 | } 21 | ], 22 | "color" : { 23 | "color-space" : "srgb", 24 | "components" : { 25 | "alpha" : "0.250", 26 | "blue" : "0.450", 27 | "green" : "0.450", 28 | "red" : "0.450" 29 | } 30 | }, 31 | "idiom" : "mac" 32 | } 33 | ], 34 | "info" : { 35 | "author" : "xcode", 36 | "version" : 1 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/ResizeHandleForegroundColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "mac", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.400", 13 | "alpha" : "1.000", 14 | "blue" : "0.400", 15 | "green" : "0.400" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "mac", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.700", 31 | "alpha" : "1.000", 32 | "blue" : "0.700", 33 | "green" : "0.700" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/TodayCellColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "mac", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.250", 13 | "alpha" : "1.000", 14 | "blue" : "1.000", 15 | "green" : "0.600" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "mac", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.200", 31 | "alpha" : "1.000", 32 | "blue" : "0.900", 33 | "green" : "0.550" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Itsycal/Colors.xcassets/WindowBorderColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "colors" : [ 7 | { 8 | "idiom" : "mac", 9 | "color" : { 10 | "color-space" : "srgb", 11 | "components" : { 12 | "red" : "0.400", 13 | "alpha" : "0.400", 14 | "blue" : "0.400", 15 | "green" : "0.400" 16 | } 17 | } 18 | }, 19 | { 20 | "idiom" : "mac", 21 | "appearances" : [ 22 | { 23 | "appearance" : "luminosity", 24 | "value" : "dark" 25 | } 26 | ], 27 | "color" : { 28 | "color-space" : "srgb", 29 | "components" : { 30 | "red" : "0.600", 31 | "alpha" : "0.400", 32 | "blue" : "0.600", 33 | "green" : "0.600" 34 | } 35 | } 36 | } 37 | ] 38 | } -------------------------------------------------------------------------------- /Itsycal/DatePickerVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/9/24. 3 | // Copyright © 2024 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | #import "MoCalendar.h" 8 | 9 | NS_ASSUME_NONNULL_BEGIN 10 | 11 | @interface DatePickerVC : NSViewController 12 | 13 | @property (nonatomic, weak) NSPopover *enclosingPopover; 14 | 15 | - (instancetype)initWithMoCal:(MoCalendar *)moCal nsCal:(NSCalendar *)nsCal; 16 | 17 | @end 18 | 19 | NS_ASSUME_NONNULL_END 20 | -------------------------------------------------------------------------------- /Itsycal/DatePickerVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/9/24. 3 | // Copyright © 2024 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "DatePickerVC.h" 7 | #import "MoVFLHelper.h" 8 | #import "Themer.h" 9 | 10 | @implementation DatePickerVC 11 | { 12 | NSDatePicker *_picker; 13 | __weak MoCalendar *_moCal; 14 | __weak NSCalendar *_nsCal; 15 | } 16 | 17 | - (instancetype)initWithMoCal:(MoCalendar *)moCal nsCal:(NSCalendar *)nsCal 18 | { 19 | self = [super init]; 20 | if (self) { 21 | _moCal = moCal; 22 | _nsCal = nsCal; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)loadView 28 | { 29 | NSView *v = [NSView new]; 30 | 31 | _picker = [NSDatePicker new]; 32 | _picker.datePickerStyle = NSDatePickerStyleTextField; 33 | _picker.locale = NSLocale.currentLocale; 34 | _picker.bezeled = YES; 35 | _picker.bordered = NO; 36 | _picker.drawsBackground = NO; 37 | _picker.datePickerElements = NSDatePickerElementFlagYearMonthDay; 38 | _picker.dateValue = MakeNSDateWithDate(_moCal.selectedDate, _nsCal); 39 | [v addSubview:_picker]; 40 | 41 | NSTextField *label = [NSTextField labelWithString:NSLocalizedString(@"Go to date", @"")]; 42 | label.font = [NSFont systemFontOfSize:[NSFont systemFontSize] weight:NSFontWeightSemibold]; 43 | [v addSubview:label]; 44 | 45 | NSButton *btn = [NSButton buttonWithTitle:@"→" target:self action:@selector(buttonAction:)]; 46 | btn.translatesAutoresizingMaskIntoConstraints = NO; 47 | btn.keyEquivalent = @"\r"; 48 | [v addSubview:btn]; 49 | 50 | MoVFLHelper *vfl = [[MoVFLHelper alloc] initWithSuperview:v metrics:nil views:NSDictionaryOfVariableBindings(_picker, label, btn)]; 51 | [vfl :@"H:|-10-[_picker]-[btn]-10-|" :NSLayoutFormatAlignAllLastBaseline]; 52 | [vfl :@"V:|-10-[label]-[_picker]-10-|" :NSLayoutFormatAlignAllLeading]; 53 | 54 | self.view = v; 55 | } 56 | 57 | - (void)viewDidAppear 58 | { 59 | // Add a colored subview at the bottom the of popover's 60 | // window's frameView's view hierarchy. This should color 61 | // the popover including the arrow. 62 | NSView *frameView = self.view.window.contentView.superview; 63 | if (!frameView) return; 64 | if (frameView.subviews.count > 0 65 | && [frameView.subviews[0].identifier isEqualToString:@"popoverBackgroundBox"]) return; 66 | NSBox *backgroundColorView = [[NSBox alloc] initWithFrame:frameView.bounds]; 67 | backgroundColorView.identifier = @"popoverBackgroundBox"; 68 | backgroundColorView.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 69 | backgroundColorView.boxType = NSBoxCustom; 70 | backgroundColorView.borderWidth = 0; 71 | backgroundColorView.fillColor = Theme.mainBackgroundColor; 72 | [frameView addSubview:backgroundColorView positioned:NSWindowBelow relativeTo:nil]; 73 | } 74 | 75 | - (void)buttonAction:(id)sender 76 | { 77 | _moCal.selectedDate = MakeDateWithNSDate(_picker.dateValue, _nsCal); 78 | [self.enclosingPopover close]; 79 | } 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /Itsycal/EventCenter.h: -------------------------------------------------------------------------------- 1 | // 2 | // EventCenter.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/12/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "MoDate.h" 12 | 13 | // ========================================================================= 14 | // EventCenter 15 | // Provide calendar and event data. 16 | // ========================================================================= 17 | 18 | @protocol EventCenterDelegate; 19 | 20 | @interface EventCenter : NSObject 21 | 22 | // Did the user grant calendar access? 23 | @property (nonatomic, readonly) BOOL calendarAccessGranted; 24 | 25 | @property (nonatomic, readonly) NSString *defaultCalendarIdentifier; 26 | 27 | // Delegate is responsible for... 28 | @property (nonatomic, weak) id delegate; 29 | 30 | - (instancetype)initWithCalendar:(NSCalendar *)calendar delegate:(id)delegate; 31 | 32 | - (EKEvent *)newEvent; 33 | 34 | - (BOOL)saveEvent:(EKEvent *)event error:(NSError **)error; 35 | 36 | - (BOOL)removeEvent:(EKEvent *)event span:(EKSpan)span error:(NSError **)error; 37 | 38 | - (void)fetchEvents; 39 | 40 | // Sorted array of 2 types: NSStrings and CalendarInfo objects. 41 | // The NSStrings are the names of calendar sources. 42 | // The CalendarInfo objects describe the calendars in those sources. 43 | // Alphabetical by source, then calendar title. Each source is 44 | // followed by its calendars. Datasource for Prefs tableview. 45 | - (NSArray *)sourcesAndCalendars; 46 | 47 | // A dict that maps dates to an array of EventInfo objects. 48 | // Only contains events for user's selected (i.e. filtered) calendars. 49 | - (NSDictionary *)filteredEventsForDate; 50 | 51 | // When the user selects/unselects calendars in Prefs, we update 52 | // the list of selected calendars. 53 | - (void)updateSelectedCalendarsForIdentifier:(NSString *)identifier selected:(BOOL)selected; 54 | 55 | // Clear cached events and refetch. 56 | - (void)refetchAll; 57 | 58 | // Refresh event store. 59 | - (void)refresh; 60 | 61 | @end 62 | 63 | // ========================================================================= 64 | // EventCenterDelegate 65 | // ========================================================================= 66 | 67 | @protocol EventCenterDelegate 68 | 69 | - (void)eventCenterEventsChanged; 70 | - (MoDate)fetchStartDate; 71 | - (MoDate)fetchEndDate; 72 | 73 | @end 74 | 75 | // ========================================================================= 76 | // CalendarInfo 77 | // ========================================================================= 78 | 79 | @interface CalendarInfo : NSObject 80 | 81 | @property (nonatomic) EKCalendar *calendar; 82 | @property (nonatomic) BOOL selected; 83 | 84 | @end 85 | 86 | // ========================================================================= 87 | // EventInfo 88 | // ========================================================================= 89 | 90 | @interface EventInfo : NSObject 91 | 92 | @property (nonatomic) EKEvent *event; // nil if there's no event on this date 93 | @property (nonatomic) BOOL isStartDate; // event starts, but doesn't end, on this date 94 | @property (nonatomic) BOOL isEndDate; // event ends, but doesn't start, on this date 95 | @property (nonatomic) BOOL isAllDay; // event is all-day, or spans across this date 96 | @property (nonatomic) NSURL *zoomURL; // Zoom, Google Meet, Microsoft Teams, etc. URL 97 | @end 98 | -------------------------------------------------------------------------------- /Itsycal/EventViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // EventViewController.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/25/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class EventCenter; 12 | 13 | @interface EventViewController : NSViewController 14 | 15 | @property (nonatomic, weak) EventCenter *ec; 16 | @property (nonatomic, weak) NSPopover *enclosingPopover; 17 | @property (nonatomic, weak) NSCalendar *cal; 18 | @property (nonatomic) NSDate *calSelectedDate; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Itsycal/HighlightPicker.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/16/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | #import "MoCalendar.h" // for DOWMask type 8 | 9 | 10 | // A control for picking which columns to highlight 11 | // in the calendar. Used in the Preferences panel. 12 | // 13 | // Highlight: S M T W T F S 14 | // [x][ ][ ][ ][ ][ ][x] 15 | // 16 | 17 | @interface HighlightPicker : NSControl 18 | 19 | // The day of the week on which the week starts. 20 | // 0...6; 0=Sunday, 1=Monday,... 6=Saturday 21 | // Control will draw its checkboxes in this order. 22 | @property (nonatomic) NSInteger weekStartDOW; 23 | 24 | // A bitmask of the days selected by the picker. 25 | @property (nonatomic) DOWMask selectedDOWs; 26 | 27 | @end 28 | 29 | -------------------------------------------------------------------------------- /Itsycal/HighlightPicker.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/16/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "HighlightPicker.h" 7 | 8 | @implementation HighlightPicker 9 | { 10 | NSGridView *_grid; 11 | NSArray *_checkboxes; 12 | } 13 | 14 | - (instancetype)initWithFrame:(NSRect)frameRect 15 | { 16 | self = [super initWithFrame:frameRect]; 17 | if (self) { 18 | _weekStartDOW = 0; 19 | _selectedDOWs = DOWMaskNone; 20 | 21 | // Make the _checkboxes array. Each checkbox has a 22 | // title that is the localized veryShortSymbol for a 23 | // day-of-the-week (dow). In English: S M T W T F S. 24 | NSArray *dows = [[NSDateFormatter new] veryShortWeekdaySymbols]; 25 | NSMutableArray *checkboxes = [NSMutableArray new]; 26 | for (NSInteger i = 0; i < 7; i++) { 27 | NSString *dow = [dows objectAtIndex:i]; 28 | // Make French dow strings lowercase because that is the convention 29 | // in France. -veryShortWeekdaySymbols should have done this for us. 30 | if ([[NSLocale currentLocale].localeIdentifier hasPrefix:@"fr"]) { 31 | dow = [dow lowercaseString]; 32 | } 33 | NSButton *checkbox = [NSButton checkboxWithTitle:dow target:self action:@selector(didClickCheckbox:)]; 34 | checkbox.imagePosition = NSImageBelow; 35 | [checkboxes addObject:checkbox]; 36 | } 37 | _checkboxes = [NSArray arrayWithArray:checkboxes]; 38 | 39 | // The _grid is a single row with the control's title (Highlight:) 40 | // and then seven checkboxes representing each day-of-the-week. 41 | _grid = [NSGridView gridViewWithViews:@[ 42 | @[[NSTextField labelWithString:NSLocalizedString(@"Highlight:", @"")], 43 | _checkboxes[0], _checkboxes[1], _checkboxes[2], _checkboxes[3], 44 | _checkboxes[4], _checkboxes[5], _checkboxes[6]]]]; 45 | _grid.rowAlignment = NSGridRowAlignmentFirstBaseline; 46 | _grid.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 47 | _grid.frame = self.bounds; 48 | [self addSubview:_grid]; 49 | } 50 | return self; 51 | } 52 | 53 | - (void)setWeekStartDOW:(NSInteger)weekStartDOW 54 | { 55 | // Constrain weekStartDOW to 0...6. 56 | weekStartDOW = MAX(MIN(weekStartDOW, 6), 0); 57 | 58 | // Reorder checkboxes in _grid so weekStartDOW is first. 59 | NSInteger diff = weekStartDOW - _weekStartDOW; 60 | if (diff > 0) { 61 | for (NSInteger i = 0; i < diff; i++) { 62 | [_grid moveColumnAtIndex:1 toIndex:7]; 63 | } 64 | } 65 | else if (diff < 0) { 66 | for (NSInteger i = 0; i < -diff; i++) { 67 | [_grid moveColumnAtIndex:7 toIndex:1]; 68 | } 69 | } 70 | _weekStartDOW = weekStartDOW; 71 | } 72 | 73 | - (void)setSelectedDOWs:(DOWMask)selectedDOWs 74 | { 75 | // Turn on/off checkboxes to reflect selectedDOWs. 76 | for (NSInteger i = 0; i < 7; i++) { 77 | DOWMask test = 1 << i; 78 | [[_checkboxes objectAtIndex:i] setState:test & selectedDOWs]; 79 | } 80 | _selectedDOWs = selectedDOWs; 81 | } 82 | 83 | - (void)didClickCheckbox:(NSButton *)checkbox 84 | { 85 | // Set _selectedDOWs to reflect the states of the 86 | // checkboxes and then send action to the target. 87 | DOWMask newValue = DOWMaskNone; 88 | for (NSInteger i = 0; i < 7; i++) { 89 | if ([_checkboxes objectAtIndex:i].state == 1) { 90 | newValue |= (1 << i); 91 | } 92 | } 93 | _selectedDOWs = newValue; 94 | 95 | [self sendAction:self.action to:self.target]; 96 | } 97 | 98 | @end 99 | -------------------------------------------------------------------------------- /Itsycal/IconIsConfigurableTransformer.h: -------------------------------------------------------------------------------- 1 | // 2 | // IconIsConfigurableTransformer.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 9/17/23. 6 | // Copyright © 2023 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface IconIsConfigurableTransformer : NSValueTransformer 14 | 15 | @end 16 | 17 | NS_ASSUME_NONNULL_END 18 | -------------------------------------------------------------------------------- /Itsycal/IconIsConfigurableTransformer.m: -------------------------------------------------------------------------------- 1 | // 2 | // IconIsConfigurableTransformer.m 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 9/17/23. 6 | // Copyright © 2023 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "IconIsConfigurableTransformer.h" 10 | 11 | @implementation IconIsConfigurableTransformer 12 | 13 | + (Class)transformedValueClass 14 | { 15 | return [NSNumber class]; 16 | } 17 | 18 | - (id)transformedValue:(id)value 19 | { 20 | NSInteger index; 21 | 22 | // By default, icon is configurable. 23 | if (value == nil) return [NSNumber numberWithBool:YES]; 24 | 25 | if ([value respondsToSelector:@selector(integerValue)]) { 26 | index = [value integerValue]; 27 | } 28 | else { 29 | [NSException raise:NSInternalInconsistencyException format:@"IconIsConfigurableTransformer: value (%@) does not respond to -integerValue.", [value class]]; 30 | } 31 | 32 | // kMenuBarIconType is 0, 1, 2 or 3. 33 | // Both type 0 (solid round rect) and type 1 (outlined round rect) can be 34 | // configured to show month and day of week. Types 2 and 3 cannot. 35 | return [NSNumber numberWithBool: index <= 1]; 36 | } 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon128.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon128@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon16.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon16@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon256.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon256@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon32.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon32@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon512.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/AppIcon.appiconset/AppIcon512@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "16x16", 5 | "idiom" : "mac", 6 | "filename" : "AppIcon16.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "16x16", 11 | "idiom" : "mac", 12 | "filename" : "AppIcon16@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "32x32", 17 | "idiom" : "mac", 18 | "filename" : "AppIcon32.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "32x32", 23 | "idiom" : "mac", 24 | "filename" : "AppIcon32@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "128x128", 29 | "idiom" : "mac", 30 | "filename" : "AppIcon128.png", 31 | "scale" : "1x" 32 | }, 33 | { 34 | "size" : "128x128", 35 | "idiom" : "mac", 36 | "filename" : "AppIcon128@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "256x256", 41 | "idiom" : "mac", 42 | "filename" : "AppIcon256.png", 43 | "scale" : "1x" 44 | }, 45 | { 46 | "size" : "256x256", 47 | "idiom" : "mac", 48 | "filename" : "AppIcon256@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "512x512", 53 | "idiom" : "mac", 54 | "filename" : "AppIcon512.png", 55 | "scale" : "1x" 56 | }, 57 | { 58 | "size" : "512x512", 59 | "idiom" : "mac", 60 | "filename" : "AppIcon512@2x.png", 61 | "scale" : "2x" 62 | } 63 | ], 64 | "info" : { 65 | "version" : 1, 66 | "author" : "xcode" 67 | } 68 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAboutVC.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "PrefsAboutVC.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "PrefsAboutVC@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAboutVC.imageset/PrefsAboutVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsAboutVC.imageset/PrefsAboutVC.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAboutVC.imageset/PrefsAboutVC@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsAboutVC.imageset/PrefsAboutVC@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAppearanceVC.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "PrefsAppearanceVC.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "PrefsAppearanceVC@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAppearanceVC.imageset/PrefsAppearanceVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsAppearanceVC.imageset/PrefsAppearanceVC.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsAppearanceVC.imageset/PrefsAppearanceVC@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsAppearanceVC.imageset/PrefsAppearanceVC@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsGeneralVC.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "PrefsGeneralVC.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "PrefsGeneralVC@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsGeneralVC.imageset/PrefsGeneralVC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsGeneralVC.imageset/PrefsGeneralVC.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/PrefsGeneralVC.imageset/PrefsGeneralVC@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/PrefsGeneralVC.imageset/PrefsGeneralVC@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnAdd.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnAdd.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnAdd@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnAdd.imageset/btnAdd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnAdd.imageset/btnAdd.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnAdd.imageset/btnAdd@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnAdd.imageset/btnAdd@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnCal.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnCal.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnCal@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnCal.imageset/btnCal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnCal.imageset/btnCal.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnCal.imageset/btnCal@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnCal.imageset/btnCal@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNext.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnNext.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnNext@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNext.imageset/btnNext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnNext.imageset/btnNext.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNext.imageset/btnNext@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnNext.imageset/btnNext@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNextAlt.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnNextAlt.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnNextAlt@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNextAlt.imageset/btnNextAlt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnNextAlt.imageset/btnNextAlt.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnNextAlt.imageset/btnNextAlt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnNextAlt.imageset/btnNextAlt@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnOpt.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnOpt.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnOpt@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnOpt.imageset/btnOpt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnOpt.imageset/btnOpt.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnOpt.imageset/btnOpt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnOpt.imageset/btnOpt@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPin.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnPin.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnPin@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPin.imageset/btnPin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPin.imageset/btnPin.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPin.imageset/btnPin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPin.imageset/btnPin@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPinAlt.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnPinAlt.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnPinAlt@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPinAlt.imageset/btnPinAlt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPinAlt.imageset/btnPinAlt.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPinAlt.imageset/btnPinAlt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPinAlt.imageset/btnPinAlt@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrev.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnPrev.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnPrev@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrev.imageset/btnPrev.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPrev.imageset/btnPrev.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrev.imageset/btnPrev@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPrev.imageset/btnPrev@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrevAlt.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnPrevAlt.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnPrevAlt@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrevAlt.imageset/btnPrevAlt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPrevAlt.imageset/btnPrevAlt.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnPrevAlt.imageset/btnPrevAlt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnPrevAlt.imageset/btnPrevAlt@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnToday.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnToday.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnToday@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnToday.imageset/btnToday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnToday.imageset/btnToday.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnToday.imageset/btnToday@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnToday.imageset/btnToday@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnTodayAlt.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "scale" : "1x", 6 | "filename" : "btnTodayAlt.png" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x", 11 | "filename" : "btnTodayAlt@2x.png" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnTodayAlt.imageset/btnTodayAlt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnTodayAlt.imageset/btnTodayAlt.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/btnTodayAlt.imageset/btnTodayAlt@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/btnTodayAlt.imageset/btnTodayAlt@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetOutline.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "meetOutline.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "meetOutline@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetOutline.imageset/meetOutline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/meetOutline.imageset/meetOutline.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetOutline.imageset/meetOutline@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/meetOutline.imageset/meetOutline@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetSolid.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "meetSolid.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "meetSolid@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "author" : "xcode", 20 | "version" : 1 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetSolid.imageset/meetSolid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/meetSolid.imageset/meetSolid.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/meetSolid.imageset/meetSolid@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/meetSolid.imageset/meetSolid@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon0.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menubaricon0.png", 5 | "idiom" : "mac", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "menubaricon0@2x.png", 10 | "idiom" : "mac", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | }, 18 | "properties" : { 19 | "template-rendering-intent" : "template" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon0.imageset/menubaricon0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon0.imageset/menubaricon0.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon0.imageset/menubaricon0@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon0.imageset/menubaricon0@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon1.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menubaricon1.png", 5 | "idiom" : "mac", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "menubaricon1@2x.png", 10 | "idiom" : "mac", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | }, 18 | "properties" : { 19 | "template-rendering-intent" : "template" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon1.imageset/menubaricon1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon1.imageset/menubaricon1.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon1.imageset/menubaricon1@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon1.imageset/menubaricon1@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menubaricon2.png", 5 | "idiom" : "mac", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "menubaricon2@2x.png", 10 | "idiom" : "mac", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | }, 18 | "properties" : { 19 | "template-rendering-intent" : "template" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon2.imageset/menubaricon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon2.imageset/menubaricon2.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon2.imageset/menubaricon2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon2.imageset/menubaricon2@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon3.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "menubaricon3.png", 5 | "idiom" : "mac", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "menubaricon3@2x.png", 10 | "idiom" : "mac", 11 | "scale" : "2x" 12 | } 13 | ], 14 | "info" : { 15 | "author" : "xcode", 16 | "version" : 1 17 | }, 18 | "properties" : { 19 | "template-rendering-intent" : "template" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon3.imageset/menubaricon3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon3.imageset/menubaricon3.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/menubaricon3.imageset/menubaricon3@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/menubaricon3.imageset/menubaricon3@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/move.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "move.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/move.imageset/move.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/move.imageset/move.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video14.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "video14.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "video14@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video14.imageset/video14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video14.imageset/video14.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video14.imageset/video14@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video14.imageset/video14@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video16.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "video16.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "video16@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video16.imageset/video16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video16.imageset/video16.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video16.imageset/video16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video16.imageset/video16@2x.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video18.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "video18.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "video18@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video18.imageset/video18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video18.imageset/video18.png -------------------------------------------------------------------------------- /Itsycal/Images.xcassets/video18.imageset/video18@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/Images.xcassets/video18.imageset/video18@2x.png -------------------------------------------------------------------------------- /Itsycal/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ATSApplicationFontsPath 6 | Fonts 7 | CFBundleAllowMixedLocalizations 8 | 9 | CFBundleDevelopmentRegion 10 | en 11 | CFBundleExecutable 12 | $(EXECUTABLE_NAME) 13 | CFBundleIconFile 14 | 15 | CFBundleIdentifier 16 | $(PRODUCT_BUNDLE_IDENTIFIER) 17 | CFBundleInfoDictionaryVersion 18 | 6.0 19 | CFBundleName 20 | $(PRODUCT_NAME) 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | $(MARKETING_VERSION) 25 | CFBundleSignature 26 | ???? 27 | CFBundleURLTypes 28 | 29 | 30 | CFBundleTypeRole 31 | Viewer 32 | CFBundleURLName 33 | com.mowglii.ItsycalApp 34 | CFBundleURLSchemes 35 | 36 | itsycal 37 | 38 | 39 | 40 | CFBundleVersion 41 | $(CURRENT_PROJECT_VERSION) 42 | LSApplicationCategoryType 43 | public.app-category.utilities 44 | LSMinimumSystemVersion 45 | $(MACOSX_DEPLOYMENT_TARGET) 46 | LSUIElement 47 | 48 | NSAppleEventsUsageDescription 49 | Itsycal uses AppleEvents to open your calendar app to the selected day. You can change this setting in System Preferences › Security & Privacy › Privacy 50 | NSCalendarsFullAccessUsageDescription 51 | Itsycal is more useful when it can display events from your calendars. You can change this setting in System Settings › Privacy & Security › Calendars 52 | NSCalendarsUsageDescription 53 | Itsycal is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy 54 | NSHumanReadableCopyright 55 | © 2012 − 2024 mowglii.com 56 | NSMainNibFile 57 | MainMenu 58 | NSPrincipalClass 59 | NSApplication 60 | SUAllowsAutomaticUpdates 61 | 62 | SUEnableAutomaticChecks 63 | 64 | SUFeedURL 65 | https://s3.amazonaws.com/itsycal/itsycal.xml 66 | SUPublicEDKey 67 | TxKIjUS10OYKgZaAQlRvDjFNEc28hG82wtRWlcNUYSc= 68 | SUScheduledCheckInterval 69 | 345600 70 | 71 | 72 | -------------------------------------------------------------------------------- /Itsycal/Itsycal.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.automation.apple-events 6 | 7 | com.apple.security.personal-information.calendars 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Itsycal/Itsycal.h: -------------------------------------------------------------------------------- 1 | // 2 | // Itsycal.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/3/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import "MoDate.h" 12 | 13 | // NSUserDefaults keys 14 | extern NSString * const kPinItsycal; 15 | extern NSString * const kShowEventDays; 16 | extern NSString * const kShowWeeks; 17 | extern NSString * const kWeekStartDOW; 18 | extern NSString * const kHighlightedDOWs; 19 | extern NSString * const kKeyboardShortcut; 20 | extern NSString * const kMenuBarIconType; 21 | extern NSString * const kShowMonthInIcon; 22 | extern NSString * const kShowDayOfWeekInIcon; 23 | extern NSString * const kShowMeetingIndicator; 24 | extern NSString * const kAllowOutsideApplicationsFolder; 25 | extern NSString * const kClockFormat; 26 | extern NSString * const kHideIcon; 27 | extern NSString * const kShowLocation; 28 | extern NSString * const kShowEventDots; 29 | extern NSString * const kUseColoredDots; 30 | extern NSString * const kBeepBeepOnTheHour; 31 | extern NSString * const kBaselineOffset; 32 | extern NSString * const kEnableMeetingButtonIndefinitely; 33 | extern NSString * const kDoNotDrawOutlineAroundCurrentMonth; 34 | extern NSString * const kShowDaysWithNoEventsInAgenda; 35 | extern NSString * const kShowEventPopoverOnHover; 36 | 37 | // Set an associated object on NSDate to indicate 38 | // whether of not this date has events. 39 | // https://stackoverflow.com/a/16708352 40 | @interface NSDate (HasNoEvents) 41 | @end 42 | 43 | @implementation NSDate (HasNoEvents) 44 | 45 | - (BOOL)hasNoEvents { 46 | NSNumber *num = objc_getAssociatedObject(self, @selector(hasNoEvents)); 47 | return [num boolValue]; 48 | } 49 | 50 | - (void)setHasNoEvents:(BOOL)hasNoEvents { 51 | objc_setAssociatedObject(self, @selector(hasNoEvents), @(hasNoEvents), OBJC_ASSOCIATION_RETAIN); 52 | } 53 | 54 | @end 55 | -------------------------------------------------------------------------------- /Itsycal/Itsycal.m: -------------------------------------------------------------------------------- 1 | // 2 | // Itsycal.m 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/3/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "Itsycal.h" 10 | 11 | // NSUserDefaults keys 12 | NSString * const kPinItsycal = @"PinItsycal"; 13 | NSString * const kShowEventDays = @"ShowEventDays"; 14 | NSString * const kShowWeeks = @"ShowWeeks"; 15 | NSString * const kWeekStartDOW = @"WeekStartDOW"; 16 | NSString * const kHighlightedDOWs = @"HighlightedDOWs"; 17 | NSString * const kKeyboardShortcut = @"GlobalShortcut"; 18 | NSString * const kMenuBarIconType = @"MenuBarIconType"; 19 | NSString * const kShowMonthInIcon = @"ShowMonthInIcon"; 20 | NSString * const kShowDayOfWeekInIcon = @"ShowDayOfWeekInIcon"; 21 | NSString * const kShowMeetingIndicator = @"ShowMeetingIndicator"; 22 | NSString * const kAllowOutsideApplicationsFolder = @"AllowOutsideApplicationsFolder"; 23 | NSString * const kClockFormat = @"ClockFormat"; 24 | NSString * const kHideIcon = @"HideIcon"; 25 | NSString * const kShowLocation = @"ShowLocation"; 26 | NSString * const kShowEventDots = @"kShowEventDots"; 27 | NSString * const kUseColoredDots = @"UseColoredDots"; 28 | NSString * const kBeepBeepOnTheHour = @"BeepBeepOnTheHour"; 29 | NSString * const kBaselineOffset = @"BaselineOffset"; 30 | NSString * const kEnableMeetingButtonIndefinitely = @"EnableMeetingButtonIndefinitely"; 31 | NSString * const kDoNotDrawOutlineAroundCurrentMonth = @"DoNotDrawOutlineAroundCurrentMonth"; 32 | NSString * const kShowDaysWithNoEventsInAgenda = @"ShowDaysWithNoEventsInAgenda"; 33 | NSString * const kShowEventPopoverOnHover = @"ShowEventPopoverOnHover"; 34 | -------------------------------------------------------------------------------- /Itsycal/ItsycalWindow.h: -------------------------------------------------------------------------------- 1 | // 2 | // ItsycalWindow.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 12/14/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ItsycalWindow : NSPanel 12 | 13 | - (void)positionRelativeToRect:(NSRect)rect screenMaxX:(CGFloat)screenMaxX; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Itsycal/MoButton.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoButton.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/11/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MoButton : NSButton 12 | 13 | @property (nonatomic) NSColor *backgroundColor; 14 | @property (nonatomic, copy) void (^actionBlock)(void); 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Itsycal/MoButton.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoButton.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/11/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "MoButton.h" 10 | 11 | @implementation MoButton 12 | { 13 | NSBox *_hoverBox; 14 | } 15 | 16 | - (instancetype)initWithFrame:(NSRect)frameRect 17 | { 18 | self = [super initWithFrame:frameRect]; 19 | if (self) { 20 | self.bordered = NO; 21 | self.imagePosition = NSImageOnly; 22 | [self setButtonType:NSButtonTypeMomentaryChange]; 23 | _hoverBox = [NSBox new]; 24 | _hoverBox.boxType = NSBoxCustom; 25 | _hoverBox.borderWidth = 0; 26 | _hoverBox.cornerRadius = 4; 27 | _hoverBox.alphaValue = 0.08; 28 | _hoverBox.fillColor = NSColor.clearColor; 29 | _hoverBox.autoresizingMask = NSViewWidthSizable | NSViewHeightSizable; 30 | _hoverBox.frame = self.bounds; 31 | [self addSubview:_hoverBox]; 32 | } 33 | return self; 34 | } 35 | 36 | - (CGSize)intrinsicContentSize 37 | { 38 | return self.image.size; 39 | } 40 | 41 | - (void)setImage:(NSImage *)image 42 | { 43 | [super setImage:image]; 44 | // Create a default alternateImage. We will use 45 | // this as the alternate image if the user doesn't 46 | // provide one of their own. 47 | self.alternateImage = [NSImage imageWithSize:image.size flipped:NO drawingHandler:^BOOL(NSRect dstRect) { 48 | [image drawInRect:dstRect]; 49 | [NSColor.controlAccentColor set]; 50 | NSRectFillUsingOperation(dstRect, NSCompositingOperationSourceAtop); 51 | return YES; 52 | }]; 53 | } 54 | 55 | - (void)setEnabled:(BOOL)enabled 56 | { 57 | [super setEnabled:enabled]; 58 | [self evaluateHover]; 59 | } 60 | 61 | - (void)setActionBlock:(void (^)(void))actionBlock 62 | { 63 | if (actionBlock) { 64 | _actionBlock = [actionBlock copy]; 65 | self.target = self; 66 | self.action = @selector(doActionBlock:); 67 | } 68 | else { 69 | _actionBlock = nil; 70 | self.target = nil; 71 | self.action = NULL; 72 | } 73 | } 74 | 75 | - (void)doActionBlock:(id)sender 76 | { 77 | self.actionBlock(); 78 | } 79 | 80 | - (void)updateTrackingAreas 81 | { 82 | for (NSTrackingArea *area in self.trackingAreas) { 83 | [self removeTrackingArea:area]; 84 | } 85 | NSTrackingArea *area = [[NSTrackingArea alloc] initWithRect:self.bounds options:(NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil]; 86 | [self addTrackingArea:area]; 87 | [self evaluateHover]; 88 | [super updateTrackingAreas]; 89 | } 90 | 91 | - (void)evaluateHover 92 | { 93 | NSPoint mouseLocation = [self.window mouseLocationOutsideOfEventStream]; 94 | mouseLocation = [self convertPoint:mouseLocation fromView:nil]; 95 | if (NSPointInRect(mouseLocation, self.bounds)) { 96 | [self showHoverEffect:YES]; 97 | } else { 98 | [self showHoverEffect:NO]; 99 | } 100 | } 101 | 102 | - (void)mouseEntered:(NSEvent *)event 103 | { 104 | [self showHoverEffect:YES]; 105 | } 106 | 107 | - (void)mouseExited:(NSEvent *)event 108 | { 109 | [self showHoverEffect:NO]; 110 | } 111 | 112 | - (void)showHoverEffect:(BOOL)show 113 | { 114 | [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { 115 | context.duration = 0.15; 116 | _hoverBox.animator.fillColor = show && self.enabled ? NSColor.controlTextColor : NSColor.clearColor; 117 | }]; 118 | } 119 | 120 | @end 121 | -------------------------------------------------------------------------------- /Itsycal/MoCalCell.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalCell.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 12/3/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoDate.h" 11 | 12 | @interface MoCalCell : NSView 13 | 14 | @property (nonatomic) NSTextField *textField; 15 | @property (nonatomic) MoDate date; 16 | @property (nonatomic) BOOL isToday; 17 | @property (nonatomic) BOOL isHighlighted; 18 | @property (nonatomic) BOOL isInCurrentMonth; 19 | @property (nonatomic) BOOL isHovered; 20 | @property (nonatomic) BOOL isSelected; 21 | 22 | // An array of up to 3 colors. 23 | // - Nil means do not draw a dot. 24 | // - An empty array means draw a single dot in the default theme color. 25 | // - Otherwise, draw up to 3 dots with the given colors. 26 | @property (nonatomic) NSArray *dotColors; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Itsycal/MoCalGrid.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalGrid.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 12/3/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoDate.h" 11 | 12 | @class MoCalCell; 13 | 14 | @interface MoCalGrid : NSView 15 | 16 | @property (nonatomic, readonly) NSArray *cells; 17 | @property (nonatomic, readonly) NSUInteger rows; 18 | 19 | - (instancetype)initWithRows:(NSUInteger)rows columns:(NSUInteger)cols horizontalMargin:(NSUInteger)hMargin verticalMargin:(NSUInteger)vMargin; 20 | 21 | // 22 | // Add a new row of cells to the bottom of the grid. 23 | // 24 | - (void)addRow; 25 | 26 | // 27 | // Remove a row of cells from the bottom of the grid. 28 | // 29 | - (void)removeRow; 30 | 31 | // 32 | // The cell at a given point 33 | // point the point in the receiver's coordinate system 34 | // return the cell at point or nil if no cell 35 | // 36 | - (MoCalCell *)cellAtPoint:(NSPoint)point; 37 | 38 | // 39 | // The cell with a given date 40 | // date the date to search for 41 | // return the first cell with date or nil if not found 42 | // 43 | - (MoCalCell *)cellWithDate:(MoDate)date; 44 | 45 | // 46 | // The rect that encompasses the cells 47 | // return the rect in the receiver's coordinate system 48 | // that encompasses the cells (ignoring the margins) 49 | // 50 | - (NSRect)cellsRect; 51 | 52 | // 53 | // Resize grid. 54 | // 55 | - (void)sizeChanged:(id)sender; 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /Itsycal/MoCalGrid.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalGrid.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 12/3/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "MoCalGrid.h" 10 | #import "MoCalCell.h" 11 | #import "Sizer.h" 12 | 13 | @implementation MoCalGrid 14 | { 15 | NSUInteger _rows, _cols, _hMargin, _vMargin; 16 | } 17 | 18 | - (instancetype)initWithRows:(NSUInteger)rows columns:(NSUInteger)cols horizontalMargin:(NSUInteger)hMargin verticalMargin:(NSUInteger)vMargin 19 | { 20 | self = [super initWithFrame:NSZeroRect]; 21 | if (self) { 22 | CGFloat sz = SizePref.cellSize; 23 | NSMutableArray *cells = [NSMutableArray new]; 24 | for (NSUInteger row = 0; row < rows; row++) { 25 | for (NSUInteger col = 0; col < cols; col++) { 26 | CGFloat x = sz * col + hMargin; 27 | CGFloat y = sz * rows - sz * (row + 1) + vMargin; 28 | MoCalCell *cell = [MoCalCell new]; 29 | [cell setFrame:NSMakeRect(x, y, sz, sz)]; 30 | [self addSubview:cell]; 31 | [cells addObject:cell]; 32 | } 33 | } 34 | _cells = [NSArray arrayWithArray:cells]; 35 | _rows = rows; 36 | _cols = cols; 37 | _hMargin = hMargin; 38 | _vMargin = vMargin; 39 | 40 | // Hug the cells tightly 41 | [self setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationVertical]; 42 | [self setContentHuggingPriority:NSLayoutPriorityDefaultHigh forOrientation:NSLayoutConstraintOrientationHorizontal]; 43 | 44 | REGISTER_FOR_SIZE_CHANGE; 45 | } 46 | return self; 47 | } 48 | 49 | - (void)addRow 50 | { 51 | NSMutableArray *cells = [_cells mutableCopy]; 52 | 53 | // Shift existing cells up. 54 | for (MoCalCell *cell in cells) { 55 | NSRect frame = cell.frame; 56 | frame.origin.y += SizePref.cellSize; 57 | cell.frame = frame; 58 | } 59 | 60 | // Add new row of cells. 61 | CGFloat sz = SizePref.cellSize; 62 | for (NSUInteger col = 0; col < _cols; col++) { 63 | CGFloat x = sz * col + _hMargin; 64 | CGFloat y = sz * (_rows + 1) - sz * (_rows + 1) + _vMargin; 65 | MoCalCell *cell = [MoCalCell new]; 66 | [cell setFrame:NSMakeRect(x, y, sz, sz)]; 67 | [self addSubview:cell]; 68 | [cells addObject:cell]; 69 | } 70 | 71 | _rows += 1; 72 | _cells = [NSArray arrayWithArray:cells]; 73 | [self invalidateIntrinsicContentSize]; 74 | } 75 | 76 | - (void)removeRow 77 | { 78 | NSMutableArray *cells = [_cells mutableCopy]; 79 | 80 | // Remove last row of cells. 81 | for (NSUInteger col = 0; col < _cols; col++) { 82 | MoCalCell *cell = [cells lastObject]; 83 | [cell removeFromSuperview]; 84 | [cells removeLastObject]; 85 | } 86 | 87 | // Shift remaining cells down. 88 | CGFloat sz = SizePref.cellSize; 89 | for (MoCalCell *cell in cells) { 90 | NSRect frame = cell.frame; 91 | frame.origin.y -= sz; 92 | cell.frame = frame; 93 | } 94 | 95 | _rows -= 1; 96 | _cells = [NSArray arrayWithArray:cells]; 97 | [self invalidateIntrinsicContentSize]; 98 | } 99 | 100 | - (MoCalCell *)cellAtPoint:(NSPoint)point 101 | { 102 | CGFloat sz = SizePref.cellSize; 103 | NSInteger col = floorf((point.x - _hMargin) / sz); 104 | NSInteger row = floorf((point.y - _vMargin) / sz); 105 | row = _rows - row - 1; // flip row coordinate 106 | if (col < 0 || row < 0 || col >= _cols || row >= _rows) { 107 | return nil; 108 | } 109 | return _cells[_cols * row + col]; 110 | } 111 | 112 | - (MoCalCell *)cellWithDate:(MoDate)date; 113 | { 114 | for (MoCalCell *cell in self.cells) { 115 | if (CompareDates(date, cell.date) == 0) { 116 | return cell; 117 | } 118 | } 119 | return nil; 120 | } 121 | 122 | - (NSRect)cellsRect 123 | { 124 | return NSInsetRect(self.bounds, _hMargin, _vMargin); 125 | } 126 | 127 | - (NSSize)intrinsicContentSize 128 | { 129 | CGFloat sz = SizePref.cellSize; 130 | CGFloat width = sz * _cols + 2 * _hMargin; 131 | CGFloat height = sz * _rows + 2 * _vMargin; 132 | return NSMakeSize(width, height); 133 | } 134 | 135 | - (void)sizeChanged:(id)sender 136 | { 137 | CGFloat sz = SizePref.cellSize; 138 | for (NSUInteger row = 0; row < _rows; row++) { 139 | for (NSUInteger col = 0; col < _cols; col++) { 140 | CGFloat x = sz * col + _hMargin; 141 | CGFloat y = sz * _rows - sz * (row + 1) + _vMargin; 142 | MoCalCell *cell = _cells[row*_cols + col]; 143 | [cell setFrame:NSMakeRect(x, y, sz, sz)]; 144 | } 145 | } 146 | [self invalidateIntrinsicContentSize]; 147 | } 148 | 149 | @end 150 | -------------------------------------------------------------------------------- /Itsycal/MoCalResizeHandle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 2/23/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | @interface MoCalResizeHandle : NSView 9 | 10 | - (void)dim:(BOOL)shouldDim; 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Itsycal/MoCalResizeHandle.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 2/23/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "MoCalResizeHandle.h" 7 | #import "MoVFLHelper.h" 8 | #import "Themer.h" 9 | 10 | @implementation MoCalResizeHandle 11 | { 12 | NSBox *_bkg; 13 | NSBox *_handle; 14 | } 15 | 16 | - (instancetype)initWithFrame:(NSRect)frameRect 17 | { 18 | NSBox* (^box)(NSColor *) = ^NSBox* (NSColor *color) { 19 | NSBox *bx = [NSBox new]; 20 | bx.boxType = NSBoxCustom; 21 | bx.borderWidth = 0; 22 | bx.cornerRadius = 3; 23 | bx.fillColor = color; 24 | [self addSubview:bx]; 25 | return bx; 26 | }; 27 | 28 | self = [super initWithFrame:frameRect]; 29 | if (self) { 30 | _bkg = box(Theme.resizeHandleBackgroundColor); 31 | _handle = box(Theme.resizeHandleForegroundColor); 32 | 33 | MoVFLHelper *vfl = [[MoVFLHelper alloc] initWithSuperview:self metrics:nil views:NSDictionaryOfVariableBindings(_bkg, _handle)]; 34 | [vfl :@"V:|[_bkg]|"]; 35 | [vfl :@"H:|-3-[_bkg]-3-|"]; 36 | 37 | [_handle.widthAnchor constraintEqualToConstant:24].active = YES; 38 | [_handle.heightAnchor constraintEqualToConstant:4].active = YES; 39 | [_handle.centerXAnchor constraintEqualToAnchor:self.centerXAnchor].active = YES; 40 | [_handle.centerYAnchor constraintEqualToAnchor:self.centerYAnchor].active = YES; 41 | } 42 | return self; 43 | } 44 | 45 | - (BOOL)acceptsFirstMouse:(NSEvent *)event 46 | { 47 | return YES; 48 | } 49 | 50 | - (void)dim:(BOOL)shouldDim 51 | { 52 | _bkg.animator.alphaValue = shouldDim ? 0 : 1; 53 | _handle.animator.alphaValue = shouldDim ? 0.1 : 1; 54 | } 55 | 56 | @end 57 | -------------------------------------------------------------------------------- /Itsycal/MoCalToolTipWC.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalToolTipWC.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/17/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoDate.h" 11 | #import "MoCalTooltipProvider.h" 12 | 13 | @interface MoCalToolTipWC : NSWindowController 14 | 15 | @property (nonatomic) NSViewController *vc; 16 | 17 | - (void)showTooltipForDate:(MoDate)date relativeToRect:(NSRect)rect screenFrame:(NSRect)screenFrame; 18 | - (void)hideTooltip; 19 | - (void)endTooltip; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Itsycal/MoCalToolTipWC.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalToolTipWC.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/17/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "MoCalToolTipWC.h" 10 | #import "Themer.h" 11 | #import "Sizer.h" 12 | 13 | // Implementation at bottom. 14 | @interface MoCalTooltipWindow : NSWindow @end 15 | @interface MoCalTooltipContentView : NSView @end 16 | 17 | #pragma mark - 18 | #pragma mark MoCalTooltipWC 19 | 20 | // ========================================================================= 21 | // MoCalTooltipWC 22 | // ========================================================================= 23 | 24 | @implementation MoCalToolTipWC 25 | { 26 | NSTimer *_fadeTimer; 27 | NSRect _positioningRect; 28 | NSRect _screenFrame; 29 | } 30 | 31 | - (instancetype)init 32 | { 33 | return [super initWithWindow:[MoCalTooltipWindow new]]; 34 | } 35 | 36 | - (void)showTooltipForDate:(MoDate)date relativeToRect:(NSRect)rect screenFrame:(NSRect)screenFrame 37 | { 38 | _positioningRect = rect; 39 | _screenFrame = screenFrame; 40 | BOOL dateHasEvent = NO; 41 | if (self.vc) { 42 | dateHasEvent = [self.vc toolTipForDate:date]; 43 | } 44 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showTooltip) object:nil]; 45 | if (!dateHasEvent) { 46 | [self hideTooltip]; 47 | return; 48 | } 49 | if (self.window.occlusionState & NSWindowOcclusionStateVisible) { 50 | // Switching from one tooltip to another 51 | [_fadeTimer invalidate]; 52 | _fadeTimer = nil; 53 | [self performSelector:@selector(showTooltip) withObject:nil afterDelay:0]; 54 | } 55 | else { 56 | // Showing a tooltip for the first time 57 | [self performSelector:@selector(showTooltip) withObject:nil afterDelay:1]; 58 | } 59 | } 60 | 61 | - (void)positionTooltip 62 | { 63 | NSRect frame = self.window.frame; 64 | frame.origin.x = roundf(NSMidX(_positioningRect) - NSWidth(frame)/2); 65 | frame.origin.y = _positioningRect.origin.y - NSHeight(frame) - 3; 66 | CGFloat screenMaxX = NSMaxX(_screenFrame); 67 | if (NSMaxX(frame) + 5 > screenMaxX) { 68 | frame.origin.x = screenMaxX - NSWidth(frame) - 5; 69 | } 70 | [self.window setFrame:frame display:YES animate:NO]; 71 | } 72 | 73 | - (void)showTooltip 74 | { 75 | [self positionTooltip]; 76 | [self showWindow:self]; 77 | [self.window setAlphaValue:1]; 78 | } 79 | 80 | - (void)endTooltip 81 | { 82 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showTooltip) object:nil]; 83 | [_fadeTimer invalidate]; 84 | _fadeTimer = nil; 85 | [self.window orderOut:nil]; 86 | } 87 | 88 | - (void)hideTooltip 89 | { 90 | [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(showTooltip) object:nil]; 91 | if (self.window.occlusionState & NSWindowOcclusionStateVisible && 92 | _fadeTimer == nil) { 93 | _fadeTimer = [NSTimer scheduledTimerWithTimeInterval:1/30. target:self selector:@selector(tick:) userInfo:nil repeats:YES]; 94 | } 95 | } 96 | 97 | - (void)tick:(NSTimer *)timer 98 | { 99 | CGFloat alpha = self.window.alphaValue - 0.07; 100 | if (alpha <= 0) { 101 | [self endTooltip]; 102 | } 103 | else { 104 | self.window.alphaValue = alpha; 105 | } 106 | } 107 | 108 | @end 109 | 110 | #pragma mark- 111 | #pragma mark Tooltip window and content view 112 | 113 | // ========================================================================= 114 | // MoCalTooltipWindow 115 | // ========================================================================= 116 | 117 | @implementation MoCalTooltipWindow 118 | { 119 | NSLayoutConstraint *_tooltipWidthConstraint; 120 | } 121 | 122 | - (instancetype)init 123 | { 124 | self = [super initWithContentRect:NSZeroRect styleMask:NSWindowStyleMaskBorderless backing:NSBackingStoreBuffered defer:NO]; 125 | if (self) { 126 | self.backgroundColor = [NSColor clearColor]; 127 | self.opaque = NO; 128 | self.level = NSPopUpMenuWindowLevel; 129 | self.movableByWindowBackground = NO; 130 | self.ignoresMouseEvents = YES; 131 | self.hasShadow = YES; 132 | 133 | // Draw tooltip background and fix tooltip width. 134 | self.contentView = [MoCalTooltipContentView new]; 135 | _tooltipWidthConstraint = [self.contentView.widthAnchor constraintEqualToConstant:SizePref.tooltipWidth]; 136 | _tooltipWidthConstraint.active = YES; 137 | 138 | REGISTER_FOR_SIZE_CHANGE; 139 | } 140 | return self; 141 | } 142 | 143 | - (void)sizeChanged:(id)sender 144 | { 145 | _tooltipWidthConstraint.constant = SizePref.tooltipWidth; 146 | } 147 | 148 | @end 149 | 150 | // ========================================================================= 151 | // MoCalTooltipContentView 152 | // ========================================================================= 153 | 154 | @implementation MoCalTooltipContentView 155 | 156 | - (void)drawRect:(NSRect)dirtyRect 157 | { 158 | // A rounded rect with a light gray border. 159 | NSRect r = NSInsetRect(self.bounds, 1, 1); 160 | NSBezierPath *p = [NSBezierPath bezierPathWithRoundedRect:r xRadius:5 yRadius:5]; 161 | [Theme.windowBorderColor setStroke]; 162 | [p setLineWidth:2]; 163 | [p stroke]; 164 | [Theme.tooltipBackgroundColor setFill]; 165 | [p fill]; 166 | } 167 | 168 | @end 169 | -------------------------------------------------------------------------------- /Itsycal/MoCalTooltipProvider.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalTooltipProvider.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/17/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoDate.h" 11 | 12 | @protocol MoCalTooltipProvider 13 | 14 | // Return YES for success (date has a tooltip). 15 | - (BOOL)toolTipForDate:(MoDate)date; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Itsycal/MoCalendar.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoCalendar.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 11/13/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoDate.h" 11 | #import "MoCalToolTipWC.h" 12 | 13 | // A bit mask for days-of-the-week. 14 | // Used to select columns to highlight. 15 | typedef enum : NSInteger { 16 | DOWMaskNone = 0, 17 | DOWMaskSun = 1 << 0, 18 | DOWMaskMon = 1 << 1, 19 | DOWMaskTue = 1 << 2, 20 | DOWMaskWed = 1 << 3, 21 | DOWMaskThu = 1 << 4, 22 | DOWMaskFri = 1 << 5, 23 | DOWMaskSat = 1 << 6, 24 | } DOWMask; 25 | 26 | @protocol MoCalendarDelegate; 27 | 28 | // ========================================================================= 29 | // MoCalendar 30 | // ========================================================================= 31 | 32 | @interface MoCalendar : NSView 33 | 34 | // The month this calendar displays. 35 | // Only the month and year fields are used. 36 | @property (nonatomic) MoDate monthDate; 37 | 38 | // The selected date. Might be in monthDate or in 39 | // the portion of the previous or next month that 40 | // is shown in the calendar. 41 | @property (nonatomic) MoDate selectedDate; 42 | 43 | // The first and last dates displayed by the calendar. 44 | @property (nonatomic) MoDate firstDate; 45 | @property (nonatomic) MoDate lastDate; 46 | 47 | // Today's date. 48 | @property (nonatomic) MoDate todayDate; 49 | 50 | // The day of the week on which the week starts. 51 | // 0...6; 0=Sunday, 1=Monday,... 6=Saturday 52 | @property (nonatomic) NSInteger weekStartDOW; 53 | 54 | // Is the week of the year column showing? 55 | @property (nonatomic) BOOL showWeeks; 56 | 57 | // Should calendar show dots under days with events? 58 | @property (nonatomic) BOOL showEventDots; 59 | 60 | // Should event dots use calendar colors? 61 | @property (nonatomic) BOOL useColoredDots; 62 | 63 | // DOW colums to highlight 64 | @property (nonatomic) DOWMask highlightedDOWs; 65 | 66 | // Should calendar draw an outline around the current month? 67 | @property (nonatomic) BOOL doNotDrawOutlineAroundCurrentMonth; 68 | 69 | // An optional view controller for tooltips. 70 | @property (nonatomic) NSViewController *tooltipVC; 71 | 72 | @property (nonatomic, weak) id delegate; 73 | 74 | // Double-click handling 75 | @property (nonatomic, weak) id target; 76 | @property (nonatomic) SEL doubleAction; 77 | 78 | - (IBAction)showPreviousMonth:(id)sender; 79 | - (IBAction)showNextMonth:(id)sender; 80 | - (IBAction)showPreviousYear:(id)sender; 81 | - (IBAction)showNextYear:(id)sender; 82 | - (IBAction)showTodayMonth:(id)sender; 83 | - (void)reloadData; 84 | - (void)highlightCellsFromDate:(MoDate)startDate toDate:(MoDate)endDate withColor:(NSColor *)color; 85 | - (void)unhighlightCells; 86 | 87 | @end 88 | 89 | // ========================================================================= 90 | // MoCalendarDelegate 91 | // ========================================================================= 92 | 93 | @protocol MoCalendarDelegate 94 | 95 | - (void)calendarUpdated:(MoCalendar *)cal; 96 | - (void)calendarSelectionChanged:(MoCalendar *)cal; 97 | 98 | // Return an array of up to 3 colors. 99 | // - Nil means there is no dot. 100 | // - An empty array means there is a single dot in the default theme color. 101 | // - Otherwise, there are up to 3 dots with the given colors. 102 | - (NSArray *)dotColorsForDate:(MoDate)date useColor:(BOOL)useColor; 103 | 104 | @end 105 | 106 | -------------------------------------------------------------------------------- /Itsycal/MoDate.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoDate.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 11/13/14. 6 | // Copyright (c) 2014 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | // 12 | // A monthly calendar has seven columns, one for each day. 13 | // Given the day on which a week starts, in which column 14 | // is a particular day? Day codes: 0=Sunday,...6=Saturday 15 | // 16 | // Example: 17 | // If weeks start on Monday, what column is Saturday? 18 | // DOW_COL(1, 6) = (7 - 1 + 6)%7 = 12%7 = 5 19 | // 20 | // 0 1 2 3 4 5 6 <=Column 21 | // Mo Tu We Th Fr Sa Su <=DayOfWeek 22 | // ^^ 23 | #define DOW_COL(startDOW, DOW) ((7 - startDOW + DOW) % 7) 24 | // Reverse of DOW_COL. Get the DOW in a given COL. 25 | #define COL_DOW(startDOW, COL) ((startDOW + COL) % 7) 26 | #define IS_LEAP_YEAR(y) ((y % 4) == 0 && ((y % 100) != 0 || (y % 400) == 0)) 27 | #define NO_JULIAN (-1) // When Julian Day is undefined 28 | #define MIN_MODATE_YEAR (1583) 29 | #define MAX_MODATE_YEAR (3333) 30 | 31 | /** 32 | * A Gregorian date. 33 | * We use a struct rather than a class because it has 34 | * copy (value vs reference) semantics and is easier to 35 | * reason about in use. 36 | */ 37 | typedef struct { 38 | NSInteger year; // MIN_MODATE_YEAR...MAX_MODATE_YEAR 39 | NSInteger month; // 0...11 40 | NSInteger day; // 1...31 41 | NSInteger julian; // Julian Day 42 | } MoDate; 43 | 44 | /** 45 | * Make an NSString representing a date. 46 | * @param date The date. 47 | * @return An NSString: "yyy-mm-dd (julian)". 48 | */ 49 | NSString *NSStringFromMoDate(MoDate date); 50 | 51 | /** 52 | * Make a MoDate given year, month, and day. 53 | * @param year Year component of date. 54 | * @param month Month component of date. 55 | * @param day Day component of date. 56 | * @return The date including the Julian Day. 57 | */ 58 | MoDate MakeDate(NSInteger year, NSInteger month, NSInteger day); 59 | 60 | /** 61 | * Make a MoDate corresponding to the given NSDate and calendar. 62 | * @param nsDate The NSDate to be converted. 63 | * @param calendar The calendar used to interpret nsDate. 64 | * @return A MoDate including the Julian Day. 65 | */ 66 | MoDate MakeDateWithNSDate(NSDate *nsDate, NSCalendar *calendar); 67 | 68 | /** 69 | * Make an NSDate corresponding to the given MoDate and calendar. 70 | * @param moDate The MoDate to be converted. 71 | * @param calendar The calendar with which to create the resulting NSDate. 72 | * @return An NSDate. 73 | */ 74 | NSDate *MakeNSDateWithDate(MoDate moDate, NSCalendar *calendar); 75 | 76 | /** 77 | * The number of days in a month. 78 | * @param year The year. 79 | * @param month The month. 80 | * @return The number of days in the given month. 81 | */ 82 | NSInteger DaysInMonth(NSInteger year, NSInteger month); 83 | 84 | /** 85 | * Is a date valid? 86 | * @param date The date. 87 | * @return YES if date is valid, else NO. 88 | */ 89 | BOOL IsValidDate(MoDate date); 90 | 91 | /** 92 | * Compare two dates to see which is earlier. 93 | * @param date1 The first date. 94 | * @param date2 The second date. 95 | * @return The difference in days between date1 and date2. 96 | * The difference is 97 | * < 0 if date1 is earlier; 98 | * > 0 if date1 is later; 99 | * 0 if the dates are the same. 100 | */ 101 | NSInteger CompareDates(MoDate date1, MoDate date2); 102 | 103 | /** 104 | * Get the number of ISO 8601 weeks in a year. 105 | * @param year The year. 106 | * @return The number of ISO 8601 weeks in year. 107 | */ 108 | NSInteger WeeksInYear(NSInteger year); 109 | 110 | /** 111 | * Get the ISO 8601 week number for a date. 112 | * @param year The year of the Gregorian date [1583+]. 113 | * @param month The month of the Gregorian date [0..11]. 114 | * @param day The day of the Gregorian date [1..31]. 115 | * @return The ISO 8601 week number for year-month-day. 116 | */ 117 | NSInteger WeekOfYear(NSInteger year, NSInteger month, NSInteger day); 118 | 119 | /** 120 | * Make a Julian Day from a Gregorian date. 121 | * @param year The year of the Gregorian date [1583+]. 122 | * @param month The month of the Gregorian date [0..11]. 123 | * @param day The day of the Gregorian date [1..31]. 124 | * @return The Julian Day for year-month-day. 125 | */ 126 | NSInteger MakeJulian(NSInteger year, NSInteger month, NSInteger day); 127 | 128 | /** 129 | * Make a Gregorian date from a Julian Day. 130 | * @param julian A Julian Day. 131 | * @return The Gregorian date corresponding to julian. 132 | */ 133 | MoDate MakeGregorian(NSInteger julian); 134 | 135 | /** 136 | * Add days to a Gregorian date to make a new date. 137 | * @param days The number of days to add. 138 | * @param date The date to which to add days. 139 | * @return The date resulting from adding days to the 140 | * Gregorian date. 141 | */ 142 | MoDate AddDaysToDate(NSInteger days, MoDate date); 143 | 144 | /** 145 | * Add months to a month to make a new date. 146 | * @param months The number of months to add. 147 | * @param date The original year and month (day ignored). 148 | * @return The month resulting from adding months to the 149 | * input month. The day field of the resulting 150 | * MoDate struct is 1. 151 | */ 152 | MoDate AddMonthsToMonth(NSInteger months, MoDate date); 153 | -------------------------------------------------------------------------------- /Itsycal/MoLoginItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 12/9/16. 3 | // Copyright © 2016 Mowglii. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | BOOL MOIsLoginItemEnabled(void); 9 | void MOEnableLoginItem(BOOL enable); 10 | -------------------------------------------------------------------------------- /Itsycal/MoLoginItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 12/9/16. 3 | // Copyright © 2016 Mowglii. All rights reserved. 4 | // 5 | 6 | #import "MoLoginItem.h" 7 | 8 | // LSSharedFileList API was deprecated in macOS 10.11 9 | #pragma clang diagnostic push 10 | #pragma clang diagnostic ignored "-Wdeprecated-declarations" 11 | 12 | BOOL MOIsLoginItemEnabled(void) 13 | { 14 | BOOL isEnabled = NO; 15 | NSString *appPath = [[NSBundle mainBundle] bundlePath]; 16 | LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); 17 | 18 | if (loginItemsRef) { 19 | UInt32 seedValue; 20 | NSArray *loginItems = CFBridgingRelease(LSSharedFileListCopySnapshot(loginItemsRef, &seedValue)); 21 | for (id item in loginItems) { 22 | LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; 23 | NSURL *pathURL = CFBridgingRelease(LSSharedFileListItemCopyResolvedURL(itemRef, 0, NULL)); 24 | if (pathURL && [pathURL.path hasPrefix:appPath]) { 25 | isEnabled = YES; 26 | break; 27 | } 28 | } 29 | CFRelease(loginItemsRef); 30 | } 31 | return isEnabled; 32 | } 33 | 34 | void MOEnableLoginItem(BOOL enable) 35 | { 36 | NSString *appPath = [[NSBundle mainBundle] bundlePath]; 37 | LSSharedFileListRef loginItemsRef = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); 38 | 39 | if (loginItemsRef) { 40 | if (enable) { 41 | // We call LSSharedFileListInsertItemURL to insert the item at the bottom of Login Items list. 42 | CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:appPath]; 43 | LSSharedFileListItemRef item = LSSharedFileListInsertItemURL(loginItemsRef, kLSSharedFileListItemLast, NULL, NULL, url, NULL, NULL); 44 | if (item != NULL) CFRelease(item); 45 | } 46 | else { 47 | // Grab the contents of the shared file list (LSSharedFileListItemRef objects) 48 | // and pop it in an array so we can iterate through it to find our item. 49 | UInt32 seedValue; 50 | NSArray *loginItems = CFBridgingRelease(LSSharedFileListCopySnapshot(loginItemsRef, &seedValue)); 51 | for (id item in loginItems) { 52 | LSSharedFileListItemRef itemRef = (__bridge LSSharedFileListItemRef)item; 53 | NSURL *pathURL = CFBridgingRelease(LSSharedFileListItemCopyResolvedURL(itemRef, 0, NULL)); 54 | if (pathURL && [pathURL.path hasPrefix:appPath]) { 55 | LSSharedFileListItemRemove(loginItemsRef, itemRef); // Deleting the item 56 | } 57 | } 58 | } 59 | CFRelease(loginItemsRef); 60 | } 61 | } 62 | 63 | #pragma clang diagnostic pop 64 | -------------------------------------------------------------------------------- /Itsycal/MoTableView.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoTableView.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/21/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @class MoTableView; 12 | 13 | @protocol MoTableViewDelegate 14 | 15 | - (void)tableView:(nonnull MoTableView *)tableView didHoverOverRow:(NSInteger)row; 16 | 17 | @end 18 | 19 | @interface MoTableView : NSTableView 20 | 21 | @property (nonatomic) BOOL enableHover; 22 | @property (nonatomic, readonly) NSInteger hoverRow; 23 | @property (nullable, weak) id delegate; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Itsycal/MoTableView.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoTableView.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/21/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "MoTableView.h" 10 | 11 | @implementation MoTableView 12 | { 13 | NSTrackingArea *_trackingArea; 14 | } 15 | 16 | @dynamic delegate; 17 | 18 | - (id)initWithFrame:(NSRect)frame 19 | { 20 | self = [super initWithFrame:frame]; 21 | if (self) { 22 | [self commonInitForMoTableView]; 23 | } 24 | return self; 25 | } 26 | 27 | - (id)initWithCoder:(NSCoder *)aDecoder 28 | { 29 | self = [super initWithCoder:aDecoder]; 30 | if (self) { 31 | [self commonInitForMoTableView]; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)commonInitForMoTableView 37 | { 38 | _enableHover = YES; 39 | _hoverRow = -1; 40 | 41 | // Notify when enclosing scrollView scrolls. 42 | [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewScrolled:) name:NSViewBoundsDidChangeNotification object:[[self enclosingScrollView] contentView]]; 43 | } 44 | 45 | - (void)dealloc 46 | { 47 | [[NSNotificationCenter defaultCenter] removeObserver:self]; 48 | [self removeTrackingArea:_trackingArea]; 49 | } 50 | 51 | #pragma mark - 52 | #pragma mark Instance methods 53 | 54 | - (void)reloadData 55 | { 56 | [super reloadData]; 57 | [self setHoverRow:-1]; 58 | [self evaluateForHighlight]; 59 | } 60 | 61 | - (void)setEnableHover:(BOOL)enableHover 62 | { 63 | if (enableHover != _enableHover) { 64 | if (enableHover == NO) { 65 | [self setHoverRow:-1]; 66 | } 67 | _enableHover = enableHover; 68 | [self evaluateForHighlight]; 69 | } 70 | } 71 | 72 | // Prevent context menu highlight from drawing. 73 | // stackoverflow.com/a/30594427/111418 74 | - (void)drawContextMenuHighlightForRow:(NSInteger)row {} 75 | 76 | #pragma mark - 77 | #pragma mark NSTrackingArea 78 | 79 | - (void)mouseEntered:(NSEvent *)theEvent 80 | { 81 | NSPoint mousePointInWindow = [theEvent locationInWindow]; 82 | NSPoint mousePoint = [self convertPoint:mousePointInWindow fromView:nil]; 83 | [self evaluateForHighligthAtMousePoint:mousePoint]; 84 | } 85 | 86 | - (void)mouseMoved:(NSEvent *)theEvent 87 | { 88 | NSPoint mousePointInWindow = [theEvent locationInWindow]; 89 | NSPoint mousePoint = [self convertPoint:mousePointInWindow fromView:nil]; 90 | [self evaluateForHighligthAtMousePoint:mousePoint]; 91 | } 92 | 93 | - (void)mouseExited:(NSEvent *)theEvent 94 | { 95 | [self setHoverRow:-1]; 96 | } 97 | 98 | - (void)updateTrackingAreas 99 | { 100 | [self removeTrackingArea:_trackingArea]; 101 | [self createTrackingArea]; 102 | [super updateTrackingAreas]; 103 | } 104 | 105 | - (void)createTrackingArea 106 | { 107 | NSRect clipRect = self.enclosingScrollView.contentView.bounds; 108 | _trackingArea = [[NSTrackingArea alloc] initWithRect:clipRect options:(NSTrackingMouseMoved | NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways) owner:self userInfo:nil]; 109 | [self addTrackingArea:_trackingArea]; 110 | } 111 | 112 | #pragma mark - 113 | #pragma mark Notification handlers 114 | 115 | - (void)scrollViewScrolled:(NSNotification *)notification 116 | { 117 | // Normally when the user scrolls, -updateTrackingAreas 118 | // is called and we could just do the evaluation there. 119 | // However, when the user is scrolling with inertia, 120 | // -updateTrackingAreas is not called so we need to 121 | // explicity be notified that the tableView has 122 | // scrolled and evaluate for highlight. 123 | 124 | [self evaluateForHighlight]; 125 | } 126 | 127 | #pragma mark - 128 | #pragma mark Highlight/Unhighlight 129 | 130 | - (void)setHoverRow:(NSInteger)hoverRow 131 | { 132 | if (self.enableHover == NO) return; 133 | 134 | if (hoverRow != _hoverRow) { 135 | _hoverRow = hoverRow; 136 | if ([self.delegate respondsToSelector:@selector(tableView:didHoverOverRow:)]) { 137 | [self.delegate tableView:self didHoverOverRow:_hoverRow]; 138 | } 139 | [self setNeedsDisplay:YES]; 140 | } 141 | } 142 | 143 | - (void)evaluateForHighlight 144 | { 145 | if (self.enableHover == NO) return; 146 | 147 | NSPoint mousePointInWindow = [[self window] mouseLocationOutsideOfEventStream]; 148 | NSPoint mousePoint = [self convertPoint:mousePointInWindow fromView: nil]; 149 | [self evaluateForHighligthAtMousePoint:mousePoint]; 150 | } 151 | 152 | - (void)evaluateForHighligthAtMousePoint:(NSPoint)mousePoint 153 | { 154 | if (self.enableHover == NO || 155 | !(self.window.occlusionState & NSWindowOcclusionStateVisible)) return; 156 | 157 | NSInteger hoverRow = [self rowAtPoint:mousePoint]; 158 | if (self.hoverRow != hoverRow) { 159 | // We scrolled (rubberbanded) off the end of the tableView. 160 | if (hoverRow < 0 || hoverRow >= [self numberOfRows]) { 161 | hoverRow = -1; 162 | } 163 | [self setHoverRow:hoverRow]; 164 | } 165 | } 166 | 167 | @end 168 | -------------------------------------------------------------------------------- /Itsycal/MoTextField.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoTextField.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/6/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface MoTextField : NSTextField 12 | 13 | @property (nonatomic, copy) NSString *urlString; 14 | @property (nonatomic) BOOL linkEnabled; 15 | @property (nonatomic) NSColor *linkColor; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Itsycal/MoTextField.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoTextField.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 2/6/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "MoTextField.h" 10 | 11 | @implementation MoTextField 12 | { 13 | NSColor *_originalColor; 14 | } 15 | 16 | - (id)initWithFrame:(NSRect)frameRect 17 | { 18 | self = [super initWithFrame:frameRect]; 19 | if (self) { 20 | _linkColor = [NSColor colorWithRed:0.2 green:0.5 blue:0.9 alpha:1]; 21 | _originalColor = self.textColor; 22 | } 23 | return self; 24 | } 25 | 26 | - (id)initWithCoder:(NSCoder *)aDecoder 27 | { 28 | self = [super initWithCoder:aDecoder]; 29 | if (self) { 30 | _linkColor = [NSColor colorWithRed:0.2 green:0.5 blue:0.9 alpha:1]; 31 | _originalColor = self.textColor; 32 | } 33 | return self; 34 | } 35 | 36 | - (void)setLinkEnabled:(BOOL)linkEnabled 37 | { 38 | _linkEnabled = linkEnabled; 39 | if (_linkEnabled) { 40 | _originalColor = self.textColor; 41 | [super setTextColor:self.linkColor]; 42 | } 43 | else { 44 | [super setTextColor:_originalColor]; 45 | } 46 | } 47 | 48 | - (void)setTextColor:(NSColor *)textColor 49 | { 50 | if (self.linkEnabled) { 51 | _originalColor = textColor; 52 | } 53 | else { 54 | [super setTextColor:textColor]; 55 | } 56 | } 57 | 58 | - (void)setLinkColor:(NSColor *)linkColor 59 | { 60 | _linkColor = linkColor; 61 | if (self.linkEnabled) { 62 | [super setTextColor:linkColor]; 63 | } 64 | } 65 | 66 | - (void)resetCursorRects 67 | { 68 | if (self.linkEnabled) { 69 | [self addCursorRect:self.bounds cursor:[NSCursor pointingHandCursor]]; 70 | } 71 | else { 72 | [super resetCursorRects]; 73 | } 74 | } 75 | 76 | - (void)mouseUp:(NSEvent *)theEvent 77 | { 78 | if (self.linkEnabled) { 79 | NSPoint pointInWindow = [theEvent locationInWindow]; 80 | NSPoint pointInView = [self convertPoint:pointInWindow fromView:nil]; 81 | if (NSPointInRect(pointInView, self.bounds)) { 82 | NSString *urlString = (self.urlString) ? self.urlString : self.stringValue; 83 | NSURL *url; 84 | if ([urlString hasPrefix:@"http://"] || [urlString hasPrefix:@"https://"]) { 85 | url = [NSURL URLWithString:urlString]; 86 | } 87 | else { 88 | url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", urlString]]; 89 | } 90 | [[NSWorkspace sharedWorkspace] openURL:url]; 91 | } 92 | } 93 | else { 94 | if (self.target && self.action) { 95 | [self sendAction:self.action to:self.target]; 96 | } 97 | [super mouseUp:theEvent]; 98 | } 99 | } 100 | 101 | @end 102 | -------------------------------------------------------------------------------- /Itsycal/MoUtils.h: -------------------------------------------------------------------------------- 1 | // 2 | // MoUtils.h 3 | // 4 | // 5 | // Created by Sanjay Madan on 10/31/16. 6 | // Copyright © 2016 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | BOOL OSVersionIsAtLeast(NSInteger majorVersion, NSInteger minorVersion, NSInteger patchVersion); 12 | 13 | /** 14 | * A clock that increments monotonically, tracking the time since an arbitrary 15 | * point, and will continue to increment while the system is asleep. 16 | * Use this instead of CACurrentMediaTime() to measure durations that might be 17 | * interrupted by the system going to sleep. CACurrentMediaTime() is also a 18 | * monotonic timer, but it stops counting when the CPU sleeps. 19 | */ 20 | NSTimeInterval MonotonicClockTime(void); 21 | -------------------------------------------------------------------------------- /Itsycal/MoUtils.m: -------------------------------------------------------------------------------- 1 | // 2 | // MoUtils.m 3 | // 4 | // 5 | // Created by Sanjay Madan on 10/31/16. 6 | // Copyright © 2016 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoUtils.h" 11 | 12 | BOOL OSVersionIsAtLeast(NSInteger majorVersion, NSInteger minorVersion, NSInteger patchVersion) 13 | { 14 | NSOperatingSystemVersion v = {majorVersion, minorVersion, patchVersion}; 15 | return [NSProcessInfo.processInfo isOperatingSystemAtLeastVersion:v]; 16 | } 17 | 18 | NSTimeInterval MonotonicClockTime(void) 19 | { 20 | struct timespec t; 21 | clock_gettime(CLOCK_MONOTONIC, &t); 22 | return t.tv_sec + t.tv_nsec * 1.e-9; 23 | } 24 | -------------------------------------------------------------------------------- /Itsycal/MoVFLHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/26/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | // Make using Visual Format Language (VFL) nicer. 7 | 8 | #import 9 | 10 | @interface MoVFLHelper : NSObject 11 | 12 | - (instancetype)initWithSuperview:(NSView *)superview 13 | metrics:(NSDictionary *)metrics 14 | views:(NSDictionary *)views; 15 | 16 | // Create constraints with VFL format. 17 | - (void):(NSString *)format; 18 | 19 | // Create constraints with VFL format and options. 20 | - (void):(NSString *)format :(NSLayoutFormatOptions)options; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Itsycal/MoVFLHelper.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/26/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "MoVFLHelper.h" 7 | 8 | @implementation MoVFLHelper 9 | { 10 | NSView *_superview; 11 | NSDictionary *_metrics; 12 | NSDictionary *_views; 13 | } 14 | 15 | - (instancetype)initWithSuperview:(NSView *)superview metrics:(NSDictionary *)metrics views:(NSDictionary *)views 16 | { 17 | self = [super init]; 18 | if (self) { 19 | _superview = superview; 20 | _metrics = metrics; 21 | _views = views; 22 | for (NSView *view in views.allValues) { 23 | view.translatesAutoresizingMaskIntoConstraints = NO; 24 | } 25 | } 26 | return self; 27 | } 28 | 29 | - (void):(NSString *)format 30 | { 31 | [self :format :0]; 32 | } 33 | 34 | - (void):(NSString *)format :(NSLayoutFormatOptions)options 35 | { 36 | [_superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:format options:options metrics:_metrics views:_views]]; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /Itsycal/PrefsAboutVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/11/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | @interface PrefsAboutVC : NSViewController 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /Itsycal/PrefsAboutVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/11/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "PrefsAboutVC.h" 7 | #import "Itsycal.h" 8 | #import "MoTextField.h" 9 | #import "MoVFLHelper.h" 10 | 11 | @implementation PrefsAboutVC 12 | 13 | #pragma mark - 14 | #pragma mark View lifecycle 15 | 16 | - (void)loadView 17 | { 18 | NSView *v = [NSView new]; 19 | 20 | // Convenience function for making labels. 21 | MoTextField* (^label)(NSString*, BOOL) = ^MoTextField* (NSString *stringValue, BOOL isLink) { 22 | MoTextField *txt = [MoTextField labelWithString:stringValue]; 23 | if (isLink) { 24 | txt.font = [NSFont systemFontOfSize:13 weight:NSFontWeightMedium]; 25 | txt.linkEnabled = YES; 26 | } 27 | [v addSubview:txt]; 28 | return txt; 29 | }; 30 | 31 | NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; 32 | NSTextField *appName = label(@"Itsycal", NO); 33 | appName.font = [NSFont systemFontOfSize:16 weight:NSFontWeightBold]; 34 | 35 | NSTextField *version = label([NSString stringWithFormat:@"%@ (%@)", infoDict[@"CFBundleShortVersionString"], infoDict[@"CFBundleVersion"]], NO); 36 | version.font = [NSFont systemFontOfSize:11 weight:NSFontWeightMedium]; 37 | version.textColor = [NSColor secondaryLabelColor]; 38 | 39 | MoTextField *help = label(NSLocalizedString(@"Help", nil), YES); 40 | help.urlString = @"https://www.mowglii.com/itsycal/help.html"; 41 | 42 | MoTextField *follow = label(NSLocalizedString(@"Follow", nil), YES); 43 | follow.urlString = @"https://twitter.com/intent/follow?screen_name=mowgliiapps"; 44 | 45 | MoTextField *donate = label(NSLocalizedString(@"Donate", nil), YES); 46 | donate.urlString = @"https://mowglii.com/donate/"; 47 | 48 | NSTextField *smile = label(@"(๑˃̵ᴗ˂̵)و", NO); 49 | smile.font = [NSFont systemFontOfSize:16 weight:NSFontWeightLight]; 50 | 51 | NSTextField *emojiHelp = label(@"🛟", NO); 52 | NSTextField *emojiTwitter = label(@"🙅‍♂️", NO); 53 | NSTextField *emojiDonate = label(@"♥️", NO); 54 | 55 | NSTextField *copyright1 = label(@"© 2012—2024", NO); 56 | MoTextField *copyright2 = label(@"mowglii.com", YES); 57 | 58 | MoVFLHelper *vfl = [[MoVFLHelper alloc] initWithSuperview:v metrics:@{@"m": @25} views:NSDictionaryOfVariableBindings(appName, version, help, emojiHelp, follow, emojiTwitter, donate, emojiDonate, smile, copyright1, copyright2)]; 59 | [vfl :@"V:|-m-[appName]-m-[help]-10-[follow]-10-[donate]-m-[smile]-m-[copyright1]-m-|"]; 60 | [vfl :@"H:|-m-[appName]-4-[version]-(>=m)-|" :NSLayoutFormatAlignAllBaseline]; 61 | [vfl :@"H:|-m-[emojiHelp]-6-[help]-(>=m)-|" :NSLayoutFormatAlignAllBaseline]; 62 | [vfl :@"H:|-m-[emojiTwitter]-6-[follow]-(>=m)-|" :NSLayoutFormatAlignAllBaseline]; 63 | [vfl :@"H:|-m-[emojiDonate]-6-[donate]-(>=m)-|" :NSLayoutFormatAlignAllBaseline]; 64 | [vfl :@"H:|-m-[copyright1]-4-[copyright2]-(>=m)-|" :NSLayoutFormatAlignAllBaseline]; 65 | 66 | [smile.centerXAnchor constraintEqualToAnchor:v.centerXAnchor].active = YES; 67 | 68 | self.view = v; 69 | } 70 | 71 | @end 72 | -------------------------------------------------------------------------------- /Itsycal/PrefsAppearanceVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/11/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | @interface PrefsAppearanceVC : NSViewController 9 | 10 | @end 11 | -------------------------------------------------------------------------------- /Itsycal/PrefsGeneralVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/11/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | @class EventCenter; 9 | 10 | @interface PrefsGeneralVC : NSViewController 11 | 12 | @property (nonatomic, weak) EventCenter *ec; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Itsycal/PrefsVC.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/29/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | @interface PrefsVC : NSViewController 9 | 10 | // Show About panel. 11 | - (void)showAbout; 12 | 13 | // Show General panel if About panel is showing. 14 | - (void)showPrefs; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Itsycal/PrefsVC.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 1/29/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "PrefsVC.h" 7 | 8 | @implementation PrefsVC 9 | { 10 | NSToolbar *_toolbar; 11 | NSMutableArray *_toolbarIdentifiers; 12 | NSInteger _selectedItemTag; 13 | } 14 | 15 | - (instancetype)init 16 | { 17 | self = [super init]; 18 | if (self) { 19 | _toolbar = [[NSToolbar alloc] initWithIdentifier:@"Toolbar"]; 20 | _toolbar.allowsUserCustomization = NO; 21 | _toolbar.delegate = self; 22 | _toolbarIdentifiers = [NSMutableArray new]; 23 | _selectedItemTag = 0; 24 | } 25 | return self; 26 | } 27 | 28 | - (void)loadView 29 | { 30 | self.view = [NSView new]; 31 | } 32 | 33 | - (void)viewDidAppear 34 | { 35 | [super viewDidAppear]; 36 | if (self.view.window.toolbar == nil) { 37 | self.view.window.toolbar = _toolbar; 38 | #if MAC_OS_X_VERSION_MAX_ALLOWED >= 110000 39 | if (@available(macOS 11.0, *)) { 40 | self.view.window.toolbarStyle = NSWindowToolbarStylePreference; 41 | } 42 | #endif 43 | } 44 | } 45 | 46 | - (void)showAbout 47 | { 48 | NSString *identifier = NSLocalizedString(@"About", @"About prefs tab label"); 49 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:identifier]; 50 | item.tag = 2; // 2 == index of About panel 51 | _toolbar.selectedItemIdentifier = identifier; 52 | [self switchToTabForToolbarItem:item animated:NO]; 53 | } 54 | 55 | - (void)showPrefs 56 | { 57 | if (_selectedItemTag == 2) { // 2 == index of About panel 58 | NSString *identifier = NSLocalizedString(@"General", @"General prefs tab label"); 59 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:identifier]; 60 | item.tag = 0; // 0 == index of General panel. 61 | _toolbar.selectedItemIdentifier = identifier; 62 | [self switchToTabForToolbarItem:item animated:NO]; 63 | } 64 | } 65 | 66 | - (void)setChildViewControllers:(NSArray<__kindof NSViewController *> *)childViewControllers 67 | { 68 | [super setChildViewControllers:childViewControllers]; 69 | for (NSViewController *childViewController in childViewControllers) { 70 | [_toolbarIdentifiers addObject:childViewController.title]; 71 | } 72 | [self.view setFrame:(NSRect){0, 0, childViewControllers[0].view.fittingSize}]; 73 | [childViewControllers[0].view setFrame:self.view.bounds]; 74 | [self.view addSubview:childViewControllers[0].view]; 75 | [_toolbar setSelectedItemIdentifier:_toolbarIdentifiers[0]]; 76 | } 77 | 78 | - (void)toolbarItemClicked:(NSToolbarItem *)item 79 | { 80 | [self switchToTabForToolbarItem:item animated:YES]; 81 | } 82 | 83 | - (void)switchToTabForToolbarItem:(NSToolbarItem *)item animated:(BOOL)animated 84 | { 85 | if (_selectedItemTag == item.tag) return; 86 | 87 | _selectedItemTag = item.tag; 88 | 89 | NSViewController *toVC = [self viewControllerForItemIdentifier:item.itemIdentifier]; 90 | if (toVC) { 91 | 92 | if (self.view.subviews[0] == toVC.view) return; 93 | 94 | NSWindow *window = self.view.window; 95 | NSRect contentRect = (NSRect){0, 0, toVC.view.fittingSize}; 96 | NSRect contentFrame = [window frameRectForContentRect:contentRect]; 97 | CGFloat windowHeightDelta = window.frame.size.height - contentFrame.size.height; 98 | NSPoint newOrigin = NSMakePoint(window.frame.origin.x, window.frame.origin.y + windowHeightDelta); 99 | NSRect newFrame = (NSRect){newOrigin, contentFrame.size}; 100 | 101 | [toVC.view setAlphaValue: 0]; 102 | [toVC.view setFrame:contentRect]; 103 | [self.view addSubview:toVC.view]; 104 | 105 | [NSAnimationContext runAnimationGroup:^(NSAnimationContext * _Nonnull context) { 106 | [context setDuration:animated ? 0.2 : 0]; 107 | [window.animator setFrame:newFrame display:NO]; 108 | [toVC.view.animator setAlphaValue:1]; 109 | [self.view.subviews[0].animator setAlphaValue:0]; 110 | } completionHandler:^{ 111 | [self.view.subviews[0] removeFromSuperview]; 112 | }]; 113 | } 114 | } 115 | 116 | - (NSViewController *)viewControllerForItemIdentifier:(NSString *)itemIdentifier 117 | { 118 | for (NSViewController *vc in self.childViewControllers) { 119 | if ([vc.title isEqualToString:itemIdentifier]) return vc; 120 | } 121 | return nil; 122 | } 123 | 124 | #pragma mark - 125 | #pragma mark NSToolbarDelegate 126 | 127 | - (nullable NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag 128 | { 129 | NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier]; 130 | item.label = itemIdentifier; 131 | item.image = [NSImage imageNamed:NSStringFromClass([[self viewControllerForItemIdentifier:itemIdentifier] class])]; 132 | item.target = self; 133 | item.action = @selector(toolbarItemClicked:); 134 | item.tag = [_toolbarIdentifiers indexOfObject:itemIdentifier]; 135 | return item; 136 | } 137 | 138 | - (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar *)toolbar 139 | { 140 | return _toolbarIdentifiers; 141 | } 142 | 143 | - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar 144 | { 145 | return _toolbarIdentifiers; 146 | } 147 | 148 | - (NSArray *)toolbarSelectableItemIdentifiers:(NSToolbar *)toolbar 149 | { 150 | return _toolbarIdentifiers; 151 | } 152 | 153 | @end 154 | -------------------------------------------------------------------------------- /Itsycal/Sizer.h: -------------------------------------------------------------------------------- 1 | // Created by Sanjay Madan on 7/27/18 2 | // Copyright (c) 2018 mowglii.com 3 | 4 | #import 5 | 6 | // NSUserDefaults key 7 | extern NSString * const kSizePreference; 8 | 9 | // Notification name 10 | extern NSString * const kSizeDidChangeNotification; 11 | 12 | #define FONT_SIZE_SMALL 11 13 | #define FONT_SIZE_MEDIUM 13 14 | #define FONT_SIZE_LARGE 15 15 | 16 | // Convenience macro for notification observer for sizeable components 17 | #define REGISTER_FOR_SIZE_CHANGE [[NSNotificationCenter defaultCenter] \ 18 | addObserverForName:kSizeDidChangeNotification \ 19 | object:nil queue:[NSOperationQueue mainQueue] \ 20 | usingBlock:^(NSNotification *note) { \ 21 | [self sizeChanged:nil];}]; 22 | 23 | typedef enum : NSInteger { 24 | SizePreferenceSmall = 0, 25 | SizePreferenceMedium = 1, 26 | SizePreferenceLarge = 2 27 | } SizePreference; 28 | 29 | @interface Sizer : NSObject 30 | 31 | // Global constant for shared controller instance (like NSApp). 32 | extern Sizer *SizePref; 33 | 34 | @property (nonatomic) SizePreference sizePreference; 35 | @property (nonatomic, readonly) CGFloat fontSize; 36 | @property (nonatomic, readonly) CGFloat calendarTitleFontSize; 37 | @property (nonatomic, readonly) CGFloat cellSize; 38 | @property (nonatomic, readonly) CGFloat cellTextFieldVerticalSpace; 39 | @property (nonatomic, readonly) CGFloat cellDotWidth; 40 | @property (nonatomic, readonly) CGFloat cellRadius; 41 | @property (nonatomic, readonly) CGFloat tooltipWidth; 42 | @property (nonatomic, readonly) CGFloat agendaEventLeadingMargin; 43 | @property (nonatomic, readonly) CGFloat agendaDotWidth; 44 | @property (nonatomic, readonly) NSString *videoImageName; 45 | 46 | + (instancetype)shared; 47 | 48 | @end 49 | -------------------------------------------------------------------------------- /Itsycal/Sizer.m: -------------------------------------------------------------------------------- 1 | // Created by Sanjay Madan on 7/27/18 2 | // Copyright (c) 2018 mowglii.com 3 | 4 | #import "Sizer.h" 5 | 6 | // NSUserDefaults key 7 | NSString * const kSizePreference = @"SizePreference"; 8 | 9 | // Notification names 10 | NSString * const kSizeDidChangeNotification = @"SizeDidChangeNotification"; 11 | 12 | #define SML_MED_LRG(sml, med, lrg) \ 13 | (self.sizePreference == SizePreferenceMedium ? med \ 14 | : (self.sizePreference == SizePreferenceLarge ? lrg : sml)) 15 | 16 | @implementation Sizer 17 | 18 | Sizer *SizePref = nil; 19 | 20 | + (instancetype)shared { 21 | static Sizer *shared; 22 | static dispatch_once_t onceToken; 23 | dispatch_once(&onceToken, ^{ 24 | shared = [[Sizer alloc] init]; 25 | SizePref = shared; 26 | }); 27 | return shared; 28 | } 29 | 30 | - (void)setSizePreference:(SizePreference)sizePreference { 31 | _sizePreference = sizePreference; 32 | [[NSNotificationCenter defaultCenter] postNotificationName:kSizeDidChangeNotification object:nil]; 33 | } 34 | 35 | - (CGFloat)fontSize { 36 | return SML_MED_LRG(FONT_SIZE_SMALL, FONT_SIZE_MEDIUM, FONT_SIZE_LARGE); 37 | } 38 | 39 | - (CGFloat)calendarTitleFontSize { 40 | return SML_MED_LRG(14, 16, 18); 41 | } 42 | 43 | - (CGFloat)cellSize { 44 | return SML_MED_LRG(23, 28, 32); 45 | } 46 | 47 | - (CGFloat)cellTextFieldVerticalSpace { 48 | return SML_MED_LRG(2, 2, 2); 49 | } 50 | 51 | - (CGFloat)cellDotWidth { 52 | return SML_MED_LRG(3, 4, 5); 53 | } 54 | 55 | - (CGFloat)cellRadius { 56 | return SML_MED_LRG(2, 3, 4); 57 | } 58 | 59 | - (CGFloat)tooltipWidth { 60 | return SML_MED_LRG(200, 236, 264); 61 | } 62 | 63 | - (CGFloat)agendaDotWidth { 64 | return SML_MED_LRG(6, 7, 8); 65 | } 66 | 67 | - (CGFloat)agendaEventLeadingMargin { 68 | return SML_MED_LRG(21, 22, 24); 69 | } 70 | 71 | - (NSString *)videoImageName { 72 | return SML_MED_LRG(@"video14", @"video16", @"video18"); 73 | } 74 | 75 | @end 76 | -------------------------------------------------------------------------------- /Itsycal/Themer.h: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 6/12/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import 7 | 8 | // NSUserDefaults key 9 | extern NSString * const kThemePreference; 10 | 11 | typedef enum : NSInteger { 12 | ThemePreferenceSystem = 0, 13 | ThemePreferenceLight = 1, 14 | ThemePreferenceDark = 2 15 | } ThemePreference; 16 | 17 | @interface Themer : NSObject 18 | 19 | // Global constant for shared controller instance (like NSApp). 20 | extern Themer *Theme; 21 | 22 | @property (nonatomic) ThemePreference themePreference; 23 | @property (nonatomic, readonly) NSColor *agendaDayTextColor; 24 | @property (nonatomic, readonly) NSColor *agendaDividerColor; 25 | @property (nonatomic, readonly) NSColor *agendaDOWTextColor; 26 | @property (nonatomic, readonly) NSColor *agendaEventDateTextColor; 27 | @property (nonatomic, readonly) NSColor *agendaEventTextColor; 28 | @property (nonatomic, readonly) NSColor *agendaHoverColor; 29 | @property (nonatomic, readonly) NSColor *currentMonthOutlineColor; 30 | @property (nonatomic, readonly) NSColor *currentMonthTextColor; 31 | @property (nonatomic, readonly) NSColor *DOWTextColor; 32 | @property (nonatomic, readonly) NSColor *highlightedDOWBackgroundColor; 33 | @property (nonatomic, readonly) NSColor *highlightedDOWTextColor; 34 | @property (nonatomic, readonly) NSColor *hoveredCellColor; 35 | @property (nonatomic, readonly) NSColor *mainBackgroundColor; 36 | @property (nonatomic, readonly) NSColor *monthTextColor; 37 | @property (nonatomic, readonly) NSColor *noncurrentMonthTextColor; 38 | @property (nonatomic, readonly) NSColor *pendingBackgroundColor; 39 | @property (nonatomic, readonly) NSColor *resizeHandleBackgroundColor; 40 | @property (nonatomic, readonly) NSColor *resizeHandleForegroundColor; 41 | @property (nonatomic, readonly) NSColor *selectedCellColor; 42 | @property (nonatomic, readonly) NSColor *todayCellColor; 43 | @property (nonatomic, readonly) NSColor *tooltipBackgroundColor; 44 | @property (nonatomic, readonly) NSColor *weekTextColor; 45 | @property (nonatomic, readonly) NSColor *windowBorderColor; 46 | 47 | + (instancetype)shared; 48 | 49 | @end 50 | -------------------------------------------------------------------------------- /Itsycal/Themer.m: -------------------------------------------------------------------------------- 1 | // 2 | // Created by Sanjay Madan on 6/12/17. 3 | // Copyright © 2017 mowglii.com. All rights reserved. 4 | // 5 | 6 | #import "Themer.h" 7 | #import "Itsycal.h" 8 | #import "MoUtils.h" 9 | 10 | // NSUserDefaults key 11 | NSString * const kThemePreference = @"ThemePreference"; 12 | 13 | @implementation Themer 14 | 15 | Themer *Theme = nil; 16 | 17 | + (instancetype)shared 18 | { 19 | static Themer *shared; 20 | static dispatch_once_t onceToken; 21 | dispatch_once(&onceToken, ^{ 22 | shared = [[Themer alloc] init]; 23 | Theme = shared; 24 | }); 25 | return shared; 26 | } 27 | 28 | - (instancetype)init 29 | { 30 | self = [super init]; 31 | if (self) { 32 | _themePreference = [[NSUserDefaults standardUserDefaults] integerForKey:kThemePreference]; 33 | [self adjustAppAppearanceForThemePreference]; 34 | } 35 | return self; 36 | } 37 | 38 | - (void)setThemePreference:(ThemePreference)themePref { 39 | // Validate themePref before setting ivar. 40 | _themePreference = (themePref < 0 || themePref > 2) ? 0 : themePref; 41 | [self adjustAppAppearanceForThemePreference]; 42 | } 43 | 44 | - (void)adjustAppAppearanceForThemePreference { 45 | switch (_themePreference) { 46 | case ThemePreferenceSystem: 47 | NSApp.appearance = nil; 48 | break; 49 | case ThemePreferenceDark: 50 | NSApp.appearance = [NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]; 51 | break; 52 | case ThemePreferenceLight: 53 | default: 54 | NSApp.appearance = [NSAppearance appearanceNamed:NSAppearanceNameAqua]; 55 | } 56 | } 57 | 58 | - (NSColor *)agendaDayTextColor { 59 | return NSColor.secondaryLabelColor; 60 | } 61 | 62 | - (NSColor *)agendaDividerColor { 63 | return NSColor.separatorColor; 64 | } 65 | 66 | - (NSColor *)agendaDOWTextColor { 67 | return [self monthTextColor]; 68 | } 69 | 70 | - (NSColor *)agendaEventDateTextColor { 71 | return NSColor.secondaryLabelColor; 72 | } 73 | 74 | - (NSColor *)agendaEventTextColor { 75 | return [self monthTextColor]; 76 | } 77 | 78 | - (NSColor *)agendaHoverColor { 79 | return [self highlightedDOWBackgroundColor]; 80 | } 81 | 82 | - (NSColor *)currentMonthOutlineColor { 83 | return [self monthTextColor]; 84 | } 85 | 86 | - (NSColor *)currentMonthTextColor { 87 | return NSColor.labelColor; 88 | } 89 | 90 | - (NSColor *)DOWTextColor { 91 | return NSColor.labelColor; 92 | } 93 | 94 | - (NSColor *)highlightedDOWBackgroundColor { 95 | return [NSColor colorNamed:@"HighlightedDOWBackgroundColor"]; 96 | } 97 | 98 | - (NSColor *)highlightedDOWTextColor { 99 | return NSColor.secondaryLabelColor; 100 | } 101 | 102 | - (NSColor *)hoveredCellColor { 103 | return NSColor.tertiaryLabelColor; 104 | } 105 | 106 | - (NSColor *)mainBackgroundColor { 107 | return [NSColor colorNamed:@"MainBackgroundColor"]; 108 | } 109 | 110 | - (NSColor *)monthTextColor { 111 | return NSColor.labelColor; 112 | } 113 | 114 | - (NSColor *)noncurrentMonthTextColor { 115 | return NSColor.tertiaryLabelColor; 116 | } 117 | 118 | - (NSColor *)pendingBackgroundColor { 119 | return [NSColor colorNamed:@"PendingBackgroundColor"]; 120 | } 121 | 122 | - (NSColor *)resizeHandleBackgroundColor { 123 | return [self highlightedDOWBackgroundColor]; 124 | } 125 | 126 | - (NSColor *)resizeHandleForegroundColor { 127 | return [NSColor colorNamed:@"ResizeHandleForegroundColor"]; 128 | } 129 | 130 | - (NSColor *)selectedCellColor { 131 | return [self currentMonthOutlineColor]; 132 | } 133 | 134 | - (NSColor *)todayCellColor { 135 | return [NSColor colorNamed:@"TodayCellColor"]; 136 | } 137 | 138 | - (NSColor *)tooltipBackgroundColor { 139 | return [self mainBackgroundColor]; 140 | } 141 | 142 | - (NSColor *)weekTextColor { 143 | return NSColor.secondaryLabelColor; 144 | } 145 | 146 | - (NSColor *)windowBorderColor { 147 | return [NSColor colorNamed:@"WindowBorderColor"]; 148 | } 149 | 150 | @end 151 | -------------------------------------------------------------------------------- /Itsycal/TooltipViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TooltipViewController.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/17/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "AgendaViewController.h" 11 | #import "MoCalTooltipProvider.h" 12 | #import "MoDate.h" 13 | 14 | @protocol TooltipViewControllerDelegate; 15 | 16 | @interface TooltipViewController : AgendaViewController 17 | 18 | @property (nonatomic, weak) id tooltipDelegate; 19 | 20 | @end 21 | 22 | @protocol TooltipViewControllerDelegate 23 | 24 | - (NSArray *)eventsForDate:(MoDate)date; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Itsycal/TooltipViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TooltipViewController.m 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/17/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import "TooltipViewController.h" 10 | #import "Themer.h" 11 | 12 | @implementation TooltipViewController 13 | 14 | - (BOOL)toolTipForDate:(MoDate)date 15 | { 16 | self.tv.enableHover = NO; 17 | self.tv.enclosingScrollView.hasVerticalScroller = NO; // in case user has System Prefs set to always show scroller 18 | self.events = [self.tooltipDelegate eventsForDate:date]; 19 | if (self.events) { 20 | [self reloadData]; 21 | return YES; 22 | } 23 | return NO; 24 | } 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Itsycal/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // Itsycal 4 | // 5 | // Created by Sanjay Madan on 2/4/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "MoCalendar.h" 11 | #import "EventCenter.h" 12 | #import "AgendaViewController.h" 13 | #import "TooltipViewController.h" 14 | 15 | @interface ViewController : NSViewController 16 | 17 | - (void)keyboardShortcutActivated; 18 | - (void)removeStatusItem; 19 | - (void)dateURLReceived:(NSDate *)showDate; 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Itsycal/_fonts/Mow.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_fonts/Mow.otf -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/MASShortcut: -------------------------------------------------------------------------------- 1 | Versions/Current/MASShortcut -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASDictionaryTransformer.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | extern NSString *const MASDictionaryTransformerName; 4 | 5 | /** 6 | Converts shortcuts for storage in user defaults. 7 | 8 | User defaults can’t stored custom types directly, they have to 9 | be serialized to `NSData` or some other supported type like an 10 | `NSDictionary`. In Cocoa Bindings, the conversion can be done 11 | using value transformers like this one. 12 | 13 | There’s a built-in transformer (`NSKeyedUnarchiveFromDataTransformerName`) 14 | that converts any `NSCoding` types to `NSData`, but with shortcuts 15 | it makes sense to use a dictionary instead – the defaults look better 16 | when inspected with the `defaults` command-line utility and the 17 | format is compatible with an older shortcut library called Shortcut 18 | Recorder. 19 | */ 20 | @interface MASDictionaryTransformer : NSValueTransformer 21 | @end 22 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASKeyCodes.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | // These glyphs are missed in Carbon.h 5 | typedef NS_ENUM(unsigned short, kMASShortcutGlyph) { 6 | kMASShortcutGlyphEject = 0x23CF, 7 | kMASShortcutGlyphClear = 0x2715, 8 | kMASShortcutGlyphDeleteLeft = 0x232B, 9 | kMASShortcutGlyphDeleteRight = 0x2326, 10 | kMASShortcutGlyphLeftArrow = 0x2190, 11 | kMASShortcutGlyphRightArrow = 0x2192, 12 | kMASShortcutGlyphUpArrow = 0x2191, 13 | kMASShortcutGlyphDownArrow = 0x2193, 14 | kMASShortcutGlyphEscape = 0x238B, 15 | kMASShortcutGlyphHelp = 0x003F, 16 | kMASShortcutGlyphPageDown = 0x21DF, 17 | kMASShortcutGlyphPageUp = 0x21DE, 18 | kMASShortcutGlyphTabRight = 0x21E5, 19 | kMASShortcutGlyphReturn = 0x2305, 20 | kMASShortcutGlyphReturnR2L = 0x21A9, 21 | kMASShortcutGlyphPadClear = 0x2327, 22 | kMASShortcutGlyphNorthwestArrow = 0x2196, 23 | kMASShortcutGlyphSoutheastArrow = 0x2198, 24 | }; 25 | 26 | // The missing function key definitions for `NS*FunctionKey`s 27 | typedef NS_ENUM(unsigned short, kMASShortcutFuctionKey) { 28 | kMASShortcutEscapeFunctionKey = 0x001B, 29 | kMASShortcutDeleteFunctionKey = 0x0008, 30 | kMASShortcutSpaceFunctionKey = 0x0020, 31 | kMASShortcutReturnFunctionKey = 0x000D, 32 | kMASShortcutTabFunctionKey = 0x0009, 33 | }; 34 | 35 | NS_INLINE NSString* NSStringFromMASKeyCode(unsigned short ch) 36 | { 37 | return [NSString stringWithFormat:@"%C", ch]; 38 | } 39 | 40 | NS_INLINE NSUInteger MASPickCocoaModifiers(NSUInteger flags) 41 | { 42 | return (flags & (NSEventModifierFlagControl | NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagCommand)); 43 | } 44 | 45 | // Used in `-[MASShortcutValidator isShortcut:alreadyTakenInMenu:explanation:]`. 46 | // This prevents incorrectly detecting an overlap with any shortcuts using the `fn` key. 47 | NS_INLINE NSUInteger MASPickModifiersIncludingFn(NSUInteger flags) 48 | { 49 | return (flags & (NSEventModifierFlagControl | NSEventModifierFlagShift | NSEventModifierFlagOption | NSEventModifierFlagCommand | NSEventModifierFlagFunction)); 50 | } 51 | 52 | NS_INLINE UInt32 MASCarbonModifiersFromCocoaModifiers(NSUInteger cocoaFlags) 53 | { 54 | return 55 | (cocoaFlags & NSEventModifierFlagCommand ? cmdKey : 0) 56 | | (cocoaFlags & NSEventModifierFlagOption ? optionKey : 0) 57 | | (cocoaFlags & NSEventModifierFlagControl ? controlKey : 0) 58 | | (cocoaFlags & NSEventModifierFlagShift ? shiftKey : 0); 59 | } 60 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcut.h: -------------------------------------------------------------------------------- 1 | #import "MASKeyCodes.h" 2 | 3 | /** 4 | A model class to hold a key combination. 5 | 6 | This class just represents a combination of keys. It does not care if 7 | the combination is valid or can be used as a hotkey, it doesn’t watch 8 | the input system for the shortcut appearance, nor it does access user 9 | defaults. 10 | */ 11 | @interface MASShortcut : NSObject 12 | 13 | /** 14 | The virtual key code for the keyboard key. 15 | 16 | Hardware independent, same as in `NSEvent`. See `Events.h` in the HIToolbox 17 | framework for a complete list, or Command-click this symbol: `kVK_ANSI_A`. 18 | */ 19 | @property (nonatomic, readonly) NSInteger keyCode; 20 | 21 | /** 22 | Cocoa keyboard modifier flags. 23 | 24 | Same as in `NSEvent`: `NSCommandKeyMask`, `NSAlternateKeyMask`, etc. 25 | */ 26 | @property (nonatomic, readonly) NSEventModifierFlags modifierFlags; 27 | 28 | /** 29 | Same as `keyCode`, just a different type. 30 | */ 31 | @property (nonatomic, readonly) UInt32 carbonKeyCode; 32 | 33 | /** 34 | Carbon modifier flags. 35 | 36 | A bit sum of `cmdKey`, `optionKey`, etc. 37 | */ 38 | @property (nonatomic, readonly) UInt32 carbonFlags; 39 | 40 | /** 41 | A string representing the “key” part of a shortcut, like the `5` in `⌘5`. 42 | 43 | @warning The value may change depending on the active keyboard layout. 44 | For example for the `^2` keyboard shortcut (`kVK_ANSI_2+NSControlKeyMask` 45 | to be precise) the `keyCodeString` is `2` on the US keyboard, but `ě` when 46 | the Czech keyboard layout is active. See the spec for details. 47 | */ 48 | @property (nonatomic, readonly, nullable) NSString *keyCodeString; 49 | 50 | /** 51 | A key-code string used in key equivalent matching. 52 | 53 | For precise meaning of “key equivalents” see the `keyEquivalent` 54 | property of `NSMenuItem`. Here the string is used to support shortcut 55 | validation (“is the shortcut already taken in this menu?”) and 56 | for display in `NSMenu`. 57 | 58 | The value of this property may differ from `keyCodeString`. For example 59 | the Russian keyboard has a `Г` (Ge) Cyrillic character in place of the 60 | latin `U` key. This means you can create a `^Г` shortcut, but in menus 61 | that’s always displayed as `^U`. So the `keyCodeString` returns `Г` 62 | and `keyCodeStringForKeyEquivalent` returns `U`. 63 | */ 64 | @property (nonatomic, readonly, nullable) NSString *keyCodeStringForKeyEquivalent; 65 | 66 | /** 67 | A string representing the shortcut modifiers, like the `⌘` in `⌘5`. 68 | */ 69 | @property (nonatomic, readonly, nonnull) NSString *modifierFlagsString; 70 | 71 | - (nonnull instancetype)initWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags; 72 | + (nonnull instancetype)shortcutWithKeyCode:(NSInteger)code modifierFlags:(NSEventModifierFlags)flags; 73 | 74 | /** 75 | Creates a new shortcut from an `NSEvent` object. 76 | 77 | This is just a convenience initializer that reads the key code and modifiers from an `NSEvent`. 78 | */ 79 | + (nonnull instancetype)shortcutWithEvent:(nonnull NSEvent *)anEvent; 80 | 81 | @end 82 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutBinder.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcutMonitor.h" 2 | 3 | /** 4 | Binds actions to user defaults keys. 5 | 6 | If you store shortcuts in user defaults (for example by binding 7 | a `MASShortcutView` to user defaults), you can use this class to 8 | connect an action directly to a user defaults key. If the shortcut 9 | stored under the key changes, the action will get automatically 10 | updated to the new one. 11 | 12 | This class is mostly a wrapper around a `MASShortcutMonitor`. It 13 | watches the changes in user defaults and updates the shortcut monitor 14 | accordingly with the new shortcuts. 15 | */ 16 | @interface MASShortcutBinder : NSObject 17 | 18 | /** 19 | A convenience shared instance. 20 | 21 | You may use it so that you don’t have to manage an instance by hand, 22 | but it’s perfectly fine to allocate and use a separate instance instead. 23 | */ 24 | + (instancetype) sharedBinder; 25 | 26 | /** 27 | The underlying shortcut monitor. 28 | */ 29 | @property(strong) MASShortcutMonitor *shortcutMonitor; 30 | 31 | /** 32 | Binding options customizing the access to user defaults. 33 | 34 | As an example, you can use `NSValueTransformerNameBindingOption` to customize 35 | the storage format used for the shortcuts. By default the shortcuts are converted 36 | from `NSData` (`NSKeyedUnarchiveFromDataTransformerName`). Note that if the 37 | binder is to work with `MASShortcutView`, both object have to use the same storage 38 | format. 39 | */ 40 | @property(copy) NSDictionary *bindingOptions; 41 | 42 | /** 43 | Binds given action to a shortcut stored under the given defaults key. 44 | 45 | In other words, no matter what shortcut you store under the given key, 46 | pressing it will always trigger the given action. 47 | */ 48 | - (void) bindShortcutWithDefaultsKey: (NSString*) defaultsKeyName toAction: (dispatch_block_t) action; 49 | 50 | /** 51 | Disconnect the binding between user defaults and action. 52 | 53 | In other words, the shortcut stored under the given key will no longer trigger an action. 54 | */ 55 | - (void) breakBindingWithDefaultsKey: (NSString*) defaultsKeyName; 56 | 57 | /** 58 | Register default shortcuts in user defaults. 59 | 60 | This is a convenience frontend to `[NSUserDefaults registerDefaults]`. 61 | The dictionary should contain a map of user defaults’ keys to appropriate 62 | keyboard shortcuts. The shortcuts will be transformed according to 63 | `bindingOptions` and registered using `registerDefaults`. 64 | */ 65 | - (void) registerDefaultShortcuts: (NSDictionary*) defaultShortcuts; 66 | 67 | @end 68 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutMonitor.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | Executes action when a shortcut is pressed. 5 | 6 | There can only be one instance of this class, otherwise things 7 | will probably not work. (There’s a Carbon event handler inside 8 | and there can only be one Carbon event handler of a given type.) 9 | */ 10 | @interface MASShortcutMonitor : NSObject 11 | 12 | - (instancetype) init __unavailable; 13 | + (instancetype) sharedMonitor; 14 | 15 | /** 16 | Register a shortcut along with an action. 17 | 18 | Attempting to insert an already registered shortcut probably won’t work. 19 | It may burn your house or cut your fingers. You have been warned. 20 | */ 21 | - (BOOL) registerShortcut: (MASShortcut*) shortcut withAction: (dispatch_block_t) action; 22 | - (BOOL) isShortcutRegistered: (MASShortcut*) shortcut; 23 | 24 | - (void) unregisterShortcut: (MASShortcut*) shortcut; 25 | - (void) unregisterAllShortcuts; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutValidator.h: -------------------------------------------------------------------------------- 1 | #import "MASShortcut.h" 2 | 3 | /** 4 | This class is used by the recording control to tell which shortcuts are acceptable. 5 | 6 | There are two kinds of shortcuts that are not considered acceptable: shortcuts that 7 | are too simple (like single letter keys) and shortcuts that are already used by the 8 | operating system. 9 | */ 10 | @interface MASShortcutValidator : NSObject 11 | 12 | /** 13 | Set to `YES` if you want to accept Option-something shortcuts. 14 | 15 | `NO` by default, since Option-something shortcuts are often used by system, 16 | for example Option-G will type the © sign. This also applies to Option-Shift 17 | shortcuts – in other words, shortcut recorder will not accept shortcuts like 18 | Option-Shift-K by default. (Again, since Option-Shift-K inserts the Apple 19 | logo sign by default.) 20 | */ 21 | @property(assign) BOOL allowAnyShortcutWithOptionModifier; 22 | 23 | /** 24 | Set to `YES` if you want to accept shortcuts that override the Services menu 25 | item. 26 | 27 | `NO` by default. Set to `YES` to allow shortcuts to override key equivalents of 28 | Services menu items. This can prevent users from being confused when they can't 29 | find the conflicting menu item since menu items in the Services menu are not 30 | always visible. 31 | */ 32 | @property(assign) BOOL allowOverridingServicesShortcut; 33 | 34 | + (instancetype) sharedValidator; 35 | 36 | - (BOOL) isShortcutValid: (MASShortcut*) shortcut; 37 | - (BOOL) isShortcut: (MASShortcut*) shortcut alreadyTakenInMenu: (NSMenu*) menu explanation: (NSString**) explanation; 38 | - (BOOL) isShortcutAlreadyTakenBySystem: (MASShortcut*) shortcut explanation: (NSString**) explanation; 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutView+Bindings.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "MASShortcutView.h" 3 | 4 | /** 5 | A simplified interface to bind the recorder value to user defaults. 6 | 7 | You can bind the `shortcutValue` to user defaults using the standard 8 | `bind:toObject:withKeyPath:options:` call, but since that’s a lot to type 9 | and read, here’s a simpler option. 10 | 11 | Setting the `associatedUserDefaultsKey` binds the view’s shortcut value 12 | to the given user defaults key. You can supply a value transformer to convert 13 | values between user defaults and `MASShortcut`. If you don’t supply 14 | a transformer, the `NSUnarchiveFromDataTransformerName` will be used 15 | automatically. 16 | 17 | Set `associatedUserDefaultsKey` to `nil` to disconnect the binding. 18 | */ 19 | @interface MASShortcutView (Bindings) 20 | 21 | @property(copy, nullable) NSString *associatedUserDefaultsKey; 22 | 23 | - (void) setAssociatedUserDefaultsKey: (nullable NSString*) newKey withTransformer: (nullable NSValueTransformer*) transformer; 24 | - (void) setAssociatedUserDefaultsKey: (nullable NSString*) newKey withTransformerName: (nullable NSString*) transformerName; 25 | 26 | @end 27 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutView.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @class MASShortcut, MASShortcutValidator; 4 | 5 | extern NSString * _Nonnull const MASShortcutBinding; 6 | 7 | typedef NS_ENUM(NSInteger, MASShortcutViewStyle) { 8 | MASShortcutViewStyleDefault = 0, // Height = 19 px 9 | MASShortcutViewStyleTexturedRect, // Height = 25 px 10 | MASShortcutViewStyleRounded, // Height = 43 px 11 | MASShortcutViewStyleFlat, 12 | MASShortcutViewStyleRegularSquare 13 | }; 14 | 15 | @interface MASShortcutView : NSView 16 | 17 | @property (nonatomic, strong, nullable) MASShortcut *shortcutValue; 18 | @property (nonatomic, strong, nullable) MASShortcutValidator *shortcutValidator; 19 | @property (nonatomic, getter = isRecording) BOOL recording; 20 | @property (nonatomic, getter = isEnabled) BOOL enabled; 21 | @property (nonatomic, copy, nullable) void (^shortcutValueChange)(MASShortcutView * _Nonnull sender); 22 | @property (nonatomic, assign) MASShortcutViewStyle style; 23 | 24 | /// Returns custom class for drawing control. 25 | + (nonnull Class)shortcutCellClass; 26 | 27 | - (void)setAcceptsFirstResponder:(BOOL)value; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/MASShortcutViewButtonCell.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | NS_ASSUME_NONNULL_BEGIN 4 | 5 | @interface MASShortcutViewButtonCell : NSButtonCell 6 | 7 | @end 8 | 9 | NS_ASSUME_NONNULL_END 10 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Headers/Shortcut.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "MASShortcut.h" 3 | #import "MASShortcutValidator.h" 4 | #import "MASShortcutMonitor.h" 5 | #import "MASShortcutBinder.h" 6 | #import "MASDictionaryTransformer.h" 7 | #import "MASShortcutView.h" 8 | #import "MASShortcutView+Bindings.h" 9 | #import "MASShortcutViewButtonCell.h" 10 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/MASShortcut: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/MASShortcut -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module MASShortcut { 2 | umbrella header "Shortcut.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 23A5328b 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | MASShortcut 11 | CFBundleIdentifier 12 | com.github.shpakovski.MASShortcut 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | MASShortcut 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 2.4.0 21 | CFBundleSupportedPlatforms 22 | 23 | MacOSX 24 | 25 | CFBundleVersion 26 | 2.4.0 27 | DTCompiler 28 | com.apple.compilers.llvm.clang.1_0 29 | DTPlatformBuild 30 | 31 | DTPlatformName 32 | macosx 33 | DTPlatformVersion 34 | 14.0 35 | DTSDKBuild 36 | 23A5334a 37 | DTSDKName 38 | macosx14.0 39 | DTXcode 40 | 1500 41 | DTXcodeBuild 42 | 15A5229m 43 | LSMinimumSystemVersion 44 | 10.14 45 | NSHumanReadableCopyright 46 | Copyright © Vadim Shpakovski. All rights reserved. 47 | 48 | 49 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/de.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/es.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/fr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/it.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/MASShortcut.framework/Versions/A/Resources/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/MASShortcut.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/PrivateHeaders: -------------------------------------------------------------------------------- 1 | Versions/Current/PrivateHeaders -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Sparkle: -------------------------------------------------------------------------------- 1 | Versions/Current/Sparkle -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloadData.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloadData.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 8/10/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | #import "SUExport.h" 16 | 17 | NS_ASSUME_NONNULL_BEGIN 18 | 19 | /*! 20 | * A class for containing downloaded data along with some information about it. 21 | */ 22 | SU_EXPORT @interface SPUDownloadData : NSObject 23 | 24 | - (instancetype)initWithData:(NSData *)data textEncodingName:(NSString * _Nullable)textEncodingName MIMEType:(NSString * _Nullable)MIMEType; 25 | 26 | /*! 27 | * The raw data that was downloaded. 28 | */ 29 | @property (nonatomic, readonly) NSData *data; 30 | 31 | /*! 32 | * The IANA charset encoding name if available. Eg: "utf-8" 33 | */ 34 | @property (nonatomic, readonly, nullable, copy) NSString *textEncodingName; 35 | 36 | /*! 37 | * The MIME type if available. Eg: "text/plain" 38 | */ 39 | @property (nonatomic, readonly, nullable, copy) NSString *MIMEType; 40 | 41 | @end 42 | 43 | NS_ASSUME_NONNULL_END 44 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloader.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloader.h 3 | // Downloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SPUDownloaderProtocol.h" 15 | 16 | @protocol SPUDownloaderDelegate; 17 | 18 | // This object implements the protocol which we have defined. It provides the actual behavior for the service. It is 'exported' by the service to make it available to the process hosting the service over an NSXPCConnection. 19 | @interface SPUDownloader : NSObject 20 | 21 | // Due to XPC remote object reasons, this delegate is strongly referenced 22 | // Invoke cleanup when done with this instance 23 | - (instancetype)initWithDelegate:(id )delegate; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloaderDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderDelegate.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @class SPUDownloadData; 18 | 19 | @protocol SPUDownloaderDelegate 20 | 21 | // This is only invoked for persistent downloads 22 | - (void)downloaderDidSetDestinationName:(NSString *)destinationName temporaryDirectory:(NSString *)temporaryDirectory; 23 | 24 | // Under rare cases, this may be called more than once, in which case the current progress should be reset back to 0 25 | // This is only invoked for persistent downloads 26 | - (void)downloaderDidReceiveExpectedContentLength:(int64_t)expectedContentLength; 27 | 28 | // This is only invoked for persistent downloads 29 | - (void)downloaderDidReceiveDataOfLength:(uint64_t)length; 30 | 31 | // downloadData is nil if this is a persisent download, otherwise it's non-nil if it's a temporary download 32 | - (void)downloaderDidFinishWithTemporaryDownloadData:(SPUDownloadData * _Nullable)downloadData; 33 | 34 | - (void)downloaderDidFailWithError:(NSError *)error; 35 | 36 | @end 37 | 38 | NS_ASSUME_NONNULL_END 39 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloaderProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderProtocol.h 3 | // PersistentDownloader 4 | // 5 | // Created by Mayur Pawashe on 4/1/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @class SPUURLRequest; 18 | 19 | // The protocol that this service will vend as its API. This header file will also need to be visible to the process hosting the service. 20 | @protocol SPUDownloaderProtocol 21 | 22 | - (void)startPersistentDownloadWithRequest:(SPUURLRequest *)request bundleIdentifier:(NSString *)bundleIdentifier desiredFilename:(NSString *)desiredFilename; 23 | 24 | - (void)startTemporaryDownloadWithRequest:(SPUURLRequest *)request; 25 | 26 | - (void)downloadDidFinish; 27 | 28 | - (void)cleanup; 29 | 30 | - (void)cancel; 31 | 32 | @end 33 | 34 | NS_ASSUME_NONNULL_END 35 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUDownloaderSession.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUDownloaderSession.h 3 | // Sparkle 4 | // 5 | // Created by Deadpikle on 12/20/17. 6 | // Copyright © 2017 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SPUDownloader.h" 15 | #import "SPUDownloaderProtocol.h" 16 | 17 | NS_CLASS_AVAILABLE(NSURLSESSION_AVAILABLE, 7_0) 18 | @interface SPUDownloaderSession : SPUDownloader 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SPUURLRequest.h: -------------------------------------------------------------------------------- 1 | // 2 | // SPUURLRequest.h 3 | // Sparkle 4 | // 5 | // Created by Mayur Pawashe on 5/19/16. 6 | // Copyright © 2016 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | // A class that wraps NSURLRequest and implements NSSecureCoding 18 | // This class exists because NSURLRequest did not support NSSecureCoding in macOS 10.8 19 | // I have not verified if NSURLRequest in 10.9 implements NSSecureCoding or not 20 | @interface SPUURLRequest : NSObject 21 | 22 | // Creates a new URL request 23 | // Only these properties are currently tracked: 24 | // * URL 25 | // * Cache policy 26 | // * Timeout interval 27 | // * HTTP header fields 28 | // * networkServiceType 29 | + (instancetype)URLRequestWithRequest:(NSURLRequest *)request; 30 | 31 | @property (nonatomic, readonly) NSURLRequest *request; 32 | 33 | @end 34 | 35 | NS_ASSUME_NONNULL_END 36 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUAppcast.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcast.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCAST_H 10 | #define SUAPPCAST_H 11 | 12 | #import 13 | #import "SUExport.h" 14 | 15 | NS_ASSUME_NONNULL_BEGIN 16 | 17 | @class SUAppcastItem; 18 | SU_EXPORT @interface SUAppcast : NSObject 19 | 20 | @property (copy, nullable) NSString *userAgentString; 21 | @property (copy, nullable) NSDictionary *httpHeaders; 22 | 23 | - (void)fetchAppcastFromURL:(NSURL *)url inBackground:(BOOL)bg completionBlock:(void (^)(NSError *_Nullable))err; 24 | - (SUAppcast *)copyWithoutDeltaUpdates; 25 | 26 | @property (readonly, copy, nullable) NSArray *items; 27 | @end 28 | 29 | NS_ASSUME_NONNULL_END 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUAppcastItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUAppcastItem.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/12/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUAPPCASTITEM_H 10 | #define SUAPPCASTITEM_H 11 | 12 | #if __has_feature(modules) 13 | #if __has_warning("-Watimport-in-framework-header") 14 | #pragma clang diagnostic ignored "-Watimport-in-framework-header" 15 | #endif 16 | @import Foundation; 17 | #else 18 | #import 19 | #endif 20 | #import "SUExport.h" 21 | @class SUSignatures; 22 | 23 | SU_EXPORT @interface SUAppcastItem : NSObject 24 | @property (copy, readonly) NSString *title; 25 | @property (copy, readonly) NSString *dateString; 26 | @property (copy, readonly) NSDate *date; 27 | @property (copy, readonly) NSString *itemDescription; 28 | @property (strong, readonly) NSURL *releaseNotesURL; 29 | @property (strong, readonly) SUSignatures *signatures; 30 | @property (copy, readonly) NSString *minimumSystemVersion; 31 | @property (copy, readonly) NSString *maximumSystemVersion; 32 | @property (strong, readonly) NSURL *fileURL; 33 | @property (nonatomic, readonly) uint64_t contentLength; 34 | @property (copy, readonly) NSString *versionString; 35 | @property (copy, readonly) NSString *osString; 36 | @property (copy, readonly) NSString *displayVersionString; 37 | @property (copy, readonly) NSDictionary *deltaUpdates; 38 | @property (strong, readonly) NSURL *infoURL; 39 | @property (copy, readonly) NSNumber* phasedRolloutInterval; 40 | @property (copy, readonly) NSString *minimumAutoupdateVersion; 41 | 42 | // Initializes with data from a dictionary provided by the RSS class. 43 | - (instancetype)initWithDictionary:(NSDictionary *)dict; 44 | - (instancetype)initWithDictionary:(NSDictionary *)dict failureReason:(NSString **)error; 45 | 46 | @property (getter=isDeltaUpdate, readonly) BOOL deltaUpdate; 47 | @property (getter=isCriticalUpdate, readonly) BOOL criticalUpdate; 48 | @property (getter=isMacOsUpdate, readonly) BOOL macOsUpdate; 49 | @property (getter=isInformationOnlyUpdate, readonly) BOOL informationOnlyUpdate; 50 | 51 | // Returns the dictionary provided in initWithDictionary; this might be useful later for extensions. 52 | @property (readonly, copy) NSDictionary *propertiesDictionary; 53 | 54 | - (NSURL *)infoURL; 55 | 56 | @end 57 | 58 | #endif 59 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUCodeSigningVerifier.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUCodeSigningVerifier.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 7/5/12. 6 | // 7 | // 8 | 9 | #ifndef SUCODESIGNINGVERIFIER_H 10 | #define SUCODESIGNINGVERIFIER_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | SU_EXPORT @interface SUCodeSigningVerifier : NSObject 20 | + (BOOL)codeSignatureAtBundleURL:(NSURL *)oldBundlePath matchesSignatureAtBundleURL:(NSURL *)newBundlePath error:(NSError **)error; 21 | + (BOOL)codeSignatureIsValidAtBundleURL:(NSURL *)bundlePath error:(NSError **)error; 22 | + (BOOL)bundleAtURLIsCodeSigned:(NSURL *)bundlePath; 23 | + (NSDictionary *)codeSignatureInfoAtBundleURL:(NSURL *)bundlePath; 24 | @end 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUErrors.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUErrors.h 3 | // Sparkle 4 | // 5 | // Created by C.W. Betts on 10/13/14. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUERRORS_H 10 | #define SUERRORS_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | /** 20 | * Error domain used by Sparkle 21 | */ 22 | SU_EXPORT extern NSString *const SUSparkleErrorDomain; 23 | 24 | #pragma clang diagnostic push 25 | #pragma clang diagnostic ignored "-Wc++98-compat" 26 | typedef NS_ENUM(OSStatus, SUError) { 27 | // Appcast phase errors. 28 | SUAppcastParseError = 1000, 29 | SUNoUpdateError = 1001, 30 | SUAppcastError = 1002, 31 | SURunningFromDiskImageError = 1003, 32 | SURunningTranslocated = 1004, 33 | SUWebKitTerminationError = 1005, 34 | 35 | // Download phase errors. 36 | SUTemporaryDirectoryError = 2000, 37 | SUDownloadError = 2001, 38 | 39 | // Extraction phase errors. 40 | SUUnarchivingError = 3000, 41 | SUSignatureError = 3001, 42 | 43 | // Installation phase errors. 44 | SUFileCopyFailure = 4000, 45 | SUAuthenticationFailure = 4001, 46 | SUMissingUpdateError = 4002, 47 | SUMissingInstallerToolError = 4003, 48 | SURelaunchError = 4004, 49 | SUInstallationError = 4005, 50 | SUDowngradeError = 4006, 51 | SUInstallationCancelledError = 4007, 52 | 53 | // System phase errors 54 | SUSystemPowerOffError = 5000 55 | }; 56 | #pragma clang diagnostic pop 57 | 58 | #endif 59 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUExport.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUExport.h 3 | // Sparkle 4 | // 5 | // Created by Jake Petroules on 2014-08-23. 6 | // Copyright (c) 2014 Sparkle Project. All rights reserved. 7 | // 8 | 9 | #ifndef SUEXPORT_H 10 | #define SUEXPORT_H 11 | 12 | #ifdef BUILDING_SPARKLE 13 | #define SU_EXPORT __attribute__((visibility("default"))) 14 | #else 15 | #define SU_EXPORT 16 | #endif 17 | 18 | #endif 19 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUStandardVersionComparator.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUStandardVersionComparator.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUSTANDARDVERSIONCOMPARATOR_H 10 | #define SUSTANDARDVERSIONCOMPARATOR_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | #import "SUVersionComparisonProtocol.h" 19 | 20 | NS_ASSUME_NONNULL_BEGIN 21 | 22 | /*! 23 | Sparkle's default version comparator. 24 | 25 | This comparator is adapted from MacPAD, by Kevin Ballard. 26 | It's "dumb" in that it does essentially string comparison, 27 | in components split by character type. 28 | */ 29 | SU_EXPORT @interface SUStandardVersionComparator : NSObject 30 | 31 | /*! 32 | Initializes a new instance of the standard version comparator. 33 | */ 34 | - (instancetype)init; 35 | 36 | /*! 37 | Returns a singleton instance of the comparator. 38 | 39 | It is usually preferred to alloc/init new a comparator instead. 40 | */ 41 | + (SUStandardVersionComparator *)defaultComparator; 42 | 43 | /*! 44 | Compares version strings through textual analysis. 45 | 46 | See the implementation for more details. 47 | */ 48 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; 49 | @end 50 | 51 | NS_ASSUME_NONNULL_END 52 | #endif 53 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUVersionComparisonProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionComparisonProtocol.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 12/21/07. 6 | // Copyright 2007 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SUVERSIONCOMPARISONPROTOCOL_H 10 | #define SUVERSIONCOMPARISONPROTOCOL_H 11 | 12 | #if __has_feature(modules) 13 | @import Foundation; 14 | #else 15 | #import 16 | #endif 17 | #import "SUExport.h" 18 | 19 | NS_ASSUME_NONNULL_BEGIN 20 | 21 | /*! 22 | Provides version comparison facilities for Sparkle. 23 | */ 24 | @protocol SUVersionComparison 25 | 26 | /*! 27 | An abstract method to compare two version strings. 28 | 29 | Should return NSOrderedAscending if b > a, NSOrderedDescending if b < a, 30 | and NSOrderedSame if they are equivalent. 31 | */ 32 | - (NSComparisonResult)compareVersion:(NSString *)versionA toVersion:(NSString *)versionB; // *** MAY BE CALLED ON NON-MAIN THREAD! 33 | 34 | @end 35 | 36 | NS_ASSUME_NONNULL_END 37 | #endif 38 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/SUVersionDisplayProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUVersionDisplayProtocol.h 3 | // EyeTV 4 | // 5 | // Created by Uli Kusterer on 08.12.09. 6 | // Copyright 2009 Elgato Systems GmbH. All rights reserved. 7 | // 8 | 9 | #if __has_feature(modules) 10 | @import Foundation; 11 | #else 12 | #import 13 | #endif 14 | #import "SUExport.h" 15 | 16 | /*! 17 | Applies special display formatting to version numbers. 18 | */ 19 | @protocol SUVersionDisplay 20 | 21 | /*! 22 | Formats two version strings. 23 | 24 | Both versions are provided so that important distinguishing information 25 | can be displayed while also leaving out unnecessary/confusing parts. 26 | */ 27 | - (void)formatVersion:(NSString *_Nonnull*_Nonnull)inOutVersionA andVersion:(NSString *_Nonnull*_Nonnull)inOutVersionB; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Headers/Sparkle.h: -------------------------------------------------------------------------------- 1 | // 2 | // Sparkle.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. (Modified by CDHW on 23/12/07) 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #ifndef SPARKLE_H 10 | #define SPARKLE_H 11 | 12 | // This list should include the shared headers. It doesn't matter if some of them aren't shared (unless 13 | // there are name-space collisions) so we can list all of them to start with: 14 | 15 | #pragma clang diagnostic push 16 | // Do not use <> style includes since 2.x has two frameworks that need to work: Sparkle and SparkleCore 17 | #pragma clang diagnostic ignored "-Wquoted-include-in-framework-header" 18 | 19 | #import "SUAppcast.h" 20 | #import "SUAppcastItem.h" 21 | #import "SUStandardVersionComparator.h" 22 | #import "SUUpdater.h" 23 | #import "SUUpdaterDelegate.h" 24 | #import "SUVersionComparisonProtocol.h" 25 | #import "SUVersionDisplayProtocol.h" 26 | #import "SUErrors.h" 27 | 28 | #import "SPUDownloader.h" 29 | #import "SPUDownloaderDelegate.h" 30 | #import "SPUDownloadData.h" 31 | #import "SPUDownloaderProtocol.h" 32 | #import "SPUDownloaderSession.h" 33 | #import "SPUURLRequest.h" 34 | #import "SUCodeSigningVerifier.h" 35 | 36 | #pragma clang diagnostic pop 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Modules/module.modulemap: -------------------------------------------------------------------------------- 1 | framework module Sparkle { 2 | umbrella header "Sparkle.h" 3 | export * 4 | 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/PrivateHeaders/SUUnarchiver.h: -------------------------------------------------------------------------------- 1 | // 2 | // SUUnarchiver.h 3 | // Sparkle 4 | // 5 | // Created by Andy Matuschak on 3/16/06. 6 | // Copyright 2006 Andy Matuschak. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @protocol SUUnarchiverProtocol; 14 | 15 | @interface SUUnarchiver : NSObject 16 | 17 | + (nullable id )unarchiverForPath:(NSString *)path updatingHostBundlePath:(nullable NSString *)hostPath decryptionPassword:(nullable NSString *)decryptionPassword; 18 | 19 | @end 20 | 21 | NS_ASSUME_NONNULL_END 22 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 23A5328b 7 | CFBundleDevelopmentRegion 8 | English 9 | CFBundleExecutable 10 | Autoupdate 11 | CFBundleIconFile 12 | AppIcon.icns 13 | CFBundleIdentifier 14 | org.sparkle-project.Sparkle.Autoupdate 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.27.1-3-g05be1d71 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.106 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 14.0 37 | DTSDKBuild 38 | 23A5334a 39 | DTSDKName 40 | macosx14.0 41 | DTXcode 42 | 1500 43 | DTXcodeBuild 44 | 15A5229m 45 | LSApplicationCategoryType 46 | public.app-category.utilities 47 | LSBackgroundOnly 48 | 1 49 | LSMinimumSystemVersion 50 | 10.14 51 | LSUIElement 52 | 1 53 | NSMainNibFile 54 | MainMenu 55 | NSPrincipalClass 56 | NSApplication 57 | 58 | 59 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/Autoupdate -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/MacOS/fileop -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/PkgInfo: -------------------------------------------------------------------------------- 1 | APPL???? -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/AppIcon.icns -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/Base.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/Base.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Autoupdate.app/Contents/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUAutomaticUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUAutomaticUpdateAlert.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdateAlert.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdateAlert.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-101400.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-101400.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-110000.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/SUUpdatePermissionPrompt.nib/keyedobjects-110000.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Base.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildMachineOSBuild 6 | 23A5328b 7 | CFBundleDevelopmentRegion 8 | en 9 | CFBundleExecutable 10 | Sparkle 11 | CFBundleIdentifier 12 | org.sparkle-project.Sparkle 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | Sparkle 17 | CFBundlePackageType 18 | FMWK 19 | CFBundleShortVersionString 20 | 1.27.1-3-g05be1d71 21 | CFBundleSignature 22 | ???? 23 | CFBundleSupportedPlatforms 24 | 25 | MacOSX 26 | 27 | CFBundleVersion 28 | 1.106 29 | DTCompiler 30 | com.apple.compilers.llvm.clang.1_0 31 | DTPlatformBuild 32 | 33 | DTPlatformName 34 | macosx 35 | DTPlatformVersion 36 | 14.0 37 | DTSDKBuild 38 | 23A5334a 39 | DTSDKName 40 | macosx14.0 41 | DTXcode 42 | 1500 43 | DTXcodeBuild 44 | 15A5229m 45 | LSMinimumSystemVersion 46 | 10.14 47 | 48 | 49 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/ReleaseNotesColorStyle.css: -------------------------------------------------------------------------------- 1 | @media (prefers-color-scheme: dark) { 2 | html { 3 | color: white; 4 | background: transparent; 5 | } 6 | :link { 7 | color: #419CFF; 8 | } 9 | :link:active { 10 | color: #FF1919; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/SUStatus.nib -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/de.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSButtonCell"; title = "Install and Relaunch"; ObjectID = "41"; */ 3 | "41.title" = "Install and Relaunch"; 4 | 5 | /* Class = "NSButtonCell"; title = "Install on Quit"; ObjectID = "42"; */ 6 | "42.title" = "Install on Quit"; 7 | 8 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "43"; */ 9 | "43.title" = "Automatically download and install updates in the future"; 10 | 11 | /* Class = "NSButtonCell"; title = "Don't Install"; ObjectID = "44"; */ 12 | "44.title" = "Don't Install"; 13 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSWindow"; title = "Software Update"; ObjectID = "5"; */ 3 | "5.title" = "Software Update"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Release Notes:"; ObjectID = "170"; */ 6 | "170.title" = "Release Notes:"; 7 | 8 | /* Class = "NSButtonCell"; title = "Remind Me Later"; ObjectID = "171"; */ 9 | "171.title" = "Remind Me Later"; 10 | 11 | /* Class = "NSButtonCell"; title = "Skip This Version"; ObjectID = "172"; */ 12 | "172.title" = "Skip This Version"; 13 | 14 | /* Class = "NSButtonCell"; title = "Install Update"; ObjectID = "173"; */ 15 | "173.title" = "Install Update"; 16 | 17 | /* Class = "NSButtonCell"; title = "Automatically download and install updates in the future"; ObjectID = "175"; */ 18 | "175.title" = "Automatically download and install updates in the future"; 19 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/en.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- 1 | 2 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "43"; */ 3 | "43.title" = "Text Cell"; 4 | 5 | /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "45"; */ 6 | "45.title" = "Text Cell"; 7 | 8 | /* Class = "NSButtonCell"; title = "Check Automatically"; ObjectID = "176"; */ 9 | "176.title" = "Check Automatically"; 10 | 11 | /* Class = "NSButtonCell"; title = "Don’t Check"; ObjectID = "177"; */ 12 | "177.title" = "Don’t Check"; 13 | 14 | /* Class = "NSTextFieldCell"; title = "Check for updates automatically?"; ObjectID = "178"; */ 15 | "178.title" = "Check for updates automatically?"; 16 | 17 | /* Class = "NSTextFieldCell"; title = "DO NOT LOCALIZE"; ObjectID = "179"; */ 18 | "179.title" = "DO NOT LOCALIZE"; 19 | 20 | /* Class = "NSButtonCell"; title = "Include anonymous system profile"; ObjectID = "180"; */ 21 | "180.title" = "Include anonymous system profile"; 22 | 23 | /* Class = "NSTextFieldCell"; title = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; ObjectID = "183"; */ 24 | "183.title" = "Anonymous system profile information is used to help us plan future development work. Please contact us if you have any questions about this.\n\nThis is the information that would be sent:"; 25 | -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/es.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/fr.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/it.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_CN.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUAutomaticUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdateAlert.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/SUUpdatePermissionPrompt.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Resources/zh_TW.lproj/Sparkle.strings -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/A/Sparkle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_frameworks/Sparkle.framework/Versions/A/Sparkle -------------------------------------------------------------------------------- /Itsycal/_frameworks/Sparkle.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Itsycal/_psd/btnDel.acorn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_psd/btnDel.acorn -------------------------------------------------------------------------------- /Itsycal/_psd/btnDel@2x.acorn: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_psd/btnDel@2x.acorn -------------------------------------------------------------------------------- /Itsycal/_psd/delete.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_psd/delete.psd -------------------------------------------------------------------------------- /Itsycal/_psd/delete@2x.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_psd/delete@2x.psd -------------------------------------------------------------------------------- /Itsycal/_sketch/AppIcon.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/AppIcon.sketch -------------------------------------------------------------------------------- /Itsycal/_sketch/btns.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/btns.sketch -------------------------------------------------------------------------------- /Itsycal/_sketch/menubaricon.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/menubaricon.sketch -------------------------------------------------------------------------------- /Itsycal/_sketch/move.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/move.sketch -------------------------------------------------------------------------------- /Itsycal/_sketch/nav.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/nav.sketch -------------------------------------------------------------------------------- /Itsycal/_sketch/prefs.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/_sketch/prefs.sketch -------------------------------------------------------------------------------- /Itsycal/_translations/README.txt: -------------------------------------------------------------------------------- 1 | The Itsycal directory contains .xliff files exported from 2 | Xcode and then filled in with appropriate translations. 3 | The files were then imported back to Xcode. 4 | 5 | To export, navigate to the project and then choose 6 | Editor > Export For Localization... 7 | 8 | Edit the file and then to import choose 9 | Editor > Import Localizations... 10 | 11 | I used the Counterparts Lite.app to edit the xliff's. 12 | -------------------------------------------------------------------------------- /Itsycal/beep.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sfsam/Itsycal/d31c5959d44f56eeeed74e0615607f94c91513c9/Itsycal/beep.mp3 -------------------------------------------------------------------------------- /Itsycal/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSAppleEventsUsageDescription" = "Itsycal verwendet AppleEvents, um Ihre Kalenderanwendung für den ausgewählten Tag zu öffnen. Sie können diese Einstellung in den Systemeinstellungen › Sicherheit › Privatsphäre."; 2 | 3 | "NSCalendarsUsageDescription" = "Itsycal ist nützlich, wenn es Ereignisse aus Ihrem Kalender angezeigt werden können. Sie können diese Einstellung in den Systemeinstellungen › Sicherheit › Privatsphäre."; 4 | -------------------------------------------------------------------------------- /Itsycal/de.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | /* No Localized Strings */ -------------------------------------------------------------------------------- /Itsycal/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSAppleEventsUsageDescription" = "Itsycal utiliza AppleEvents para abrir la aplicación de calendario en el día seleccionado. Puede cambiar esta configuración en Preferencias del Sistema › Seguridad y privacidad › Privacidad."; 2 | 3 | "NSCalendarsUsageDescription" = "Itsycal es más útil cuando se puede mostrar eventos de su calendario. Puede cambiar esta configuración en Preferencias del Sistema › Seguridad y privacidad › Privacidad."; 4 | -------------------------------------------------------------------------------- /Itsycal/es.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | /* No Localized Strings */ -------------------------------------------------------------------------------- /Itsycal/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSAppleEventsUsageDescription" = "Itsycal utilise AppleEvents pour ouvrir votre application calendrier au jour sélectionné. Vous pouvez modifier ce paramètre dans les Préférences Système › Sécurité et confidentialité › Confidentialité."; 2 | 3 | "NSCalendarsUsageDescription" = "Itsycal est plus utile quand il peut afficher les événements de vos calendriers. Vous pouvez modifier ce paramètre dans les Préférences Système › Sécurité et confidentialité › Confidentialité."; 4 | -------------------------------------------------------------------------------- /Itsycal/fr.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | /* No Localized Strings */ -------------------------------------------------------------------------------- /Itsycal/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSAppleEventsUsageDescription" = "Itsycal usa AppleEvents per aprire la tua app del calendario al giorno selezionato. È possibile modificare questa impostazione in Preferenze di Sistema › Sicurezza e Privacy › Privacy."; 2 | 3 | "NSCalendarsUsageDescription" = "Itsycal è più utile quando è in grado di visualizzare eventi dai calendari. È possibile modificare questa impostazione in Preferenze di Sistema › Sicurezza e Privacy › Privacy."; 4 | -------------------------------------------------------------------------------- /Itsycal/it.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | /* No Localized Strings */ -------------------------------------------------------------------------------- /Itsycal/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Moon 4 | // 5 | // Created by Sanjay Madan on 2/4/15. 6 | // Copyright (c) 2015 mowglii.com. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | int main(int argc, const char * argv[]) { 12 | return NSApplicationMain(argc, argv); 13 | } 14 | -------------------------------------------------------------------------------- /Itsycal/zh-Hans.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | "NSAppleEventsUsageDescription" = "Itsycal 使用 AppleEvents 打开您的日历应用程序到选定日期。 你可以在 “系统偏好设置>安全隐私>隐私” 中更改此设置。"; 2 | 3 | "NSCalendarsUsageDescription" = "当 Itsycal 可以显示你的日历中的事件时会更好用。 你可以在 “系统偏好设置>安全隐私>隐私” 中更改此设置。"; 4 | -------------------------------------------------------------------------------- /Itsycal/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | "1 day" = "1 天"; 2 | "1 day before" = "1 天前"; 3 | "1 day before (9 AM)" = "1 天前(上午9时)"; 4 | "1 hour before" = "1 小时前"; 5 | "1 week before" = "1 周前"; 6 | "2 days" = "2 天"; 7 | "2 days before" = "2 天前"; 8 | "2 days before (9 AM)" = "2 天前(上午9时)"; 9 | "2 hours before" = "2 小时前"; 10 | "3 days" = "3 天"; 11 | "4 days" = "4 天"; 12 | "5 days" = "5 天"; 13 | "5 minutes before" = "5 分钟前"; 14 | "6 days" = "6 天"; 15 | "7 days" = "7 天"; 16 | "10 minutes before" = "10 分钟前"; 17 | "14 days" = "14 天"; 18 | "15 minutes before" = "15 分钟前"; 19 | "30 minutes before" = "30 分钟前"; 20 | "31 days" = "31 天"; 21 | "About Itsycal" = "关于 Itsycal"; 22 | /* About prefs tab label */ 23 | "About" = "关于"; 24 | "Add Location or Video Call" = "添加位置或视频通话"; 25 | "Add Notes" = "添加注释"; 26 | "Add URL" = "添加 URL"; 27 | "Alert:" = "警告:"; 28 | "All-day:" = "全天:"; 29 | /* Appearance prefs tab label */ 30 | "Appearance" = "外观"; 31 | "Are you sure you want to delete this event?" = "你确定要删除此事件吗?"; 32 | "At time of event" = "在事件开始时"; 33 | "Automatically check for updates" = "自动检查更新"; 34 | "Beep beep on the hour" = "整点报时"; 35 | "Calendar" = "日历"; 36 | "Calendar access denied. 37 | 38 | Itsycal is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy" = "日历访问被拒绝。 39 | 40 | 当 Itsycal 可以显示你的日历事件时会更好用。你可以在 “系统偏好设置>安全隐私>隐私” 中更改此设置。"; 41 | "Calendar access was denied." = "日历访问被拒绝。"; 42 | "Cancel" = "取消"; 43 | "Check for Updates…" = "检查更新…"; 44 | "Copy" = "复制"; 45 | /* Dark theme name */ 46 | "Dark" = "深色"; 47 | "Date & Time…" = "日期与时间…"; 48 | "Datetime pattern" = "日期时间模式"; 49 | "Delete" = "删除"; 50 | "Delete All Future Events" = "删除所有未来事件"; 51 | "Delete Only This Event" = "仅删除此事件"; 52 | "Delete This Event" = "删除此事件"; 53 | "Do you want to delete this and all future occurrences of this event, or only the selected occurrence?" = "要删除此事件以及将来发生的事件,还是只删除所选的事件?"; 54 | "Donate" = "捐"; 55 | "End Repeat:" = "结束重复:"; 56 | "Ends:" = "结束时间:"; 57 | "Event list shows:" = "显示事件列表:"; 58 | "Every %zd Days" = "每 %zd 天"; 59 | "Every %zd Months" = "每 %zd 月"; 60 | "Every %zd Weeks" = "每 %zd 周"; 61 | "Every %zd Years" = "每 %zd 年"; 62 | "Every Day" = "每天"; 63 | "Every Month" = "每月"; 64 | "Every Week" = "每周"; 65 | "Every Year" = "每年"; 66 | "First day of week:" = "星期开始于:"; 67 | "Follow" = "Follow"; 68 | "Friday" = "星期五"; 69 | /* General prefs tab label */ 70 | "General" = "通用"; 71 | "Go to Date…" = "前往日期…"; 72 | "Go to date" = "前往日期"; 73 | "Help" = "帮助"; 74 | "Help…" = "帮助…"; 75 | "Hide icon" = "隐藏图标"; 76 | "Highlight:" = "高亮:"; 77 | "Itsycal cannot create a new event unless there is at least one calendar you have permission to modify." = "除非有至少一个有权限修改的日历,否则 Itsycal 无法创建新事件。"; 78 | "Itsycal is more useful when you allow it to add events to your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "当你允许 Itsycal 将事件添加到你的日历中时会更好用。 你可以在 “系统偏好设置>安全隐私>隐私” 中更改此设置。"; 79 | "Itsycal must be run from the Applications folder in order to work properly. 80 | 81 | Please quit Itsycal, move it to the Applications folder, and relaunch." = "必须从应用程序文件夹运行 Itsycal 才能正常工作。 82 | 83 | 请退出 Itsycal,将其移动到应用程序文件夹,然后重新启动。"; 84 | "Keyboard shortcut" = "键盘快捷键"; 85 | "Launch at login" = "登录时启动"; 86 | /* Light theme name */ 87 | "Light" = "浅色"; 88 | "Menu Bar" = "菜单栏"; 89 | "Monday" = "星期一"; 90 | "Move Itsycal to the Applications folder" = "将 Itsycal 移动到应用程序文件夹"; 91 | /* Repeat ends never */ 92 | "Never" = "从不"; 93 | "New Event" = "新事件"; 94 | "New Event ⌘N" = "新事件 ⌘N"; 95 | "No events" = "不显示"; 96 | /* Alert none 97 | Repeat none */ 98 | "None" = "无"; 99 | "On Date" = "时间到了"; 100 | "On day of event (9 AM)" = "日程发生当天(上午9时)"; 101 | "Open Calendar" = "打开日历"; 102 | "Open Calendar ⌘O" = "打开日历 ⌘O"; 103 | "Options" = "选项"; 104 | "or" = "or"; 105 | "Pin Itsycal P" = "固定 Itsycal P"; 106 | "Preferences…" = "偏好设置…"; 107 | "Quit Itsycal" = "退出 Itsycal"; 108 | "Repeat:" = "重复:"; 109 | "Saturday" = "星期六"; 110 | "Settings…" = "设置…"; 111 | "Save Event" = "保存事件"; 112 | "Show calendar weeks" = "显示日历周"; 113 | "Show day of week in icon" = "在图标中显示星期几"; 114 | "Show days with no events" = "显示没有活动的日子"; 115 | "Show event dots" = "显示事件圆点"; 116 | "Show event location" = "显示事件位置"; 117 | "Show month in icon" = "在图标中显示月份"; 118 | "Starts:" = "开始:"; 119 | "Sunday" = "星期天"; 120 | /* System theme name */ 121 | "System" = "系统"; 122 | /* Alert box message when we fail to launch the Calendar application */ 123 | "The Calendar application could not be found." = "找不到日历应用程序。"; 124 | "Theme:" = "主题:"; 125 | "There are no modifiable calendars." = "没有可修改的日历。"; 126 | "Thursday" = "星期四"; 127 | "Tuesday" = "星期二"; 128 | "Use colored dots" = "使用彩色圆点"; 129 | "Wednesday" = "星期三"; 130 | "You're deleting an event." = "你正在删除事件。"; 131 | /* Spanning event ends */ 132 | "ends" = "结束时间"; 133 | -------------------------------------------------------------------------------- /Itsycal/zh-Hans.lproj/MainMenu.strings: -------------------------------------------------------------------------------- 1 | /* No Localized Strings */ -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 Sanjay Madan 3 | 4 | Permission is hereby granted, free of charge, to any person 5 | obtaining a copy of this software and associated documentation 6 | files (the "Software"), to deal in the Software without 7 | restriction, including without limitation the rights to use, 8 | copy, modify, merge, publish, distribute, sublicense, and/or 9 | sell copies of the Software, and to permit persons to whom the 10 | Software is furnished to do so, subject to the following 11 | conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 18 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 20 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 21 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 | OTHER DEALINGS IN THE SOFTWARE. 24 | 25 | -------------------------------------------------------------------------------- /README.txt: -------------------------------------------------------------------------------- 1 | 2 | I've learned a lot by looking at other people's code so 3 | maybe someone can learn something from looking at mine. 4 | 5 | = = = = = = = = 6 | 7 | Itsycal is a tiny calendar for your Mac's menu bar. 8 | 9 | If you want, it will display your calendar events as a 10 | companion to the Mac Calendar app. You can also create 11 | and delete (but not edit) events. 12 | 13 | For more info, see: http://www.mowglii.com/itsycal 14 | 15 | MIT Licensed - see License file 16 | -------------------------------------------------------------------------------- /make_zips_and_appcast.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | GREEN="\033[0;32m" 4 | RED="\033[0;31m" 5 | NC="\033[0m" # No Color 6 | 7 | # If Itsycal.app is not found on the Desktop, quit. 8 | APP_PATH="${HOME}/Desktop/Itsycal.app" 9 | if [ ! -d "${APP_PATH}" ] 10 | then 11 | echo "\n" 12 | echo " + ${RED}NOT FOUND:${NC} ${APP_PATH}" 13 | echo " + Export notarized Itsycal.app to Desktop." 14 | echo " + See BUILD.md for instructions." 15 | echo "\n" 16 | exit 1 17 | fi 18 | 19 | # Get the bundle version from the plist. 20 | PLIST_FILE="${APP_PATH}/Contents/Info.plist" 21 | VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${PLIST_FILE}) 22 | SHORT_VERSION_STRING=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${PLIST_FILE}) 23 | 24 | # Set up file names and paths. 25 | ZIP_NAME="Itsycal-${SHORT_VERSION_STRING}.zip" 26 | ZIP_NAME=${ZIP_NAME// /-} 27 | DEST_DIR="${HOME}/Desktop/Itsycal-${SHORT_VERSION_STRING}" 28 | XML_PATH="${DEST_DIR}/itsycal.xml" 29 | ZIP_PATH1="${DEST_DIR}/${ZIP_NAME}" 30 | ZIP_PATH2="${DEST_DIR}/Itsycal.zip" 31 | 32 | # Run some diagnostics so we can see all is ok." 33 | echo "" 34 | ( set -x; spctl -vvv --assess --type exec ${APP_PATH} ) 35 | echo "" 36 | ( set -x; codesign -vvv --deep --strict ${APP_PATH} ) 37 | echo "" 38 | ( set -x; codesign -dvv ${APP_PATH} ) 39 | 40 | echo "" 41 | echo "Making zips and appcast for ${GREEN}${SHORT_VERSION_STRING} (${VERSION})${NC}..." 42 | 43 | # Make output dir (if necessary) and clear its contents. 44 | rm -frd "${DEST_DIR}" 45 | mkdir -p "${DEST_DIR}" 46 | 47 | # Compress Itsycal.app and make a copy without version suffix. 48 | ditto -c -k --sequesterRsrc --keepParent "${APP_PATH}" "${ZIP_PATH1}" 49 | cp "${ZIP_PATH1}" "${ZIP_PATH2}" 50 | 51 | # Get EdDSA signature (with private key in Keychain) and file size. 52 | EDDSA_AND_FILESIZE=$(../Sparkle-1.27.1/bin/sign_update "${ZIP_PATH1}") 53 | 54 | # On error, sign_update returns a message starting with "ERROR". 55 | if [[ ${EDDSA_AND_FILESIZE} == ERROR* ]] 56 | then 57 | echo 58 | echo "${RED}${EDDSA_AND_FILESIZE}${NC}" 59 | echo 60 | exit 1 61 | fi 62 | 63 | DATE=$(TZ=GMT date) 64 | 65 | # Make the Sparkle appcast XML file. 66 | cat > "${XML_PATH}" < 68 | 72 | 73 | Itsycal Release Notes 74 | https://s3.amazonaws.com/itsycal/itsycal.xml 75 | Most recent changes 76 | en 77 | 78 | Version ${SHORT_VERSION_STRING} 79 | 11.0 80 | https://itsycal.s3.amazonaws.com/releasenotes.html 81 | ${DATE} +0000 82 | 88 | 89 | 90 | 91 | EOF 92 | 93 | echo "Done!" 94 | echo "" 95 | 96 | open -R "${DEST_DIR}/itsycal.xml" 97 | 98 | --------------------------------------------------------------------------------