|
@@ -17,7 +17,9 @@
|
17
|
17
|
#define PREF_LIGHTS_STATE @"LightState"
|
18
|
18
|
#define PREF_LED_MODE @"LEDMode"
|
19
|
19
|
#define PREF_BRIGHTNESS @"Brightness"
|
|
20
|
+#define PREF_COLOR @"ManualColor"
|
20
|
21
|
|
|
22
|
+#define TEXT_MANUAL @"Select..."
|
21
|
23
|
#define TEXT_CPU_USAGE @"CPU Usage"
|
22
|
24
|
#define TEXT_RAM_USAGE @"RAM Usage"
|
23
|
25
|
#define TEXT_GPU_USAGE @"GPU Usage"
|
|
@@ -72,6 +74,7 @@
|
72
|
74
|
@synthesize statusItem, statusImage;
|
73
|
75
|
@synthesize staticColors, animation;
|
74
|
76
|
@synthesize serial, lastLEDMode;
|
|
77
|
+@synthesize menuItemColor;
|
75
|
78
|
|
76
|
79
|
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
|
77
|
80
|
srand((unsigned)time(NULL));
|
|
@@ -99,6 +102,11 @@
|
99
|
102
|
BOOL turnOnLights = [store boolForKey:PREF_LIGHTS_STATE];
|
100
|
103
|
NSString *lastMode = [store stringForKey:PREF_LED_MODE];
|
101
|
104
|
float brightness = [store floatForKey:PREF_BRIGHTNESS];
|
|
105
|
+ NSData *lastColorData = [store dataForKey:PREF_COLOR];
|
|
106
|
+ NSColor *lastColor = nil;
|
|
107
|
+ if (lastColorData != nil) {
|
|
108
|
+ lastColor = (NSColor *)[NSUnarchiver unarchiveObjectWithData:lastColorData];
|
|
109
|
+ }
|
102
|
110
|
|
103
|
111
|
// Prepare brightness menu
|
104
|
112
|
brightnessItem.view = brightnessSlider;
|
|
@@ -153,6 +161,16 @@
|
153
|
161
|
}
|
154
|
162
|
[menuColors addItem:item];
|
155
|
163
|
}
|
|
164
|
+ menuItemColor = [[NSMenuItem alloc] initWithTitle:TEXT_MANUAL action:@selector(setColorSelected:) keyEquivalent:@""];
|
|
165
|
+ if ([lastMode isEqualToString:TEXT_MANUAL]) {
|
|
166
|
+ if (lastColor != nil) {
|
|
167
|
+ // Restore previously set RGB color
|
|
168
|
+ [self setLightsColor:lastColor];
|
|
169
|
+ }
|
|
170
|
+ [menuItemColor setState:NSOnState];
|
|
171
|
+ }
|
|
172
|
+ [menuItemColor setTag:-1];
|
|
173
|
+ [menuColors addItem:menuItemColor];
|
156
|
174
|
|
157
|
175
|
// Prepare animations menu
|
158
|
176
|
NSArray *animationStrings = [NSArray arrayWithObjects:
|
|
@@ -308,6 +326,49 @@
|
308
|
326
|
}
|
309
|
327
|
}
|
310
|
328
|
|
|
329
|
+- (void)setLightsColor:(NSColor *)color {
|
|
330
|
+ CGFloat red, green, blue, alpha;
|
|
331
|
+ [color getRed:&red green:&green blue:&blue alpha:&alpha];
|
|
332
|
+ [self setLightsR:red * 255 G:green * 255 B:blue * 255];
|
|
333
|
+
|
|
334
|
+ // Stop previous timer setting
|
|
335
|
+ if (animation != nil) {
|
|
336
|
+ [animation invalidate];
|
|
337
|
+ animation = nil;
|
|
338
|
+ }
|
|
339
|
+
|
|
340
|
+ // Turn off all other LED menu items
|
|
341
|
+ if (menuColors != nil) {
|
|
342
|
+ for (int i = 0; i < [menuColors numberOfItems]; i++) {
|
|
343
|
+ [[menuColors itemAtIndex:i] setState:NSOffState];
|
|
344
|
+ }
|
|
345
|
+ }
|
|
346
|
+ if (menuAnimations != nil) {
|
|
347
|
+ for (int i = 0; i < [menuAnimations numberOfItems]; i++) {
|
|
348
|
+ [[menuAnimations itemAtIndex:i] setState:NSOffState];
|
|
349
|
+ }
|
|
350
|
+ }
|
|
351
|
+ if (menuVisualizations != nil) {
|
|
352
|
+ for (int i = 0; i < [menuVisualizations numberOfItems]; i++) {
|
|
353
|
+ [[menuVisualizations itemAtIndex:i] setState:NSOffState];
|
|
354
|
+ }
|
|
355
|
+ }
|
|
356
|
+ if (menuDisplays != nil) {
|
|
357
|
+ for (int i = 0; i < [menuDisplays numberOfItems]; i++) {
|
|
358
|
+ [[menuDisplays itemAtIndex:i] setState:NSOffState];
|
|
359
|
+ }
|
|
360
|
+ }
|
|
361
|
+ [buttonOff setState:NSOffState];
|
|
362
|
+ [menuItemColor setState:NSOnState];
|
|
363
|
+
|
|
364
|
+ // Store new manually selected color
|
|
365
|
+ NSUserDefaults *store = [NSUserDefaults standardUserDefaults];
|
|
366
|
+ NSData *data = [NSArchiver archivedDataWithRootObject:color];
|
|
367
|
+ [store setObject:data forKey:PREF_COLOR];
|
|
368
|
+ [store setObject:TEXT_MANUAL forKey:PREF_LED_MODE];
|
|
369
|
+ [store synchronize];
|
|
370
|
+}
|
|
371
|
+
|
311
|
372
|
- (void)setLightsR:(unsigned char)r G:(unsigned char)g B:(unsigned char)b {
|
312
|
373
|
if ([serial isOpen]) {
|
313
|
374
|
unsigned char red = r * ([brightnessSlider floatValue] / 100.0);
|
|
@@ -340,6 +401,30 @@
|
340
|
401
|
}
|
341
|
402
|
}
|
342
|
403
|
|
|
404
|
+- (void)setColorSelected:(NSMenuItem *)sender {
|
|
405
|
+ NSColorPanel *cp = [NSColorPanel sharedColorPanel];
|
|
406
|
+ [cp setTarget:self];
|
|
407
|
+ [cp setAction:@selector(colorSelected:)];
|
|
408
|
+ [cp setShowsAlpha:NO];
|
|
409
|
+ [cp setContinuous:NO];
|
|
410
|
+ [cp setMode:NSRGBModeColorPanel];
|
|
411
|
+
|
|
412
|
+ // TODO Try to restore last manually selected color
|
|
413
|
+ NSUserDefaults *store = [NSUserDefaults standardUserDefaults];
|
|
414
|
+ NSData *lastColorData = [store dataForKey:PREF_COLOR];
|
|
415
|
+ NSColor *lastColor = nil;
|
|
416
|
+ if (lastColorData != nil) {
|
|
417
|
+ lastColor = (NSColor *)[NSUnarchiver unarchiveObjectWithData:lastColorData];
|
|
418
|
+ [cp setColor:lastColor];
|
|
419
|
+ }
|
|
420
|
+
|
|
421
|
+ [[NSApplication sharedApplication] orderFrontColorPanel:cp];
|
|
422
|
+}
|
|
423
|
+
|
|
424
|
+- (void)colorSelected:(id)sender {
|
|
425
|
+ [self setLightsColor:[sender color]];
|
|
426
|
+}
|
|
427
|
+
|
343
|
428
|
- (IBAction)brightnessMoved:(NSSlider *)sender {
|
344
|
429
|
[brightnessLabel setTitle:[NSString stringWithFormat:@"Value: %.0f%%", [sender floatValue]]];
|
345
|
430
|
|
|
@@ -522,6 +607,12 @@
|
522
|
607
|
[self displayVisualization:sender];
|
523
|
608
|
}
|
524
|
609
|
|
|
610
|
+ // Check if it is the manual color select item
|
|
611
|
+ if ([sender.title isEqualToString:TEXT_MANUAL]) {
|
|
612
|
+ found = YES;
|
|
613
|
+ [self colorSelected:[NSColorPanel sharedColorPanel]];
|
|
614
|
+ }
|
|
615
|
+
|
525
|
616
|
// Check if a static color was selected
|
526
|
617
|
if ((found == NO) && (staticColors != nil)) {
|
527
|
618
|
for (NSString *key in [staticColors allKeys]) {
|