summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EventFilter.h28
-rw-r--r--Info.plist35
-rw-r--r--MainWindow.h2
-rw-r--r--mainwin.cc65
-rw-r--r--openscad.cc6
-rw-r--r--openscad.pro5
6 files changed, 106 insertions, 35 deletions
diff --git a/EventFilter.h b/EventFilter.h
new file mode 100644
index 0000000..c3942b5
--- /dev/null
+++ b/EventFilter.h
@@ -0,0 +1,28 @@
+#ifndef FILTER_H_
+#define FILTER_H_
+
+#include <QObject>
+#include <QFileOpenEvent>
+#include "MainWindow.h"
+
+class EventFilter : public QObject
+{
+ Q_OBJECT;
+
+public:
+ EventFilter(QObject *parent) : QObject(parent) {}
+protected:
+ bool eventFilter(QObject *obj, QEvent *event) {
+ // Handle Apple event for opening files
+ if (event->type() == QEvent::FileOpen) {
+ QFileOpenEvent *foe = static_cast<QFileOpenEvent *>(event);
+ MainWindow::requestOpenFile(foe->file());
+ return true;
+ } else {
+ // standard event processing
+ return QObject::eventFilter(obj, event);
+ }
+ }
+};
+
+#endif
diff --git a/Info.plist b/Info.plist
new file mode 100644
index 0000000..5dadad9
--- /dev/null
+++ b/Info.plist
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">
+<plist version="0.9">
+<dict>
+ <key>CFBundleIconFile</key>
+ <string>@ICON@</string>
+ <key>CFBundlePackageType</key>
+ <string>APPL</string>
+ <key>CFBundleSignature</key>
+ <string>????</string>
+ <key>CFBundleExecutable</key>
+ <string>OpenSCAD</string>
+ <key>CFBundleIdentifier</key>
+ <string>org.openscad.OpenSCAD</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>scad</string>
+ </array>
+ <key>CFBundleTypeMIMETypes</key>
+ <array>
+ <string>text/plain</string>
+ </array>
+ <key>CFBundleTypeName</key>
+ <string>OpenSCAD Model</string>
+ <key>CFBundleTypeRole</key>
+ <string>Editor</string>
+ <key>LSIsAppleDefaultForType</key>
+ <true/>
+ </dict>
+ </array>
+</dict>
+</plist>
diff --git a/MainWindow.h b/MainWindow.h
index 39609cd..f89809a 100644
--- a/MainWindow.h
+++ b/MainWindow.h
@@ -11,6 +11,7 @@ class MainWindow : public QMainWindow, public Ui::MainWindow
public:
static QPointer<MainWindow> current_win;
+ static void requestOpenFile(const QString &filename);
QString filename;
class Highlighter *highlighter;
@@ -46,6 +47,7 @@ private slots:
void updateTVal();
private:
+ void openFile(const QString &filename);
void load();
void maybe_change_dir();
void find_root_tag(AbstractNode *n);
diff --git a/mainwin.cc b/mainwin.cc
index dfd7166..4fdc001 100644
--- a/mainwin.cc
+++ b/mainwin.cc
@@ -253,6 +253,32 @@ MainWindow::~MainWindow()
#endif
}
+/*!
+ Requests to open a file from an external event, e.g. by double-clicking a filename.
+ */
+void MainWindow::requestOpenFile(const QString &filename)
+{
+#ifdef ENABLE_MDI
+ new MainWindow(filename.toUtf8());
+#endif
+}
+
+void
+MainWindow::openFile(const QString &new_filename)
+{
+#ifdef ENABLE_MDI
+ if (!editor->toPlainText().isEmpty()) {
+ new MainWindow(new_filename.toUtf8());
+ current_win = NULL;
+ return;
+ }
+#endif
+ filename = new_filename;
+ maybe_change_dir();
+ setWindowTitle(filename);
+ load();
+}
+
void MainWindow::updatedFps()
{
bool fps_ok;
@@ -287,7 +313,7 @@ void MainWindow::load()
if (!filename.isEmpty())
{
QString text;
- FILE *fp = fopen(filename.toAscii().data(), "rt");
+ FILE *fp = fopen(filename.toUtf8(), "rt");
if (!fp) {
PRINTA("Failed to open file: %1 (%2)", filename, QString(strerror(errno)));
} else {
@@ -529,43 +555,16 @@ void MainWindow::actionNew()
void MainWindow::actionOpen()
{
current_win = this;
- QString new_filename = QFileDialog::getOpenFileName(this, "Open File", "", "OpenSCAD Designs (*.scad)");
- if (!new_filename.isEmpty())
- {
-#ifdef ENABLE_MDI
- if (!editor->toPlainText().isEmpty()) {
- new MainWindow(new_filename.toAscii().data());
- current_win = NULL;
- return;
- }
-#endif
- filename = new_filename;
- maybe_change_dir();
- setWindowTitle(filename);
-
- QString text;
- FILE *fp = fopen(filename.toAscii().data(), "rt");
- if (!fp) {
- PRINTA("Failed to open file: %1 (%2)", QString(filename), QString(strerror(errno)));
- } else {
- char buffer[513];
- int rc;
- while ((rc = fread(buffer, 1, 512, fp)) > 0) {
- buffer[rc] = 0;
- text += buffer;
- }
- fclose(fp);
- PRINTA("Loaded design `%1'.", QString(filename));
- }
- editor->setPlainText(text);
- }
+ QString new_filename = QFileDialog::getOpenFileName(this, "Open File", "",
+ "OpenSCAD Designs (*.scad)");
+ if (!new_filename.isEmpty()) openFile(new_filename);
current_win = NULL;
}
void MainWindow::actionSave()
{
current_win = this;
- FILE *fp = fopen(filename.toAscii().data(), "wt");
+ FILE *fp = fopen(filename.toUtf8(), "wt");
if (!fp) {
PRINTA("Failed to open file for writing: %1 (%2)", QString(filename), QString(strerror(errno)));
} else {
@@ -1310,7 +1309,7 @@ void MainWindow::dropEvent(QDropEvent *event)
QString fn = urls[i].path();
#ifdef ENABLE_MDI
if (!editor->toPlainText().isEmpty()) {
- new MainWindow(fn.toAscii().data());
+ new MainWindow(fn.toUtf8());
break;
}
#endif
diff --git a/openscad.cc b/openscad.cc
index 4096ed2..37875df 100644
--- a/openscad.cc
+++ b/openscad.cc
@@ -28,6 +28,9 @@
#include <QDir>
#include <QSet>
#include <getopt.h>
+#ifdef Q_WS_MAC
+#include "EventFilter.h"
+#endif
static void help(const char *progname)
{
@@ -72,8 +75,9 @@ int main(int argc, char **argv)
bool useGUI = true;
#endif
QApplication app(argc, argv, useGUI);
-#ifdef __APPLE__
+#ifdef Q_WS_MAC
app.setLibraryPaths(QStringList(app.applicationDirPath() + "/../PlugIns"));
+ app.installEventFilter(new EventFilter(&app));
#endif
const char *filename = NULL;
diff --git a/openscad.pro b/openscad.pro
index 46866d3..23e076e 100644
--- a/openscad.pro
+++ b/openscad.pro
@@ -2,6 +2,7 @@
macx {
TARGET = OpenSCAD
ICON = OpenSCAD.icns
+ QMAKE_INFO_PLIST = Info.plist
}
else {
TARGET = openscad
@@ -16,7 +17,7 @@ QMAKE_CXXFLAGS_RELEASE = -O3 -march=pentium
QMAKE_CXXFLAGS_DEBUG = -O0 -ggdb
# MDI needs an OpenCSG library that is compiled with OpenCSG-Reset-Hack.patch applied
-# DEFINES += ENABLE_MDI
+DEFINES += ENABLE_MDI
DEFINES += ENABLE_CGAL
LIBS += -lCGAL
@@ -47,6 +48,8 @@ HEADERS += openscad.h \
GLView.h \
printutils.h
+macx: HEADERS += EventFilter.h
+
SOURCES += openscad.cc mainwin.cc glview.cc export.cc \
value.cc expr.cc func.cc module.cc context.cc \
csgterm.cc polyset.cc csgops.cc transform.cc \
contact: Jan Huwald // Impressum