From ce1f0a48f3138b096b4cd8265148b72f9c64aec2 Mon Sep 17 00:00:00 2001 From: Jason Rush Date: Thu, 23 Jun 2011 06:27:38 -0500 Subject: [PATCH] Added new ImagesView --- MiniKeePass/EditGroupViewController.h | 16 +++ MiniKeePass/EditGroupViewController.m | 14 +++ MiniKeePass/ImagesViewController.h | 28 +++++ MiniKeePass/ImagesViewController.m | 109 +++++++++++++++++ images/checkmark.png | Bin 0 -> 1154 bytes images/checkmark.svg | 165 ++++++++++++++++++++++++++ images/checkmark@2x.png | Bin 0 -> 2949 bytes 7 files changed, 332 insertions(+) create mode 100644 MiniKeePass/EditGroupViewController.h create mode 100644 MiniKeePass/EditGroupViewController.m create mode 100644 MiniKeePass/ImagesViewController.h create mode 100644 MiniKeePass/ImagesViewController.m create mode 100644 images/checkmark.png create mode 100644 images/checkmark.svg create mode 100644 images/checkmark@2x.png diff --git a/MiniKeePass/EditGroupViewController.h b/MiniKeePass/EditGroupViewController.h new file mode 100644 index 00000000..52ce782d --- /dev/null +++ b/MiniKeePass/EditGroupViewController.h @@ -0,0 +1,16 @@ +// +// EditGroupViewController.h +// MiniKeePass +// +// Created by Jason Rush on 6/23/11. +// Copyright 2011 Self. All rights reserved. +// + +#import + + +@interface EditGroupViewController : FormViewController { + +} + +@end diff --git a/MiniKeePass/EditGroupViewController.m b/MiniKeePass/EditGroupViewController.m new file mode 100644 index 00000000..46d638c6 --- /dev/null +++ b/MiniKeePass/EditGroupViewController.m @@ -0,0 +1,14 @@ +// +// EditGroupViewController.m +// MiniKeePass +// +// Created by Jason Rush on 6/23/11. +// Copyright 2011 Self. All rights reserved. +// + +#import "EditGroupViewController.h" + + +@implementation EditGroupViewController + +@end diff --git a/MiniKeePass/ImagesViewController.h b/MiniKeePass/ImagesViewController.h new file mode 100644 index 00000000..782a96f3 --- /dev/null +++ b/MiniKeePass/ImagesViewController.h @@ -0,0 +1,28 @@ +// +// ImagesViewController.h +// MiniKeePass +// +// Created by Jason Rush on 6/22/11. +// Copyright 2011 Self. All rights reserved. +// + +#import + +@protocol ImagesViewControllerDelegate; + +@interface ImagesViewController : UIViewController { + UIView *imagesView; + NSMutableArray *imageViews; + UIImageView *selectedImageView; + id delegate; +} + +@property (nonatomic, retain) id delegate; + +- (void)setSelectedImage:(NSUInteger)index; + +@end + +@protocol ImagesViewControllerDelegate +- (void)imagesViewController:(ImagesViewController*)controller imageSelected:(NSUInteger)index; +@end diff --git a/MiniKeePass/ImagesViewController.m b/MiniKeePass/ImagesViewController.m new file mode 100644 index 00000000..5eb11f0d --- /dev/null +++ b/MiniKeePass/ImagesViewController.m @@ -0,0 +1,109 @@ +// +// ImagesViewController.m +// MiniKeePass +// +// Created by Jason Rush on 6/22/11. +// Copyright 2011 Self. All rights reserved. +// + +#import "ImagesViewController.h" +#import "MiniKeePassAppDelegate.h" + +#define IMAGES_PER_ROW 7 +#define SIZE 24 +#define HORIZONTAL_SPACING 10.5 +#define VERTICAL_SPACING 10.5 + +@implementation ImagesViewController + +@synthesize delegate; + +- (id)init { + self = [super init]; + if (self) { + // Get the application delegate + MiniKeePassAppDelegate *appDelegate = (MiniKeePassAppDelegate*)[[UIApplication sharedApplication] delegate]; + + imagesView = [[UIView alloc] init]; + + CGRect frame = CGRectMake(HORIZONTAL_SPACING, VERTICAL_SPACING, SIZE, SIZE); + + // Load the images + imageViews = [[NSMutableArray alloc] initWithCapacity:NUM_IMAGES]; + for (NSUInteger index = 0; index < NUM_IMAGES; index += IMAGES_PER_ROW) { + for (int i = 0; i < IMAGES_PER_ROW; i++) { + UIImage *image = [appDelegate loadImage:index + i]; + + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + imageView.frame = frame; + [imagesView addSubview:imageView]; + + [imageViews addObject:imageView]; + + [imageView release]; + + frame.origin.x += SIZE + 2 * HORIZONTAL_SPACING; + } + + frame.origin.x = HORIZONTAL_SPACING; + frame.origin.y += SIZE + 2 * VERTICAL_SPACING; + } + + UIImage *selectedImage = [UIImage imageNamed:@"checkmark"]; + selectedImageView = [[UIImageView alloc] initWithImage:selectedImage]; + [imagesView addSubview:selectedImageView]; + + [self setSelectedImage:0]; + + UIScrollView *scrollView = [[UIScrollView alloc] init]; + scrollView.backgroundColor = [UIColor whiteColor]; + scrollView.alwaysBounceHorizontal = NO; + scrollView.contentSize = CGSizeMake(IMAGES_PER_ROW * (SIZE + 2 * HORIZONTAL_SPACING), ceil(((CGFloat)NUM_IMAGES) / IMAGES_PER_ROW) * (SIZE + 2 * VERTICAL_SPACING)); + [scrollView addSubview:imagesView]; + + UIGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelected:)]; + [scrollView addGestureRecognizer:gestureRecognizer]; + [gestureRecognizer release]; + + self.view = scrollView; + + [scrollView release]; + } + return self; +} + +- (void)dealloc { + [imagesView release]; + [imageViews release]; + [selectedImageView release]; + [delegate release]; + [super dealloc]; +} + +- (void)setSelectedImage:(NSUInteger)index { + if (index >= NUM_IMAGES) { + return; + } + + NSUInteger row = index / IMAGES_PER_ROW; + NSUInteger col = index - (row * IMAGES_PER_ROW); + + CGSize size = selectedImageView.image.size; + CGRect frame = CGRectMake((col + 1) * (SIZE + 2 * HORIZONTAL_SPACING) - size.width, (row + 1) * (SIZE + 2 * VERTICAL_SPACING) - size.height, size.width, size.height); + selectedImageView.frame = frame; +} + +- (void)imageSelected:(UIGestureRecognizer*)gestureRecognizer { + CGPoint point = [gestureRecognizer locationInView:imagesView]; + NSUInteger col = point.x / (SIZE + 2 * HORIZONTAL_SPACING); + NSUInteger row = point.y / (SIZE + 2 * VERTICAL_SPACING); + + NSUInteger index = row * IMAGES_PER_ROW + col; + [self setSelectedImage:index]; + + if ([delegate respondsToSelector:@selector(imageViewController:imageSelected:)]) { + [delegate imagesViewController:self imageSelected:index]; + } +} + +@end diff --git a/images/checkmark.png b/images/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..b2327fb361512bcaa3906014ca4070cdcfd95834 GIT binary patch literal 1154 zcmV-|1bzF7P)0004>0arOiWB>pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^ zaAhuUa%Y?FJQ@H11OG`xK~y-6jg?(!R7VuYe|PrY-MzbuH;XlxjZM^m8jVrYQb?2d zRHc}GDky;%u~4w3egq*zpZ4A-$wN~_jJ1XKrHG^y9}=4qKPWAt*r;GO63r5t#AK6Q z-LPV^*{?f&NK6x>)B^*jcQ zTYjkBxzpoR6f#er0^nS?j;x~a=e>Kg_a8m_+AxgXR4Nqq zL)ZUX9uGp-@l{r$mz9x;#hAKqfu>+^zsu$N%rs5UV#(=ry5yrBJHB%~eoQ7F$D!*h z)B!j=9!gK1L^TX1J3C4A_M!|9Qe9Qm*4N+vJMcsRNGVHdckR*>*RCNJ)GSlCa8}gR zgtmG$imH;0#}T^D^o<+ruBvhan-oP6s%2U3TrRiOEd;{pe4{cH1z&kN1vNDQB=6i| zZe(P>62K({Qpyia)BHnCCX=4h($d}eL;~UQfRs3VJ~YGNWjKtT%_207!u|UJ$W2cZ z@9IJ&oovL9NwyLVLnP<;<+R;INW`+-L-o#&5$JqJv47IjWe(@rj z-w#0e&>`a8-3VPr^ZU{Kepc1hVcWLLFbpApx$*JwJ}nR+_u>Wmh7EYj%Ry0i|L9R_ zhK49Qco2ZeOP7ducLQLjQluv)csVeDT3ARl8hr@NiG{cMB%`V*n#OD-!tKgR64$TK z`x6KNkcq_@Jbrwoy_!ZwRmtb`cTLlr6;et&olZw?4-8Ciw5<8$$w}_*-OJFaQ^;%< zfWc$O$Uc9*0=Ut#`0L?A+w1iXFE(~{b@gapIDFg{4C1S(n7=6{|FpI7cWo`BXU{U# z*|`GdtEj*k403;9;H!y=iBVYc^eoF-tLyr=U)0w(JZ@;S)}6MF0Q*07*qoM6N<$f`bMye*gdg literal 0 HcmV?d00001 diff --git a/images/checkmark.svg b/images/checkmark.svg new file mode 100644 index 00000000..e9f07b7f --- /dev/null +++ b/images/checkmark.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + diff --git a/images/checkmark@2x.png b/images/checkmark@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca28b24976a1adf42828edcb182f06c97adfac7 GIT binary patch literal 2949 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 literal 0 HcmV?d00001