diff --git a/PanoPainter/Info.plist b/PanoPainter/Info.plist
index b0febed..d214d7e 100644
--- a/PanoPainter/Info.plist
+++ b/PanoPainter/Info.plist
@@ -18,6 +18,16 @@
com.panopainter.image
+
+ CFBundleTypeIconFiles
+
+ CFBundleTypeName
+ ABR
+ LSItemContentTypes
+
+ com.panopainter.abr
+
+
CFBundleExecutable
$(EXECUTABLE_NAME)
@@ -70,6 +80,30 @@
UTExportedTypeDeclarations
+
+
+ UTTypeConformsTo
+
+ public.data
+ public.content
+
+ UTTypeDescription
+ PanoPainter Image
+ UTTypeIconFiles
+
+ UTTypeIdentifier
+ com.panopainter.image
+ UTTypeTagSpecification
+
+ public.filename-extension
+
+ ppi
+
+ public.mime-type
+ image/ppi
+
+
+
UTTypeConformsTo
@@ -77,19 +111,19 @@
public.content
UTTypeDescription
- PanoPainter Image
+ ABR
UTTypeIconFiles
UTTypeIdentifier
- com.panopainter.image
+ com.panopainter.abr
UTTypeTagSpecification
public.filename-extension
- ppi
+ abr
public.mime-type
- image/ppi
+ preset/abr
diff --git a/src/app.cpp b/src/app.cpp
index 3d29290..2a32f4a 100644
--- a/src/app.cpp
+++ b/src/app.cpp
@@ -31,33 +31,45 @@ void App::create()
void App::open_document(std::string path)
{
- auto start = path.rfind('/') + 1;
- doc_name = path.substr(start, path.length() - start - strlen(".ppi"));
- doc_dir = path.substr(0, start - 1);
- doc_path = path;
- canvas->reset_camera();
- layers->clear();
- canvas->m_canvas->project_open(path, [this](bool success){
- // on complete
- if (success)
- {
- async_start();
- title_update();
- for (auto& i : canvas->m_canvas->m_order)
+ std::regex r(R"((.*)[\\/]([^\\/]+)\.(\w+)$)");
+ std::smatch m;
+ if (!std::regex_search(path, m, r))
+ return;
+ std::string ext = m[3].str();
+
+ if (str_iequals(m[3].str(), "abr"))
+ {
+ std::thread(&NodePanelStroke::import_abr, stroke, path).detach();
+ }
+ else
+ {
+ doc_name = m[2].str();
+ doc_dir = m[1].str();
+ doc_path = path;
+ canvas->reset_camera();
+ layers->clear();
+ canvas->m_canvas->project_open(path, [this](bool success){
+ // on complete
+ if (success)
{
- auto l = layers->add_layer(canvas->m_canvas->m_layers[i]->m_name.c_str());
- l->m_visibility->set_value(canvas->m_canvas->m_layers[i]->m_visible);
+ async_start();
+ title_update();
+ for (auto& i : canvas->m_canvas->m_order)
+ {
+ auto l = layers->add_layer(canvas->m_canvas->m_layers[i]->m_name.c_str());
+ l->m_visibility->set_value(canvas->m_canvas->m_layers[i]->m_visible);
+ }
+ async_end();
}
- async_end();
- }
- else
- {
- message_box("Open Document Error",
- "There was an error opening the document.\n"
- "It may be inaccessible or corrupted.");
- }
- });
- ActionManager::clear();
+ else
+ {
+ message_box("Open Document Error",
+ "There was an error opening the document.\n"
+ "It may be inaccessible or corrupted.");
+ }
+ });
+ ActionManager::clear();
+ }
}
bool App::request_close()
diff --git a/src/app_events.cpp b/src/app_events.cpp
index befa88f..f1c1d40 100644
--- a/src/app_events.cpp
+++ b/src/app_events.cpp
@@ -86,7 +86,8 @@ void App::pick_file(std::vector types, std::function