[Libreoffice-commits] core.git: 2 commits - ios/.DS_Store ios/iosremote
Siqi LIU
me at siqi.fr
Tue Aug 6 21:49:06 PDT 2013
ios/.DS_Store |binary
ios/iosremote/.DS_Store |binary
ios/iosremote/PopoverView.h | 202 +
ios/iosremote/PopoverView.m | 1049 ++++++++++
ios/iosremote/PopoverViewCompatibility.h | 23
ios/iosremote/PopoverView_Configuration.h | 112 +
ios/iosremote/TestFlightSDK1.2.6/.DS_Store |binary
ios/iosremote/UIBarButtonItem+Theme.h | 16
ios/iosremote/UIBarButtonItem+Theme.m | 48
ios/iosremote/UINavigationController+Theme.h | 15
ios/iosremote/UINavigationController+Theme.m | 23
ios/iosremote/iPad_autosize.storyboard | 103
ios/iosremote/iosremote.xcodeproj/project.pbxproj | 94
ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate |binary
ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings | 10
ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist | 20
ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme | 86
ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist | 22
ios/iosremote/iosremote/.DS_Store |binary
ios/iosremote/iosremote/AppDelegate.m | 17
ios/iosremote/iosremote/BasePresentationViewController.h | 3
ios/iosremote/iosremote/BasePresentationViewController.m | 48
ios/iosremote/iosremote/LibONavigationController.h | 13
ios/iosremote/iosremote/LibONavigationController.m | 44
ios/iosremote/iosremote/SWRevealViewController/navBarBackground at 2x.png |binary
ios/iosremote/iosremote/UIViewController+LibOStyling.h | 15
ios/iosremote/iosremote/UIViewController+LibOStyling.m | 35
ios/iosremote/iosremote/add.png |binary
ios/iosremote/iosremote/add at 2x.png |binary
ios/iosremote/iosremote/autoDismissKeyboardNavigationViewController.h | 3
ios/iosremote/iosremote/backButton.png |binary
ios/iosremote/iosremote/backButton at 2x.png |binary
ios/iosremote/iosremote/en.lproj/.DS_Store |binary
ios/iosremote/iosremote/en.lproj/iPhone_autoSize.storyboard | 28
ios/iosremote/iosremote/gear.png |binary
ios/iosremote/iosremote/gear at 2x.png |binary
ios/iosremote/iosremote/gear_pressed.png |binary
ios/iosremote/iosremote/gear_pressed at 2x.png |binary
ios/iosremote/iosremote/gear_transparent_bg.png |binary
ios/iosremote/iosremote/gear_transparent_bg at 2x.png |binary
ios/iosremote/iosremote/iosremote-Info.plist | 2
ios/iosremote/iosremote/more_icon.png |binary
ios/iosremote/iosremote/more_icon at 2x.png |binary
ios/iosremote/iosremote/navBarButtonNormal at 2x.png |binary
ios/iosremote/iosremote/newServer_vc.h | 3
ios/iosremote/iosremote/newServer_vc.m | 19
ios/iosremote/iosremote/serverList_vc.m | 4
ios/iosremote/iosremote/slideShowPreviewTable_vc_ipad.m | 5
ios/iosremote/iosremote/slideShowPreviewTable_vc_iphone.m | 4
ios/iosremote/iosremote/slideShowSwipeInList_ipad.m | 7
ios/iosremote/iosremote/slideShow_vc_iphone.m | 49
ios/iosremote/iosremote_ipad_icon.png |binary
ios/iosremote/iosremote_ipad_icon at 2x.png |binary
ios/iosremote/iosremote_iphone_icon.png |binary
ios/iosremote/iosremote_iphone_icon at 2x.png |binary
ios/iosremote/navBarBackground.png |binary
ios/iosremote/navBarBackground at 2x.png |binary
57 files changed, 2087 insertions(+), 35 deletions(-)
New commits:
commit 735ea456719c0c27cb4ae102ccd1bc3bc93f818a
Author: Siqi LIU <me at siqi.fr>
Date: Wed Aug 7 12:37:38 2013 +0800
minor
Change-Id: I949464f042e3bb2ba1360feb6ba4867b332b8483
diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate
index 7c56597..0728360 100644
Binary files a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate and b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate differ
commit 2a5d3cbebc182f02773b7704a99dbf63bd10f5a5
Author: Siqi LIU <me at siqi.fr>
Date: Wed Aug 7 12:37:21 2013 +0800
design style revamped for iOS7
Change-Id: I469e50e779ac201ab15aa8fff8e2f6fcfb2f99b6
diff --git a/ios/.DS_Store b/ios/.DS_Store
new file mode 100644
index 0000000..6ebde5e
Binary files /dev/null and b/ios/.DS_Store differ
diff --git a/ios/iosremote/.DS_Store b/ios/iosremote/.DS_Store
new file mode 100644
index 0000000..bff21b7
Binary files /dev/null and b/ios/iosremote/.DS_Store differ
diff --git a/ios/iosremote/PopoverView.h b/ios/iosremote/PopoverView.h
new file mode 100755
index 0000000..a945e38
--- /dev/null
+++ b/ios/iosremote/PopoverView.h
@@ -0,0 +1,202 @@
+//
+// PopoverView.h
+// Embark
+//
+// Created by Oliver Rickard on 20/08/2012.
+//
+//
+
+#import <UIKit/UIKit.h>
+#import "PopoverViewCompatibility.h"
+
+
+/**************** Support both ARC and non-ARC ********************/
+
+#ifndef SUPPORT_ARC
+#define SUPPORT_ARC
+
+#if __has_feature(objc_arc_weak) //objc_arc_weak
+#define WEAK weak
+#define __WEAK __weak
+#define STRONG strong
+
+#define AUTORELEASE self
+#define RELEASE self
+#define RETAIN self
+#define CFTYPECAST(exp) (__bridge exp)
+#define TYPECAST(exp) (__bridge_transfer exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC self
+
+#elif __has_feature(objc_arc) //objc_arc
+#define WEAK unsafe_unretained
+#define __WEAK __unsafe_unretained
+#define STRONG strong
+
+#define AUTORELEASE self
+#define RELEASE self
+#define RETAIN self
+#define CFTYPECAST(exp) (__bridge exp)
+#define TYPECAST(exp) (__bridge_transfer exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC self
+
+#else //none
+#define WEAK assign
+#define __WEAK
+#define STRONG retain
+
+#define AUTORELEASE autorelease
+#define RELEASE release
+#define RETAIN retain
+#define CFTYPECAST(exp) (exp)
+#define TYPECAST(exp) (exp)
+#define CFRELEASE(exp) CFRelease(exp)
+#define DEALLOC dealloc
+
+#endif
+#endif
+
+/******************************************************************/
+
+
+ at class PopoverView;
+
+ at protocol PopoverViewDelegate <NSObject>
+
+ at optional
+
+//Delegate receives this call as soon as the item has been selected
+- (void)popoverView:(PopoverView *)popoverView didSelectItemAtIndex:(NSInteger)index;
+
+//Delegate receives this call once the popover has begun the dismissal animation
+- (void)popoverViewDidDismiss:(PopoverView *)popoverView;
+
+ at end
+
+ at interface PopoverView : UIView {
+ CGRect boxFrame;
+ CGSize contentSize;
+ CGPoint arrowPoint;
+
+ BOOL above;
+
+ __WEAK id<PopoverViewDelegate> delegate;
+
+ UIView *parentView;
+
+ UIView *topView;
+
+ NSArray *subviewsArray;
+
+ NSArray *dividerRects;
+
+ UIView *contentView;
+
+ UIView *titleView;
+
+ UIActivityIndicatorView *activityIndicator;
+
+ //Instance variable that can change at runtime
+ BOOL showDividerRects;
+}
+
+ at property (nonatomic, STRONG) UIView *titleView;
+
+ at property (nonatomic, STRONG) UIView *contentView;
+
+ at property (nonatomic, STRONG) NSArray *subviewsArray;
+
+ at property (nonatomic, WEAK) id<PopoverViewDelegate> delegate;
+
+#pragma mark - Class Static Showing Methods
+
+//These are the main static methods you can use to display the popover.
+//Simply call [PopoverView show...] with your arguments, and the popover will be generated, added to the view stack, and notify you when it's done.
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate;
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate;
+
+#pragma mark - Instance Showing Methods
+
+//Adds/animates in the popover to the top of the view stack with the arrow pointing at the "point"
+//within the specified view. The contentView will be added to the popover, and should have either
+//a clear color backgroundColor, or perhaps a rounded corner bg rect (radius 4.f if you're going to
+//round).
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)contentView;
+
+//Calls above method with a UILabel containing the text you deliver to this method.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text;
+
+//Calls top method with an array of UIView objects. This method will stack these views vertically
+//with kBoxPadding padding between each view in the y-direction.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray;
+
+//Does same as above, but adds a title label at top of the popover.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray;
+
+//Calls the viewArray method with an array of UILabels created with the strings
+//in stringArray. All contents of stringArray must be NSStrings.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray;
+
+//This method does same as above, but with a title label at the top of the popover.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray;
+
+//Draws a vertical list of the NSString elements of stringArray with UIImages
+//from imageArray placed centered above them.
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray;
+
+//Does the same as above, but with a title
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray;
+
+//Lays out the PopoverView at a point once all of the views have already been setup elsewhere
+- (void)layoutAtPoint:(CGPoint)point inView:(UIView *)view;
+
+#pragma mark - Other Interaction
+//This method animates the rotation of the PopoverView to a new point
+- (void)animateRotationToNewPoint:(CGPoint)point inView:(UIView *)view withDuration:(NSTimeInterval)duration;
+
+#pragma mark - Dismissal
+//Dismisses the view, and removes it from the view stack.
+- (void)dismiss;
+- (void)dismiss:(BOOL)animated;
+
+#pragma mark - Activity Indicator Methods
+
+//Shows the activity indicator, and changes the title (if the title is available, and is a UILabel).
+- (void)showActivityIndicatorWithMessage:(NSString *)msg;
+
+//Hides the activity indicator, and changes the title (if the title is available) to the msg
+- (void)hideActivityIndicatorWithMessage:(NSString *)msg;
+
+#pragma mark - Custom Image Showing
+
+//Animate in, and display the image provided here.
+- (void)showImage:(UIImage *)image withMessage:(NSString *)msg;
+
+#pragma mark - Error/Success Methods
+
+//Shows (and animates in) an error X in the contentView
+- (void)showError;
+
+//Shows (and animates in) a success checkmark in the contentView
+- (void)showSuccess;
+
+ at end
diff --git a/ios/iosremote/PopoverView.m b/ios/iosremote/PopoverView.m
new file mode 100755
index 0000000..1bf43b5
--- /dev/null
+++ b/ios/iosremote/PopoverView.m
@@ -0,0 +1,1049 @@
+//
+// PopoverView.m
+// Embark
+//
+// Created by Oliver Rickard on 20/08/2012.
+//
+//
+
+#import "PopoverView.h"
+#import "PopoverView_Configuration.h"
+#import <QuartzCore/QuartzCore.h>
+
+#pragma mark - Implementation
+
+ at implementation PopoverView
+
+ at synthesize subviewsArray;
+ at synthesize contentView;
+ at synthesize titleView;
+ at synthesize delegate;
+
+#pragma mark - Static Methods
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withText:text];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withTitle:title withText:text];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withViewArray:viewArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withTitle:title withViewArray:viewArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withStringArray:stringArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withTitle:title withStringArray:stringArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withStringArray:stringArray withImageArray:imageArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withTitle:title withStringArray:stringArray withImageArray:imageArray];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withTitle:title withContentView:cView];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
++ (PopoverView *)showPopoverAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView delegate:(id<PopoverViewDelegate>)delegate {
+ PopoverView *popoverView = [[PopoverView alloc] initWithFrame:CGRectZero];
+ [popoverView showAtPoint:point inView:view withContentView:cView];
+ popoverView.delegate = delegate;
+ [popoverView RELEASE];
+ return popoverView;
+}
+
+#pragma mark - View Lifecycle
+
+- (id)initWithFrame:(CGRect)frame
+{
+ self = [super initWithFrame:frame];
+ if (self) {
+ // Initialization code
+
+ self.backgroundColor = [UIColor clearColor];
+
+ self.titleView = nil;
+ self.contentView = nil;
+
+ showDividerRects = kShowDividersBetweenViews;
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ self.subviewsArray = nil;
+
+ if (dividerRects) {
+ [dividerRects RELEASE];
+ dividerRects = nil;
+ }
+
+ self.contentView = nil;
+ self.titleView = nil;
+
+ [super DEALLOC];
+}
+
+
+
+#pragma mark - Display methods
+
+// get the screen size, adjusted for orientation and status bar display
+// see http://stackoverflow.com/questions/7905432/how-to-get-orientation-dependent-height-and-width-of-the-screen/7905540#7905540
+- (CGSize) screenSize
+{
+ UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
+ CGSize size = [UIScreen mainScreen].bounds.size;
+ UIApplication *application = [UIApplication sharedApplication];
+ if (UIInterfaceOrientationIsLandscape(orientation))
+ {
+ size = CGSizeMake(size.height, size.width);
+ }
+ if (application.statusBarHidden == NO)
+ {
+ size.height -= MIN(application.statusBarFrame.size.width, application.statusBarFrame.size.height);
+ }
+ return size;
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withText:(NSString *)text
+{
+ UIFont *font = kTextFont;
+
+ CGSize screenSize = [self screenSize];
+ CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(screenSize.width - kHorizontalMargin*4.f, 1000.f) lineBreakMode:UILineBreakModeWordWrap];
+
+ UILabel *textView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+ textView.backgroundColor = [UIColor clearColor];
+ textView.userInteractionEnabled = NO;
+ [textView setNumberOfLines:0]; //This is so the label word wraps instead of cutting off the text
+ textView.font = font;
+ textView.textAlignment = kTextAlignment;
+ textView.textColor = kTextColor;
+ textView.text = text;
+
+ [self showAtPoint:point inView:view withViewArray:[NSArray arrayWithObject:[textView AUTORELEASE]]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withText:(NSString *)text
+{
+ UIFont *font = kTextFont;
+
+ CGSize screenSize = [self screenSize];
+ CGSize textSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(screenSize.width - kHorizontalMargin*4.f, 1000.f) lineBreakMode:UILineBreakModeWordWrap];
+
+ UILabel *textView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+ textView.backgroundColor = [UIColor clearColor];
+ textView.userInteractionEnabled = NO;
+ [textView setNumberOfLines:0]; //This is so the label word wraps instead of cutting off the text
+ textView.font = font;
+ textView.textAlignment = kTextAlignment;
+ textView.textColor = kTextColor;
+ textView.text = text;
+
+ [self showAtPoint:point inView:view withTitle:title withViewArray:[NSArray arrayWithObject:[textView AUTORELEASE]]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withViewArray:(NSArray *)viewArray
+{
+ UIView *container = [[UIView alloc] initWithFrame:CGRectZero];
+
+ float totalHeight = 0.f;
+ float totalWidth = 0.f;
+
+ int i = 0;
+
+ //Position each view the first time, and identify which view has the largest width that controls
+ //the sizing of the popover.
+ for (UIView *view in viewArray) {
+
+ view.frame = CGRectMake(0, totalHeight, view.frame.size.width, view.frame.size.height);
+ //Only add padding below the view if it's not the last item
+ float padding = (i == viewArray.count-1) ? 0 : kBoxPadding;
+
+ totalHeight += view.frame.size.height + padding;
+
+ if (view.frame.size.width > totalWidth) {
+ totalWidth = view.frame.size.width;
+ }
+
+ [container addSubview:view];
+
+ i++;
+ }
+
+ //If dividers are enabled, then we allocate the divider rect array. This will hold NSValues
+ if (kShowDividersBetweenViews) {
+ dividerRects = [[NSMutableArray alloc] initWithCapacity:viewArray.count-1];
+ }
+
+ container.frame = CGRectMake(0, 0, totalWidth, totalHeight);
+
+ i = 0;
+
+ totalHeight = 0;
+
+ //Now we actually change the frame element for each subview, and center the views horizontally.
+ for (UIView *view in viewArray) {
+ if ([view autoresizingMask] == UIViewAutoresizingFlexibleWidth) {
+ //Now make sure all flexible views are the full width
+ view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, totalWidth, view.frame.size.height);
+ } else {
+ //If the view is not flexible width, then we position it centered in the view
+ //without stretching it.
+ view.frame = CGRectMake(floorf(CGRectGetMinX(boxFrame) + totalWidth*0.5f - view.frame.size.width*0.5f), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+ }
+
+ //and if dividers are enabled, we record their position for the drawing methods
+ if (kShowDividersBetweenViews && i != viewArray.count-1) {
+ CGRect dividerRect = CGRectMake(view.frame.origin.x, floorf(view.frame.origin.y + view.frame.size.height + kBoxPadding*0.5f), view.frame.size.width, 0.5f);
+
+ [((NSMutableArray *)dividerRects) addObject:[NSValue valueWithCGRect:dividerRect]];
+ }
+
+ //Only add padding below the view if it's not the last item
+ float padding = (i == viewArray.count-1) ? 0.f : kBoxPadding;
+
+ totalHeight += view.frame.size.height + padding;
+
+ i++;
+ }
+
+ self.subviewsArray = viewArray;
+
+ [self showAtPoint:point inView:view withContentView:[container AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withViewArray:(NSArray *)viewArray
+{
+ UIView *container = [[UIView alloc] initWithFrame:CGRectZero];
+
+ //Create a label for the title text.
+ CGSize titleSize = [title sizeWithFont:kTitleFont];
+ UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.f, 0.f, titleSize.width, titleSize.height)];
+ titleLabel.backgroundColor = [UIColor clearColor];
+ titleLabel.font = kTitleFont;
+ titleLabel.textAlignment = UITextAlignmentCenter;
+ titleLabel.textColor = kTitleColor;
+ titleLabel.text = title;
+
+ //Make sure that the title's label will have non-zero height. If it has zero height, then we don't allocate any space
+ //for it in the positioning of the views.
+ float titleHeightOffset = (titleSize.height > 0.f ? kBoxPadding : 0.f);
+
+ float totalHeight = titleSize.height + titleHeightOffset + kBoxPadding;
+ float totalWidth = titleSize.width;
+
+ int i = 0;
+
+ //Position each view the first time, and identify which view has the largest width that controls
+ //the sizing of the popover.
+ for (UIView *view in viewArray) {
+
+ view.frame = CGRectMake(0, totalHeight, view.frame.size.width, view.frame.size.height);
+
+ //Only add padding below the view if it's not the last item.
+ float padding = (i == viewArray.count-1) ? 0.f : kBoxPadding;
+
+ totalHeight += view.frame.size.height + padding;
+
+ if (view.frame.size.width > totalWidth) {
+ totalWidth = view.frame.size.width;
+ }
+
+ [container addSubview:view];
+
+ i++;
+ }
+
+ //If dividers are enabled, then we allocate the divider rect array. This will hold NSValues
+ if (kShowDividersBetweenViews) {
+ dividerRects = [[NSMutableArray alloc] initWithCapacity:viewArray.count-1];
+ }
+
+ i = 0;
+
+ for (UIView *view in viewArray) {
+ if ([view autoresizingMask] == UIViewAutoresizingFlexibleWidth) {
+ //Now make sure all flexible views are the full width
+ view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, totalWidth, view.frame.size.height);
+ } else {
+ //If the view is not flexible width, then we position it centered in the view
+ //without stretching it.
+ view.frame = CGRectMake(floorf(CGRectGetMinX(boxFrame) + totalWidth*0.5f - view.frame.size.width*0.5f), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+ }
+
+ //and if dividers are enabled, we record their position for the drawing methods
+ if (kShowDividersBetweenViews && i != viewArray.count-1) {
+ CGRect dividerRect = CGRectMake(view.frame.origin.x, floorf(view.frame.origin.y + view.frame.size.height + kBoxPadding*0.5f), view.frame.size.width, 0.5f);
+
+ [((NSMutableArray *)dividerRects) addObject:[NSValue valueWithCGRect:dividerRect]];
+ }
+
+ i++;
+ }
+
+ titleLabel.frame = CGRectMake(floorf(totalWidth*0.5f - titleSize.width*0.5f), 0, titleSize.width, titleSize.height);
+
+ //Store the titleView as an instance variable if it is larger than 0 height (not an empty string)
+ if (titleSize.height > 0) {
+ self.titleView = titleLabel;
+ }
+
+ [container addSubview:[titleLabel AUTORELEASE]];
+
+ container.frame = CGRectMake(0, 0, totalWidth, totalHeight);
+
+ self.subviewsArray = viewArray;
+
+ [self showAtPoint:point inView:view withContentView:[container AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray
+{
+ NSMutableArray *labelArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+
+ UIFont *font = kTextFont;
+
+ for (NSString *string in stringArray) {
+ CGSize textSize = [string sizeWithFont:font];
+ UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+ textButton.backgroundColor = [UIColor clearColor];
+ textButton.titleLabel.font = font;
+ textButton.titleLabel.textAlignment = kTextAlignment;
+ textButton.titleLabel.textColor = kTextColor;
+ [textButton setTitle:string forState:UIControlStateNormal];
+ textButton.layer.cornerRadius = 4.f;
+ [textButton setTitleColor:kTextColor forState:UIControlStateNormal];
+ [textButton setTitleColor:kTextHighlightColor forState:UIControlStateHighlighted];
+ [textButton addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];
+
+ [labelArray addObject:[textButton AUTORELEASE]];
+ }
+
+ [self showAtPoint:point inView:view withViewArray:[labelArray AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray
+ {
+ NSMutableArray *labelArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+
+ UIFont *font = kTextFont;
+
+ for (NSString *string in stringArray) {
+ CGSize textSize = [string sizeWithFont:font];
+ UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+ textButton.backgroundColor = [UIColor clearColor];
+ textButton.titleLabel.font = font;
+ textButton.titleLabel.textAlignment = kTextAlignment;
+ textButton.titleLabel.textColor = kTextColor;
+ [textButton setTitle:string forState:UIControlStateNormal];
+ textButton.layer.cornerRadius = 4.f;
+ [textButton setTitleColor:kTextColor forState:UIControlStateNormal];
+ [textButton setTitleColor:kTextHighlightColor forState:UIControlStateHighlighted];
+ [textButton addTarget:self action:@selector(didTapButton:) forControlEvents:UIControlEventTouchUpInside];
+
+ [labelArray addObject:[textButton AUTORELEASE]];
+ }
+
+ [self showAtPoint:point inView:view withTitle:title withViewArray:[labelArray AUTORELEASE]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray
+{
+ //Here we do something pretty similar to the stringArray method above.
+ //We create an array of subviews that contains the strings and images centered above a label.
+
+ NSAssert((stringArray.count == imageArray.count), @"stringArray.count should equal imageArray.count");
+ NSMutableArray* tempViewArray = [self makeTempViewsWithStrings:stringArray andImages:imageArray];
+
+ [self showAtPoint:point inView:view withViewArray:tempViewArray];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withStringArray:(NSArray *)stringArray withImageArray:(NSArray *)imageArray
+{
+ NSAssert((stringArray.count == imageArray.count), @"stringArray.count should equal imageArray.count");
+ NSMutableArray* tempViewArray = [self makeTempViewsWithStrings:stringArray andImages:imageArray];
+
+ [self showAtPoint:point inView:view withTitle:title withViewArray:tempViewArray];
+}
+
+- (NSMutableArray*) makeTempViewsWithStrings:(NSArray *)stringArray andImages:(NSArray *)imageArray
+{
+ NSMutableArray *tempViewArray = [[NSMutableArray alloc] initWithCapacity:stringArray.count];
+
+ UIFont *font = kTextFont;
+
+ for (int i = 0; i < stringArray.count; i++) {
+ NSString *string = [stringArray objectAtIndex:i];
+
+ //First we build a label for the text to set in.
+ CGSize textSize = [string sizeWithFont:font];
+ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, textSize.width, textSize.height)];
+ label.backgroundColor = [UIColor clearColor];
+ label.font = font;
+ label.textAlignment = kTextAlignment;
+ label.textColor = kTextColor;
+ label.text = string;
+ label.layer.cornerRadius = 4.f;
+
+ //Now we grab the image at the same index in the imageArray, and create
+ //a UIImageView for it.
+ UIImage *image = [imageArray objectAtIndex:i];
+ UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
+
+ //Take the larger of the two widths as the width for the container
+ float containerWidth = MAX(imageView.frame.size.width, label.frame.size.width);
+ float containerHeight = label.frame.size.height + kImageTopPadding + kImageBottomPadding + imageView.frame.size.height;
+
+ //This container will hold both the image and the label
+ UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, containerWidth, containerHeight)];
+
+ //Now we do the frame manipulations to put the imageView on top of the label, both centered
+ imageView.frame = CGRectMake(floorf(containerWidth*0.5f - imageView.frame.size.width*0.5f), kImageTopPadding, imageView.frame.size.width, imageView.frame.size.height);
+ label.frame = CGRectMake(floorf(containerWidth*0.5f - label.frame.size.width*0.5f), imageView.frame.size.height + kImageBottomPadding + kImageTopPadding, label.frame.size.width, label.frame.size.height);
+
+ [containerView addSubview:imageView];
+ [containerView addSubview:label];
+
+ [label RELEASE];
+ [imageView RELEASE];
+
+ [tempViewArray addObject:containerView];
+ [containerView RELEASE];
+ }
+
+ return [tempViewArray AUTORELEASE];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withTitle:(NSString *)title withContentView:(UIView *)cView
+{
+ [self showAtPoint:point inView:view withTitle:title withViewArray:[NSArray arrayWithObject:cView]];
+}
+
+- (void)showAtPoint:(CGPoint)point inView:(UIView *)view withContentView:(UIView *)cView {
+
+ //NSLog(@"point:%f,%f", point.x, point.y);
+
+ self.contentView = cView;
+ parentView = view;
+
+ // get the top view
+ // http://stackoverflow.com/questions/3843411/getting-reference-to-the-top-most-view-window-in-ios-application/8045804#8045804
+ topView = [[[[UIApplication sharedApplication] keyWindow] subviews] lastObject];
+
+ [self setupLayout:point inView:view];
+
+ // Make the view small and transparent before animation
+ self.alpha = 0.f;
+ self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+
+ // animate into full size
+ // First stage animates to 1.05x normal size, then second stage animates back down to 1x size.
+ // This two-stage animation creates a little "pop" on open.
+ [UIView animateWithDuration:0.2f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+ self.alpha = 1.f;
+ self.transform = CGAffineTransformMakeScale(1.05f, 1.05f);
+ } completion:^(BOOL finished) {
+ [UIView animateWithDuration:0.08f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+ self.transform = CGAffineTransformIdentity;
+ } completion:nil];
+ }];
+}
+
+- (void)layoutAtPoint:(CGPoint)point inView:(UIView *)view
+{
+ // make transparent
+ self.alpha = 0.f;
+
+ [self setupLayout:point inView:view];
+
+ // animate back to full opacity
+ [UIView animateWithDuration:0.2f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
+ self.alpha = 1.f;
+ } completion:nil];
+}
+
+-(void)setupLayout:(CGPoint)point inView:(UIView*)view
+{
+ CGPoint topPoint = [topView convertPoint:point fromView:view];
+
+ arrowPoint = topPoint;
+
+ //NSLog(@"arrowPoint:%f,%f", arrowPoint.x, arrowPoint.y);
+
+ CGRect topViewBounds = topView.bounds;
+ //NSLog(@"topViewBounds %@", NSStringFromCGRect(topViewBounds));
+
+ float contentHeight = contentView.frame.size.height;
+ float contentWidth = contentView.frame.size.width;
+
+ float padding = kBoxPadding;
+
+ float boxHeight = contentHeight + 2.f*padding;
+ float boxWidth = contentWidth + 2.f*padding;
+
+ float xOrigin = 0.f;
+
+ //Make sure the arrow point is within the drawable bounds for the popover.
+ if (arrowPoint.x + kArrowHeight > topViewBounds.size.width - kHorizontalMargin - kBoxRadius - kArrowHorizontalPadding) {//Too far to the right
+ arrowPoint.x = topViewBounds.size.width - kHorizontalMargin - kBoxRadius - kArrowHorizontalPadding - kArrowHeight;
+ //NSLog(@"Correcting Arrow Point because it's too far to the right");
+ } else if (arrowPoint.x - kArrowHeight < kHorizontalMargin + kBoxRadius + kArrowHorizontalPadding) {//Too far to the left
+ arrowPoint.x = kHorizontalMargin + kArrowHeight + kBoxRadius + kArrowHorizontalPadding;
+ //NSLog(@"Correcting Arrow Point because it's too far to the left");
+ }
+
+ //NSLog(@"arrowPoint:%f,%f", arrowPoint.x, arrowPoint.y);
+
+ xOrigin = floorf(arrowPoint.x - boxWidth*0.5f);
+
+ //Check to see if the centered xOrigin value puts the box outside of the normal range.
+ if (xOrigin < CGRectGetMinX(topViewBounds) + kHorizontalMargin) {
+ xOrigin = CGRectGetMinX(topViewBounds) + kHorizontalMargin;
+ } else if (xOrigin + boxWidth > CGRectGetMaxX(topViewBounds) - kHorizontalMargin) {
+ //Check to see if the positioning puts the box out of the window towards the left
+ xOrigin = CGRectGetMaxX(topViewBounds) - kHorizontalMargin - boxWidth;
+ }
+
+ float arrowHeight = kArrowHeight;
+
+ float topPadding = kTopMargin;
+
+ above = YES;
+
+ if (topPoint.y - contentHeight - arrowHeight - topPadding < CGRectGetMinY(topViewBounds)) {
+ //Position below because it won't fit above.
+ above = NO;
+
+ boxFrame = CGRectMake(xOrigin, arrowPoint.y + arrowHeight, boxWidth, boxHeight);
+ } else {
+ //Position above.
+ above = YES;
+
+ boxFrame = CGRectMake(xOrigin, arrowPoint.y - arrowHeight - boxHeight, boxWidth, boxHeight);
+ }
+
+ //NSLog(@"boxFrame:(%f,%f,%f,%f)", boxFrame.origin.x, boxFrame.origin.y, boxFrame.size.width, boxFrame.size.height);
+
+ CGRect contentFrame = CGRectMake(boxFrame.origin.x + padding, boxFrame.origin.y + padding, contentWidth, contentHeight);
+ contentView.frame = contentFrame;
+
+ //We set the anchorPoint here so the popover will "grow" out of the arrowPoint specified by the user.
+ //You have to set the anchorPoint before setting the frame, because the anchorPoint property will
+ //implicitly set the frame for the view, which we do not want.
+ self.layer.anchorPoint = CGPointMake(arrowPoint.x / topViewBounds.size.width, arrowPoint.y / topViewBounds.size.height);
+ self.frame = topViewBounds;
+ [self setNeedsDisplay];
+
+ [self addSubview:contentView];
+ [topView addSubview:self];
+
+ //Add a tap gesture recognizer to the large invisible view (self), which will detect taps anywhere on the screen.
+ UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)];
+ tap.cancelsTouchesInView = NO; // Allow touches through to a UITableView or other touchable view, as suggested by Dimajp.
+ [self addGestureRecognizer:tap];
+ [tap RELEASE];
+
+ self.userInteractionEnabled = YES;
+}
+
+
+#pragma mark - Activity Indicator
+
+//Animates in a progress indicator, and removes
+- (void)showActivityIndicatorWithMessage:(NSString *)msg
+{
+ if ([titleView isKindOfClass:[UILabel class]]) {
+ ((UILabel *)titleView).text = msg;
+ }
+
+ if (subviewsArray && (subviewsArray.count > 0)) {
+ [UIView animateWithDuration:0.2f animations:^{
+ for (UIView *view in subviewsArray) {
+ view.alpha = 0.f;
+ }
+ }];
+
+ if (showDividerRects) {
+ showDividerRects = NO;
+ [self setNeedsDisplay];
+ }
+ }
+
+ if (activityIndicator) {
+ [activityIndicator RELEASE];
+ [activityIndicator removeFromSuperview];
+ activityIndicator = nil;
+ }
+
+ activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
+ activityIndicator.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 10.f, CGRectGetMidY(contentView.bounds) - 10.f + 20.f, 20.f, 20.f);
+ [contentView addSubview:activityIndicator];
+
+ [activityIndicator startAnimating];
+}
+
+- (void)hideActivityIndicatorWithMessage:(NSString *)msg
+{
+ if ([titleView isKindOfClass:[UILabel class]]) {
+ ((UILabel *)titleView).text = msg;
+ }
+
+ [activityIndicator stopAnimating];
+ [UIView animateWithDuration:0.1f animations:^{
+ activityIndicator.alpha = 0.f;
+ } completion:^(BOOL finished) {
+ [activityIndicator RELEASE];
+ [activityIndicator removeFromSuperview];
+ activityIndicator = nil;
+ }];
+}
+
+- (void)showImage:(UIImage *)image withMessage:(NSString *)msg
+{
+ UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
+ imageView.alpha = 0.f;
+ imageView.frame = CGRectMake(floorf(CGRectGetMidX(contentView.bounds) - image.size.width*0.5f), floorf(CGRectGetMidY(contentView.bounds) - image.size.height*0.5f + ((self.titleView) ? 20 : 0.f)), image.size.width, image.size.height);
+ imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+
+ [contentView addSubview:[imageView AUTORELEASE]];
+
+ if (subviewsArray && (subviewsArray.count > 0)) {
+ [UIView animateWithDuration:0.2f animations:^{
+ for (UIView *view in subviewsArray) {
+ view.alpha = 0.f;
+ }
+ }];
+
+ if (showDividerRects) {
+ showDividerRects = NO;
+ [self setNeedsDisplay];
+ }
+ }
+
+ if (msg) {
+ if ([titleView isKindOfClass:[UILabel class]]) {
+ ((UILabel *)titleView).text = msg;
+ }
+ }
+
+ [UIView animateWithDuration:0.2f delay:0.2f options:UIViewAnimationOptionCurveEaseOut animations:^{
+ imageView.alpha = 1.f;
+ imageView.transform = CGAffineTransformIdentity;
+ } completion:^(BOOL finished) {
+ //[imageView removeFromSuperview];
+ }];
+}
+
+- (void)showError
+{
+ UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]];
+ imageView.alpha = 0.f;
+ imageView.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 20.f, CGRectGetMidY(contentView.bounds) - 20.f + ((self.titleView) ? 20 : 0.f), 40.f, 40.f);
+ imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+
+ [contentView addSubview:[imageView AUTORELEASE]];
+
+ if (subviewsArray && (subviewsArray.count > 0)) {
+ [UIView animateWithDuration:0.1f animations:^{
+ for (UIView *view in subviewsArray) {
+ view.alpha = 0.f;
+ }
+ }];
+
+ if (showDividerRects) {
+ showDividerRects = NO;
+ [self setNeedsDisplay];
+ }
+ }
+
+ [UIView animateWithDuration:0.1f delay:0.1f options:UIViewAnimationOptionCurveEaseOut animations:^{
+ imageView.alpha = 1.f;
+ imageView.transform = CGAffineTransformIdentity;
+ } completion:^(BOOL finished) {
+ //[imageView removeFromSuperview];
+ }];
+
+}
+
+- (void)showSuccess
+{
+ UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"success"]];
+ imageView.alpha = 0.f;
+ imageView.frame = CGRectMake(CGRectGetMidX(contentView.bounds) - 20.f, CGRectGetMidY(contentView.bounds) - 20.f + ((self.titleView) ? 20 : 0.f), 40.f, 40.f);
+ imageView.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+
+ [contentView addSubview:[imageView AUTORELEASE]];
+
+ if (subviewsArray && (subviewsArray.count > 0)) {
+ [UIView animateWithDuration:0.1f animations:^{
+ for (UIView *view in subviewsArray) {
+ view.alpha = 0.f;
+ }
+ }];
+
+ if (showDividerRects) {
+ showDividerRects = NO;
+ [self setNeedsDisplay];
+ }
+ }
+
+ [UIView animateWithDuration:0.1f delay:0.1f options:UIViewAnimationOptionCurveEaseOut animations:^{
+ imageView.alpha = 1.f;
+ imageView.transform = CGAffineTransformIdentity;
+ } completion:^(BOOL finished) {
+ //[imageView removeFromSuperview];
+ }];
+
+}
+
+#pragma mark - User Interaction
+
+- (void)tapped:(UITapGestureRecognizer *)tap
+{
+ CGPoint point = [tap locationInView:contentView];
+
+ //NSLog(@"point:(%f,%f)", point.x, point.y);
+
+ BOOL found = NO;
+
+ //NSLog(@"subviewsArray:%@", subviewsArray);
+
+ for (int i = 0; i < subviewsArray.count && !found; i++) {
+ UIView *view = [subviewsArray objectAtIndex:i];
+
+ //NSLog(@"Rect:(%f,%f,%f,%f)", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
+
+ if (CGRectContainsPoint(view.frame, point)) {
+ //The tap was within this view, so we notify the delegate, and break the loop.
+
+ found = YES;
+
+ //NSLog(@"Tapped subview:%d", i);
+
+ if ([view isKindOfClass:[UIButton class]]) {
+ return;
+ }
+
+ if (delegate && [delegate respondsToSelector:@selector(popoverView:didSelectItemAtIndex:)]) {
+ [delegate popoverView:self didSelectItemAtIndex:i];
+ }
+
+ break;
+ }
+ }
+
+ if (!found && CGRectContainsPoint(contentView.bounds, point)) {
+ found = YES;
+ //NSLog(@"popover box contains point, ignoring user input");
+ }
+
+ if (!found) {
+ [self dismiss:YES];
+ }
+
+}
+
+- (void)didTapButton:(UIButton *)sender
+{
+ int index = [subviewsArray indexOfObject:sender];
+
+ if (index == NSNotFound) {
+ return;
+ }
+
+ if (delegate && [delegate respondsToSelector:@selector(popoverView:didSelectItemAtIndex:)]) {
+ [delegate popoverView:self didSelectItemAtIndex:index];
+ }
+}
+
+- (void)dismiss
+{
+ [self dismiss:YES];
+}
+
+- (void)dismiss:(BOOL)animated
+{
+ if (!animated)
+ {
+ [self dismissComplete];
+ }
+ else
+ {
+ [UIView animateWithDuration:0.3f animations:^{
+ self.alpha = 0.1f;
+ self.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
+ } completion:^(BOOL finished) {
+ [self dismissComplete];
+ }];
+ }
+}
+
+- (void)dismissComplete
+{
+ [self removeFromSuperview];
+
+ if (self.delegate && [self.delegate respondsToSelector:@selector(popoverViewDidDismiss:)]) {
+ [delegate popoverViewDidDismiss:self];
+ }
+}
+
+- (void)animateRotationToNewPoint:(CGPoint)point inView:(UIView *)view withDuration:(NSTimeInterval)duration
+{
+ [self layoutAtPoint:point inView:view];
+}
+
+#pragma mark - Drawing Routines
+
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect
+{
+ // Drawing code
+
+ // Build the popover path
+ CGRect frame = boxFrame;
+
+ float xMin = CGRectGetMinX(frame);
+ float yMin = CGRectGetMinY(frame);
+
+ float xMax = CGRectGetMaxX(frame);
+ float yMax = CGRectGetMaxY(frame);
+
+ float radius = kBoxRadius; //Radius of the curvature.
+
+ float cpOffset = kCPOffset; //Control Point Offset. Modifies how "curved" the corners are.
+
+
+ /*
+ LT2 RT1
+ LT1ââºâºâºâºâºâºâºâºâºâºâºâºâºâºâºâRT2
+ | |
+ | popover |
+ | |
+ LB2â_______________âRB1
+ LB1 RB2
+
+ Traverse rectangle in clockwise order, starting at LT1
+ L = Left
+ R = Right
+ T = Top
+ B = Bottom
+ 1,2 = order of traversal for any given corner
+
+ */
+
+ UIBezierPath *popoverPath = [UIBezierPath bezierPath];
+ [popoverPath moveToPoint:CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + radius)];//LT1
+ [popoverPath addCurveToPoint:CGPointMake(xMin + radius, yMin) controlPoint1:CGPointMake(xMin, yMin + radius - cpOffset) controlPoint2:CGPointMake(xMin + radius - cpOffset, yMin)];//LT2
+
+ //If the popover is positioned below (!above) the arrowPoint, then we know that the arrow must be on the top of the popover.
+ //In this case, the arrow is located between LT2 and RT1
+ if (!above) {
+ [popoverPath addLineToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMin)];//left side
+ [popoverPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMin) controlPoint2:arrowPoint];//actual arrow point
+ [popoverPath addCurveToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMin) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMin)];//right side
+ }
+
+ [popoverPath addLineToPoint:CGPointMake(xMax - radius, yMin)];//RT1
+ [popoverPath addCurveToPoint:CGPointMake(xMax, yMin + radius) controlPoint1:CGPointMake(xMax - radius + cpOffset, yMin) controlPoint2:CGPointMake(xMax, yMin + radius - cpOffset)];//RT2
+ [popoverPath addLineToPoint:CGPointMake(xMax, yMax - radius)];//RB1
+ [popoverPath addCurveToPoint:CGPointMake(xMax - radius, yMax) controlPoint1:CGPointMake(xMax, yMax - radius + cpOffset) controlPoint2:CGPointMake(xMax - radius + cpOffset, yMax)];//RB2
+
+ //If the popover is positioned above the arrowPoint, then we know that the arrow must be on the bottom of the popover.
+ //In this case, the arrow is located somewhere between LB1 and RB2
+ if (above) {
+ [popoverPath addLineToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMax)];//right side
+ [popoverPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMax) controlPoint2:arrowPoint];//arrow point
+ [popoverPath addCurveToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMax) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMax)];
+ }
+
+ [popoverPath addLineToPoint:CGPointMake(xMin + radius, yMax)];//LB1
+ [popoverPath addCurveToPoint:CGPointMake(xMin, yMax - radius) controlPoint1:CGPointMake(xMin + radius - cpOffset, yMax) controlPoint2:CGPointMake(xMin, yMax - radius + cpOffset)];//LB2
+ [popoverPath closePath];
+
+ //// General Declarations
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = UIGraphicsGetCurrentContext();
+
+ //// Shadow Declarations
+ UIColor* shadow = [UIColor colorWithWhite:0.0f alpha:kShadowAlpha];
+ CGSize shadowOffset = CGSizeMake(0, 1);
+ CGFloat shadowBlurRadius = kShadowBlur;
+
+ //// Gradient Declarations
+ NSArray* gradientColors = [NSArray arrayWithObjects:
+ (id)kGradientTopColor.CGColor,
+ (id)kGradientBottomColor.CGColor, nil];
+ CGFloat gradientLocations[] = {0, 1};
+ CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFTYPECAST(CFArrayRef)gradientColors), gradientLocations);
+
+
+ //These floats are the top and bottom offsets for the gradient drawing so the drawing includes the arrows.
+ float bottomOffset = (above ? kArrowHeight : 0.f);
+ float topOffset = (!above ? kArrowHeight : 0.f);
+
+ //Draw the actual gradient and shadow.
+ CGContextSaveGState(context);
+ CGContextSetShadowWithColor(context, shadowOffset, shadowBlurRadius, shadow.CGColor);
+ CGContextBeginTransparencyLayer(context, NULL);
+ [popoverPath addClip];
+ CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) - topOffset), CGPointMake(CGRectGetMidX(frame), CGRectGetMaxY(frame) + bottomOffset), 0);
+ CGContextEndTransparencyLayer(context);
+ CGContextRestoreGState(context);
+
+ //// Cleanup
+ CGGradientRelease(gradient);
+ CGColorSpaceRelease(colorSpace);
+
+
+ //Draw the title background
+ if (kDrawTitleGradient) {
+ //Calculate the height of the title bg
+ float titleBGHeight = -1;
+
+ //NSLog(@"titleView:%@", titleView);
+
+ if (titleView != nil) {
+ titleBGHeight = kBoxPadding*2.f + titleView.frame.size.height;
+ }
+
+
+ //Draw the title bg height, but only if we need to.
+ if (titleBGHeight > 0.f) {
+ CGPoint startingPoint = CGPointMake(xMin, yMin + titleBGHeight);
+ CGPoint endingPoint = CGPointMake(xMax, yMin + titleBGHeight);
+
+ UIBezierPath *titleBGPath = [UIBezierPath bezierPath];
+ [titleBGPath moveToPoint:startingPoint];
+ [titleBGPath addLineToPoint:CGPointMake(CGRectGetMinX(frame), CGRectGetMinY(frame) + radius)];//LT1
+ [titleBGPath addCurveToPoint:CGPointMake(xMin + radius, yMin) controlPoint1:CGPointMake(xMin, yMin + radius - cpOffset) controlPoint2:CGPointMake(xMin + radius - cpOffset, yMin)];//LT2
+
+ //If the popover is positioned below (!above) the arrowPoint, then we know that the arrow must be on the top of the popover.
+ //In this case, the arrow is located between LT2 and RT1
+ if (!above) {
+ [titleBGPath addLineToPoint:CGPointMake(arrowPoint.x - kArrowHeight, yMin)];//left side
+ [titleBGPath addCurveToPoint:arrowPoint controlPoint1:CGPointMake(arrowPoint.x - kArrowHeight + kArrowCurvature, yMin) controlPoint2:arrowPoint];//actual arrow point
+ [titleBGPath addCurveToPoint:CGPointMake(arrowPoint.x + kArrowHeight, yMin) controlPoint1:arrowPoint controlPoint2:CGPointMake(arrowPoint.x + kArrowHeight - kArrowCurvature, yMin)];//right side
+ }
+
+ [titleBGPath addLineToPoint:CGPointMake(xMax - radius, yMin)];//RT1
+ [titleBGPath addCurveToPoint:CGPointMake(xMax, yMin + radius) controlPoint1:CGPointMake(xMax - radius + cpOffset, yMin) controlPoint2:CGPointMake(xMax, yMin + radius - cpOffset)];//RT2
+ [titleBGPath addLineToPoint:endingPoint];
+ [titleBGPath addLineToPoint:startingPoint];
+ [titleBGPath closePath];
+
+ //// General Declarations
+ CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
+ CGContextRef context = UIGraphicsGetCurrentContext();
+
+ //// Gradient Declarations
+ NSArray* gradientColors = [NSArray arrayWithObjects:
+ (id)kGradientTitleTopColor.CGColor,
+ (id)kGradientTitleBottomColor.CGColor, nil];
+ CGFloat gradientLocations[] = {0, 1};
+ CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFTYPECAST(CFArrayRef)gradientColors), gradientLocations);
+
+
+ //These floats are the top and bottom offsets for the gradient drawing so the drawing includes the arrows.
+ float topOffset = (!above ? kArrowHeight : 0.f);
+
+ //Draw the actual gradient and shadow.
+ CGContextSaveGState(context);
+ CGContextBeginTransparencyLayer(context, NULL);
+ [titleBGPath addClip];
+ CGContextDrawLinearGradient(context, gradient, CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) - topOffset), CGPointMake(CGRectGetMidX(frame), CGRectGetMinY(frame) + titleBGHeight), 0);
+ CGContextEndTransparencyLayer(context);
+ CGContextRestoreGState(context);
+
+ UIBezierPath *dividerLine = [UIBezierPath bezierPathWithRect:CGRectMake(startingPoint.x, startingPoint.y, (endingPoint.x - startingPoint.x), 0.5f)];
+ [[UIColor colorWithRed:0.741 green:0.741 blue:0.741 alpha:0.5f] setFill];
+ [dividerLine fill];
+
+ //// Cleanup
+ CGGradientRelease(gradient);
+ CGColorSpaceRelease(colorSpace);
+ }
+ }
+
+
+
+ //Draw the divider rects if we need to
+ {
+ if (kShowDividersBetweenViews && showDividerRects) {
+ if (dividerRects && dividerRects.count > 0) {
+ for (NSValue *value in dividerRects) {
+ CGRect rect = value.CGRectValue;
+ rect.origin.x += contentView.frame.origin.x;
+ rect.origin.y += contentView.frame.origin.y;
+
+ UIBezierPath *dividerPath = [UIBezierPath bezierPathWithRect:rect];
+ [kDividerColor setFill];
+ [dividerPath fill];
+ }
+ }
+ }
+ }
+
+ //Draw border if we need to
+ //The border is done last because it needs to be drawn on top of everything else
+ if (kDrawBorder) {
+ [kBorderColor setStroke];
+ popoverPath.lineWidth = kBorderWidth;
+ [popoverPath stroke];
+ }
+
+}
+
+ at end
diff --git a/ios/iosremote/PopoverViewCompatibility.h b/ios/iosremote/PopoverViewCompatibility.h
new file mode 100755
index 0000000..f5ce1bb
--- /dev/null
+++ b/ios/iosremote/PopoverViewCompatibility.h
@@ -0,0 +1,23 @@
+//
+// PopoverViewCompatibility.h
+// popover
+//
+// Created by alanduncan on 7/22/13.
+// Copyright (c) 2013 Oliver Rickard. All rights reserved.
+//
+
+#ifndef popover_PopoverViewCompatibility_h
+#define popover_PopoverViewCompatibility_h
+
+#ifdef __IPHONE_6_0
+
+#define UITextAlignmentCenter NSTextAlignmentCenter
+#define UITextAlignmentLeft NSTextAlignmentLeft
+#define UITextAlignmentRight NSTextAlignmentRight
+#define UILineBreakModeTailTruncation NSLineBreakByTruncatingTail
+#define UILineBreakModeMiddleTruncation NSLineBreakByTruncatingMiddle
+#define UILineBreakModeWordWrap NSLineBreakByWordWrapping
+
+#endif
+
+#endif
diff --git a/ios/iosremote/PopoverView_Configuration.h b/ios/iosremote/PopoverView_Configuration.h
new file mode 100755
index 0000000..f59ac94
--- /dev/null
+++ b/ios/iosremote/PopoverView_Configuration.h
@@ -0,0 +1,112 @@
+//
+// PopoverView_Configuration.h
+// popover
+//
+// Created by Bas Pellis on 12/25/12.
+// Copyright (c) 2012 Oliver Rickard. All rights reserved.
+//
+
+#pragma mark Constants - Configure look/feel
+
+// BOX GEOMETRY
+
+//Height/width of the actual arrow
+#define kArrowHeight 12.f
+
+//padding within the box for the contentView
+#define kBoxPadding 10.f
+
+//control point offset for rounding corners of the main popover box
+#define kCPOffset 1.8f
+
+//radius for the rounded corners of the main popover box
+#define kBoxRadius 4.f
+
+//Curvature value for the arrow. Set to 0.f to make it linear.
+#define kArrowCurvature 6.f
+
+//Minimum distance from the side of the arrow to the beginning of curvature for the box
+#define kArrowHorizontalPadding 5.f
+
+//Alpha value for the shadow behind the PopoverView
+#define kShadowAlpha 0.4f
+
+//Blur for the shadow behind the PopoverView
+#define kShadowBlur 3.f;
+
+//Box gradient bg alpha
+#define kBoxAlpha 0.95f
+
+//Padding along top of screen to allow for any nav/status bars
+#define kTopMargin 50.f
+
+//margin along the left and right of the box
+#define kHorizontalMargin 10.f
+
+//padding along top of icons/images
+#define kImageTopPadding 3.f
+
+//padding along bottom of icons/images
+#define kImageBottomPadding 3.f
+
+
+// DIVIDERS BETWEEN VIEWS
+
+//Bool that turns off/on the dividers
+#define kShowDividersBetweenViews NO
+
+//color for the divider fill
+#define kDividerColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:0.15f]
+
+
+// BACKGROUND GRADIENT
+
+//bottom color white in gradient bg
+#define kGradientBottomColor [UIColor colorWithRed:0.98f green:0.98f blue:0.98f alpha:kBoxAlpha]
+
+//top color white value in gradient bg
+#define kGradientTopColor [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:kBoxAlpha]
+
+
+// TITLE GRADIENT
+
+//bool that turns off/on title gradient
+#define kDrawTitleGradient YES
+
+//bottom color white value in title gradient bg
+#define kGradientTitleBottomColor [UIColor colorWithRed:0.93f green:0.93f blue:0.93f alpha:kBoxAlpha]
+
+//top color white value in title gradient bg
+#define kGradientTitleTopColor [UIColor colorWithRed:1.f green:1.f blue:1.f alpha:kBoxAlpha]
+
+
+// FONTS
+
+//normal text font
+#define kTextFont [UIFont fontWithName:@"HelveticaNeue" size:16.f]
+
+//normal text color
+#define kTextColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:1]
+// highlighted text color
+#define kTextHighlightColor [UIColor colorWithRed:0.098 green:0.102 blue:0.106 alpha:1.000]
+
+//normal text alignment
+#define kTextAlignment UITextAlignmentCenter
+
+//title font
+#define kTitleFont [UIFont fontWithName:@"HelveticaNeue-Bold" size:16.f]
+
+//title text color
+#define kTitleColor [UIColor colorWithRed:0.329 green:0.341 blue:0.353 alpha:1]
+
+
+// BORDER
+
+//bool that turns off/on the border
+#define kDrawBorder NO
+
+//border color
+#define kBorderColor [UIColor blackColor]
+
+//border width
+#define kBorderWidth 1.f
\ No newline at end of file
diff --git a/ios/iosremote/TestFlightSDK1.2.6/.DS_Store b/ios/iosremote/TestFlightSDK1.2.6/.DS_Store
new file mode 100644
index 0000000..177ff60
Binary files /dev/null and b/ios/iosremote/TestFlightSDK1.2.6/.DS_Store differ
diff --git a/ios/iosremote/UIBarButtonItem+Theme.h b/ios/iosremote/UIBarButtonItem+Theme.h
new file mode 100644
index 0000000..5fa5b74
--- /dev/null
+++ b/ios/iosremote/UIBarButtonItem+Theme.h
@@ -0,0 +1,16 @@
+//
+// UIBarButtonItem+Theme.h
+// VLC for iOS
+//
+// Created by Romain Goyet on 14/06/13.
+// Copyright (c) 2013 Applidium. All rights reserved.
+//
+// Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface UIBarButtonItem (Theme)
++ (UIBarButtonItem *)themedDoneButtonWithTarget:(id)target andSelector:(SEL)selector;
++ (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector;
+ at end
diff --git a/ios/iosremote/UIBarButtonItem+Theme.m b/ios/iosremote/UIBarButtonItem+Theme.m
new file mode 100644
index 0000000..4f125fc
--- /dev/null
+++ b/ios/iosremote/UIBarButtonItem+Theme.m
@@ -0,0 +1,48 @@
+//
+// UIBarButtonItem+Theme.m
+// VLC for iOS
+//
+// Created by Romain Goyet on 14/06/13.
+// Copyright (c) 2013 Applidium. All rights reserved.
+//
+// Refer to the COPYING file of the official project for license.
+//
+
+#import "UIBarButtonItem+Theme.h"
+
+ at implementation UIBarButtonItem (Theme)
++ (UIBarButtonItem *)themedDoneButtonWithTarget:(id)target andSelector:(SEL)selector
+{
+ UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_DONE", @"")
+ style:UIBarButtonItemStyleBordered
+ target:target
+ action:selector];
+ [doneButton setBackgroundImage:[UIImage imageNamed:@"doneButton"]
+ forState:UIControlStateNormal
+ barMetrics:UIBarMetricsDefault];
+ [doneButton setBackgroundImage:[UIImage imageNamed:@"doneButtonHighlight"]
+ forState:UIControlStateHighlighted
+ barMetrics:UIBarMetricsDefault];
+ [doneButton setTitleTextAttributes:@{UITextAttributeTextShadowColor : [UIColor whiteColor], UITextAttributeTextColor : [UIColor blackColor]}
+ forState:UIControlStateNormal];
+ return doneButton;
+}
+
++ (UIBarButtonItem *)themedBackButtonWithTarget:(id)target andSelector:(SEL)selector
+{
+ UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:NSLocalizedString(@"BUTTON_BACK", @"")
+ style:UIBarButtonItemStyleBordered
+ target:target
+ action:selector];
+ [backButton setBackgroundImage:[[UIImage imageNamed:@"backButton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 6)]
+ forState:UIControlStateNormal
+ barMetrics:UIBarMetricsDefault];
+ [backButton setBackgroundImage:[[UIImage imageNamed:@"backButtonHighlight"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12, 0, 6)]
+ forState:UIControlStateHighlighted
+ barMetrics:UIBarMetricsDefault];
+ [backButton setTitleTextAttributes:@{UITextAttributeTextShadowColor : [UIColor colorWithWhite:0. alpha:.37], UITextAttributeTextColor : [UIColor whiteColor]} forState:UIControlStateNormal];
+ [backButton setTitlePositionAdjustment:UIOffsetMake(3, 0) forBarMetrics:UIBarMetricsDefault];
+ return backButton;
+}
+
+ at end
diff --git a/ios/iosremote/UINavigationController+Theme.h b/ios/iosremote/UINavigationController+Theme.h
new file mode 100644
index 0000000..2a27d8e
--- /dev/null
+++ b/ios/iosremote/UINavigationController+Theme.h
@@ -0,0 +1,15 @@
+//
+// UINavigationController+Theme.h
+// VLC for iOS
+//
+// Created by Romain Goyet on 14/06/13.
+// Copyright (c) 2013 Applidium. All rights reserved.
+//
+// Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+ at interface UINavigationController (Theme)
+- (void)loadTheme;
+ at end
diff --git a/ios/iosremote/UINavigationController+Theme.m b/ios/iosremote/UINavigationController+Theme.m
new file mode 100644
index 0000000..5e8ed3a
--- /dev/null
+++ b/ios/iosremote/UINavigationController+Theme.m
@@ -0,0 +1,23 @@
+//
+// UINavigationController+Theme.m
+// VLC for iOS
+//
+// Created by Romain Goyet on 14/06/13.
+// Copyright (c) 2013 Applidium. All rights reserved.
+//
+// Refer to the COPYING file of the official project for license.
+//
+
+#import "UINavigationController+Theme.h"
+
+ at implementation UINavigationController (Theme)
+- (void)loadTheme
+{
+ UINavigationBar *navBar = self.navigationBar;
+ [navBar setBackgroundImage:[UIImage imageNamed:@"navBarBackground"]
+ forBarMetrics:UIBarMetricsDefault];
+ [navBar setBackgroundImage:[UIImage imageNamed:@"navBarBackgroundPhoneLandscape"]
+ forBarMetrics:UIBarMetricsLandscapePhone];
+ navBar.barStyle = UIBarStyleBlack;
+}
+ at end
diff --git a/ios/iosremote/iPad_autosize.storyboard b/ios/iosremote/iPad_autosize.storyboard
index 804740f..4883c1b 100644
--- a/ios/iosremote/iPad_autosize.storyboard
+++ b/ios/iosremote/iPad_autosize.storyboard
@@ -47,7 +47,7 @@
<action selector="cancelModalView:" destination="5QV-E7-KNT" id="rSl-Rp-xQb"/>
</connections>
</barButtonItem>
- <barButtonItem key="rightBarButtonItem" systemItem="add" id="pU6-XF-laS">
+ <barButtonItem key="rightBarButtonItem" image="add.png" id="pU6-XF-laS">
<connections>
<segue destination="65c-5D-pB7" kind="push" identifier="create_new_server" id="ORn-0W-dHd"/>
</connections>
@@ -367,6 +367,21 @@
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</view>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="jBq-0A-D38">
+ <rect key="frame" x="683.5" y="898.5" width="97" height="59"/>
+ <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
+ <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
+ <state key="normal" backgroundImage="gear.png">
+ <color key="titleColor" red="0.19607843459999999" green="0.30980393290000002" blue="0.52156865600000002" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="highlighted" backgroundImage="gear_pressed">
+ <color key="titleColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <connections>
+ <action selector="popOverUp:" destination="TYh-Hw-m1Q" eventType="touchUpInside" id="0Zm-gv-gne"/>
+ </connections>
+ </button>
<view alpha="0.50000000000000011" contentMode="scaleToFill" id="jX5-gj-cqE">
<rect key="frame" x="0.0" y="0.0" width="768" height="1004"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -400,7 +415,7 @@
<size key="shadowOffset" width="0.0" height="0.0"/>
</label>
</subviews>
- <color key="backgroundColor" red="0.29803921568627451" green="0.74509803921568629" blue="0.22745098039215686" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="backgroundColor" red="0.89411764709999997" green="0.43529411759999997" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/>
</view>
</subviews>
<color key="backgroundColor" red="0.90196079019999997" green="0.90196079019999997" blue="0.90196079019999997" alpha="1" colorSpace="calibratedRGB"/>
@@ -411,6 +426,7 @@
<outlet property="NotesView" destination="Pk1-fD-KAi" id="2ZD-si-fls"/>
<outlet property="clearButton" destination="MKb-4h-13P" id="7Xz-n6-sre"/>
<outlet property="currentSlideImageView" destination="x7C-rs-s4K" id="Qtf-99-j0C"/>
+ <outlet property="gearButton" destination="jBq-0A-D38" id="ATa-gU-YT0"/>
<outlet property="horizontalTableView" destination="Iok-mu-c0T" id="SJT-pa-4Hb"/>
<outlet property="movingPointer" destination="2SJ-3f-E3k" id="mxV-zz-hjx"/>
<outlet property="nextButton" destination="bfp-PJ-NrP" id="1Uf-1g-iQl"/>
@@ -526,6 +542,9 @@
</scenes>
<resources>
<image name="Default-568h at 2x.png" width="640" height="1136"/>
+ <image name="add.png" width="24" height="24"/>
+ <image name="gear.png" width="55" height="35"/>
+ <image name="gear_pressed" width="16" height="16"/>
<image name="libO_icon.png" width="598" height="598"/>
<image name="nextButton_normal.png" width="42" height="230"/>
<image name="nextButton_pressed.png" width="42" height="230"/>
@@ -534,6 +553,86 @@
<image name="timer_clear_btn.png" width="74" height="74"/>
<image name="timer_start_btn.png" width="74" height="74"/>
</resources>
+ <classes>
+ <class className="BasePresentationViewController" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/BasePresentationViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="nextSlideAction:"/>
+ <relationship kind="action" name="previousSlideAction:"/>
+ <relationship kind="action" name="startConnectionModal:"/>
+ <relationship kind="outlet" name="NoteWebView" candidateClass="UIWebView"/>
+ <relationship kind="outlet" name="NotesView" candidateClass="UIView"/>
+ <relationship kind="outlet" name="clearButton" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="currentSlideImageView" candidateClass="UIImageView"/>
+ <relationship kind="outlet" name="gearButton" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="horizontalTableView" candidateClass="UITableView"/>
+ <relationship kind="outlet" name="movingPointer" candidateClass="UIView"/>
+ <relationship kind="outlet" name="nextButton" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="previousButton" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="slideNumber" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="startButton" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="timeLabel" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="welcome_blocking_page" candidateClass="UIView"/>
+ <relationship kind="outlet" name="welcome_connect_button" candidateClass="UIButton"/>
+ <relationship kind="outlet" name="welcome_label" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="welcome_libO_icon" candidateClass="UIImageView"/>
+ </relationships>
+ </class>
+ <class className="EditableTableViewCell" superclassName="UITableViewCell">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/EditableTableViewCell.h"/>
+ </class>
+ <class className="LibONavigationController" superclassName="UINavigationController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/LibONavigationController.h"/>
+ </class>
+ <class className="MainSplitViewController" superclassName="UISplitViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/MainSplitViewController.h"/>
+ </class>
+ <class className="autoDismissKeyboardNavigationViewController" superclassName="LibONavigationController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/autoDismissKeyboardNavigationViewController.h"/>
+ </class>
+ <class className="newServerViewController" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/newServerViewController.h"/>
+ <relationships>
+ <relationship kind="action" name="save:"/>
+ <relationship kind="outlet" name="saveButton" candidateClass="UIBarButtonItem"/>
+ </relationships>
+ </class>
+ <class className="pinValidation_vc" superclassName="UIViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/pinValidation_vc.h"/>
+ <relationships>
+ <relationship kind="outlet" name="pinLabel" candidateClass="UILabel"/>
+ <relationship kind="outlet" name="statusLabel" candidateClass="UILabel"/>
+ </relationships>
+ </class>
+ <class className="server_list_vc" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc.h"/>
+ <relationships>
+ <relationship kind="outlet" name="serverTable" candidateClass="UITableView"/>
+ </relationships>
+ </class>
+ <class className="server_list_vc_ipad" superclassName="server_list_vc">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/server_list_vc_ipad.h"/>
+ <relationships>
+ <relationship kind="action" name="cancelModalView:"/>
+ </relationships>
+ </class>
+ <class className="slideShowPreviewTable_vc" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc.h"/>
+ <relationships>
+ <relationship kind="action" name="startPresentationAction:"/>
+ <relationship kind="outlet" name="optionsTable" candidateClass="UITableView"/>
+ </relationships>
+ </class>
+ <class className="slideShowPreviewTable_vc_ipad" superclassName="slideShowPreviewTable_vc">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowPreviewTable_vc_ipad.h"/>
+ <relationships>
+ <relationship kind="outlet" name="titleLabel" candidateClass="UILabel"/>
+ </relationships>
+ </class>
+ <class className="slideShowSwipeInList_ipad" superclassName="UITableViewController">
+ <source key="sourceIdentifier" type="project" relativePath="./Classes/slideShowSwipeInList_ipad.h"/>
+ </class>
+ </classes>
<simulatedMetricsContainer key="defaultSimulatedMetrics">
<simulatedStatusBarMetrics key="statusBar" statusBarStyle="blackTranslucent"/>
<simulatedOrientationMetrics key="orientation"/>
diff --git a/ios/iosremote/iosremote.xcodeproj/project.pbxproj b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
index 2d8dc71..6ba9a7c 100644
--- a/ios/iosremote/iosremote.xcodeproj/project.pbxproj
+++ b/ios/iosremote/iosremote.xcodeproj/project.pbxproj
@@ -63,7 +63,26 @@
8C0DC84717A45B160099E5AE /* libO_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C0DC84617A45B160099E5AE /* libO_icon.png */; };
8C0DC85117A512250099E5AE /* AppDelegate_ipad.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C0DC85017A512250099E5AE /* AppDelegate_ipad.m */; };
8C19F41D17B00899005BDB61 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */; };
- 8C1A16FB17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */; };
+ 8C19F41F17B02A8A005BDB61 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */; };
+ 8C19F42417B02C7A005BDB61 /* PopoverView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42117B02AA9005BDB61 /* PopoverView.m */; };
+ 8C19F42717B04E7C005BDB61 /* navBarBackground at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */; };
+ 8C19F42817B04E7C005BDB61 /* navBarBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F42617B04E7C005BDB61 /* navBarBackground.png */; };
+ 8C19F42F17B05089005BDB61 /* LibONavigationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42E17B05089005BDB61 /* LibONavigationController.m */; };
+ 8C19F43017B0518A005BDB61 /* UINavigationController+Theme.h in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */; };
+ 8C19F43117B0518A005BDB61 /* UINavigationController+Theme.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */; };
+ 8C19F43317B056B3005BDB61 /* navBarButtonNormal at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */; };
+ 8C19F43617B10D49005BDB61 /* UIViewController+LibOStyling.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */; };
+ 8C19F43917B145AD005BDB61 /* backButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43717B145AD005BDB61 /* backButton.png */; };
+ 8C19F43A17B145AD005BDB61 /* backButton at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43817B145AD005BDB61 /* backButton at 2x.png */; };
+ 8C19F43E17B1D935005BDB61 /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43C17B1D935005BDB61 /* add.png */; };
+ 8C19F44117B1E961005BDB61 /* gear.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F43F17B1E961005BDB61 /* gear.png */; };
+ 8C19F44217B1E961005BDB61 /* gear at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44017B1E961005BDB61 /* gear at 2x.png */; };
+ 8C19F44517B1F21B005BDB61 /* gear_pressed.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44317B1F21B005BDB61 /* gear_pressed.png */; };
+ 8C19F44617B1F21B005BDB61 /* gear_pressed at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */; };
+ 8C19F44717B1FB51005BDB61 /* iosremote_iphone_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */; };
+ 8C19F44A17B1FEFE005BDB61 /* gear_transparent_bg.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */; };
+ 8C19F44B17B1FEFE005BDB61 /* gear_transparent_bg at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */; };
+ 8C19F44D17B20427005BDB61 /* add at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C19F44C17B20426005BDB61 /* add at 2x.png */; };
8C1A16FD17A2853700B4BB3C /* iosremote_iphone_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FC17A2853700B4BB3C /* iosremote_iphone_icon.png */; };
8C1A16FF17A2853F00B4BB3C /* iosremote_ipad_icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A16FE17A2853F00B4BB3C /* iosremote_ipad_icon.png */; };
8C1A170117A2854300B4BB3C /* iosremote_ipad_icon at 2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 8C1A170017A2854300B4BB3C /* iosremote_ipad_icon at 2x.png */; };
@@ -167,6 +186,32 @@
8C0DC84F17A512250099E5AE /* AppDelegate_ipad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate_ipad.h; path = iosremote/AppDelegate_ipad.h; sourceTree = "<group>"; };
8C0DC85017A512250099E5AE /* AppDelegate_ipad.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate_ipad.m; path = iosremote/AppDelegate_ipad.m; sourceTree = "<group>"; };
8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
+ 8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ 8C19F42017B02AA9005BDB61 /* PopoverView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverView.h; sourceTree = "<group>"; };
+ 8C19F42117B02AA9005BDB61 /* PopoverView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PopoverView.m; sourceTree = "<group>"; };
+ 8C19F42217B02C2E005BDB61 /* PopoverView_Configuration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverView_Configuration.h; sourceTree = "<group>"; };
+ 8C19F42317B02C2E005BDB61 /* PopoverViewCompatibility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PopoverViewCompatibility.h; sourceTree = "<group>"; };
+ 8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "navBarBackground at 2x.png"; sourceTree = "<group>"; };
+ 8C19F42617B04E7C005BDB61 /* navBarBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = navBarBackground.png; sourceTree = "<group>"; };
+ 8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+Theme.h"; sourceTree = "<group>"; };
+ 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+Theme.m"; sourceTree = "<group>"; };
+ 8C19F42B17B04EC6005BDB61 /* UIBarButtonItem+Theme.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIBarButtonItem+Theme.h"; sourceTree = "<group>"; };
+ 8C19F42C17B04EC6005BDB61 /* UIBarButtonItem+Theme.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIBarButtonItem+Theme.m"; sourceTree = "<group>"; };
+ 8C19F42D17B05089005BDB61 /* LibONavigationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibONavigationController.h; path = iosremote/LibONavigationController.h; sourceTree = "<group>"; };
+ 8C19F42E17B05089005BDB61 /* LibONavigationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LibONavigationController.m; path = iosremote/LibONavigationController.m; sourceTree = "<group>"; };
+ 8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "navBarButtonNormal at 2x.png"; path = "iosremote/navBarButtonNormal at 2x.png"; sourceTree = "<group>"; };
+ 8C19F43417B10D48005BDB61 /* UIViewController+LibOStyling.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIViewController+LibOStyling.h"; path = "iosremote/UIViewController+LibOStyling.h"; sourceTree = "<group>"; };
+ 8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIViewController+LibOStyling.m"; path = "iosremote/UIViewController+LibOStyling.m"; sourceTree = "<group>"; };
+ 8C19F43717B145AD005BDB61 /* backButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = backButton.png; path = iosremote/backButton.png; sourceTree = "<group>"; };
+ 8C19F43817B145AD005BDB61 /* backButton at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "backButton at 2x.png"; path = "iosremote/backButton at 2x.png"; sourceTree = "<group>"; };
+ 8C19F43C17B1D935005BDB61 /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = add.png; path = iosremote/add.png; sourceTree = "<group>"; };
+ 8C19F43F17B1E961005BDB61 /* gear.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear.png; path = iosremote/gear.png; sourceTree = "<group>"; };
+ 8C19F44017B1E961005BDB61 /* gear at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear at 2x.png"; path = "iosremote/gear at 2x.png"; sourceTree = "<group>"; };
+ 8C19F44317B1F21B005BDB61 /* gear_pressed.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear_pressed.png; path = iosremote/gear_pressed.png; sourceTree = "<group>"; };
+ 8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear_pressed at 2x.png"; path = "iosremote/gear_pressed at 2x.png"; sourceTree = "<group>"; };
+ 8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = gear_transparent_bg.png; path = iosremote/gear_transparent_bg.png; sourceTree = "<group>"; };
+ 8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "gear_transparent_bg at 2x.png"; path = "iosremote/gear_transparent_bg at 2x.png"; sourceTree = "<group>"; };
+ 8C19F44C17B20426005BDB61 /* add at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "add at 2x.png"; path = "iosremote/add at 2x.png"; sourceTree = "<group>"; };
8C1A16FA17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "iosremote_iphone_icon at 2x.png"; sourceTree = "<group>"; };
8C1A16FC17A2853700B4BB3C /* iosremote_iphone_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iosremote_iphone_icon.png; sourceTree = "<group>"; };
8C1A16FE17A2853F00B4BB3C /* iosremote_ipad_icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = iosremote_ipad_icon.png; sourceTree = "<group>"; };
@@ -212,6 +257,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ 8C19F41F17B02A8A005BDB61 /* QuartzCore.framework in Frameworks */,
8C19F41D17B00899005BDB61 /* SystemConfiguration.framework in Frameworks */,
571102701794128E007D343B /* libz.dylib in Frameworks */,
57DC7007178D84490050FC58 /* CoreMotion.framework in Frameworks */,
@@ -261,6 +307,19 @@
57AEEDAA1788D7B2007F4F97 /* Ressources */ = {
isa = PBXGroup;
children = (
+ 8C19F44C17B20426005BDB61 /* add at 2x.png */,
+ 8C19F44817B1FEFD005BDB61 /* gear_transparent_bg.png */,
+ 8C19F44917B1FEFE005BDB61 /* gear_transparent_bg at 2x.png */,
+ 8C19F44317B1F21B005BDB61 /* gear_pressed.png */,
+ 8C19F44417B1F21B005BDB61 /* gear_pressed at 2x.png */,
+ 8C19F43F17B1E961005BDB61 /* gear.png */,
+ 8C19F44017B1E961005BDB61 /* gear at 2x.png */,
+ 8C19F43C17B1D935005BDB61 /* add.png */,
+ 8C19F43717B145AD005BDB61 /* backButton.png */,
+ 8C19F43817B145AD005BDB61 /* backButton at 2x.png */,
+ 8C19F43217B056B3005BDB61 /* navBarButtonNormal at 2x.png */,
+ 8C19F42517B04E7C005BDB61 /* navBarBackground at 2x.png */,
+ 8C19F42617B04E7C005BDB61 /* navBarBackground.png */,
8C26E5D117A5AFE8007DA4B7 /* slideshowRail.png */,
8C26E5D217A5AFE8007DA4B7 /* slideshowRail at 2x.png */,
8C0DC84617A45B160099E5AE /* libO_icon.png */,
@@ -310,6 +369,7 @@
57C6E3E6175E06E800E8BC5F = {
isa = PBXGroup;
children = (
+ 8C19F41E17B02A8A005BDB61 /* QuartzCore.framework */,
8C19F41C17B00899005BDB61 /* SystemConfiguration.framework */,
8C1A170217A28AB900B4BB3C /* Shared */,
8C1A170917A28E6500B4BB3C /* iPhone */,
@@ -415,6 +475,10 @@
8C1A170617A28DDF00B4BB3C /* Support */ = {
isa = PBXGroup;
children = (
+ 8C19F42017B02AA9005BDB61 /* PopoverView.h */,
+ 8C19F42217B02C2E005BDB61 /* PopoverView_Configuration.h */,
+ 8C19F42317B02C2E005BDB61 /* PopoverViewCompatibility.h */,
+ 8C19F42117B02AA9005BDB61 /* PopoverView.m */,
57B152971764703500EECC67 /* Base64.h */,
57B152981764703500EECC67 /* Base64.m */,
57CFED9717838FDC00E82E05 /* EditableTableViewCell.h */,
@@ -428,6 +492,14 @@
8C26E5D617A68154007DA4B7 /* stopWatch.m */,
8C0323A917A943720037432E /* UIImageView+setImageAnimated.h */,
8C0323AA17A943720037432E /* UIImageView+setImageAnimated.m */,
+ 8C19F42917B04EC6005BDB61 /* UINavigationController+Theme.h */,
+ 8C19F42A17B04EC6005BDB61 /* UINavigationController+Theme.m */,
+ 8C19F42B17B04EC6005BDB61 /* UIBarButtonItem+Theme.h */,
+ 8C19F42C17B04EC6005BDB61 /* UIBarButtonItem+Theme.m */,
+ 8C19F42D17B05089005BDB61 /* LibONavigationController.h */,
+ 8C19F42E17B05089005BDB61 /* LibONavigationController.m */,
+ 8C19F43417B10D48005BDB61 /* UIViewController+LibOStyling.h */,
+ 8C19F43517B10D49005BDB61 /* UIViewController+LibOStyling.m */,
);
name = Support;
sourceTree = "<group>";
@@ -585,7 +657,6 @@
57DF0A85178FFFAB008B2D3D /* iPhone_autosize.storyboard in Resources */,
5711026D1794127E007D343B /* README.md in Resources */,
5711026E1794127E007D343B /* release_notes.md in Resources */,
- 8C1A16FB17A2853100B4BB3C /* iosremote_iphone_icon at 2x.png in Resources */,
8C1A16FD17A2853700B4BB3C /* iosremote_iphone_icon.png in Resources */,
8C1A16FF17A2853F00B4BB3C /* iosremote_ipad_icon.png in Resources */,
8C1A170117A2854300B4BB3C /* iosremote_ipad_icon at 2x.png in Resources */,
@@ -606,6 +677,20 @@
8C26E5C617A5539D007DA4B7 /* UserDefaults.plist in Resources */,
8C26E5D317A5AFE8007DA4B7 /* slideshowRail.png in Resources */,
8C26E5D417A5AFE8007DA4B7 /* slideshowRail at 2x.png in Resources */,
+ 8C19F42717B04E7C005BDB61 /* navBarBackground at 2x.png in Resources */,
+ 8C19F42817B04E7C005BDB61 /* navBarBackground.png in Resources */,
+ 8C19F43317B056B3005BDB61 /* navBarButtonNormal at 2x.png in Resources */,
+ 8C19F43917B145AD005BDB61 /* backButton.png in Resources */,
+ 8C19F43A17B145AD005BDB61 /* backButton at 2x.png in Resources */,
+ 8C19F43E17B1D935005BDB61 /* add.png in Resources */,
+ 8C19F44117B1E961005BDB61 /* gear.png in Resources */,
+ 8C19F44217B1E961005BDB61 /* gear at 2x.png in Resources */,
+ 8C19F44517B1F21B005BDB61 /* gear_pressed.png in Resources */,
+ 8C19F44617B1F21B005BDB61 /* gear_pressed at 2x.png in Resources */,
+ 8C19F44717B1FB51005BDB61 /* iosremote_iphone_icon at 2x.png in Resources */,
+ 8C19F44A17B1FEFE005BDB61 /* gear_transparent_bg.png in Resources */,
+ 8C19F44B17B1FEFE005BDB61 /* gear_transparent_bg at 2x.png in Resources */,
+ 8C19F44D17B20427005BDB61 /* add at 2x.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -616,6 +701,9 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
+ 8C19F43017B0518A005BDB61 /* UINavigationController+Theme.h in Sources */,
+ 8C19F43117B0518A005BDB61 /* UINavigationController+Theme.m in Sources */,
+ 8C19F42417B02C7A005BDB61 /* PopoverView.m in Sources */,
57C6E3FF175E06E800E8BC5F /* main.m in Sources */,
57C6E403175E06E800E8BC5F /* AppDelegate.m in Sources */,
57C6E42E175E076900E8BC5F /* Client.m in Sources */,
@@ -645,6 +733,8 @@
8C26E5D017A58703007DA4B7 /* HorizontalSlideCell.m in Sources */,
8C26E5D717A68154007DA4B7 /* stopWatch.m in Sources */,
8C0323AB17A943720037432E /* UIImageView+setImageAnimated.m in Sources */,
+ 8C19F42F17B05089005BDB61 /* LibONavigationController.m in Sources */,
+ 8C19F43617B10D49005BDB61 /* UIViewController+LibOStyling.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..7c56597
Binary files /dev/null and b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/UserInterfaceState.xcuserstate differ
diff --git a/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..bfffcfe
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/project.xcworkspace/xcuserdata/me.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>HasAskedToTakeAutomaticSnapshotBeforeSignificantChanges</key>
+ <true/>
+ <key>SnapshotAutomaticallyBeforeSignificantChanges</key>
+ <false/>
+</dict>
+</plist>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
new file mode 100644
index 0000000..bbe3fd7
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcdebugger/Breakpoints.xcbkptlist
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ type = "1"
+ version = "1.0">
+ <FileBreakpoints>
+ <FileBreakpoint
+ shouldBeEnabled = "No"
+ ignoreCount = "0"
+ continueAfterRunningActions = "No"
+ filePath = "iosremote/Communication/CommunicationManager.m"
+ timestampString = "397412570.155324"
+ startingColumnNumber = "9223372036854775807"
+ endingColumnNumber = "9223372036854775807"
+ startingLineNumber = "77"
+ endingLineNumber = "77"
+ landmarkName = "-connectionStatusHandler:"
+ landmarkType = "5">
+ </FileBreakpoint>
+ </FileBreakpoints>
+</Bucket>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme
new file mode 100644
index 0000000..5d04313
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/iosremote.xcscheme
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+ LastUpgradeVersion = "0460"
+ version = "1.3">
+ <BuildAction
+ parallelizeBuildables = "YES"
+ buildImplicitDependencies = "YES">
+ <BuildActionEntries>
+ <BuildActionEntry
+ buildForTesting = "YES"
+ buildForRunning = "YES"
+ buildForProfiling = "YES"
+ buildForArchiving = "YES"
+ buildForAnalyzing = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+ BuildableName = "Impress.app"
+ BlueprintName = "Impress"
+ ReferencedContainer = "container:iosremote.xcodeproj">
+ </BuildableReference>
+ </BuildActionEntry>
+ </BuildActionEntries>
+ </BuildAction>
+ <TestAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ buildConfiguration = "Debug">
+ <Testables>
+ </Testables>
+ <MacroExpansion>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+ BuildableName = "Impress.app"
+ BlueprintName = "Impress"
+ ReferencedContainer = "container:iosremote.xcodeproj">
+ </BuildableReference>
+ </MacroExpansion>
+ </TestAction>
+ <LaunchAction
+ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+ selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+ launchStyle = "0"
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Debug"
+ ignoresPersistentStateOnLaunch = "NO"
+ debugDocumentVersioning = "YES"
+ allowLocationSimulation = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+ BuildableName = "Impress.app"
+ BlueprintName = "Impress"
+ ReferencedContainer = "container:iosremote.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ <AdditionalOptions>
+ </AdditionalOptions>
+ </LaunchAction>
+ <ProfileAction
+ shouldUseLaunchSchemeArgsEnv = "YES"
+ savedToolIdentifier = ""
+ useCustomWorkingDirectory = "NO"
+ buildConfiguration = "Release"
+ debugDocumentVersioning = "YES">
+ <BuildableProductRunnable>
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "57C6E3EE175E06E800E8BC5F"
+ BuildableName = "Impress.app"
+ BlueprintName = "Impress"
+ ReferencedContainer = "container:iosremote.xcodeproj">
+ </BuildableReference>
+ </BuildableProductRunnable>
+ </ProfileAction>
+ <AnalyzeAction
+ buildConfiguration = "Debug">
+ </AnalyzeAction>
+ <ArchiveAction
+ buildConfiguration = "Release"
+ revealArchiveInOrganizer = "YES">
+ </ArchiveAction>
+</Scheme>
diff --git a/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..74079c7
--- /dev/null
+++ b/ios/iosremote/iosremote.xcodeproj/xcuserdata/me.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SchemeUserState</key>
+ <dict>
+ <key>iosremote.xcscheme</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>0</integer>
+ </dict>
+ </dict>
+ <key>SuppressBuildableAutocreation</key>
+ <dict>
+ <key>57C6E3EE175E06E800E8BC5F</key>
+ <dict>
+ <key>primary</key>
+ <true/>
+ </dict>
+ </dict>
+</dict>
+</plist>
diff --git a/ios/iosremote/iosremote/.DS_Store b/ios/iosremote/iosremote/.DS_Store
index df84524..8c01359 100644
Binary files a/ios/iosremote/iosremote/.DS_Store and b/ios/iosremote/iosremote/.DS_Store differ
diff --git a/ios/iosremote/iosremote/AppDelegate.m b/ios/iosremote/iosremote/AppDelegate.m
index d39331b..0475bb6 100644
--- a/ios/iosremote/iosremote/AppDelegate.m
+++ b/ios/iosremote/iosremote/AppDelegate.m
@@ -7,7 +7,7 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
#import "AppDelegate.h"
-
+#import "UINavigationController+Theme.h"
@implementation AppDelegate
@synthesize window = _window;
@@ -38,14 +38,27 @@
// mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autolayout" bundle:nil];
// NSLog(@"loading autolayout storyboard");
// } else {
-// mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autosize" bundle:nil];
+// UIStoryboard * mainStoryboard = [UIStoryboard storyboardWithName:@"iPhone_autosize" bundle:nil];
// NSLog(@"Doesn't support autolayout, loading autosize");
// }
//
// self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// self.window.rootViewController = [mainStoryboard instantiateInitialViewController];
+// [(UINavigationController *)self.window.rootViewController loadTheme];
// [self.window makeKeyAndVisible];
+ [[UIBarButtonItem appearanceWhenContainedIn:[UINavigationBar class], nil]
+ setBackgroundImage:[UIImage imageNamed:@"navBarButtonNormal"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
+ NSDictionary *attributes = [NSDictionary dictionaryWithObjects:
+ [NSArray arrayWithObjects: [UIFont boldSystemFontOfSize:15], [UIColor colorWithRed:1.0 green:0.231372549 blue:0.188235294 alpha:1.0], [UIColor clearColor], nil]
+ forKeys: [NSArray arrayWithObjects:UITextAttributeFont, UITextAttributeTextColor, UITextAttributeTextShadowColor, nil]];
+ [[UIBarButtonItem appearance] setTitleTextAttributes:attributes
+ forState:UIControlStateNormal];
+ attributes = [NSDictionary dictionaryWithObjects:
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list