Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Calendar Month Grid: Multiple markers on individual date #199

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions demo/iPhone/DemoCalendarMonth.m
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,15 @@ - (void) generateRandomDataForStartDate:(NSDate*)start endDate:(NSDate*)end{

int r = arc4random();
if(r % 3==1){
[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",@"Item two",nil] forKey:d];
[self.dataArray addObject:[NSNumber numberWithBool:YES]];
[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",@"Item two",@"Item three",@"Item four",nil] forKey:d];
[self.dataArray addObject:[NSNumber numberWithInt:4]];

}else if(r%4==1){
[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",nil] forKey:d];
[self.dataArray addObject:[NSNumber numberWithBool:YES]];
[self.dataDictionary setObject:[NSArray arrayWithObjects:@"Item one",@"Item two",@"Item three",@"Item four",@"Item five",nil] forKey:d];
[self.dataArray addObject:[NSNumber numberWithInt:5]];

}else
[self.dataArray addObject:[NSNumber numberWithBool:NO]];
[self.dataArray addObject:[NSNumber numberWithInt:0]];


TKDateInformation info = [d dateInformationWithTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
Expand Down
4 changes: 2 additions & 2 deletions src/TapkuLibrary/TKCalendarMonthView.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,8 @@
@param monthView The calendar month grid.
@param startDate The first date shown by the calendar month grid.
@param lastDate The last date shown by the calendar month grid.
@return Returns an array of NSNumber objects corresponding the number of days specified in the start and last day parameters. Each NSNumber variable will give a BOOL value that will be used to display a dot under the day.

@return Returns an array of NSNumber objects corresponding the number of days specified in the start and last day parameters. Each NSNumber variable will give a INTEGER value i that will be used to display i dots under the day.
If i exceeds 4, the dot is instead drawn as a * (star).
*/
- (NSArray*) calendarMonthView:(TKCalendarMonthView*)monthView marksFromDate:(NSDate*)startDate toDate:(NSDate*)lastDate;
@end
57 changes: 44 additions & 13 deletions src/TapkuLibrary/TKCalendarMonthView.m
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,9 @@ - (id) initWithMonth:(NSDate*)date marks:(NSArray*)markArray startDayOnSunday:(B

[self.selectedImageView addSubview:self.currentDay];
[self.selectedImageView addSubview:self.dot];
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Those additions are not necessary, the right dot's will always been set in the drawTileInRect method

if (self.dateSelected) {
self.dot.text = [self stringWithMarks:[[markArray objectAtIndex:[[dates objectAtIndex:0] daysBetweenDate:self.dateSelected]] integerValue]];
}
self.multipleTouchEnabled = NO;


Expand All @@ -269,6 +272,12 @@ - (void) setTarget:(id)t action:(SEL)a{
action = a;
}


- (NSString*)stringWithMarks:(int)marksForDay
{
return (marksForDay < 5)? [@"••••" substringToIndex:marksForDay] : @"*";

}

- (CGRect) rectForCellAtIndex:(int)index{

Expand All @@ -277,7 +286,7 @@ - (CGRect) rectForCellAtIndex:(int)index{

return CGRectMake(col*46, row*44+6, 47, 45);
}
- (void) drawTileInRect:(CGRect)r day:(int)day mark:(BOOL)mark font:(UIFont*)f1 font2:(UIFont*)f2{
- (void) drawTileInRect:(CGRect)r day:(int)day mark:(int)mark font:(UIFont*)f1 font2:(UIFont*)f2{

NSString *str = [NSString stringWithFormat:@"%d",day];

Expand All @@ -289,10 +298,12 @@ - (void) drawTileInRect:(CGRect)r day:(int)day mark:(BOOL)mark font:(UIFont*)f1
alignment: UITextAlignmentCenter];

if(mark){
NSString *markString = [self stringWithMarks:mark];

r.size.height = 10;
r.origin.y += 18;
[@"•" drawInRect: r
r.origin.y += ([markString isEqualToString:@"*"])? 22 : 18;
[markString drawInRect: r
withFont: f2
lineBreakMode: UILineBreakModeWordWrap
alignment: UITextAlignmentCenter];
Expand Down Expand Up @@ -327,9 +338,9 @@ - (void) drawRect:(CGRect)rect {
for(int i = firstOfPrev;i<= lastOfPrev;i++){
r = [self rectForCellAtIndex:index];
if ([marks count] > 0)
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] boolValue] font:font font2:font2];
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] integerValue] font:font font2:font2];
else
[self drawTileInRect:r day:i mark:NO font:font font2:font2];
[self drawTileInRect:r day:i mark:0 font:font font2:font2];
index++;
}
}
Expand All @@ -343,9 +354,9 @@ - (void) drawRect:(CGRect)rect {
if(today == i) [[UIColor whiteColor] set];

if ([marks count] > 0)
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] boolValue] font:font font2:font2];
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] integerValue] font:font font2:font2];
else
[self drawTileInRect:r day:i mark:NO font:font font2:font2];
[self drawTileInRect:r day:i mark:0 font:font font2:font2];
if(today == i) [color set];
index++;
}
Expand All @@ -355,9 +366,9 @@ - (void) drawRect:(CGRect)rect {
while(index % 7 != 0){
r = [self rectForCellAtIndex:index] ;
if ([marks count] > 0)
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] boolValue] font:font font2:font2];
[self drawTileInRect:r day:i mark:[[marks objectAtIndex:index] integerValue] font:font font2:font2];
else
[self drawTileInRect:r day:i mark:NO font:font font2:font2];
[self drawTileInRect:r day:i mark:0 font:font font2:font2];
i++;
index++;
}
Expand All @@ -366,7 +377,7 @@ - (void) drawRect:(CGRect)rect {
}

- (void) selectDay:(int)day{

int pre = firstOfPrev < 0 ? 0 : lastOfPrev - firstOfPrev + 1;

int tot = day + pre;
Expand Down Expand Up @@ -401,6 +412,16 @@ - (void) selectDay:(int)day{
if ([marks count] > 0) {

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When using multiple dot's it is probably easier to just leave out the subview and don't remove it when there are 0 dot's to display..

if([[marks objectAtIndex: row * 7 + column ] boolValue]){
    self.dot.text = [self stringWithMarks:[[marks objectAtIndex:(row*7+column)] integerValue]];
    if ([self.dot.text isEqualToString:@"*"]) {
        CGRect r = self.selectedImageView.bounds;
        r.origin.y += 17;
        self.dot.frame = r;
    } else {
        CGRect r = self.selectedImageView.bounds;
        r.origin.y += 13;
        self.dot.frame = r;
    }

    [self.selectedImageView addSubview:self.dot];
 }else{
    [self.dot removeFromSuperview];
}

then becomes:

    self.dot.text = [self stringWithMarks:[[marks objectAtIndex:(row*7+column)] integerValue]];

which is quite nice, isn't it ?

This can be done in 2 pieces of code (old line numbers 414 & 518)

if([[marks objectAtIndex: row * 7 + column ] boolValue]){
self.dot.text = [self stringWithMarks:[[marks objectAtIndex:(row*7+column)] integerValue]];
if ([self.dot.text isEqualToString:@"*"]) {
CGRect r = self.selectedImageView.bounds;
r.origin.y += 17;
self.dot.frame = r;
} else {
CGRect r = self.selectedImageView.bounds;
r.origin.y += 13;
self.dot.frame = r;
}
[self.selectedImageView addSubview:self.dot];
}else{
[self.dot removeFromSuperview];
Expand Down Expand Up @@ -495,9 +516,19 @@ - (void) reactToTouch:(UITouch*)touch down:(BOOL)down{
self.currentDay.text = [NSString stringWithFormat:@"%d",day];

if ([marks count] > 0) {
if([[marks objectAtIndex: row * 7 + column] boolValue])
if([[marks objectAtIndex: row * 7 + column] boolValue]) {
self.dot.text = [self stringWithMarks:[[marks objectAtIndex:(row*7+column)] integerValue]];
if ([self.dot.text isEqualToString:@"*"]) {
CGRect r = self.selectedImageView.bounds;
r.origin.y += 17;
self.dot.frame = r;
} else {
CGRect r = self.selectedImageView.bounds;
r.origin.y += 13;
self.dot.frame = r;
}
[self.selectedImageView addSubview:self.dot];
else
} else
[self.dot removeFromSuperview];
}else{
[self.dot removeFromSuperview];
Expand Down