2
0

Dismiss popdown on sign out, fuel check date not recorded, avatar improvements.

This commit is contained in:
Maarten Billemont 2014-09-28 10:05:36 -04:00
parent 8c3dfc8510
commit 5e8810c535
6 changed files with 257 additions and 209 deletions

View File

@ -44,7 +44,7 @@
<key>2FE140B36B7D26140DC8D5E5C639DC5900EFCF35</key> <key>2FE140B36B7D26140DC8D5E5C639DC5900EFCF35</key>
<string>../External/Pearl/External/uicolor-utilities</string> <string>../External/Pearl/External/uicolor-utilities</string>
<key>304AD0F97EA7B4893D91DFB8C3413D4E627B9472</key> <key>304AD0F97EA7B4893D91DFB8C3413D4E627B9472</key>
<string>../External/KCOrderedAccessorFix/</string> <string>../External/KCOrderedAccessorFix</string>
<key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key> <key>3E67FB08419C920516AAC3B00DAAF23073B8CF77</key>
<string>../External/RHStatusItemView</string> <string>../External/RHStatusItemView</string>
<key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key> <key>4DDCFFD91B41F00326AD14553BD66CFD366ABD91</key>

View File

@ -132,6 +132,8 @@ PearlAssociatedObjectProperty( NSMutableArray*, ProductObservers, productObserve
float currentFuel = [[MPiOSConfig get].developmentFuel floatValue]; float currentFuel = [[MPiOSConfig get].developmentFuel floatValue];
float purchasedFuel = transaction.payment.quantity / MP_FUEL_HOURLY_RATE; float purchasedFuel = transaction.payment.quantity / MP_FUEL_HOURLY_RATE;
[MPiOSConfig get].developmentFuel = @(currentFuel + purchasedFuel); [MPiOSConfig get].developmentFuel = @(currentFuel + purchasedFuel);
if (![MPiOSConfig get].developmentFuelChecked || !currentFuel)
[MPiOSConfig get].developmentFuelChecked = [NSDate date];
} }
[[NSUserDefaults standardUserDefaults] setObject:transaction.transactionIdentifier [[NSUserDefaults standardUserDefaults] setObject:transaction.transactionIdentifier
forKey:transaction.payment.productIdentifier]; forKey:transaction.payment.productIdentifier];

View File

@ -214,18 +214,20 @@ const long MPAvatarAdd = 10000;
switch (self.mode) { switch (self.mode) {
case MPAvatarModeLowered: { case MPAvatarModeLowered: {
[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height]; [self.avatarSizeConstraint updateConstant:
self.avatarImageView.image.size.height * (self.visibility * 0.3f + 0.7f)];
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultLow];
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow];
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow];
self.nameContainer.alpha = self.visibility; self.nameContainer.alpha = self.visibility;
self.nameContainer.backgroundColor = [UIColor clearColor]; self.nameContainer.backgroundColor = [UIColor clearColor];
self.avatarImageView.alpha = self.visibility / 0.7f + 0.3f; self.avatarImageView.alpha = self.visibility * 0.7f + 0.3f;
self.avatarImageView.layer.shadowRadius = 15 * self.visibility * self.visibility; self.avatarImageView.layer.shadowRadius = 15 * self.visibility * self.visibility;
break; break;
} }
case MPAvatarModeRaisedButInactive: { case MPAvatarModeRaisedButInactive: {
[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height]; [self.avatarSizeConstraint updateConstant:
self.avatarImageView.image.size.height * (self.visibility * 0.7f + 0.3f)];
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh]; [self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh];
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow];
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultLow];
@ -236,7 +238,8 @@ const long MPAvatarAdd = 10000;
break; break;
} }
case MPAvatarModeRaisedAndActive: { case MPAvatarModeRaisedAndActive: {
[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height]; [self.avatarSizeConstraint updateConstant:
self.avatarImageView.image.size.height * (self.visibility * 0.7f + 0.3f)];
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh]; [self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh];
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow];
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh]; [self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh];
@ -247,7 +250,8 @@ const long MPAvatarAdd = 10000;
break; break;
} }
case MPAvatarModeRaisedAndHidden: { case MPAvatarModeRaisedAndHidden: {
[self.avatarSizeConstraint updateConstant:self.avatarImageView.image.size.height]; [self.avatarSizeConstraint updateConstant:
self.avatarImageView.image.size.height * (self.visibility * 0.7f + 0.3f)];
[self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh]; [self.avatarRaisedConstraint updatePriority:UILayoutPriorityDefaultHigh];
[self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow]; [self.avatarToTopConstraint updatePriority:UILayoutPriorityDefaultLow];
[self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh]; [self.nameToCenterConstraint updatePriority:UILayoutPriorityDefaultHigh];

View File

@ -1,12 +1,12 @@
/** /**
* Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com) * Copyright Maarten Billemont (http://www.lhunath.com, lhunath@lyndir.com)
* *
* See the enclosed file LICENSE for license information (LGPLv3). If you did * See the enclosed file LICENSE for license information (LGPLv3). If you did
* not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt * not receive this file, see http://www.gnu.org/licenses/lgpl-3.0.txt
* *
* @author Maarten Billemont <lhunath@lyndir.com> * @author Maarten Billemont <lhunath@lyndir.com>
* @license http://www.gnu.org/licenses/lgpl-3.0.txt * @license http://www.gnu.org/licenses/lgpl-3.0.txt
*/ */
// //
// MPPopdownSegue.h // MPPopdownSegue.h
@ -22,6 +22,8 @@
@implementation MPPopdownSegue { @implementation MPPopdownSegue {
} }
static char UnwindingObserverKey;
- (void)perform { - (void)perform {
MPPasswordsViewController *passwordsVC; MPPasswordsViewController *passwordsVC;
@ -35,17 +37,30 @@
[passwordsVC addChildViewController:popdownVC]; [passwordsVC addChildViewController:popdownVC];
[passwordsVC.popdownContainer addSubview:popdownView]; [passwordsVC.popdownContainer addSubview:popdownView];
[passwordsVC.popdownContainer addConstraintsWithVisualFormats:@[ @"H:|[popdownView]|", @"V:|[popdownView]|" ] options:0 [passwordsVC.popdownContainer addConstraintsWithVisualFormats:@[ @"H:|[popdownView]|", @"V:|[popdownView]|" ] options:0
metrics:nil views:NSDictionaryOfVariableBindings(popdownView)]; metrics:nil views:NSDictionaryOfVariableBindings( popdownView )];
[UIView animateWithDuration:0.3f animations:^{ [UIView animateWithDuration:0.3f animations:^{
[[passwordsVC.popdownToTopConstraint updatePriority:1] layoutIfNeeded]; [[passwordsVC.popdownToTopConstraint updatePriority:1] layoutIfNeeded];
} completion:^(BOOL finished) { } completion:^(BOOL finished) {
[popdownVC didMoveToParentViewController:passwordsVC]; [popdownVC didMoveToParentViewController:passwordsVC];
id<NSObject> observer = [[NSNotificationCenter defaultCenter] addObserverForName:MPSignedOutNotification object:nil
queue:[NSOperationQueue mainQueue] usingBlock:
^(NSNotification *note) {
[[[MPPopdownSegue alloc] initWithIdentifier:@"unwind-popdown" source:popdownVC
destination:passwordsVC] perform];
}];
objc_setAssociatedObject( popdownVC, &UnwindingObserverKey, observer, OBJC_ASSOCIATION_RETAIN );
}]; }];
} }
else if ([self.destinationViewController isKindOfClass:[MPPasswordsViewController class]]) { else {
popdownVC = self.sourceViewController; popdownVC = self.sourceViewController;
passwordsVC = self.destinationViewController; for (passwordsVC = self.sourceViewController; passwordsVC && ![(id)passwordsVC isKindOfClass:[MPPasswordsViewController class]];
passwordsVC = (id)passwordsVC.parentViewController);
NSAssert( passwordsVC, @"Couldn't find passwords VC to pop back to." );
[[NSNotificationCenter defaultCenter] removeObserver:objc_getAssociatedObject( popdownVC, &UnwindingObserverKey )];
objc_setAssociatedObject( popdownVC, &UnwindingObserverKey, nil, OBJC_ASSOCIATION_RETAIN );
[popdownVC willMoveToParentViewController:nil]; [popdownVC willMoveToParentViewController:nil];
[UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionOverrideInheritedDuration animations:^{ [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionOverrideInheritedDuration animations:^{

View File

@ -220,10 +220,12 @@ PearlEnum( MPDevelopmentFuelConsumption,
CGFloat weeklyFuelConsumption = [self weeklyFuelConsumption]; /* consume x fuel / week */ CGFloat weeklyFuelConsumption = [self weeklyFuelConsumption]; /* consume x fuel / week */
CGFloat fuel = [[MPiOSConfig get].developmentFuel floatValue]; /* x fuel left */ CGFloat fuel = [[MPiOSConfig get].developmentFuel floatValue]; /* x fuel left */
NSTimeInterval fuelSecondsElapsed = [[MPiOSConfig get].developmentFuelChecked timeIntervalSinceNow]; NSDate *now = [NSDate date];
if (fuelSecondsElapsed > 3600) { NSTimeInterval fuelSecondsElapsed = [[MPiOSConfig get].developmentFuelChecked timeIntervalSinceDate:now];
if (fuelSecondsElapsed > 3600 || ![MPiOSConfig get].developmentFuelChecked) {
NSTimeInterval weeksElapsed = fuelSecondsElapsed / (3600 * 24 * 7 /* 1 week */); /* x weeks elapsed */ NSTimeInterval weeksElapsed = fuelSecondsElapsed / (3600 * 24 * 7 /* 1 week */); /* x weeks elapsed */
fuel -= weeklyFuelConsumption * weeksElapsed; fuel -= weeklyFuelConsumption * weeksElapsed;
[MPiOSConfig get].developmentFuelChecked = now;
[MPiOSConfig get].developmentFuel = @(fuel); [MPiOSConfig get].developmentFuel = @(fuel);
} }

View File

@ -1632,9 +1632,15 @@
<view key="view" contentMode="scaleToFill" id="GiS-3g-cDj" userLabel="Root"> <view key="view" contentMode="scaleToFill" id="GiS-3g-cDj" userLabel="Root">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<subviews>
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" keyboardDismissMode="onDrag" translatesAutoresizingMaskIntoConstraints="NO" id="gRG-Ys-94p">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="whU-l0-2bU" userLabel="Content">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<subviews> <subviews>
<view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1lc-e7-Qme" userLabel="Emergency Generator"> <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="1lc-e7-Qme" userLabel="Emergency Generator">
<rect key="frame" x="20" y="28" width="335" height="387"/> <rect key="frame" x="20" y="140" width="335" height="387"/>
<subviews> <subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Emergency Generator" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="4Lh-s0-Dbt"> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" text="Emergency Generator" textAlignment="center" lineBreakMode="tailTruncation" minimumFontSize="10" translatesAutoresizingMaskIntoConstraints="NO" id="4Lh-s0-Dbt">
<rect key="frame" x="20" y="20" width="295" height="21.5"/> <rect key="frame" x="20" y="20" width="295" height="21.5"/>
@ -1750,7 +1756,7 @@
</state> </state>
</button> </button>
<activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="4sN-hm-xio"> <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" hidesWhenStopped="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="4sN-hm-xio">
<rect key="frame" x="149.5" y="329" width="37" height="37"/> <rect key="frame" x="149" y="329" width="37" height="37"/>
</activityIndicatorView> </activityIndicatorView>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XapaNuwjFihn6$" textAlignment="center" lineBreakMode="clip" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bHR-he-dnZ" userLabel="Password Label"> <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="XapaNuwjFihn6$" textAlignment="center" lineBreakMode="clip" baselineAdjustment="alignBaselines" minimumFontSize="10" adjustsLetterSpacingToFitWidth="YES" translatesAutoresizingMaskIntoConstraints="NO" id="bHR-he-dnZ" userLabel="Password Label">
<rect key="frame" x="20" y="328" width="295" height="39"/> <rect key="frame" x="20" y="328" width="295" height="39"/>
@ -1764,7 +1770,7 @@
</connections> </connections>
</label> </label>
<view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="beo-cJ-jIn" userLabel="View - Content Tip"> <view userInteractionEnabled="NO" alpha="0.0" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="beo-cJ-jIn" userLabel="View - Content Tip">
<rect key="frame" x="62.5" y="287.5" width="210" height="60"/> <rect key="frame" x="62" y="287.5" width="210" height="60"/>
<subviews> <subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="nyL-cO-aPa"> <imageView userInteractionEnabled="NO" contentMode="scaleToFill" image="tip_basic_black.png" translatesAutoresizingMaskIntoConstraints="NO" id="nyL-cO-aPa">
<rect key="frame" x="0.0" y="0.0" width="210" height="60"/> <rect key="frame" x="0.0" y="0.0" width="210" height="60"/>
@ -1830,15 +1836,34 @@
</constraints> </constraints>
</view> </view>
</subviews> </subviews>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailing" secondItem="1lc-e7-Qme" secondAttribute="trailing" constant="20" id="3uy-Oe-UJN"/>
<constraint firstAttribute="centerY" secondItem="1lc-e7-Qme" secondAttribute="centerY" id="7l6-Zh-2sE"/>
<constraint firstItem="1lc-e7-Qme" firstAttribute="leading" secondItem="whU-l0-2bU" secondAttribute="leading" constant="20" id="Ohp-zK-9br"/>
</constraints>
</view>
</subviews>
<constraints>
<constraint firstItem="whU-l0-2bU" firstAttribute="top" secondItem="gRG-Ys-94p" secondAttribute="top" id="590-rU-iPu"/>
<constraint firstAttribute="bottom" secondItem="whU-l0-2bU" secondAttribute="bottom" id="dgj-X4-x1C"/>
<constraint firstAttribute="trailing" secondItem="whU-l0-2bU" secondAttribute="trailing" id="lO8-zF-kFS"/>
<constraint firstItem="whU-l0-2bU" firstAttribute="leading" secondItem="gRG-Ys-94p" secondAttribute="leading" id="rcj-o6-Y9s"/>
</constraints>
</scrollView>
</subviews>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<constraints> <constraints>
<constraint firstItem="1lc-e7-Qme" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" constant="20" symbolic="YES" id="04d-tv-W4S"/> <constraint firstAttribute="height" secondItem="whU-l0-2bU" secondAttribute="height" id="4oQ-JI-wQv"/>
<constraint firstAttribute="trailing" secondItem="1lc-e7-Qme" secondAttribute="trailing" constant="20" symbolic="YES" id="5af-wt-tGJ"/> <constraint firstAttribute="width" secondItem="whU-l0-2bU" secondAttribute="width" id="AiQ-LE-3bh"/>
<constraint firstItem="IV3-lc-Fnf" firstAttribute="top" secondItem="gRG-Ys-94p" secondAttribute="bottom" id="IMb-wl-Eeb"/>
<constraint firstAttribute="trailing" secondItem="gRG-Ys-94p" secondAttribute="trailing" id="Pb1-eY-0FG"/>
<constraint firstAttribute="trailing" secondItem="GiS-3g-cDj" secondAttribute="trailing" id="TjK-B6-KoI"/> <constraint firstAttribute="trailing" secondItem="GiS-3g-cDj" secondAttribute="trailing" id="TjK-B6-KoI"/>
<constraint firstAttribute="top" secondAttribute="top" id="Zzd-AD-1X5"/> <constraint firstAttribute="top" secondAttribute="top" id="Zzd-AD-1X5"/>
<constraint firstAttribute="leading" secondAttribute="leading" id="bk6-yS-CW5"/> <constraint firstAttribute="leading" secondAttribute="leading" id="bk6-yS-CW5"/>
<constraint firstItem="1lc-e7-Qme" firstAttribute="top" secondItem="cmU-lf-Fxd" secondAttribute="bottom" constant="8" id="mhg-9h-rmE"/> <constraint firstItem="gRG-Ys-94p" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="top" id="oyk-Xr-zTZ"/>
<constraint firstItem="IV3-lc-Fnf" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="bottom" id="t22-RN-Hm0"/> <constraint firstItem="IV3-lc-Fnf" firstAttribute="top" secondItem="GiS-3g-cDj" secondAttribute="bottom" id="t22-RN-Hm0"/>
<constraint firstItem="gRG-Ys-94p" firstAttribute="leading" secondItem="GiS-3g-cDj" secondAttribute="leading" id="zhC-jf-5dY"/>
</constraints> </constraints>
<userDefinedRuntimeAttributes> <userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/> <userDefinedRuntimeAttribute type="boolean" keyPath="ignoreTouches" value="YES"/>