From 4cbf301cff3691017be5d46952e6e14f9ff7e723 Mon Sep 17 00:00:00 2001 From: lint <47455468+lint@users.noreply.github.com> Date: Wed, 18 Sep 2019 12:31:52 -0400 Subject: [PATCH] Add files --- Makefile | 13 + PhotoCtrl.plist | 7 + Tweak.xm | 274 ++++++++++++++++++ control | 9 + .../Application Support/PhotoCtrl/check.png | Bin 0 -> 4290 bytes 5 files changed, 303 insertions(+) create mode 100644 Makefile create mode 100644 PhotoCtrl.plist create mode 100644 Tweak.xm create mode 100644 control create mode 100644 layout/var/mobile/Library/Application Support/PhotoCtrl/check.png diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..79fdbc0 --- /dev/null +++ b/Makefile @@ -0,0 +1,13 @@ +ARCHS = arm64 arm64e + +include $(THEOS)/makefiles/common.mk + +TWEAK_NAME = PhotoCtrl +PhotoCtrl_FILES = Tweak.xm +#PhotoCtrl_CFLAGS = -fobjc-arc +PhotoCtrl_FRAMEWORKS = UIKit + +include $(THEOS_MAKE_PATH)/tweak.mk + +after-install:: + install.exec "killall -9 MobileSlideShow" diff --git a/PhotoCtrl.plist b/PhotoCtrl.plist new file mode 100644 index 0000000..062ced0 --- /dev/null +++ b/PhotoCtrl.plist @@ -0,0 +1,7 @@ +{ + Filter = { + Bundles = ( + "com.apple.mobileslideshow" + ); + }; +} \ No newline at end of file diff --git a/Tweak.xm b/Tweak.xm new file mode 100644 index 0000000..299d7d4 --- /dev/null +++ b/Tweak.xm @@ -0,0 +1,274 @@ + +@interface PUCollectionView : UICollectionView +@property(assign,nonatomic) id delegate; +@property(assign,nonatomic) NSArray* visibleCells; +@property(assign,nonatomic) NSArray* indexPathsForVisibleItems; +-(id) idexPathForItemAtPoint:(id) arg1; +-(id) cellForItemAtIndexPath:(id) arg1; +-(id) indexPathForCell:(id) arg1; +-(void) _updateVisibleCellsNow:(BOOL) arg1; + +@end + +@interface PUPhotosGridViewController +@property(assign,nonatomic)id assetCollection; +@property(assign,nonatomic)id assetCollectionAssets; +@property(assign, nonatomic)id dataSource; +@property(assign, nonatomic) id collectionView; +@property(assign, nonatomic) UINavigationItem *navigationItem; +-(void) handleToggleSelectionOfItemAtIndexPath:(NSIndexPath*) arg1; +-(void) setSelected:(BOOL) arg1 itemsAtIndexes:(id) arg2 inSection:(long long) arg3 animated:(BOOL) arg4; +-(BOOL) isEditing; +-(NSInteger) collectionView:(id) arg1 numberOfItemsInSection:(NSInteger) arg2; + +//custom elememnts +@property(assign,nonatomic) BOOL ctrlEnabled; +@property(assign,nonatomic) NSIndexPath* ctrlFirstIndexPath; +@property(assign,nonatomic) UIBarButtonItem* ctrlButton; +@property(assign,nonatomic) UITapGestureRecognizer* ctrlTapRecognizer; +@property(assign,nonatomic) UIImageView* ctrlSelectOverlayView; + +-(void)updateCtrlButton; + +@end + +@interface PUPhotosGridCell : UIView +@property(assign, nonatomic) id photoContentView; +-(void) prepareForReuse; + +//custom elements +@property(retain, nonatomic) UIImageView *ctrlSelectOverlayView; +-(void) removeSelectOverlayViewImage; + +@end + + +%group Tweak + +%hook PUPhotosGridViewController +%property(assign,nonatomic) BOOL ctrlEnabled; +%property(assign,nonatomic) NSIndexPath* ctrlFirstIndexPath; +%property(assign, nonatomic) UIBarButtonItem* ctrlButton; +%property(assign, nonatomic) UITapGestureRecognizer* ctrlTapRecognizer; +%property(assign,nonatomic) UIImageView* ctrlSelectOverlayView; + +%new +-(void) updateCtrlButton{ + if ([self ctrlEnabled]){ + [[self ctrlButton] setTintColor:[UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:0.5]]; + [self ctrlTapRecognizer].cancelsTouchesInView = YES; + } else { + [[self ctrlButton] setTintColor:[UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0]]; + [self ctrlTapRecognizer].cancelsTouchesInView = NO; + } +} + + +%new +-(void) ctrlButtonPressed{ + + if (![self ctrlEnabled]){ + [self setCtrlEnabled:YES]; + } else { + [self setCtrlEnabled:NO]; + } + + + [self updateCtrlButton]; + [self setCtrlFirstIndexPath:nil]; +} + + +-(void) updateNavigationBarAnimated:(BOOL) arg1{ + %orig; + + UINavigationItem* navItem = [self navigationItem]; + + if ([self isEditing]){ + UIBarButtonItem* ctrlButton = [self ctrlButton]; + [navItem setLeftBarButtonItem:ctrlButton]; + } else { + [navItem setLeftBarButtonItem:nil]; + [self setCtrlEnabled:NO]; + } + + [self updateCtrlButton]; +} + + +-(void) viewDidLoad{ + %orig; + + [self setCtrlEnabled:NO]; + [self setCtrlFirstIndexPath:nil]; + + id collectionView = [self collectionView]; + + UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:collectionView action:@selector(ctrlScreenTapRecognized:)]; + tap.numberOfTapsRequired = 1; + tap.cancelsTouchesInView = NO; + [collectionView addGestureRecognizer:tap]; + [self setCtrlTapRecognizer:tap]; + [tap release]; + + UIBarButtonItem* ctrlButton = [[UIBarButtonItem alloc] initWithTitle:@"Ctrl" style:UIBarButtonItemStylePlain target:self action:@selector(ctrlButtonPressed)]; + [self setCtrlButton:ctrlButton]; + + + +} + + +%end + + +%hook PUCollectionView + +%new +-(void)ctrlScreenTapRecognized:(id) sender { + + id gvController = [self delegate]; + + if ([gvController ctrlEnabled]){ + + CGPoint tapPoint = [sender locationInView:self]; + NSIndexPath *nextIndexPath = [self indexPathForItemAtPoint:tapPoint]; + + if (![gvController ctrlFirstIndexPath]){ + + [gvController setCtrlFirstIndexPath:nextIndexPath]; + + + PUPhotosGridCell* firstSelectedCell = [self cellForItemAtIndexPath:nextIndexPath]; + + firstSelectedCell.ctrlSelectOverlayView = [[UIImageView alloc] init]; + firstSelectedCell.ctrlSelectOverlayView.frame = CGRectMake(0,0,31,31); + firstSelectedCell.ctrlSelectOverlayView.image = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/PhotoCtrl/check.png"]; + + [firstSelectedCell addSubview:firstSelectedCell.ctrlSelectOverlayView]; + + + } else { + + //PUPhotosGridCell* firstSelectedCell = [self cellForItemAtIndexPath:[gvController ctrlFirstIndexPath]]; + + //[firstSelectedCell.ctrlSelectOverlayView removeFromSuperview]; + //firstSelectedCell.ctrlSelectOverlayView = nil; + + NSRange indexRange; + NSInteger firstRow = [gvController ctrlFirstIndexPath].row; + NSInteger firstSection = [gvController ctrlFirstIndexPath].section; + NSInteger nextRow = nextIndexPath.row; + NSInteger nextSection = nextIndexPath.section; + + NSInteger lowRow = 0; + NSInteger highRow = 0; + NSInteger lowSection = 0; + NSInteger highSection = 0; + NSInteger sectionItemCount = 0; + + if (firstRow == nextRow && nextSection == firstSection){ + + [gvController setCtrlFirstIndexPath:nil]; + + } else { + + if (nextSection == firstSection){ + + if (firstRow < nextRow){ + indexRange = NSMakeRange(firstRow, nextRow - firstRow + 1); + } else { + indexRange = NSMakeRange(nextRow, firstRow - nextRow + 1); + } + + [gvController setSelected:YES itemsAtIndexes:[%c(NSIndexSet) indexSetWithIndexesInRange:indexRange] inSection:(long long)firstSection animated:NO]; + + } else { + + if (nextSection > firstSection){ + + lowRow = firstRow; + lowSection = firstSection; + highRow = nextRow; + highSection = nextSection; + + } else if (nextSection < firstSection){ + + lowRow = nextRow; + lowSection = nextSection; + highRow = firstRow; + highSection = firstSection; + + } + + for (NSInteger i = lowSection; i <= highSection; i++){ + sectionItemCount = [gvController collectionView:self numberOfItemsInSection:i]; + + if (i == lowSection){ + indexRange = NSMakeRange(lowRow, sectionItemCount - lowRow); + } else if (i == highSection){ + indexRange = NSMakeRange(0, highRow+1); + } else { + indexRange = NSMakeRange(0, sectionItemCount); + } + + [gvController setSelected:YES itemsAtIndexes:[%c(NSIndexSet) indexSetWithIndexesInRange:indexRange] inSection:(long long)i animated:NO]; + } + } + + [gvController handleToggleSelectionOfItemAtIndexPath:nextIndexPath]; + + [gvController setCtrlEnabled:NO]; + + } + } + } + + [gvController updateCtrlButton]; +} + + +-(id) dequeueReusableCellWithReuseIdentifier: (id) arg1 forIndexPath:(id) arg2{ + id orig = %orig; + + id gvController = [self delegate]; + + if ([orig ctrlSelectOverlayView]){ + + [orig ctrlSelectOverlayView].image = nil; + + if ([gvController ctrlEnabled] && [gvController ctrlFirstIndexPath]){ + + NSIndexPath* firstIndexPath = [gvController ctrlFirstIndexPath]; + NSIndexPath* thisIndexPath = arg2; + + HBLogDebug(@"firstIndexPath: %ld-%ld thisIndexPath: %ld-%ld", (long)firstIndexPath.section, (long)firstIndexPath.row, (long)thisIndexPath.section, (long)thisIndexPath.row); + if ( firstIndexPath.section == thisIndexPath.section && firstIndexPath.row == thisIndexPath.row){ + + [orig ctrlSelectOverlayView].image = [UIImage imageWithContentsOfFile:@"/var/mobile/Library/Application Support/PhotoCtrl/check.png"]; + + } + } + } + + return orig; +} + +%end + + +%hook PUPhotosGridCell +%property(retain,nonatomic) UIImageView* ctrlSelectOverlayView; +%end + +%end + + +%ctor{ + @autoreleasepool{ + %init(Tweak); + } +} + + + diff --git a/control b/control new file mode 100644 index 0000000..d87299e --- /dev/null +++ b/control @@ -0,0 +1,9 @@ +Package: com.lint.photoctrl +Name: PhotoCtrl +Depends: mobilesubstrate +Version: 1.0.0 +Architecture: iphoneos-arm +Description: Adds a "ctrl + shift" like function for selecting photos. +Maintainer: lint +Author: lint +Section: Tweaks diff --git a/layout/var/mobile/Library/Application Support/PhotoCtrl/check.png b/layout/var/mobile/Library/Application Support/PhotoCtrl/check.png new file mode 100644 index 0000000000000000000000000000000000000000..c8410fb73e2af3216c5579f116c9233054d3d2c4 GIT binary patch literal 4290 zcmV;z5IygSP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000H;NklbC9LHVT`qbJQlN1m2wy=jqD7|)4W# zN#5u8`@Y}r_ujne0nigh>jBV12ssb?CZKhFEZqe6!t^S3rGcr}bk!N12KNJ%P*({d z*A(mXnEKgOA7^yb37rD>0;`~X+i^fU;C>O7z!Fx1MhGDzgpep9Bt{5{6GCoz zEG|Baifbc^Bcv1j9MBScE8vYJErEv=*eD?+p2=h$fpA7tal(+|fNSkIpjq%nQI-+DDWVlir_=X!U7xdU zdz&*}MUyYic-6M;ZC%&r(&_Ylp@tFhA5sA=N52_xFSLyEppavP5E9E~vky(vTz1Qq zqJ*dwOitJLP@3Ps(c~(M6HCy?XHghSpfHwzK0b@$#1f7sS5cbZ0A1fhtzdHbeYadG znx?s&&1N482Smhw4l2=a3O*>fA9TMGvaWQ%AP3M-dFNp0`FBy)}TlxF-_AFb;orWt#Iqv z`ndsn&3d*DMk~DTxQ>v0OpI|*DRsTgfO{oAAj(HHm&-kobGo#!d127fN(-AG=e$UG zQ8Ctmvn2l|a8=@wWHNb2X7A(IJLf9zvt%#l{E1n5D@t9&Bl$q!>fDxH*-b)7%rJ~a znZ3^=ku{U>WVSa9V^NX(fKuW_eB@2h6GRZkDWeN*!~m+@i2Xo2I!804J&4uMS$;Nop4WV4CLg8BzBI_nq76bo#zqt`r%q@J@DQ z&DdYx{Sv6dW3N8mJ8}uk8T< zbX}iQGQ4bR&II?$JZ{_eHUL;tsSAN-&grVQc6f~U-~M`bZJ$a30Bqad7EO(>+#7*^ zlzAqTdB7R3)(R$XWtG(_X!frIr8E(NqUI)l>u1^~datd&Odyb<`vGDa!g0)V5* z)k^`bjn3d`auonTDc$mvwT9qVJm7KHb@u_FII(moptaE%6epHWx2#-u-;>~E@9qmO zS7O72kXwu~3jp--*-HVfjm|(HpFRB@#w@XQJ*=$Qf`N0+YXDFfO9WmtTqLwMI)lPk z;&i8$^V+$98;|~g`|fWX{IGCg&>aI0D)sl@|Ax9nPq&1O<3RA;fNn?XEhjf?Dh1S8 zAoy-Ux0>AAE@z*?|M>ftp&z~KXrgSToOPsuISanq(5*Bu9c@|t;LiiPm6o;Rixd^U zc6fX)(5)^~I=(Db;kymp?y|Jw8xaz|+tBT9M092A$@=-vu0yx8^%UC8#?Wsshw_F( zXm25f`lexMZxe_5U_fY(f`t0;PpFT3h4z47sE>4p`VeoZk8Owgpnm8d%?S0wIH7<1 kD)bNBUA{*w!)X5v02B{`bfjMkoB#j-07*qoM6N<$g2