shlist

share and manage lists between multiple people
Log | Files | Refs

commit dfaa34db1db1b75b9fad0a6124c3f9bc9c8db375
parent 0cf4502dd475efa0f09319f307af75416f797f82
Author: Kyle Milz <kyle@Kyles-MacBook-Pro.local>
Date:   Sun, 23 Aug 2015 22:39:10 -0600

ios-ng: add custom rows, start adding list item updating

Diffstat:
Mios-ng/shlist.xcodeproj/project.pbxproj | 20++++++++++++++++++++
Mios-ng/shlist/Base.lproj/Main.storyboard | 51+++++++++++++++++++++++++++++++++++++++++++--------
Mios-ng/shlist/ListDetailTableViewController.m | 59+++++++++++++++++++++++++++++++++++++++++++++++++++--------
Mios-ng/shlist/ListItem.h | 3+++
Mios-ng/shlist/SharedListsTableViewController.m | 27+++++++++++++++++++++++++--
Mios-ng/shlist/ShlistServer.h | 3+++
Mios-ng/shlist/ShlistServer.m | 15+++++++++++----
7 files changed, 156 insertions(+), 22 deletions(-)

diff --git a/ios-ng/shlist.xcodeproj/project.pbxproj b/ios-ng/shlist.xcodeproj/project.pbxproj @@ -23,6 +23,11 @@ 27C70F301B33F4FA00DADEB3 /* SharedListsTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 27C70F2F1B33F4FA00DADEB3 /* SharedListsTableViewController.m */; }; 27C70F321B3650CB00DADEB3 /* libsqlite3.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 27C70F311B3650CB00DADEB3 /* libsqlite3.dylib */; }; 27C70F351B36513200DADEB3 /* DBManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 27C70F341B36513200DADEB3 /* DBManager.m */; }; + 27DCC9DC1B8A96A900207340 /* dollar103.png in Resources */ = {isa = PBXBuildFile; fileRef = 27DCC9DB1B8A96A900207340 /* dollar103.png */; }; + 27DCC9DE1B8A98D400207340 /* dollar103-2.png in Resources */ = {isa = PBXBuildFile; fileRef = 27DCC9DD1B8A98D400207340 /* dollar103-2.png */; }; + 27DCC9E01B8A993300207340 /* dollar103-3.png in Resources */ = {isa = PBXBuildFile; fileRef = 27DCC9DF1B8A993300207340 /* dollar103-3.png */; }; + 27DCC9E21B8A9A6900207340 /* dollar103-4.png in Resources */ = {isa = PBXBuildFile; fileRef = 27DCC9E11B8A9A6900207340 /* dollar103-4.png */; }; + 27DCC9E41B8A9EBB00207340 /* information15-2.png in Resources */ = {isa = PBXBuildFile; fileRef = 27DCC9E31B8A9EBB00207340 /* information15-2.png */; }; BF7776B91B38928D00526CB0 /* ListDetailTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7776B81B38928D00526CB0 /* ListDetailTableViewController.m */; }; BF7776BC1B38D0DB00526CB0 /* ListItem.m in Sources */ = {isa = PBXBuildFile; fileRef = BF7776BB1B38D0DB00526CB0 /* ListItem.m */; }; /* End PBXBuildFile section */ @@ -66,6 +71,11 @@ 27C70F311B3650CB00DADEB3 /* libsqlite3.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libsqlite3.dylib; path = usr/lib/libsqlite3.dylib; sourceTree = SDKROOT; }; 27C70F331B36513200DADEB3 /* DBManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBManager.h; sourceTree = "<group>"; }; 27C70F341B36513200DADEB3 /* DBManager.m */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.c.objc; path = DBManager.m; sourceTree = "<group>"; tabWidth = 8; usesTabs = 1; }; + 27DCC9DB1B8A96A900207340 /* dollar103.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dollar103.png; path = ../../../Downloads/dollar103.png; sourceTree = "<group>"; }; + 27DCC9DD1B8A98D400207340 /* dollar103-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dollar103-2.png"; path = "../../../Downloads/dollar103-2.png"; sourceTree = "<group>"; }; + 27DCC9DF1B8A993300207340 /* dollar103-3.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dollar103-3.png"; path = "../../../Downloads/dollar103-3.png"; sourceTree = "<group>"; }; + 27DCC9E11B8A9A6900207340 /* dollar103-4.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dollar103-4.png"; path = "../../../Downloads/dollar103-4.png"; sourceTree = "<group>"; }; + 27DCC9E31B8A9EBB00207340 /* information15-2.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "information15-2.png"; path = "../../../Downloads/information15-2.png"; sourceTree = "<group>"; }; BF7776B71B38928D00526CB0 /* ListDetailTableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListDetailTableViewController.h; sourceTree = "<group>"; }; BF7776B81B38928D00526CB0 /* ListDetailTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ListDetailTableViewController.m; sourceTree = "<group>"; }; BF7776BA1B38D0DB00526CB0 /* ListItem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ListItem.h; sourceTree = "<group>"; }; @@ -128,8 +138,13 @@ 27B039FD1B43B6830054B6D2 /* ContactsViewController.h */, 27B039FE1B43B6830054B6D2 /* ContactsViewController.m */, 27C70F0C1B32AF8000DADEB3 /* Main.storyboard */, + 27DCC9DB1B8A96A900207340 /* dollar103.png */, BF7776B71B38928D00526CB0 /* ListDetailTableViewController.h */, BF7776B81B38928D00526CB0 /* ListDetailTableViewController.m */, + 27DCC9E31B8A9EBB00207340 /* information15-2.png */, + 27DCC9E11B8A9A6900207340 /* dollar103-4.png */, + 27DCC9DF1B8A993300207340 /* dollar103-3.png */, + 27DCC9DD1B8A98D400207340 /* dollar103-2.png */, BF7776BA1B38D0DB00526CB0 /* ListItem.h */, BF7776BB1B38D0DB00526CB0 /* ListItem.m */, 27C70F2E1B33F4FA00DADEB3 /* SharedListsTableViewController.h */, @@ -253,8 +268,13 @@ buildActionMask = 2147483647; files = ( 27C70F0E1B32AF8000DADEB3 /* Main.storyboard in Resources */, + 27DCC9E41B8A9EBB00207340 /* information15-2.png in Resources */, 27C70F131B32AF8000DADEB3 /* LaunchScreen.xib in Resources */, + 27DCC9E21B8A9A6900207340 /* dollar103-4.png in Resources */, + 27DCC9E01B8A993300207340 /* dollar103-3.png in Resources */, + 27DCC9DC1B8A96A900207340 /* dollar103.png in Resources */, 27C70F101B32AF8000DADEB3 /* Images.xcassets in Resources */, + 27DCC9DE1B8A98D400207340 /* dollar103-2.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios-ng/shlist/Base.lproj/Main.storyboard b/ios-ng/shlist/Base.lproj/Main.storyboard @@ -15,24 +15,53 @@ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> <prototypes> - <tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="ListDetailPrototypeCell" textLabel="rxW-Ue-XrL" detailTextLabel="Q7z-lr-GKp" style="IBUITableViewCellStyleValue2" id="s1K-8G-gXq"> + <tableViewCell contentMode="scaleToFill" selectionStyle="default" accessoryType="disclosureIndicator" indentationWidth="10" reuseIdentifier="ListDetailPrototypeCell" id="s1K-8G-gXq"> <autoresizingMask key="autoresizingMask"/> <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="s1K-8G-gXq" id="H4s-wq-8Lq"> <autoresizingMask key="autoresizingMask"/> <subviews> - <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="rxW-Ue-XrL"> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <fontDescription key="fontDescription" type="system" pointSize="12"/> - <color key="textColor" red="0.0" green="0.47843137254901963" blue="1" alpha="1" colorSpace="calibratedRGB"/> + <imageView userInteractionEnabled="NO" tag="1" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="zsB-mz-ffa"> + <rect key="frame" x="8" y="14" width="16" height="16"/> + <constraints> + <constraint firstAttribute="height" constant="16" id="F2X-d2-ZlF"/> + <constraint firstAttribute="width" constant="16" id="yLY-Mg-1wi"/> + </constraints> + </imageView> + <label opaque="NO" userInteractionEnabled="NO" tag="2" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="btC-Lf-VTy"> + <rect key="frame" x="32" y="11" width="46" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <nil key="highlightedColor"/> </label> - <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="Q7z-lr-GKp"> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <fontDescription key="fontDescription" type="system" pointSize="12"/> + <switch opaque="NO" tag="5" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="n1B-AB-bme"> + <rect key="frame" x="510" y="6" width="51" height="31"/> + </switch> + <label opaque="NO" userInteractionEnabled="NO" tag="4" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Owner" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0TP-dF-f2P"> + <rect key="frame" x="451" y="11" width="51" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> <nil key="highlightedColor"/> </label> + <label opaque="NO" userInteractionEnabled="NO" tag="3" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" misplaced="YES" text="Quantity" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="upb-uA-yH2"> + <rect key="frame" x="86" y="11" width="64" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="14"/> + <color key="textColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> + <nil key="highlightedColor"/> + </label> </subviews> + <constraints> + <constraint firstItem="upb-uA-yH2" firstAttribute="leading" secondItem="btC-Lf-VTy" secondAttribute="trailing" constant="8" id="7TQ-hg-IXK"/> + <constraint firstItem="upb-uA-yH2" firstAttribute="leading" secondItem="btC-Lf-VTy" secondAttribute="trailing" constant="8" id="7aj-Mf-7or"/> + <constraint firstAttribute="centerY" secondItem="zsB-mz-ffa" secondAttribute="centerY" id="Kke-yQ-lIU"/> + <constraint firstItem="btC-Lf-VTy" firstAttribute="leading" secondItem="zsB-mz-ffa" secondAttribute="trailing" constant="8" id="M46-uZ-0Zj"/> + <constraint firstAttribute="centerY" secondItem="upb-uA-yH2" secondAttribute="centerY" id="MWW-iY-71k"/> + <constraint firstItem="n1B-AB-bme" firstAttribute="trailing" secondItem="H4s-wq-8Lq" secondAttribute="trailingMargin" id="VG7-8h-1wm"/> + <constraint firstAttribute="centerY" secondItem="btC-Lf-VTy" secondAttribute="centerY" id="Yg4-lg-cMN"/> + <constraint firstAttribute="centerY" secondItem="0TP-dF-f2P" secondAttribute="centerY" id="chu-HH-HQT"/> + <constraint firstAttribute="centerY" secondItem="n1B-AB-bme" secondAttribute="centerY" id="cyz-Nv-ZRW"/> + <constraint firstItem="zsB-mz-ffa" firstAttribute="leading" secondItem="H4s-wq-8Lq" secondAttribute="leadingMargin" id="pRr-Zl-ahy"/> + <constraint firstItem="n1B-AB-bme" firstAttribute="leading" secondItem="0TP-dF-f2P" secondAttribute="trailing" constant="8" id="rYF-Sw-Bsg"/> + </constraints> </tableViewCellContentView> <connections> <segue destination="2Mz-oY-P1s" kind="show" id="3ew-8g-3Od"/> @@ -146,6 +175,12 @@ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/> <nil key="highlightedColor"/> </label> + <label opaque="NO" userInteractionEnabled="NO" tag="1" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" ambiguous="YES" misplaced="YES" text="3/9" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1XQ-ac-kMc"> + <rect key="frame" x="262" y="11" width="29" height="21"/> + <fontDescription key="fontDescription" type="system" pointSize="17"/> + <color key="textColor" cocoaTouchSystemColor="darkTextColor"/> + <nil key="highlightedColor"/> + </label> </subviews> </tableViewCellContentView> <connections> diff --git a/ios-ng/shlist/ListDetailTableViewController.m b/ios-ng/shlist/ListDetailTableViewController.m @@ -1,9 +1,11 @@ #import "ListDetailTableViewController.h" #import "ListItem.h" +#import "ShlistServer.h" @interface ListDetailTableViewController () - (void)load_initial_data; +@property (strong, nonatomic) ShlistServer *server; @end @@ -14,18 +16,27 @@ // NSLog(@"ListDetailTableViewController::load_initial_data()"); ListItem *item1 = [[ListItem alloc] init]; - item1.name = @"Axe"; + item1.modifier = 1; + item1.name = @"cheese"; + item1.quantity = 3; item1.owner = @"Kyle"; + item1.completed = 0; [self.list_items addObject:item1]; ListItem *item2 = [[ListItem alloc] init]; - item2.name = @"Camp Stove"; - item2.owner = @"<none>"; + item2.modifier = 0; + item2.name = @"camp stove"; + item2.quantity = 1; + item2.owner = @""; + item2.completed = 1; [self.list_items addObject:item2]; ListItem *item3 = [[ListItem alloc] init]; - item3.name = @"Tent"; - item3.owner = @"David"; + item3.modifier = 2; + item3.name = @"ear plugs"; + item3.quantity = 1; + item3.owner = @""; + item3.completed = 0; [self.list_items addObject:item3]; } @@ -90,10 +101,42 @@ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ListDetailPrototypeCell" forIndexPath:indexPath]; // NSLog(@"ListDetailTableViewController::cellForRowAtIndexPath()"); - + // Tags: + // 1) modifier -- ie $, info, etc + // 2) item name + // 3) quantity of item, in parenthesis + // 4) owners name + // 5) completion/packing of item + + UILabel *label; ListItem *item = [self.list_items objectAtIndex:indexPath.row]; - cell.textLabel.text = item.name; - cell.detailTextLabel.text = item.owner; + + if (item.modifier == 1) { + UIImageView *image_view; + image_view = (UIImageView *)[cell viewWithTag:1]; + image_view.image = [UIImage imageNamed: @"dollar103-4.png"]; + } + else if (item.modifier == 2) { + UIImageView *image_view; + image_view = (UIImageView *)[cell viewWithTag:1]; + image_view.image = [UIImage imageNamed: @"information15-2.png"]; + } + + label = (UILabel *)[cell viewWithTag:2]; + label.text = item.name; + + label = (UILabel *)[cell viewWithTag:3]; + if (item.quantity > 1) { + label.text = [NSString stringWithFormat:@"(x%d)", item.quantity]; + } else { + label.text = @""; + } + + label = (UILabel *)[cell viewWithTag:4]; + // XXX: this should go to N/A when item doesn't have an owner + label.text = item.owner; + + // label = (UILabel *)[cell viewWithTag:5]; return cell; } diff --git a/ios-ng/shlist/ListItem.h b/ios-ng/shlist/ListItem.h @@ -2,7 +2,10 @@ @interface ListItem : NSObject +@property int modifier; @property NSString *name; +@property int quantity; @property NSString *owner; +@property int completed; @end diff --git a/ios-ng/shlist/SharedListsTableViewController.m b/ios-ng/shlist/SharedListsTableViewController.m @@ -308,10 +308,33 @@ if ([[segue identifier] isEqualToString:@"show list segue"]) { NSIndexPath *path = [self.tableView indexPathForSelectedRow]; - SharedList *selected_list = [self.shared_lists objectAtIndex:[path row]]; + SharedList *list = [self.shared_lists objectAtIndex:[path row]]; // only list detail table view controller has this method - [segue.destinationViewController setMetadata:selected_list]; + [segue.destinationViewController setMetadata:list]; + + // has to be done before issuing network request + _server->shlist_ldvc = segue.destinationViewController; + + // update list items message type + NSMutableData *msg = [NSMutableData data]; + [msg appendBytes:"\x00\x06" length:2]; + + // length = device id + list name + null separator + uint16_t length_network_endian = htons([_device_id length] + [list.list_id length] + 1); + [msg appendBytes:&length_network_endian length:2]; + + // append device id + [msg appendData:_device_id]; + + // append null separator + [msg appendBytes:"\0" length:1]; + + // append new list name + [msg appendData:[list.list_id dataUsingEncoding:NSUTF8StringEncoding]]; + + // send message + [_server writeToServer:msg]; } // DetailObject *detail = [self detailForIndexPath:path]; diff --git a/ios-ng/shlist/ShlistServer.h b/ios-ng/shlist/ShlistServer.h @@ -1,5 +1,6 @@ #import <UIKit/UIKit.h> #import "SharedListsTableViewController.h" +#import "ListDetailTableViewController.h" @interface ShlistServer : NSObject <NSStreamDelegate> { NSInputStream *inputShlistStream; @@ -8,6 +9,8 @@ @public SharedListsTableViewController *shlist_tvc; + ListDetailTableViewController *shlist_ldvc; + } diff --git a/ios-ng/shlist/ShlistServer.m b/ios-ng/shlist/ShlistServer.m @@ -188,20 +188,27 @@ if (msg_type == 4) { NSLog(@"info: got response from join list request, '%@'", output); - /* - for (id list in shlist_tvc.indirect_lists) { + for (SharedList *list in shlist_tvc.indirect_lists) { if (list.list_name == output) { + [shlist_tvc.shared_lists addObject:list]; [shlist_tvc.indirect_lists removeObject:list]; break; } } - shlist_tvc.shared_lists [shlist_tvc.tableView reloadData]; - */ } if (msg_type == 5) { NSLog(@"info: got response from leave list request"); + + for (SharedList *list in shlist_tvc.shared_lists) { + if (list.list_name == output) { + [shlist_tvc.indirect_lists addObject:list]; + [shlist_tvc.shared_lists removeObject:list]; + break; + } + } + [shlist_tvc.tableView reloadData]; } } break;