├── .gitignore ├── .swift-version ├── .travis.yml ├── ClientScreenshot.png ├── Example ├── GitYourFeedback.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── GitYourFeedack-Example.xcscheme ├── GitYourFeedback.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── GitYourFeedback │ ├── AppDelegate.swift │ ├── Base.lproj │ │ └── LaunchScreen.xib │ ├── Config.swift │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── Info.plist │ └── ViewController.swift ├── Podfile ├── Podfile.lock └── Pods │ ├── CLImageEditor │ ├── CLImageEditor │ │ ├── CLImageEditor.bundle │ │ │ ├── CLAdjustmentTool │ │ │ │ ├── black │ │ │ │ │ ├── brightness.png │ │ │ │ │ ├── brightness@2x.png │ │ │ │ │ ├── contrast.png │ │ │ │ │ ├── contrast@2x.png │ │ │ │ │ ├── icon.png │ │ │ │ │ ├── saturation.png │ │ │ │ │ └── saturation@2x.png │ │ │ │ └── white │ │ │ │ │ ├── brightness.png │ │ │ │ │ ├── brightness@2x.png │ │ │ │ │ ├── contrast.png │ │ │ │ │ ├── contrast@2x.png │ │ │ │ │ ├── icon.png │ │ │ │ │ ├── saturation.png │ │ │ │ │ └── saturation@2x.png │ │ │ ├── CLBlurTool │ │ │ │ ├── black │ │ │ │ │ ├── band.png │ │ │ │ │ ├── btn_band.png │ │ │ │ │ ├── btn_circle.png │ │ │ │ │ ├── btn_normal.png │ │ │ │ │ ├── circle.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── band.png │ │ │ │ │ ├── btn_band.png │ │ │ │ │ ├── btn_circle.png │ │ │ │ │ ├── btn_normal.png │ │ │ │ │ ├── circle.png │ │ │ │ │ └── icon.png │ │ │ ├── CLClippingTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_rotate.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_rotate.png │ │ │ │ │ └── icon.png │ │ │ ├── CLDrawTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_eraser.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_eraser.png │ │ │ │ │ └── icon.png │ │ │ ├── CLEffectTool │ │ │ │ ├── CLBloomEffect.png │ │ │ │ ├── CLEffectBase.png │ │ │ │ ├── CLGloomEffect.png │ │ │ │ ├── CLHighlightShadowEffect.png │ │ │ │ ├── CLHueEffect.png │ │ │ │ ├── CLPixellateEffect.png │ │ │ │ ├── CLPosterizeEffect.png │ │ │ │ ├── CLSpotEffect.png │ │ │ │ ├── black │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ └── icon.png │ │ │ ├── CLEmoticonTool │ │ │ │ ├── Copyright │ │ │ │ ├── Emoticons │ │ │ │ │ ├── 001.png │ │ │ │ │ ├── 002.png │ │ │ │ │ ├── 003.png │ │ │ │ │ ├── 004.png │ │ │ │ │ ├── 005.png │ │ │ │ │ ├── 006.png │ │ │ │ │ ├── 007.png │ │ │ │ │ ├── 008.png │ │ │ │ │ ├── 009.png │ │ │ │ │ ├── 010.png │ │ │ │ │ ├── 011.png │ │ │ │ │ ├── 012.png │ │ │ │ │ ├── 013.png │ │ │ │ │ ├── 014.png │ │ │ │ │ ├── 015.png │ │ │ │ │ ├── 016.png │ │ │ │ │ └── 017.png │ │ │ │ ├── black │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ └── icon.png │ │ │ ├── CLFilterTool │ │ │ │ ├── black │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ └── icon.png │ │ │ ├── CLResizeTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_chain_off.png │ │ │ │ │ ├── btn_chain_on.png │ │ │ │ │ ├── btn_height.png │ │ │ │ │ ├── btn_width.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_chain_off.png │ │ │ │ │ ├── btn_chain_on.png │ │ │ │ │ ├── btn_height.png │ │ │ │ │ ├── btn_width.png │ │ │ │ │ └── icon.png │ │ │ ├── CLRotateTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_flip1.png │ │ │ │ │ ├── btn_flip2.png │ │ │ │ │ ├── btn_rotate.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_flip1.png │ │ │ │ │ ├── btn_flip2.png │ │ │ │ │ ├── btn_rotate.png │ │ │ │ │ └── icon.png │ │ │ ├── CLSplashTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_eraser.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_eraser.png │ │ │ │ │ └── icon.png │ │ │ ├── CLStickerTool │ │ │ │ ├── Copyright │ │ │ │ ├── black │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ └── icon.png │ │ │ │ ├── stickers │ │ │ │ │ ├── 001.png │ │ │ │ │ ├── 002.png │ │ │ │ │ ├── 003.png │ │ │ │ │ ├── 004.png │ │ │ │ │ ├── 005.png │ │ │ │ │ ├── 006.png │ │ │ │ │ ├── 007.png │ │ │ │ │ ├── 008.png │ │ │ │ │ ├── 009.png │ │ │ │ │ ├── 010.png │ │ │ │ │ ├── 011.png │ │ │ │ │ └── 012.png │ │ │ │ └── white │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ └── icon.png │ │ │ ├── CLTextTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_add.png │ │ │ │ │ ├── btn_align_center.png │ │ │ │ │ ├── btn_align_left.png │ │ │ │ │ ├── btn_align_right.png │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ ├── btn_font.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_add.png │ │ │ │ │ ├── btn_align_center.png │ │ │ │ │ ├── btn_align_left.png │ │ │ │ │ ├── btn_align_right.png │ │ │ │ │ ├── btn_delete.png │ │ │ │ │ ├── btn_font.png │ │ │ │ │ └── icon.png │ │ │ ├── CLToneCurveTool │ │ │ │ ├── black │ │ │ │ │ ├── btn_arrow.png │ │ │ │ │ ├── btn_reset.png │ │ │ │ │ └── icon.png │ │ │ │ └── white │ │ │ │ │ ├── btn_arrow.png │ │ │ │ │ ├── btn_reset.png │ │ │ │ │ └── icon.png │ │ │ └── Resources │ │ │ │ ├── ar.lproj │ │ │ │ └── Localizable.strings │ │ │ │ ├── en.lproj │ │ │ │ └── Localizable.strings │ │ │ │ ├── fr.lproj │ │ │ │ └── Localizable.strings │ │ │ │ ├── ja.lproj │ │ │ │ └── Localizable.strings │ │ │ │ ├── ru.lproj │ │ │ │ └── Localizable.strings │ │ │ │ ├── zh-Hans.lproj │ │ │ │ └── Localizable.strings │ │ │ │ └── zh-Hant.lproj │ │ │ │ └── Localizable.strings │ │ ├── CLImageEditor.h │ │ ├── CLImageEditor.m │ │ ├── CLImageEditorTheme.h │ │ ├── CLImageEditorTheme.m │ │ ├── CLImageToolInfo.h │ │ ├── CLImageToolInfo.m │ │ ├── ImageTools │ │ │ ├── CLAdjustmentTool │ │ │ │ ├── CLAdjustmentTool.h │ │ │ │ └── CLAdjustmentTool.m │ │ │ ├── CLBlurTool │ │ │ │ ├── CLBlurTool.h │ │ │ │ └── CLBlurTool.m │ │ │ ├── CLClippingTool │ │ │ │ ├── CLClippingTool.h │ │ │ │ └── CLClippingTool.m │ │ │ ├── CLDrawTool │ │ │ │ ├── CLDrawTool.h │ │ │ │ └── CLDrawTool.m │ │ │ ├── CLEffectTool │ │ │ │ ├── CLEffect │ │ │ │ │ ├── CLBloomEffect.h │ │ │ │ │ ├── CLBloomEffect.m │ │ │ │ │ ├── CLGloomEffect.h │ │ │ │ │ ├── CLGloomEffect.m │ │ │ │ │ ├── CLHighlightShadowEffect.h │ │ │ │ │ ├── CLHighlightShadowEffect.m │ │ │ │ │ ├── CLHueEffect.h │ │ │ │ │ ├── CLHueEffect.m │ │ │ │ │ ├── CLPixellateEffect.h │ │ │ │ │ ├── CLPixellateEffect.m │ │ │ │ │ ├── CLPosterizeEffect.h │ │ │ │ │ ├── CLPosterizeEffect.m │ │ │ │ │ ├── CLSpotEffect.h │ │ │ │ │ └── CLSpotEffect.m │ │ │ │ ├── CLEffectBase.h │ │ │ │ ├── CLEffectBase.m │ │ │ │ ├── CLEffectTool.h │ │ │ │ └── CLEffectTool.m │ │ │ ├── CLFilterTool │ │ │ │ ├── CLFilterBase.h │ │ │ │ ├── CLFilterBase.m │ │ │ │ ├── CLFilterTool.h │ │ │ │ └── CLFilterTool.m │ │ │ ├── CLImageToolBase.h │ │ │ ├── CLImageToolBase.m │ │ │ ├── CLRotateTool │ │ │ │ ├── CLRotateTool.h │ │ │ │ └── CLRotateTool.m │ │ │ ├── CLToneCurveTool │ │ │ │ ├── CLToneCurveTool.h │ │ │ │ └── CLToneCurveTool.m │ │ │ └── ToolSettings │ │ │ │ ├── CLCircleView.h │ │ │ │ ├── CLCircleView.m │ │ │ │ ├── CLColorPickerView.h │ │ │ │ ├── CLColorPickerView.m │ │ │ │ ├── CLImageEditorTheme+Private.h │ │ │ │ ├── CLImageEditorTheme+Private.m │ │ │ │ ├── CLImageToolInfo+Private.h │ │ │ │ ├── CLImageToolInfo+Private.m │ │ │ │ ├── CLImageToolProtocol.h │ │ │ │ ├── CLImageToolSettings.h │ │ │ │ ├── CLToolbarMenuItem.h │ │ │ │ ├── CLToolbarMenuItem.m │ │ │ │ ├── UIView+CLImageToolInfo.h │ │ │ │ └── UIView+CLImageToolInfo.m │ │ ├── Utils │ │ │ ├── CLClassList.h │ │ │ ├── CLClassList.m │ │ │ ├── CLSplineInterpolator.h │ │ │ ├── CLSplineInterpolator.m │ │ │ ├── UIDevice+SystemVersion.h │ │ │ ├── UIDevice+SystemVersion.m │ │ │ ├── UIImage+Utility.h │ │ │ ├── UIImage+Utility.m │ │ │ ├── UIView+Frame.h │ │ │ └── UIView+Frame.m │ │ └── ViewController │ │ │ ├── _CLImageEditorViewController.h │ │ │ └── _CLImageEditorViewController.m │ ├── LICENSE │ ├── OptionalImageTools │ │ └── CLTextTool │ │ │ ├── CLFontPickerView.h │ │ │ ├── CLFontPickerView.m │ │ │ ├── CLPickerDrum.h │ │ │ ├── CLPickerDrum.m │ │ │ ├── CLPickerView.h │ │ │ ├── CLPickerView.m │ │ │ ├── CLTextLabel.h │ │ │ ├── CLTextLabel.m │ │ │ ├── CLTextSettingView.h │ │ │ ├── CLTextSettingView.m │ │ │ ├── CLTextTool.h │ │ │ └── CLTextTool.m │ └── README.md │ ├── GRMustache.swift │ ├── LICENSE │ ├── ObjC │ │ ├── GRMustacheKeyAccess.h │ │ ├── GRMustacheKeyAccess.m │ │ └── Mustache.h │ ├── README.md │ └── Sources │ │ ├── Box.swift │ │ ├── Common.swift │ │ ├── Configuration.swift │ │ ├── Context.swift │ │ ├── CoreFunctions.swift │ │ ├── CoreGraphics.swift │ │ ├── EachFilter.swift │ │ ├── Expression.swift │ │ ├── ExpressionGenerator.swift │ │ ├── ExpressionInvocation.swift │ │ ├── ExpressionParser.swift │ │ ├── Fixit-1.1.0.swift │ │ ├── Formatter.swift │ │ ├── Foundation.swift │ │ ├── HTMLEscapeHelper.swift │ │ ├── JavascriptEscapeHelper.swift │ │ ├── Localizer.swift │ │ ├── LocatedTag.swift │ │ ├── Logger.swift │ │ ├── MustacheBox.swift │ │ ├── RenderingEngine.swift │ │ ├── SectionTag.swift │ │ ├── StandardLibrary.swift │ │ ├── SwiftStandardLibrary.swift │ │ ├── Tag.swift │ │ ├── Template.swift │ │ ├── TemplateAST.swift │ │ ├── TemplateASTNode.swift │ │ ├── TemplateCompiler.swift │ │ ├── TemplateGenerator.swift │ │ ├── TemplateParser.swift │ │ ├── TemplateRepository.swift │ │ ├── TemplateToken.swift │ │ ├── URLEscapeHelper.swift │ │ ├── VariableTag.swift │ │ └── ZipFilter.swift │ ├── GitYourFeedbackTests │ ├── GitYourFeedbackTests.swift │ └── Info.plist │ ├── Local Podspecs │ ├── GitYourFeedack.podspec.json │ └── GitYourFeedback.podspec.json │ ├── Manifest.lock │ ├── Pods.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ └── xcshareddata │ │ └── xcschemes │ │ └── GitYourFeedback.xcscheme │ └── Target Support Files │ ├── CLImageEditor │ ├── CLImageEditor-dummy.m │ ├── CLImageEditor-prefix.pch │ ├── CLImageEditor-umbrella.h │ ├── CLImageEditor.modulemap │ ├── CLImageEditor.xcconfig │ └── Info.plist │ ├── GRMustache.swift │ ├── GRMustache.swift-dummy.m │ ├── GRMustache.swift-prefix.pch │ ├── GRMustache.swift-umbrella.h │ ├── GRMustache.swift.modulemap │ ├── GRMustache.swift.xcconfig │ └── Info.plist │ ├── GitYourFeedback │ ├── GitYourFeedback-dummy.m │ ├── GitYourFeedback-prefix.pch │ ├── GitYourFeedback-umbrella.h │ ├── GitYourFeedback.modulemap │ ├── GitYourFeedback.xcconfig │ └── Info.plist │ └── Pods-GitYourFeedback_Example │ ├── Info.plist │ ├── Pods-GitYourFeedback_Example-acknowledgements.markdown │ ├── Pods-GitYourFeedback_Example-acknowledgements.plist │ ├── Pods-GitYourFeedback_Example-dummy.m │ ├── Pods-GitYourFeedback_Example-frameworks.sh │ ├── Pods-GitYourFeedback_Example-resources.sh │ ├── Pods-GitYourFeedback_Example-umbrella.h │ ├── Pods-GitYourFeedback_Example.debug.xcconfig │ ├── Pods-GitYourFeedback_Example.modulemap │ └── Pods-GitYourFeedback_Example.release.xcconfig ├── GitYourFeedback.podspec ├── GitYourFeedback ├── Assets │ ├── .gitkeep │ ├── Icons.xcassets │ │ ├── Contents.json │ │ ├── add_photo.imageset │ │ │ ├── Contents.json │ │ │ └── add_photo.pdf │ │ ├── camera.imageset │ │ │ ├── Contents.json │ │ │ └── camera.pdf │ │ ├── close.imageset │ │ │ ├── Contents.json │ │ │ └── close.pdf │ │ └── save.imageset │ │ │ ├── Contents.json │ │ │ └── save.pdf │ └── issueTemplate.md └── Classes │ ├── .gitkeep │ ├── CLImageEditorExtension.swift │ ├── Errors.swift │ ├── FeedbackReporter.swift │ ├── FeedbackReportingOptions.swift │ ├── FeedbackViewController.swift │ ├── GoogleStorage.swift │ ├── Helpers.swift │ ├── MediaQuery.swift │ ├── PlaceholderTextView.swift │ ├── Reachability.swift │ ├── UIImageExtension.swift │ └── UIViewControllerExtension.swift ├── GitYourFeedbackDemo.gif ├── GithubScreenshot.png ├── LICENSE ├── README.md ├── _Pods.xcodeproj └── docs ├── .gitkeep ├── index.html ├── params.json └── stylesheets ├── github-light.css ├── normalize.css └── stylesheet.css /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xcuserstate 23 | 24 | ## Obj-C/Swift specific 25 | *.hmap 26 | *.ipa 27 | *.dSYM.zip 28 | *.dSYM 29 | 30 | ## Playgrounds 31 | timeline.xctimeline 32 | playground.xcworkspace 33 | 34 | # Swift Package Manager 35 | # 36 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 37 | # Packages/ 38 | .build/ 39 | 40 | # CocoaPods 41 | # 42 | # We recommend against adding the Pods directory to your .gitignore. However 43 | # you should judge for yourself, the pros and cons are mentioned at: 44 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 45 | # 46 | # Pods/ 47 | 48 | # Carthage 49 | # 50 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 51 | # Carthage/Checkouts 52 | 53 | Carthage/Build 54 | 55 | # fastlane 56 | # 57 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 58 | # screenshots whenever they are needed. 59 | # For more information about the recommended setup visit: 60 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md 61 | 62 | fastlane/report.xml 63 | fastlane/Preview.html 64 | fastlane/screenshots 65 | fastlane/test_output 66 | 67 | Example/GitYourFeedback/Config.swift -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.2 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # references: 2 | # * http://www.objc.io/issue-6/travis-ci.html 3 | # * https://github.com/supermarin/xcpretty#usage 4 | 5 | osx_image: xcode7.3 6 | language: objective-c 7 | # cache: cocoapods 8 | # podfile: Example/Podfile 9 | # before_install: 10 | # - gem install cocoapods # Since Travis is not always on latest version 11 | # - pod install --project-directory=Example 12 | script: 13 | - set -o pipefail && xcodebuild test -workspace Example/GitYourFeedback.xcworkspace -scheme GitYourFeedback-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty 14 | - pod lib lint 15 | -------------------------------------------------------------------------------- /ClientScreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/ClientScreenshot.png -------------------------------------------------------------------------------- /Example/GitYourFeedback.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/GitYourFeedback.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/GitYourFeedback.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/GitYourFeedback.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Example/GitYourFeedback/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 09/11/2016. 6 | // Copyright (c) 2016 Gabe Kangas. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | window = UIWindow() 20 | window?.rootViewController = ViewController() 21 | window?.makeKeyAndVisible() 22 | return true 23 | } 24 | 25 | func applicationWillResignActive(_ application: UIApplication) { 26 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 27 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 28 | } 29 | 30 | func applicationDidEnterBackground(_ application: UIApplication) { 31 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 32 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 33 | } 34 | 35 | func applicationWillEnterForeground(_ application: UIApplication) { 36 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 37 | } 38 | 39 | func applicationDidBecomeActive(_ application: UIApplication) { 40 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 41 | } 42 | 43 | func applicationWillTerminate(_ application: UIApplication) { 44 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 45 | } 46 | 47 | 48 | } 49 | 50 | -------------------------------------------------------------------------------- /Example/GitYourFeedback/Config.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Config.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 9/12/16. 6 | // Copyright © 2016 CocoaPods. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct Config { 12 | 13 | static let githubApiToken = "abc123" 14 | static let githubRepo = "yourusername/yourRepoName" 15 | static let githubUser = "repoman" 16 | static let googleStorageBucket = "yourbucket.appspot.com" 17 | } 18 | -------------------------------------------------------------------------------- /Example/GitYourFeedback/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | } 43 | ], 44 | "info" : { 45 | "version" : 1, 46 | "author" : "xcode" 47 | } 48 | } -------------------------------------------------------------------------------- /Example/GitYourFeedback/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | NSPhotoLibraryUsageDescription 26 | Example usage for GitYourFeedback library 27 | UILaunchStoryboardName 28 | LaunchScreen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/GitYourFeedback/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 09/11/2016. 6 | // Copyright (c) 2016 Gabe Kangas. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import GitYourFeedback 11 | 12 | class ViewController: UIViewController { 13 | 14 | var feedback: FeedbackReporter! 15 | let feedbackReportingOptions = FeedbackReportingOptions(token: Config.githubApiToken, user: Config.githubUser, repo: Config.githubRepo) 16 | 17 | override func viewDidLoad() { 18 | super.viewDidLoad() 19 | 20 | self.feedback = FeedbackReporter(options: feedbackReportingOptions, datasource: self) 21 | 22 | view.backgroundColor = UIColor.white 23 | 24 | view.addSubview(button) 25 | button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 26 | button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 27 | button.widthAnchor.constraint(equalToConstant: 150).isActive = true 28 | button.heightAnchor.constraint(equalToConstant: 45).isActive = true 29 | button.addTarget(self, action: #selector(display), for: .touchUpInside) 30 | 31 | view.addSubview(label) 32 | label.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor).isActive = true 33 | label.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor).isActive = true 34 | label.bottomAnchor.constraint(equalTo: button.topAnchor, constant: -50).isActive = true 35 | } 36 | 37 | @objc func display() { 38 | self.feedback.display(viewController: self) 39 | } 40 | 41 | private let button: UIButton = { 42 | let button = UIButton(type: .roundedRect) 43 | button.translatesAutoresizingMaskIntoConstraints = false 44 | button.setTitle("Provide Feedback", for: .normal) 45 | button.setTitleColor(UIColor.white, for: .normal) 46 | button.backgroundColor = UIColor.blue 47 | return button 48 | }() 49 | 50 | private let label: UILabel = { 51 | let label = UILabel() 52 | label.translatesAutoresizingMaskIntoConstraints = false 53 | label.text = "Take a screenshot or press button to provide feedback" 54 | label.numberOfLines = 0 55 | label.textAlignment = .center 56 | label.font = UIFont.systemFont(ofSize: 14) 57 | return label 58 | }() 59 | 60 | } 61 | 62 | extension ViewController: FeedbackReporterDatasource { 63 | 64 | public func uploadUrl(_ completionHandler: (String) -> Void) { 65 | let filename = String(Date().timeIntervalSince1970) + ".jpg" 66 | let url = "https://www.googleapis.com/upload/storage/v1/b/\(Config.googleStorageBucket)/o?name=\(filename)" 67 | completionHandler(url) 68 | } 69 | 70 | public func additionalData() -> String? { 71 | return "This is additional data that was added via the FeedbackManagerDatasource.\n\nYou can put whatever you want here." 72 | } 73 | 74 | public func issueLabels() -> [String]? { 75 | return ["Feedback", "Bugs", "Anything"] 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'GitYourFeedback_Example' do 4 | pod 'GitYourFeedback', :path => '../' 5 | end 6 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CLImageEditor (0.1.6): 3 | - CLImageEditor/Core (= 0.1.6) 4 | - CLImageEditor/Core (0.1.6) 5 | - CLImageEditor/TextTool (0.1.6): 6 | - CLImageEditor/Core 7 | - GitYourFeedback (0.1.0): 8 | - CLImageEditor 9 | - CLImageEditor/TextTool 10 | - GRMustache.swift 11 | - GRMustache.swift (2.0.0) 12 | 13 | DEPENDENCIES: 14 | - GitYourFeedback (from `../`) 15 | 16 | EXTERNAL SOURCES: 17 | GitYourFeedback: 18 | :path: "../" 19 | 20 | SPEC CHECKSUMS: 21 | CLImageEditor: a0fa2fefc7b2ad611f2116dccbe3db5621f70301 22 | GitYourFeedback: 3bbba0f68e29e17ecbb6c0058a52e09722f2a126 23 | GRMustache.swift: 8a547c12bea16052071b2b540af83d770075f0eb 24 | 25 | PODFILE CHECKSUM: ecbecaa659d35b1b54d3667d6999c056253c5699 26 | 27 | COCOAPODS: 1.1.1 28 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/brightness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/brightness.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/brightness@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/brightness@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/contrast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/contrast.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/contrast@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/contrast@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/saturation.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/saturation@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/black/saturation@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/brightness.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/brightness.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/brightness@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/brightness@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/contrast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/contrast.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/contrast@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/contrast@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/saturation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/saturation.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/saturation@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLAdjustmentTool/white/saturation@2x.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/band.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/band.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_band.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_band.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_circle.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/btn_normal.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/circle.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/band.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/band.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_band.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_band.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_circle.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/btn_normal.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/circle.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLBlurTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/black/btn_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/black/btn_rotate.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/white/btn_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/white/btn_rotate.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLClippingTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/black/btn_eraser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/black/btn_eraser.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/white/btn_eraser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/white/btn_eraser.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLDrawTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLBloomEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLBloomEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLEffectBase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLEffectBase.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLGloomEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLGloomEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLHighlightShadowEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLHighlightShadowEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLHueEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLHueEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLPixellateEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLPixellateEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLPosterizeEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLPosterizeEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLSpotEffect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/CLSpotEffect.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEffectTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Copyright: -------------------------------------------------------------------------------- 1 | 2 | The images in ./Emoticons are copyrighted by iMokhles (http:/imokhles.com/). 3 | 4 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/001.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/002.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/003.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/004.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/005.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/006.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/007.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/008.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/009.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/010.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/011.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/012.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/013.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/013.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/014.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/014.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/015.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/015.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/016.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/016.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/017.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/Emoticons/017.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/black/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/black/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/white/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/white/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLEmoticonTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLFilterTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLFilterTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLFilterTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLFilterTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_chain_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_chain_off.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_chain_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_chain_on.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_height.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_height.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/btn_width.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_chain_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_chain_off.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_chain_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_chain_on.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_height.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_height.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_width.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/btn_width.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLResizeTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_flip1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_flip1.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_flip2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_flip2.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/btn_rotate.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_flip1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_flip1.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_flip2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_flip2.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/btn_rotate.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLRotateTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/black/btn_eraser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/black/btn_eraser.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/white/btn_eraser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/white/btn_eraser.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLSplashTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/Copyright: -------------------------------------------------------------------------------- 1 | 2 | The following images are copyrighted by ICON HOIHOI(http://iconhoihoi.oops.jp/). 3 | 4 | stickers/001.png 5 | stickers/002.png 6 | stickers/003.png 7 | stickers/004.png 8 | stickers/005.png 9 | stickers/006.png 10 | stickers/007.png 11 | stickers/008.png 12 | stickers/009.png 13 | stickers/010.png 14 | stickers/011.png 15 | stickers/012.png 16 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/black/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/black/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/001.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/001.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/002.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/002.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/003.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/003.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/004.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/004.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/005.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/005.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/006.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/006.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/007.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/007.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/008.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/008.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/009.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/009.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/010.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/010.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/011.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/011.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/012.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/stickers/012.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/white/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/white/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLStickerTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_add.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_center.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_left.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_align_right.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/btn_font.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_add.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_center.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_left.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_align_right.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_delete.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/btn_font.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLTextTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/btn_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/btn_arrow.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/btn_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/btn_reset.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/black/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/btn_arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/btn_arrow.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/btn_reset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/btn_reset.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/CLToneCurveTool/white/icon.png -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/ar.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/ar.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/fr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/ja.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/zh-Hans.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/zh-Hans.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/zh-Hant.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.bundle/Resources/zh-Hant.lproj/Localizable.strings -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditor.h 3 | // 4 | // Created by sho yakushiji on 2013/10/17. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "CLImageToolInfo.h" 11 | #import "CLImageEditorTheme.h" 12 | 13 | @protocol CLImageEditorDelegate; 14 | @protocol CLImageEditorTransitionDelegate; 15 | 16 | @interface CLImageEditor : UIViewController 17 | { 18 | 19 | } 20 | @property (nonatomic, weak) id delegate; 21 | @property (nonatomic, readonly) CLImageEditorTheme *theme; 22 | @property (nonatomic, readonly) CLImageToolInfo *toolInfo; 23 | 24 | - (id)initWithImage:(UIImage*)image; 25 | - (id)initWithImage:(UIImage*)image delegate:(id)delegate; 26 | - (id)initWithDelegate:(id)delegate; 27 | 28 | - (void)showInViewController:(UIViewController*)controller withImageView:(UIImageView*)imageView; 29 | 30 | @end 31 | 32 | 33 | 34 | @protocol CLImageEditorDelegate 35 | @optional 36 | - (void)imageEditor:(CLImageEditor*)editor didFinishEdittingWithImage:(UIImage*)image; 37 | - (void)imageEditorDidCancel:(CLImageEditor*)editor; 38 | 39 | @end 40 | 41 | 42 | @protocol CLImageEditorTransitionDelegate 43 | @optional 44 | - (void)imageEditor:(CLImageEditor*)editor willDismissWithImageView:(UIImageView*)imageView canceled:(BOOL)canceled; 45 | - (void)imageEditor:(CLImageEditor*)editor didDismissWithImageView:(UIImageView*)imageView canceled:(BOOL)canceled; 46 | 47 | @end 48 | 49 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditor.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditor.m 3 | // 4 | // Created by sho yakushiji on 2013/10/17. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageEditor.h" 9 | 10 | #import "_CLImageEditorViewController.h" 11 | 12 | @interface CLImageEditor () 13 | 14 | @end 15 | 16 | 17 | @implementation CLImageEditor 18 | 19 | - (id)init 20 | { 21 | return [_CLImageEditorViewController new]; 22 | } 23 | 24 | - (id)initWithImage:(UIImage*)image 25 | { 26 | return [self initWithImage:image delegate:nil]; 27 | } 28 | 29 | - (id)initWithImage:(UIImage*)image delegate:(id)delegate 30 | { 31 | return [[_CLImageEditorViewController alloc] initWithImage:image delegate:delegate]; 32 | } 33 | 34 | - (id)initWithDelegate:(id)delegate 35 | { 36 | return [[_CLImageEditorViewController alloc] initWithDelegate:delegate]; 37 | } 38 | 39 | - (void)showInViewController:(UIViewController*)controller withImageView:(UIImageView*)imageView; 40 | { 41 | 42 | } 43 | 44 | - (CLImageEditorTheme*)theme 45 | { 46 | return [CLImageEditorTheme theme]; 47 | } 48 | 49 | @end 50 | 51 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditorTheme.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditorTheme.h 3 | // 4 | // Created by sho yakushiji on 2013/12/05. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | @protocol CLImageEditorThemeDelegate; 11 | 12 | @interface CLImageEditorTheme : NSObject 13 | 14 | @property (nonatomic, weak) id delegate; 15 | @property (nonatomic, strong) NSString *bundleName; 16 | @property (nonatomic, strong) UIColor *backgroundColor; 17 | @property (nonatomic, strong) UIColor *toolbarColor; 18 | @property (nonatomic, strong) NSString *toolIconColor; 19 | @property (nonatomic, strong) UIColor *toolbarTextColor; 20 | @property (nonatomic, strong) UIColor *toolbarSelectedButtonColor; 21 | @property (nonatomic, strong) UIFont *toolbarTextFont; 22 | @property (nonatomic, assign) UIStatusBarStyle statusBarStyle; 23 | 24 | + (CLImageEditorTheme*)theme; 25 | 26 | @end 27 | 28 | 29 | @protocol CLImageEditorThemeDelegate 30 | @optional 31 | - (UIActivityIndicatorView*)imageEditorThemeActivityIndicatorView; 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageEditorTheme.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditorTheme.m 3 | // 4 | // Created by sho yakushiji on 2013/12/05. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageEditorTheme.h" 9 | 10 | @implementation CLImageEditorTheme 11 | 12 | #pragma mark - singleton pattern 13 | 14 | static CLImageEditorTheme *_sharedInstance = nil; 15 | 16 | + (CLImageEditorTheme*)theme 17 | { 18 | static dispatch_once_t onceToken; 19 | dispatch_once(&onceToken, ^{ 20 | _sharedInstance = [[CLImageEditorTheme alloc] init]; 21 | }); 22 | return _sharedInstance; 23 | } 24 | 25 | + (id)allocWithZone:(NSZone *)zone 26 | { 27 | @synchronized(self) { 28 | if (_sharedInstance == nil) { 29 | _sharedInstance = [super allocWithZone:zone]; 30 | return _sharedInstance; 31 | } 32 | } 33 | return nil; 34 | } 35 | 36 | - (id)copyWithZone:(NSZone *)zone 37 | { 38 | return self; 39 | } 40 | 41 | - (id)init 42 | { 43 | self = [super init]; 44 | if (self) { 45 | self.bundleName = @"CLImageEditor"; 46 | self.backgroundColor = [UIColor whiteColor]; 47 | self.toolbarColor = [UIColor colorWithWhite:1 alpha:0.8]; 48 | self.toolIconColor = @"black"; 49 | self.toolbarTextColor = [UIColor blackColor]; 50 | self.toolbarSelectedButtonColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2]; 51 | self.toolbarTextFont = [UIFont systemFontOfSize:10]; 52 | self.statusBarStyle = UIStatusBarStyleDefault; 53 | } 54 | return self; 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/CLImageToolInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolInfo.h 3 | // 4 | // Created by sho yakushiji on 2013/11/26. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | #import 10 | @interface CLImageToolInfo : NSObject 11 | 12 | @property (nonatomic, readonly) NSString *toolName; 13 | @property (nonatomic, strong) NSString *title; 14 | @property (nonatomic, assign) BOOL available; 15 | @property (nonatomic, assign) CGFloat dockedNumber; 16 | @property (nonatomic, strong) NSString *iconImagePath; 17 | @property (nonatomic, readonly) UIImage *iconImage; 18 | @property (nonatomic, readonly) NSArray *subtools; 19 | @property (nonatomic, strong) NSMutableDictionary *optionalInfo; 20 | 21 | 22 | - (NSString*)toolTreeDescription; 23 | - (NSArray*)sortedSubtools; 24 | 25 | - (CLImageToolInfo*)subToolInfoWithToolName:(NSString*)toolName recursive:(BOOL)recursive; 26 | 27 | @end 28 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLAdjustmentTool/CLAdjustmentTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLAdjustmentTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLAdjustmentTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLBlurTool/CLBlurTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLBlurTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/19. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLBlurTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLClippingTool/CLClippingTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLClippingTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/18. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLClippingTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLDrawTool/CLDrawTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLDrawTool.h 3 | // 4 | // Created by sho yakushiji on 2014/06/20. 5 | // Copyright (c) 2014年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLDrawTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLBloomEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLBloomEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLBloomEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLGloomEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLGloomEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLGloomEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLHighlightShadowEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLHighlightShadowEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLHighlightShadowEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLHueEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLHueEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLHueEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLHueEffect.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLHueEffect.m 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLHueEffect.h" 9 | 10 | #import "UIView+Frame.h" 11 | 12 | @implementation CLHueEffect 13 | { 14 | UIView *_containerView; 15 | UISlider *_hueSlider; 16 | } 17 | 18 | #pragma mark- 19 | 20 | + (NSString*)defaultTitle 21 | { 22 | return [CLImageEditorTheme localizedString:@"CLHueEffect_DefaultTitle" withDefault:@"Hue"]; 23 | } 24 | 25 | + (BOOL)isAvailable 26 | { 27 | return ([UIDevice iosVersion] >= 5.0); 28 | } 29 | 30 | - (id)initWithSuperView:(UIView*)superview imageViewFrame:(CGRect)frame toolInfo:(CLImageToolInfo *)info 31 | { 32 | self = [super initWithSuperView:superview imageViewFrame:frame toolInfo:info]; 33 | if(self){ 34 | _containerView = [[UIView alloc] initWithFrame:superview.bounds]; 35 | _containerView.clipsToBounds = YES; 36 | [superview addSubview:_containerView]; 37 | 38 | [self setUserInterface]; 39 | } 40 | return self; 41 | } 42 | 43 | - (void)cleanup 44 | { 45 | [_containerView removeFromSuperview]; 46 | } 47 | 48 | - (UIImage*)applyEffect:(UIImage*)image 49 | { 50 | CIImage *ciImage = [[CIImage alloc] initWithImage:image]; 51 | CIFilter *filter = [CIFilter filterWithName:@"CIHueAdjust" keysAndValues:kCIInputImageKey, ciImage, nil]; 52 | 53 | //NSLog(@"%@", [filter attributes]); 54 | 55 | [filter setDefaults]; 56 | [filter setValue:[NSNumber numberWithFloat:_hueSlider.value] forKey:@"inputAngle"]; 57 | 58 | CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}]; 59 | CIImage *outputImage = [filter outputImage]; 60 | CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; 61 | 62 | UIImage *result = [UIImage imageWithCGImage:cgImage]; 63 | 64 | CGImageRelease(cgImage); 65 | 66 | return result; 67 | } 68 | 69 | #pragma mark- 70 | 71 | - (UISlider*)sliderWithValue:(CGFloat)value minimumValue:(CGFloat)min maximumValue:(CGFloat)max 72 | { 73 | UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(10, 0, 260, 30)]; 74 | 75 | UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 280, slider.height)]; 76 | container.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; 77 | container.layer.cornerRadius = slider.height/2; 78 | 79 | slider.continuous = YES; 80 | [slider addTarget:self action:@selector(sliderDidChange:) forControlEvents:UIControlEventValueChanged]; 81 | 82 | slider.maximumValue = max; 83 | slider.minimumValue = min; 84 | slider.value = value; 85 | 86 | [container addSubview:slider]; 87 | [_containerView addSubview:container]; 88 | 89 | return slider; 90 | } 91 | 92 | - (void)setUserInterface 93 | { 94 | _hueSlider = [self sliderWithValue:0 minimumValue:-M_PI maximumValue:M_PI]; 95 | _hueSlider.superview.center = CGPointMake(_containerView.width/2, _containerView.height-30); 96 | } 97 | 98 | - (void)sliderDidChange:(UISlider*)sender 99 | { 100 | [self.delegate effectParameterDidChange:self]; 101 | } 102 | 103 | @end 104 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLPixellateEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLPixellateEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLPixellateEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLPosterizeEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLPosterizeEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLPosterizeEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLPosterizeEffect.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLPosterizeEffect.m 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLPosterizeEffect.h" 9 | 10 | #import "UIView+Frame.h" 11 | 12 | @implementation CLPosterizeEffect 13 | { 14 | UIView *_containerView; 15 | UISlider *_levelSlider; 16 | } 17 | 18 | #pragma mark- 19 | 20 | + (NSString*)defaultTitle 21 | { 22 | return [CLImageEditorTheme localizedString:@"CLPosterizeEffect_DefaultTitle" withDefault:@"Posterize"]; 23 | } 24 | 25 | + (BOOL)isAvailable 26 | { 27 | return ([UIDevice iosVersion] >= 6.0); 28 | } 29 | 30 | - (id)initWithSuperView:(UIView*)superview imageViewFrame:(CGRect)frame toolInfo:(CLImageToolInfo *)info 31 | { 32 | self = [super initWithSuperView:superview imageViewFrame:frame toolInfo:info]; 33 | if(self){ 34 | _containerView = [[UIView alloc] initWithFrame:superview.bounds]; 35 | [superview addSubview:_containerView]; 36 | 37 | [self setUserInterface]; 38 | } 39 | return self; 40 | } 41 | 42 | - (void)cleanup 43 | { 44 | [_containerView removeFromSuperview]; 45 | } 46 | 47 | - (UIImage*)applyEffect:(UIImage*)image 48 | { 49 | CIImage *ciImage = [[CIImage alloc] initWithImage:image]; 50 | CIFilter *filter = [CIFilter filterWithName:@"CIColorPosterize" keysAndValues:kCIInputImageKey, ciImage, nil]; 51 | 52 | //NSLog(@"%@", [filter attributes]); 53 | 54 | [filter setDefaults]; 55 | [filter setValue:[NSNumber numberWithFloat:-_levelSlider.value] forKey:@"inputLevels"]; 56 | 57 | CIContext *context = [CIContext contextWithOptions:@{kCIContextUseSoftwareRenderer : @(NO)}]; 58 | CIImage *outputImage = [filter outputImage]; 59 | CGImageRef cgImage = [context createCGImage:outputImage fromRect:[outputImage extent]]; 60 | 61 | UIImage *result = [UIImage imageWithCGImage:cgImage]; 62 | 63 | CGImageRelease(cgImage); 64 | 65 | return result; 66 | } 67 | 68 | #pragma mark- 69 | 70 | - (UISlider*)sliderWithValue:(CGFloat)value minimumValue:(CGFloat)min maximumValue:(CGFloat)max 71 | { 72 | UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(10, 0, 260, 30)]; 73 | 74 | UIView *container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 280, slider.height)]; 75 | container.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3]; 76 | container.layer.cornerRadius = slider.height/2; 77 | 78 | slider.continuous = NO; 79 | [slider addTarget:self action:@selector(sliderDidChange:) forControlEvents:UIControlEventValueChanged]; 80 | 81 | slider.maximumValue = max; 82 | slider.minimumValue = min; 83 | slider.value = value; 84 | 85 | [container addSubview:slider]; 86 | [_containerView addSubview:container]; 87 | 88 | return slider; 89 | } 90 | 91 | - (void)setUserInterface 92 | { 93 | _levelSlider = [self sliderWithValue:-4 minimumValue:-10 maximumValue:-2.0]; 94 | _levelSlider.superview.center = CGPointMake(_containerView.width/2, _containerView.height-30); 95 | } 96 | 97 | - (void)sliderDidChange:(UISlider*)sender 98 | { 99 | [self.delegate effectParameterDidChange:self]; 100 | } 101 | 102 | @end 103 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffect/CLSpotEffect.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLSpotEffect.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @interface CLSpotEffect : CLEffectBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffectBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLEffectBase.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "../ToolSettings/CLImageToolSettings.h" 11 | 12 | 13 | static const CGFloat kCLEffectToolAnimationDuration = 0.2; 14 | 15 | 16 | @protocol CLEffectDelegate; 17 | 18 | @interface CLEffectBase : NSObject 19 | 20 | @property (nonatomic, weak) id delegate; 21 | @property (nonatomic, weak) CLImageToolInfo *toolInfo; 22 | 23 | 24 | - (id)initWithSuperView:(UIView*)superview imageViewFrame:(CGRect)frame toolInfo:(CLImageToolInfo*)info; 25 | - (void)cleanup; 26 | 27 | - (BOOL)needsThumbnailPreview; 28 | - (UIImage*)applyEffect:(UIImage*)image; 29 | 30 | @end 31 | 32 | 33 | 34 | @protocol CLEffectDelegate 35 | @required 36 | - (void)effectParameterDidChange:(CLEffectBase*)effect; 37 | @end 38 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffectBase.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLEffectBase.m 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLEffectBase.h" 9 | 10 | @implementation CLEffectBase 11 | 12 | #pragma mark- 13 | 14 | + (NSString*)defaultIconImagePath 15 | { 16 | return [NSString stringWithFormat:@"%@/CLEffectTool/%@.png", CLImageEditorTheme.bundle.bundlePath, NSStringFromClass([self class])]; 17 | } 18 | 19 | + (CGFloat)defaultDockedNumber 20 | { 21 | // Effect tools are sorted according to the dockedNumber in tool bar. 22 | // Override point for tool bar customization 23 | NSArray *effects = @[ 24 | @"CLEffectBase", 25 | @"CLSpotEffect", 26 | @"CLHueEffect", 27 | @"CLHighlightShadowEffect", 28 | @"CLBloomEffect", 29 | @"CLGloomEffect", 30 | @"CLPosterizeEffect", 31 | @"CLPixellateEffect", 32 | ]; 33 | return [effects indexOfObject:NSStringFromClass(self)]; 34 | } 35 | 36 | + (NSArray*)subtools 37 | { 38 | return nil; 39 | } 40 | 41 | + (NSString*)defaultTitle 42 | { 43 | return [CLImageEditorTheme localizedString:@"CLEffectBase_DefaultTitle" withDefault:@"None"]; 44 | } 45 | 46 | + (BOOL)isAvailable 47 | { 48 | return YES; 49 | } 50 | 51 | + (NSDictionary*)optionalInfo 52 | { 53 | return nil; 54 | } 55 | 56 | #pragma mark- 57 | 58 | - (id)initWithSuperView:(UIView*)superview imageViewFrame:(CGRect)frame toolInfo:(CLImageToolInfo*)info 59 | { 60 | self = [super init]; 61 | if(self){ 62 | self.toolInfo = info; 63 | } 64 | return self; 65 | } 66 | 67 | - (void)cleanup 68 | { 69 | 70 | } 71 | 72 | - (BOOL)needsThumbnailPreview 73 | { 74 | return YES; 75 | } 76 | 77 | - (UIImage*)applyEffect:(UIImage*)image 78 | { 79 | return image; 80 | } 81 | 82 | @end 83 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLEffectTool/CLEffectTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLEffectTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/23. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | #import "CLEffectBase.h" 11 | 12 | @interface CLEffectTool : CLImageToolBase 13 | 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLFilterTool/CLFilterBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLFilterBase.h 3 | // 4 | // Created by sho yakushiji on 2013/11/26. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "../ToolSettings/CLImageToolSettings.h" 11 | 12 | @protocol CLFilterBaseProtocol 13 | 14 | @required 15 | + (UIImage*)applyFilter:(UIImage*)image; 16 | 17 | @end 18 | 19 | 20 | @interface CLFilterBase : NSObject 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLFilterTool/CLFilterTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLFilterTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/19. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLFilterTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLImageToolBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolBase.h 3 | // 4 | // Created by sho yakushiji on 2013/10/17. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "../ViewController/_CLImageEditorViewController.h" 11 | #import "ToolSettings/CLImageToolSettings.h" 12 | 13 | 14 | static const CGFloat kCLImageToolAnimationDuration = 0.3; 15 | static const CGFloat kCLImageToolFadeoutDuration = 0.2; 16 | 17 | 18 | 19 | @interface CLImageToolBase : NSObject 20 | { 21 | 22 | } 23 | @property (nonatomic, weak) _CLImageEditorViewController *editor; 24 | @property (nonatomic, weak) CLImageToolInfo *toolInfo; 25 | 26 | - (id)initWithImageEditor:(_CLImageEditorViewController*)editor withToolInfo:(CLImageToolInfo*)info; 27 | 28 | - (void)setup; 29 | - (void)cleanup; 30 | - (void)executeWithCompletionBlock:(void(^)(UIImage *image, NSError *error, NSDictionary *userInfo))completionBlock; 31 | 32 | - (UIImage*)imageForKey:(NSString*)key defaultImageName:(NSString*)defaultImageName; 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLImageToolBase.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolBase.m 3 | // 4 | // Created by sho yakushiji on 2013/10/17. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @implementation CLImageToolBase 11 | 12 | - (id)initWithImageEditor:(_CLImageEditorViewController*)editor withToolInfo:(CLImageToolInfo*)info 13 | { 14 | self = [super init]; 15 | if(self){ 16 | self.editor = editor; 17 | self.toolInfo = info; 18 | } 19 | return self; 20 | } 21 | 22 | + (NSString*)defaultIconImagePath 23 | { 24 | CLImageEditorTheme *theme = [CLImageEditorTheme theme]; 25 | return [NSString stringWithFormat:@"%@/%@/%@/icon.png", CLImageEditorTheme.bundle.bundlePath, NSStringFromClass([self class]), theme.toolIconColor]; 26 | } 27 | 28 | + (CGFloat)defaultDockedNumber 29 | { 30 | // Image tools are sorted according to the dockedNumber in tool bar. 31 | // Override point for tool bar customization 32 | NSArray *tools = @[ 33 | @"CLFilterTool", 34 | @"CLAdjustmentTool", 35 | @"CLEffectTool", 36 | @"CLBlurTool", 37 | @"CLRotateTool", 38 | @"CLClippingTool", 39 | @"CLToneCurveTool", 40 | ]; 41 | return [tools indexOfObject:NSStringFromClass(self)]; 42 | } 43 | 44 | + (NSArray*)subtools 45 | { 46 | return nil; 47 | } 48 | 49 | + (NSString*)defaultTitle 50 | { 51 | return @"DefaultTitle"; 52 | } 53 | 54 | + (BOOL)isAvailable 55 | { 56 | return NO; 57 | } 58 | 59 | + (NSDictionary*)optionalInfo 60 | { 61 | return nil; 62 | } 63 | 64 | #pragma mark- 65 | 66 | - (void)setup 67 | { 68 | 69 | } 70 | 71 | - (void)cleanup 72 | { 73 | 74 | } 75 | 76 | - (void)executeWithCompletionBlock:(void(^)(UIImage *image, NSError *error, NSDictionary *userInfo))completionBlock 77 | { 78 | completionBlock(self.editor.imageView.image, nil, nil); 79 | } 80 | 81 | - (UIImage*)imageForKey:(NSString*)key defaultImageName:(NSString*)defaultImageName 82 | { 83 | NSString *iconName = self.toolInfo.optionalInfo[key]; 84 | 85 | if(iconName.length>0){ 86 | return [UIImage imageNamed:iconName]; 87 | } 88 | else{ 89 | return [CLImageEditorTheme imageNamed:[self class] image:defaultImageName]; 90 | } 91 | } 92 | 93 | @end 94 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLRotateTool/CLRotateTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLRotateTool.h 3 | // 4 | // Created by sho yakushiji on 2013/11/08. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLRotateTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/CLToneCurveTool/CLToneCurveTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLToneCurveTool.h 3 | // 4 | // Created by sho yakushiji on 2013/10/24. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLToneCurveTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLCircleView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLCircleView.h 3 | // 4 | // Created by sho yakushiji on 2013/12/11. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface CLCircleView : UIView 11 | 12 | @property (nonatomic, strong) UIColor *color; 13 | @property (nonatomic, assign) CGFloat radius; 14 | 15 | @property (nonatomic, strong) UIColor *borderColor; 16 | @property (nonatomic, assign) CGFloat borderWidth; 17 | 18 | @end 19 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLCircleView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLCircleView.m 3 | // 4 | // Created by sho yakushiji on 2013/12/11. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLCircleView.h" 9 | 10 | @implementation CLCircleView 11 | 12 | - (id)initWithFrame:(CGRect)frame 13 | { 14 | self = [super initWithFrame:frame]; 15 | if (self) { 16 | self.backgroundColor = [UIColor clearColor]; 17 | 18 | self.color = [UIColor blackColor]; 19 | self.radius = 1; 20 | 21 | self.borderColor = [UIColor clearColor]; 22 | self.borderWidth = 0; 23 | } 24 | return self; 25 | } 26 | 27 | - (void)drawRect:(CGRect)rect 28 | { 29 | CGContextRef context = UIGraphicsGetCurrentContext(); 30 | 31 | CGRect rct = self.bounds; 32 | rct.origin.x = 0.5 * (rct.size.width - self.radius * rct.size.width); 33 | rct.origin.y = 0.5 * (rct.size.height - self.radius * rct.size.height); 34 | rct.size.width = self.radius * rct.size.width; 35 | rct.size.height = self.radius * rct.size.height; 36 | 37 | CGContextSetFillColorWithColor(context, self.color.CGColor); 38 | CGContextFillEllipseInRect(context, rct); 39 | 40 | CGContextSetStrokeColorWithColor(context, self.borderColor.CGColor); 41 | CGContextSetLineWidth(context, self.borderWidth); 42 | CGContextStrokeEllipseInRect(context, rct); 43 | } 44 | 45 | - (void)setColor:(UIColor *)color 46 | { 47 | if(color != _color){ 48 | _color = color; 49 | [self setNeedsDisplay]; 50 | } 51 | } 52 | 53 | - (void)setBorderColor:(UIColor *)borderColor 54 | { 55 | if(borderColor != _borderColor){ 56 | _borderColor = borderColor; 57 | [self setNeedsDisplay]; 58 | } 59 | } 60 | 61 | - (void)setBorderWidth:(CGFloat)borderWidth 62 | { 63 | if(borderWidth != _borderWidth){ 64 | _borderWidth = borderWidth; 65 | [self setNeedsDisplay]; 66 | } 67 | } 68 | 69 | @end 70 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLColorPickerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLColorPickerView.h 3 | // 4 | // Created by sho yakushiji on 2013/12/13. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLColorPickerViewDelegate; 11 | 12 | @interface CLColorPickerView : UIView 13 | 14 | @property (nonatomic, weak) id delegate; 15 | @property (nonatomic, strong) UIColor *color; 16 | 17 | @property (nonatomic, readonly) CGFloat hueComponent; 18 | @property (nonatomic, readonly) CGFloat saturationComponent; 19 | @property (nonatomic, readonly) CGFloat brightnessComponent; 20 | @property (nonatomic, readonly) CGFloat alphaComponent; 21 | 22 | - (void)setColorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha; 23 | 24 | @end 25 | 26 | 27 | 28 | 29 | @protocol CLColorPickerViewDelegate 30 | @optional 31 | - (void)colorPickerView:(CLColorPickerView*)picker colorDidChange:(UIColor*)color; 32 | 33 | @end -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageEditorTheme+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditorTheme+Private.h 3 | // 4 | // Created by sho yakushiji on 2013/12/07. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | #import 8 | #import "CLImageEditorTheme.h" 9 | 10 | #import "CLToolbarMenuItem.h" 11 | 12 | @interface CLImageEditorTheme (Private) 13 | 14 | + (NSString*)bundleName; 15 | + (NSBundle*)bundle; 16 | + (UIImage*)imageNamed:(Class)path image:(NSString*)image; 17 | + (NSString*)localizedString:(NSString*)key withDefault:defaultValue; 18 | 19 | + (UIColor*)backgroundColor; 20 | + (UIColor*)toolbarColor; 21 | + (UIColor*)toolbarTextColor; 22 | + (UIColor*)toolbarSelectedButtonColor; 23 | 24 | + (UIFont*)toolbarTextFont; 25 | 26 | + (UIActivityIndicatorView*)indicatorView; 27 | + (CLToolbarMenuItem*)menuItemWithFrame:(CGRect)frame target:(id)target action:(SEL)action toolInfo:(CLImageToolInfo*)toolInfo; 28 | 29 | @end 30 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageEditorTheme+Private.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditorTheme+Private.m 3 | // 4 | // Created by sho yakushiji on 2013/12/07. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageEditorTheme+Private.h" 9 | 10 | #import "CLImageEditor.h" 11 | #import "UIImage+Utility.h" 12 | 13 | @implementation CLImageEditorTheme (Private) 14 | 15 | #pragma mark- instance methods 16 | 17 | - (NSBundle*)bundle 18 | { 19 | NSString *path = [[NSBundle mainBundle] pathForResource:self.bundleName ofType:@"bundle"]; 20 | if(path){ 21 | return [NSBundle bundleWithPath:path]; 22 | } 23 | 24 | path = [[NSBundle bundleForClass:self.class] pathForResource:self.bundleName ofType:@"bundle"]; 25 | if(path){ 26 | return [NSBundle bundleWithPath:path]; 27 | } 28 | return nil; 29 | } 30 | 31 | #pragma mark- class methods 32 | 33 | + (NSString*)bundleName 34 | { 35 | return self.theme.bundleName; 36 | } 37 | 38 | + (NSBundle*)bundle 39 | { 40 | return self.theme.bundle; 41 | } 42 | 43 | + (UIImage*)imageNamed:(Class)path image:(NSString*)image 44 | { 45 | CLImageEditorTheme *theme = [CLImageEditorTheme theme]; 46 | NSString *imagePath = [self.bundle.bundlePath stringByAppendingString:[NSString stringWithFormat:@"/%@/%@/%@", path, theme.toolIconColor, image]]; 47 | 48 | return [UIImage fastImageWithContentsOfFile:imagePath]; 49 | } 50 | 51 | + (NSString*)localizedString:(NSString*)key withDefault:defaultValue 52 | { 53 | NSString *str = NSLocalizedString(key, @""); 54 | if(![str isEqualToString:key]){ return str; } 55 | return NSLocalizedStringWithDefaultValue(key, nil, [CLImageEditorTheme bundle], defaultValue, @""); 56 | } 57 | 58 | #pragma mark color settings 59 | 60 | + (UIColor*)backgroundColor 61 | { 62 | return self.theme.backgroundColor; 63 | } 64 | 65 | + (UIColor*)toolbarColor 66 | { 67 | return self.theme.toolbarColor; 68 | } 69 | 70 | + (UIColor*)toolbarTextColor 71 | { 72 | return self.theme.toolbarTextColor; 73 | } 74 | 75 | + (UIColor*)toolbarSelectedButtonColor 76 | { 77 | return self.theme.toolbarSelectedButtonColor; 78 | } 79 | 80 | #pragma mark font settings 81 | 82 | + (UIFont*)toolbarTextFont 83 | { 84 | return self.theme.toolbarTextFont; 85 | } 86 | 87 | #pragma mark UI components 88 | 89 | + (UIActivityIndicatorView*)indicatorView 90 | { 91 | if([self.theme.delegate respondsToSelector:@selector(imageEditorThemeActivityIndicatorView)]){ 92 | return [self.theme.delegate imageEditorThemeActivityIndicatorView]; 93 | } 94 | 95 | // default indicator view 96 | UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)]; 97 | indicatorView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6]; 98 | indicatorView.layer.cornerRadius = 5; 99 | indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; 100 | 101 | return indicatorView; 102 | } 103 | 104 | + (CLToolbarMenuItem*)menuItemWithFrame:(CGRect)frame target:(id)target action:(SEL)action toolInfo:(CLImageToolInfo*)toolInfo; 105 | { 106 | return [[CLToolbarMenuItem alloc] initWithFrame:frame target:target action:action toolInfo:toolInfo]; 107 | } 108 | 109 | @end 110 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageToolInfo+Private.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolInfo+Private.h 3 | // 4 | // Created by sho yakushiji on 2013/12/07. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolInfo.h" 9 | 10 | @protocol CLImageToolProtocol; 11 | 12 | @interface CLImageToolInfo (Private) 13 | 14 | + (CLImageToolInfo*)toolInfoForToolClass:(Class)toolClass; 15 | + (NSArray*)toolsWithToolClass:(Class)toolClass; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageToolInfo+Private.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolInfo+Private.m 3 | // 4 | // Created by sho yakushiji on 2013/12/07. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolInfo+Private.h" 9 | 10 | #import "CLImageToolProtocol.h" 11 | #import "CLClassList.h" 12 | 13 | 14 | @interface CLImageToolInfo() 15 | @property (nonatomic, strong) NSString *toolName; 16 | @property (nonatomic, strong) NSArray *subtools; 17 | @end 18 | 19 | @implementation CLImageToolInfo (Private) 20 | 21 | + (CLImageToolInfo*)toolInfoForToolClass:(Class)toolClass; 22 | { 23 | if([(Class)toolClass conformsToProtocol:@protocol(CLImageToolProtocol)] && [toolClass isAvailable]){ 24 | CLImageToolInfo *info = [CLImageToolInfo new]; 25 | info.toolName = NSStringFromClass(toolClass); 26 | info.title = [toolClass defaultTitle]; 27 | info.available = YES; 28 | info.dockedNumber = [toolClass defaultDockedNumber]; 29 | info.iconImagePath = [toolClass defaultIconImagePath]; 30 | info.subtools = [toolClass subtools]; 31 | info.optionalInfo = [[toolClass optionalInfo] mutableCopy]; 32 | 33 | return info; 34 | } 35 | return nil; 36 | } 37 | 38 | + (NSArray*)toolsWithToolClass:(Class)toolClass 39 | { 40 | NSMutableArray *array = [NSMutableArray array]; 41 | 42 | CLImageToolInfo *info = [CLImageToolInfo toolInfoForToolClass:toolClass]; 43 | if(info){ 44 | [array addObject:info]; 45 | } 46 | 47 | NSArray *list = [CLClassList subclassesOfClass:toolClass]; 48 | for(Class subtool in list){ 49 | info = [CLImageToolInfo toolInfoForToolClass:subtool]; 50 | if(info){ 51 | [array addObject:info]; 52 | } 53 | } 54 | return [array copy]; 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageToolProtocol.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolProtocol.h 3 | // 4 | // Created by sho yakushiji on 2013/11/26. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLImageToolProtocol 11 | 12 | @required 13 | + (NSString*)defaultIconImagePath; 14 | + (CGFloat)defaultDockedNumber; 15 | + (NSString*)defaultTitle; 16 | + (BOOL)isAvailable; 17 | + (NSArray*)subtools; 18 | + (NSDictionary*)optionalInfo; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLImageToolSettings.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageToolSettings.h 3 | // 4 | // Created by sho yakushiji on 2013/12/07. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "../../Utils/UIDevice+SystemVersion.h" 9 | #import "../../Utils/UIView+Frame.h" 10 | #import "../../Utils/UIImage+Utility.h" 11 | 12 | #import "CLImageToolProtocol.h" 13 | #import "CLImageEditorTheme+Private.h" 14 | #import "CLImageToolInfo+Private.h" 15 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLToolbarMenuItem.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLToolbarMenuItem.h 3 | // 4 | // Created by sho yakushiji on 2013/12/11. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "UIView+CLImageToolInfo.h" 11 | 12 | @interface CLToolbarMenuItem : UIView 13 | { 14 | UIImageView *_iconView; 15 | UILabel *_titleLabel; 16 | } 17 | 18 | @property (nonatomic, assign) NSString *title; 19 | @property (nonatomic, assign) UIImage *iconImage; 20 | @property (nonatomic, assign) BOOL selected; 21 | @property (nonatomic, readonly) UIImageView *iconView; 22 | 23 | - (id)initWithFrame:(CGRect)frame target:(id)target action:(SEL)action toolInfo:(CLImageToolInfo*)toolInfo; 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/CLToolbarMenuItem.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLToolbarMenuItem.m 3 | // 4 | // Created by sho yakushiji on 2013/12/11. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLToolbarMenuItem.h" 9 | 10 | #import "CLImageEditorTheme+Private.h" 11 | #import "UIView+Frame.h" 12 | 13 | @implementation CLToolbarMenuItem 14 | { 15 | 16 | } 17 | 18 | - (id)initWithFrame:(CGRect)frame 19 | { 20 | self = [super initWithFrame:frame]; 21 | if (self) { 22 | CGFloat W = frame.size.width; 23 | 24 | _iconView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, W-20, W-20)]; 25 | _iconView.clipsToBounds = YES; 26 | _iconView.layer.cornerRadius = 5; 27 | _iconView.contentMode = UIViewContentModeScaleAspectFill; 28 | [self addSubview:_iconView]; 29 | 30 | _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, _iconView.bottom + 5, W, 15)]; 31 | _titleLabel.backgroundColor = [UIColor clearColor]; 32 | _titleLabel.textColor = [CLImageEditorTheme toolbarTextColor]; 33 | _titleLabel.font = [CLImageEditorTheme toolbarTextFont]; 34 | _titleLabel.textAlignment = NSTextAlignmentCenter; 35 | [self addSubview:_titleLabel]; 36 | } 37 | return self; 38 | } 39 | 40 | - (id)initWithFrame:(CGRect)frame target:(id)target action:(SEL)action toolInfo:(CLImageToolInfo*)toolInfo 41 | { 42 | self = [self initWithFrame:frame]; 43 | if(self){ 44 | UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:target action:action]; 45 | [self addGestureRecognizer:gesture]; 46 | 47 | self.toolInfo = toolInfo; 48 | } 49 | return self; 50 | } 51 | 52 | - (NSString*)title 53 | { 54 | return _titleLabel.text; 55 | } 56 | 57 | - (void)setTitle:(NSString *)title 58 | { 59 | _titleLabel.text = title; 60 | } 61 | 62 | - (UIImageView*)iconView 63 | { 64 | return _iconView; 65 | } 66 | 67 | - (UIImage*)iconImage 68 | { 69 | return _iconView.image; 70 | } 71 | 72 | - (void)setIconImage:(UIImage *)iconImage 73 | { 74 | _iconView.image = iconImage; 75 | } 76 | 77 | - (void)setUserInteractionEnabled:(BOOL)userInteractionEnabled 78 | { 79 | [super setUserInteractionEnabled:userInteractionEnabled]; 80 | self.alpha = (userInteractionEnabled) ? 1 : 0.3; 81 | } 82 | 83 | - (void)setToolInfo:(CLImageToolInfo *)toolInfo 84 | { 85 | [super setToolInfo:toolInfo]; 86 | 87 | self.title = self.toolInfo.title; 88 | if(self.toolInfo.iconImagePath){ 89 | self.iconImage = self.toolInfo.iconImage; 90 | } 91 | else{ 92 | self.iconImage = nil; 93 | } 94 | } 95 | 96 | - (void)setSelected:(BOOL)selected 97 | { 98 | if(selected != _selected){ 99 | _selected = selected; 100 | if(selected){ 101 | self.backgroundColor = [CLImageEditorTheme toolbarSelectedButtonColor]; 102 | } 103 | else{ 104 | self.backgroundColor = [UIColor clearColor]; 105 | } 106 | } 107 | } 108 | 109 | @end 110 | 111 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/UIView+CLImageToolInfo.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CLImageToolInfo.h 3 | // 4 | // Created by sho yakushiji on 2013/11/26. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | #import "CLImageToolInfo.h" 11 | 12 | @interface UIView (CLImageToolInfo) 13 | 14 | @property (nonatomic, strong) CLImageToolInfo *toolInfo; 15 | @property (nonatomic, strong) NSDictionary *userInfo; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ImageTools/ToolSettings/UIView+CLImageToolInfo.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+CLImageToolInfo.m 3 | // 4 | // Created by sho yakushiji on 2013/11/26. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "UIView+CLImageToolInfo.h" 9 | 10 | #import 11 | 12 | @implementation UIView (CLImageToolInfo) 13 | 14 | - (CLImageToolInfo*)toolInfo 15 | { 16 | return objc_getAssociatedObject(self, @"UIView+CLImageToolInfo_toolInfo"); 17 | } 18 | 19 | - (void)setToolInfo:(CLImageToolInfo *)toolInfo 20 | { 21 | objc_setAssociatedObject(self, @"UIView+CLImageToolInfo_toolInfo", toolInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 22 | } 23 | 24 | - (NSDictionary*)userInfo 25 | { 26 | return objc_getAssociatedObject(self, @"UIView+CLImageToolInfo_userInfo"); 27 | } 28 | 29 | - (void)setUserInfo:(NSDictionary *)userInfo 30 | { 31 | objc_setAssociatedObject(self, @"UIView+CLImageToolInfo_userInfo", userInfo, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/CLClassList.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLClassList.h 3 | // 4 | // Created by sho yakushiji on 2013/11/14. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // reference: http://www.cocoawithlove.com/2010/01/getting-subclasses-of-objective-c-class.html 7 | // 8 | 9 | #import 10 | 11 | @interface CLClassList : NSObject 12 | 13 | + (NSArray*)subclassesOfClass:(Class)parentClass; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/CLClassList.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLClassList.m 3 | // 4 | // Created by sho yakushiji on 2013/11/14. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // reference: http://www.cocoawithlove.com/2010/01/getting-subclasses-of-objective-c-class.html 7 | // 8 | 9 | #import "CLClassList.h" 10 | 11 | #import 12 | 13 | @implementation CLClassList 14 | 15 | + (NSArray*)subclassesOfClass:(Class)parentClass 16 | { 17 | int numClasses = objc_getClassList(NULL, 0); 18 | Class *classes = (Class*)malloc(sizeof(Class) * numClasses); 19 | 20 | numClasses = objc_getClassList(classes, numClasses); 21 | 22 | NSMutableArray *result = [NSMutableArray array]; 23 | for(NSInteger i=0; i 10 | #import 11 | @interface CLSplineInterpolator : NSObject 12 | 13 | - (id)initWithPoints:(NSArray*)points; // points: array of CIVector 14 | - (CIVector*)interpolatedPoint:(CGFloat)t; // {t | 0 ≤ t ≤ 1} 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/UIDevice+SystemVersion.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+SystemVersion.h 3 | // 4 | // Created by sho yakushiji on 2013/11/06. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIDevice (SystemVersion) 11 | 12 | + (CGFloat)iosVersion; 13 | 14 | @end 15 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/UIDevice+SystemVersion.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIDevice+SystemVersion.m 3 | // 4 | // Created by sho yakushiji on 2013/11/06. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "UIDevice+SystemVersion.h" 9 | 10 | @implementation UIDevice (SystemVersion) 11 | 12 | + (CGFloat)iosVersion 13 | { 14 | return [[[UIDevice currentDevice] systemVersion] floatValue]; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/UIImage+Utility.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIImage+Utility.h 3 | // 4 | // Created by sho yakushiji on 2013/05/17. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIImage (Utility) 11 | 12 | + (UIImage*)fastImageWithData:(NSData*)data; 13 | + (UIImage*)fastImageWithContentsOfFile:(NSString*)path; 14 | 15 | - (UIImage*)deepCopy; 16 | 17 | - (UIImage*)grayScaleImage; 18 | 19 | - (UIImage*)resize:(CGSize)size; 20 | - (UIImage*)aspectFit:(CGSize)size; 21 | - (UIImage*)aspectFill:(CGSize)size; 22 | - (UIImage*)aspectFill:(CGSize)size offset:(CGFloat)offset; 23 | 24 | - (UIImage*)crop:(CGRect)rect; 25 | 26 | - (UIImage*)maskedImage:(UIImage*)maskImage; 27 | 28 | - (UIImage*)gaussBlur:(CGFloat)blurLevel; // {blurLevel | 0 ≤ t ≤ 1} 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/UIView+Frame.h: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Frame.h 3 | // 4 | // Created by sho yakushiji on 2013/05/15. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface UIView (Frame) 11 | 12 | @property (nonatomic) CGFloat top; 13 | @property (nonatomic) CGFloat bottom; 14 | @property (nonatomic) CGFloat right; 15 | @property (nonatomic) CGFloat left; 16 | 17 | @property (nonatomic) CGFloat width; 18 | @property (nonatomic) CGFloat height; 19 | 20 | @end 21 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/Utils/UIView+Frame.m: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Frame.m 3 | // 4 | // Created by sho yakushiji on 2013/05/15. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "UIView+Frame.h" 9 | 10 | @implementation UIView (Frame) 11 | 12 | - (CGFloat)top 13 | { 14 | return self.frame.origin.y; 15 | } 16 | 17 | - (void)setTop:(CGFloat)y 18 | { 19 | CGRect frame = self.frame; 20 | frame.origin.y = y; 21 | self.frame = frame; 22 | } 23 | 24 | - (CGFloat)right 25 | { 26 | return self.frame.origin.x + self.frame.size.width; 27 | } 28 | 29 | - (void)setRight:(CGFloat)right 30 | { 31 | CGRect frame = self.frame; 32 | frame.origin.x = right - self.frame.size.width; 33 | self.frame = frame; 34 | } 35 | 36 | - (CGFloat)bottom 37 | { 38 | return self.frame.origin.y + self.frame.size.height; 39 | } 40 | 41 | - (void)setBottom:(CGFloat)bottom 42 | { 43 | CGRect frame = self.frame; 44 | frame.origin.y = bottom - self.frame.size.height; 45 | self.frame = frame; 46 | } 47 | 48 | - (CGFloat)left 49 | { 50 | return self.frame.origin.x; 51 | } 52 | 53 | - (void)setLeft:(CGFloat)x 54 | { 55 | CGRect frame = self.frame; 56 | frame.origin.x = x; 57 | self.frame = frame; 58 | } 59 | 60 | - (CGFloat)width 61 | { 62 | return self.frame.size.width; 63 | } 64 | 65 | - (void)setWidth:(CGFloat)width 66 | { 67 | CGRect frame = self.frame; 68 | frame.size.width = width; 69 | self.frame = frame; 70 | } 71 | 72 | - (CGFloat)height 73 | { 74 | return self.frame.size.height; 75 | } 76 | 77 | - (void)setHeight:(CGFloat)height 78 | { 79 | CGRect frame = self.frame; 80 | frame.size.height = height; 81 | self.frame = frame; 82 | } 83 | 84 | @end 85 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/CLImageEditor/ViewController/_CLImageEditorViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // _CLImageEditorViewController.h 3 | // 4 | // Created by sho yakushiji on 2013/11/05. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageEditor.h" 9 | 10 | @interface _CLImageEditorViewController : CLImageEditor 11 | 12 | { 13 | IBOutlet __weak UINavigationBar *_navigationBar; 14 | IBOutlet __weak UIScrollView *_scrollView; 15 | } 16 | @property (nonatomic, strong) UIImageView *imageView; 17 | @property (nonatomic, weak) IBOutlet UIScrollView *menuView; 18 | @property (nonatomic, readonly) UIScrollView *scrollView; 19 | 20 | - (IBAction)pushedCloseBtn:(id)sender; 21 | - (IBAction)pushedFinishBtn:(id)sender; 22 | 23 | 24 | - (id)initWithImage:(UIImage*)image; 25 | 26 | 27 | - (void)fixZoomScaleWithAnimated:(BOOL)animated; 28 | - (void)resetZoomScaleWithAnimated:(BOOL)animated; 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Sho Yakushiji, CALACULU Inc. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLFontPickerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLFontPickerView.h 3 | // 4 | // Created by sho yakushiji on 2013/12/14. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLFontPickerViewDelegate; 11 | 12 | @interface CLFontPickerView : UIView 13 | 14 | @property (nonatomic, weak) id delegate; 15 | @property (nonatomic, strong) NSArray *fontList; 16 | @property (nonatomic, strong) NSArray *fontSizes; 17 | @property (nonatomic, strong) UIFont *font; 18 | @property (nonatomic, strong) NSString *text; 19 | @property (nonatomic, assign) BOOL sizeComponentHidden; 20 | @property (nonatomic, strong) UIColor *foregroundColor; 21 | @property (nonatomic, strong) UIColor *textColor; 22 | 23 | @end 24 | 25 | 26 | @protocol CLFontPickerViewDelegate 27 | @optional 28 | - (void)fontPickerView:(CLFontPickerView*)pickerView didSelectFont:(UIFont*)font; 29 | 30 | @end -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLPickerDrum.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLPickerDrum.h 3 | // 4 | // Created by sho yakushiji on 2013/12/15. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLPickerDrumDataSource; 11 | @protocol CLPickerDrumDelegate; 12 | 13 | 14 | @interface CLPickerDrum : UIView 15 | 16 | @property (nonatomic, weak) id dataSource; 17 | @property (nonatomic, weak) id delegate; 18 | @property (nonatomic, strong) UIColor *foregroundColor; 19 | 20 | - (void)reload; 21 | - (void)selectRow:(NSInteger)row animated:(BOOL)animated; 22 | - (NSInteger)selectedRow; 23 | 24 | @end 25 | 26 | 27 | 28 | 29 | @protocol CLPickerDrumDataSource 30 | @required 31 | - (NSInteger)numberOfRowsInPickerDrum:(CLPickerDrum *)pickerDrum; 32 | 33 | @end 34 | 35 | 36 | @protocol CLPickerDrumDelegate 37 | @optional 38 | - (CGFloat)rowHeightInPickerDrum:(CLPickerDrum *)pickerDrum; 39 | - (UIView*)pickerDrum:(CLPickerDrum *)pickerDrum viewForRow:(NSInteger)row reusingView:(UIView *)view; 40 | - (NSString *)pickerDrum:(CLPickerDrum *)pickerDrum titleForRow:(NSInteger)row; 41 | - (void)pickerDrum:(CLPickerDrum *)pickerDrum didSelectRow:(NSInteger)row; 42 | 43 | @end 44 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLPickerView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLPickerView.h 3 | // 4 | // Created by sho yakushiji on 2013/12/15. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLPickerViewDataSource; 11 | @protocol CLPickerViewDelegate; 12 | 13 | 14 | @interface CLPickerView : UIView 15 | 16 | @property (nonatomic, weak) id dataSource; 17 | @property (nonatomic, weak) id delegate; 18 | @property (nonatomic, strong) UIColor *foregroundColor; 19 | 20 | - (void)reloadComponent:(NSInteger)component; 21 | - (void)selectRow:(NSInteger)row inComponent:(NSInteger)component animated:(BOOL)animated; 22 | - (NSInteger)selectedRowInComponent:(NSInteger)component; 23 | 24 | @end 25 | 26 | 27 | 28 | 29 | 30 | @protocol CLPickerViewDataSource 31 | @required 32 | - (NSInteger)numberOfComponentsInPickerView:(CLPickerView *)pickerView; 33 | - (NSInteger)pickerView:(CLPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component; 34 | 35 | @end 36 | 37 | 38 | @protocol CLPickerViewDelegate 39 | @optional 40 | - (CGFloat)pickerView:(CLPickerView *)pickerView widthForComponent:(NSInteger)component; 41 | - (NSString *)pickerView:(CLPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component; 42 | - (UIView *)pickerView:(CLPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view; 43 | - (CGFloat)pickerView:(CLPickerView *)pickerView rowHeightForComponent:(NSInteger)component; 44 | 45 | - (void)pickerView:(CLPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component; 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLTextLabel.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLTextLabel.h 3 | // 4 | // Created by sho yakushiji on 2013/12/16. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @interface CLTextLabel : UILabel 11 | 12 | @property (nonatomic, strong) UIColor *outlineColor; 13 | @property (nonatomic, assign) CGFloat outlineWidth; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLTextLabel.m: -------------------------------------------------------------------------------- 1 | // 2 | // CLTextLabel.m 3 | // 4 | // Created by sho yakushiji on 2013/12/16. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLTextLabel.h" 9 | 10 | @implementation CLTextLabel 11 | 12 | - (id)initWithFrame:(CGRect)frame 13 | { 14 | self = [super initWithFrame:frame]; 15 | if (self) { 16 | // Initialization code 17 | } 18 | return self; 19 | } 20 | 21 | - (void)setOutlineColor:(UIColor *)outlineColor 22 | { 23 | if(outlineColor != _outlineColor){ 24 | _outlineColor = outlineColor; 25 | [self setNeedsDisplay]; 26 | } 27 | } 28 | 29 | - (void)setOutlineWidth:(CGFloat)outlineWidth 30 | { 31 | if(outlineWidth != _outlineWidth){ 32 | _outlineWidth = outlineWidth; 33 | [self setNeedsDisplay]; 34 | } 35 | } 36 | 37 | - (void)drawTextInRect:(CGRect)rect 38 | { 39 | CGSize shadowOffset = self.shadowOffset; 40 | UIColor *txtColor = self.textColor; 41 | 42 | CGFloat outlineSize = self.outlineWidth * self.font.pointSize * 0.3; 43 | 44 | CGContextRef contextRef = UIGraphicsGetCurrentContext(); 45 | CGContextSetLineWidth(contextRef, outlineSize); 46 | CGContextSetLineJoin(contextRef, kCGLineJoinRound); 47 | 48 | CGContextSetTextDrawingMode(contextRef, kCGTextStroke); 49 | self.textColor = self.outlineColor; 50 | [super drawTextInRect:CGRectInset(rect, outlineSize/4, outlineSize/4)]; 51 | 52 | CGContextSetTextDrawingMode(contextRef, kCGTextFill); 53 | self.textColor = txtColor; 54 | [super drawTextInRect:CGRectInset(rect, outlineSize/4, outlineSize/4)]; 55 | 56 | self.shadowOffset = shadowOffset; 57 | } 58 | 59 | @end 60 | -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLTextSettingView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLTextSettingView.h 3 | // 4 | // Created by sho yakushiji on 2013/12/18. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | @protocol CLTextSettingViewDelegate; 11 | 12 | @interface CLTextSettingView : UIView 13 | 14 | @property (nonatomic, weak) id delegate; 15 | @property (nonatomic, strong) NSString *selectedText; 16 | @property (nonatomic, strong) UIColor *selectedFillColor; 17 | @property (nonatomic, strong) UIColor *selectedBorderColor; 18 | @property (nonatomic, assign) CGFloat selectedBorderWidth; 19 | @property (nonatomic, strong) UIFont *selectedFont; 20 | 21 | 22 | - (void)setTextColor:(UIColor*)textColor; 23 | - (void)setFontPickerForegroundColor:(UIColor*)foregroundColor; 24 | 25 | - (void)showSettingMenuWithIndex:(NSInteger)index animated:(BOOL)animated; 26 | 27 | @end 28 | 29 | 30 | 31 | @protocol CLTextSettingViewDelegate 32 | @optional 33 | - (void)textSettingView:(CLTextSettingView*)settingView didChangeText:(NSString*)text; 34 | - (void)textSettingView:(CLTextSettingView*)settingView didChangeFillColor:(UIColor*)fillColor; 35 | - (void)textSettingView:(CLTextSettingView*)settingView didChangeBorderColor:(UIColor*)borderColor; 36 | - (void)textSettingView:(CLTextSettingView*)settingView didChangeBorderWidth:(CGFloat)borderWidth; 37 | - (void)textSettingView:(CLTextSettingView*)settingView didChangeFont:(UIFont*)font; 38 | 39 | @end -------------------------------------------------------------------------------- /Example/Pods/CLImageEditor/OptionalImageTools/CLTextTool/CLTextTool.h: -------------------------------------------------------------------------------- 1 | // 2 | // CLTextTool.h 3 | // 4 | // Created by sho yakushiji on 2013/12/15. 5 | // Copyright (c) 2013年 CALACULU. All rights reserved. 6 | // 7 | 8 | #import "CLImageToolBase.h" 9 | 10 | @interface CLTextTool : CLImageToolBase 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (C) 2014 Gwendal Roué 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/ObjC/GRMustacheKeyAccess.h: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | // IMPLEMENTATION NOTE 26 | // 27 | // This code comes from Objective-C GRMustache. 28 | // 29 | // It is still written in Objective-C because 30 | // +[GRMustacheKeyAccess isSafeMustacheKey:forObject:] used to need the 31 | // [[object class] safeMustacheKeys] for classes that would conform to the 32 | // now removed GRMustacheSafeKeyAccess protocol. 33 | // 34 | // Swift would not let us do that (see example below): 35 | // 36 | // :: 37 | // 38 | // import Foundation 39 | // 40 | // @objc protocol P { 41 | // static func f() -> String 42 | // } 43 | // 44 | // class C : NSObject, P { 45 | // class func f() -> String { return "C" } 46 | // } 47 | // 48 | // // Expect "C", But we get the error: 49 | // // accessing members of protocol type value 'P.Type' is unimplemented 50 | // (C.self as P.Type).f() 51 | // 52 | @interface GRMustacheKeyAccess : NSObject 53 | + (BOOL)isSafeMustacheKey:(NSString *)key forObject:(id)object; 54 | @end 55 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/ObjC/Mustache.h: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #import 24 | 25 | //! Project version number for Mustache. 26 | FOUNDATION_EXPORT double MustacheVersionNumber; 27 | 28 | //! Project version string for Mustache. 29 | FOUNDATION_EXPORT const unsigned char MustacheVersionString[]; 30 | 31 | // In this header, you should import all the public headers of your framework using statements like #import 32 | 33 | // IMPLEMENTATION NOTE 34 | // 35 | // This one should be private, but Xcode today requires ObjC headers that should 36 | // be available to private Swift code to be public. 37 | #import "GRMustacheKeyAccess.h" 38 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/CoreGraphics.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2016 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | #if os(iOS) || os(macOS) || os(tvOS) || os(watchOS) 24 | import CoreGraphics 25 | 26 | /// GRMustache provides built-in support for rendering `CGFloat`. 27 | extension CGFloat : MustacheBoxable { 28 | 29 | /// CGFloat adopts the MustacheBoxable protocol so that it can feed 30 | /// Mustache templates. 31 | /// 32 | /// You should not directly call the `mustacheBox` property. 33 | /// 34 | /// ### Rendering 35 | /// 36 | /// - `{{cgfloat}}` is rendered with built-in Swift String 37 | /// Interpolation. Custom formatting can be explicitly required with 38 | /// NSNumberFormatter, as in `{{format(a)}}` (see `NSFormatter`). 39 | /// 40 | /// - `{{#cgfloat}}...{{/cgfloat}}` renders if and only if `cgfloat` is not 0 (zero). 41 | /// 42 | /// - `{{^cgfloat}}...{{/cgfloat}}` renders if and only if `double` is 0 (zero). 43 | public var mustacheBox: MustacheBox { 44 | return MustacheBox( 45 | value: self, 46 | boolValue: (self != 0.0), 47 | render: { (info: RenderingInfo) in 48 | switch info.tag.type { 49 | case .variable: 50 | // {{ cgfloat }} 51 | return Rendering("\(self)") 52 | case .section: 53 | if info.enumerationItem { 54 | // {{# cgfloats }}...{{/ cgfloats }} 55 | return try info.tag.render(info.context.extendedContext(Box(self))) 56 | } else { 57 | // {{# cgfloat }}...{{/ cgfloat }} 58 | // 59 | // Doubles do not enter the context stack when used in a 60 | // boolean section. 61 | // 62 | // This behavior must not change: 63 | // https://github.com/groue/GRMustache/issues/83 64 | return try info.tag.render(info.context) 65 | } 66 | } 67 | }) 68 | } 69 | } 70 | 71 | #endif 72 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/Expression.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | /// The type for expressions that appear in tags: `name`, `user.name`, 27 | /// `uppercase(user.name)`, etc. 28 | enum Expression { 29 | 30 | // {{ . }} 31 | case implicitIterator 32 | 33 | // {{ identifier }} 34 | case identifier(identifier: String) 35 | 36 | // {{ .identifier }} 37 | indirect case scoped(baseExpression: Expression, identifier: String) 38 | 39 | // {{ () }} 40 | indirect case filter(filterExpression: Expression, argumentExpression: Expression, partialApplication: Bool) 41 | } 42 | 43 | /// Expression conforms to Equatable so that the Compiler can check that section 44 | /// tags have matching openings and closings: {{# person }}...{{/ person }} is 45 | /// OK but {{# foo }}...{{/ bar }} is not. 46 | extension Expression: Equatable { 47 | } 48 | 49 | func ==(lhs: Expression, rhs: Expression) -> Bool { 50 | switch (lhs, rhs) { 51 | case (.implicitIterator, .implicitIterator): 52 | return true 53 | 54 | case (.identifier(let lIdentifier), .identifier(let rIdentifier)): 55 | return lIdentifier == rIdentifier 56 | 57 | case (.scoped(let lBase, let lIdentifier), .scoped(let rBase, let rIdentifier)): 58 | return lBase == rBase && lIdentifier == rIdentifier 59 | 60 | case (.filter(let lFilter, let lArgument, let lPartialApplication), .filter(let rFilter, let rArgument, let rPartialApplication)): 61 | return lFilter == rFilter && lArgument == rArgument && lPartialApplication == rPartialApplication 62 | 63 | default: 64 | return false 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/ExpressionGenerator.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | extension Expression : CustomDebugStringConvertible { 25 | /// A textual representation of `self`, suitable for debugging. 26 | var debugDescription: String { 27 | let string = ExpressionGenerator().stringFromExpression(self) 28 | return "Expression(\(string))" 29 | } 30 | } 31 | 32 | final class ExpressionGenerator { 33 | let configuration: Configuration 34 | 35 | init(configuration: Configuration? = nil) { 36 | self.configuration = configuration ?? DefaultConfiguration 37 | } 38 | 39 | func stringFromExpression(_ expression: Expression) -> String { 40 | buffer = "" 41 | renderExpression(expression) 42 | return buffer 43 | } 44 | 45 | func renderExpression(_ expression: Expression) { 46 | switch expression { 47 | case .implicitIterator: 48 | // {{ . }} 49 | 50 | buffer.append(".") 51 | 52 | case .identifier(let identifier): 53 | // {{ identifier }} 54 | 55 | buffer.append(identifier) 56 | 57 | case .scoped(let baseExpression, let identifier): 58 | // {{ .identifier }} 59 | 60 | renderExpression(baseExpression) 61 | buffer.append(".") 62 | buffer.append(identifier) 63 | 64 | case .filter(let filterExpression, let argumentExpression, _): 65 | // {{ () }} 66 | // 67 | // Support for variadic filters is not implemented: 68 | // `f(a,b)` is rendered `f(a)(b)`. 69 | 70 | renderExpression(filterExpression) 71 | buffer.append("(") 72 | renderExpression(argumentExpression) 73 | buffer.append(")") 74 | } 75 | } 76 | 77 | fileprivate var buffer: String = "" 78 | } 79 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/ExpressionInvocation.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | struct ExpressionInvocation { 27 | let expression: Expression 28 | 29 | func invokeWithContext(_ context: Context) throws -> MustacheBox { 30 | return try evaluate(context: context, expression: expression) 31 | } 32 | 33 | fileprivate func evaluate(context: Context, expression: Expression) throws -> MustacheBox { 34 | switch expression { 35 | case .implicitIterator: 36 | // {{ . }} 37 | 38 | return context.topBox 39 | 40 | case .identifier(let identifier): 41 | // {{ identifier }} 42 | 43 | return context.mustacheBox(forKey: identifier) 44 | 45 | case .scoped(let baseExpression, let identifier): 46 | // {{ .identifier }} 47 | 48 | return try evaluate(context: context, expression: baseExpression).mustacheBox(forKey: identifier) 49 | 50 | case .filter(let filterExpression, let argumentExpression, let partialApplication): 51 | // {{ () }} 52 | 53 | let filterBox = try evaluate(context: context, expression: filterExpression) 54 | 55 | guard let filter = filterBox.filter else { 56 | if filterBox.isEmpty { 57 | throw MustacheError(kind: .renderError, message: "Missing filter") 58 | } else { 59 | throw MustacheError(kind: .renderError, message: "Not a filter") 60 | } 61 | } 62 | 63 | let argumentBox = try evaluate(context: context, expression: argumentExpression) 64 | return try Box(filter(argumentBox, partialApplication)) 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/Fixit-1.1.0.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | @available(*, unavailable, message:"Use nil instead.") 25 | public func Box() -> MustacheBox { return EmptyBox } 26 | 27 | extension Template { 28 | @available(*, unavailable, renamed:"register(_:forKey:)") 29 | public func registerInBaseContext(_ key: String, _ value: Any?) { } 30 | } 31 | 32 | extension Context { 33 | @available(*, unavailable, renamed:"mustacheBox(forKey:)") 34 | public func mustacheBoxForKey(_ key: String) -> MustacheBox { return EmptyBox } 35 | 36 | @available(*, unavailable, renamed:"mustacheBox(forExpression:)") 37 | public func mustacheBoxForExpression(_ string: String) throws -> MustacheBox { return EmptyBox } 38 | 39 | @available(*, unavailable, renamed:"extendedContext(withRegisteredValue:forKey:)") 40 | func contextWithRegisteredKey(_ key: String, box: MustacheBox) -> Context { return self } 41 | } 42 | 43 | extension MustacheBox { 44 | @nonobjc @available(*, unavailable, renamed:"mustacheBox(forKey:)") 45 | public func mustacheBoxForKey(_ key: String) -> MustacheBox { return EmptyBox } 46 | } 47 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/HTMLEscapeHelper.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | final class HTMLEscapeHelper : MustacheBoxable { 27 | 28 | var mustacheBox: MustacheBox { 29 | // Return a multi-facetted box, because HTMLEscape interacts in 30 | // various ways with Mustache rendering. 31 | return MustacheBox( 32 | // It has a value: 33 | value: self, 34 | 35 | // HTMLEscape can be used as a filter: {{ HTMLEscape(x) }}: 36 | filter: Filter(filter), 37 | 38 | // HTMLEscape escapes all variable tags: {{# HTMLEscape }}...{{ x }}...{{/ HTMLEscape }} 39 | willRender: willRender) 40 | } 41 | 42 | // This function is used for evaluating `HTMLEscape(x)` expressions. 43 | private func filter(_ rendering: Rendering) throws -> Rendering { 44 | return Rendering(escapeHTML(rendering.string), rendering.contentType) 45 | } 46 | 47 | // A WillRenderFunction: this function lets HTMLEscape change values that 48 | // are about to be rendered to their escaped counterpart. 49 | // 50 | // It is activated as soon as the formatter enters the context stack, when 51 | // used in a section {{# HTMLEscape }}...{{/ HTMLEscape }}. 52 | private func willRender(_ tag: Tag, box: MustacheBox) -> Any? { 53 | switch tag.type { 54 | case .variable: 55 | // {{ value }} 56 | // We don't know if the box contains a String, so let's escape its 57 | // rendering. 58 | return { (info: RenderingInfo) -> Rendering in 59 | let rendering = try box.render(info) 60 | return try self.filter(rendering) 61 | } 62 | case .section: 63 | // {{# value }}...{{/ value }} 64 | // {{^ value }}...{{/ value }} 65 | // Leave sections untouched, so that loops and conditions are not 66 | // affected by the formatter. 67 | 68 | return box 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/LocatedTag.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LocatedTag.swift 3 | // Mustache 4 | // 5 | // Created by Gwendal Roué on 09/07/2015. 6 | // Copyright © 2015 Gwendal Roué. All rights reserved. 7 | // 8 | 9 | protocol LocatedTag: Tag { 10 | var templateID: TemplateID? { get } 11 | var lineNumber: Int { get } 12 | } 13 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/SectionTag.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | /// A SectionTag represents a regular or inverted section tag such as 27 | /// {{#section}}...{{/section}} or {{^section}}...{{/section}}. 28 | final class SectionTag: LocatedTag { 29 | let openingToken: TemplateToken 30 | let innerTemplateAST: TemplateAST 31 | 32 | init(innerTemplateAST: TemplateAST, openingToken: TemplateToken, innerTemplateString: String) { 33 | self.innerTemplateAST = innerTemplateAST 34 | self.openingToken = openingToken 35 | self.innerTemplateString = innerTemplateString 36 | } 37 | 38 | // Mark: - Tag protocol 39 | 40 | let type: TagType = .section 41 | let innerTemplateString: String 42 | var tagDelimiterPair: TagDelimiterPair { return openingToken.tagDelimiterPair! } 43 | 44 | var description: String { 45 | return "\(openingToken.templateSubstring) at \(openingToken.locationDescription)" 46 | } 47 | 48 | func render(_ context: Context) throws -> Rendering { 49 | let renderingEngine = RenderingEngine(templateAST: innerTemplateAST, context: context) 50 | return try renderingEngine.render() 51 | } 52 | 53 | // Mark: - LocatedTag 54 | 55 | var templateID: TemplateID? { return openingToken.templateID } 56 | var lineNumber: Int { return openingToken.lineNumber } 57 | } 58 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/TemplateAST.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | /// The abstract syntax tree of a template 25 | final class TemplateAST { 26 | 27 | /// A template AST can be "defined" or "undefined". 28 | /// 29 | /// Undefined template ASTs are used when parsing templates which embed a 30 | /// partial tag which refers to themselves. The compiler would emit a 31 | /// PartialNode which contains a reference to an undefined (yet) template 32 | /// AST. At the end of the compilation the undefined template AST would 33 | /// become defined. 34 | /// 35 | /// See TemplateRepository.templateAST(named:relativeToTemplateID:error:). 36 | enum `Type` { 37 | case undefined 38 | case defined(nodes: [TemplateASTNode], contentType: ContentType) 39 | } 40 | var type: Type 41 | 42 | fileprivate init(type: Type) { 43 | self.type = type 44 | } 45 | 46 | 47 | /// Creates an undefined TemplateAST. 48 | convenience init() { 49 | self.init(type: Type.undefined) 50 | } 51 | 52 | /// Creates a defined TemplateAST. 53 | convenience init(nodes: [TemplateASTNode], contentType: ContentType) { 54 | self.init(type: Type.defined(nodes: nodes, contentType: contentType)) 55 | } 56 | 57 | /// Nil if the template AST is undefined. 58 | var nodes: [TemplateASTNode]! { 59 | switch type { 60 | case .undefined: 61 | return nil 62 | case .defined(let nodes, _): 63 | return nodes 64 | } 65 | } 66 | 67 | /// Nil if the template AST is undefined. 68 | var contentType: ContentType! { 69 | switch type { 70 | case .undefined: 71 | return nil 72 | case .defined(_, let contentType): 73 | return contentType 74 | } 75 | } 76 | 77 | func updateFromTemplateAST(_ templateAST: TemplateAST) { 78 | self.type = templateAST.type 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/TemplateToken.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | struct TemplateToken { 25 | enum `Type` { 26 | /// text 27 | case text(text: String) 28 | 29 | /// {{ content }} 30 | case escapedVariable(content: String, tagDelimiterPair: TagDelimiterPair) 31 | 32 | /// {{{ content }}} 33 | case unescapedVariable(content: String, tagDelimiterPair: TagDelimiterPair) 34 | 35 | /// {{! comment }} 36 | case comment 37 | 38 | /// {{# content }} 39 | case section(content: String, tagDelimiterPair: TagDelimiterPair) 40 | 41 | /// {{^ content }} 42 | case invertedSection(content: String, tagDelimiterPair: TagDelimiterPair) 43 | 44 | /// {{/ content }} 45 | case close(content: String) 46 | 47 | /// {{> content }} 48 | case partial(content: String) 49 | 50 | /// {{= ... ... =}} 51 | case setDelimiters 52 | 53 | /// {{% content }} 54 | case pragma(content: String) 55 | 56 | /// {{< content }} 57 | case partialOverride(content: String) 58 | 59 | /// {{$ content }} 60 | case block(content: String) 61 | } 62 | 63 | let type: Type 64 | let lineNumber: Int 65 | let templateID: TemplateID? 66 | let templateString: String 67 | let range: Range 68 | 69 | var templateSubstring: String { return templateString[range] } 70 | 71 | var tagDelimiterPair: TagDelimiterPair? { 72 | switch type { 73 | case .escapedVariable(content: _, tagDelimiterPair: let tagDelimiterPair): 74 | return tagDelimiterPair 75 | case .unescapedVariable(content: _, tagDelimiterPair: let tagDelimiterPair): 76 | return tagDelimiterPair 77 | case .section(content: _, tagDelimiterPair: let tagDelimiterPair): 78 | return tagDelimiterPair 79 | case .invertedSection(content: _, tagDelimiterPair: let tagDelimiterPair): 80 | return tagDelimiterPair 81 | default: 82 | return nil 83 | } 84 | } 85 | 86 | var locationDescription: String { 87 | if let templateID = templateID { 88 | return "line \(lineNumber) of template \(templateID)" 89 | } else { 90 | return "line \(lineNumber)" 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/URLEscapeHelper.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | final class URLEscapeHelper : MustacheBoxable { 27 | 28 | var mustacheBox: MustacheBox { 29 | // Return a multi-facetted box, because URLEscape interacts in 30 | // various ways with Mustache rendering. 31 | return MustacheBox( 32 | // It has a value: 33 | value: self, 34 | 35 | // URLEscape can be used as a filter: {{ URLEscape(x) }}: 36 | filter: Filter(filter), 37 | 38 | // URLEscape escapes all variable tags: {{# URLEscape }}...{{ x }}...{{/ URLEscape }} 39 | willRender: willRender) 40 | } 41 | 42 | // This function is used for evaluating `URLEscape(x)` expressions. 43 | fileprivate func filter(_ rendering: Rendering) throws -> Rendering { 44 | return Rendering(URLEscapeHelper.escapeURL(rendering.string), rendering.contentType) 45 | } 46 | 47 | // A WillRenderFunction: this function lets URLEscape change values that 48 | // are about to be rendered to their escaped counterpart. 49 | // 50 | // It is activated as soon as the formatter enters the context stack, when 51 | // used in a section {{# URLEscape }}...{{/ URLEscape }}. 52 | fileprivate func willRender(_ tag: Tag, box: MustacheBox) -> Any? { 53 | switch tag.type { 54 | case .variable: 55 | // We don't know if the box contains a String, so let's escape its 56 | // rendering. 57 | return { (info: RenderingInfo) -> Rendering in 58 | let rendering = try box.render(info) 59 | return try self.filter(rendering) 60 | } 61 | case .section: 62 | return box 63 | } 64 | } 65 | 66 | fileprivate class func escapeURL(_ string: String) -> String { 67 | let s = (CharacterSet.urlQueryAllowed as NSCharacterSet).mutableCopy() as! NSMutableCharacterSet 68 | s.removeCharacters(in: "?&=") 69 | return string.addingPercentEncoding(withAllowedCharacters: s as CharacterSet) ?? "" 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/VariableTag.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | /// VariableTag represents a variable tag such as {{name}} or {{{name}}}. 27 | final class VariableTag: LocatedTag { 28 | let token: TemplateToken 29 | let contentType: ContentType 30 | 31 | init(contentType: ContentType, token: TemplateToken) { 32 | self.contentType = contentType 33 | self.token = token 34 | } 35 | 36 | // Mark: - Tag protocol 37 | 38 | let type: TagType = .variable 39 | let innerTemplateString: String = "" 40 | var tagDelimiterPair: TagDelimiterPair { return token.tagDelimiterPair! } 41 | 42 | var description: String { 43 | return "\(token.templateSubstring) at \(token.locationDescription)" 44 | } 45 | 46 | // Variable have no inner content. 47 | func render(_ context: Context) throws -> Rendering { 48 | return Rendering("", contentType) 49 | } 50 | 51 | // Mark: - LocatedTag 52 | 53 | var templateID: TemplateID? { return token.templateID } 54 | var lineNumber: Int { return token.lineNumber } 55 | } 56 | -------------------------------------------------------------------------------- /Example/Pods/GRMustache.swift/Sources/ZipFilter.swift: -------------------------------------------------------------------------------- 1 | // The MIT License 2 | // 3 | // Copyright (c) 2015 Gwendal Roué 4 | // 5 | // Permission is hereby granted, free of charge, to any person obtaining a copy 6 | // of this software and associated documentation files (the "Software"), to deal 7 | // in the Software without restriction, including without limitation the rights 8 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | // copies of the Software, and to permit persons to whom the Software is 10 | // furnished to do so, subject to the following conditions: 11 | // 12 | // The above copyright notice and this permission notice shall be included in 13 | // all copies or substantial portions of the Software. 14 | // 15 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | // THE SOFTWARE. 22 | 23 | 24 | import Foundation 25 | 26 | let ZipFilter = VariadicFilter { (boxes) in 27 | 28 | // Turn collection arguments into iterators. Iterators can be iterated 29 | // all together, and this is what we need. 30 | // 31 | // Other kinds of arguments generate an error. 32 | 33 | var zippedIterators: [AnyIterator] = [] 34 | 35 | for box in boxes { 36 | if box.isEmpty { 37 | // Missing collection does not provide anything 38 | } else if let array = box.arrayValue { 39 | // Array 40 | zippedIterators.append(AnyIterator(array.makeIterator())) 41 | } else { 42 | // Error 43 | throw MustacheError(kind: .renderError, message: "Non-enumerable argument in zip filter: `\(box.value)`") 44 | } 45 | } 46 | 47 | 48 | // Build an array of custom render functions 49 | 50 | var renderFunctions: [RenderFunction] = [] 51 | 52 | while true { 53 | 54 | // Extract from all iterators the boxes that should enter the rendering 55 | // context at each iteration. 56 | // 57 | // Given the [1,2,3], [a,b,c] input collections, those boxes would be 58 | // [1,a] then [2,b] and finally [3,c]. 59 | 60 | var zippedBoxes: [MustacheBox] = [] 61 | for iterator in zippedIterators { 62 | var iterator = iterator 63 | if let box = iterator.next() { 64 | zippedBoxes.append(box) 65 | } 66 | } 67 | 68 | 69 | // All iterators have been enumerated: stop 70 | 71 | if zippedBoxes.isEmpty { 72 | break; 73 | } 74 | 75 | 76 | // Build a render function which extends the rendering context with 77 | // zipped boxes before rendering the tag. 78 | 79 | let renderFunction: RenderFunction = { (info) -> Rendering in 80 | var context = zippedBoxes.reduce(info.context) { (context, box) in context.extendedContext(box) } 81 | return try info.tag.render(context) 82 | } 83 | 84 | renderFunctions.append(renderFunction) 85 | } 86 | 87 | return renderFunctions 88 | } 89 | -------------------------------------------------------------------------------- /Example/Pods/GitYourFeedbackTests/GitYourFeedbackTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GitYourFeedbackTests.swift 3 | // GitYourFeedbackTests 4 | // 5 | // Created by Gabe Kangas on 10/21/16. 6 | // 7 | // 8 | 9 | import XCTest 10 | 11 | class GitYourFeedbackTests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | super.tearDown() 21 | } 22 | 23 | func testExample() { 24 | // This is an example of a functional test case. 25 | // Use XCTAssert and related functions to verify your tests produce the correct results. 26 | } 27 | 28 | func testPerformanceExample() { 29 | // This is an example of a performance test case. 30 | self.measure { 31 | // Put the code you want to measure the time of here. 32 | } 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /Example/Pods/GitYourFeedbackTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/GitYourFeedack.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GitYourFeedback", 3 | "version": "0.1.0", 4 | "summary": "Let users submit feedback, with screenshots, directly from your iOS app to Github Issues.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/gabek/GitYourFeedback", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "Gabe Kangas": "gabek@real-ity.com" 13 | }, 14 | "source": { 15 | "git": "https://github.com/gabek/GitYourFeedback.git", 16 | "tag": "0.1.0" 17 | }, 18 | "social_media_url": "https://twitter.com/gabek", 19 | "platforms": { 20 | "ios": "9.0" 21 | }, 22 | "source_files": "GitYourFeedback/Classes/**/*", 23 | "resources": "GitYourFeedback/Assets/*.png" 24 | } 25 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/GitYourFeedback.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GitYourFeedback", 3 | "version": "0.1.0", 4 | "summary": "Let users submit feedback and bugs with screenshots, directly from your iOS app to Github Issues.", 5 | "description": "Instead of routing your users to GitHub and expecting them to file issues, or copying and pasting from emails into GitHub, allow users to easily submit feedback and bugs right from within your application.", 6 | "homepage": "https://github.com/gabek/GitYourFeedback", 7 | "screenshots": [ 8 | "https://raw.githubusercontent.com/gabek/GitYourFeedback/master/ClientScreenshot.png", 9 | "https://github.com/gabek/GitYourFeedback/raw/master/GithubScreenshot.png" 10 | ], 11 | "license": { 12 | "type": "MIT", 13 | "file": "LICENSE" 14 | }, 15 | "authors": { 16 | "Gabe Kangas": "gabek@real-ity.com" 17 | }, 18 | "source": { 19 | "git": "https://github.com/gabek/GitYourFeedback.git", 20 | "tag": "0.1.0" 21 | }, 22 | "social_media_url": "https://twitter.com/gabek", 23 | "platforms": { 24 | "ios": "9.0" 25 | }, 26 | "source_files": "GitYourFeedback/Classes/**/*", 27 | "resources": "GitYourFeedback/Assets/**/*", 28 | "dependencies": { 29 | "GRMustache.swift": [ 30 | 31 | ], 32 | "CLImageEditor": [ 33 | 34 | ], 35 | "CLImageEditor/TextTool": [ 36 | 37 | ] 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CLImageEditor (0.1.6): 3 | - CLImageEditor/Core (= 0.1.6) 4 | - CLImageEditor/Core (0.1.6) 5 | - CLImageEditor/TextTool (0.1.6): 6 | - CLImageEditor/Core 7 | - GitYourFeedback (0.1.0): 8 | - CLImageEditor 9 | - CLImageEditor/TextTool 10 | - GRMustache.swift 11 | - GRMustache.swift (2.0.0) 12 | 13 | DEPENDENCIES: 14 | - GitYourFeedback (from `../`) 15 | 16 | EXTERNAL SOURCES: 17 | GitYourFeedback: 18 | :path: "../" 19 | 20 | SPEC CHECKSUMS: 21 | CLImageEditor: a0fa2fefc7b2ad611f2116dccbe3db5621f70301 22 | GitYourFeedback: 3bbba0f68e29e17ecbb6c0058a52e09722f2a126 23 | GRMustache.swift: 8a547c12bea16052071b2b540af83d770075f0eb 24 | 25 | PODFILE CHECKSUM: ecbecaa659d35b1b54d3667d6999c056253c5699 26 | 27 | COCOAPODS: 1.1.1 28 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/GitYourFeedback.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/CLImageEditor-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_CLImageEditor : NSObject 3 | @end 4 | @implementation PodsDummy_CLImageEditor 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/CLImageEditor-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/CLImageEditor-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "CLImageEditor.h" 6 | #import "CLImageEditorTheme.h" 7 | #import "CLImageToolInfo.h" 8 | 9 | FOUNDATION_EXPORT double CLImageEditorVersionNumber; 10 | FOUNDATION_EXPORT const unsigned char CLImageEditorVersionString[]; 11 | 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/CLImageEditor.modulemap: -------------------------------------------------------------------------------- 1 | framework module CLImageEditor { 2 | umbrella header "CLImageEditor-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/CLImageEditor.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/CLImageEditor 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_LDFLAGS = -framework "Accelerate" -framework "CoreGraphics" -framework "CoreImage" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/CLImageEditor/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.6 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/GRMustache.swift-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_GRMustache_swift : NSObject 3 | @end 4 | @implementation PodsDummy_GRMustache_swift 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/GRMustache.swift-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/GRMustache.swift-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "GRMustacheKeyAccess.h" 6 | #import "Mustache.h" 7 | 8 | FOUNDATION_EXPORT double MustacheVersionNumber; 9 | FOUNDATION_EXPORT const unsigned char MustacheVersionString[]; 10 | 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/GRMustache.swift.modulemap: -------------------------------------------------------------------------------- 1 | framework module Mustache { 2 | umbrella header "GRMustache.swift-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/GRMustache.swift.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_LDFLAGS = -framework "Foundation" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GRMustache.swift/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 2.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/GitYourFeedback-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_GitYourFeedback : NSObject 3 | @end 4 | @implementation PodsDummy_GitYourFeedback 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/GitYourFeedback-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/GitYourFeedback-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double GitYourFeedbackVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char GitYourFeedbackVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/GitYourFeedback.modulemap: -------------------------------------------------------------------------------- 1 | framework module GitYourFeedback { 2 | umbrella header "GitYourFeedback-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/GitYourFeedback.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/GitYourFeedback 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/CLImageEditor" "$PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/GitYourFeedback/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Pods-GitYourFeedback_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_GitYourFeedback_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_GitYourFeedback_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Pods-GitYourFeedback_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double Pods_GitYourFeedback_ExampleVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char Pods_GitYourFeedback_ExampleVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Pods-GitYourFeedback_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/CLImageEditor" "$PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift" "$PODS_CONFIGURATION_BUILD_DIR/GitYourFeedback" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/CLImageEditor/CLImageEditor.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift/Mustache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GitYourFeedback/GitYourFeedback.framework/Headers" 7 | OTHER_LDFLAGS = $(inherited) -framework "CLImageEditor" -framework "GitYourFeedback" -framework "Mustache" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = $BUILD_DIR 10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Pods-GitYourFeedback_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_GitYourFeedback_Example { 2 | umbrella header "Pods-GitYourFeedback_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-GitYourFeedback_Example/Pods-GitYourFeedback_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/CLImageEditor" "$PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift" "$PODS_CONFIGURATION_BUILD_DIR/GitYourFeedback" 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/CLImageEditor/CLImageEditor.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GRMustache.swift/Mustache.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/GitYourFeedback/GitYourFeedback.framework/Headers" 7 | OTHER_LDFLAGS = $(inherited) -framework "CLImageEditor" -framework "GitYourFeedback" -framework "Mustache" 8 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 9 | PODS_BUILD_DIR = $BUILD_DIR 10 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /GitYourFeedback.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint GitYourFeedback.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'GitYourFeedback' 11 | s.version = '0.1.2' 12 | s.summary = 'Let users submit feedback and bugs with screenshots, directly from your iOS app to Github Issues.' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | Instead of routing your users to GitHub and expecting them to file issues, or copying and pasting from emails into GitHub, allow users to easily submit feedback and bugs right from within your application. 22 | DESC 23 | 24 | s.homepage = 'https://github.com/gabek/GitYourFeedback' 25 | s.screenshots = 'https://raw.githubusercontent.com/gabek/GitYourFeedback/master/ClientScreenshot.png', 'https://github.com/gabek/GitYourFeedback/raw/master/GithubScreenshot.png' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'Gabe Kangas' => 'gabek@real-ity.com' } 28 | s.source = { :git => 'https://github.com/gabek/GitYourFeedback.git', :tag => s.version.to_s } 29 | s.social_media_url = 'https://twitter.com/gabek' 30 | 31 | s.ios.deployment_target = '9.0' 32 | 33 | s.source_files = 'GitYourFeedback/Classes/**/*' 34 | 35 | s.resources = 'GitYourFeedback/Assets/**/*' 36 | 37 | s.dependency 'GRMustache.swift' 38 | s.dependency 'CLImageEditor' 39 | s.dependency 'CLImageEditor/TextTool' 40 | end 41 | -------------------------------------------------------------------------------- /GitYourFeedback/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Assets/.gitkeep -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/add_photo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "add_photo.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/add_photo.imageset/add_photo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Assets/Icons.xcassets/add_photo.imageset/add_photo.pdf -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/camera.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "camera.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/camera.imageset/camera.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Assets/Icons.xcassets/camera.imageset/camera.pdf -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/close.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "close.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/close.imageset/close.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Assets/Icons.xcassets/close.imageset/close.pdf -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/save.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "save.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /GitYourFeedback/Assets/Icons.xcassets/save.imageset/save.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Assets/Icons.xcassets/save.imageset/save.pdf -------------------------------------------------------------------------------- /GitYourFeedback/Assets/issueTemplate.md: -------------------------------------------------------------------------------- 1 | {{% CONTENT_TYPE:TEXT }} 2 | 3 | Submitted by: {{ email }} 4 | 5 | ## {{ title }} 6 | 7 | {{#body}} 8 | {{body}} 9 | {{/body}} 10 | 11 |
Client Details

12 | 13 | | Name | Value | 14 | | ------------- | ------------- | 15 | {{# each(applicationDetails)}}| {{ @key }} | {{.}} | 16 | {{/}} 17 | 18 |

19 | 20 | 21 | {{#additionalData}} 22 | {{additionalData}} 23 | {{/additionalData}} 24 | 25 | {{#screenshotURL}} 26 | ![Screenshot]({{ screenshotURL }}) 27 | {{/screenshotURL}} -------------------------------------------------------------------------------- /GitYourFeedback/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedback/Classes/.gitkeep -------------------------------------------------------------------------------- /GitYourFeedback/Classes/CLImageEditorExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CLImageEditorExtension.swift 3 | // Pods 4 | // 5 | // Created by Gabe Kangas on 10/30/16. 6 | // 7 | // 8 | 9 | import Foundation 10 | import CLImageEditor 11 | 12 | extension CLImageEditor { 13 | func setup() { 14 | disable(tools: ["CLToneCurveTool", "CLFilterTool", "CLEffectTool", "CLAdjustmentTool", "CLBlurTool", "CLRotateTool", "CLSplashTool", "CLResizeTool", "CLEmoticonTool", "CLStickerTool"]) 15 | rename(tool: "CLDrawTool", name: "Markup") 16 | } 17 | 18 | func disable(tools: [String]) { 19 | for tool in tools { 20 | let tool = toolInfo.subToolInfo(withToolName: tool, recursive: true) 21 | tool?.available = false 22 | } 23 | } 24 | 25 | func rename(tool: String, name: String) { 26 | let tool = toolInfo.subToolInfo(withToolName: tool, recursive: true) 27 | tool?.title = name 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/Errors.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Errors.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 10/17/16. 6 | // 7 | // 8 | // Using the approach partially documented at 9 | // http://alisoftware.github.io/swift/async/error/2016/02/06/async-errors/ so 10 | // check that out if you want to contribute. 11 | 12 | import Foundation 13 | 14 | enum Result { 15 | case Success(T) 16 | case Failure(Error) 17 | } 18 | 19 | enum GitYourFeedbackError: Error { 20 | case ImageUploadError(String) 21 | case GithubSaveError(String) 22 | } 23 | 24 | 25 | extension Result { 26 | // Return the value if it's a .Success or throw the error if it's a .Failure 27 | func resolve() throws -> T { 28 | switch self { 29 | case Result.Success(let value): return value 30 | case Result.Failure(let error): throw error 31 | } 32 | } 33 | 34 | // Construct a .Success if the expression returns a value or a .Failure if it throws 35 | init( _ throwingExpr: () throws -> T) { 36 | do { 37 | let value = try throwingExpr() 38 | self = Result.Success(value) 39 | } catch { 40 | self = Result.Failure(error) 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/FeedbackReportingOptions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FeedbackReportingOptions.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 11/8/16. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public struct FeedbackReportingOptions: FeedbackOptions { 12 | public init(token: String, user: String, repo: String) { 13 | self.token = token 14 | self.user = user 15 | self.repo = repo 16 | } 17 | 18 | // The GitHub personal access token for the below user 19 | public var token: String 20 | /// The user that generated the above Personal Access Token and has access to the repository. 21 | public var user: String 22 | /// The Github repository in username/repo format where the issue will be saved. 23 | public var repo: String 24 | } 25 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/GoogleStorage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // GoogleStroage.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 9/10/16. 6 | // Copyright © 2016 Gabe Kangas. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class GoogleStorage { 12 | var bucket: String? 13 | 14 | func upload(data: Data, urlString: String, completionHandler: @escaping (Result) -> Void) { 15 | // Tell Google this is a one-time, non-multipart upload 16 | var urlComponents = URLComponents(string: urlString) 17 | urlComponents?.appendQueryItem(name: "uploadType", value: "media") 18 | 19 | guard let url = urlComponents?.url else { 20 | fatalError("Unable create a HTTP request from string: \(urlString)") 21 | } 22 | 23 | var request = createRequest(remoteUrl: url) 24 | request.setValue(String(data.count), forHTTPHeaderField: "Content-Length") 25 | 26 | let uploadTask = URLSession.shared.uploadTask(with: request, from: data) { (data, response, httpError) in 27 | guard let data = data else { 28 | fatalError("No response from Google Cloud Storage") 29 | } 30 | 31 | DispatchQueue.main.sync { 32 | if let publicUrlString = self.parseResponseForPublicUrl(responseJsonData: data) { 33 | let successResult = Result.Success(publicUrlString) 34 | completionHandler(successResult) 35 | } else if let response = response as? HTTPURLResponse { 36 | let errorString = "\(urlString). Status code: \(response.statusCode)" 37 | let failureResult: Result = Result.Failure(GitYourFeedbackError.ImageUploadError(errorString)) 38 | completionHandler(failureResult) 39 | } 40 | } 41 | 42 | } 43 | uploadTask.resume() 44 | } 45 | 46 | private func createRequest(remoteUrl: URL) -> URLRequest { 47 | var request = URLRequest(url: remoteUrl) 48 | request.httpMethod = "POST" 49 | request.setValue("image/jpg", forHTTPHeaderField: "Content-Type") 50 | return request 51 | } 52 | 53 | private func parseResponseForPublicUrl(responseJsonData: Data) -> String? { 54 | var jsonResults: [String:Any]? 55 | 56 | do { 57 | guard let results = try JSONSerialization.jsonObject(with: responseJsonData, options: []) as? [String:Any] else { 58 | return nil 59 | } 60 | jsonResults = results 61 | } catch { 62 | let errorText = String(data: responseJsonData, encoding: String.Encoding.utf8) 63 | fatalError("Parsing failed: \((error as NSError).localizedDescription). \(errorText) You may want to verify your upload URL is correct.") 64 | } 65 | 66 | if let bucket = jsonResults?["bucket"] as? String, let name = jsonResults?["name"] as? String { 67 | let publicUrl = "https://storage.googleapis.com/\(bucket)/\(name)" 68 | return publicUrl 69 | } 70 | 71 | return nil 72 | } 73 | } 74 | 75 | 76 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/MediaQuery.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MediaQuery.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 9/11/16. 6 | // Copyright © 2016 Gabe Kangas. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Photos 11 | 12 | struct MediaQuery { 13 | static func fetchLastImage(completionHandler: @escaping (UIImage?) -> Void) { 14 | 15 | let imgManager = PHImageManager.default() 16 | 17 | let requestOptions = PHImageRequestOptions() 18 | requestOptions.isSynchronous = true 19 | 20 | // Sort the images by creation date 21 | let fetchOptions = PHFetchOptions() 22 | fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: true)] 23 | 24 | let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: PHAssetMediaType.image, options: fetchOptions) 25 | 26 | // If the fetch result isn't empty, 27 | // proceed with the image request 28 | if fetchResult.count > 0 { 29 | // Perform the image request 30 | imgManager.requestImage(for: fetchResult.object(at: fetchResult.count - 1) as PHAsset, targetSize: CGSize(width: 300, height: 100), contentMode: PHImageContentMode.aspectFill, options: requestOptions, resultHandler: { (image, _) in 31 | 32 | completionHandler(image) 33 | }) 34 | } else { 35 | completionHandler(nil) 36 | } 37 | } 38 | 39 | static func hasPhotosAccess() -> Bool { 40 | let access = PHPhotoLibrary.authorizationStatus() 41 | return access == PHAuthorizationStatus.authorized 42 | } 43 | 44 | static func requestPhotosAccess(completionHandler: @escaping (PHAuthorizationStatus) -> Void) { 45 | PHPhotoLibrary.requestAuthorization { (status) in 46 | completionHandler(status) 47 | } 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/PlaceholderTextView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaceholderTextView.swift 3 | // GitYourFeedback 4 | // 5 | // Created by Gabe Kangas on 11/8/16. 6 | // 7 | // 8 | // NOTE: This is stealing the UITextView Delegate. If you need the delegate 9 | // in the future you should proxy the delegate methods from here to those who 10 | // want the callbacks. 11 | // 12 | 13 | import Foundation 14 | 15 | class PlaceholderTextView: UITextView, UITextViewDelegate { 16 | 17 | init() { 18 | super.init(frame: CGRect.zero, textContainer: nil) 19 | 20 | setup() 21 | } 22 | 23 | fileprivate func setup() { 24 | delegate = self 25 | addSubview(placeholderLabel) 26 | placeholderLabel.isHidden = !text.isEmpty 27 | 28 | placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: 8).isActive = true 29 | placeholderLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: 8).isActive = true 30 | } 31 | 32 | fileprivate let placeholderLabel: UILabel = { 33 | let label = UILabel() 34 | label.translatesAutoresizingMaskIntoConstraints = false 35 | label.text = "Detailed description (optional)" 36 | label.textColor = UIColor(white: 0, alpha: 0.2) 37 | label.font = UIFont.systemFont(ofSize: 17) 38 | return label 39 | }() 40 | 41 | func textViewDidChange(_ textView: UITextView) { 42 | placeholderLabel.isHidden = !text.isEmpty 43 | } 44 | 45 | required init?(coder aDecoder: NSCoder) { 46 | fatalError("init(coder:) has not been implemented") 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/UIImageExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIImageExtension.swift 3 | // Pods 4 | // 5 | // Created by Sidney de Koning on 27/10/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | extension UIImage { 12 | 13 | func resize(to size: CGSize) -> UIImage { 14 | UIGraphicsBeginImageContextWithOptions(size, true, UIScreen.main.scale) 15 | self.draw(in: CGRect(origin: CGPoint.zero, size: size)) 16 | 17 | let scaledImage = UIGraphicsGetImageFromCurrentImageContext() 18 | return scaledImage! 19 | } 20 | 21 | func resizeToUploadingSize() -> UIImage { 22 | let recommendedSize = CGSize(width: 360, height: 640) 23 | 24 | let widthFactor = size.width / recommendedSize.width 25 | let heightFactor = size.height / recommendedSize.height 26 | 27 | var resizeFactor = widthFactor 28 | if size.height > size.width { 29 | resizeFactor = heightFactor 30 | } 31 | 32 | let newSize = CGSize(width: size.width / resizeFactor, height: size.height / resizeFactor) 33 | let resized = resize(to: newSize) 34 | return resized 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /GitYourFeedback/Classes/UIViewControllerExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewControllerExtension.swift 3 | // Pods 4 | // 5 | // Created by Sidney de Koning on 27/10/2016. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | extension UIViewController { 12 | 13 | static var topmostViewController: UIViewController? { 14 | var vc: UIViewController? 15 | 16 | guard let rootViewController = UIApplication.shared.keyWindow?.rootViewController else { 17 | return nil 18 | } 19 | 20 | vc = rootViewController 21 | 22 | while let presentedViewController = vc?.presentedViewController { 23 | vc = presentedViewController 24 | } 25 | 26 | return vc 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /GitYourFeedbackDemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GitYourFeedbackDemo.gif -------------------------------------------------------------------------------- /GithubScreenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/GithubScreenshot.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Gabe Kangas 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /docs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gabek/GitYourFeedback/f1f2af8f6952c564b4faa61f79449c084cad0463/docs/.gitkeep -------------------------------------------------------------------------------- /docs/params.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gityourfeedback", 3 | "tagline": "Let users submit feedback, with screenshots, directly from your iOS app to Github Issues", 4 | "body": "### Welcome to GitHub Pages.\r\nThis automatic page generator is the easiest way to create beautiful pages for all of your projects. Author your page content here [using GitHub Flavored Markdown](https://guides.github.com/features/mastering-markdown/), select a template crafted by a designer, and publish. After your page is generated, you can check out the new `gh-pages` branch locally. If you’re using GitHub Desktop, simply sync your repository and you’ll see the new branch.\r\n\r\n### Designer Templates\r\nWe’ve crafted some handsome templates for you to use. Go ahead and click 'Continue to layouts' to browse through them. You can easily go back to edit your page before publishing. After publishing your page, you can revisit the page generator and switch to another theme. Your Page content will be preserved.\r\n\r\n### Creating pages manually\r\nIf you prefer to not use the automatic generator, push a branch named `gh-pages` to your repository to create a page manually. In addition to supporting regular HTML content, GitHub Pages support Jekyll, a simple, blog aware static site generator. Jekyll makes it easy to create site-wide headers and footers without having to copy them across every page. It also offers intelligent blog support and other advanced templating features.\r\n\r\n### Authors and Contributors\r\nYou can @mention a GitHub username to generate a link to their profile. The resulting `` element will link to the contributor’s GitHub Profile. For example: In 2007, Chris Wanstrath (@defunkt), PJ Hyett (@pjhyett), and Tom Preston-Werner (@mojombo) founded GitHub.\r\n\r\n### Support or Contact\r\nHaving trouble with Pages? Check out our [documentation](https://help.github.com/pages) or [contact support](https://github.com/contact) and we’ll help you sort it out.\r\n", 5 | "note": "Don't delete this file! It's used internally to help with page regeneration." 6 | } --------------------------------------------------------------------------------