29 MainWindow::MainWindow (
void) : QMainWindow(NULL, Qt::Window)
33 mdiArea =
new QMdiArea;
34 setCentralWidget(mdiArea);
37 setWindowTitle(
"RTXI - Real-time eXperimental Interface");
38 setWindowIcon(QIcon(
"/usr/local/share/rtxi/RTXI-icon.png"));
41 QCoreApplication::setOrganizationName(
"RTXI");
42 QCoreApplication::setOrganizationDomain(
"rtxi.org");
43 QCoreApplication::setApplicationName(
"RTXI");
72 return moduleMenu->addSeparator();
77 return fileMenu->addAction(text);
84 fileMenu->addAction(load);
85 fileMenu->addAction(save);
86 fileMenu->addAction(reset);
87 fileMenu->addSeparator();
88 fileMenu->addAction(quit);
89 fileMenu->addSeparator();
94 return moduleMenu->addAction(text);
99 return moduleMenu->addAction(text, receiver, member);
104 action->setData(parameter);
114 action->setText(text);
119 QList<QAction *> actionList = moduleMenu->actions();
120 if(!actionList.empty())
121 moduleMenu->removeAction(action);
126 return utilMenu->addAction (text, receiver, member);
129 void MainWindow::createFileMenu()
131 fileMenu = menuBar()->addMenu(tr(
"&File"));
132 fileMenu->addAction(load);
133 fileMenu->addAction(save);
134 fileMenu->addAction(reset);
135 fileMenu->addSeparator();
136 fileMenu->addAction(quit);
137 fileMenu->addSeparator();
138 connect(fileMenu, SIGNAL(triggered(QAction*)),
this, SLOT(fileMenuActivated(QAction*)));
141 void MainWindow::createModuleMenu()
143 moduleMenu = menuBar()->addMenu(tr(
"&Modules"));
144 connect(moduleMenu, SIGNAL(triggered(QAction*)),
this, SLOT(modulesMenuActivated(QAction*)));
147 void MainWindow::createUtilMenu()
149 utilMenu = menuBar()->addMenu(tr(
"&Utilities"));
150 filtersSubMenu = utilMenu->addMenu(tr(
"&Filters"));
151 signalsSubMenu = utilMenu->addMenu(tr(
"&Signals"));
152 utilitiesSubMenu = utilMenu->addMenu(tr(
"&Utilities"));
153 connect(utilMenu, SIGNAL(triggered(QAction*)),
this, SLOT(utilitiesMenuActivated(QAction*)));
155 QDir libsDir(
"/usr/local/lib/rtxi/");
156 if(!libsDir.exists())
159 libsDir.setNameFilters(QStringList(
"*.so"));
160 for(
int i = 0; i < libsDir.entryList().size(); i++)
162 utilItem =
new QAction(libsDir.entryList().at(i),
this);
163 if(libsDir.entryList().at(i).contains(
"analysis"))
164 utilitiesSubMenu->addAction(utilItem);
165 else if(libsDir.entryList().at(i).contains(
"sync"))
166 utilitiesSubMenu->addAction(utilItem);
167 else if(libsDir.entryList().at(i).contains(
"mimic"))
168 utilitiesSubMenu->addAction(utilItem);
169 else if(libsDir.entryList().at(i).contains(
"iir"))
170 filtersSubMenu->addAction(utilItem);
171 else if(libsDir.entryList().at(i).contains(
"fir"))
172 filtersSubMenu->addAction(utilItem);
173 else if(libsDir.entryList().at(i).contains(
"signal"))
174 signalsSubMenu->addAction(utilItem);
175 else if(libsDir.entryList().at(i).contains(
"noise"))
176 signalsSubMenu->addAction(utilItem);
177 else if(libsDir.entryList().at(i).contains(
"ttl"))
178 signalsSubMenu->addAction(utilItem);
179 else if(libsDir.entryList().at(i).contains(
"maker"))
180 signalsSubMenu->addAction(utilItem);
184 void MainWindow::createSystemMenu()
186 systemMenu = menuBar()->addMenu(tr(
"&System"));
189 void MainWindow::createWindowsMenu()
191 windowsMenu = menuBar()->addMenu(tr(
"&Windows"));
192 connect(windowsMenu,SIGNAL(aboutToShow(
void)),
this,SLOT(windowsMenuAboutToShow(
void)));
195 void MainWindow::createHelpMenu()
197 helpMenu = menuBar()->addMenu(tr(
"&Help"));
198 helpMenu->addSeparator();
199 helpMenu->addAction(artxi);
200 helpMenu->addAction(axeno);
201 helpMenu->addAction(aqt);
202 helpMenu->addSeparator();
203 helpMenu->addAction(adocs);
204 helpMenu->addAction(sub_issue);
207 void MainWindow::createFileActions()
209 load =
new QAction(tr(
"&Load Workspace"),
this);
210 load->setShortcuts(QKeySequence::Open);
211 load->setStatusTip(tr(
"Load a saved workspace"));
212 connect(load, SIGNAL(triggered()),
this, SLOT(loadSettings()));
214 save =
new QAction(tr(
"&Save Workspace"),
this);
215 save->setShortcuts(QKeySequence::Save);
216 save->setStatusTip(tr(
"Save current workspace"));
217 connect(save, SIGNAL(triggered()),
this, SLOT(saveSettings()));
219 reset =
new QAction(tr(
"&Reset Workspace"),
this);
220 reset->setStatusTip(tr(
"Reset to default RTXI workspace"));
221 connect(reset, SIGNAL(triggered()),
this, SLOT(resetSettings()));
223 quit =
new QAction(tr(
"&Quit"),
this);
224 quit->setShortcut(tr(
"Ctrl+Q"));
225 quit->setStatusTip(tr(
"Quit RTXI"));
226 connect(qApp, SIGNAL(aboutToQuit()), mdiArea, SLOT(closeAllSubWindows()));
227 connect(quit, SIGNAL(triggered()),
this, SLOT(close()));
232 mdiArea->addSubWindow(subWindow);
235 void MainWindow::createHelpActions()
237 artxi =
new QAction(tr(
"About &RTXI"),
this);
238 connect(artxi, SIGNAL(triggered()),
this, SLOT(about()));
240 axeno =
new QAction(tr(
"About &Xenomai"),
this);
241 connect(axeno, SIGNAL(triggered()),
this, SLOT(aboutXeno()));
243 aqt =
new QAction(tr(
"About &Qt"),
this);
244 connect(aqt, SIGNAL(triggered()),
this, SLOT(aboutQt()));
246 adocs =
new QAction(tr(
"&Documentation"),
this);
247 connect(adocs, SIGNAL(triggered()),
this, SLOT(openDocs()));
249 sub_issue =
new QAction(tr(
"&Submit Issue"),
this);
250 connect(sub_issue, SIGNAL(triggered()),
this, SLOT(openSubIssue()));
255 return systemMenu->addAction(text, receiver, member);
258 void MainWindow::about(
void)
260 QMessageBox::about(
this,
"About RTXI",
"RTXI Version " + QString(
VERSION)
261 +
"\n\nReleased under the GPLv3.\nSee www.rtxi.org for details.");
264 void MainWindow::aboutQt (
void)
266 QMessageBox::aboutQt(
this);
269 void MainWindow::aboutXeno (
void)
271 #if CONFIG_XENO_VERSION_MAJOR 274 fp = fopen(
"/proc/xenomai/version",
"r");
275 fscanf(fp,
"%s", xeno_buff);
277 QMessageBox::about(
this,
"About Xenomai",
"Xenomai Version " + QString(xeno_buff));
279 QMessageBox::about(
this,
"About Xenomai",
"Running POSIX (non-RT)");
283 void MainWindow::openDocs(
void)
285 QDesktopServices::openUrl(QUrl(
"http://rtxi.org/docs/", QUrl::TolerantMode));
288 void MainWindow::openSubIssue(
void)
290 QDesktopServices::openUrl(QUrl(
"https://github.com/rtxi/rtxi/issues", QUrl::TolerantMode));
299 userprefs.setPath (QSettings::NativeFormat, QSettings::SystemScope,
"/usr/local/share/rtxi/");
300 userprefs.beginGroup(
"MainWindow");
301 restoreGeometry(userprefs.value(
"geometry", saveGeometry()).toByteArray());
302 move(userprefs.value(
"pos", pos()).toPoint());
303 resize(userprefs.value(
"size", size()).toSize());
304 if(userprefs.value(
"maximized", isMaximized()).toBool())
306 userprefs.endGroup();
310 void MainWindow::loadSettings (
void)
313 userprefs.setPath (QSettings::NativeFormat, QSettings::SystemScope,
"/usr/local/share/rtxi/");
315 QString filename = QFileDialog::getOpenFileName(
this,
316 tr(
"Load saved workspace"), userprefs.value(
"/dirs/setfiles", getenv(
"HOME")).toString(), tr(
"Settings (*.set)"));
318 if (QFile(filename).exists())
321 mdiArea->closeAllSubWindows();
326 void MainWindow::saveSettings(
void)
329 userprefs.setPath (QSettings::NativeFormat, QSettings::SystemScope,
"/usr/local/share/rtxi/");
331 QString filename = QFileDialog::getSaveFileName(
this,
332 tr(
"Save current workspace"), userprefs.value(
"/dirs/setfiles", getenv(
"HOME")).toString(), tr(
"Settings (*.set)"));
334 if (!filename.isEmpty())
336 if (!filename.endsWith(
".set"))
337 filename = filename+
".set";
338 if (QFileInfo (filename).exists() && QMessageBox::warning(
this,
339 "File Exists",
"Do you wish to overwrite " + filename +
"?",
340 QMessageBox::Yes | QMessageBox::Default,
341 QMessageBox::No | QMessageBox::Escape) != QMessageBox::Yes)
350 void MainWindow::resetSettings(
void)
353 mdiArea->closeAllSubWindows();
357 void MainWindow::utilitiesMenuActivated(QAction *
id)
362 void MainWindow::windowsMenuAboutToShow(
void)
366 windowsMenu->clear();
369 windowsMenu->addAction(tr(
"Cascade"),mdiArea,SLOT(cascadeSubWindows()));
370 windowsMenu->addAction(tr(
"Tile"),mdiArea,SLOT(tileSubWindows()));
371 windowsMenu->addSeparator();
374 subWindows = mdiArea->subWindowList();
377 if(subWindows.isEmpty())
381 for(
int i = 0; i < subWindows.size(); i++)
383 QAction *item =
new QAction(subWindows.at(i)->widget()->windowTitle(),
this);
384 windowsMenu->addAction(item);
386 connect(windowsMenu, SIGNAL(triggered(QAction*)),
this, SLOT(windowsMenuActivated(QAction*)));
389 void MainWindow::windowsMenuActivated(QAction *
id)
393 subWindows = mdiArea->subWindowList();
396 if(subWindows.isEmpty())
399 for(uint16_t i = 0; i < subWindows.size(); i++)
400 if(subWindows.at(i)->widget()->windowTitle() == id->text())
401 mdiArea->setActiveSubWindow(subWindows.at(i));
404 void MainWindow::modulesMenuActivated(QAction *
id)
408 if(id->text().contains(
"Load Plugin"))
416 void MainWindow::fileMenuActivated(QAction *
id)
420 if(id->text().contains(
"Load Workspace") ||
421 id->text().contains(
"Save Workspace") ||
422 id->text().contains(
"Reset Workspace") ||
423 id->text().contains(
"Quit"))
429 mdiArea->closeAllSubWindows();
433 void MainWindow::closeEvent(QCloseEvent *)
439 userprefs.setPath (QSettings::NativeFormat, QSettings::SystemScope,
"/usr/local/share/rtxi/");
440 userprefs.beginGroup(
"MainWindow");
441 userprefs.setValue(
"geometry", saveGeometry());
442 userprefs.setValue(
"maximized", isMaximized());
445 userprefs.setValue(
"pos", pos());
446 userprefs.setValue(
"size", size());
448 userprefs.endGroup();
468 instance = &mainwindow;