309 lines
15 KiB
Objective-C
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
|
|
|