Browse Source

Re-wrote menu to get rid of the buttons, most of the xib and further cluttery

Felix Paul Kühne 12 years ago
parent
commit
784de957f8

+ 2 - 1
AspenProject/VLCAppDelegate.m

@@ -19,6 +19,7 @@
 #import "PAPasscodeViewController.h"
 #import "UINavigationController+Theme.h"
 #import "VLCHTTPUploaderController.h"
+#import "VLCMenuTableViewController.h"
 
 @interface VLCAppDelegate () <PAPasscodeViewControllerDelegate, VLCMediaFileDiscovererDelegate> {
     PAPasscodeViewController *_passcodeLockController;
@@ -63,7 +64,7 @@
     [navCon loadTheme];
 
     _revealController = [[GHRevealViewController alloc] initWithNibName:nil bundle:nil];
-    _revealController.sidebarViewController = [[VLCMenuViewController alloc] initWithNibName:nil bundle:nil];
+    _revealController.sidebarViewController = [[VLCMenuTableViewController alloc] initWithNibName:nil bundle:nil];
     _revealController.contentViewController = navCon;
 
     self.window.rootViewController = self.revealController;

+ 23 - 0
AspenProject/VLCMenuTableViewController.h

@@ -0,0 +1,23 @@
+//
+//  VLCMenuTableViewController.h
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+@class VLCSettingsController;
+@class IASKAppSettingsViewController;
+
+@interface VLCMenuTableViewController : UIViewController
+
+@property (strong, nonatomic) IASKAppSettingsViewController *settingsViewController;
+@property (strong, nonatomic) VLCSettingsController *settingsController;
+
+@property (nonatomic, strong) UITableView *tableView;
+
+@end

+ 299 - 0
AspenProject/VLCMenuTableViewController.m

@@ -0,0 +1,299 @@
+//
+//  VLCMenuTableViewController.m
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "VLCMenuTableViewController.h"
+#import "GHRevealViewController.h"
+#import "GHMenuCell.h"
+#import "Reachability.h"
+#import <QuartzCore/QuartzCore.h>
+#import "VLCWiFiUploadTableViewCell.h"
+#import "VLCHTTPUploaderController.h"
+#import "VLCAppDelegate.h"
+#import "HTTPServer.h"
+#import "IASKAppSettingsViewController.h"
+#import "GHRevealViewController.h"
+#import "VLCLocalServerListViewController.h"
+#import "VLCOpenNetworkStreamViewController.h"
+#import "VLCHTTPDownloadViewController.h"
+#import "VLCSettingsController.h"
+#import "UINavigationController+Theme.h"
+#import "UIBarButtonItem+Theme.h"
+#import "VLCAboutViewController.h"
+#import "VLCPlaylistViewController.h"
+#import "VLCBugreporter.h"
+
+@interface VLCMenuTableViewController () <UITableViewDataSource, UITableViewDelegate>
+{
+    NSArray *_sectionHeaderTexts;
+    NSArray *_menuItemsSectionOne;
+    NSArray *_menuItemsSectionTwo;
+    NSArray *_menuItemsSectionThree;
+
+    UILabel *_uploadLocationLabel;
+    UISwitch *_uploadSwitch;
+    Reachability *_reachability;
+}
+
+@property (nonatomic) VLCHTTPUploaderController *uploadController;
+@property (nonatomic) VLCAppDelegate *appDelegate;
+@property (nonatomic) GHRevealViewController *revealController;
+
+@end
+
+@implementation VLCMenuTableViewController
+
+- (void)dealloc
+{
+    [_reachability stopNotifier];
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+
+- (void)viewDidLoad
+{
+    [super viewDidLoad];
+
+    self.view.frame = CGRectMake(0.0f, 0.0f, kGHRevealSidebarWidth, CGRectGetHeight(self.view.bounds));
+	self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight;
+
+    _sectionHeaderTexts = @[@"Media Library", @"Network", @"Settings"];
+    _menuItemsSectionOne = @[@"All Files"];
+    _menuItemsSectionTwo = @[@"Local Network", @"OPEN_NETWORK", @"DOWNLOAD_FROM_HTTP", @"WiFi Upload", @"Dropbox"];
+    _menuItemsSectionThree = @[@"Settings", @"ABOUT_APP"];
+
+	_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0f, 44.0f, kGHRevealSidebarWidth, CGRectGetHeight(self.view.bounds) - 44.0f)
+												  style:UITableViewStylePlain];
+	_tableView.delegate = self;
+	_tableView.dataSource = self;
+	_tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
+	_tableView.backgroundColor = [UIColor clearColor];
+	_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+    _tableView.rowHeight = [VLCWiFiUploadTableViewCell heightOfCell];
+
+    self.view = _tableView;
+	[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
+
+    _reachability = [Reachability reachabilityForLocalWiFi];
+    [_reachability startNotifier];
+
+    [self netReachabilityChanged:nil];
+
+    self.appDelegate = [[UIApplication sharedApplication] delegate];
+    self.uploadController = self.appDelegate.uploadController;
+    self.revealController = self.appDelegate.revealController;
+
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(netReachabilityChanged:) name:kReachabilityChangedNotification object:nil];
+}
+
+- (void)viewWillAppear:(BOOL)animated {
+	self.view.frame = CGRectMake(0.0f, 0.0f,kGHRevealSidebarWidth, CGRectGetHeight(self.view.bounds));
+}
+
+- (void)netReachabilityChanged:(NSNotification *)notification
+{
+    if (_reachability.currentReachabilityStatus == ReachableViaWiFi) {
+        _uploadSwitch.enabled = YES;
+        _uploadLocationLabel.text = NSLocalizedString(@"HTTP_UPLOAD_SERVER_OFF", @"");
+    } else {
+        _uploadSwitch.enabled = NO;
+        _uploadSwitch.on = NO;
+        _uploadLocationLabel.text = NSLocalizedString(@"HTTP_UPLOAD_NO_CONNECTIVITY", @"");
+    }
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orientation {
+	return (orientation == UIInterfaceOrientationPortraitUpsideDown)
+    ? (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
+    : YES;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+    return 3;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    if (section == 0) // media
+        return 1;
+    else if (section == 1) // network
+        return 5;
+    else if (section == 2) // settings & co
+        return 2;
+    else
+        return 0;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    static NSString *CellIdentifier = @"VLCMenuCell";
+    static NSString *WiFiCellIdentifier = @"VLCMenuWiFiCell";
+
+    NSString *title;
+    if (indexPath.section == 0)
+        title = NSLocalizedString(_menuItemsSectionOne[indexPath.row], @"");
+    else if(indexPath.section == 1)
+        title = NSLocalizedString(_menuItemsSectionTwo[indexPath.row], @"");
+    else if(indexPath.section == 2)
+        title = NSLocalizedString(_menuItemsSectionThree[indexPath.row], @"");
+
+    UITableViewCell *cell;
+
+    if ([title isEqualToString:@"WiFi Upload"]) {
+        cell = (VLCWiFiUploadTableViewCell *)[tableView dequeueReusableCellWithIdentifier:WiFiCellIdentifier];
+        if (cell == nil)
+            cell = [VLCWiFiUploadTableViewCell cellWithReuseIdentifier:WiFiCellIdentifier];
+    } else {
+        cell = (GHMenuCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+        if (cell == nil)
+            cell = [[GHMenuCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
+    }
+
+    if ([title isEqualToString:@"Dropbox"]) {
+        [[(GHMenuCell*)cell titleImageView] setImage: [UIImage imageNamed:@"dropboxLabel"]];
+        cell.textLabel.text = @"";
+    } else if ([title isEqualToString:@"WiFi Upload"]) {
+        _uploadLocationLabel = [(VLCWiFiUploadTableViewCell*)cell uploadAddressLabel];
+        _uploadSwitch = [(VLCWiFiUploadTableViewCell*)cell serverOnSwitch];
+        [_uploadSwitch addTarget:self action:@selector(toggleHTTPServer:) forControlEvents:UIControlEventTouchUpInside];
+
+        BOOL isHTTPServerOn = [[NSUserDefaults standardUserDefaults] boolForKey:kVLCSettingSaveHTTPUploadServerStatus];
+        [_uploadSwitch setOn:isHTTPServerOn];
+        [self updateHTTPServerAddress];
+    } else
+        cell.textLabel.text = title;
+
+    return cell;
+}
+
+#pragma mark - tv delegate
+- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
+    if (section < 3)
+        return 21.f;
+    return 0.;
+}
+
+- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
+	NSObject *headerText = NSLocalizedString(_sectionHeaderTexts[section], @"");
+	UIView *headerView = nil;
+	if (headerText != [NSNull null]) {
+		headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 21.0f)];
+		CAGradientLayer *gradient = [CAGradientLayer layer];
+		gradient.frame = headerView.bounds;
+		gradient.colors = @[
+                      (id)[UIColor colorWithRed:(67.0f/255.0f) green:(74.0f/255.0f) blue:(94.0f/255.0f) alpha:1.0f].CGColor,
+                      (id)[UIColor colorWithRed:(57.0f/255.0f) green:(64.0f/255.0f) blue:(82.0f/255.0f) alpha:1.0f].CGColor,
+                      ];
+		[headerView.layer insertSublayer:gradient atIndex:0];
+
+		UILabel *textLabel = [[UILabel alloc] initWithFrame:CGRectInset(headerView.bounds, 12.0f, 5.0f)];
+		textLabel.text = (NSString *) headerText;
+		textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:([UIFont systemFontSize] * 0.8f)];
+		textLabel.shadowOffset = CGSizeMake(0.0f, 1.0f);
+		textLabel.shadowColor = [UIColor colorWithWhite:0.0f alpha:0.25f];
+		textLabel.textColor = [UIColor colorWithRed:(125.0f/255.0f) green:(129.0f/255.0f) blue:(146.0f/255.0f) alpha:1.0f];
+		textLabel.backgroundColor = [UIColor clearColor];
+		[headerView addSubview:textLabel];
+
+		UIView *topLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+		topLine.backgroundColor = [UIColor colorWithRed:(78.0f/255.0f) green:(86.0f/255.0f) blue:(103.0f/255.0f) alpha:1.0f];
+		[headerView addSubview:topLine];
+
+		UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 21.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+		bottomLine.backgroundColor = [UIColor colorWithRed:(36.0f/255.0f) green:(42.0f/255.0f) blue:(5.0f/255.0f) alpha:1.0f];
+		[headerView addSubview:bottomLine];
+	}
+	return headerView;
+}
+
+#pragma mark - menu implementation
+
+- (void)updateHTTPServerAddress
+{
+    HTTPServer *server = self.uploadController.httpServer;
+    if (server.isRunning)
+        _uploadLocationLabel.text = [NSString stringWithFormat:@"http://%@:%i", [self.uploadController currentIPAddress], server.listeningPort];
+    else
+        _uploadLocationLabel.text = NSLocalizedString(@"HTTP_UPLOAD_SERVER_OFF", @"");
+}
+
+- (IBAction)toggleHTTPServer:(UISwitch *)sender
+{
+    [[NSUserDefaults standardUserDefaults] setBool:sender.on forKey:kVLCSettingSaveHTTPUploadServerStatus];
+    [self.uploadController changeHTTPServerState:sender.on];
+    [self updateHTTPServerAddress];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+}
+
+- (void)_revealItem:(NSUInteger)itemIndex inSection:(NSUInteger)sectionNumber
+{
+    UIViewController *viewController;
+    if (sectionNumber == 1) {
+        if (itemIndex == 0)
+            viewController = [[VLCLocalServerListViewController alloc] init];
+        else if (itemIndex == 1)
+            viewController = [[VLCOpenNetworkStreamViewController alloc] init];
+        else if (itemIndex == 2)
+            viewController = [[VLCHTTPDownloadViewController alloc] init];
+        else if (itemIndex == 4)
+            viewController = self.appDelegate.dropboxTableViewController;
+    } else if (sectionNumber == 2) {
+        if (itemIndex == 0) {
+            if (!self.settingsController)
+                self.settingsController = [[VLCSettingsController alloc] init];
+
+            if (!self.settingsViewController) {
+                self.settingsViewController = [[IASKAppSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped];
+                self.settingsController.viewController = self.settingsViewController;
+                self.settingsViewController.navigationItem.leftBarButtonItem = [UIBarButtonItem themedRevealMenuButtonWithTarget:self.settingsController andSelector:@selector(dismiss:)];
+            }
+
+            self.settingsViewController.modalPresentationStyle = UIModalPresentationFormSheet;
+            self.settingsViewController.delegate = self.settingsController;
+            self.settingsViewController.showDoneButton = NO;
+            self.settingsViewController.showCreditsFooter = NO;
+
+            viewController = self.settingsController.viewController;
+        } else if (itemIndex == 1)
+            viewController = [[VLCAboutViewController alloc] init];
+    } else
+        viewController = self.appDelegate.playlistViewController;
+
+    if (!viewController)
+        return;
+
+    UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:viewController];
+    [navCon loadTheme];
+
+    _revealController.contentViewController = navCon;
+	[_revealController toggleSidebar:NO duration:kGHRevealSidebarDefaultAnimationDuration];
+}
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+	[self _revealItem:indexPath.row inSection:indexPath.section];
+}
+
+#pragma mark Public Methods
+- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated scrollPosition:(UITableViewScrollPosition)scrollPosition {
+	[self.tableView selectRowAtIndexPath:indexPath animated:animated scrollPosition:scrollPosition];
+	if (scrollPosition == UITableViewScrollPositionNone)
+		[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated];
+
+    [self _revealItem:indexPath.row inSection:indexPath.section];
+}
+
+#pragma mark - shake to support
+
+- (BOOL)canBecomeFirstResponder {
+    return YES;
+}
+
+- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
+    if (motion == UIEventSubtypeMotionShake)
+        [[VLCBugreporter sharedInstance] handleBugreportRequest];
+}
+
+@end

+ 22 - 0
AspenProject/VLCWiFiUploadTableViewCell.h

@@ -0,0 +1,22 @@
+//
+//  VLCWiFiUploadTableViewCell.h
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface VLCWiFiUploadTableViewCell : UITableViewCell
+
+@property (nonatomic, strong) IBOutlet UILabel *titleLabel;
+@property (nonatomic, strong) IBOutlet UILabel *uploadAddressLabel;
+@property (nonatomic, strong) IBOutlet UISwitch *serverOnSwitch;
+
++ (VLCWiFiUploadTableViewCell *)cellWithReuseIdentifier:(NSString *)ident;
++ (CGFloat)heightOfCell;
+
+@end

+ 47 - 0
AspenProject/VLCWiFiUploadTableViewCell.m

@@ -0,0 +1,47 @@
+//
+//  VLCWiFiUploadTableViewCell.m
+//  VLC for iOS
+//
+//  Created by Felix Paul Kühne on 10.08.13.
+//  Copyright (c) 2013 VideoLAN. All rights reserved.
+//
+//  Refer to the COPYING file of the official project for license.
+//
+
+#import "VLCWiFiUploadTableViewCell.h"
+
+@implementation VLCWiFiUploadTableViewCell
+
++ (VLCWiFiUploadTableViewCell *)cellWithReuseIdentifier:(NSString *)ident
+{
+    NSArray *nibContentArray = [[NSBundle mainBundle] loadNibNamed:@"VLCWiFiUploadTableViewCell" owner:nil options:nil];
+    NSAssert([nibContentArray count] == 1, @"meh");
+    NSAssert([[nibContentArray lastObject] isKindOfClass:[VLCWiFiUploadTableViewCell class]], @"meh meh");
+    VLCWiFiUploadTableViewCell *cell = (VLCWiFiUploadTableViewCell *)[nibContentArray lastObject];
+
+    return cell;
+}
+
+- (void)awakeFromNib
+{
+    self.titleLabel.text = NSLocalizedString(@"HTTP_UPLOAD", @"");
+
+    UIView *topLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+    topLine.backgroundColor = [UIColor colorWithRed:(54.0f/255.0f) green:(61.0f/255.0f) blue:(76.0f/255.0f) alpha:1.0f];
+    [self.titleLabel.superview addSubview:topLine];
+
+    UIView *topLine2 = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 1.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+    topLine2.backgroundColor = [UIColor colorWithRed:(54.0f/255.0f) green:(61.0f/255.0f) blue:(77.0f/255.0f) alpha:1.0f];
+    [self.titleLabel.superview addSubview:topLine2];
+
+    UIView *bottomLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 50.0f, [UIScreen mainScreen].bounds.size.height, 1.0f)];
+    bottomLine.backgroundColor = [UIColor colorWithRed:(40.0f/255.0f) green:(47.0f/255.0f) blue:(61.0f/255.0f) alpha:1.0f];
+    [self.titleLabel.superview addSubview:bottomLine];
+}
+
++ (CGFloat)heightOfCell
+{
+    return 50.;
+}
+
+@end

+ 1 - 1
NEWS

@@ -5,7 +5,7 @@
 * Improved Subtitles support with options to choose font, size, and color
 * Add UPNP discovery and streaming (#8880)
 * Add Bonjour announcement for the WiFi Uploader's website (#8741)
-* Redesigned menu and application flow (#9045)
+* Newly implemented menu and application flow (#9045)
 * Add Deinterlace option (off by default, #8813)
 * Device no longer goes to sleep during media downloads (#9062)
 * Improved video output on external screens (#9079)

+ 287 - 0
Resources/VLCWiFiUploadTableViewCell.xib

@@ -0,0 +1,287 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<archive type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="8.00">
+	<data>
+		<int key="IBDocument.SystemTarget">1296</int>
+		<string key="IBDocument.SystemVersion">12F33</string>
+		<string key="IBDocument.InterfaceBuilderVersion">3084</string>
+		<string key="IBDocument.AppKitVersion">1187.39</string>
+		<string key="IBDocument.HIToolboxVersion">626.00</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			<string key="NS.object.0">2083</string>
+		</object>
+		<array key="IBDocument.IntegratedClassDependencies">
+			<string>IBProxyObject</string>
+			<string>IBUILabel</string>
+			<string>IBUISwitch</string>
+			<string>IBUITableViewCell</string>
+		</array>
+		<array key="IBDocument.PluginDependencies">
+			<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+		</array>
+		<object class="NSMutableDictionary" key="IBDocument.Metadata">
+			<string key="NS.key.0">PluginDependencyRecalculationVersion</string>
+			<integer value="1" key="NS.object.0"/>
+		</object>
+		<array class="NSMutableArray" key="IBDocument.RootObjects" id="1000">
+			<object class="IBProxyObject" id="372490531">
+				<string key="IBProxiedObjectIdentifier">IBFilesOwner</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBProxyObject" id="975951072">
+				<string key="IBProxiedObjectIdentifier">IBFirstResponder</string>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+			</object>
+			<object class="IBUITableViewCell" id="962619467">
+				<reference key="NSNextResponder"/>
+				<int key="NSvFlags">292</int>
+				<array class="NSMutableArray" key="NSSubviews">
+					<object class="IBUIView" id="162418872">
+						<reference key="NSNextResponder" ref="962619467"/>
+						<int key="NSvFlags">256</int>
+						<array class="NSMutableArray" key="NSSubviews">
+							<object class="IBUILabel" id="76807315">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{4, 6}, {164, 21}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="69574698"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">HTTP Upload</string>
+								<object class="NSColor" key="IBUITextColor" id="991848793">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MC42NjY2NjY2NjY3AA</bytes>
+								</object>
+								<nil key="IBUIHighlightedColor"/>
+								<int key="IBUIBaselineAdjustment">0</int>
+								<int key="IBUITextAlignment">1</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription">
+									<int key="type">2</int>
+									<double key="pointSize">15</double>
+								</object>
+								<object class="NSFont" key="IBUIFont">
+									<string key="NSName">Helvetica-Bold</string>
+									<double key="NSSize">15</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+							<object class="IBUISwitch" id="69574698">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">289</int>
+								<string key="NSFrame">{{161, 3}, {94, 27}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView" ref="782250670"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<int key="IBUIContentHorizontalAlignment">0</int>
+								<int key="IBUIContentVerticalAlignment">0</int>
+								<object class="NSColor" key="IBUIOnTintColor">
+									<int key="NSColorSpace">3</int>
+									<bytes key="NSWhite">MCAwLjYxAA</bytes>
+									<object class="NSColorSpace" key="NSCustomColorSpace">
+										<int key="NSID">2</int>
+									</object>
+								</object>
+							</object>
+							<object class="IBUILabel" id="782250670">
+								<reference key="NSNextResponder" ref="162418872"/>
+								<int key="NSvFlags">290</int>
+								<string key="NSFrame">{{4, 28}, {249, 21}}</string>
+								<reference key="NSSuperview" ref="162418872"/>
+								<reference key="NSWindow"/>
+								<reference key="NSNextKeyView"/>
+								<string key="NSReuseIdentifierKey">_NS:9</string>
+								<bool key="IBUIOpaque">NO</bool>
+								<bool key="IBUIClipsSubviews">YES</bool>
+								<int key="IBUIContentMode">7</int>
+								<bool key="IBUIUserInteractionEnabled">NO</bool>
+								<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+								<string key="IBUIText">Inactive Server</string>
+								<reference key="IBUITextColor" ref="991848793"/>
+								<nil key="IBUIHighlightedColor"/>
+								<int key="IBUIBaselineAdjustment">0</int>
+								<int key="IBUITextAlignment">1</int>
+								<object class="IBUIFontDescription" key="IBUIFontDescription">
+									<int key="type">1</int>
+									<double key="pointSize">14</double>
+								</object>
+								<object class="NSFont" key="IBUIFont">
+									<string key="NSName">Helvetica</string>
+									<double key="NSSize">14</double>
+									<int key="NSfFlags">16</int>
+								</object>
+								<bool key="IBUIAdjustsFontSizeToFit">NO</bool>
+							</object>
+						</array>
+						<string key="NSFrameSize">{260, 49}</string>
+						<reference key="NSSuperview" ref="962619467"/>
+						<reference key="NSWindow"/>
+						<reference key="NSNextKeyView" ref="76807315"/>
+						<string key="NSReuseIdentifierKey">_NS:11</string>
+						<object class="NSColor" key="IBUIBackgroundColor">
+							<int key="NSColorSpace">3</int>
+							<bytes key="NSWhite">MCAwAA</bytes>
+						</object>
+						<bool key="IBUIOpaque">NO</bool>
+						<bool key="IBUIClipsSubviews">YES</bool>
+						<int key="IBUIContentMode">4</int>
+						<bool key="IBUIMultipleTouchEnabled">YES</bool>
+						<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+					</object>
+				</array>
+				<string key="NSFrameSize">{260, 50}</string>
+				<reference key="NSSuperview"/>
+				<reference key="NSWindow"/>
+				<reference key="NSNextKeyView" ref="162418872"/>
+				<string key="NSReuseIdentifierKey">_NS:9</string>
+				<object class="NSColor" key="IBUIBackgroundColor">
+					<int key="NSColorSpace">3</int>
+					<bytes key="NSWhite">MAA</bytes>
+				</object>
+				<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+				<int key="IBUISelectionStyle">0</int>
+				<reference key="IBUIContentView" ref="162418872"/>
+				<string key="IBUIReuseIdentifier">WiFiMenuCell</string>
+				<real value="46" key="IBUIRowHeight"/>
+			</object>
+		</array>
+		<object class="IBObjectContainer" key="IBDocument.Objects">
+			<array class="NSMutableArray" key="connectionRecords">
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">serverOnSwitch</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="69574698"/>
+					</object>
+					<int key="connectionID">31</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">titleLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="76807315"/>
+					</object>
+					<int key="connectionID">32</int>
+				</object>
+				<object class="IBConnectionRecord">
+					<object class="IBCocoaTouchOutletConnection" key="connection">
+						<string key="label">uploadAddressLabel</string>
+						<reference key="source" ref="962619467"/>
+						<reference key="destination" ref="782250670"/>
+					</object>
+					<int key="connectionID">33</int>
+				</object>
+			</array>
+			<object class="IBMutableOrderedSet" key="objectRecords">
+				<array key="orderedObjects">
+					<object class="IBObjectRecord">
+						<int key="objectID">0</int>
+						<array key="object" id="0"/>
+						<reference key="children" ref="1000"/>
+						<nil key="parent"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-1</int>
+						<reference key="object" ref="372490531"/>
+						<reference key="parent" ref="0"/>
+						<string key="objectName">File's Owner</string>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">-2</int>
+						<reference key="object" ref="975951072"/>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">3</int>
+						<reference key="object" ref="962619467"/>
+						<array class="NSMutableArray" key="children">
+							<reference ref="76807315"/>
+							<reference ref="69574698"/>
+							<reference ref="782250670"/>
+						</array>
+						<reference key="parent" ref="0"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">28</int>
+						<reference key="object" ref="76807315"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">29</int>
+						<reference key="object" ref="69574698"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+					<object class="IBObjectRecord">
+						<int key="objectID">30</int>
+						<reference key="object" ref="782250670"/>
+						<reference key="parent" ref="962619467"/>
+					</object>
+				</array>
+			</object>
+			<dictionary class="NSMutableDictionary" key="flattenedProperties">
+				<string key="-1.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="-2.CustomClassName">UIResponder</string>
+				<string key="-2.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="28.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="29.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="3.CustomClassName">VLCWiFiUploadTableViewCell</string>
+				<string key="3.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+				<string key="30.IBPluginDependency">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+			</dictionary>
+			<dictionary class="NSMutableDictionary" key="unlocalizedProperties"/>
+			<nil key="activeLocalization"/>
+			<dictionary class="NSMutableDictionary" key="localizations"/>
+			<nil key="sourceID"/>
+			<int key="maxID">33</int>
+		</object>
+		<object class="IBClassDescriber" key="IBDocument.Classes">
+			<array class="NSMutableArray" key="referencedPartialClassDescriptions">
+				<object class="IBPartialClassDescription">
+					<string key="className">VLCWiFiUploadTableViewCell</string>
+					<string key="superclassName">UITableViewCell</string>
+					<dictionary class="NSMutableDictionary" key="outlets">
+						<string key="serverOnSwitch">UISwitch</string>
+						<string key="titleLabel">UILabel</string>
+						<string key="uploadAddressLabel">UILabel</string>
+					</dictionary>
+					<dictionary class="NSMutableDictionary" key="toOneOutletInfosByName">
+						<object class="IBToOneOutletInfo" key="serverOnSwitch">
+							<string key="name">serverOnSwitch</string>
+							<string key="candidateClassName">UISwitch</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="titleLabel">
+							<string key="name">titleLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+						<object class="IBToOneOutletInfo" key="uploadAddressLabel">
+							<string key="name">uploadAddressLabel</string>
+							<string key="candidateClassName">UILabel</string>
+						</object>
+					</dictionary>
+					<object class="IBClassDescriptionSource" key="sourceIdentifier">
+						<string key="majorKey">IBProjectSource</string>
+						<string key="minorKey">./Classes/VLCWiFiUploadTableViewCell.h</string>
+					</object>
+				</object>
+			</array>
+		</object>
+		<int key="IBDocument.localizationMode">0</int>
+		<string key="IBDocument.TargetRuntimeIdentifier">IBCocoaTouchFramework</string>
+		<object class="NSMutableDictionary" key="IBDocument.PluginDeclaredDependencies">
+			<string key="NS.key.0">com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS</string>
+			<real value="1296" key="NS.object.0"/>
+		</object>
+		<bool key="IBDocument.PluginDeclaredDependenciesTrackSystemTargetVersion">YES</bool>
+		<int key="IBDocument.defaultPropertyAccessControl">3</int>
+		<string key="IBCocoaTouchPluginVersion">2083</string>
+	</data>
+</archive>

+ 22 - 0
VLC for iOS.xcodeproj/project.pbxproj

@@ -176,6 +176,10 @@
 		7D93044517B684CF0054EAC6 /* VLCLocalNetworkListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93044417B684CF0054EAC6 /* VLCLocalNetworkListCell.m */; };
 		7D93044817B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */; };
 		7D93044917B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */; };
+		7D93045317B6A0DF0054EAC6 /* VLCMenuTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93045217B6A0DF0054EAC6 /* VLCMenuTableViewController.m */; };
+		7D93045617B6A5C00054EAC6 /* GHMenuCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93045517B6A5C00054EAC6 /* GHMenuCell.m */; };
+		7D93045917B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D93045817B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.m */; };
+		7D93045B17B6ACCF0054EAC6 /* VLCWiFiUploadTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 7D93045A17B6ACCF0054EAC6 /* VLCWiFiUploadTableViewCell.xib */; };
 		7D94FCDF16DE7D1000F2623B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCDE16DE7D1000F2623B /* UIKit.framework */; };
 		7D94FCE116DE7D1000F2623B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCE016DE7D1000F2623B /* Foundation.framework */; };
 		7D94FCE316DE7D1000F2623B /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D94FCE216DE7D1000F2623B /* CoreGraphics.framework */; };
@@ -573,6 +577,13 @@
 		7D93044417B684CF0054EAC6 /* VLCLocalNetworkListCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCLocalNetworkListCell.m; sourceTree = "<group>"; };
 		7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCLocalNetworkListCell~ipad.xib"; path = "../Resources/VLCLocalNetworkListCell~ipad.xib"; sourceTree = "<group>"; };
 		7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = "VLCLocalNetworkListCell~iphone.xib"; path = "../Resources/VLCLocalNetworkListCell~iphone.xib"; sourceTree = "<group>"; };
+		7D93045117B6A0DF0054EAC6 /* VLCMenuTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCMenuTableViewController.h; sourceTree = "<group>"; };
+		7D93045217B6A0DF0054EAC6 /* VLCMenuTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCMenuTableViewController.m; sourceTree = "<group>"; };
+		7D93045417B6A5C00054EAC6 /* GHMenuCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GHMenuCell.h; path = ImportedSources/GHSidebarNav/Demo/GHMenuCell.h; sourceTree = SOURCE_ROOT; };
+		7D93045517B6A5C00054EAC6 /* GHMenuCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = GHMenuCell.m; path = ImportedSources/GHSidebarNav/Demo/GHMenuCell.m; sourceTree = SOURCE_ROOT; };
+		7D93045717B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCWiFiUploadTableViewCell.h; sourceTree = "<group>"; };
+		7D93045817B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCWiFiUploadTableViewCell.m; sourceTree = "<group>"; };
+		7D93045A17B6ACCF0054EAC6 /* VLCWiFiUploadTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = VLCWiFiUploadTableViewCell.xib; path = Resources/VLCWiFiUploadTableViewCell.xib; sourceTree = SOURCE_ROOT; };
 		7D94FCDB16DE7D1000F2623B /* VLC for iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VLC for iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
 		7D94FCDE16DE7D1000F2623B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
 		7D94FCE016DE7D1000F2623B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -994,8 +1005,12 @@
 			children = (
 				7D6BA1141748EFE100C0E203 /* VLCMenuViewController.h */,
 				7D6BA1151748EFE100C0E203 /* VLCMenuViewController.m */,
+				7D93045117B6A0DF0054EAC6 /* VLCMenuTableViewController.h */,
+				7D93045217B6A0DF0054EAC6 /* VLCMenuTableViewController.m */,
 				7D2339AC176DE72E008D223C /* VLCOpenNetworkStreamViewController.h */,
 				7D2339AD176DE72E008D223C /* VLCOpenNetworkStreamViewController.m */,
+				7D93045717B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.h */,
+				7D93045817B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.m */,
 			);
 			name = Menu;
 			sourceTree = "<group>";
@@ -1005,6 +1020,8 @@
 			children = (
 				7D31001B17B64AE100E6516D /* GHRevealViewController.h */,
 				7D31001C17B64AE100E6516D /* GHRevealViewController.m */,
+				7D93045417B6A5C00054EAC6 /* GHMenuCell.h */,
+				7D93045517B6A5C00054EAC6 /* GHMenuCell.m */,
 			);
 			name = GHSidebarNav;
 			sourceTree = "<group>";
@@ -1344,6 +1361,7 @@
 		7DADC55C1704FAA8001DAC63 /* XIBs */ = {
 			isa = PBXGroup;
 			children = (
+				7D93045A17B6ACCF0054EAC6 /* VLCWiFiUploadTableViewCell.xib */,
 				7D93044617B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib */,
 				7D93044717B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib */,
 				7DB43834176E20CC00F460EE /* VLCHTTPDownloadViewController.xib */,
@@ -1717,6 +1735,7 @@
 				7DD2A3A9179C04A7003EB537 /* OpenSans-Regular.ttf in Resources */,
 				7D93044817B687C90054EAC6 /* VLCLocalNetworkListCell~ipad.xib in Resources */,
 				7D93044917B687C90054EAC6 /* VLCLocalNetworkListCell~iphone.xib in Resources */,
+				7D93045B17B6ACCF0054EAC6 /* VLCWiFiUploadTableViewCell.xib in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -1812,6 +1831,9 @@
 				7D31001D17B64AE100E6516D /* GHRevealViewController.m in Sources */,
 				7D93044117B67C4F0054EAC6 /* VLCLocalServerListViewController.m in Sources */,
 				7D93044517B684CF0054EAC6 /* VLCLocalNetworkListCell.m in Sources */,
+				7D93045317B6A0DF0054EAC6 /* VLCMenuTableViewController.m in Sources */,
+				7D93045617B6A5C00054EAC6 /* GHMenuCell.m in Sources */,
+				7D93045917B6ACA10054EAC6 /* VLCWiFiUploadTableViewCell.m in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};