NSButton+WebCache.m 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * This file is part of the SDWebImage package.
  3. * (c) Olivier Poitrey <rs@dailymotion.com>
  4. *
  5. * For the full copyright and license information, please view the LICENSE
  6. * file that was distributed with this source code.
  7. */
  8. #import "NSButton+WebCache.h"
  9. #if SD_MAC
  10. #import "objc/runtime.h"
  11. #import "UIView+WebCacheOperation.h"
  12. #import "UIView+WebCache.h"
  13. #import "SDInternalMacros.h"
  14. static NSString * const SDAlternateImageOperationKey = @"NSButtonAlternateImageOperation";
  15. @implementation NSButton (WebCache)
  16. #pragma mark - Image
  17. - (void)sd_setImageWithURL:(nullable NSURL *)url {
  18. [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
  19. }
  20. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder {
  21. [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
  22. }
  23. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
  24. [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
  25. }
  26. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context {
  27. [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:context progress:nil completed:nil];
  28. }
  29. - (void)sd_setImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock {
  30. [self sd_setImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock];
  31. }
  32. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
  33. [self sd_setImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock];
  34. }
  35. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
  36. [self sd_setImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock];
  37. }
  38. - (void)sd_setImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDImageLoaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock {
  39. [self sd_setImageWithURL:url placeholderImage:placeholder options:options context:nil progress:progressBlock completed:completedBlock];
  40. }
  41. - (void)sd_setImageWithURL:(nullable NSURL *)url
  42. placeholderImage:(nullable UIImage *)placeholder
  43. options:(SDWebImageOptions)options
  44. context:(nullable SDWebImageContext *)context
  45. progress:(nullable SDImageLoaderProgressBlock)progressBlock
  46. completed:(nullable SDExternalCompletionBlock)completedBlock {
  47. self.sd_currentImageURL = url;
  48. [self sd_internalSetImageWithURL:url
  49. placeholderImage:placeholder
  50. options:options
  51. context:context
  52. setImageBlock:nil
  53. progress:progressBlock
  54. completed:^(NSImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
  55. if (completedBlock) {
  56. completedBlock(image, error, cacheType, imageURL);
  57. }
  58. }];
  59. }
  60. #pragma mark - Alternate Image
  61. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url {
  62. [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:nil];
  63. }
  64. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder {
  65. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:nil];
  66. }
  67. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options {
  68. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:nil];
  69. }
  70. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options context:(nullable SDWebImageContext *)context {
  71. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options context:context progress:nil completed:nil];
  72. }
  73. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url completed:(nullable SDExternalCompletionBlock)completedBlock {
  74. [self sd_setAlternateImageWithURL:url placeholderImage:nil options:0 progress:nil completed:completedBlock];
  75. }
  76. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder completed:(nullable SDExternalCompletionBlock)completedBlock {
  77. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:0 progress:nil completed:completedBlock];
  78. }
  79. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options completed:(nullable SDExternalCompletionBlock)completedBlock {
  80. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options progress:nil completed:completedBlock];
  81. }
  82. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url placeholderImage:(nullable UIImage *)placeholder options:(SDWebImageOptions)options progress:(nullable SDImageLoaderProgressBlock)progressBlock completed:(nullable SDExternalCompletionBlock)completedBlock {
  83. [self sd_setAlternateImageWithURL:url placeholderImage:placeholder options:options context:nil progress:progressBlock completed:completedBlock];
  84. }
  85. - (void)sd_setAlternateImageWithURL:(nullable NSURL *)url
  86. placeholderImage:(nullable UIImage *)placeholder
  87. options:(SDWebImageOptions)options
  88. context:(nullable SDWebImageContext *)context
  89. progress:(nullable SDImageLoaderProgressBlock)progressBlock
  90. completed:(nullable SDExternalCompletionBlock)completedBlock {
  91. self.sd_currentAlternateImageURL = url;
  92. SDWebImageMutableContext *mutableContext;
  93. if (context) {
  94. mutableContext = [context mutableCopy];
  95. } else {
  96. mutableContext = [NSMutableDictionary dictionary];
  97. }
  98. mutableContext[SDWebImageContextSetImageOperationKey] = SDAlternateImageOperationKey;
  99. @weakify(self);
  100. [self sd_internalSetImageWithURL:url
  101. placeholderImage:placeholder
  102. options:options
  103. context:mutableContext
  104. setImageBlock:^(NSImage * _Nullable image, NSData * _Nullable imageData, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
  105. @strongify(self);
  106. self.alternateImage = image;
  107. }
  108. progress:progressBlock
  109. completed:^(NSImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {
  110. if (completedBlock) {
  111. completedBlock(image, error, cacheType, imageURL);
  112. }
  113. }];
  114. }
  115. #pragma mark - Cancel
  116. - (void)sd_cancelCurrentImageLoad {
  117. [self sd_cancelImageLoadOperationWithKey:NSStringFromClass([self class])];
  118. }
  119. - (void)sd_cancelCurrentAlternateImageLoad {
  120. [self sd_cancelImageLoadOperationWithKey:SDAlternateImageOperationKey];
  121. }
  122. #pragma mark - Private
  123. - (NSURL *)sd_currentImageURL {
  124. return objc_getAssociatedObject(self, @selector(sd_currentImageURL));
  125. }
  126. - (void)setSd_currentImageURL:(NSURL *)sd_currentImageURL {
  127. objc_setAssociatedObject(self, @selector(sd_currentImageURL), sd_currentImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  128. }
  129. - (NSURL *)sd_currentAlternateImageURL {
  130. return objc_getAssociatedObject(self, @selector(sd_currentAlternateImageURL));
  131. }
  132. - (void)setSd_currentAlternateImageURL:(NSURL *)sd_currentAlternateImageURL {
  133. objc_setAssociatedObject(self, @selector(sd_currentAlternateImageURL), sd_currentAlternateImageURL, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  134. }
  135. @end
  136. #endif