element-ios/Riot/Modules/Room/Settings/Views/TableViewCellWithCheckBoxes.m

309 lines
15 KiB
Objective-C

/*
Copyright 2024 New Vector Ltd.
Copyright 2017 Vector Creations Ltd
Copyright 2016 OpenMarket Ltd
SPDX-License-Identifier: AGPL-3.0-only
Please see LICENSE in the repository root for full details.
*/
#import "TableViewCellWithCheckBoxes.h"
#import "GeneratedInterface-Swift.h"
// The space between 2 check boxes
#define TABLEVIEWCELLWITHCHECKBOXES_MARGIN 8
@interface TableViewCellWithCheckBoxes ()
{
NSMutableArray *checkBoxesArray;
NSMutableArray *labelArray;
}
@end
@implementation TableViewCellWithCheckBoxes
- (void)setCheckBoxesNumber:(NSUInteger)checkBoxesNumber
{
if (_checkBoxesNumber == checkBoxesNumber)
{
return;
}
// Remove existing items
NSArray *subviews = self.mainContainer.subviews;
for (UIView *view in subviews)
{
[view removeFromSuperview];
}
_checkBoxesNumber = checkBoxesNumber;
if (!_checkBoxesNumber)
{
// Nothing to do
return;
}
checkBoxesArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
labelArray = [NSMutableArray arrayWithCapacity:checkBoxesNumber];
CGFloat containerWidth = (self.mainContainer.frame.size.width - ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN)) / checkBoxesNumber;
UIView *previousContainer = nil;
NSLayoutConstraint *topConstraint, *leftConstraint, *bottomConstraint;
NSLayoutConstraint *widthConstraint, *heightConstraint, *centerYConstraint, *centerXConstraint;
for (NSInteger index = 0; index < checkBoxesNumber; index++)
{
UIView *checkboxContainer = [[UIView alloc] initWithFrame:CGRectMake(index * (containerWidth + TABLEVIEWCELLWITHCHECKBOXES_MARGIN), 0, containerWidth, self.mainContainer.frame.size.height)];
checkboxContainer.backgroundColor = [UIColor clearColor];
[self.mainContainer addSubview:checkboxContainer];
// Add container constraints
checkboxContainer.translatesAutoresizingMaskIntoConstraints = NO;
if (!previousContainer)
{
leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeLeading
multiplier:1
constant:0];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeWidth
multiplier:(1.0 / checkBoxesNumber)
constant:(- ((checkBoxesNumber - 1.0) * TABLEVIEWCELLWITHCHECKBOXES_MARGIN) / checkBoxesNumber)];
}
else
{
leftConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:previousContainer
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:TABLEVIEWCELLWITHCHECKBOXES_MARGIN];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:previousContainer
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0];
}
topConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeTop
multiplier:1
constant:0];
bottomConstraint = [NSLayoutConstraint constraintWithItem:checkboxContainer
attribute:NSLayoutAttributeBottom
relatedBy:NSLayoutRelationEqual
toItem:self.mainContainer
attribute:NSLayoutAttributeBottom
multiplier:1
constant:0];
[NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, topConstraint, bottomConstraint]];
previousContainer = checkboxContainer;
// Add Checkbox and Label
UIImageView *checkbox = [[UIImageView alloc] initWithFrame:CGRectMake(14, 11, 22, 22)];
checkbox.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:checkbox];
// Store the new check box unselected by default
checkbox.image = AssetImages.selectionUntick.image;
checkbox.tintColor = ThemeService.shared.theme.tintColor;
checkbox.tag = 0;
[checkBoxesArray addObject:checkbox];
UILabel *theLabel = [[UILabel alloc] initWithFrame:CGRectMake(60, 0, containerWidth - 60, 31)];
theLabel.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:theLabel];
[labelArray addObject:theLabel];
UIView *checkboxMask = [[UIView alloc] initWithFrame:CGRectMake(7, 4, 36, 36)];
checkboxMask.translatesAutoresizingMaskIntoConstraints = NO;
[checkboxContainer addSubview:checkboxMask];
// Listen to check box tap
checkboxMask.tag = index;
checkboxMask.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onCheckBoxTap:)];
[tapGesture setNumberOfTouchesRequired:1];
[tapGesture setNumberOfTapsRequired:1];
[tapGesture setDelegate:self];
[checkboxMask addGestureRecognizer:tapGesture];
// Add switch constraints
leftConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeLeading
multiplier:1
constant:14];
widthConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:22];
centerYConstraint = [NSLayoutConstraint constraintWithItem:checkbox
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[leftConstraint, widthConstraint, centerYConstraint]];
// Add Label constraints
topConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeTop
multiplier:1
constant:0];
leftConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeTrailing
multiplier:1
constant:9];
centerYConstraint = [NSLayoutConstraint constraintWithItem:theLabel
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkboxContainer
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[topConstraint, leftConstraint, centerYConstraint]];
// Add check box mask constraints
widthConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:36];
heightConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:36];
centerXConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeCenterX
multiplier:1
constant:0.0f];
centerYConstraint = [NSLayoutConstraint constraintWithItem:checkboxMask
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:checkbox
attribute:NSLayoutAttributeCenterY
multiplier:1
constant:0.0f];
[NSLayoutConstraint activateConstraints:@[widthConstraint, heightConstraint, centerXConstraint, centerYConstraint]];
}
}
- (NSArray*)checkBoxes
{
return [NSArray arrayWithArray:checkBoxesArray];
}
- (NSArray*)labels
{
return [NSArray arrayWithArray:labelArray];
}
- (void)setCheckBoxValue:(BOOL)isSelected atIndex:(NSUInteger)index
{
if (index < checkBoxesArray.count)
{
UIImageView *checkBox = checkBoxesArray[index];
if (isSelected && !checkBox.tag)
{
checkBox.image = AssetImages.selectionTick.image;
checkBox.tag = 1;
if (!self.allowsMultipleSelection)
{
// Unselect others check boxes
for (NSUInteger k = 0; k < checkBoxesArray.count; k++)
{
if (k != index)
{
checkBox = checkBoxesArray[k];
if (checkBox.tag)
{
checkBox.image = AssetImages.selectionUntick.image;
checkBox.tag = 0;
}
}
}
}
}
else if (!isSelected && checkBox.tag)
{
checkBox.image = AssetImages.selectionUntick.image;
checkBox.tag = 0;
}
}
}
- (BOOL)checkBoxValueAtIndex:(NSUInteger)index
{
if (index < checkBoxesArray.count)
{
UIImageView *checkBox = checkBoxesArray[index];
return ((BOOL)checkBox.tag);
}
return NO;
}
#pragma mark - Action
- (IBAction)onCheckBoxTap:(UITapGestureRecognizer*)sender
{
if (_delegate)
{
[_delegate tableViewCellWithCheckBoxes:self didTapOnCheckBoxAtIndex:sender.view.tag];
}
}
@end