implement save request on OSX, add Quick Look extentions

This commit is contained in:
2018-07-31 00:38:10 +02:00
parent 87fcea61b8
commit 5a37f578cb
18 changed files with 814 additions and 20 deletions

View File

@@ -13,6 +13,32 @@
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
#import "objc_utils.h" #import "objc_utils.h"
void global_exception_handler(NSException* e)
{
NSAlert *alert = [NSAlert alertWithMessageText:@"Recovery"
defaultButton:@"OK" alternateButton:@"Cancel"
otherButton:nil informativeTextWithFormat:@"Exception"];
[alert runModal];
if (App::I.canvas && App::I.canvas->m_canvas)
App::I.canvas->m_canvas->project_save_thread(App::I.data_path + "/recovery.pano");
std::terminate();
}
void global_signal_handler(int e)
{
NSAlert *alert = [NSAlert alertWithMessageText:@"Recovery"
defaultButton:@"OK" alternateButton:@"Cancel"
otherButton:nil informativeTextWithFormat:@"Signal"];
[alert runModal];
if (App::I.canvas && App::I.canvas->m_canvas)
App::I.canvas->m_canvas->project_save_thread(App::I.data_path + "/recovery.pano");
std::terminate();
}
@implementation View @implementation View
- (void)async_lock - (void)async_lock
{ {
@@ -27,6 +53,10 @@
{ {
CGLFlushDrawable([glctx CGLContextObj]); CGLFlushDrawable([glctx CGLContextObj]);
} }
- (void)close
{
[[NSApplication sharedApplication] terminate:nil];
}
- (std::string)pick_file - (std::string)pick_file
{ {
NSOpenPanel *panel = [NSOpenPanel openPanel]; NSOpenPanel *panel = [NSOpenPanel openPanel];
@@ -307,32 +337,67 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
CGLLockContext([[self openGLContext] CGLContextObj]); CGLLockContext([[self openGLContext] CGLContextObj]);
auto keyCode = [theEvent keyCode]; auto keyCode = [theEvent keyCode];
auto chars = [theEvent characters]; auto chars = [theEvent characters];
if (App::I.keys[(int)kKey::KeyCtrl])
{
App::I.key_down(convert_key(keyCode));
App::I.key_up(convert_key(keyCode));
}
else
{
App::I.key_down(convert_key(keyCode)); App::I.key_down(convert_key(keyCode));
if (const char* cstr = [chars cStringUsingEncoding:NSASCIIStringEncoding]) if (const char* cstr = [chars cStringUsingEncoding:NSASCIIStringEncoding])
App::I.key_char(cstr[0]); App::I.key_char(cstr[0]);
}
CGLUnlockContext([[self openGLContext] CGLContextObj]); CGLUnlockContext([[self openGLContext] CGLContextObj]);
} }
- (void)keyUp:(NSEvent *)theEvent - (void)keyUp:(NSEvent *)theEvent
{ {
CGLLockContext([[self openGLContext] CGLContextObj]); CGLLockContext([[self openGLContext] CGLContextObj]);
auto keyCode = [theEvent keyCode]; auto keyCode = [theEvent keyCode];
auto chars = [theEvent characters]; //auto chars = [theEvent characters];
App::I.key_up(convert_key(keyCode)); App::I.key_up(convert_key(keyCode));
CGLUnlockContext([[self openGLContext] CGLContextObj]); CGLUnlockContext([[self openGLContext] CGLContextObj]);
} }
- (void)flagsChanged:(NSEvent *)event
{
[super flagsChanged:event];
CGLLockContext([[self openGLContext] CGLContextObj]);
static bool pressed_shift = false;
if (pressed_shift != ([event modifierFlags] & NSShiftKeyMask))
{
pressed_shift = ([event modifierFlags] & NSShiftKeyMask);
pressed_shift ? App::I.key_down(kKey::KeyShift) : App::I.key_up(kKey::KeyShift);
}
static bool pressed_alt = false;
if (pressed_alt != ([event modifierFlags] & NSAlternateKeyMask))
{
pressed_alt = ([event modifierFlags] & NSAlternateKeyMask);
pressed_alt ? App::I.key_down(kKey::KeyAlt) : App::I.key_up(kKey::KeyAlt);
}
static bool pressed_cmd = false;
if (pressed_cmd != ([event modifierFlags] & NSCommandKeyMask))
{
pressed_cmd = ([event modifierFlags] & NSCommandKeyMask);
pressed_cmd ? App::I.key_down(kKey::KeyCtrl) : App::I.key_up(kKey::KeyCtrl);
}
CGLUnlockContext([[self openGLContext] CGLContextObj]);
}
@end @end
@interface Window : NSWindow @implementation Window
@end @implementation Window
@end @end
@interface Controller : NSWindowController<NSWindowDelegate> @implementation Controller
@end @implementation Controller
- (void)windowWillClose:(NSNotification *)notification - (void)windowWillClose:(NSNotification *)notification
{ {
App::I.terminate(); App::I.terminate();
[[NSApplication sharedApplication] terminate:nil]; [[NSApplication sharedApplication] terminate:nil];
} }
-(BOOL)windowShouldClose:(NSWindow *)sender
{
return App::I.request_close();
}
@end @end
@interface AppOSX : NSApplication<NSApplicationDelegate> @interface AppOSX : NSApplication<NSApplicationDelegate>
@@ -356,6 +421,9 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
} }
- (void)applicationDidFinishLaunching:(NSNotification *)notification - (void)applicationDidFinishLaunching:(NSNotification *)notification
{ {
if (!App::I.check_license())
return;
App::I.initLog(); App::I.initLog();
App::I.create(); App::I.create();
NSRect r = NSMakeRect(0, 0, App::I.width, App::I.height); NSRect r = NSMakeRect(0, 0, App::I.width, App::I.height);
@@ -373,6 +441,7 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
[window setContentView:view]; [window setContentView:view];
[window setAcceptsMouseMovedEvents:true]; [window setAcceptsMouseMovedEvents:true];
[window makeFirstResponder:view]; [window makeFirstResponder:view];
view->wnd = window;
auto menubar = [NSMenu new]; auto menubar = [NSMenu new];
auto appMenuItem = [NSMenuItem new]; auto appMenuItem = [NSMenuItem new];
@@ -394,6 +463,8 @@ static CVReturn MyDisplayLinkCallback(CVDisplayLinkRef displayLink, const CVTime
int main(int argc, const char * argv[]) int main(int argc, const char * argv[])
{ {
AppOSX* app = [AppOSX sharedApplication]; AppOSX* app = [AppOSX sharedApplication];
NSSetUncaughtExceptionHandler(&global_exception_handler);
signal(SIGFPE, global_signal_handler);
[app run]; [app run];
return 0; return 0;
} }

View File

@@ -3,13 +3,21 @@
#include <CoreVideo/CoreVideo.h> #include <CoreVideo/CoreVideo.h>
#include <OpenGL/OpenGL.h> #include <OpenGL/OpenGL.h>
@interface Window : NSWindow
@end
@interface Controller : NSWindowController<NSWindowDelegate>
@end
@interface View : NSOpenGLView @interface View : NSOpenGLView
{ {
@public Window* wnd;
CVDisplayLinkRef dl; CVDisplayLinkRef dl;
NSOpenGLContext* glctx; NSOpenGLContext* glctx;
_CGLContextObject* cgl; _CGLContextObject* cgl;
bool gl_ready; bool gl_ready;
} }
- (void)close;
- (void)terminateGL; - (void)terminateGL;
- (void)async_lock; - (void)async_lock;
- (void)async_unlock; - (void)async_unlock;

View File

@@ -12,6 +12,9 @@
@property (strong, nonatomic) UIWindow *window; @property (strong, nonatomic) UIWindow *window;
- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options;
@end @end

View File

@@ -10,6 +10,22 @@
#import "GameViewController.h" #import "GameViewController.h"
#include "app.h" #include "app.h"
void global_exception_handler(NSException* e)
{
if (App::I.canvas && App::I.canvas->m_canvas)
App::I.canvas->m_canvas->project_save_thread(App::I.data_path + "/recovery.pano");
std::terminate();
}
void global_signal_handler(int e)
{
if (App::I.canvas && App::I.canvas->m_canvas)
App::I.canvas->m_canvas->project_save_thread(App::I.data_path + "/recovery.pano");
std::terminate();
}
@interface AppDelegate () { @interface AppDelegate () {
GameViewController* view; GameViewController* view;
} }
@@ -18,9 +34,15 @@
@implementation AppDelegate @implementation AppDelegate
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{
App::I.canvas->m_canvas->project_open([url fileSystemRepresentation]);
return true;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. // Override point for customization after application launch.
NSSetUncaughtExceptionHandler(&global_exception_handler);
view = (GameViewController*)self.window.rootViewController; view = (GameViewController*)self.window.rootViewController;
return YES; return YES;
} }

View File

@@ -2,14 +2,23 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>UIFileSharingEnabled</key>
<true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>en</string> <string>en</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
<string>PanoPainter</string> <string>PanoPainter</string>
<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeIconFiles</key>
<array/>
<key>CFBundleTypeName</key>
<string>PanoPainter Image</string>
<key>LSItemContentTypes</key>
<array>
<string>com.panopainter.image</string>
</array>
</dict>
</array>
<key>CFBundleExecutable</key> <key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string> <string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
@@ -28,8 +37,12 @@
<string>1</string> <string>1</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <true/>
<key>LSSupportsOpeningDocumentsInPlace</key>
<true/>
<key>NSPhotoLibraryUsageDescription</key> <key>NSPhotoLibraryUsageDescription</key>
<string>Export the panoramic to the gallery</string> <string>Export the panoramic to the gallery</string>
<key>UIFileSharingEnabled</key>
<true/>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
@@ -53,5 +66,30 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
<string>public.content</string>
</array>
<key>UTTypeDescription</key>
<string>PanoPainter Image</string>
<key>UTTypeIconFiles</key>
<array/>
<key>UTTypeIdentifier</key>
<string>com.panopainter.image</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>pano</string>
</array>
<key>public.mime-type</key>
<string>image/ppi</string>
</dict>
</dict>
</array>
</dict> </dict>
</plist> </plist>

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" systemVersion="17A278a" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="M4Y-Lb-cyx">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Preview View Controller-->
<scene sceneID="cwh-vc-ff4">
<objects>
<viewController id="M4Y-Lb-cyx" customClass="PreviewViewController" customModuleProvider="" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" simulatedAppContext="notificationCenter" id="S3S-Oj-5AN">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="top" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Hello World" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="GcN-lo-r42">
<rect key="frame" x="20" y="323.5" width="335" height="20.5"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<color key="textColor" cocoaTouchSystemColor="lightTextColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<constraints>
<constraint firstItem="GcN-lo-r42" firstAttribute="centerY" secondItem="S3S-Oj-5AN" secondAttribute="centerY" id="44a-Fp-Kvy"/>
<constraint firstItem="GcN-lo-r42" firstAttribute="leading" secondItem="S3S-Oj-5AN" secondAttribute="leading" constant="20" symbolic="YES" id="6Vq-gs-PHe"/>
<constraint firstAttribute="trailing" secondItem="GcN-lo-r42" secondAttribute="trailing" constant="20" symbolic="YES" id="L8K-9R-egU"/>
</constraints>
<viewLayoutGuide key="safeArea" id="bzV-dz-m25"/>
</view>
<extendedEdge key="edgesForExtendedLayout"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="vXp-U4-Rya" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="705" y="299"/>
</scene>
</scenes>
</document>

40
PanoQL/Info.plist Normal file
View File

@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>PanoQL</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>QLSupportedContentTypes</key>
<array>
<string>com.panopainter.image</string>
</array>
<key>QLSupportsSearchableItems</key>
<true/>
</dict>
<key>NSExtensionMainStoryboard</key>
<string>MainInterface</string>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.quicklook.preview</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,13 @@
//
// PreviewViewController.h
// PanoQL
//
// Created by Omar Mohamed Ali Mudhir on 15/06/18.
// Copyright © 2018 OmixLab ltd. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface PreviewViewController : UIViewController
@end

View File

@@ -0,0 +1,45 @@
//
// PreviewViewController.m
// PanoQL
//
// Created by Omar Mohamed Ali Mudhir on 15/06/18.
// Copyright © 2018 OmixLab ltd. All rights reserved.
//
#import "PreviewViewController.h"
#import <QuickLook/QuickLook.h>
@interface PreviewViewController () <QLPreviewingController>
@end
@implementation PreviewViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)preparePreviewOfSearchableItemWithIdentifier:(NSString *)identifier queryString:(NSString * _Nullable)queryString completionHandler:(void (^)(NSError * _Nullable))handler {
// Perform any setup necessary in order to prepare the view.
// Call the completion handler so Quick Look knows that the preview is fully loaded.
// Quick Look will display a loading spinner while the completion handler is not called.
handler (nil);
}
/*
* Implement this method if you support previewing files.
* Add the supported content types to the QLSupportedContentTypes array in the Info.plist of the extension.
*
- (void)preparePreviewOfFileAtURL:(NSURL *)url completionHandler:(void (^)(NSError * _Nullable))handler {
handler(nil);
}
*/
@end

38
PanoThumb/Info.plist Normal file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>PanoThumb</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>XPC!</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSExtension</key>
<dict>
<key>NSExtensionAttributes</key>
<dict>
<key>QLSupportedContentTypes</key>
<array>
<string>com.panopainter.image</string>
</array>
</dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.quicklook.thumbnail</string>
<key>NSExtensionPrincipalClass</key>
<string>ThumbnailProvider</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,13 @@
//
// ThumbnailProvider.h
// PanoThumb
//
// Created by Omar Mohamed Ali Mudhir on 15/06/18.
// Copyright © 2018 OmixLab ltd. All rights reserved.
//
#import <QuickLook/QuickLook.h>
@interface ThumbnailProvider : QLThumbnailProvider
@end

View File

@@ -0,0 +1,63 @@
//
// ThumbnailProvider.m
// PanoThumb
//
// Created by Omar Mohamed Ali Mudhir on 15/06/18.
// Copyright © 2018 OmixLab ltd. All rights reserved.
//
#import "ThumbnailProvider.h"
@implementation ThumbnailProvider
- (void)provideThumbnailForFileRequest:(QLFileThumbnailRequest *)request completionHandler:(void (^)(QLThumbnailReply * _Nullable, NSError * _Nullable))handler {
// There are three ways to provide a thumbnail through a QLThumbnailReply. Only one of them should be used.
/*
// First way: Draw the thumbnail into the current context, set up with UIKit's coordinate system.
handler([QLThumbnailReply replyWithContextSize:request.maximumSize currentContextDrawingBlock:^BOOL {
// Draw the thumbnail here.
// Return YES if the thumbnail was successfully drawn inside this block.
return YES;
}], nil);
*/
// Second way: Draw the thumbnail into a context passed to your block, set up with Core Graphics' coordinate system.
CGRect r = CGRectMake(0, 0, 128, 128);
handler([QLThumbnailReply replyWithContextSize:r.size drawingBlock:^BOOL(CGContextRef _Nonnull context) {
// Draw the thumbnail here.
NSLog(@"thumbnail generated");
NSURL* u = [request fileURL];
FILE* fp = fopen([u fileSystemRepresentation], "rb");
if (fp)
{
int h[3];
fread(h, sizeof(int), 3, fp);
//uint8_t* data = (uint8_t*)malloc(h[0]*h[1]*h[2]);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmp = CGBitmapContextCreate(NULL, h[0], h[1], 8, h[0]*h[2], colorSpace, kCGImageAlphaPremultipliedLast);
uint8_t* data = CGBitmapContextGetData(bmp);
fread(data, h[0]*h[1]*h[2], 1, fp);
fclose(fp);
CGImageRef img = CGBitmapContextCreateImage(bmp);
CGRect r2 = CGRectMake(0, 0, 128*request.scale, 128*request.scale);
CGContextDrawImage(context, r2, img);
}
// Return YES if the thumbnail was successfully drawn inside this block.
return YES;
}], nil);
/*
// Third way: Set an image file URL.
handler([QLThumbnailReply replyWithImageFileURL:[NSBundle.mainBundle URLForResource:@"fileThumbnail" withExtension:@"jpg"]], nil);
*/
}
@end

View File

@@ -50,7 +50,7 @@
<!--layers panel template--> <!--layers panel template-->
<layout id="tpl-panel-layers"> <layout id="tpl-panel-layers">
<node width="220" margin="0 0 10 0"> <node width="220" margin="0 0 10 0" rtl="ltr">
<border height="30" color=".5" align="center" justify="center" margin="0 0 0 0"> <border height="30" color=".5" align="center" justify="center" margin="0 0 0 0">
<text text="Layers" font-face="arial" font-size="11" color="1 1 1 1"/> <text text="Layers" font-face="arial" font-size="11" color="1 1 1 1"/>
</border> </border>
@@ -77,7 +77,7 @@
<!--brush-presets panel--> <!--brush-presets panel-->
<layout id="tpl-panel-brush-preset"> <layout id="tpl-panel-brush-preset">
<node width="220" margin="0 0 10 0"> <node width="220" margin="0 0 10 0" rtl="ltr">
<border height="30" color=".5" align="center" justify="center"> <border height="30" color=".5" align="center" justify="center">
<text text="Brush Presets" font-face="arial" font-size="11" color="1 1 1 1"/> <text text="Brush Presets" font-face="arial" font-size="11" color="1 1 1 1"/>
</border> </border>
@@ -112,7 +112,7 @@
<!--brushes panel--> <!--brushes panel-->
<layout id="tpl-panel-brushes"> <layout id="tpl-panel-brushes">
<node width="220" margin="0 0 10 0"> <node width="220" margin="0 0 10 0" rtl="ltr">
<border height="30" color=".5" align="center" justify="center"> <border height="30" color=".5" align="center" justify="center">
<text text="Brushes" font-face="arial" font-size="11" color="1 1 1 1"/> <text text="Brushes" font-face="arial" font-size="11" color="1 1 1 1"/>
</border> </border>
@@ -123,7 +123,7 @@
<!--color panel--> <!--color panel-->
<layout id="tpl-panel-color"> <layout id="tpl-panel-color">
<node width="220" margin="0 0 10 0"> <node width="220" margin="0 0 10 0" rtl="ltr">
<border height="30" color=".5" align="center" justify="center"> <border height="30" color=".5" align="center" justify="center">
<text text="Colors" font-face="arial" font-size="11" color="1 1 1 1"/> <text text="Colors" font-face="arial" font-size="11" color="1 1 1 1"/>
</border> </border>
@@ -136,7 +136,7 @@
<!--stroke panel--> <!--stroke panel-->
<layout id="tpl-panel-stroke"> <layout id="tpl-panel-stroke">
<node width="220" margin="0 0 10 0"> <node width="220" margin="0 0 10 0" rtl="ltr">
<border height="30" color=".5" align="center" justify="center"> <border height="30" color=".5" align="center" justify="center">
<text text="Stroke" font-face="arial" font-size="11" color="1 1 1 1"/> <text text="Stroke" font-face="arial" font-size="11" color="1 1 1 1"/>
</border> </border>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 233 KiB

After

Width:  |  Height:  |  Size: 162 KiB

View File

@@ -163,6 +163,14 @@
AD744B6E1EBC9EF800B66E30 /* canvas_modes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */; }; AD744B6E1EBC9EF800B66E30 /* canvas_modes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD744B6C1EBC9EF700B66E30 /* canvas_modes.cpp */; };
AD759B681F2796EA00211963 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B671F2796EA00211963 /* OpenGLES.framework */; }; AD759B681F2796EA00211963 /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B671F2796EA00211963 /* OpenGLES.framework */; };
AD759B691F279B3900211963 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B661F27964D00211963 /* GLKit.framework */; }; AD759B691F279B3900211963 /* GLKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD759B661F27964D00211963 /* GLKit.framework */; };
AD787ADF20D4611100C4712A /* QuickLook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD787ADE20D4611100C4712A /* QuickLook.framework */; };
AD787AE320D4611100C4712A /* PreviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = AD787AE220D4611100C4712A /* PreviewViewController.m */; };
AD787AE620D4611100C4712A /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AD787AE420D4611100C4712A /* MainInterface.storyboard */; };
AD787AEA20D4611100C4712A /* PanoQL.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = AD787ADD20D4611100C4712A /* PanoQL.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AD787AF720D4637E00C4712A /* ThumbnailProvider.m in Sources */ = {isa = PBXBuildFile; fileRef = AD787AF620D4637E00C4712A /* ThumbnailProvider.m */; };
AD787AFB20D4637E00C4712A /* PanoThumb.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = AD787AF320D4637E00C4712A /* PanoThumb.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
AD787AFF20D5AD1500C4712A /* ZipArchive.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD06989620CC6C350010825F /* ZipArchive.framework */; };
AD787B0020D5AD1700C4712A /* ZipArchive.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD06989620CC6C350010825F /* ZipArchive.framework */; };
AD8CF7211E913F0500083FFD /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD8CF71F1E913F0500083FFD /* log.cpp */; }; AD8CF7211E913F0500083FFD /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD8CF71F1E913F0500083FFD /* log.cpp */; };
AD95AEC61E41EDEC002DD03A /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD95AEC31E41EDEC002DD03A /* font.cpp */; }; AD95AEC61E41EDEC002DD03A /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD95AEC31E41EDEC002DD03A /* font.cpp */; };
AD95AEC71E41EDEC002DD03A /* pch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD95AEC51E41EDEC002DD03A /* pch.cpp */; }; AD95AEC71E41EDEC002DD03A /* pch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AD95AEC51E41EDEC002DD03A /* pch.cpp */; };
@@ -240,6 +248,23 @@
ADEBA9092069A50E0085AE16 /* objc_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADEBA9082069A50E0085AE16 /* objc_utils.cpp */; }; ADEBA9092069A50E0085AE16 /* objc_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ADEBA9082069A50E0085AE16 /* objc_utils.cpp */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
AD787AE820D4611100C4712A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = AD58E0471E107411006ACC15 /* Project object */;
proxyType = 1;
remoteGlobalIDString = AD787ADC20D4611100C4712A;
remoteInfo = PanoQL;
};
AD787AF920D4637E00C4712A /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = AD58E0471E107411006ACC15 /* Project object */;
proxyType = 1;
remoteGlobalIDString = AD787AF220D4637E00C4712A;
remoteInfo = PanoThumb;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */ /* Begin PBXCopyFilesBuildPhase section */
AD06989C20CC89370010825F /* CopyFiles */ = { AD06989C20CC89370010825F /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
@@ -271,6 +296,18 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
AD787AEE20D4611100C4712A /* Embed App Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
AD787AEA20D4611100C4712A /* PanoQL.appex in Embed App Extensions */,
AD787AFB20D4637E00C4712A /* PanoThumb.appex in Embed App Extensions */,
);
name = "Embed App Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */ /* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -385,6 +422,16 @@
AD759B641F2793AE00211963 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; }; AD759B641F2793AE00211963 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
AD759B661F27964D00211963 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/GLKit.framework; sourceTree = DEVELOPER_DIR; }; AD759B661F27964D00211963 /* GLKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GLKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.0.sdk/System/Library/Frameworks/GLKit.framework; sourceTree = DEVELOPER_DIR; };
AD759B671F2796EA00211963 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; }; AD759B671F2796EA00211963 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/OpenGLES.framework; sourceTree = DEVELOPER_DIR; };
AD787ADD20D4611100C4712A /* PanoQL.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = PanoQL.appex; sourceTree = BUILT_PRODUCTS_DIR; };
AD787ADE20D4611100C4712A /* QuickLook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickLook.framework; path = System/Library/Frameworks/QuickLook.framework; sourceTree = SDKROOT; };
AD787AE120D4611100C4712A /* PreviewViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PreviewViewController.h; sourceTree = "<group>"; };
AD787AE220D4611100C4712A /* PreviewViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PreviewViewController.m; sourceTree = "<group>"; };
AD787AE520D4611100C4712A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = "<group>"; };
AD787AE720D4611100C4712A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AD787AF320D4637E00C4712A /* PanoThumb.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = PanoThumb.appex; sourceTree = BUILT_PRODUCTS_DIR; };
AD787AF520D4637E00C4712A /* ThumbnailProvider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ThumbnailProvider.h; sourceTree = "<group>"; };
AD787AF620D4637E00C4712A /* ThumbnailProvider.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ThumbnailProvider.m; sourceTree = "<group>"; };
AD787AF820D4637E00C4712A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
AD8CF71F1E913F0500083FFD /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = log.cpp; sourceTree = "<group>"; }; AD8CF71F1E913F0500083FFD /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = log.cpp; sourceTree = "<group>"; };
AD8CF7201E913F0500083FFD /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; }; AD8CF7201E913F0500083FFD /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
AD95AEC31E41EDEC002DD03A /* font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = font.cpp; sourceTree = "<group>"; }; AD95AEC31E41EDEC002DD03A /* font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = font.cpp; sourceTree = "<group>"; };
@@ -464,6 +511,23 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
AD787ADA20D4611100C4712A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
AD787ADF20D4611100C4712A /* QuickLook.framework in Frameworks */,
AD787B0020D5AD1700C4712A /* ZipArchive.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AD787AF020D4637E00C4712A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
AD787AFF20D5AD1500C4712A /* ZipArchive.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
ADD7D2681EBF9AE300D5A897 /* Frameworks */ = { ADD7D2681EBF9AE300D5A897 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -604,6 +668,8 @@
AD58E0511E107411006ACC15 /* engine */, AD58E0511E107411006ACC15 /* engine */,
ADD7D26C1EBF9AE300D5A897 /* PanoPainter */, ADD7D26C1EBF9AE300D5A897 /* PanoPainter */,
AD0E5C9D1ECC6F2B00C35669 /* PanoPainter-OSX */, AD0E5C9D1ECC6F2B00C35669 /* PanoPainter-OSX */,
AD787AE020D4611100C4712A /* PanoQL */,
AD787AF420D4637E00C4712A /* PanoThumb */,
AD58E0501E107411006ACC15 /* Products */, AD58E0501E107411006ACC15 /* Products */,
AD759B631F2793AD00211963 /* Frameworks */, AD759B631F2793AD00211963 /* Frameworks */,
); );
@@ -615,6 +681,8 @@
AD58E04F1E107411006ACC15 /* engine */, AD58E04F1E107411006ACC15 /* engine */,
ADD7D26B1EBF9AE300D5A897 /* PanoPainter.app */, ADD7D26B1EBF9AE300D5A897 /* PanoPainter.app */,
AD0E5C9C1ECC6F2B00C35669 /* PanoPainter.app */, AD0E5C9C1ECC6F2B00C35669 /* PanoPainter.app */,
AD787ADD20D4611100C4712A /* PanoQL.appex */,
AD787AF320D4637E00C4712A /* PanoThumb.appex */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -709,10 +777,32 @@
AD30D82E1F783E0100B6A112 /* libcurl.4.tbd */, AD30D82E1F783E0100B6A112 /* libcurl.4.tbd */,
AD759B661F27964D00211963 /* GLKit.framework */, AD759B661F27964D00211963 /* GLKit.framework */,
AD759B641F2793AE00211963 /* OpenGLES.framework */, AD759B641F2793AE00211963 /* OpenGLES.framework */,
AD787ADE20D4611100C4712A /* QuickLook.framework */,
); );
name = Frameworks; name = Frameworks;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
AD787AE020D4611100C4712A /* PanoQL */ = {
isa = PBXGroup;
children = (
AD787AE120D4611100C4712A /* PreviewViewController.h */,
AD787AE220D4611100C4712A /* PreviewViewController.m */,
AD787AE420D4611100C4712A /* MainInterface.storyboard */,
AD787AE720D4611100C4712A /* Info.plist */,
);
path = PanoQL;
sourceTree = "<group>";
};
AD787AF420D4637E00C4712A /* PanoThumb */ = {
isa = PBXGroup;
children = (
AD787AF520D4637E00C4712A /* ThumbnailProvider.h */,
AD787AF620D4637E00C4712A /* ThumbnailProvider.m */,
AD787AF820D4637E00C4712A /* Info.plist */,
);
path = PanoThumb;
sourceTree = "<group>";
};
ADD7D26C1EBF9AE300D5A897 /* PanoPainter */ = { ADD7D26C1EBF9AE300D5A897 /* PanoPainter */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -789,6 +879,40 @@
productReference = AD58E04F1E107411006ACC15 /* engine */; productReference = AD58E04F1E107411006ACC15 /* engine */;
productType = "com.apple.product-type.tool"; productType = "com.apple.product-type.tool";
}; };
AD787ADC20D4611100C4712A /* PanoQL */ = {
isa = PBXNativeTarget;
buildConfigurationList = AD787AEB20D4611100C4712A /* Build configuration list for PBXNativeTarget "PanoQL" */;
buildPhases = (
AD787AD920D4611100C4712A /* Sources */,
AD787ADA20D4611100C4712A /* Frameworks */,
AD787ADB20D4611100C4712A /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = PanoQL;
productName = PanoQL;
productReference = AD787ADD20D4611100C4712A /* PanoQL.appex */;
productType = "com.apple.product-type.app-extension";
};
AD787AF220D4637E00C4712A /* PanoThumb */ = {
isa = PBXNativeTarget;
buildConfigurationList = AD787AFC20D4637F00C4712A /* Build configuration list for PBXNativeTarget "PanoThumb" */;
buildPhases = (
AD787AEF20D4637E00C4712A /* Sources */,
AD787AF020D4637E00C4712A /* Frameworks */,
AD787AF120D4637E00C4712A /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = PanoThumb;
productName = PanoThumb;
productReference = AD787AF320D4637E00C4712A /* PanoThumb.appex */;
productType = "com.apple.product-type.app-extension";
};
ADD7D26A1EBF9AE300D5A897 /* PanoPainter */ = { ADD7D26A1EBF9AE300D5A897 /* PanoPainter */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = ADD7D2851EBF9AE300D5A897 /* Build configuration list for PBXNativeTarget "PanoPainter" */; buildConfigurationList = ADD7D2851EBF9AE300D5A897 /* Build configuration list for PBXNativeTarget "PanoPainter" */;
@@ -797,10 +921,13 @@
ADD7D2681EBF9AE300D5A897 /* Frameworks */, ADD7D2681EBF9AE300D5A897 /* Frameworks */,
ADD7D2691EBF9AE300D5A897 /* Resources */, ADD7D2691EBF9AE300D5A897 /* Resources */,
AD06989C20CC89370010825F /* CopyFiles */, AD06989C20CC89370010825F /* CopyFiles */,
AD787AEE20D4611100C4712A /* Embed App Extensions */,
); );
buildRules = ( buildRules = (
); );
dependencies = ( dependencies = (
AD787AE920D4611100C4712A /* PBXTargetDependency */,
AD787AFA20D4637E00C4712A /* PBXTargetDependency */,
); );
name = PanoPainter; name = PanoPainter;
productName = PanoPainter; productName = PanoPainter;
@@ -826,6 +953,16 @@
DevelopmentTeam = A6Y3VHN7V9; DevelopmentTeam = A6Y3VHN7V9;
ProvisioningStyle = Automatic; ProvisioningStyle = Automatic;
}; };
AD787ADC20D4611100C4712A = {
CreatedOnToolsVersion = 9.4.1;
DevelopmentTeam = ERD9AYQ49S;
ProvisioningStyle = Automatic;
};
AD787AF220D4637E00C4712A = {
CreatedOnToolsVersion = 9.4.1;
DevelopmentTeam = ERD9AYQ49S;
ProvisioningStyle = Automatic;
};
ADD7D26A1EBF9AE300D5A897 = { ADD7D26A1EBF9AE300D5A897 = {
CreatedOnToolsVersion = 7.2; CreatedOnToolsVersion = 7.2;
DevelopmentTeam = ERD9AYQ49S; DevelopmentTeam = ERD9AYQ49S;
@@ -848,6 +985,8 @@
AD58E04E1E107411006ACC15 /* engine */, AD58E04E1E107411006ACC15 /* engine */,
ADD7D26A1EBF9AE300D5A897 /* PanoPainter */, ADD7D26A1EBF9AE300D5A897 /* PanoPainter */,
AD0E5C9B1ECC6F2B00C35669 /* PanoPainter-OSX */, AD0E5C9B1ECC6F2B00C35669 /* PanoPainter-OSX */,
AD787ADC20D4611100C4712A /* PanoQL */,
AD787AF220D4637E00C4712A /* PanoThumb */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
@@ -863,6 +1002,21 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
AD787ADB20D4611100C4712A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AD787AE620D4611100C4712A /* MainInterface.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AD787AF120D4637E00C4712A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
ADD7D2691EBF9AE300D5A897 /* Resources */ = { ADD7D2691EBF9AE300D5A897 /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -1019,6 +1173,22 @@
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
AD787AD920D4611100C4712A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AD787AE320D4611100C4712A /* PreviewViewController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
AD787AEF20D4637E00C4712A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
AD787AF720D4637E00C4712A /* ThumbnailProvider.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
ADD7D2671EBF9AE300D5A897 /* Sources */ = { ADD7D2671EBF9AE300D5A897 /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -1097,6 +1267,19 @@
}; };
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
AD787AE920D4611100C4712A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = AD787ADC20D4611100C4712A /* PanoQL */;
targetProxy = AD787AE820D4611100C4712A /* PBXContainerItemProxy */;
};
AD787AFA20D4637E00C4712A /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = AD787AF220D4637E00C4712A /* PanoThumb */;
targetProxy = AD787AF920D4637E00C4712A /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */ /* Begin PBXVariantGroup section */
AD0E5CA61ECC6F2B00C35669 /* MainMenu.xib */ = { AD0E5CA61ECC6F2B00C35669 /* MainMenu.xib */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
@@ -1106,6 +1289,14 @@
name = MainMenu.xib; name = MainMenu.xib;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
AD787AE420D4611100C4712A /* MainInterface.storyboard */ = {
isa = PBXVariantGroup;
children = (
AD787AE520D4611100C4712A /* Base */,
);
name = MainInterface.storyboard;
sourceTree = "<group>";
};
ADD7D27A1EBF9AE300D5A897 /* Main.storyboard */ = { ADD7D27A1EBF9AE300D5A897 /* Main.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
@@ -1302,6 +1493,176 @@
}; };
name = Release; name = Release;
}; };
AD787AEC20D4611100C4712A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ERD9AYQ49S;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/libs/ZipArchive/iOS",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = PanoQL/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios.PanoQL;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
AD787AED20D4611100C4712A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ERD9AYQ49S;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/libs/ZipArchive/iOS",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = PanoQL/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios.PanoQL;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
AD787AFD20D4637F00C4712A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ERD9AYQ49S;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/libs/ZipArchive/iOS",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = PanoThumb/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios.PanoThumb;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
AD787AFE20D4637F00C4712A /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_IDENTITY = "iPhone Developer";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = ERD9AYQ49S;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/libs/ZipArchive/iOS",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = PanoThumb/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.2;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = com.omixlab.panopainter.ios.PanoThumb;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SDKROOT = iphoneos;
SKIP_INSTALL = YES;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
ADD7D2831EBF9AE300D5A897 /* Debug */ = { ADD7D2831EBF9AE300D5A897 /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@@ -1402,6 +1763,24 @@
defaultConfigurationIsVisible = 0; defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release; defaultConfigurationName = Release;
}; };
AD787AEB20D4611100C4712A /* Build configuration list for PBXNativeTarget "PanoQL" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AD787AEC20D4611100C4712A /* Debug */,
AD787AED20D4611100C4712A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
AD787AFC20D4637F00C4712A /* Build configuration list for PBXNativeTarget "PanoThumb" */ = {
isa = XCConfigurationList;
buildConfigurations = (
AD787AFD20D4637F00C4712A /* Debug */,
AD787AFE20D4637F00C4712A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
ADD7D2851EBF9AE300D5A897 /* Build configuration list for PBXNativeTarget "PanoPainter" */ = { ADD7D2851EBF9AE300D5A897 /* Build configuration list for PBXNativeTarget "PanoPainter" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (

View File

@@ -14,6 +14,16 @@
<key>orderHint</key> <key>orderHint</key>
<integer>1</integer> <integer>1</integer>
</dict> </dict>
<key>PanoQL.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
</dict>
<key>PanoThumb.xcscheme</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
</dict>
<key>engine.xcscheme</key> <key>engine.xcscheme</key>
<dict> <dict>
<key>orderHint</key> <key>orderHint</key>

View File

@@ -33,7 +33,9 @@ void App::create()
bool App::request_close() bool App::request_close()
{ {
static bool dialog_already_opened = false; static bool dialog_already_opened = false;
if (ui::Canvas::I->m_unsaved && !dialog_already_opened) if (!ui::Canvas::I->m_unsaved)
return true;
if (!dialog_already_opened)
{ {
async_start(); async_start();
auto* m = layout[main_id]->add_child<NodeMessageBox>(); auto* m = layout[main_id]->add_child<NodeMessageBox>();
@@ -43,9 +45,15 @@ bool App::request_close()
m->btn_ok->on_click = [](Node*) { m->btn_ok->on_click = [](Node*) {
}; };
m->btn_cancel->m_text->set_text("No"); m->btn_cancel->m_text->set_text("No");
m->btn_cancel->on_click = [](Node*) { m->btn_cancel->on_click = [this](Node*) {
#ifdef _WIN32
destroy_window(); destroy_window();
PostQuitMessage(0); PostQuitMessage(0);
#endif
#ifdef __OSX__
[osx_view close];
#endif
ui::Canvas::I->m_unsaved = false;
}; };
async_redraw(); async_redraw();
async_end(); async_end();

View File

@@ -160,9 +160,11 @@ void CanvasModePen::on_MouseEvent(MouseEvent* me, glm::vec2& loc)
void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera) void CanvasModePen::on_Draw(const glm::mat4& ortho, const glm::mat4& proj, const glm::mat4& camera)
{ {
#ifndef __IOS__ #ifndef __IOS__
if (!m_dragging && !m_picking || m_resizing) if (1)
{ {
auto pos = m_resizing ? m_size_pos_start : m_cur_pos; auto pos = m_resizing ? m_size_pos_start : m_cur_pos;
if (App::I.keys[(int)kKey::KeyAlt])
pos.x = pos.x - canvas->m_current_brush.m_tip_size * 500;
ui::ShaderManager::use(ui::kShader::StrokePreview); ui::ShaderManager::use(ui::kShader::StrokePreview);
ui::ShaderManager::u_int(ui::kShaderUniform::Tex, 0); ui::ShaderManager::u_int(ui::kShaderUniform::Tex, 0);
ui::ShaderManager::u_float(ui::kShaderUniform::Alpha, canvas->m_current_brush.m_tip_flow); ui::ShaderManager::u_float(ui::kShaderUniform::Alpha, canvas->m_current_brush.m_tip_flow);