Native Mac OS X OtaClock replica
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

MainWindow.m 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //
  2. // MainWindow.m
  3. // OtaClock
  4. //
  5. // Created by Thomas Buck on 16.08.15.
  6. // Copyright (c) 2015 xythobuz. All rights reserved.
  7. //
  8. #import "MainWindow.h"
  9. #define RESIZE_START 1
  10. #define RESIZE_END 5
  11. #define RESIZE_STEP 1
  12. #define CONFIG_START_SCALE @"window_scale"
  13. #define CONFIG_KEEP_POSITION @"keep_position"
  14. #define CONFIG_KEEP_ON_TOP @"keep_on_top"
  15. @interface MainWindow ()
  16. @property (assign) NSSize defaultSize;
  17. @property (assign) NSInteger startScale;
  18. @property (weak) IBOutlet NSMenuItem *lockPositionItem;
  19. @property (weak) IBOutlet NSMenuItem *keepOnTopItem;
  20. @property (weak) IBOutlet NSMenuItem *changeSize1;
  21. @property (weak) IBOutlet NSMenuItem *changeSize2;
  22. @property (weak) IBOutlet NSMenuItem *changeSize3;
  23. @property (weak) IBOutlet NSMenuItem *changeSize4;
  24. @property (weak) IBOutlet NSMenuItem *changeSize5;
  25. @end
  26. @implementation MainWindow
  27. @synthesize dragStart;
  28. @synthesize keepPosition;
  29. @synthesize defaultSize;
  30. @synthesize startScale;
  31. // TODO window position should be remembered!
  32. - (id)initWithContentRect:(NSRect)contentRect
  33. styleMask:(NSUInteger)aStyle
  34. backing:(NSBackingStoreType)bufferingType
  35. defer:(BOOL)flag {
  36. self = [super initWithContentRect:contentRect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO];
  37. if (self != nil) {
  38. [self setAlphaValue:1.0];
  39. [self setOpaque:NO];
  40. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  41. // load and see if window should be kept on top
  42. if ([defaults objectForKey:CONFIG_KEEP_ON_TOP] != nil) {
  43. if ([defaults boolForKey:CONFIG_KEEP_ON_TOP]) {
  44. [self setLevel:NSFloatingWindowLevel];
  45. }
  46. }
  47. // load and see if window pos should be fixed
  48. if ([defaults objectForKey:CONFIG_KEEP_POSITION] == nil) {
  49. keepPosition = NO;
  50. } else {
  51. keepPosition = [defaults boolForKey:CONFIG_KEEP_POSITION];
  52. }
  53. // load window scale factor
  54. if ([defaults objectForKey:CONFIG_START_SCALE] == nil) {
  55. startScale = 1;
  56. } else {
  57. startScale = [defaults integerForKey:CONFIG_START_SCALE];
  58. }
  59. }
  60. return self;
  61. }
  62. - (void)setDefaultBackgroundSize:(NSSize)size {
  63. defaultSize = size;
  64. NSRect frame = [self frame];
  65. frame.size = defaultSize;
  66. frame.size.width *= startScale;
  67. frame.size.height *= startScale;
  68. // We need to do all initialization of view state in here, because they are not ready in init
  69. if (keepPosition) [self.lockPositionItem setState:NSOnState];
  70. if ([self level] == NSFloatingWindowLevel) [self.keepOnTopItem setState:NSOnState];
  71. if (startScale == 1) [self.changeSize1 setState:NSOnState];
  72. if (startScale == 2) [self.changeSize2 setState:NSOnState];
  73. if (startScale == 3) [self.changeSize3 setState:NSOnState];
  74. if (startScale == 4) [self.changeSize4 setState:NSOnState];
  75. if (startScale == 5) [self.changeSize5 setState:NSOnState];
  76. [self setFrame:frame display:YES];
  77. }
  78. - (IBAction)changeSize:(NSMenuItem *)sender {
  79. NSRect frame = [self frame];
  80. [self.changeSize1 setState:NSOffState];
  81. [self.changeSize2 setState:NSOffState];
  82. [self.changeSize3 setState:NSOffState];
  83. [self.changeSize4 setState:NSOffState];
  84. [self.changeSize5 setState:NSOffState];
  85. BOOL found = NO;
  86. for (int i = RESIZE_START; i <= RESIZE_END; i += RESIZE_STEP) {
  87. NSString *title = [NSString stringWithFormat:@"%dx", i];
  88. if ([[sender title] isEqualToString:title]) {
  89. [sender setState:NSOnState];
  90. NSSize newSize = defaultSize;
  91. newSize.height *= i;
  92. newSize.width *= i;
  93. frame.size = newSize;
  94. found = YES;
  95. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  96. [defaults setInteger:i forKey:CONFIG_START_SCALE];
  97. [defaults synchronize];
  98. }
  99. }
  100. if (found == NO) {
  101. NSLog(@"Unknown changeSize sender: %@", sender);
  102. } else {
  103. [self setFrame:frame display:YES];
  104. }
  105. }
  106. - (IBAction)lockPosition:(NSMenuItem *)sender {
  107. BOOL state = [sender state];
  108. if (state == NSOffState) {
  109. // Lock position
  110. state = NSOnState;
  111. [sender setState:state];
  112. self.keepPosition = YES;
  113. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  114. [defaults setBool:YES forKey:CONFIG_KEEP_POSITION];
  115. [defaults synchronize];
  116. } else {
  117. // Unlock position
  118. state = NSOffState;
  119. [sender setState:state];
  120. self.keepPosition = NO;
  121. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  122. [defaults setBool:NO forKey:CONFIG_KEEP_POSITION];
  123. [defaults synchronize];
  124. }
  125. }
  126. - (IBAction)keepOnTop:(NSMenuItem *)sender {
  127. BOOL state = [sender state];
  128. if (state == NSOffState) {
  129. // Keep window on top
  130. state = NSOnState;
  131. [sender setState:state];
  132. [self setLevel:NSFloatingWindowLevel];
  133. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  134. [defaults setBool:YES forKey:CONFIG_KEEP_ON_TOP];
  135. [defaults synchronize];
  136. } else {
  137. // Don't keep window on top
  138. state = NSOffState;
  139. [sender setState:state];
  140. [self setLevel:NSNormalWindowLevel];
  141. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  142. [defaults setBool:NO forKey:CONFIG_KEEP_ON_TOP];
  143. [defaults synchronize];
  144. }
  145. }
  146. - (BOOL)canBecomeKeyWindow {
  147. return YES;
  148. }
  149. - (void)mouseDown:(NSEvent *)theEvent {
  150. self.dragStart = [theEvent locationInWindow];
  151. }
  152. - (void)mouseDragged:(NSEvent *)theEvent {
  153. NSRect screenVisibleFrame = [[NSScreen mainScreen] visibleFrame];
  154. NSRect windowFrame = [self frame];
  155. NSPoint newOrigin = windowFrame.origin;
  156. if (self.keepPosition == NO) {
  157. NSPoint currentLocation = [theEvent locationInWindow];
  158. newOrigin.x += (currentLocation.x - dragStart.x);
  159. newOrigin.y += (currentLocation.y - dragStart.y);
  160. if ((newOrigin.y + windowFrame.size.height) > (screenVisibleFrame.origin.y + screenVisibleFrame.size.height)) {
  161. newOrigin.y = screenVisibleFrame.origin.y + (screenVisibleFrame.size.height - windowFrame.size.height);
  162. }
  163. [self setFrameOrigin:newOrigin];
  164. }
  165. }
  166. @end