From 7708f3dc74ab36e6417667e0799131d19411345f Mon Sep 17 00:00:00 2001 From: omigamedev Date: Fri, 12 Oct 2018 11:37:08 +0200 Subject: [PATCH] add share button and implement AirDrop share in OSX, update info.plist to set on Mac OS the default app for PPI, on iOS include the Documents/Inbox subfolder used to store the received files from AirDrop --- PanoPainter-OSX/Info.plist | 89 ++++++++++++++++++++++++++ PanoPainter-OSX/main.cpp | 53 ++++++++++++++- PanoPainter-OSX/main.h | 4 +- PanoPainter.xcodeproj/project.pbxproj | 16 +++-- QLPlugin/Info.plist | 6 +- data/layout.xml | 6 +- extra/pp-icon-square.png | Bin 0 -> 38549 bytes src/app.h | 1 + src/app_dialogs.cpp | 6 +- src/app_events.cpp | 15 +++++ src/app_layout.cpp | 6 ++ src/node_dialog_browse.cpp | 24 +++++-- src/node_dialog_browse.h | 2 +- 13 files changed, 208 insertions(+), 20 deletions(-) create mode 100644 extra/pp-icon-square.png 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.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 @@ -