Brion VIBBER has uploaded a new change for review.
https://gerrit.wikimedia.org/r/88158
Change subject: Hooked up the add category button.
......................................................................
Hooked up the add category button.
Change-Id: Ie72591d4d3834bac1d78862623d23c78910eef6c
---
M Commons-iOS/CategorySearchTableViewController.m
M Commons-iOS/DetailScrollViewController.h
M Commons-iOS/DetailScrollViewController.m
M Commons-iOS/en.lproj/MainStoryboard.storyboard
4 files changed, 178 insertions(+), 112 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/apps/ios/commons
refs/changes/58/88158/1
diff --git a/Commons-iOS/CategorySearchTableViewController.m
b/Commons-iOS/CategorySearchTableViewController.m
index ce5df48..7ed974a 100644
--- a/Commons-iOS/CategorySearchTableViewController.m
+++ b/Commons-iOS/CategorySearchTableViewController.m
@@ -8,6 +8,7 @@
#import "CategorySearchTableViewController.h"
#import "MWI18N.h"
+#import "DetailScrollViewController.h"
#define SEARCH_CATS_LIMIT 25
@@ -19,7 +20,7 @@
-(void)backButtonPressed:(id)sender
{
- [self.navigationController popViewControllerAnimated:YES];
+ [self popBackToDetails];
}
- (id)initWithStyle:(UITableViewStyle)style
@@ -121,6 +122,23 @@
return cell;
}
+-(void)popBackToDetails
+{
+ // First notify the details controller that it needs to refresh its
category list
+ UIViewController *prevVC =
self.navigationController.viewControllers[self.navigationController.viewControllers.count
- 2];
+ // Details is a child of ImageScrollViewController, which should be prevVC
+ for (UIViewController *vc in prevVC.childViewControllers) {
+ if ([vc isMemberOfClass:[DetailScrollViewController class]]) {
+ // Notifies details view controller that it needs to refresh its
category layout after it appears.
+ // (Needs to do so after it appears so layout its layout
constraints don't go bonkers.)
+ [(DetailScrollViewController *)vc
setCategoriesNeedToBeRefreshed:YES];
+ }
+ }
+ // updateCategoryContainer causes the details view to reflect any new
category selections
+ // [details updateCategoryContainer];
+ [self.navigationController popViewControllerAnimated:YES];
+}
+
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath
@@ -137,8 +155,7 @@
[self.selectedRecord addCategory:cat];
[CommonsApp.singleton updateCategory:cat];
[CommonsApp.singleton saveData];
-
- [self.navigationController popViewControllerAnimated:YES];
+ [self popBackToDetails];
}
}
diff --git a/Commons-iOS/DetailScrollViewController.h
b/Commons-iOS/DetailScrollViewController.h
index 7d153ea..be046a5 100644
--- a/Commons-iOS/DetailScrollViewController.h
+++ b/Commons-iOS/DetailScrollViewController.h
@@ -74,4 +74,6 @@
-(void)ensureScrollingDoesNotExceedThreshold;
-(void)toggle;
+@property (nonatomic) BOOL categoriesNeedToBeRefreshed;
+
@end
diff --git a/Commons-iOS/DetailScrollViewController.m
b/Commons-iOS/DetailScrollViewController.m
index 250b467..6bfcaea 100644
--- a/Commons-iOS/DetailScrollViewController.m
+++ b/Commons-iOS/DetailScrollViewController.m
@@ -40,7 +40,7 @@
#define DETAIL_DOCK_DISTANCE_FROM_BOTTOM ((UI_USER_INTERFACE_IDIOM() ==
UIUserInterfaceIdiomPad) ? 146.0f : 126.0f)
#define DETAIL_TABLE_MAX_OVERLAY_ALPHA 0.85f
-#define LABEL_PADDING_INSET UIEdgeInsetsMake(5.0f, 5.0f, 5.0f, 5.0f)
+#define LABEL_PADDING_INSET UIEdgeInsetsMake(7.0f, 7.0f, 7.0f, 7.0f)
@interface DetailScrollViewController ()
@@ -74,6 +74,7 @@
navBackgroundView_ = nil;
viewAboveBackground_ = nil;
viewBelowBackground_ = nil;
+ self.categoriesNeedToBeRefreshed = NO;
}
return self;
}
@@ -215,8 +216,120 @@
self.licenseContainer.backgroundColor = containerColor;
self.categoryContainer.backgroundColor = containerColor;
+ [self configureForSelectedRecord];
+ [self configureHideKeyboardButton];
+
//[self.view randomlyColorSubviews];
}
+
+- (void)didMoveToParentViewController:(UIViewController *)parent
+{
+ [super didMoveToParentViewController:parent];
+
+ self.viewTopConstraint = [NSLayoutConstraint constraintWithItem:self.view
+
attribute:NSLayoutAttributeTop
+
relatedBy:NSLayoutRelationEqual
+
toItem:self.view.superview
+
attribute:NSLayoutAttributeTop
+ multiplier:1.0
+ constant:0];
+ [self.view.superview addConstraint:self.viewTopConstraint];
+
+ [self.view.superview addConstraint:[NSLayoutConstraint
constraintWithItem:self.view
+
attribute:NSLayoutAttributeCenterX
+
relatedBy:NSLayoutRelationEqual
+
toItem:self.view.superview
+
attribute:NSLayoutAttributeCenterX
+
multiplier:1.0
+
constant:0]];
+
+ [self.view.superview addConstraint:[NSLayoutConstraint
constraintWithItem:self.scrollContainer
+
attribute:NSLayoutAttributeWidth
+
relatedBy:NSLayoutRelationEqual
+
toItem:self.view.superview
+
attribute:NSLayoutAttributeWidth
+
multiplier:1.0
+
constant:0]];
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+ [super viewWillAppear:animated];
+
+ // Only move details to bottom if coming from my uploads (not
categories, license etc...)
+ if(isFirstAppearance_){
+
+ // Move details to docking position at bottom of screen
+ [self moveDetailsToDock];
+
+ [self.delegate clearOverlay];
+ }
+
+ if(!self.selectedRecord.complete.boolValue){
+ [self addNavBarBackgroundViewForTouchDetection];
+ }
+
+ // Ensure nav bar isn't being underlapped by details
+ // (needed if details pushed another view controller while details was
scrolled so far up that
+ // it had caused the nav bar to be hidden - without this extra call to
"makeNavBarRunAwayFromDetails"
+ // here, when that pushed view gets popped, the nav would overlap the
details)
+ [self makeNavBarRunAwayFromDetails];
+}
+
+-(void)viewDidAppear:(BOOL)animated
+{
+ [super viewDidAppear:animated];
+ isFirstAppearance_ = NO;
+
+ if (self.categoriesNeedToBeRefreshed) {
+ self.categoriesNeedToBeRefreshed = NO;
+ FileUpload *record = self.selectedRecord;
+ if (record != nil) {
+ self.categoryList = [record.categoryList mutableCopy];
+ [self updateCategoryContainer];
+ }
+ }
+}
+
+- (void)viewWillDisappear:(BOOL)animated
+{
+ [navBackgroundView_ removeFromSuperview];
+ [self hideKeyboard];
+ [super viewWillDisappear:animated];
+
+ // Ensure the nav bar is visible
+ // (needed because "makeNavBarRunAwayFromDetails" method could have hidden
the nav bar)
+ [self.navigationController setNavigationBarHidden:NO animated:NO];
+}
+
+#pragma mark - Keyboard
+
+-(void) configureHideKeyboardButton
+{
+ // Add a "hide keyboard" button above the keyboard (when the description
box has the focus and the
+ // keyboard is visible). Did this so multi-line descriptions could still
be entered *and* the
+ // keyboard could still be dismissed (otherwise the "return" button would
have to be made into a
+ // "Done" button which would mean line breaks could not be entered)
+
+ // Note: Only show the "hide keyboard" button for new images as existing
image descriptions are
+ // read-only for now
+ if ((!self.selectedRecord.complete.boolValue) &&
(UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPad)){
+ UIButton *hideKeyboardButton = [UIButton
buttonWithType:UIButtonTypeCustom];
+ [hideKeyboardButton addTarget:self
action:@selector(hideKeyboardAccessoryViewTapped)
forControlEvents:UIControlEventTouchDown];
+
+ [hideKeyboardButton setTitleColor:[UIColor whiteColor]
forState:UIControlStateNormal];
+ [hideKeyboardButton.titleLabel setFont:[UIFont
boldSystemFontOfSize:14.0f]];
+ hideKeyboardButton.backgroundColor = [UIColor colorWithRed:0.56
green:0.59 blue:0.63 alpha:0.95];
+ [hideKeyboardButton.titleLabel setShadowColor:[UIColor blackColor]];
+ [hideKeyboardButton.titleLabel setShadowOffset: CGSizeMake(0, -1)];
+
+ [hideKeyboardButton setTitle:[MWMessage
forKey:@"details-hide-keyboard"].text forState:UIControlStateNormal];
+ hideKeyboardButton.frame = CGRectMake(80.0, 210.0, 160.0, 28.0);
+ self.descriptionTextView.inputAccessoryView = hideKeyboardButton;
+ }
+}
+
+#pragma mark - Gestures
-(void)handleDetailsPan:(UIPanGestureRecognizer *)recognizer
{
@@ -253,77 +366,19 @@
}
}
-- (void)didMoveToParentViewController:(UIViewController *)parent
+#pragma mark - Selected record
+
+-(void)configureForSelectedRecord
{
- [super didMoveToParentViewController:parent];
-
- self.viewTopConstraint = [NSLayoutConstraint constraintWithItem:self.view
-
attribute:NSLayoutAttributeTop
-
relatedBy:NSLayoutRelationEqual
-
toItem:self.view.superview
-
attribute:NSLayoutAttributeTop
- multiplier:1.0
- constant:0];
- [self.view.superview addConstraint:self.viewTopConstraint];
-
- [self.view.superview addConstraint:[NSLayoutConstraint
constraintWithItem:self.view
-
attribute:NSLayoutAttributeCenterX
-
relatedBy:NSLayoutRelationEqual
-
toItem:self.view.superview
-
attribute:NSLayoutAttributeCenterX
-
multiplier:1.0
-
constant:0]];
-
- [self.view.superview addConstraint:[NSLayoutConstraint
constraintWithItem:self.scrollContainer
-
attribute:NSLayoutAttributeWidth
-
relatedBy:NSLayoutRelationEqual
-
toItem:self.view.superview
-
attribute:NSLayoutAttributeWidth
-
multiplier:1.0
-
constant:0]];
-}
-
-- (void)viewWillAppear:(BOOL)animated
-{
- // Note:
- // Don't call "[super viewWillAppear:animated]" here!
- // It causes the tableView to scroll if the description box receives
focus
- // when it has been moved to the lower part of the screen
- // See: http://stackoverflow.com/a/12111260/135557
- // (the scrolling is unwanted because "scrollSoView:isBelowNavBar:" is
being
- // used instead - for greater control)
-
-
- // Only move details to bottom if coming from my uploads (not
categories, license etc...)
- if(isFirstAppearance_){
-
- // Move details to docking position at bottom of screen
- [self moveDetailsToDock];
-
- [self.delegate clearOverlay];
- }
-
- if(!self.selectedRecord.complete.boolValue){
- [self addNavBarBackgroundViewForTouchDetection];
- }
-
- // Ensure nav bar isn't being underlapped by details
- // (needed if details pushed another view controller while details was
scrolled so far up that
- // it had caused the nav bar to be hidden - without this extra call to
"makeNavBarRunAwayFromDetails"
- // here, when that pushed view gets popped, the nav would overlap the
details)
- [self makeNavBarRunAwayFromDetails];
-
// Load up the selected record
FileUpload *record = self.selectedRecord;
if (record != nil) {
self.categoryList = [record.categoryList mutableCopy];
- [self updateCategoryContainer];
self.titleTextField.text = record.title;
self.titleTextLabel.text = record.title;
self.descriptionTextView.text = record.desc;
- self.descriptionTextLabel.text =record.desc;
+ self.descriptionTextLabel.text = record.desc;
self.descriptionPlaceholder.hidden = (record.desc.length > 0);
-
self.categoryListLabel.text = [self categoryShortList];
// Get categories and description
@@ -333,6 +388,8 @@
[self getPreviouslySavedDescriptionForRecord:record];
[self getPreviouslySavedCategoriesForRecord:record];
});
+ }else{
+ [self updateCategoryContainer];
}
dispatch_async(dispatch_get_main_queue(), ^(void) {
@@ -394,46 +451,6 @@
} else {
NSLog(@"This isn't right, have no selected record in detail view");
}
-
- // Add a "hide keyboard" button above the keyboard (when the description
box has the focus and the
- // keyboard is visible). Did this so multi-line descriptions could still
be entered *and* the
- // keyboard could still be dismissed (otherwise the "return" button would
have to be made into a
- // "Done" button which would mean line breaks could not be entered)
-
- // Note: Only show the "hide keyboard" button for new images as existing
image descriptions are
- // read-only for now
-
- if ((!record.complete.boolValue) && (UI_USER_INTERFACE_IDIOM() !=
UIUserInterfaceIdiomPad)){
- UIButton *hideKeyboardButton = [UIButton
buttonWithType:UIButtonTypeCustom];
- [hideKeyboardButton addTarget:self
action:@selector(hideKeyboardAccessoryViewTapped)
forControlEvents:UIControlEventTouchDown];
-
- [hideKeyboardButton setTitleColor:[UIColor whiteColor]
forState:UIControlStateNormal];
- [hideKeyboardButton.titleLabel setFont:[UIFont
boldSystemFontOfSize:14.0f]];
- hideKeyboardButton.backgroundColor = [UIColor colorWithRed:0.56
green:0.59 blue:0.63 alpha:0.95];
- [hideKeyboardButton.titleLabel setShadowColor:[UIColor blackColor]];
- [hideKeyboardButton.titleLabel setShadowOffset: CGSizeMake(0, -1)];
-
- [hideKeyboardButton setTitle:[MWMessage
forKey:@"details-hide-keyboard"].text forState:UIControlStateNormal];
- hideKeyboardButton.frame = CGRectMake(80.0, 210.0, 160.0, 28.0);
- self.descriptionTextView.inputAccessoryView = hideKeyboardButton;
- }
-}
-
--(void)viewDidAppear:(BOOL)animated
-{
- [super viewDidAppear:animated];
- isFirstAppearance_ = NO;
-}
-
-- (void)viewWillDisappear:(BOOL)animated
-{
- [navBackgroundView_ removeFromSuperview];
- [self hideKeyboard];
- [super viewWillDisappear:animated];
-
- // Ensure the nav bar is visible
- // (needed because "makeNavBarRunAwayFromDetails" method could have hidden
the nav bar)
- [self.navigationController setNavigationBarHidden:NO animated:NO];
}
#pragma mark - Buttons
@@ -866,9 +883,18 @@
}
[sv addSubview:label];
+ // Add entry for "Add Category" to end of categoryListCopy. This will cause
+ // the "Add Category" button to be made and constrained by hijacking the
+ // category layout code below.
+ NSMutableArray *categoryListCopy = [[[self.categoryList
reverseObjectEnumerator] allObjects] mutableCopy];
+ FileUpload *record = self.selectedRecord;
+ if (record != nil && !record.complete.boolValue) {
+ [categoryListCopy insertObject:[MWMessage forKey:@"catadd-title"].text
atIndex:0];
+ }
+
// Create labels for categories, add them to the categoryContainer, and
remember
// them in a categoryLabels array
- for (NSString *categoryString in self.categoryList) {
+ for (NSString *categoryString in categoryListCopy) {
UILabelDynamicHeight *label = [[UILabelDynamicHeight alloc]
initWithFrame:CGRectZero];
label.translatesAutoresizingMaskIntoConstraints = NO;
label.text = categoryString;
@@ -880,6 +906,18 @@
[label setPaddingInsets:LABEL_PADDING_INSET];
[self.categoryContainer addSubview:label];
[categoryLabels addObject:label];
+
+ // Determine if the current label is the "Add Category" label. If so
+ // adjust it as needed to respond to touch.
+ if (record != nil && !record.complete.boolValue) {
+ if (categoryString == [categoryListCopy firstObject]){
+ //label.backgroundColor = [UIColor redColor];
+ UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer
alloc] initWithTarget:self action:@selector(addCategoryTapped)];
+ [label addGestureRecognizer:tapGesture];
+ label.textAlignment = NSTextAlignmentCenter;
+ label.paddingColor = DETAIL_EDITABLE_TEXTBOX_BACKGROUND_COLOR;
+ }
+ }
}
// Create autolayout format string for even vertically spacing of
@@ -900,7 +938,7 @@
// Add space between sides of categoryLabel and categoryContainer
[self.categoryContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[categoryLabel]-|" options:0 metrics:nil
views:@{@"categoryLabel": self.categoryLabel}]];
- if (self.categoryList.count > 0) {
+ if (categoryListCopy.count > 0) {
// Add space between sides of labels and categoryContainer
for (UILabel *l in categoryLabels) {
[self.categoryContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[label]-|" options:0 metrics:nil
views:@{@"label": l}]];
@@ -911,7 +949,18 @@
// No categories found, so add space between the top and bottom of
categoryLabel and categoryContainer
[self.categoryContainer addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-[categoryLabel]-|" options:0 metrics:nil
views:@{@"categoryLabel": self.categoryLabel}]];
}
- [self.view layoutIfNeeded];
+
+ [self.categoryContainer layoutIfNeeded];
+}
+
+-(void)addCategoryTapped
+{
+ CategorySearchTableViewController *catVC =
[self.navigationController.storyboard
instantiateViewControllerWithIdentifier:@"CategorySearchTableViewController"];
+ if (self.selectedRecord) {
+ catVC.title = [MWMessage forKey:@"catadd-title"].text;
+ catVC.selectedRecord = self.selectedRecord;
+ }
+ [self.navigationController pushViewController:catVC animated:YES];
}
- (void)getPreviouslySavedDescriptionForRecord:(FileUpload *)record
diff --git a/Commons-iOS/en.lproj/MainStoryboard.storyboard
b/Commons-iOS/en.lproj/MainStoryboard.storyboard
index 12d0148..80818ef 100644
--- a/Commons-iOS/en.lproj/MainStoryboard.storyboard
+++ b/Commons-iOS/en.lproj/MainStoryboard.storyboard
@@ -1156,7 +1156,7 @@
<!--Category Search Table View Controller - Add category-->
<scene sceneID="pQt-gg-EkQ">
<objects>
- <tableViewController id="wdV-pe-EgK"
customClass="CategorySearchTableViewController" sceneMemberID="viewController">
+ <tableViewController
storyboardIdentifier="CategorySearchTableViewController" id="wdV-pe-EgK"
customClass="CategorySearchTableViewController" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES"
clearsContextBeforeDrawing="NO" contentMode="scaleToFill"
alwaysBounceVertical="YES" dataMode="prototypes" style="plain"
separatorStyle="default" rowHeight="44" sectionHeaderHeight="22"
sectionFooterHeight="22" id="p2R-Ck-7B8">
<rect key="frame" x="0.0" y="20" width="320"
height="460"/>
<autoresizingMask key="autoresizingMask"
widthSizable="YES" heightSizable="YES"/>
@@ -1950,8 +1950,6 @@
<image name="mockBadPhoto.png" width="237" height="286"/>
<image name="mockPageLogo.png" width="64" height="106"/>
<image name="mockPagePhoto.png" width="134" height="103"/>
- <image name="photo-button-bg.png" width="72" height="72"/>
- <image name="photo-button-bg.png" width="72" height="72"/>
<image name="photo-button-bg.png" width="72" height="72"/>
<image name="settings.png" width="30" height="30"/>
</resources>
--
To view, visit https://gerrit.wikimedia.org/r/88158
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie72591d4d3834bac1d78862623d23c78910eef6c
Gerrit-PatchSet: 1
Gerrit-Project: apps/ios/commons
Gerrit-Branch: master
Gerrit-Owner: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Mhurd <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits