diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h new file mode 100644 index 0000000000000000000000000000000000000000..3cfd84e1f9591b3e3464fd93d98bc325fd5745e8 --- /dev/null +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbWrapperQtWidgetMainWindow_h +#define otbWrapperQtWidgetMainWindow_h + +#include <QMainWindow> +#include "OTBQtWidgetExport.h" + +#include "otbWrapperApplication.h" + +class QAction; +class QMenu; + +namespace otb +{ +namespace Wrapper +{ + +class QtWidgetView; + +class OTBQtWidget_EXPORT QtMainWindow : public QMainWindow +{ + Q_OBJECT + +public: + QtMainWindow(Application::Pointer); + +public slots: + void UnhandledException(QString message); + +private: + QMenu* helpMenu; + QAction* helpAction; + + QtWidgetView* gui; +}; + +} // namespace Wrapper +} // namespace otb + +#endif diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h index 352bc07c248080d848c9bb3d29083434da34471c..441684e40da91b28623670f4cfca90af9a151fee 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h @@ -68,8 +68,6 @@ public: bool IsClosable() const; -public slots: - void UnhandledException(QString message); signals: diff --git a/Modules/Wrappers/QtWidget/src/CMakeLists.txt b/Modules/Wrappers/QtWidget/src/CMakeLists.txt index 961f34dffc197d63d92b2293d9cc735ad4c4dc89..727f90cdf56b89b6949c55b8128ffbe58e122750 100644 --- a/Modules/Wrappers/QtWidget/src/CMakeLists.txt +++ b/Modules/Wrappers/QtWidget/src/CMakeLists.txt @@ -23,6 +23,7 @@ set(OTBQtWidget_SRC otbWrapperQtWidgetModel.cxx otbWrapperQtWidgetParameterLabel.cxx otbWrapperQtWidgetView.cxx + otbWrapperQtWidgetMainWindow.cxx otbWrapperQtWidgetInputProcessXMLParameter.cxx otbWrapperQtWidgetIntParameter.cxx otbWrapperQtWidgetInputVectorDataListParameter.cxx @@ -81,6 +82,7 @@ set(OTBQtWidget_MOC_HDR ../include/otbWrapperQtWidgetParameterBase.h ../include/otbWrapperQtWidgetModel.h ../include/otbWrapperQtWidgetView.h + ../include/otbWrapperQtWidgetMainWindow.h ../include/otbWrapperQtWidgetProgressReport.h ../include/otbWrapperQtWidgetListViewParameter.h ../include/otbQtFileSelectionWidget.h diff --git a/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx b/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx index f28b9e32a46ac734eff5908b926dc7f8006fc801..12601d0923ec009cb9b7fd85be1e795535e018f7 100644 --- a/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx +++ b/Modules/Wrappers/QtWidget/src/otbApplicationLauncherQt.cxx @@ -19,19 +19,22 @@ */ #include <QtWidgets> +#include <QTranslator> +#include <QDesktopServices> + #include "otbConfigurationManager.h" #include "otbWrapperApplicationRegistry.h" -#include "otbWrapperQtWidgetView.h" #include "otbWrapperQtWidgetSimpleProgressReport.h" #include "otbQtApplication.h" +#include "otbWrapperQtWidgetMainWindow.h" #include "itksys/SystemTools.hxx" using otb::Wrapper::Application; using otb::Wrapper::ApplicationRegistry; -using otb::Wrapper::QtWidgetView; -//using otb::Wrapper::QtWidgetProgressReport; -using otb::Wrapper::QtWidgetSimpleProgressReport; using otb::Wrapper::QtApplication; +using otb::Wrapper::QtMainWindow; +using otb::Wrapper::QtWidgetSimpleProgressReport; +using otb::Wrapper::QtWidgetView; int main(int argc, char* argv[]) { @@ -47,33 +50,33 @@ int main(int argc, char* argv[]) otb::ConfigurationManager::InitOpenMPThreads(); if (argc < 2) - { + { std::cerr << "Usage : " << argv[0] << " module_name [module_path]" << std::endl; return EXIT_FAILURE; - } + } std::string moduleName = argv[1]; // Get the module path list std::list<std::string> modulePathList; if (argc > 2) - { + { std::copy(argv + 2, argv + argc, std::back_inserter(modulePathList)); // Load the path in the environment std::list<std::string>::const_iterator it = modulePathList.begin(); - while( it != modulePathList.end() ) - { - ApplicationRegistry::AddApplicationPath( *(it) ); + while (it != modulePathList.end()) + { + ApplicationRegistry::AddApplicationPath(*(it)); ++it; - } } + } // Create module Application::Pointer app = ApplicationRegistry::CreateApplication(moduleName); if (app.IsNull()) - { + { std::cerr << "Could not find application " << moduleName << std::endl; std::string modulePath = ApplicationRegistry::GetApplicationPath(); std::cout << "Module search path : " << modulePath << std::endl; @@ -81,31 +84,15 @@ int main(int argc, char* argv[]) std::cout << "Available applications : " << (list.empty() ? "None" : "") << std::endl; for (std::vector<std::string>::const_iterator it = list.begin(); it != list.end(); ++it) - { + { std::cout << " " << *it << std::endl; - } - return EXIT_FAILURE; } + return EXIT_FAILURE; + } - // MainWidget : that contains the view and any other widget - // (progress, logs...) - QMainWindow* mainWindow = new QMainWindow(); - mainWindow->setWindowIcon(QIcon( ":/otb_small.png" )); - mainWindow->setWindowTitle(QString(app->GetDocName()).append(" - ").append(OTB_VERSION_STRING)); - - // Create GUI based on module - QtWidgetView* gui = new QtWidgetView(app, mainWindow); - gui->CreateGui(); - - // Connect the View "Quit" signal, to the mainWindow close slot - QObject::connect(gui, &QtWidgetView::QuitSignal, mainWindow, &QMainWindow::close); - - QObject::connect(&qtApp, &QtApplication::UnhandledException, gui, &QtWidgetView::UnhandledException); - + QtMainWindow* mainWindow = new otb::Wrapper::QtMainWindow(app); - // build the main window, central widget is the plugin view, other - // are docked widget (progress, logs...) - mainWindow->setCentralWidget(gui); + QObject::connect(&qtApp, &QtApplication::UnhandledException, mainWindow, &QtMainWindow::UnhandledException); // Show the main window mainWindow->show(); diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx new file mode 100644 index 0000000000000000000000000000000000000000..172b67e224a581d389bd1e75e775b8948ea445fd --- /dev/null +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbWrapperQtWidgetMainWindow.h" + +#include <QtWidgets> +#include "otbWrapperQtWidgetView.h" + +namespace otb +{ +namespace Wrapper +{ + +QtMainWindow::QtMainWindow(Application::Pointer app) +{ + this->setWindowIcon(QIcon(":/otb_small.png")); + this->setWindowTitle(QString(app->GetDocName()).append(" - ").append(OTB_VERSION_STRING)); + + // Create main application widget + gui = new QtWidgetView(app, this); + gui->CreateGui(); + this->setCentralWidget(gui); + + // Connect the View "Quit" signal, to the mainWindow close slot + connect(gui, &QtWidgetView::QuitSignal, this, &QMainWindow::close); + + // Setup the help menu + QMenu* helpMenu = this->menuBar()->addMenu(tr("&Help")); + helpAction = new QAction(tr("&Documentation"), this); + helpAction->setShortcuts(QKeySequence::HelpContents); + helpMenu->addAction(helpAction); + QObject::connect(helpAction, &QAction::triggered, this, [] { QDesktopServices::openUrl(QUrl("https://www.orfeo-toolbox.org/CookBook/")); }); +} + +void QtMainWindow::UnhandledException(QString message) +{ + gui->UnhandledException(message); +} + +} // namespace Wrapper +} // namespace otb diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx index 22a49c3be4e9620b209e2a4b1cc7a51b48d4ec80..6b84fa510c85722a183a0a1ed7ab71f0236cea69 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx @@ -113,7 +113,7 @@ void QtWidgetView::CreateGui() progressReport->SetApplication(m_Model->GetApplication()); QWidget* footer = CreateFooter(); - + QHBoxLayout *footLayout = new QHBoxLayout; footLayout->addWidget(progressReport); footLayout->addWidget(footer); @@ -179,10 +179,6 @@ QWidget* QtWidgetView::CreateFooter() // an HLayout with two buttons : Execute and Quit QGroupBox *footerGroup = new QGroupBox(this); QHBoxLayout *footerLayout = new QHBoxLayout; - - footerGroup->setFixedHeight(40); - footerGroup->setContentsMargins(0, 0, 0, 0); - footerLayout->setContentsMargins(5, 5, 5, 5); m_ExecButton = new QPushButton(footerGroup); m_ExecButton->setDefault(true);