├── PI Emoji Picker
├── en.lproj
│ ├── InfoPlist.strings
│ └── Credits.rtf
├── PI Emoji Picker-Prefix.pch
├── main.m
├── PIAppDelegate.h
├── PIEmojiViewController.h
├── PIEmojiViewController.m
├── Images.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── PI Emoji Picker-Info.plist
├── PIAppDelegate.m
└── Base.lproj
│ └── MainMenu.xib
├── Emoji Picker
├── EmojiView.xcassets
│ ├── car_n.imageset
│ │ ├── car_n.png
│ │ ├── car_n@2x.png
│ │ └── Contents.json
│ ├── car_s.imageset
│ │ ├── car_s.png
│ │ ├── car_s@2x.png
│ │ └── Contents.json
│ ├── bell_n.imageset
│ │ ├── bell_n.png
│ │ ├── bell_n@2x.png
│ │ └── Contents.json
│ ├── bell_s.imageset
│ │ ├── bell_s.png
│ │ ├── bell_s@2x.png
│ │ └── Contents.json
│ ├── face_n.imageset
│ │ ├── face_n.png
│ │ ├── face_n@2x.png
│ │ └── Contents.json
│ ├── face_s.imageset
│ │ ├── face_s.png
│ │ ├── face_s@2x.png
│ │ └── Contents.json
│ ├── flower_n.imageset
│ │ ├── flower_n.png
│ │ ├── flower_n@2x.png
│ │ └── Contents.json
│ ├── flower_s.imageset
│ │ ├── flower_s.png
│ │ ├── flower_s@2x.png
│ │ └── Contents.json
│ ├── recent_n.imageset
│ │ ├── recent_n.png
│ │ ├── recent_n@2x.png
│ │ └── Contents.json
│ ├── recent_s.imageset
│ │ ├── recent_s.png
│ │ ├── recent_s@2x.png
│ │ └── Contents.json
│ ├── backspace_n.imageset
│ │ ├── backspace_n.png
│ │ ├── backspace_n@2x.png
│ │ └── Contents.json
│ ├── characters_n.imageset
│ │ ├── characters_n.png
│ │ ├── characters_n@2x.png
│ │ └── Contents.json
│ └── characters_s.imageset
│ │ ├── characters_s.png
│ │ ├── characters_s@2x.png
│ │ └── Contents.json
├── RPBorderlessSegmented
│ ├── RPBorderlessSegmentedCell.h
│ ├── RPBorderlessSegmentedControl.h
│ ├── NSImage+DrawAsTemplate.h
│ ├── RPBorderlessSegmentedControl.m
│ ├── RPBorderlessSegmentedCell.m
│ └── NSImage+DrawAsTemplate.m
├── PIEmojiKeyboardView.h
├── PIEmojiPageView.h
├── PIEmojiPageView.m
├── EmojiView.xib
├── PIEmojiKeyboardView.m
└── EmojisList.plist
├── PI Emoji Picker.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcuserdata
│ └── akac.xcuserdatad
│ │ ├── xcdebugger
│ │ └── Breakpoints_v2.xcbkptlist
│ │ └── xcschemes
│ │ └── PI Emoji Picker.xcscheme
└── project.pbxproj
├── .gitignore
├── LICENSE
└── README.md
/PI Emoji Picker/en.lproj/InfoPlist.strings:
--------------------------------------------------------------------------------
1 | /* Localized versions of Info.plist keys */
2 |
3 |
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_n.imageset/car_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/car_s.imageset/car_s@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_n.imageset/bell_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/bell_s.imageset/bell_s@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_n.imageset/face_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/face_s.imageset/face_s@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_n.imageset/flower_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/flower_s.imageset/flower_s@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_n.imageset/recent_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/recent_s.imageset/recent_s@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/backspace_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_n.imageset/characters_n@2x.png
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/WebISInc/PI_EmojiPicker/HEAD/Emoji Picker/EmojiView.xcassets/characters_s.imageset/characters_s@2x.png
--------------------------------------------------------------------------------
/PI Emoji Picker.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/PI Emoji Picker/PI Emoji Picker-Prefix.pch:
--------------------------------------------------------------------------------
1 | //
2 | // Prefix header
3 | //
4 | // The contents of this file are implicitly included at the beginning of every source file.
5 | //
6 |
7 | #ifdef __OBJC__
8 | #import
9 | #endif
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # CocoaPods
2 | #
3 | # We recommend against adding the Pods directory to your .gitignore. However
4 | # you should judge for yourself, the pros and cons are mentioned at:
5 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control?
6 | #
7 | # Pods/
8 |
9 |
--------------------------------------------------------------------------------
/PI Emoji Picker/main.m:
--------------------------------------------------------------------------------
1 | //
2 | // main.m
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/29/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | int main(int argc, const char * argv[])
12 | {
13 | return NSApplicationMain(argc, argv);
14 | }
15 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedCell.h:
--------------------------------------------------------------------------------
1 | //
2 | // RPBorderlessSegmentedCell.h
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/11/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | @interface RPBorderlessSegmentedCell : NSSegmentedCell
10 |
11 | @end
12 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedControl.h:
--------------------------------------------------------------------------------
1 | //
2 | // RPBorderlessSegmentedControl.h
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/10/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | @interface RPBorderlessSegmentedControl : NSSegmentedControl
10 |
11 | @end
12 |
--------------------------------------------------------------------------------
/PI Emoji Picker/PIAppDelegate.h:
--------------------------------------------------------------------------------
1 | //
2 | // PIAppDelegate.h
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/29/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @interface PIAppDelegate : NSObject
12 |
13 | @property (assign) IBOutlet NSWindow *window;
14 |
15 | @end
16 |
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "bell_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "bell_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/bell_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "bell_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "bell_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "car_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "car_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/car_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "car_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "car_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "face_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "face_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/face_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "face_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "face_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "flower_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "flower_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/flower_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "flower_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "flower_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "recent_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "recent_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/recent_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "recent_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "recent_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/backspace_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "backspace_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "backspace_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_n.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "characters_n.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "characters_n@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xcassets/characters_s.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "scale" : "1x",
6 | "filename" : "characters_s.png"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "scale" : "2x",
11 | "filename" : "characters_s@2x.png"
12 | }
13 | ],
14 | "info" : {
15 | "version" : 1,
16 | "author" : "xcode"
17 | }
18 | }
--------------------------------------------------------------------------------
/PI Emoji Picker/PIEmojiViewController.h:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiViewController.h
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/29/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import
10 | #import "PIEmojiKeyboardView.h"
11 |
12 | @interface PIEmojiViewController : NSViewController
13 | @property (nonatomic, weak) id delegate;
14 |
15 | @end
16 |
17 |
--------------------------------------------------------------------------------
/PI Emoji Picker/en.lproj/Credits.rtf:
--------------------------------------------------------------------------------
1 | {\rtf0\ansi{\fonttbl\f0\fswiss Helvetica;}
2 | {\colortbl;\red255\green255\blue255;}
3 | \paperw9840\paperh8400
4 | \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural
5 |
6 | \f0\b\fs24 \cf0 Engineering:
7 | \b0 \
8 | Some people\
9 | \
10 |
11 | \b Human Interface Design:
12 | \b0 \
13 | Some other people\
14 | \
15 |
16 | \b Testing:
17 | \b0 \
18 | Hopefully not nobody\
19 | \
20 |
21 | \b Documentation:
22 | \b0 \
23 | Whoever\
24 | \
25 |
26 | \b With special thanks to:
27 | \b0 \
28 | Mom\
29 | }
30 |
--------------------------------------------------------------------------------
/PI Emoji Picker.xcodeproj/xcuserdata/akac.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
8 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/PI Emoji Picker/PIEmojiViewController.m:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiViewController.m
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/29/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import "PIEmojiViewController.h"
10 |
11 | @interface PIEmojiViewController ()
12 | @end
13 |
14 | @implementation PIEmojiViewController
15 |
16 | - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
17 | {
18 | self = [super initWithNibName:@"EmojiView" bundle:nil];
19 | if (self) {
20 | }
21 | return self;
22 | }
23 |
24 | -(void)setDelegate:(id)delegate
25 | {
26 | PIEmojiKeyboardView* emojiKeyboardView = (PIEmojiKeyboardView*)self.view;
27 | emojiKeyboardView.delegate = delegate;
28 | }
29 |
30 | @end
31 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/NSImage+DrawAsTemplate.h:
--------------------------------------------------------------------------------
1 | //
2 | // NSImage+DrawAsTemplate.h
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/10/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | @interface NSImage (DrawAsTemplate)
10 |
11 | /**
12 | * Draws the image as a template similar to the Xcode toolbar controls
13 | * Based on Ole Zorn's Stack Overflow response http://stackoverflow.com/a/7138497/1082395
14 | *
15 | * @param rect the rect that the image will be drawn inside
16 | * @param view the view (usually the controlView) that the image will be drawn inside
17 | * @param highlighted whether the image should be drawn with a blue highlight
18 | * @param enabled whether the image should be drawn as if the control were enabled
19 | */
20 | - (void)drawAsTemplateInRect:(NSRect)rect inView:(NSView *)view highlighted:(BOOL)highlighted enabled:(BOOL)enabled;
21 |
22 | @end
23 |
--------------------------------------------------------------------------------
/Emoji Picker/PIEmojiKeyboardView.h:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiKeyboardView.h
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/30/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol PIEmojiViewDelegate;
12 |
13 |
14 | @interface PIEmojiKeyboardView : NSView
15 | @property (nonatomic, weak) id delegate;
16 | @end
17 |
18 | /**
19 | Protocol to be followed by the delegate of `PIEmojiView`.
20 | */
21 | @protocol PIEmojiViewDelegate
22 |
23 | /**
24 | Delegate method called when user taps an emoji button
25 |
26 | @param emojiKeyBoardView EmojiKeyBoardView object on which user has tapped.
27 |
28 | @param emoji Emoji used by user
29 | */
30 | - (void)emojiKeyDidUseEmoji:(NSString *)emoji;
31 |
32 | /**
33 | Delegate method called when user taps on the backspace button
34 |
35 | @param emojiKeyBoardView EmojiKeyBoardView object on which user has tapped.
36 | */
37 | - (void)emojiKeyBoardViewDidPressBackSpace;
38 |
39 | @end
40 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Web Information Solutions, Inc.
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 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,
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 THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/PI Emoji Picker/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/PI Emoji Picker/PI Emoji Picker-Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | ${EXECUTABLE_NAME}
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | net.webis.${PRODUCT_NAME:rfc1034identifier}
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | ${PRODUCT_NAME}
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleSignature
22 | ????
23 | CFBundleVersion
24 | 1
25 | LSMinimumSystemVersion
26 | ${MACOSX_DEPLOYMENT_TARGET}
27 | NSHumanReadableCopyright
28 | Copyright © 2014 Web Information Solutions, Inc. All rights reserved.
29 | NSMainNibFile
30 | MainMenu
31 | NSPrincipalClass
32 | NSApplication
33 |
34 |
35 |
--------------------------------------------------------------------------------
/PI Emoji Picker/PIAppDelegate.m:
--------------------------------------------------------------------------------
1 | //
2 | // PIAppDelegate.m
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/29/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import "PIAppDelegate.h"
10 | #import "PIEmojiViewController.h"
11 |
12 | @interface PIAppDelegate ()
13 | @property (weak) IBOutlet NSTextField *textField;
14 |
15 | @end
16 |
17 | @implementation PIAppDelegate
18 |
19 | - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
20 | {
21 | // Insert code here to initialize your application
22 | }
23 |
24 | - (IBAction)openEmojiPicker:(NSButton *)sender {
25 | PIEmojiViewController* emojiVC = [[PIEmojiViewController alloc] initWithNibName:nil bundle:nil];
26 | emojiVC.delegate = self;
27 |
28 | NSPopover* popover = [[NSPopover alloc] init];
29 | popover.contentViewController = emojiVC;
30 | [popover showRelativeToRect:sender.bounds
31 | ofView:sender
32 | preferredEdge:NSMinXEdge | NSMinYEdge];
33 | }
34 |
35 | -(void)emojiKeyDidUseEmoji:(NSString *)emoji
36 | {
37 | NSString* oldString = self.textField.stringValue;
38 | self.textField.stringValue = [oldString stringByAppendingString:emoji];
39 | }
40 |
41 | -(void)emojiKeyBoardViewDidPressBackSpace
42 | {
43 | NSString* oldString = self.textField.stringValue;
44 | if (oldString.length)
45 | {
46 | NSUInteger lastCharIndex = [oldString length] - 1; // I assume string is not empty
47 | NSRange rangeOfLastChar = [oldString rangeOfComposedCharacterSequenceAtIndex: lastCharIndex];
48 | self.textField.stringValue = [oldString substringToIndex: rangeOfLastChar.location];
49 | }
50 | }
51 |
52 | @end
53 |
--------------------------------------------------------------------------------
/Emoji Picker/PIEmojiPageView.h:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiPageView.h
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/30/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import
10 |
11 | @protocol PIEmojiPageViewDelegate;
12 |
13 |
14 | @interface PIEmojiPageView : NSView
15 | @property (nonatomic, assign) id delegate;
16 |
17 | /**
18 | Creates and returns an EmojiPageView
19 |
20 | @param backSpaceButtonImage Imge to be used to present the back space button.
21 | @param buttonsSize Size for the button representing a single emoji
22 | @param rows Number of rows in a single EmojiPageView
23 | @param columns Number of columns in a single EmojiPageView. Also represents the number of emojis shown in a row.
24 |
25 | @return An instance of EmojiPageView
26 | */
27 | - (id)initWithFrame:(NSRect)frame
28 | buttonSize:(NSSize)buttonSize
29 | rows:(NSUInteger)rows
30 | columns:(NSUInteger)columns;
31 |
32 | /**
33 | Sets texts on buttons in the EmojiPageView.
34 |
35 | @param buttonTexts An array of texts to be set on buttons in EmojiPageView
36 | */
37 | - (void)setButtonTexts:(NSMutableArray *)buttonTexts;
38 |
39 | @end
40 |
41 | @protocol PIEmojiPageViewDelegate
42 |
43 | /**
44 | Delegate method called when user taps an emoji button
45 | @param emojiPageView EmojiPageView object on which user has tapped.
46 | @param emoji Emoji pressed by user
47 | */
48 | - (void)emojiPageView:(PIEmojiPageView *)emojiPageView didUseEmoji:(NSString *)emoji;
49 |
50 | /**
51 | Delegate method called when user taps on the backspace button
52 | @param emojiPageView EmojiPageView object on which user has tapped.
53 | */
54 | - (void)emojiPageViewDidPressBackSpace:(PIEmojiPageView *)emojiPageView;
55 |
56 | @end
57 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedControl.m:
--------------------------------------------------------------------------------
1 | //
2 | // RPBorderlessSegmentedControl.m
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/10/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | #import "RPBorderlessSegmentedControl.h"
10 | #import "RPBorderlessSegmentedCell.h"
11 |
12 | @implementation RPBorderlessSegmentedControl
13 |
14 | + (Class)cellClass {
15 | return [RPBorderlessSegmentedCell class];
16 | }
17 |
18 | - (id)initWithFrame:(NSRect)frameRect {
19 | self = [super initWithFrame:frameRect];
20 | if (self) {
21 | [self setWantsLayer:YES];
22 | }
23 | return self;
24 | }
25 |
26 | - (id)initWithCoder:(NSCoder *)aDecoder {
27 | if (![aDecoder isKindOfClass:[NSKeyedUnarchiver class]]) {
28 | return [super initWithCoder:aDecoder];
29 | }
30 |
31 | NSKeyedUnarchiver *unarchiver = (NSKeyedUnarchiver *)aDecoder;
32 | Class oldClass = [[self superclass] cellClass];
33 | Class newClass = [[self class] cellClass];
34 |
35 | [unarchiver setClass:newClass forClassName:NSStringFromClass(oldClass)];
36 | self = [super initWithCoder:aDecoder];
37 | [unarchiver setClass:oldClass forClassName:NSStringFromClass(oldClass)];
38 |
39 | return self;
40 | }
41 |
42 | - (void)awakeFromNib {
43 | [super awakeFromNib];
44 | [self setWantsLayer:YES];
45 | }
46 |
47 | - (void)drawRect:(NSRect)rect {
48 | CGFloat segmentWidth = rect.size.width / [self segmentCount];
49 | CGFloat segmentHeight = rect.size.height - 1;
50 | NSRect segmentRect = NSMakeRect(0, 0, segmentWidth, segmentHeight);
51 |
52 | for (NSInteger segmentIndex = 0; segmentIndex < [self segmentCount]; segmentIndex += 1) {
53 | [(NSSegmentedCell *)self.cell drawSegment:segmentIndex inFrame:segmentRect withView:self];
54 | segmentRect.origin.x += segmentWidth;
55 | }
56 | }
57 |
58 | @end
59 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/RPBorderlessSegmentedCell.m:
--------------------------------------------------------------------------------
1 | //
2 | // RPBorderlessSegmentedCell.m
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/11/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | #import "RPBorderlessSegmentedCell.h"
10 | #import "NSImage+DrawAsTemplate.h"
11 |
12 | @implementation RPBorderlessSegmentedCell
13 |
14 | - (void)drawSegment:(NSInteger)segment inFrame:(NSRect)frame withView:(NSView *)controlView {
15 | CGFloat alpha;
16 |
17 | if ([[controlView window] isKeyWindow]) {
18 | alpha = 0.5;
19 | }
20 | else {
21 | alpha = 0.2;
22 | }
23 |
24 | NSImage *image = [self imageForSegment:segment];
25 | if (image) {
26 | [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
27 | [self drawCenteredImage:image inFrame:frame alpha:alpha selected:[self isSelectedForSegment:segment] enabled:[(NSControl *)controlView isEnabled]];
28 | }
29 | }
30 |
31 | - (void)drawCenteredImage:(NSImage*)image inFrame:(NSRect)frame alpha:(CGFloat)alpha selected:(BOOL)selected enabled:(BOOL)enabled {
32 | double sourceRatio = image.size.width / image.size.height;
33 | double targetRatio = NSWidth(frame) / NSHeight(frame);
34 |
35 | NSSize finalSize;
36 | if (sourceRatio > targetRatio) {
37 | finalSize = NSMakeSize(NSWidth(frame), NSWidth(frame) / sourceRatio);
38 | }
39 | else {
40 | finalSize = NSMakeSize(NSHeight(frame) * sourceRatio, NSHeight(frame));
41 | }
42 |
43 | CGFloat x = frame.origin.x + (frame.size.width - finalSize.width) / 2.0;
44 | CGFloat y = frame.origin.y + (frame.size.height - finalSize.height) / 2.0;
45 |
46 | CGRect rect = CGRectIntegral(NSMakeRect(x, y + 1, finalSize.width, finalSize.height));
47 | [image drawAsTemplateInRect:rect inView:self.controlView highlighted:selected enabled:enabled];
48 | }
49 |
50 | @end
51 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | PI_EmojiPicker
2 | ==============
3 |
4 | Simple NSView or NSViewController based picker for Emoji.
5 |
6 | I took the wonderful work of AGEmojiKeyboard (https://github.com/ayushgoel/iOS-emoji-keyboard) as a base to create an OS X version.
7 |
8 | Its extremely simple and worth a couple hours of work. Its useful if you want to allow a user to enter Emoji without having to use the "special keyboard" in the edit menu.
9 |
10 | An example would be like Messages/iChat which has a smiley face picker next to the text entry.
11 |
12 | 
13 |
14 | ## Installation
15 |
16 | Copy the files in Emoji Picker into your project and look at the PI Emoji Picker folder to see how the classes are used for more detail.
17 |
18 | ## Usage
19 |
20 | The example file uses a simple NSViewController subclass to show the Emoji picker within an NSPopover:
21 |
22 | ```objective-c
23 | @interface PIEmojiViewController : NSViewController
24 | @property (nonatomic, weak) id delegate;
25 |
26 | @end
27 |
28 | - (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
29 | {
30 | self = [super initWithNibName:@"EmojiView" bundle:nil];
31 | if (self) {
32 | }
33 | return self;
34 | }
35 |
36 | -(void)setDelegate:(id)delegate
37 | {
38 | PIEmojiKeyboardView* emojiKeyboardView = (PIEmojiKeyboardView*)self.view;
39 | emojiKeyboardView.delegate = delegate;
40 | }
41 |
42 | ```
43 |
44 | Implement two delegate methods:
45 |
46 | ```objective-c
47 | -(void)emojiKeyDidUseEmoji:(NSString *)emoji
48 | {
49 | }
50 |
51 | -(void)emojiKeyBoardViewDidPressBackSpace
52 | {
53 | }
54 | ```
55 |
56 | ## Requirements
57 |
58 | Written and tested only on 10.9 Mavericks, with Xcode 5.11, and using ARC
59 |
60 | ## Author
61 |
62 | PI_EmojiPicker is authored by Alex Kac
63 |
64 | AGEmojiKeyboard is authored by Ayush Goel, ayushgoel111@gmail.com
65 |
66 | ## License
67 |
68 | PI_EmojiPicker is available under the MIT license. See the LICENSE file for more info.
69 |
70 |
--------------------------------------------------------------------------------
/Emoji Picker/RPBorderlessSegmented/NSImage+DrawAsTemplate.m:
--------------------------------------------------------------------------------
1 | //
2 | // NSImage+DrawAsTemplate.m
3 | // RPBorderlessSegmentedControlDemo
4 | //
5 | // Created by Brandon Evans on 2/10/2014.
6 | // Copyright (c) 2014 Robots and Pencils. All rights reserved.
7 | //
8 |
9 | #import "NSImage+DrawAsTemplate.h"
10 |
11 | @implementation NSImage (DrawAsTemplate)
12 |
13 | - (void)drawAsTemplateInRect:(NSRect)rect inView:(NSView *)view highlighted:(BOOL)highlighted enabled:(BOOL)enabled {
14 | CGFloat dropShadowOffsetY = -1.0;
15 | CGFloat innerShadowBlurRadius = 1.0;
16 |
17 | NSGraphicsContext *graphicsContext = [NSGraphicsContext currentContext];
18 | CGContextRef context = [graphicsContext graphicsPort];
19 |
20 | [graphicsContext saveGraphicsState];
21 |
22 | CGRect deviceRect = CGContextConvertRectToDeviceSpace(context, rect);
23 | CGFloat scale = CGRectGetHeight(deviceRect) / CGRectGetHeight(rect);
24 |
25 | if ([graphicsContext isFlipped]) {
26 | CGContextTranslateCTM(context, 0.0f, CGRectGetHeight(view.frame));
27 | CGContextScaleCTM(context, 1.0f, -1.0f);
28 | }
29 |
30 | // Create mask image
31 | NSRect maskRect = rect;
32 | CGImageRef maskImage = [self CGImageForProposedRect:&maskRect context:graphicsContext hints:nil];
33 |
34 | // Draw image and white drop shadow
35 | CGContextSetShadowWithColor(context, CGSizeMake(0, dropShadowOffsetY), 0, CGColorGetConstantColor(kCGColorWhite));
36 | [self drawInRect:maskRect fromRect:NSMakeRect(0, 0, self.size.width, self.size.height) operation:NSCompositeSourceOver fraction:0.5];
37 |
38 | // Clip drawing to mask
39 | CGContextClipToMask(context, NSRectToCGRect(maskRect), maskImage);
40 |
41 | // Draw gradient
42 | NSColor *startColor;
43 | NSColor *endColor;
44 | if (highlighted) {
45 | startColor = [NSColor colorWithCalibratedRed:0.0 green:0.55 blue:0.98 alpha:1.0];
46 | endColor = [NSColor colorWithCalibratedRed:0.0 green:0.15 blue:0.75 alpha:1.0];
47 | }
48 | else {
49 | startColor = [NSColor colorWithDeviceWhite:0.33 alpha:1.0];
50 | endColor = [NSColor colorWithDeviceWhite:0.46 alpha:1.0];
51 | }
52 | if (!enabled) {
53 | startColor = [startColor colorWithAlphaComponent:0.5];
54 | endColor = [endColor colorWithAlphaComponent:0.5];
55 | }
56 | NSGradient *gradient = [[NSGradient alloc] initWithStartingColor:startColor endingColor:endColor];
57 | [gradient drawInRect:maskRect angle:90.0];
58 |
59 | // Draw inner shadow with inverted mask
60 | CGContextSetShadowWithColor(context, CGSizeMake(0, -1), innerShadowBlurRadius, [[NSColor colorWithCalibratedWhite:0.1 alpha:0.75] CGColor]);
61 | CGRect cgRect = CGRectMake( 0, 0, maskRect.size.width * scale, maskRect.size.height * scale);
62 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
63 | CGContextRef maskContext = CGBitmapContextCreate(NULL, deviceRect.size.width, deviceRect.size.height, 8, 0, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
64 | CGColorSpaceRelease(colorSpace);
65 | CGContextSetBlendMode(maskContext, kCGBlendModeXOR);
66 | CGContextDrawImage(maskContext, cgRect, maskImage);
67 | CGContextSetRGBFillColor(maskContext, 1.0, 1.0, 1.0, 1.0);
68 | CGContextFillRect(maskContext, cgRect);
69 | CGImageRef invertedMaskImage = CGBitmapContextCreateImage(maskContext);
70 |
71 | CGContextDrawImage(context, maskRect, invertedMaskImage);
72 |
73 | CGImageRelease(invertedMaskImage);
74 | CGContextRelease(maskContext);
75 |
76 | [graphicsContext restoreGraphicsState];
77 | }
78 |
79 | @end
80 |
--------------------------------------------------------------------------------
/PI Emoji Picker.xcodeproj/xcuserdata/akac.xcuserdatad/xcschemes/PI Emoji Picker.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
61 |
62 |
68 |
69 |
70 |
71 |
72 |
73 |
79 |
80 |
86 |
87 |
88 |
89 |
91 |
92 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/Emoji Picker/PIEmojiPageView.m:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiPageView.m
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/30/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import "PIEmojiPageView.h"
10 |
11 | #define BACKSPACE_BUTTON_TAG 10
12 | #define BUTTON_FONT_SIZE 32
13 |
14 | @interface PIEmojiPageView ()
15 |
16 | @property (nonatomic, assign) NSSize buttonSize;
17 | @property (nonatomic, retain) NSMutableArray *buttons;
18 | @property (nonatomic, assign) NSUInteger columns;
19 | @property (nonatomic, assign) NSUInteger rows;
20 |
21 | @end
22 |
23 |
24 | @implementation PIEmojiPageView
25 |
26 | - (void)drawRect:(NSRect)dirtyRect
27 | {
28 | [super drawRect:dirtyRect];
29 |
30 | // [[NSColor redColor] setFill];
31 | // NSRectFill(dirtyRect);
32 | }
33 |
34 | @synthesize buttonSize = buttonSize_;
35 | @synthesize buttons = buttons_;
36 | @synthesize columns = columns_;
37 | @synthesize rows = rows_;
38 | @synthesize delegate = delegate_;
39 |
40 | -(BOOL)isFlipped
41 | {
42 | return YES;
43 | }
44 |
45 | - (void)setButtonTexts:(NSMutableArray *)buttonTexts {
46 | NSAssert(buttonTexts != nil, @"Array containing texts to be set on buttons is nil");
47 |
48 | if (([self.buttons count] - 1) == [buttonTexts count]) {
49 | // just reset text on each button
50 |
51 | [buttonTexts enumerateObjectsUsingBlock:^(NSString* title, NSUInteger idx, BOOL *stop) {
52 | ((NSButton*)(self.buttons[idx])).title = title;
53 | }];
54 | } else {
55 | [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
56 | self.buttons = nil;
57 | self.buttons = [NSMutableArray arrayWithCapacity:self.rows * self.columns];
58 |
59 | for (NSUInteger i = 0; i < [buttonTexts count]; ++i) {
60 | NSButton *button = [self createButtonAtIndex:i];
61 | [button setTitle:buttonTexts[i]];
62 | [self addToViewButton:button];
63 | }
64 |
65 | NSButton *button = [self createButtonAtIndex:self.rows * self.columns - 1];
66 | [button setImage:[NSImage imageNamed:@"backspace_n"]];
67 | button.tag = BACKSPACE_BUTTON_TAG;
68 | [self addToViewButton:button];
69 | }
70 | }
71 |
72 | - (void)addToViewButton:(NSButton *)button {
73 |
74 | NSAssert(button != nil, @"Button to be added is nil");
75 |
76 | [self.buttons addObject:button];
77 | [self addSubview:button];
78 | }
79 |
80 | // Padding is the expected space between two buttons.
81 | // Thus, space of top button = padding / 2
82 | // extra padding according to particular button's pos = pos * padding
83 | // Margin includes, size of buttons in between = pos * buttonSize
84 | // Thus, margin = padding / 2
85 | // + pos * padding
86 | // + pos * buttonSize
87 |
88 | - (CGFloat)XMarginForButtonInColumn:(NSInteger)column {
89 | CGFloat padding = ((CGRectGetWidth(self.bounds) - self.columns * self.buttonSize.width) / self.columns);
90 | return (padding / 2 + column * (padding + self.buttonSize.width));
91 | }
92 |
93 | - (CGFloat)YMarginForButtonInRow:(NSInteger)rowNumber {
94 | CGFloat padding = ((CGRectGetHeight(self.bounds) - self.rows * self.buttonSize.height) / self.rows);
95 | return (padding / 2 + rowNumber * (padding + self.buttonSize.height));
96 | }
97 |
98 | - (NSButton *)createButtonAtIndex:(NSUInteger)index {
99 | NSButton *button = [[NSButton alloc] initWithFrame: NSZeroRect];
100 | [button setButtonType: NSMomentaryLightButton];
101 | [button setBezelStyle: NSRoundedDisclosureBezelStyle];
102 | [button setBordered: NO];
103 | [button setTarget: self];
104 | [button setAction: @selector(emojiButtonPressed:)];
105 | [button.cell setImageScaling:NSImageScaleProportionallyDown];
106 |
107 | button.font = [NSFont fontWithName:@"Apple color emoji" size:BUTTON_FONT_SIZE];
108 | NSInteger row = (NSInteger)(index / self.columns);
109 | NSInteger column = (NSInteger)(index % self.columns);
110 | button.frame = CGRectIntegral(CGRectMake([self XMarginForButtonInColumn:column],
111 | [self YMarginForButtonInRow:row],
112 | self.buttonSize.width,
113 | self.buttonSize.height));
114 | return button;
115 | }
116 |
117 | - (id)initWithFrame:(NSRect)frame buttonSize:(NSSize)buttonSize rows:(NSUInteger)rows columns:(NSUInteger)columns {
118 | self = [super initWithFrame:frame];
119 | if (self) {
120 | self.buttonSize = buttonSize;
121 | self.columns = columns;
122 | self.rows = rows;
123 | self.buttons = [[NSMutableArray alloc] initWithCapacity:self.rows * columns];
124 | }
125 | return self;
126 | }
127 |
128 | - (void)emojiButtonPressed:(NSButton *)button {
129 | if (button.tag == BACKSPACE_BUTTON_TAG) {
130 | [self.delegate emojiPageViewDidPressBackSpace:self];
131 | return;
132 | }
133 | [self.delegate emojiPageView:self didUseEmoji: button.title];
134 | }
135 |
136 | - (void)dealloc {
137 | self.buttons = nil;
138 | }
139 |
140 |
141 | @end
142 |
--------------------------------------------------------------------------------
/Emoji Picker/EmojiView.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/Emoji Picker/PIEmojiKeyboardView.m:
--------------------------------------------------------------------------------
1 | //
2 | // PIEmojiKeyboardView.m
3 | // PI Emoji Picker
4 | //
5 | // Created by Alex Kac on 5/30/14.
6 | // Copyright (c) 2014 Web Information Solutions, Inc. All rights reserved.
7 | //
8 |
9 | #import "PIEmojiKeyboardView.h"
10 | #import "PIEmojiPageView.h"
11 |
12 | static const CGFloat ButtonWidth = 45;
13 | static const CGFloat ButtonHeight = 37;
14 |
15 | #define RECENT_EMOJIS_MAINTAINED_COUNT 50
16 | #define DEFAULT_SELECTED_SEGMENT 0
17 |
18 | static NSString *const segmentRecentName = @"Recent";
19 | NSString *const RecentUsedEmojiCharactersKey = @"RecentUsedEmojiCharactersKey";
20 |
21 | @interface PIEmojiKeyboardView ()
22 | @property (nonatomic) NSDictionary *emojis;
23 | @property (weak) IBOutlet NSSegmentedControl *segmentsBar;
24 | @property (weak) IBOutlet NSScrollView *scrollView;
25 | @property (nonatomic) NSString *category;
26 | @end
27 |
28 |
29 | @implementation PIEmojiKeyboardView
30 |
31 | - (id)initWithFrame:(NSRect)frame
32 | {
33 | self = [super initWithFrame:frame];
34 | if (self) {
35 | self.category = segmentRecentName;
36 | }
37 | return self;
38 | }
39 |
40 | - (instancetype)initWithCoder:(NSCoder *)coder
41 | {
42 | self = [super initWithCoder:coder];
43 | if (self) {
44 | self.category = segmentRecentName;
45 | }
46 | return self;
47 | }
48 |
49 | - (NSDictionary *)emojis {
50 | if (!_emojis) {
51 | NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"EmojisList"
52 | ofType:@"plist"];
53 | _emojis = [[NSDictionary dictionaryWithContentsOfFile:plistPath] copy];
54 | }
55 | return _emojis;
56 | }
57 |
58 | // recent emojis are backed in NSUserDefaults to save them across app restarts.
59 | - (NSMutableArray *)recentEmojis {
60 | NSArray *emojis = [[NSUserDefaults standardUserDefaults] arrayForKey:RecentUsedEmojiCharactersKey];
61 | NSMutableArray *recentEmojis = [emojis mutableCopy];
62 | if (recentEmojis == nil) {
63 | recentEmojis = [NSMutableArray array];
64 | }
65 | return recentEmojis;
66 | }
67 |
68 | - (void)setRecentEmojis:(NSMutableArray *)recentEmojis {
69 | // remove emojis if they cross the cache maintained limit
70 | if ([recentEmojis count] > RECENT_EMOJIS_MAINTAINED_COUNT) {
71 | NSIndexSet *indexesToBeRemoved = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(RECENT_EMOJIS_MAINTAINED_COUNT, [recentEmojis count] - RECENT_EMOJIS_MAINTAINED_COUNT)];
72 | [recentEmojis removeObjectsAtIndexes:indexesToBeRemoved];
73 | }
74 | [[NSUserDefaults standardUserDefaults] setObject:recentEmojis forKey:RecentUsedEmojiCharactersKey];
75 | }
76 |
77 | - (NSArray*)imagesForSelectedSegments
78 | {
79 | return @[[NSImage imageNamed:@"recent_n"],
80 | [NSImage imageNamed:@"face_n"],
81 | [NSImage imageNamed:@"bell_n"],
82 | [NSImage imageNamed:@"flower_n"],
83 | [NSImage imageNamed:@"car_n"],
84 | [NSImage imageNamed:@"characters_n"]];
85 | }
86 |
87 | - (void)_setupSegmentedControl
88 | {
89 | NSArray* images = self.imagesForSelectedSegments;
90 | [self.segmentsBar setSegmentCount:images.count];
91 |
92 | [images enumerateObjectsUsingBlock:^(NSImage* image, NSUInteger idx, BOOL *stop) {
93 | NSSegmentedCell* cell = [self.segmentsBar cell];
94 | [cell setImage:image forSegment:idx];
95 | [cell setTag:idx forSegment:idx];
96 | }];
97 |
98 | [self setSelectedCategoryImageInSegmentControl:self.segmentsBar AtIndex:DEFAULT_SELECTED_SEGMENT];
99 | self.segmentsBar.selectedSegment = DEFAULT_SELECTED_SEGMENT;
100 |
101 | [self.segmentsBar setFocusRingType:NSFocusRingTypeNone];
102 | }
103 |
104 | -(void)layout
105 | {
106 | [super layout];
107 |
108 | CGFloat width = self.bounds.size.width/self.segmentsBar.segmentCount;
109 | for (int index = 0; index < self.segmentsBar.segmentCount; ++index)
110 | [self.segmentsBar setWidth:width forSegment:index];
111 | }
112 |
113 | -(void)awakeFromNib
114 | {
115 | [self _setupSegmentedControl];
116 | [self setCurrentEmojiPageView];
117 | }
118 |
119 | #pragma mark event handlers
120 |
121 | - (void)setSelectedCategoryImageInSegmentControl:(NSSegmentedControl *)segmentsBar AtIndex:(NSInteger)index {
122 | NSArray *imagesNamesForSelectedSegments = @[@"recent_s",
123 | @"face_s",
124 | @"bell_s",
125 | @"flower_s",
126 | @"car_s",
127 | @"characters_s"];
128 | NSArray *imagesForNonSelectedSegments = @[[NSImage imageNamed:@"recent_n"],
129 | [NSImage imageNamed:@"face_n"],
130 | [NSImage imageNamed:@"bell_n"],
131 | [NSImage imageNamed:@"flower_n"],
132 | [NSImage imageNamed:@"car_n"],
133 | [NSImage imageNamed:@"characters_n"]];
134 |
135 | for (int i=0; i < segmentsBar.segmentCount; ++i) {
136 | [[segmentsBar cell] setImage:imagesForNonSelectedSegments[i] forSegment:i];
137 | }
138 |
139 | NSImage* selectedImage = [NSImage imageNamed: imagesNamesForSelectedSegments[index] ];
140 | [[segmentsBar cell] setImage:selectedImage forSegment:index];
141 | }
142 |
143 | - (IBAction)categoryChangedViaSegmentsBar:(NSSegmentedControl *)sender {
144 | // recalculate number of pages for new category and recreate emoji pages
145 | NSArray *categoryList = @[segmentRecentName, @"People", @"Objects", @"Nature", @"Places", @"Symbols"];
146 |
147 | self.category = categoryList[sender.selectedSegment];
148 |
149 | [self setSelectedCategoryImageInSegmentControl:sender AtIndex:sender.selectedSegment];
150 |
151 | [self setCurrentEmojiPageView];
152 | }
153 |
154 | // Set emoji page view for given index.
155 | - (void)setCurrentEmojiPageView {
156 | NSMutableArray *buttonTexts = [self emojiTextsForCategory:self.category];
157 | NSUInteger columns = [self numberOfColumnsForFrameSize:self.scrollView.bounds.size];
158 | NSUInteger rows = ceil(buttonTexts.count / columns) + 1;
159 |
160 | //set the height of this now
161 | NSRect thisBounds = self.scrollView.bounds;
162 | thisBounds.size.height = rows * ButtonHeight;
163 |
164 | PIEmojiPageView *pageView = [[PIEmojiPageView alloc] initWithFrame:thisBounds
165 | buttonSize:CGSizeMake(ButtonWidth, ButtonHeight)
166 | rows:rows
167 | columns:columns];
168 | [pageView setButtonTexts:buttonTexts];
169 | pageView.delegate = self;
170 |
171 | [self.scrollView setDocumentView:pageView];
172 | }
173 |
174 | #pragma mark data methods
175 |
176 | - (NSUInteger)numberOfColumnsForFrameSize:(CGSize)frameSize {
177 | return (NSUInteger)floor(frameSize.width / ButtonWidth);
178 | }
179 |
180 | - (NSArray *)emojiListForCategory:(NSString *)category {
181 | if ([category isEqualToString:segmentRecentName]) {
182 | return [self recentEmojis];
183 | }
184 | return [self.emojis objectForKey:category];
185 | }
186 |
187 | // return the emojis for a category, given a staring and an ending index
188 | - (NSMutableArray *)emojiTextsForCategory:(NSString *)category
189 | {
190 | NSArray *emojis = [self emojiListForCategory:category];
191 | return [emojis mutableCopy];
192 | }
193 |
194 | #pragma mark EmojiPageViewDelegate
195 |
196 | - (void)setInRecentsEmoji:(NSString *)emoji {
197 | NSAssert(emoji != nil, @"Emoji can't be nil");
198 |
199 | NSMutableArray *recentEmojis = [self recentEmojis];
200 | for (int i = 0; i < [recentEmojis count]; ++i) {
201 | if ([recentEmojis[i] isEqualToString:emoji]) {
202 | [recentEmojis removeObjectAtIndex:i];
203 | }
204 | }
205 | [recentEmojis insertObject:emoji atIndex:0];
206 | [self setRecentEmojis:recentEmojis];
207 | }
208 |
209 | // add the emoji to recents
210 | - (void)emojiPageView:(PIEmojiPageView *)emojiPageView didUseEmoji:(NSString *)emoji {
211 | [self setInRecentsEmoji:emoji];
212 | [self.delegate emojiKeyDidUseEmoji:emoji];
213 | }
214 |
215 | - (void)emojiPageViewDidPressBackSpace:(PIEmojiPageView *)emojiPageView {
216 | NSLog(@"Back button pressed");
217 | [self.delegate emojiKeyBoardViewDidPressBackSpace];
218 | }
219 |
220 |
221 |
222 | @end
223 |
--------------------------------------------------------------------------------
/Emoji Picker/EmojisList.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Nature
6 |
7 | 🐶
8 | 🐺
9 | 🐱
10 | 🐭
11 | 🐹
12 | 🐰
13 | 🐸
14 | 🐯
15 | 🐨
16 | 🐻
17 | 🐷
18 | 🐽
19 | 🐮
20 | 🐗
21 | 🐵
22 | 🐒
23 | 🐴
24 | 🐑
25 | 🐘
26 | 🐼
27 | 🐧
28 | 🐦
29 | 🐤
30 | 🐥
31 | 🐣
32 | 🐔
33 | 🐍
34 | 🐢
35 | 🐛
36 | 🐝
37 | 🐜
38 | 🐞
39 | 🐌
40 | 🐙
41 | 🐚
42 | 🐠
43 | 🐟
44 | 🐬
45 | 🐳
46 | 🐋
47 | 🐄
48 | 🐏
49 | 🐀
50 | 🐃
51 | 🐅
52 | 🐇
53 | 🐉
54 | 🐎
55 | 🐐
56 | 🐓
57 | 🐕
58 | 🐖
59 | 🐁
60 | 🐂
61 | 🐲
62 | 🐡
63 | 🐊
64 | 🐫
65 | 🐪
66 | 🐆
67 | 🐈
68 | 🐩
69 | 🐾
70 | 💐
71 | 🌸
72 | 🌷
73 | 🍀
74 | 🌹
75 | 🌻
76 | 🌺
77 | 🍁
78 | 🍃
79 | 🍂
80 | 🌿
81 | 🌾
82 | 🍄
83 | 🌵
84 | 🌴
85 | 🌲
86 | 🌳
87 | 🌰
88 | 🌱
89 | 🌼
90 | 🌐
91 | 🌞
92 | 🌝
93 | 🌚
94 | 🌑
95 | 🌒
96 | 🌓
97 | 🌔
98 | 🌕
99 | 🌖
100 | 🌗
101 | 🌘
102 | 🌜
103 | 🌛
104 | 🌙
105 | 🌍
106 | 🌎
107 | 🌏
108 | 🌋
109 | 🌌
110 | 🌠
111 | ⭐
112 | ☀
113 | ⛅
114 | ☁
115 | ⚡
116 | ☔
117 | ❄
118 | ⛄
119 | 🌀
120 | 🌁
121 | 🌈
122 | 🌊
123 |
124 | Objects
125 |
126 | 🎍
127 | 💝
128 | 🎎
129 | 🎒
130 | 🎓
131 | 🎏
132 | 🎆
133 | 🎇
134 | 🎐
135 | 🎑
136 | 🎃
137 | 👻
138 | 🎅
139 | 🎄
140 | 🎁
141 | 🎋
142 | 🎉
143 | 🎊
144 | 🎈
145 | 🎌
146 | 🔮
147 | 🎥
148 | 📷
149 | 📹
150 | 📼
151 | 💿
152 | 📀
153 | 💽
154 | 💾
155 | 💻
156 | 📱
157 | ☎
158 | 📞
159 | 📟
160 | 📠
161 | 📡
162 | 📺
163 | 📻
164 | 🔊
165 | 🔉
166 | 🔈
167 | 🔇
168 | 🔔
169 | 🔕
170 | 📢
171 | 📣
172 | ⏳
173 | ⌛
174 | ⏰
175 | ⌚
176 | 🔓
177 | 🔒
178 | 🔏
179 | 🔐
180 | 🔑
181 | 🔎
182 | 💡
183 | 🔦
184 | 🔆
185 | 🔅
186 | 🔌
187 | 🔋
188 | 🔍
189 | 🛁
190 | 🛀
191 | 🚿
192 | 🚽
193 | 🔧
194 | 🔩
195 | 🔨
196 | 🚪
197 | 🚬
198 | 💣
199 | 🔫
200 | 🔪
201 | 💊
202 | 💉
203 | 💰
204 | 💴
205 | 💵
206 | 💷
207 | 💶
208 | 💳
209 | 💸
210 | 📲
211 | 📧
212 | 📥
213 | 📤
214 | ✉
215 | 📩
216 | 📨
217 | 📯
218 | 📫
219 | 📪
220 | 📬
221 | 📭
222 | 📮
223 | 📦
224 | 📝
225 | 📄
226 | 📃
227 | 📑
228 | 📊
229 | 📈
230 | 📉
231 | 📜
232 | 📋
233 | 📅
234 | 📆
235 | 📇
236 | 📁
237 | 📂
238 | ✂
239 | 📌
240 | 📎
241 | ✒
242 | ✏
243 | 📏
244 | 📐
245 | 📕
246 | 📗
247 | 📘
248 | 📙
249 | 📓
250 | 📔
251 | 📒
252 | 📚
253 | 📖
254 | 🔖
255 | 📛
256 | 🔬
257 | 🔭
258 | 📰
259 | 🎨
260 | 🎬
261 | 🎤
262 | 🎧
263 | 🎼
264 | 🎵
265 | 🎶
266 | 🎹
267 | 🎻
268 | 🎺
269 | 🎷
270 | 🎸
271 | 👾
272 | 🎮
273 | 🃏
274 | 🎴
275 | 🀄
276 | 🎲
277 | 🎯
278 | 🏈
279 | 🏀
280 | ⚽
281 | ⚾
282 | 🎾
283 | 🎱
284 | 🏉
285 | 🎳
286 | ⛳
287 | 🚵
288 | 🚴
289 | 🏁
290 | 🏇
291 | 🏆
292 | 🎿
293 | 🏂
294 | 🏊
295 | 🏄
296 | 🎣
297 | ☕
298 | 🍵
299 | 🍶
300 | 🍼
301 | 🍺
302 | 🍻
303 | 🍸
304 | 🍹
305 | 🍷
306 | 🍴
307 | 🍕
308 | 🍔
309 | 🍟
310 | 🍗
311 | 🍖
312 | 🍝
313 | 🍛
314 | 🍤
315 | 🍱
316 | 🍣
317 | 🍥
318 | 🍙
319 | 🍘
320 | 🍚
321 | 🍜
322 | 🍲
323 | 🍢
324 | 🍡
325 | 🍳
326 | 🍞
327 | 🍩
328 | 🍮
329 | 🍦
330 | 🍨
331 | 🍧
332 | 🎂
333 | 🍰
334 | 🍪
335 | 🍫
336 | 🍬
337 | 🍭
338 | 🍯
339 | 🍎
340 | 🍏
341 | 🍊
342 | 🍋
343 | 🍒
344 | 🍇
345 | 🍉
346 | 🍓
347 | 🍑
348 | 🍈
349 | 🍌
350 | 🍐
351 | 🍍
352 | 🍠
353 | 🍆
354 | 🍅
355 | 🌽
356 |
357 | People
358 |
359 | 😄
360 | 😃
361 | 😀
362 | 😊
363 | ☺
364 | 😉
365 | 😍
366 | 😘
367 | 😚
368 | 😗
369 | 😙
370 | 😜
371 | 😝
372 | 😛
373 | 😳
374 | 😁
375 | 😔
376 | 😌
377 | 😒
378 | 😞
379 | 😣
380 | 😢
381 | 😂
382 | 😭
383 | 😪
384 | 😥
385 | 😰
386 | 😅
387 | 😓
388 | 😩
389 | 😫
390 | 😨
391 | 😱
392 | 😠
393 | 😡
394 | 😤
395 | 😖
396 | 😆
397 | 😋
398 | 😷
399 | 😎
400 | 😴
401 | 😵
402 | 😲
403 | 😟
404 | 😦
405 | 😧
406 | 😈
407 | 👿
408 | 😮
409 | 😬
410 | 😐
411 | 😕
412 | 😯
413 | 😶
414 | 😇
415 | 😏
416 | 😑
417 | 👲
418 | 👳
419 | 👮
420 | 👷
421 | 💂
422 | 👶
423 | 👦
424 | 👧
425 | 👨
426 | 👩
427 | 👴
428 | 👵
429 | 👱
430 | 👼
431 | 👸
432 | 😺
433 | 😸
434 | 😻
435 | 😽
436 | 😼
437 | 🙀
438 | 😿
439 | 😹
440 | 😾
441 | 👹
442 | 👺
443 | 🙈
444 | 🙉
445 | 🙊
446 | 💀
447 | 👽
448 | 💩
449 | 🔥
450 | ✨
451 | 🌟
452 | 💫
453 | 💥
454 | 💢
455 | 💦
456 | 💧
457 | 💤
458 | 💨
459 | 👂
460 | 👀
461 | 👃
462 | 👅
463 | 👄
464 | 👍
465 | 👎
466 | 👌
467 | 👊
468 | ✊
469 | ✌
470 | 👋
471 | ✋
472 | 👐
473 | 👆
474 | 👇
475 | 👉
476 | 👈
477 | 🙌
478 | 🙏
479 | ☝
480 | 👏
481 | 💪
482 | 🚶
483 | 🏃
484 | 💃
485 | 👫
486 | 👪
487 | 👬
488 | 👭
489 | 💏
490 | 💑
491 | 👯
492 | 🙆
493 | 🙅
494 | 💁
495 | 🙋
496 | 💆
497 | 💇
498 | 💅
499 | 👰
500 | 🙎
501 | 🙍
502 | 🙇
503 | 🎩
504 | 👑
505 | 👒
506 | 👟
507 | 👞
508 | 👡
509 | 👠
510 | 👢
511 | 👕
512 | 👔
513 | 👚
514 | 👗
515 | 🎽
516 | 👖
517 | 👘
518 | 👙
519 | 💼
520 | 👜
521 | 👝
522 | 👛
523 | 👓
524 | 🎀
525 | 🌂
526 | 💄
527 | 💛
528 | 💙
529 | 💜
530 | 💚
531 | ❤
532 | 💔
533 | 💗
534 | 💓
535 | 💕
536 | 💖
537 | 💞
538 | 💘
539 | 💌
540 | 💋
541 | 💍
542 | 💎
543 | 👤
544 | 👥
545 | 💬
546 | 👣
547 | 💭
548 |
549 | Places
550 |
551 | 🏠
552 | 🏡
553 | 🏫
554 | 🏢
555 | 🏣
556 | 🏥
557 | 🏦
558 | 🏪
559 | 🏩
560 | 🏨
561 | 💒
562 | ⛪
563 | 🏬
564 | 🏤
565 | 🌇
566 | 🌆
567 | 🏯
568 | 🏰
569 | ⛺
570 | 🏭
571 | 🗼
572 | 🗾
573 | 🗻
574 | 🌄
575 | 🌅
576 | 🌃
577 | 🗽
578 | 🌉
579 | 🎠
580 | 🎡
581 | ⛲
582 | 🎢
583 | 🚢
584 | ⛵
585 | 🚤
586 | 🚣
587 | ⚓
588 | 🚀
589 | ✈
590 | 💺
591 | 🚁
592 | 🚂
593 | 🚊
594 | 🚉
595 | 🚞
596 | 🚆
597 | 🚄
598 | 🚅
599 | 🚈
600 | 🚇
601 | 🚝
602 | 🚋
603 | 🚃
604 | 🚎
605 | 🚌
606 | 🚍
607 | 🚙
608 | 🚘
609 | 🚗
610 | 🚕
611 | 🚖
612 | 🚛
613 | 🚚
614 | 🚨
615 | 🚓
616 | 🚔
617 | 🚒
618 | 🚑
619 | 🚐
620 | 🚲
621 | 🚡
622 | 🚟
623 | 🚠
624 | 🚜
625 | 💈
626 | 🚏
627 | 🎫
628 | 🚦
629 | 🚥
630 | ⚠
631 | 🚧
632 | 🔰
633 | ⛽
634 | 🏮
635 | 🎰
636 | ♨
637 | 🗿
638 | 🎪
639 | 🎭
640 | 📍
641 | 🚩
642 | 🇯🇵
643 | 🇰🇷
644 | 🇩🇪
645 | 🇨🇳
646 | 🇺🇸
647 | 🇫🇷
648 | 🇪🇸
649 | 🇮🇹
650 | 🇷🇺
651 |
652 | Symbols
653 |
654 | 1⃣
655 | 2⃣
656 | 3⃣
657 | 4⃣
658 | 5⃣
659 | 6⃣
660 | 7⃣
661 | 8⃣
662 | 9⃣
663 | 0⃣
664 | 🔟
665 | 🔢
666 | #⃣
667 | 🔣
668 | ⬆
669 | ⬇
670 | ⬅
671 | ➡
672 | 🔠
673 | 🔡
674 | 🔤
675 | ↗
676 | ↖
677 | ↘
678 | ↙
679 | ↔
680 | ↕
681 | 🔄
682 | ◀
683 | ▶
684 | 🔼
685 | 🔽
686 | ↩
687 | ↪
688 | ℹ
689 | ⏪
690 | ⏩
691 | ⏫
692 | ⏬
693 | ⤵
694 | ⤴
695 | 🆗
696 | 🔀
697 | 🔁
698 | 🔂
699 | 🆕
700 | 🆙
701 | 🆒
702 | 🆓
703 | 🆖
704 | 📶
705 | 🎦
706 | 🈁
707 | 🈯
708 | 🈳
709 | 🈵
710 | 🈴
711 | 🈲
712 | 🉐
713 | 🈹
714 | 🈺
715 | 🈶
716 | 🈚
717 | 🚻
718 | 🚹
719 | 🚺
720 | 🚼
721 | 🚾
722 | 🚰
723 | 🚮
724 | 🅿
725 | ♿
726 | 🚭
727 | 🈷
728 | 🈸
729 | 🈂
730 | Ⓜ
731 | 🛂
732 | 🛄
733 | 🛅
734 | 🛃
735 | 🉑
736 | ㊙
737 | ㊗
738 | 🆑
739 | 🆘
740 | 🆔
741 | 🚫
742 | 🔞
743 | 📵
744 | 🚯
745 | 🚱
746 | 🚳
747 | 🚷
748 | 🚸
749 | ⛔
750 | ✳
751 | ❇
752 | ❎
753 | ✅
754 | ✴
755 | 💟
756 | 🆚
757 | 📳
758 | 📴
759 | 🅰
760 | 🅱
761 | 🆎
762 | 🅾
763 | 💠
764 | ➿
765 | ♻
766 | ♈
767 | ♉
768 | ♊
769 | ♋
770 | ♌
771 | ♍
772 | ♎
773 | ♏
774 | ♐
775 | ♑
776 | ♒
777 | ♓
778 | ⛎
779 | 🔯
780 | 🏧
781 | 💹
782 | 💲
783 | 💱
784 | ©
785 | ®
786 | ™
787 | ❌
788 | ‼
789 | ⁉
790 | ❗
791 | ❓
792 | ❕
793 | ❔
794 | ⭕
795 | 🔝
796 | 🔚
797 | 🔙
798 | 🔛
799 | 🔜
800 | 🔃
801 | 🕛
802 | 🕧
803 | 🕐
804 | 🕜
805 | 🕑
806 | 🕝
807 | 🕒
808 | 🕞
809 | 🕓
810 | 🕟
811 | 🕔
812 | 🕠
813 | 🕕
814 | 🕖
815 | 🕗
816 | 🕘
817 | 🕙
818 | 🕚
819 | 🕡
820 | 🕢
821 | 🕣
822 | 🕤
823 | 🕥
824 | 🕦
825 | ✖
826 | ➕
827 | ➖
828 | ➗
829 | ♠
830 | ♥
831 | ♣
832 | ♦
833 | 💮
834 | 💯
835 | ✔
836 | ☑
837 | 🔘
838 | 🔗
839 | ➰
840 | 〰
841 | 〽
842 | 🔱
843 | ◼
844 | ◻
845 | ◾
846 | ◽
847 | ▪
848 | ▫
849 | 🔺
850 | 🔲
851 | 🔳
852 | ⚫
853 | ⚪
854 | 🔴
855 | 🔵
856 | 🔻
857 | ⬜
858 | ⬛
859 | 🔶
860 | 🔷
861 | 🔸
862 | 🔹
863 |
864 |
865 |
866 |
--------------------------------------------------------------------------------
/PI Emoji Picker.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 4049123A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912391937BBEB0087BC2F /* Cocoa.framework */; };
11 | 404912441937BBEB0087BC2F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 404912421937BBEB0087BC2F /* InfoPlist.strings */; };
12 | 404912461937BBEB0087BC2F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 404912451937BBEB0087BC2F /* main.m */; };
13 | 4049124A1937BBEB0087BC2F /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 404912481937BBEB0087BC2F /* Credits.rtf */; };
14 | 4049124D1937BBEB0087BC2F /* PIAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */; };
15 | 404912501937BBEB0087BC2F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4049124E1937BBEB0087BC2F /* MainMenu.xib */; };
16 | 404912521937BBEB0087BC2F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 404912511937BBEB0087BC2F /* Images.xcassets */; };
17 | 404912591937BBEB0087BC2F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912581937BBEB0087BC2F /* XCTest.framework */; };
18 | 4049125A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 404912391937BBEB0087BC2F /* Cocoa.framework */; };
19 | 4049126F1937F9300087BC2F /* PIEmojiViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4049126E1937F9300087BC2F /* PIEmojiViewController.m */; };
20 | 406D2ACD19399F29002E1413 /* EmojisList.plist in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AC719399F29002E1413 /* EmojisList.plist */; };
21 | 406D2ACE19399F29002E1413 /* EmojiView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AC819399F29002E1413 /* EmojiView.xib */; };
22 | 406D2ACF19399F29002E1413 /* PIEmojiKeyboardView.m in Sources */ = {isa = PBXBuildFile; fileRef = 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */; };
23 | 406D2AD019399F29002E1413 /* PIEmojiPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */; };
24 | 406D2AD219399F42002E1413 /* EmojiView.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 406D2AD119399F42002E1413 /* EmojiView.xcassets */; };
25 | 40CCD348193D8011004A027F /* RPBorderlessSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */; };
26 | 40CCD349193D8011004A027F /* RPBorderlessSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */; };
27 | 40CCD34C193D8052004A027F /* NSImage+DrawAsTemplate.m in Sources */ = {isa = PBXBuildFile; fileRef = 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */; };
28 | /* End PBXBuildFile section */
29 |
30 | /* Begin PBXContainerItemProxy section */
31 | 4049125B1937BBEB0087BC2F /* PBXContainerItemProxy */ = {
32 | isa = PBXContainerItemProxy;
33 | containerPortal = 4049122E1937BBEB0087BC2F /* Project object */;
34 | proxyType = 1;
35 | remoteGlobalIDString = 404912351937BBEB0087BC2F;
36 | remoteInfo = "PI Emoji Picker";
37 | };
38 | /* End PBXContainerItemProxy section */
39 |
40 | /* Begin PBXFileReference section */
41 | 404912361937BBEB0087BC2F /* PI Emoji Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "PI Emoji Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; };
42 | 404912391937BBEB0087BC2F /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
43 | 4049123C1937BBEB0087BC2F /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
44 | 4049123D1937BBEB0087BC2F /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
45 | 4049123E1937BBEB0087BC2F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
46 | 404912411937BBEB0087BC2F /* PI Emoji Picker-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "PI Emoji Picker-Info.plist"; sourceTree = ""; };
47 | 404912431937BBEB0087BC2F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; };
48 | 404912451937BBEB0087BC2F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
49 | 404912471937BBEB0087BC2F /* PI Emoji Picker-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PI Emoji Picker-Prefix.pch"; sourceTree = ""; };
50 | 404912491937BBEB0087BC2F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = en; path = en.lproj/Credits.rtf; sourceTree = ""; };
51 | 4049124B1937BBEB0087BC2F /* PIAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PIAppDelegate.h; sourceTree = ""; };
52 | 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PIAppDelegate.m; sourceTree = ""; };
53 | 4049124F1937BBEB0087BC2F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; };
54 | 404912511937BBEB0087BC2F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
55 | 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PI Emoji PickerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
56 | 404912581937BBEB0087BC2F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
57 | 4049126D1937F9300087BC2F /* PIEmojiViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PIEmojiViewController.h; sourceTree = ""; };
58 | 4049126E1937F9300087BC2F /* PIEmojiViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PIEmojiViewController.m; sourceTree = ""; };
59 | 406D2AC719399F29002E1413 /* EmojisList.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = EmojisList.plist; path = "Emoji Picker/EmojisList.plist"; sourceTree = SOURCE_ROOT; };
60 | 406D2AC819399F29002E1413 /* EmojiView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = EmojiView.xib; path = "Emoji Picker/EmojiView.xib"; sourceTree = SOURCE_ROOT; };
61 | 406D2AC919399F29002E1413 /* PIEmojiKeyboardView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PIEmojiKeyboardView.h; path = "Emoji Picker/PIEmojiKeyboardView.h"; sourceTree = SOURCE_ROOT; };
62 | 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PIEmojiKeyboardView.m; path = "Emoji Picker/PIEmojiKeyboardView.m"; sourceTree = SOURCE_ROOT; };
63 | 406D2ACB19399F29002E1413 /* PIEmojiPageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PIEmojiPageView.h; path = "Emoji Picker/PIEmojiPageView.h"; sourceTree = SOURCE_ROOT; };
64 | 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PIEmojiPageView.m; path = "Emoji Picker/PIEmojiPageView.m"; sourceTree = SOURCE_ROOT; };
65 | 406D2AD119399F42002E1413 /* EmojiView.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = EmojiView.xcassets; path = "Emoji Picker/EmojiView.xcassets"; sourceTree = SOURCE_ROOT; };
66 | 40CCD344193D8011004A027F /* RPBorderlessSegmentedCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RPBorderlessSegmentedCell.h; sourceTree = ""; };
67 | 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RPBorderlessSegmentedCell.m; sourceTree = ""; };
68 | 40CCD346193D8011004A027F /* RPBorderlessSegmentedControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RPBorderlessSegmentedControl.h; sourceTree = ""; };
69 | 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RPBorderlessSegmentedControl.m; sourceTree = ""; };
70 | 40CCD34A193D8052004A027F /* NSImage+DrawAsTemplate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSImage+DrawAsTemplate.h"; sourceTree = ""; };
71 | 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSImage+DrawAsTemplate.m"; sourceTree = ""; };
72 | /* End PBXFileReference section */
73 |
74 | /* Begin PBXFrameworksBuildPhase section */
75 | 404912331937BBEB0087BC2F /* Frameworks */ = {
76 | isa = PBXFrameworksBuildPhase;
77 | buildActionMask = 2147483647;
78 | files = (
79 | 4049123A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */,
80 | );
81 | runOnlyForDeploymentPostprocessing = 0;
82 | };
83 | 404912541937BBEB0087BC2F /* Frameworks */ = {
84 | isa = PBXFrameworksBuildPhase;
85 | buildActionMask = 2147483647;
86 | files = (
87 | 4049125A1937BBEB0087BC2F /* Cocoa.framework in Frameworks */,
88 | 404912591937BBEB0087BC2F /* XCTest.framework in Frameworks */,
89 | );
90 | runOnlyForDeploymentPostprocessing = 0;
91 | };
92 | /* End PBXFrameworksBuildPhase section */
93 |
94 | /* Begin PBXGroup section */
95 | 4049122D1937BBEB0087BC2F = {
96 | isa = PBXGroup;
97 | children = (
98 | 404912A1193901550087BC2F /* Emoji Picker */,
99 | 4049123F1937BBEB0087BC2F /* Example App */,
100 | 404912381937BBEB0087BC2F /* Frameworks */,
101 | 404912371937BBEB0087BC2F /* Products */,
102 | );
103 | sourceTree = "";
104 | };
105 | 404912371937BBEB0087BC2F /* Products */ = {
106 | isa = PBXGroup;
107 | children = (
108 | 404912361937BBEB0087BC2F /* PI Emoji Picker.app */,
109 | 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */,
110 | );
111 | name = Products;
112 | sourceTree = "";
113 | };
114 | 404912381937BBEB0087BC2F /* Frameworks */ = {
115 | isa = PBXGroup;
116 | children = (
117 | 404912391937BBEB0087BC2F /* Cocoa.framework */,
118 | 404912581937BBEB0087BC2F /* XCTest.framework */,
119 | 4049123B1937BBEB0087BC2F /* Other Frameworks */,
120 | );
121 | name = Frameworks;
122 | sourceTree = "";
123 | };
124 | 4049123B1937BBEB0087BC2F /* Other Frameworks */ = {
125 | isa = PBXGroup;
126 | children = (
127 | 4049123C1937BBEB0087BC2F /* AppKit.framework */,
128 | 4049123D1937BBEB0087BC2F /* CoreData.framework */,
129 | 4049123E1937BBEB0087BC2F /* Foundation.framework */,
130 | );
131 | name = "Other Frameworks";
132 | sourceTree = "";
133 | };
134 | 4049123F1937BBEB0087BC2F /* Example App */ = {
135 | isa = PBXGroup;
136 | children = (
137 | 4049124B1937BBEB0087BC2F /* PIAppDelegate.h */,
138 | 4049124C1937BBEB0087BC2F /* PIAppDelegate.m */,
139 | 4049126D1937F9300087BC2F /* PIEmojiViewController.h */,
140 | 4049126E1937F9300087BC2F /* PIEmojiViewController.m */,
141 | 4049124E1937BBEB0087BC2F /* MainMenu.xib */,
142 | 404912511937BBEB0087BC2F /* Images.xcassets */,
143 | 404912401937BBEB0087BC2F /* Supporting Files */,
144 | );
145 | name = "Example App";
146 | path = "PI Emoji Picker";
147 | sourceTree = "";
148 | };
149 | 404912401937BBEB0087BC2F /* Supporting Files */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 404912411937BBEB0087BC2F /* PI Emoji Picker-Info.plist */,
153 | 404912421937BBEB0087BC2F /* InfoPlist.strings */,
154 | 404912451937BBEB0087BC2F /* main.m */,
155 | 404912471937BBEB0087BC2F /* PI Emoji Picker-Prefix.pch */,
156 | 404912481937BBEB0087BC2F /* Credits.rtf */,
157 | );
158 | name = "Supporting Files";
159 | sourceTree = "";
160 | };
161 | 404912A1193901550087BC2F /* Emoji Picker */ = {
162 | isa = PBXGroup;
163 | children = (
164 | 406D2AC719399F29002E1413 /* EmojisList.plist */,
165 | 406D2AC819399F29002E1413 /* EmojiView.xib */,
166 | 406D2AC919399F29002E1413 /* PIEmojiKeyboardView.h */,
167 | 406D2ACA19399F29002E1413 /* PIEmojiKeyboardView.m */,
168 | 406D2ACB19399F29002E1413 /* PIEmojiPageView.h */,
169 | 406D2ACC19399F29002E1413 /* PIEmojiPageView.m */,
170 | 406D2AD119399F42002E1413 /* EmojiView.xcassets */,
171 | 40CCD343193D8011004A027F /* RPBorderlessSegmented */,
172 | );
173 | name = "Emoji Picker";
174 | path = "PI Emoji Picker";
175 | sourceTree = "";
176 | };
177 | 40CCD343193D8011004A027F /* RPBorderlessSegmented */ = {
178 | isa = PBXGroup;
179 | children = (
180 | 40CCD34A193D8052004A027F /* NSImage+DrawAsTemplate.h */,
181 | 40CCD34B193D8052004A027F /* NSImage+DrawAsTemplate.m */,
182 | 40CCD344193D8011004A027F /* RPBorderlessSegmentedCell.h */,
183 | 40CCD345193D8011004A027F /* RPBorderlessSegmentedCell.m */,
184 | 40CCD346193D8011004A027F /* RPBorderlessSegmentedControl.h */,
185 | 40CCD347193D8011004A027F /* RPBorderlessSegmentedControl.m */,
186 | );
187 | name = RPBorderlessSegmented;
188 | path = "Emoji Picker/RPBorderlessSegmented";
189 | sourceTree = SOURCE_ROOT;
190 | };
191 | /* End PBXGroup section */
192 |
193 | /* Begin PBXNativeTarget section */
194 | 404912351937BBEB0087BC2F /* PI Emoji Picker */ = {
195 | isa = PBXNativeTarget;
196 | buildConfigurationList = 404912671937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji Picker" */;
197 | buildPhases = (
198 | 404912321937BBEB0087BC2F /* Sources */,
199 | 404912331937BBEB0087BC2F /* Frameworks */,
200 | 404912341937BBEB0087BC2F /* Resources */,
201 | );
202 | buildRules = (
203 | );
204 | dependencies = (
205 | );
206 | name = "PI Emoji Picker";
207 | productName = "PI Emoji Picker";
208 | productReference = 404912361937BBEB0087BC2F /* PI Emoji Picker.app */;
209 | productType = "com.apple.product-type.application";
210 | };
211 | 404912561937BBEB0087BC2F /* PI Emoji PickerTests */ = {
212 | isa = PBXNativeTarget;
213 | buildConfigurationList = 4049126A1937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji PickerTests" */;
214 | buildPhases = (
215 | 404912531937BBEB0087BC2F /* Sources */,
216 | 404912541937BBEB0087BC2F /* Frameworks */,
217 | 404912551937BBEB0087BC2F /* Resources */,
218 | );
219 | buildRules = (
220 | );
221 | dependencies = (
222 | 4049125C1937BBEB0087BC2F /* PBXTargetDependency */,
223 | );
224 | name = "PI Emoji PickerTests";
225 | productName = "PI Emoji PickerTests";
226 | productReference = 404912571937BBEB0087BC2F /* PI Emoji PickerTests.xctest */;
227 | productType = "com.apple.product-type.bundle.unit-test";
228 | };
229 | /* End PBXNativeTarget section */
230 |
231 | /* Begin PBXProject section */
232 | 4049122E1937BBEB0087BC2F /* Project object */ = {
233 | isa = PBXProject;
234 | attributes = {
235 | CLASSPREFIX = PI;
236 | LastUpgradeCheck = 0510;
237 | ORGANIZATIONNAME = "Web Information Solutions, Inc.";
238 | TargetAttributes = {
239 | 404912561937BBEB0087BC2F = {
240 | TestTargetID = 404912351937BBEB0087BC2F;
241 | };
242 | };
243 | };
244 | buildConfigurationList = 404912311937BBEB0087BC2F /* Build configuration list for PBXProject "PI Emoji Picker" */;
245 | compatibilityVersion = "Xcode 3.2";
246 | developmentRegion = English;
247 | hasScannedForEncodings = 0;
248 | knownRegions = (
249 | en,
250 | Base,
251 | );
252 | mainGroup = 4049122D1937BBEB0087BC2F;
253 | productRefGroup = 404912371937BBEB0087BC2F /* Products */;
254 | projectDirPath = "";
255 | projectRoot = "";
256 | targets = (
257 | 404912351937BBEB0087BC2F /* PI Emoji Picker */,
258 | 404912561937BBEB0087BC2F /* PI Emoji PickerTests */,
259 | );
260 | };
261 | /* End PBXProject section */
262 |
263 | /* Begin PBXResourcesBuildPhase section */
264 | 404912341937BBEB0087BC2F /* Resources */ = {
265 | isa = PBXResourcesBuildPhase;
266 | buildActionMask = 2147483647;
267 | files = (
268 | 406D2AD219399F42002E1413 /* EmojiView.xcassets in Resources */,
269 | 406D2ACD19399F29002E1413 /* EmojisList.plist in Resources */,
270 | 404912441937BBEB0087BC2F /* InfoPlist.strings in Resources */,
271 | 404912521937BBEB0087BC2F /* Images.xcassets in Resources */,
272 | 4049124A1937BBEB0087BC2F /* Credits.rtf in Resources */,
273 | 404912501937BBEB0087BC2F /* MainMenu.xib in Resources */,
274 | 406D2ACE19399F29002E1413 /* EmojiView.xib in Resources */,
275 | );
276 | runOnlyForDeploymentPostprocessing = 0;
277 | };
278 | 404912551937BBEB0087BC2F /* Resources */ = {
279 | isa = PBXResourcesBuildPhase;
280 | buildActionMask = 2147483647;
281 | files = (
282 | );
283 | runOnlyForDeploymentPostprocessing = 0;
284 | };
285 | /* End PBXResourcesBuildPhase section */
286 |
287 | /* Begin PBXSourcesBuildPhase section */
288 | 404912321937BBEB0087BC2F /* Sources */ = {
289 | isa = PBXSourcesBuildPhase;
290 | buildActionMask = 2147483647;
291 | files = (
292 | 40CCD34C193D8052004A027F /* NSImage+DrawAsTemplate.m in Sources */,
293 | 404912461937BBEB0087BC2F /* main.m in Sources */,
294 | 406D2ACF19399F29002E1413 /* PIEmojiKeyboardView.m in Sources */,
295 | 4049126F1937F9300087BC2F /* PIEmojiViewController.m in Sources */,
296 | 40CCD349193D8011004A027F /* RPBorderlessSegmentedControl.m in Sources */,
297 | 40CCD348193D8011004A027F /* RPBorderlessSegmentedCell.m in Sources */,
298 | 406D2AD019399F29002E1413 /* PIEmojiPageView.m in Sources */,
299 | 4049124D1937BBEB0087BC2F /* PIAppDelegate.m in Sources */,
300 | );
301 | runOnlyForDeploymentPostprocessing = 0;
302 | };
303 | 404912531937BBEB0087BC2F /* Sources */ = {
304 | isa = PBXSourcesBuildPhase;
305 | buildActionMask = 2147483647;
306 | files = (
307 | );
308 | runOnlyForDeploymentPostprocessing = 0;
309 | };
310 | /* End PBXSourcesBuildPhase section */
311 |
312 | /* Begin PBXTargetDependency section */
313 | 4049125C1937BBEB0087BC2F /* PBXTargetDependency */ = {
314 | isa = PBXTargetDependency;
315 | target = 404912351937BBEB0087BC2F /* PI Emoji Picker */;
316 | targetProxy = 4049125B1937BBEB0087BC2F /* PBXContainerItemProxy */;
317 | };
318 | /* End PBXTargetDependency section */
319 |
320 | /* Begin PBXVariantGroup section */
321 | 404912421937BBEB0087BC2F /* InfoPlist.strings */ = {
322 | isa = PBXVariantGroup;
323 | children = (
324 | 404912431937BBEB0087BC2F /* en */,
325 | );
326 | name = InfoPlist.strings;
327 | sourceTree = "";
328 | };
329 | 404912481937BBEB0087BC2F /* Credits.rtf */ = {
330 | isa = PBXVariantGroup;
331 | children = (
332 | 404912491937BBEB0087BC2F /* en */,
333 | );
334 | name = Credits.rtf;
335 | sourceTree = "";
336 | };
337 | 4049124E1937BBEB0087BC2F /* MainMenu.xib */ = {
338 | isa = PBXVariantGroup;
339 | children = (
340 | 4049124F1937BBEB0087BC2F /* Base */,
341 | );
342 | name = MainMenu.xib;
343 | sourceTree = "";
344 | };
345 | /* End PBXVariantGroup section */
346 |
347 | /* Begin XCBuildConfiguration section */
348 | 404912651937BBEB0087BC2F /* Debug */ = {
349 | isa = XCBuildConfiguration;
350 | buildSettings = {
351 | ALWAYS_SEARCH_USER_PATHS = NO;
352 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
353 | CLANG_CXX_LIBRARY = "libc++";
354 | CLANG_ENABLE_MODULES = YES;
355 | CLANG_ENABLE_OBJC_ARC = YES;
356 | CLANG_WARN_BOOL_CONVERSION = YES;
357 | CLANG_WARN_CONSTANT_CONVERSION = YES;
358 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
359 | CLANG_WARN_EMPTY_BODY = YES;
360 | CLANG_WARN_ENUM_CONVERSION = YES;
361 | CLANG_WARN_INT_CONVERSION = YES;
362 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
363 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
364 | COPY_PHASE_STRIP = NO;
365 | GCC_C_LANGUAGE_STANDARD = gnu99;
366 | GCC_DYNAMIC_NO_PIC = NO;
367 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
368 | GCC_OPTIMIZATION_LEVEL = 0;
369 | GCC_PREPROCESSOR_DEFINITIONS = (
370 | "DEBUG=1",
371 | "$(inherited)",
372 | );
373 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
374 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
375 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
376 | GCC_WARN_UNDECLARED_SELECTOR = YES;
377 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
378 | GCC_WARN_UNUSED_FUNCTION = YES;
379 | GCC_WARN_UNUSED_VARIABLE = YES;
380 | MACOSX_DEPLOYMENT_TARGET = 10.9;
381 | ONLY_ACTIVE_ARCH = YES;
382 | SDKROOT = macosx;
383 | };
384 | name = Debug;
385 | };
386 | 404912661937BBEB0087BC2F /* Release */ = {
387 | isa = XCBuildConfiguration;
388 | buildSettings = {
389 | ALWAYS_SEARCH_USER_PATHS = NO;
390 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
391 | CLANG_CXX_LIBRARY = "libc++";
392 | CLANG_ENABLE_MODULES = YES;
393 | CLANG_ENABLE_OBJC_ARC = YES;
394 | CLANG_WARN_BOOL_CONVERSION = YES;
395 | CLANG_WARN_CONSTANT_CONVERSION = YES;
396 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
397 | CLANG_WARN_EMPTY_BODY = YES;
398 | CLANG_WARN_ENUM_CONVERSION = YES;
399 | CLANG_WARN_INT_CONVERSION = YES;
400 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
401 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
402 | COPY_PHASE_STRIP = YES;
403 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
404 | ENABLE_NS_ASSERTIONS = NO;
405 | GCC_C_LANGUAGE_STANDARD = gnu99;
406 | GCC_ENABLE_OBJC_EXCEPTIONS = YES;
407 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
408 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
409 | GCC_WARN_UNDECLARED_SELECTOR = YES;
410 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
411 | GCC_WARN_UNUSED_FUNCTION = YES;
412 | GCC_WARN_UNUSED_VARIABLE = YES;
413 | MACOSX_DEPLOYMENT_TARGET = 10.9;
414 | SDKROOT = macosx;
415 | };
416 | name = Release;
417 | };
418 | 404912681937BBEB0087BC2F /* Debug */ = {
419 | isa = XCBuildConfiguration;
420 | buildSettings = {
421 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
422 | COMBINE_HIDPI_IMAGES = YES;
423 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
424 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch";
425 | INFOPLIST_FILE = "PI Emoji Picker/PI Emoji Picker-Info.plist";
426 | PRODUCT_NAME = "$(TARGET_NAME)";
427 | WRAPPER_EXTENSION = app;
428 | };
429 | name = Debug;
430 | };
431 | 404912691937BBEB0087BC2F /* Release */ = {
432 | isa = XCBuildConfiguration;
433 | buildSettings = {
434 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
435 | COMBINE_HIDPI_IMAGES = YES;
436 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
437 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch";
438 | INFOPLIST_FILE = "PI Emoji Picker/PI Emoji Picker-Info.plist";
439 | PRODUCT_NAME = "$(TARGET_NAME)";
440 | WRAPPER_EXTENSION = app;
441 | };
442 | name = Release;
443 | };
444 | 4049126B1937BBEB0087BC2F /* Debug */ = {
445 | isa = XCBuildConfiguration;
446 | buildSettings = {
447 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PI Emoji Picker.app/Contents/MacOS/PI Emoji Picker";
448 | COMBINE_HIDPI_IMAGES = YES;
449 | FRAMEWORK_SEARCH_PATHS = (
450 | "$(DEVELOPER_FRAMEWORKS_DIR)",
451 | "$(inherited)",
452 | );
453 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
454 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch";
455 | GCC_PREPROCESSOR_DEFINITIONS = (
456 | "DEBUG=1",
457 | "$(inherited)",
458 | );
459 | INFOPLIST_FILE = "PI Emoji PickerTests/PI Emoji PickerTests-Info.plist";
460 | PRODUCT_NAME = "$(TARGET_NAME)";
461 | TEST_HOST = "$(BUNDLE_LOADER)";
462 | WRAPPER_EXTENSION = xctest;
463 | };
464 | name = Debug;
465 | };
466 | 4049126C1937BBEB0087BC2F /* Release */ = {
467 | isa = XCBuildConfiguration;
468 | buildSettings = {
469 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/PI Emoji Picker.app/Contents/MacOS/PI Emoji Picker";
470 | COMBINE_HIDPI_IMAGES = YES;
471 | FRAMEWORK_SEARCH_PATHS = (
472 | "$(DEVELOPER_FRAMEWORKS_DIR)",
473 | "$(inherited)",
474 | );
475 | GCC_PRECOMPILE_PREFIX_HEADER = YES;
476 | GCC_PREFIX_HEADER = "PI Emoji Picker/PI Emoji Picker-Prefix.pch";
477 | INFOPLIST_FILE = "PI Emoji PickerTests/PI Emoji PickerTests-Info.plist";
478 | PRODUCT_NAME = "$(TARGET_NAME)";
479 | TEST_HOST = "$(BUNDLE_LOADER)";
480 | WRAPPER_EXTENSION = xctest;
481 | };
482 | name = Release;
483 | };
484 | /* End XCBuildConfiguration section */
485 |
486 | /* Begin XCConfigurationList section */
487 | 404912311937BBEB0087BC2F /* Build configuration list for PBXProject "PI Emoji Picker" */ = {
488 | isa = XCConfigurationList;
489 | buildConfigurations = (
490 | 404912651937BBEB0087BC2F /* Debug */,
491 | 404912661937BBEB0087BC2F /* Release */,
492 | );
493 | defaultConfigurationIsVisible = 0;
494 | defaultConfigurationName = Release;
495 | };
496 | 404912671937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji Picker" */ = {
497 | isa = XCConfigurationList;
498 | buildConfigurations = (
499 | 404912681937BBEB0087BC2F /* Debug */,
500 | 404912691937BBEB0087BC2F /* Release */,
501 | );
502 | defaultConfigurationIsVisible = 0;
503 | defaultConfigurationName = Release;
504 | };
505 | 4049126A1937BBEB0087BC2F /* Build configuration list for PBXNativeTarget "PI Emoji PickerTests" */ = {
506 | isa = XCConfigurationList;
507 | buildConfigurations = (
508 | 4049126B1937BBEB0087BC2F /* Debug */,
509 | 4049126C1937BBEB0087BC2F /* Release */,
510 | );
511 | defaultConfigurationIsVisible = 0;
512 | defaultConfigurationName = Release;
513 | };
514 | /* End XCConfigurationList section */
515 | };
516 | rootObject = 4049122E1937BBEB0087BC2F /* Project object */;
517 | }
518 |
--------------------------------------------------------------------------------
/PI Emoji Picker/Base.lproj/MainMenu.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
670 |
671 |
672 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
--------------------------------------------------------------------------------