diff --git a/PanoPainter-OSX/Info.plist b/PanoPainter-OSX/Info.plist
index 76ceea6..6d7fbcb 100644
--- a/PanoPainter-OSX/Info.plist
+++ b/PanoPainter-OSX/Info.plist
@@ -4,6 +4,33 @@
CFBundleDevelopmentRegion
en
+ CFBundleDocumentTypes
+
+
+ CFBundleTypeExtensions
+
+ ppi
+
+ CFBundleTypeIconFile
+ pp-icon-square
+ CFBundleTypeIconFiles
+
+ CFBundleTypeMIMETypes
+
+ CFBundleTypeName
+ PanoPainter Image
+ CFBundleTypeRole
+ Editor
+ LSIsAppleDefaultForType
+
+ LSItemContentTypes
+
+ public.panorama-image
+
+ LSTypeIsPackage
+ 0
+
+
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIconFile
@@ -30,5 +57,67 @@
Copyright © 2018 OmixLab Ltd. All rights reserved.
NSPrincipalClass
NSApplication
+ UTExportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ PanoPainter Image
+ UTTypeIconFile
+ pp-icon-square
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ public.panorama-image
+ UTTypeTagSpecification
+
+ com.apple.ostype
+
+ ****
+
+ public.filename-extension
+
+ ppi
+
+ public.mime-type
+
+ image/ppi
+
+
+
+
+ UTImportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+
+ UTTypeDescription
+ PanoPainter Image
+ UTTypeIconFile
+ pp-icon-square
+ UTTypeIdentifier
+ com.panopainter.image
+ UTTypeTagSpecification
+
+ com.apple.ostype
+
+ ****
+
+ public.filename-extension
+
+ ppi
+
+ public.mime-type
+
+ image/ppi
+
+
+
+
diff --git a/PanoPainter-OSX/main.cpp b/PanoPainter-OSX/main.cpp
index 9504f26..ec896cf 100644
--- a/PanoPainter-OSX/main.cpp
+++ b/PanoPainter-OSX/main.cpp
@@ -21,6 +21,9 @@ std::deque> tasklist;
std::mutex task_mutex;
@implementation View
+{
+ NSSharingService *airdrop_service;
+}
- (void)async_lock
{
CGLLockContext([glctx CGLContextObj]);
@@ -81,8 +84,39 @@ std::mutex task_mutex;
}
return ret;
}
+- (void)share_file:(NSString*)file_path
+{
+ NSURL *url = [NSURL fileURLWithPath:file_path];
+ NSArray *objectsToShare = @[url];
+//
+// UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:objectsToShare applicationActivities:nil];
+//
+// // Exclude all activities except AirDrop.
+// NSArray *excludedActivities = @[UIActivityTypePostToTwitter, UIActivityTypePostToFacebook,
+// UIActivityTypePostToWeibo,
+// UIActivityTypeMessage, UIActivityTypeMail,
+// UIActivityTypePrint, UIActivityTypeCopyToPasteboard,
+// UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll,
+// UIActivityTypeAddToReadingList, UIActivityTypePostToFlickr,
+// UIActivityTypePostToVimeo, UIActivityTypePostToTencentWeibo];
+// controller.excludedActivityTypes = excludedActivities;
+//
+// // Present the controller
+// [self presentViewController:controller animated:YES completion:nil];
+ [airdrop_service performWithItems:objectsToShare];
+}
+- (NSWindow *)sharingService:(NSSharingService *)sharingService sourceWindowForShareItems:(NSArray *)items sharingContentScope:(NSSharingContentScope *)sharingContentScope
+{
+ return self.window;
+}
+- (NSView *)anchoringViewForSharingService:(NSSharingService *)sharingService showRelativeToRect:(NSRect *)positioningRect preferredEdge:(NSRectEdge *)preferredEdge
+{
+ return self;
+}
- (instancetype)initWithFrame:(NSRect)frameRect
{
+ airdrop_service = [NSSharingService sharingServiceNamed:NSSharingServiceNameSendViaAirDrop];
+ airdrop_service.delegate = self;
gl_ready = false;
NSOpenGLPixelFormatAttribute attrs[] =
{
@@ -134,6 +168,12 @@ std::mutex task_mutex;
App::I.init();
CGLUnlockContext([[self openGLContext] CGLContextObj]);
gl_ready = true;
+
+ if ([file2open length] > 0)
+ {
+ LOG("open file %s", [file2open UTF8String]);
+ App::I.open_document([file2open UTF8String]);
+ }
}
- (void)terminateGL
@@ -428,6 +468,7 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
Window* window;
Controller* controller;
View* view;
+ NSString* file2open;
}
@end @implementation AppOSX
- (instancetype)init
@@ -437,6 +478,13 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
[self setDelegate:self];
return self;
}
+- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename
+{
+ LOG("open file %s", [filename UTF8String]);
+ //App::I.open_document([filename UTF8String]);
+ file2open = filename;
+ return YES;
+}
- (void)applicationWillTerminate:(NSNotification *)notification
{
[view terminateGL];
@@ -458,9 +506,10 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
NSRect r = NSMakeRect(0, 0, App::I.width, App::I.height);
view = [[View alloc] initWithFrame:r];
+ view->file2open = file2open;
controller = [[Controller alloc] initWithWindow:window];
App::I.osx_view = view;
-
+
auto style = NSTitledWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask|NSClosableWindowMask;
window = [[Window alloc] initWithContentRect:r styleMask:style backing:NSBackingStoreBuffered defer:NO];
[window setDelegate:controller];
@@ -471,7 +520,7 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
[window setAcceptsMouseMovedEvents:true];
[window makeFirstResponder:view];
view->wnd = window;
-
+
auto menubar = [NSMenu new];
auto appMenuItem = [NSMenuItem new];
[menubar addItem:appMenuItem];
diff --git a/PanoPainter-OSX/main.h b/PanoPainter-OSX/main.h
index 6a2d0a2..d668f61 100644
--- a/PanoPainter-OSX/main.h
+++ b/PanoPainter-OSX/main.h
@@ -9,13 +9,14 @@
@interface Controller : NSWindowController
@end
-@interface View : NSOpenGLView
+@interface View : NSOpenGLView
{
@public Window* wnd;
CVDisplayLinkRef dl;
NSOpenGLContext* glctx;
_CGLContextObject* cgl;
bool gl_ready;
+ @public NSString* file2open;
}
- (void)close;
- (void)terminateGL;
@@ -24,4 +25,5 @@
- (void)async_swap;
- (std::string)pick_file:(NSArray*)types;
- (std::string)pick_dir;
+- (void)share_file:(NSString*)file_path;
@end
diff --git a/PanoPainter.vcxproj b/PanoPainter.vcxproj
index b96e741..7dcc96b 100644
--- a/PanoPainter.vcxproj
+++ b/PanoPainter.vcxproj
@@ -77,7 +77,7 @@
true
- libs\glm;libs\glew-2.0.0\include;libs\stb;libs\tinyxml2;libs\yoga;libs\curl-win\include;libs\jpeg;libs\wacom;libs\bugtrap-client\include;libs\poly2tri\poly2tri;libs\base64;$(IncludePath)
+ libs\glm;libs\glew-2.0.0\include;libs\stb;libs\tinyxml2;libs\yoga;libs\curl-win\include;libs\jpeg;libs\wacom;libs\bugtrap-client\include;libs\poly2tri\poly2tri;libs\base64;libs\sqlite3;$(IncludePath)
libs\curl-win\lib\dll-$(Configuration)-$(PlatformShortName);libs\glew-2.0.0\lib\Release\$(Platform);libs\bugtrap-client\lib;$(LibraryPath)
@@ -87,7 +87,7 @@
false
- libs\glm;libs\glew-2.0.0\include;libs\stb;libs\tinyxml2;libs\yoga;libs\curl-win\include;libs\jpeg;libs\wacom;libs\bugtrap-client\include;libs\poly2tri\poly2tri;libs\base64;$(IncludePath)
+ libs\glm;libs\glew-2.0.0\include;libs\stb;libs\tinyxml2;libs\yoga;libs\curl-win\include;libs\jpeg;libs\wacom;libs\bugtrap-client\include;libs\poly2tri\poly2tri;libs\base64;libs\sqlite3;$(IncludePath)
libs\curl-win\lib\dll-$(Configuration)-$(PlatformShortName);libs\glew-2.0.0\lib\Release\$(Platform);libs\bugtrap-client\lib;$(LibraryPath)
@@ -167,6 +167,10 @@
+
+ NotUsing
+ NotUsing
+
@@ -292,6 +296,8 @@
+
+
diff --git a/PanoPainter.vcxproj.filters b/PanoPainter.vcxproj.filters
index 44b9b38..22a875b 100644
--- a/PanoPainter.vcxproj.filters
+++ b/PanoPainter.vcxproj.filters
@@ -40,6 +40,9 @@
{e631ac80-1b9b-424f-8adf-e2bab71a566d}
+
+ {ef44d179-f28b-458c-b3df-be2895553149}
+
@@ -264,6 +267,9 @@
Source Files\ui
+
+ libs\sqlite3
+
@@ -473,6 +479,12 @@
Header Files\ui
+
+ libs\sqlite3
+
+
+ libs\sqlite3
+
diff --git a/PanoPainter.xcodeproj/project.pbxproj b/PanoPainter.xcodeproj/project.pbxproj
index 7a2fe85..6794ba6 100644
--- a/PanoPainter.xcodeproj/project.pbxproj
+++ b/PanoPainter.xcodeproj/project.pbxproj
@@ -134,8 +134,6 @@
ADC0EB3F1FBDC748004079BB /* node_colorwheel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC0EB3B1FBDC748004079BB /* node_colorwheel.cpp */; };
ADC0EB431FC36E88004079BB /* node_dialog_picker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC0EB401FC36E88004079BB /* node_dialog_picker.cpp */; };
ADC0EB441FC36E88004079BB /* node_dialog_picker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC0EB401FC36E88004079BB /* node_dialog_picker.cpp */; };
- ADC6B6C8216E0F0000DED870 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = ADC6B6C7216E0F0000DED870 /* sqlite3.c */; };
- ADC6B6C9216E0F0D00DED870 /* sqlite3.c in Sources */ = {isa = PBXBuildFile; fileRef = ADC6B6C7216E0F0000DED870 /* sqlite3.c */; };
ADC6F4621F3AFF2C004177FA /* node_dialog_layer_rename.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC6F4611F3AFA2B004177FA /* node_dialog_layer_rename.cpp */; };
ADC6F4631F3AFF2D004177FA /* node_dialog_layer_rename.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC6F4611F3AFA2B004177FA /* node_dialog_layer_rename.cpp */; };
ADC6F4671F3E66FB004177FA /* app_dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADC6F4651F3E66FA004177FA /* app_dialogs.cpp */; };
@@ -200,6 +198,8 @@
ADE4911F1F86E65E00FB8E92 /* sweep.cc in Sources */ = {isa = PBXBuildFile; fileRef = ADE491131F86D09100FB8E92 /* sweep.cc */; };
ADEBA9062069A4F40085AE16 /* objc_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADEBA9052069A4F40085AE16 /* objc_utils.cpp */; };
ADEBA9092069A50E0085AE16 /* objc_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADEBA9082069A50E0085AE16 /* objc_utils.cpp */; };
+ ADF396DD216F749200024722 /* AppKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADF396DB216F6BD800024722 /* AppKit.framework */; };
+ ADF396DF216FA6C900024722 /* pp-icon-square.png in Resources */ = {isa = PBXBuildFile; fileRef = ADF396DE216FA6C700024722 /* pp-icon-square.png */; };
ADFD32152166AA0800F46F85 /* GenerateThumbnailForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = ADFD32142166AA0800F46F85 /* GenerateThumbnailForURL.c */; };
ADFD32172166AA0800F46F85 /* GeneratePreviewForURL.c in Sources */ = {isa = PBXBuildFile; fileRef = ADFD32162166AA0800F46F85 /* GeneratePreviewForURL.c */; };
ADFD32192166AA0800F46F85 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = ADFD32182166AA0800F46F85 /* main.c */; };
@@ -467,6 +467,8 @@
ADEBA9052069A4F40085AE16 /* objc_utils.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = objc_utils.cpp; path = src/objc_utils.cpp; sourceTree = SOURCE_ROOT; };
ADEBA9072069A50E0085AE16 /* objc_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = objc_utils.h; path = src/objc_utils.h; sourceTree = SOURCE_ROOT; };
ADEBA9082069A50E0085AE16 /* objc_utils.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; name = objc_utils.cpp; path = src/objc_utils.cpp; sourceTree = SOURCE_ROOT; };
+ ADF396DB216F6BD800024722 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
+ ADF396DE216FA6C700024722 /* pp-icon-square.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "pp-icon-square.png"; path = "extra/pp-icon-square.png"; sourceTree = ""; };
ADFD32122166AA0800F46F85 /* QLPlugin.qlgenerator */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = QLPlugin.qlgenerator; sourceTree = BUILT_PRODUCTS_DIR; };
ADFD32142166AA0800F46F85 /* GenerateThumbnailForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GenerateThumbnailForURL.c; sourceTree = ""; };
ADFD32162166AA0800F46F85 /* GeneratePreviewForURL.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = GeneratePreviewForURL.c; sourceTree = ""; };
@@ -487,6 +489,7 @@
AD0E5CB11ECC726C00C35669 /* OpenGL.framework in Frameworks */,
AD0E5CB01ECC726400C35669 /* Cocoa.framework in Frameworks */,
AD0E5CAF1ECC726000C35669 /* CoreFoundation.framework in Frameworks */,
+ ADF396DD216F749200024722 /* AppKit.framework in Frameworks */,
AD0E5CAE1ECC725400C35669 /* CoreVideo.framework in Frameworks */,
ADC8F776216675A90084ECAD /* HockeySDK.framework in Frameworks */,
);
@@ -689,6 +692,7 @@
AD58E0461E107411006ACC15 = {
isa = PBXGroup;
children = (
+ ADF396DE216FA6C700024722 /* pp-icon-square.png */,
AD2286BC214E97460074567E /* scripts */,
AD58E0731E3421CB006ACC15 /* libs */,
AD58E0611E17F23D006ACC15 /* data */,
@@ -789,6 +793,7 @@
AD759B631F2793AD00211963 /* Frameworks */ = {
isa = PBXGroup;
children = (
+ ADF396DB216F6BD800024722 /* AppKit.framework */,
ADFD32232166B12A00F46F85 /* Foundation.framework */,
AD06989820CC6C3E0010825F /* OSX */,
AD06989520CC6C210010825F /* iOS */,
@@ -1077,6 +1082,7 @@
buildActionMask = 2147483647;
files = (
AD0E5CE41ECC76BA00C35669 /* data in Resources */,
+ ADF396DF216FA6C900024722 /* pp-icon-square.png in Resources */,
AD0E5CA51ECC6F2B00C35669 /* Assets.xcassets in Resources */,
AD0E5CA81ECC6F2B00C35669 /* MainMenu.xib in Resources */,
);
@@ -1303,7 +1309,6 @@
AD0E5CD61ECC72AD00C35669 /* bezier.cpp in Sources */,
AD0E5CB61ECC72AD00C35669 /* Yoga.c in Sources */,
ADE4911D1F86E65E00FB8E92 /* shapes.cc in Sources */,
- ADC6B6C9216E0F0D00DED870 /* sqlite3.c in Sources */,
ADC0EB441FC36E88004079BB /* node_dialog_picker.cpp in Sources */,
AD0E5CC51ECC72AD00C35669 /* node_panel_color.cpp in Sources */,
AD0E5CD71ECC72AD00C35669 /* brush.cpp in Sources */,
@@ -1426,7 +1431,6 @@
ADD7D2A01EBF9E1C00D5A897 /* image.cpp in Sources */,
ADD7D2A11EBF9E1C00D5A897 /* texture.cpp in Sources */,
AD0E119C1ECA215600CDA6BB /* app_events.cpp in Sources */,
- ADC6B6C8216E0F0000DED870 /* sqlite3.c in Sources */,
ADFD32272166C9A000F46F85 /* node_dialog_resize.cpp in Sources */,
ADBC8C551FAFD0520094B339 /* app_cloud.cpp in Sources */,
ADD7D2961EBF9E1C00D5A897 /* brush.cpp in Sources */,
@@ -1520,7 +1524,7 @@
);
INFOPLIST_FILE = "PanoPainter-OSX/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.osx;
PRODUCT_NAME = PanoPainter;
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1544,7 +1548,7 @@
);
INFOPLIST_FILE = "PanoPainter-OSX/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
- MACOSX_DEPLOYMENT_TARGET = 10.7;
+ MACOSX_DEPLOYMENT_TARGET = 10.8;
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.osx;
PRODUCT_NAME = PanoPainter;
PROVISIONING_PROFILE_SPECIFIER = "";
diff --git a/QLPlugin/Info.plist b/QLPlugin/Info.plist
index ae2bec3..75d8e66 100644
--- a/QLPlugin/Info.plist
+++ b/QLPlugin/Info.plist
@@ -7,6 +7,8 @@
CFBundleDocumentTypes
+ CFBundleTypeIconFile
+ pp-icon-square
CFBundleTypeExtensions
ppi
@@ -16,7 +18,7 @@
image/ppi
CFBundleTypeName
- PPI
+ PanoPainter Image
CFBundleTypeRole
QLGenerator
LSItemContentTypes
@@ -70,6 +72,8 @@
UTImportedTypeDeclarations
+ UTTypeIconFile
+ pp-icon-square
UTTypeConformsTo
public.data
diff --git a/data/layout.xml b/data/layout.xml
index 48b3a22..0506a8e 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -454,7 +454,7 @@
-
+