8
#include <QX11EmbedContainer>
11
#include "mainwindow.h"
13
MainWindow::MainWindow()
18
setCentralWidget(new QX11EmbedContainer(this));
20
setCentralWidget(new QWidget(this));
24
void MainWindow::createActions()
26
loadAct = new QAction(tr("&Load"), this);
27
loadAct->setStatusTip(tr("Load FreeCAD module"));
28
connect(loadAct, SIGNAL(triggered()), this, SLOT(loadFreeCAD()));
30
newAct = new QAction(tr("New document"), this);
31
newAct->setStatusTip(tr("Create new document in the FreeCAD module"));
32
connect(newAct, SIGNAL(triggered()), this, SLOT(newDocument()));
33
newAct->setDisabled(true);
35
embedAct = new QAction(tr("Embed"), this);
36
embedAct->setStatusTip(tr("Embed FreeCAD as child window"));
37
connect(embedAct, SIGNAL(triggered()), this, SLOT(embedWindow()));
38
embedAct->setDisabled(true);
40
exitAct = new QAction(tr("E&xit"), this);
41
exitAct->setShortcut(tr("Ctrl+Q"));
42
exitAct->setStatusTip(tr("Exit the application"));
43
connect(exitAct, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));
45
aboutAct = new QAction(tr("&About"), this);
46
aboutAct->setStatusTip(tr("Show the application's About box"));
47
connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
50
void MainWindow::createMenus()
52
fileMenu = menuBar()->addMenu(tr("&File"));
53
fileMenu->addAction(exitAct);
55
editMenu = menuBar()->addMenu(tr("Free&CAD"));
56
editMenu->addAction(loadAct);
57
editMenu->addAction(newAct);
58
editMenu->addAction(embedAct);
60
menuBar()->addSeparator();
62
helpMenu = menuBar()->addMenu(tr("&Help"));
63
helpMenu->addAction(aboutAct);
66
void MainWindow::loadFreeCAD()
68
QString path = QFileDialog::getExistingDirectory(this, "FreeCAD module path");
69
if (!path.isEmpty()) {
70
path.replace('\\', '/');
71
PyObject* main = PyImport_AddModule("__main__");
72
PyObject* dict = PyModule_GetDict(main);
73
std::stringstream cmd;
74
cmd << "import sys,os\n"
75
<< "sys.path.append(\"" << (const char*)path.toLatin1() << "\")\n"
76
<< "os.chdir(\"" << (const char*)path.toLatin1() << "\")\n"
77
<< "import FreeCADGui\n"
78
<< "FreeCADGui.showMainWindow()\n";
80
PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
83
loadAct->setDisabled(true);
84
newAct->setEnabled(true);
85
embedAct->setEnabled(true);
88
PyObject *ptype, *pvalue, *ptrace;
89
PyErr_Fetch(&ptype, &pvalue, &ptrace);
90
PyObject* pystring = PyObject_Str(pvalue);
91
const char* error = PyUnicode_AsUTF8(pystring);
92
QMessageBox::warning(this, "Error", error);
99
void MainWindow::newDocument()
101
PyObject* main = PyImport_AddModule("__main__");
102
PyObject* dict = PyModule_GetDict(main);
103
const char* cmd = "FreeCAD.newDocument()\n";
105
PyObject* result = PyRun_String(cmd, Py_file_input, dict, dict);
110
PyObject *ptype, *pvalue, *ptrace;
111
PyErr_Fetch(&ptype, &pvalue, &ptrace);
112
PyObject* pystring = PyObject_Str(pvalue);
113
const char* error = PyUnicode_AsUTF8(pystring);
114
QMessageBox::warning(this, "Error", error);
120
void MainWindow::embedWindow()
122
PyObject* main = PyImport_AddModule("__main__");
123
PyObject* dict = PyModule_GetDict(main);
124
std::stringstream cmd;
125
cmd << "class BlankWorkbench (Workbench):\n"
126
<< " MenuText = \"Blank\"\n"
127
<< " ToolTip = \"Blank workbench\"\n"
129
<< " def Initialize(self):\n"
131
<< " def GetClassName(self):\n"
132
<< " return \"Gui::BlankWorkbench\"\n"
134
<< "FreeCADGui.addWorkbench(BlankWorkbench)\n"
135
<< "FreeCADGui.activateWorkbench(\"BlankWorkbench\")\n"
138
#if defined(Q_WS_X11) || defined(Q_OS_WIN)
139
WId hwnd = this->centralWidget()->winId();
140
cmd << "FreeCADGui.embedToWindow(\"" << hwnd << "\")\n"
144
PyObject* result = PyRun_String(cmd.str().c_str(), Py_file_input, dict, dict);
148
#if !defined(Q_WS_X11)
149
// This is a workaround for the lack of a replacement of QX11EmbedWidget with Qt5
150
QWidget* mw = nullptr;
151
for (auto it : qApp->topLevelWidgets()) {
152
if (it->inherits("Gui::MainWindow")) {
158
QVBoxLayout* vb = new QVBoxLayout();
159
centralWidget()->setLayout(vb);
164
embedAct->setDisabled(true);
167
PyObject *ptype, *pvalue, *ptrace;
168
PyErr_Fetch(&ptype, &pvalue, &ptrace);
169
PyObject* pystring = PyObject_Str(pvalue);
170
const char* error = PyUnicode_AsUTF8(pystring);
171
QMessageBox::warning(this, "Error", error);
177
void MainWindow::about()
179
QMessageBox::about(this, tr("About"), tr("Demonstrates remote control of FreeCAD"));