mirror of https://github.com/CGAL/cgal
183 lines
6.1 KiB
C++
183 lines
6.1 KiB
C++
#include "Polyhedron_demo.h"
|
|
#include "MainWindow.h"
|
|
#include <QMessageBox>
|
|
#include <CGAL/Qt/resources.h>
|
|
#include <stdexcept>
|
|
|
|
#include <QCommandLineParser>
|
|
#include <QCommandLineOption>
|
|
#include <QSurfaceFormat>
|
|
#include <QOpenGLContext>
|
|
#include <clocale>
|
|
|
|
|
|
struct Polyhedron_demo_impl {
|
|
bool catch_exceptions;
|
|
QScopedPointer<MainWindow> mainWindow;
|
|
|
|
Polyhedron_demo_impl() : catch_exceptions(true) {}
|
|
}; // end struct Polyhedron_demo_impl
|
|
|
|
int& code_to_call_before_creation_of_QCoreApplication(int& i) {
|
|
QSurfaceFormat fmt;
|
|
|
|
fmt.setVersion(4, 3);
|
|
fmt.setRenderableType(QSurfaceFormat::OpenGL);
|
|
fmt.setProfile(QSurfaceFormat::CoreProfile);
|
|
fmt.setOption(QSurfaceFormat::DebugContext);
|
|
QSurfaceFormat::setDefaultFormat(fmt);
|
|
|
|
//for windows
|
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0))
|
|
QCoreApplication::setAttribute(Qt::AA_UseDesktopOpenGL);
|
|
#endif
|
|
|
|
//We set the locale to avoid any trouble with VTK
|
|
std::setlocale(LC_ALL, "C");
|
|
return i;
|
|
}
|
|
|
|
Polyhedron_demo::Polyhedron_demo(int& argc, char **argv,
|
|
QString application_name,
|
|
QString main_window_title,
|
|
QStringList input_keywords)
|
|
: QApplication(code_to_call_before_creation_of_QCoreApplication(argc),
|
|
// This trick in the previous line ensure that code
|
|
// is called before the creation of the QApplication
|
|
// object.
|
|
argv)
|
|
, d_ptr_is_initialized(false)
|
|
, d_ptr(new Polyhedron_demo_impl)
|
|
{
|
|
d_ptr_is_initialized = true;
|
|
std::cerr.precision(17);
|
|
std::cout.precision(17);
|
|
std::clog.precision(17);
|
|
|
|
// Import resources from libCGAL (Qt5).
|
|
CGAL_QT_INIT_RESOURCES;
|
|
|
|
this->setOrganizationDomain("geometryfactory.com");
|
|
this->setOrganizationName("GeometryFactory");
|
|
this->setApplicationName(application_name);
|
|
|
|
QCommandLineParser parser;
|
|
parser.addHelpOption();
|
|
|
|
QCommandLineOption use_keyword("keyword",
|
|
tr("Only loads the plugins associated with the following keyword. Can be called multiple times."),
|
|
"keyword");
|
|
parser.addOption(use_keyword);
|
|
|
|
QCommandLineOption use_meta("use-meta",
|
|
tr("Use the [Meta] key to move frames, instead of [Tab]."));
|
|
parser.addOption(use_meta);
|
|
QCommandLineOption no_try_catch("no-try-catch",
|
|
tr("Do not catch uncaught exceptions."));
|
|
parser.addOption(no_try_catch);
|
|
QCommandLineOption debug_scripts("debug-scripts",
|
|
tr("Use the scripts debugger."));
|
|
parser.addOption(debug_scripts);
|
|
QCommandLineOption no_debug_scripts("no-debug-scripts",
|
|
tr("Do not use the scripts debugger."));
|
|
parser.addOption(no_debug_scripts);
|
|
QCommandLineOption no_autostart("no-autostart",
|
|
tr("Ignore the autostart.js file, if any."));
|
|
parser.addOption(no_autostart);
|
|
QCommandLineOption verbose("verbose",
|
|
tr("Print the paths explored byt the application searching for plugins."));
|
|
parser.addOption(verbose);
|
|
QCommandLineOption old("old",
|
|
tr("Force OpenGL 2.1 context."));
|
|
parser.addOption(old);
|
|
parser.addPositionalArgument("files", tr("Files to open"), "[files...]");
|
|
parser.process(*this);
|
|
QStringList keywords = input_keywords;
|
|
QStringList parser_keywords = parser.values(use_keyword);
|
|
keywords.append(parser_keywords);
|
|
d_ptr->mainWindow.reset(new MainWindow(keywords, parser.isSet(verbose)));
|
|
MainWindow& mainWindow = *d_ptr->mainWindow;
|
|
|
|
mainWindow.setWindowTitle(main_window_title);
|
|
mainWindow.show();
|
|
|
|
// On Apple, the first time the application is launched, the menus are unclicable, and
|
|
// the only way you can fix it is to unfocus and re-focus the application.
|
|
// This is a hack that makes the application lose the focus after it is started, to force the user
|
|
// to re-focus it. (source : http://www.alecjacobson.com/weblog/?p=3910)
|
|
#ifdef __APPLE__
|
|
system("osascript -e 'tell application \"System Events\" "
|
|
"to keystroke tab using {command down, shift down}'");
|
|
#endif
|
|
if(parser.isSet(use_meta)) {
|
|
mainWindow.setAddKeyFrameKeyboardModifiers(::Qt::MetaModifier);
|
|
}
|
|
if(parser.isSet(no_try_catch)) {
|
|
this->do_not_catch_exceptions();
|
|
}
|
|
#ifdef QT_SCRIPTTOOLS_LIB
|
|
if(parser.isSet(debug_scripts)) {
|
|
mainWindow.enableScriptDebugger();
|
|
}
|
|
if(parser.isSet(no_debug_scripts)) {
|
|
mainWindow.enableScriptDebugger(false);
|
|
}
|
|
#else
|
|
if(parser.isSet(debug_scripts)) {
|
|
std::cerr << "Qt Script Tools have not been configured!";
|
|
abort();
|
|
}
|
|
#endif
|
|
|
|
mainWindow.loadScript(":/cgal/Polyhedron_3/javascript/lib.js");
|
|
QFileInfo autostart_js("autostart.js");
|
|
if(!parser.isSet(no_autostart) && autostart_js.exists()) {
|
|
mainWindow.loadScript(autostart_js);
|
|
}
|
|
Q_FOREACH(QString filename, parser.positionalArguments()) {
|
|
mainWindow.open(filename);
|
|
}
|
|
|
|
}
|
|
|
|
Polyhedron_demo::~Polyhedron_demo() {}
|
|
|
|
void Polyhedron_demo::do_not_catch_exceptions() {
|
|
d_ptr->catch_exceptions = false;
|
|
setProperty("no-try-catch", true);
|
|
}
|
|
|
|
bool Polyhedron_demo::notify(QObject* receiver, QEvent* event)
|
|
{
|
|
if(!d_ptr_is_initialized || !d_ptr->catch_exceptions)
|
|
return QApplication::notify(receiver, event);
|
|
else try {
|
|
return QApplication::notify(receiver, event);
|
|
} catch (std::exception &e) {
|
|
// find the mainwindow to spawn an error message
|
|
Q_FOREACH (QWidget *widget, QApplication::topLevelWidgets()) {
|
|
if(MainWindow* mw = qobject_cast<MainWindow*>(widget)) {
|
|
QMessageBox::critical(mw,
|
|
tr("Unhandled exception"),
|
|
tr("<p>Unhandled exception:</p>\n"
|
|
"<pre>%1</pre>").arg(e.what()));
|
|
break;
|
|
}
|
|
}
|
|
QApplication::restoreOverrideCursor();
|
|
} catch (...) {
|
|
qFatal("Unknown exception encountered. Aborting.");
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int Polyhedron_demo::try_exec()
|
|
{
|
|
// A Qt Script may have closed the main window.
|
|
// The following loop launch app.exec() only if the main window is visible.
|
|
if(d_ptr->mainWindow->isVisible()) {
|
|
return this->exec();
|
|
}
|
|
return 0;
|
|
}
|