Parcourir la source

Add XCThemeProtocol

xcbosa mbp16 il y a 1 an
Parent
commit
8b53162c6f

+ 2 - 0
XCTheme.podspec

@@ -32,6 +32,8 @@ A Theme Manager for C Code Develop & C Notebook.
 
   s.source_files = 'XCTheme/Classes/**/*'
   
+  s.dependency 'XCModuleLoader'
+  
   # s.resource_bundles = {
   #   'XCTheme' => ['XCTheme/Assets/*.png']
   # }

+ 6 - 2
XCTheme/Classes/API/XCThemeManager.swift → XCTheme/Classes/Impl/XCThemeManager.swift

@@ -7,7 +7,9 @@
 
 import Foundation
 
-public class XCThemeManager {
+@objc
+@objcMembers
+public class XCThemeManager: NSObject {
     
     private class PrepareThemeBlock {
         var block: ((XCThemeSpec?) -> Void)?
@@ -49,8 +51,10 @@ public class XCThemeManager {
     private var themes: [String : XCThemeSpec]
     private var prepareThemeBlocks = [PrepareThemeBlock]()
     
-    private init() {
+    override init() {
         self.themes = [:]
+        super.init()
+        
         guard let path = Bundle.main.path(forResource: "ThemeResources", ofType: nil) else {
             return
         }

+ 22 - 0
XCTheme/Classes/Impl/XCThemeService.m

@@ -0,0 +1,22 @@
+//
+//  XCThemeService.m
+//  XCTheme
+//
+//  Created by 邢铖 on 2023/11/19.
+//
+
+#import "XCThemeProtocol.h"
+#import "XCTheme-Swift.h"
+
+@xcmlservice(XCThemeProtocol, XCThemeService)
+
+- (void)prepareThemeOn:(nullable NSObject *)object block:(nullable void (^)(XCThemeSpecModel * _Nullable))block {
+    [XCThemeManager.shared prepareThemeBlockWithTarget:object :^(XCThemeSpec * _Nullable theme) {
+        XCThemeSpecModel * _Nullable wrappedModel = [[XCThemeSpecModel alloc] initWithWrappedObject:theme];
+        if (block) {
+            block(wrappedModel);
+        }
+    }];
+}
+
+@end

+ 32 - 1
XCTheme/Classes/API/XCThemeSpec.swift → XCTheme/Classes/Impl/XCThemeSpec.swift

@@ -7,7 +7,9 @@
 
 import Foundation
 
-public class XCThemeSpec {
+@objc
+@objcMembers
+public class XCThemeSpec: NSObject {
     
     public private(set) var themeId: String
     public private(set) var originalDict: [String : Any]
@@ -17,6 +19,8 @@ public class XCThemeSpec {
         self.interfaceStyle = .unspecified
         self.themeId = themeId
         self.originalDict = [:]
+        super.init()
+        
         if (themeId.contains("/") || themeId.contains("\\")) {
             return nil
         }
@@ -87,3 +91,30 @@ extension XCThemeSpec {
     }
     
 }
+
+fileprivate extension UIColor {
+    
+    // Hex String -> UIColor
+    convenience init(hexString: String) {
+        let hexString = hexString.trimmingCharacters(in: .whitespacesAndNewlines)
+        let scanner = Scanner(string: hexString)
+        
+        if hexString.hasPrefix("#") {
+            scanner.scanLocation = 1
+        }
+        
+        var color: UInt32 = 0
+        scanner.scanHexInt32(&color)
+        
+        let mask = 0x000000FF
+        let r = Int(color >> 16) & mask
+        let g = Int(color >> 8) & mask
+        let b = Int(color) & mask
+        
+        let red   = CGFloat(r) / 255.0
+        let green = CGFloat(g) / 255.0
+        let blue  = CGFloat(b) / 255.0
+        
+        self.init(red: red, green: green, blue: blue, alpha: 1)
+    }
+}

+ 22 - 0
XCTheme/Classes/Module/XCThemeProtocol.h

@@ -0,0 +1,22 @@
+//
+//  XCThemeProtocol.h
+//  Pods
+//
+//  Created by 邢铖 on 2023/11/19.
+//
+
+#import <Foundation/Foundation.h>
+#import <XCModuleLoader/XCModuleLoader.h>
+#import "XCThemeSpecModel.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@xcmlmodule(XCThemeProtocol)
+
+@protocol XCThemeProtocol <NSObject>
+
+- (void)prepareThemeOn:(nullable NSObject *)object block:(nullable void (^)(XCThemeSpecModel * _Nullable))block;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 25 - 0
XCTheme/Classes/Module/XCThemeSpecModel.h

@@ -0,0 +1,25 @@
+//
+//  XCThemeSpecModel.h
+//  XCTheme
+//
+//  Created by 邢铖 on 2023/11/19.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface XCThemeSpecModel : NSObject
+
+@property (nonatomic, weak, readonly) id wrappedObject;
+
+@property (nonatomic, copy, readonly) NSDictionary<NSString *, NSObject *> *originalDict;
+@property (nonatomic, strong, readonly) UIImage *backgroundImage;
+@property (nonatomic, strong, readonly) UIColor *maskColor;
+@property (nonatomic, assign, readonly) CGFloat maskAlpha;
+
+- (nullable instancetype)initWithWrappedObject:(id)object;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 49 - 0
XCTheme/Classes/Module/XCThemeSpecModel.m

@@ -0,0 +1,49 @@
+//
+//  XCThemeSpecModel.m
+//  XCTheme
+//
+//  Created by 邢铖 on 2023/11/19.
+//
+
+#import "XCThemeSpecModel.h"
+#import "XCTheme-Swift.h"
+
+@interface XCThemeSpecModel ()
+
+@property (nonatomic, weak) XCThemeSpec *wrappedObject;
+
+@end
+
+@implementation XCThemeSpecModel
+
+- (nullable instancetype)initWithWrappedObject:(id)object {
+    if (!object) {
+        return nil;
+    }
+    if (![object isKindOfClass:XCThemeSpec.class]) {
+        return nil;
+    }
+    self = [super init];
+    if (self) {
+        self.wrappedObject = object;
+    }
+    return self;
+}
+
+- (NSDictionary<NSString *,NSObject *> *)originalDict {
+    return self.wrappedObject.originalDict.copy;
+}
+
+- (UIImage *)backgroundImage {
+    return self.wrappedObject.backgroundImage;
+}
+
+- (UIColor *)maskColor {
+    return self.wrappedObject.maskColor;
+}
+
+- (CGFloat)maskAlpha {
+    return self.wrappedObject.maskAlpha;
+}
+
+@end

+ 0 - 9
XCTheme/Classes/Private/XCTheme.swift

@@ -1,9 +0,0 @@
-//
-//  XCThemeSpec.swift
-//  notebook
-//
-//  Created by 邢铖 on 2023/11/18.
-//
-
-import Foundation
-