Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Brightness slider and change label dialog #6

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 18 additions & 9 deletions LIFX Menu.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
objects = {

/* Begin PBXBuildFile section */
C721034519E6BA380085E99B /* LIFXKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = C721974619E622B200FCA5CB /* LIFXKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
C721034619E6BBC30085E99B /* LIFXKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C721974619E622B200FCA5CB /* LIFXKit.framework */; };
AB0FC2B81A79F1A700D90728 /* LIFXKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C721974619E622B200FCA5CB /* LIFXKit.framework */; };
AB0FC2BA1A79F1BF00D90728 /* LIFXKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C721974619E622B200FCA5CB /* LIFXKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
AB0FC2BE1A79FDC000D90728 /* LXMSliderMenuItem.m in Sources */ = {isa = PBXBuildFile; fileRef = AB0FC2BD1A79FDC000D90728 /* LXMSliderMenuItem.m */; };
C721970919E5F79600FCA5CB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C721970819E5F79600FCA5CB /* main.m */; };
C721970C19E5F79600FCA5CB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C721970B19E5F79600FCA5CB /* AppDelegate.m */; };
C721970E19E5F79600FCA5CB /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C721970D19E5F79600FCA5CB /* Images.xcassets */; };
Expand All @@ -32,19 +33,22 @@
/* End PBXContainerItemProxy section */

/* Begin PBXCopyFilesBuildPhase section */
C721974919E622E700FCA5CB /* CopyFiles */ = {
AB0FC2BB1A79F1BF00D90728 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
C721034519E6BA380085E99B /* LIFXKit.framework in CopyFiles */,
AB0FC2BA1A79F1BF00D90728 /* LIFXKit.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */

/* Begin PBXFileReference section */
AB0FC2BC1A79FDC000D90728 /* LXMSliderMenuItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LXMSliderMenuItem.h; sourceTree = "<group>"; };
AB0FC2BD1A79FDC000D90728 /* LXMSliderMenuItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LXMSliderMenuItem.m; sourceTree = "<group>"; };
C721970319E5F79600FCA5CB /* LIFX Menu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "LIFX Menu.app"; sourceTree = BUILT_PRODUCTS_DIR; };
C721970719E5F79600FCA5CB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C721970819E5F79600FCA5CB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
Expand Down Expand Up @@ -72,7 +76,7 @@
files = (
C721975419E631FD00FCA5CB /* SystemConfiguration.framework in Frameworks */,
C721973719E5FA1200FCA5CB /* libz.dylib in Frameworks */,
C721034619E6BBC30085E99B /* LIFXKit.framework in Frameworks */,
AB0FC2B81A79F1A700D90728 /* LIFXKit.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -109,6 +113,8 @@
children = (
C721970A19E5F79600FCA5CB /* AppDelegate.h */,
C721970B19E5F79600FCA5CB /* AppDelegate.m */,
AB0FC2BC1A79FDC000D90728 /* LXMSliderMenuItem.h */,
AB0FC2BD1A79FDC000D90728 /* LXMSliderMenuItem.m */,
C721974E19E6292A00FCA5CB /* Launch at login */,
C721970D19E5F79600FCA5CB /* Images.xcassets */,
C721970F19E5F79700FCA5CB /* MainMenu.xib */,
Expand Down Expand Up @@ -176,7 +182,7 @@
C72196FF19E5F79600FCA5CB /* Sources */,
C721970019E5F79600FCA5CB /* Frameworks */,
C721970119E5F79600FCA5CB /* Resources */,
C721974919E622E700FCA5CB /* CopyFiles */,
AB0FC2BB1A79F1BF00D90728 /* Embed Frameworks */,
);
buildRules = (
);
Expand Down Expand Up @@ -216,7 +222,7 @@
TargetAttributes = {
C721970219E5F79600FCA5CB = {
CreatedOnToolsVersion = 6.0;
DevelopmentTeam = NFTL2336WY;
DevelopmentTeam = T7QSHJ836T;
};
C721971519E5F79700FCA5CB = {
CreatedOnToolsVersion = 6.0;
Expand Down Expand Up @@ -271,6 +277,7 @@
files = (
C721975319E631D400FCA5CB /* LaunchAtLoginController.m in Sources */,
C721970C19E5F79600FCA5CB /* AppDelegate.m in Sources */,
AB0FC2BE1A79FDC000D90728 /* LXMSliderMenuItem.m in Sources */,
C721970919E5F79600FCA5CB /* main.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
Expand Down Expand Up @@ -385,13 +392,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/LIFX",
Menu,
"$(PROJECT_DIR)/LIFX",
Menu,
);
INFOPLIST_FILE = "LIFX Menu/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
Expand All @@ -404,13 +412,14 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Mac Developer";
COMBINE_HIDPI_IMAGES = YES;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/LIFX",
Menu,
"$(PROJECT_DIR)/LIFX",
Menu,
);
INFOPLIST_FILE = "LIFX Menu/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
Expand Down
49 changes: 44 additions & 5 deletions LIFX Menu/AppDelegate.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
// Copyright (c) 2014 Kyle Howells. All rights reserved.
//

#import <LIFXKit/LIFXKit.h>
#import "LIFXKit.framework/Headers/LIFXKit.h"
#import "AppDelegate.h"
#import "LaunchAtLoginController.h"

#import "LXMSliderMenuItem.h"

@interface AppDelegate () <LFXLightCollectionObserver, LFXLightObserver>
@property (nonatomic, strong) NSStatusItem *statusItem;
Expand Down Expand Up @@ -102,8 +102,27 @@ -(void)toggleLight:(NSMenuItem*)item{
[light setPowerState:((light.powerState == LFXPowerStateOn) ? LFXPowerStateOff : LFXPowerStateOn)];
}

-(void)changeBrightness:(LXMSliderMenuItem *)item{
LFXLight *light = [item representedObject];
[light setColor:[[light color] colorWithBrightness:[[item slider] floatValue]]];
}


-(void)changeLabel:(NSMenuItem *)item{
LFXLight *light = [item representedObject];
NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText:@"Enter new name:"];
[alert addButtonWithTitle:@"Ok"];
[alert addButtonWithTitle:@"Cancel"];

NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)];
[input setStringValue:[light label]];

[alert setAccessoryView:input];
NSInteger button = [alert runModal];
if (button == NSAlertFirstButtonReturn) {
[light setLabel:[input stringValue]];
}
}



Expand All @@ -119,13 +138,25 @@ -(void)addLight:(LFXLight*)light{

NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[self titleForLight:light] action:@selector(toggleLight:) keyEquivalent:@""];
[item setRepresentedObject:light];

LXMSliderMenuItem *sliderItem = [[LXMSliderMenuItem alloc] initWithTitle:@"Brightness" target:self action:@selector(changeBrightness:)];
[sliderItem setRepresentedObject:light];

NSMenuItem *labelItem = [[NSMenuItem alloc] initWithTitle:@"Set label..." action:@selector(changeLabel:) keyEquivalent:@""];
[labelItem setRepresentedObject:light];

[item setSubmenu:[[NSMenu alloc] init]];
[[item submenu] addItem:sliderItem];
[[item submenu] addItem:labelItem];

[self updateLightMenuItem:item];

[self.menu insertItem:item atIndex:(self.menu.numberOfItems - 2)];
[self.lightItems addObject:item];

[light addLightObserver:self];
}

/**
* Removes the light from the menu and array. Also removes self as an observer for that light.
*/
Expand Down Expand Up @@ -158,8 +189,13 @@ -(void)updateLight:(LFXLight*)light{
-(void)updateLightMenuItem:(NSMenuItem*)item{
LFXLight *light = [item representedObject];

[item setTitle:(light.label ?: light.deviceID)];
[item setTitle:[self titleForLight:light]];
[item setState:((light.powerState == LFXPowerStateOn) ? NSOnState : NSOffState)];

LXMSliderMenuItem *sliderMenuItem = (LXMSliderMenuItem *)[[item submenu] itemWithTitle:@"Brightness"];
[[sliderMenuItem slider] setMinValue:LFXHSBKColorMinBrightness];
[[sliderMenuItem slider] setMaxValue:LFXHSBKColorMaxBrightness];
[[sliderMenuItem slider] setFloatValue:light.color.brightness];
}


Expand Down Expand Up @@ -189,6 +225,9 @@ -(void)light:(LFXLight *)light didChangeLabel:(NSString *)label{
-(void)light:(LFXLight *)light didChangePowerState:(LFXPowerState)powerState{
[self updateLight:light];
}
-(void)light:(LFXLight *)light didChangeColor:(LFXHSBKColor *)color {
[self updateLight:light];
}



Expand All @@ -212,7 +251,7 @@ -(NSMenuItem*)menuItemForLight:(LFXLight*)light{
return item;
}
-(NSString*)titleForLight:(LFXLight*)light{
return (light.label ?: light.deviceID);
return ([light.label length] > 0 ? light.label : light.deviceID);
}


Expand Down
14 changes: 14 additions & 0 deletions LIFX Menu/LXMSliderMenuItem.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//
// LXMSliderMenuItem.h
// LIFX Menu
//
// Created by Jonathan on 29/01/2015.
// Copyright (c) 2015 Kyle Howells. All rights reserved.
//

#import <Cocoa/Cocoa.h>

@interface LXMSliderMenuItem : NSMenuItem
-(instancetype)initWithTitle:(NSString *)title target:(id)target action:(SEL)aSelector;
@property (nonatomic, readonly) NSSlider *slider;
@end
40 changes: 40 additions & 0 deletions LIFX Menu/LXMSliderMenuItem.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
//
// LXMSliderMenuItem.m
// LIFX Menu
//
// Created by Jonathan on 29/01/2015.
// Copyright (c) 2015 Kyle Howells. All rights reserved.
//

#import "LXMSliderMenuItem.h"
@interface LXMSliderMenuItem ()
@property (nonatomic, strong, readwrite) NSSlider *slider;
@end

@implementation LXMSliderMenuItem
-(instancetype)initWithTitle:(NSString *)title target:(id)target action:(SEL)aSelector {
if (self = [super initWithTitle:title action:aSelector keyEquivalent:@""]) {
[self setTarget:target];

NSView *customView = [[NSView alloc] initWithFrame:NSMakeRect(10, 0, 150, 25)];
NSSlider *slider = [[NSSlider alloc] init];
[customView addSubview:slider];
[customView setAutoresizingMask:NSViewWidthSizable];
[slider setTranslatesAutoresizingMaskIntoConstraints:NO];
[customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-10-[slider]-10-|" options:0 metrics:nil views:@{@"slider" : slider}]];
[customView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[slider]|" options:0 metrics:nil views:@{@"slider" : slider}]];
[slider setTarget:self];
[slider setAction:@selector(sliderChanged:)];
[self setSlider:slider];
[self setView:customView];
}
return self;
}

-(void)sliderChanged:(NSSlider *)sender {
if ([self action] && [[self target] respondsToSelector:[self action]]) {
[[self target] performSelector:[self action] withObject:self];
}
}

@end