From f09c9895be486d30c9aa48da040c3aeb3ccbaa74 Mon Sep 17 00:00:00 2001 From: Sergey Belash Date: Fri, 7 Mar 2014 16:50:17 +0400 Subject: [PATCH] "GUI" stubs for testing of CMake building procedures, preliminary examples of GUI --- CMakeLists.txt | 2 + src/GeomModule/GeomModule.cpp | 35 +++ src/GeomModule/GeomModule.h | 21 ++ src/GeomModule/GeomModule_Defs.h | 16 ++ src/GeomModule/main_menu.xml | 13 + src/XGUI/CMakeLists.txt | 60 +++++ src/XGUI/XGUI_Command.cpp | 42 +++ src/XGUI/XGUI_Command.h | 22 ++ src/XGUI/XGUI_Main.cpp | 19 ++ src/XGUI/XGUI_MainMenu.cpp | 55 ++++ src/XGUI/XGUI_MainMenu.h | 33 +++ src/XGUI/XGUI_MainWindow.cpp | 155 +++++++++++ src/XGUI/XGUI_MainWindow.h | 33 +++ src/XGUI/XGUI_MenuGroupPanel.cpp | 61 +++++ src/XGUI/XGUI_MenuGroupPanel.h | 33 +++ src/XGUI/XGUI_Module.h | 24 ++ src/XGUI/XGUI_Tools.cpp | 77 ++++++ src/XGUI/XGUI_Tools.h | 63 +++++ src/XGUI/XGUI_Workbench.cpp | 157 +++++++++++ src/XGUI/XGUI_Workbench.h | 48 ++++ src/XGUI/XGUI_Workshop.cpp | 255 ++++++++++++++++++ src/XGUI/XGUI_Workshop.h | 68 +++++ src/XGUI/XGUI_msg_en.ts | 108 ++++++++ src/XGUI/XGUI_pictures.qrc | 64 +++++ src/XGUI/pictures/ViewPort.png | Bin 0 -> 4583 bytes src/XGUI/pictures/box.png | Bin 0 -> 931 bytes src/XGUI/pictures/close.png | Bin 0 -> 940 bytes src/XGUI/pictures/constr_folder.png | Bin 0 -> 617 bytes src/XGUI/pictures/copy.png | Bin 0 -> 867 bytes src/XGUI/pictures/cut.png | Bin 0 -> 927 bytes src/XGUI/pictures/cylinder.png | Bin 0 -> 968 bytes src/XGUI/pictures/disk.png | Bin 0 -> 744 bytes src/XGUI/pictures/features.png | Bin 0 -> 734 bytes src/XGUI/pictures/new.png | Bin 0 -> 623 bytes src/XGUI/pictures/occ_view_ambient.png | Bin 0 -> 1435 bytes src/XGUI/pictures/occ_view_anticlockwise.png | Bin 0 -> 936 bytes src/XGUI/pictures/occ_view_back.png | Bin 0 -> 432 bytes src/XGUI/pictures/occ_view_bottom.png | Bin 0 -> 428 bytes src/XGUI/pictures/occ_view_camera_dump.png | Bin 0 -> 682 bytes src/XGUI/pictures/occ_view_clipping.png | Bin 0 -> 809 bytes .../pictures/occ_view_clipping_pressed.png | Bin 0 -> 560 bytes src/XGUI/pictures/occ_view_clockwise.png | Bin 0 -> 869 bytes src/XGUI/pictures/occ_view_clone.png | Bin 0 -> 441 bytes src/XGUI/pictures/occ_view_fitall.png | Bin 0 -> 816 bytes src/XGUI/pictures/occ_view_fitarea.png | Bin 0 -> 912 bytes src/XGUI/pictures/occ_view_front.png | Bin 0 -> 410 bytes src/XGUI/pictures/occ_view_glpan.png | Bin 0 -> 1086 bytes src/XGUI/pictures/occ_view_graduated_axes.png | Bin 0 -> 650 bytes src/XGUI/pictures/occ_view_left.png | Bin 0 -> 427 bytes src/XGUI/pictures/occ_view_maximized.png | Bin 0 -> 236 bytes src/XGUI/pictures/occ_view_minimized.png | Bin 0 -> 255 bytes src/XGUI/pictures/occ_view_pan.png | Bin 0 -> 982 bytes src/XGUI/pictures/occ_view_preselection.png | Bin 0 -> 621 bytes src/XGUI/pictures/occ_view_presets.png | Bin 0 -> 545 bytes src/XGUI/pictures/occ_view_reset.png | Bin 0 -> 918 bytes src/XGUI/pictures/occ_view_return_3d_view.png | Bin 0 -> 505 bytes src/XGUI/pictures/occ_view_right.png | Bin 0 -> 418 bytes src/XGUI/pictures/occ_view_rotate.png | Bin 0 -> 886 bytes src/XGUI/pictures/occ_view_rotation_point.png | Bin 0 -> 858 bytes src/XGUI/pictures/occ_view_scaling.png | Bin 0 -> 1128 bytes src/XGUI/pictures/occ_view_selection.png | Bin 0 -> 620 bytes src/XGUI/pictures/occ_view_shoot.png | Bin 0 -> 825 bytes src/XGUI/pictures/occ_view_style_switch.png | Bin 0 -> 782 bytes src/XGUI/pictures/occ_view_top.png | Bin 0 -> 419 bytes src/XGUI/pictures/occ_view_triedre.png | Bin 0 -> 698 bytes src/XGUI/pictures/occ_view_zoom.png | Bin 0 -> 797 bytes .../occ_view_zooming_style_switch.png | Bin 0 -> 3389 bytes src/XGUI/pictures/open.png | Bin 0 -> 1034 bytes src/XGUI/pictures/params_folder.png | Bin 0 -> 732 bytes src/XGUI/pictures/part_ico.png | Bin 0 -> 697 bytes src/XGUI/pictures/paste.png | Bin 0 -> 902 bytes src/XGUI/pictures/properties.png | Bin 0 -> 827 bytes src/XGUI/pictures/redo.png | Bin 0 -> 702 bytes src/XGUI/pictures/save.png | Bin 0 -> 940 bytes src/XGUI/pictures/torus.png | Bin 0 -> 1149 bytes src/XGUI/pictures/undo.png | Bin 0 -> 721 bytes src/XGUI/pictures/wnd_close.png | Bin 0 -> 779 bytes src/XGUI/pictures/wnd_maximize.png | Bin 0 -> 688 bytes src/XGUI/pictures/wnd_minimize.png | Bin 0 -> 782 bytes 79 files changed, 1464 insertions(+) create mode 100644 src/GeomModule/GeomModule.cpp create mode 100644 src/GeomModule/GeomModule.h create mode 100644 src/GeomModule/GeomModule_Defs.h create mode 100644 src/GeomModule/main_menu.xml create mode 100644 src/XGUI/CMakeLists.txt create mode 100644 src/XGUI/XGUI_Command.cpp create mode 100644 src/XGUI/XGUI_Command.h create mode 100644 src/XGUI/XGUI_Main.cpp create mode 100644 src/XGUI/XGUI_MainMenu.cpp create mode 100644 src/XGUI/XGUI_MainMenu.h create mode 100644 src/XGUI/XGUI_MainWindow.cpp create mode 100644 src/XGUI/XGUI_MainWindow.h create mode 100644 src/XGUI/XGUI_MenuGroupPanel.cpp create mode 100644 src/XGUI/XGUI_MenuGroupPanel.h create mode 100644 src/XGUI/XGUI_Module.h create mode 100644 src/XGUI/XGUI_Tools.cpp create mode 100644 src/XGUI/XGUI_Tools.h create mode 100644 src/XGUI/XGUI_Workbench.cpp create mode 100644 src/XGUI/XGUI_Workbench.h create mode 100644 src/XGUI/XGUI_Workshop.cpp create mode 100644 src/XGUI/XGUI_Workshop.h create mode 100644 src/XGUI/XGUI_msg_en.ts create mode 100644 src/XGUI/XGUI_pictures.qrc create mode 100644 src/XGUI/pictures/ViewPort.png create mode 100644 src/XGUI/pictures/box.png create mode 100644 src/XGUI/pictures/close.png create mode 100644 src/XGUI/pictures/constr_folder.png create mode 100644 src/XGUI/pictures/copy.png create mode 100644 src/XGUI/pictures/cut.png create mode 100644 src/XGUI/pictures/cylinder.png create mode 100644 src/XGUI/pictures/disk.png create mode 100644 src/XGUI/pictures/features.png create mode 100644 src/XGUI/pictures/new.png create mode 100644 src/XGUI/pictures/occ_view_ambient.png create mode 100644 src/XGUI/pictures/occ_view_anticlockwise.png create mode 100644 src/XGUI/pictures/occ_view_back.png create mode 100644 src/XGUI/pictures/occ_view_bottom.png create mode 100644 src/XGUI/pictures/occ_view_camera_dump.png create mode 100644 src/XGUI/pictures/occ_view_clipping.png create mode 100644 src/XGUI/pictures/occ_view_clipping_pressed.png create mode 100644 src/XGUI/pictures/occ_view_clockwise.png create mode 100644 src/XGUI/pictures/occ_view_clone.png create mode 100644 src/XGUI/pictures/occ_view_fitall.png create mode 100644 src/XGUI/pictures/occ_view_fitarea.png create mode 100644 src/XGUI/pictures/occ_view_front.png create mode 100644 src/XGUI/pictures/occ_view_glpan.png create mode 100644 src/XGUI/pictures/occ_view_graduated_axes.png create mode 100644 src/XGUI/pictures/occ_view_left.png create mode 100644 src/XGUI/pictures/occ_view_maximized.png create mode 100644 src/XGUI/pictures/occ_view_minimized.png create mode 100644 src/XGUI/pictures/occ_view_pan.png create mode 100644 src/XGUI/pictures/occ_view_preselection.png create mode 100644 src/XGUI/pictures/occ_view_presets.png create mode 100644 src/XGUI/pictures/occ_view_reset.png create mode 100644 src/XGUI/pictures/occ_view_return_3d_view.png create mode 100644 src/XGUI/pictures/occ_view_right.png create mode 100644 src/XGUI/pictures/occ_view_rotate.png create mode 100644 src/XGUI/pictures/occ_view_rotation_point.png create mode 100644 src/XGUI/pictures/occ_view_scaling.png create mode 100644 src/XGUI/pictures/occ_view_selection.png create mode 100644 src/XGUI/pictures/occ_view_shoot.png create mode 100644 src/XGUI/pictures/occ_view_style_switch.png create mode 100644 src/XGUI/pictures/occ_view_top.png create mode 100644 src/XGUI/pictures/occ_view_triedre.png create mode 100644 src/XGUI/pictures/occ_view_zoom.png create mode 100644 src/XGUI/pictures/occ_view_zooming_style_switch.png create mode 100644 src/XGUI/pictures/open.png create mode 100644 src/XGUI/pictures/params_folder.png create mode 100644 src/XGUI/pictures/part_ico.png create mode 100644 src/XGUI/pictures/paste.png create mode 100644 src/XGUI/pictures/properties.png create mode 100644 src/XGUI/pictures/redo.png create mode 100644 src/XGUI/pictures/save.png create mode 100644 src/XGUI/pictures/torus.png create mode 100644 src/XGUI/pictures/undo.png create mode 100644 src/XGUI/pictures/wnd_close.png create mode 100644 src/XGUI/pictures/wnd_maximize.png create mode 100644 src/XGUI/pictures/wnd_minimize.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 2bc0930ea..c44ff627d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,3 +6,5 @@ SET(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/CMakeCommon" ${CMAKE_MODULE_PATH}) ADD_SUBDIRECTORY (src/ModelAPI) ADD_SUBDIRECTORY (src/Model) +ADD_SUBDIRECTORY (src/XGUI) +ADD_SUBDIRECTORY (src/GeomModule) \ No newline at end of file diff --git a/src/GeomModule/GeomModule.cpp b/src/GeomModule/GeomModule.cpp new file mode 100644 index 000000000..de003fd87 --- /dev/null +++ b/src/GeomModule/GeomModule.cpp @@ -0,0 +1,35 @@ +#include "GeomModule.h" + +#include +#include +#include +#include + +/*!Create and return new instance of XGUI_Module*/ +extern "C" GM_EXPORT XGUI_Module* createModule() +{ + return new GeomModule(); +} + + +GeomModule::GeomModule() +{ + QString aDir = qApp->applicationDirPath(); + QString aXMLFile = aDir + QDir::separator() + "main_menu.xml"; + + QFile aFile(aXMLFile); + if (aFile.open((QIODevice::ReadOnly | QIODevice::Text))) { + QTextStream aTextStream(&aFile); + myMenuXML = aTextStream.readAll(); + } +} + + +GeomModule::~GeomModule() +{ +} + +QString GeomModule::moduleDescription() const +{ + return myMenuXML; +} \ No newline at end of file diff --git a/src/GeomModule/GeomModule.h b/src/GeomModule/GeomModule.h new file mode 100644 index 000000000..8ccd09aa8 --- /dev/null +++ b/src/GeomModule/GeomModule.h @@ -0,0 +1,21 @@ + +#ifndef GeomModule_H +#define GeomModule_H + +#include "GeomModule_Defs.h" + +#include + +class GM_EXPORT GeomModule : public XGUI_Module +{ +public: + GeomModule(); + virtual ~GeomModule(); + + virtual QString moduleDescription() const; + +private: + QString myMenuXML; +}; + +#endif \ No newline at end of file diff --git a/src/GeomModule/GeomModule_Defs.h b/src/GeomModule/GeomModule_Defs.h new file mode 100644 index 000000000..45697e587 --- /dev/null +++ b/src/GeomModule/GeomModule_Defs.h @@ -0,0 +1,16 @@ +#ifndef GeomModule_Defs_H +#define GeomModule_Defs_H + + +#if defined WIN32 +# if defined GM_EXPORTS || defined gm_EXPORTS +# define GM_EXPORT __declspec( dllexport ) +# else +# define GM_EXPORT __declspec( dllimport ) +# endif +#else +# define GM_EXPORT +#endif + + +#endif \ No newline at end of file diff --git a/src/GeomModule/main_menu.xml b/src/GeomModule/main_menu.xml new file mode 100644 index 000000000..5a81a5d7e --- /dev/null +++ b/src/GeomModule/main_menu.xml @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/src/XGUI/CMakeLists.txt b/src/XGUI/CMakeLists.txt new file mode 100644 index 000000000..ee41e8cb9 --- /dev/null +++ b/src/XGUI/CMakeLists.txt @@ -0,0 +1,60 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11) + +INCLUDE(Common) +INCLUDE(FindQt5) + +SET(PROJECT_HEADERS + XGUI_Command.h + XGUI_MainMenu.h + XGUI_MainWindow.h + XGUI_MenuGroupPanel.h + XGUI_Module.h + XGUI_Tools.h + XGUI_Workbench.h + XGUI_Workshop.h +) + +SET(PROJECT_AUTOMOC + ${CMAKE_CURRENT_BINARY_DIR}/XGUI_automoc.cpp +) + +SET(PROJECT_SOURCES + XGUI_Command.cpp + XGUI_Main.cpp + XGUI_MainMenu.cpp + XGUI_MainWindow.cpp + XGUI_MenuGroupPanel.cpp + XGUI_Tools.cpp + XGUI_Workbench.cpp + XGUI_Workshop.cpp +) + +SET(PROJECT_RESOURCES + XGUI_pictures.qrc +) + +SET(TEXT_RESOURCES + XGUI_msg_en.ts +) + +QT5_ADD_RESOURCES(PROJECT_COMPILED_RESOURCES ${PROJECT_RESOURCES}) +QT5_ADD_TRANSLATION(QM_RESOURCES ${TEXT_RESOURCES}) + +SOURCE_GROUP ("Generated Files" FILES ${PROJECT_AUTOMOC} ${PROJECT_COMPILED_RESOURCES} ${QM_RESOURCES}) +SOURCE_GROUP ("Resource Files" FILES ${TEXT_RESOURCES} ${PROJECT_RESOURCES}) + +ADD_DEFINITIONS(-DWIN32 -D_WINDOWS) + +ADD_EXECUTABLE(XGUI WIN32 + ${PROJECT_SOURCES} + ${PROJECT_HEADERS} + ${PROJECT_COMPILED_RESOURCES} + ${TEXT_RESOURCES} + ${QM_RESOURCES} +) + +# The Qt5Widgets_LIBRARIES variable also includes QtGui and QtCore +TARGET_LINK_LIBRARIES(XGUI ${Qt5Widgets_LIBRARIES}) + +INSTALL(TARGETS XGUI DESTINATION bin) +INSTALL(FILES ${QM_RESOURCES} DESTINATION bin) diff --git a/src/XGUI/XGUI_Command.cpp b/src/XGUI/XGUI_Command.cpp new file mode 100644 index 000000000..4c4249c6f --- /dev/null +++ b/src/XGUI/XGUI_Command.cpp @@ -0,0 +1,42 @@ +#include "XGUI_Command.h" + +#include + +XGUI_Command::XGUI_Command(QObject * parent) : + QWidgetAction(parent) +{ +} + +XGUI_Command::XGUI_Command(const QIcon& icon, const QString& text, QObject* parent): + QWidgetAction(parent) +{ + setIcon(icon); + setText(text); +} + + +XGUI_Command::~XGUI_Command() +{ +} + +QWidget* XGUI_Command::createWidget(QWidget* theParent) +{ + if (theParent->inherits("XGUI_MenuGroupPanel")) { + QPushButton* aBtn = new QPushButton(theParent); + aBtn->setIcon(icon()); + aBtn->setText(text()); + QKeySequence aKeys = shortcut(); + QString aToolTip = toolTip(); + if (!aKeys.isEmpty()) + aToolTip = aToolTip + " (" + aKeys.toString() + ")"; + if (!aToolTip.isEmpty()) + aBtn->setToolTip(aToolTip); + + aBtn->addAction(this); + connect(aBtn, SIGNAL(clicked()), this, SLOT(trigger())); + aBtn->setFlat(true); + aBtn->setMinimumSize(MIN_BUTTON_WIDTH, MIN_BUTTON_HEIGHT); + return aBtn; + } + return QWidgetAction::createWidget(theParent); +} \ No newline at end of file diff --git a/src/XGUI/XGUI_Command.h b/src/XGUI/XGUI_Command.h new file mode 100644 index 000000000..8f1caf154 --- /dev/null +++ b/src/XGUI/XGUI_Command.h @@ -0,0 +1,22 @@ +#ifndef XGUI_Command_H +#define XGUI_Command_H + +#include + +#define MIN_BUTTON_HEIGHT 18 +#define MIN_BUTTON_WIDTH 40 + + +class XGUI_Command : public QWidgetAction +{ + Q_OBJECT +public: + XGUI_Command(QObject * parent); + XGUI_Command(const QIcon& icon, const QString& text, QObject* parent); + ~XGUI_Command(); + +protected: + virtual QWidget* createWidget(QWidget* theParent); +}; + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Main.cpp b/src/XGUI/XGUI_Main.cpp new file mode 100644 index 000000000..c709f31b3 --- /dev/null +++ b/src/XGUI/XGUI_Main.cpp @@ -0,0 +1,19 @@ + +#include "XGUI_Workshop.h" +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + // Install translator + QTranslator aTranslator; + aTranslator.load(app.applicationDirPath() + "\\XGUI_msg_en.qm"); + app.installTranslator(&aTranslator); + + XGUI_Workshop aWorkshop; + aWorkshop.startApplication(); + + return app.exec(); +} diff --git a/src/XGUI/XGUI_MainMenu.cpp b/src/XGUI/XGUI_MainMenu.cpp new file mode 100644 index 000000000..0be7579aa --- /dev/null +++ b/src/XGUI/XGUI_MainMenu.cpp @@ -0,0 +1,55 @@ +#include "XGUI_MainMenu.h" +#include "XGUI_Workbench.h" +#include "XGUI_MainWindow.h" + +#include +#include +#include +#include + +XGUI_MainMenu::XGUI_MainMenu(XGUI_MainWindow *parent) : + QObject(parent), myDesktop(parent) +{ + parent->setTabPosition(Qt::TopDockWidgetArea, QTabWidget::North); +} + + +XGUI_MainMenu::~XGUI_MainMenu(void) +{ +} + +int XGUI_MainMenu::addWorkbench(QString theTitle) +{ + QDockWidget* aDoc = new QDockWidget(myDesktop); + aDoc->setFeatures(QDockWidget::DockWidgetVerticalTitleBar); + aDoc->setAllowedAreas(Qt::TopDockWidgetArea); + aDoc->setWindowTitle(theTitle); + aDoc->setMinimumHeight(30); + aDoc->setContentsMargins(0, 0, 0, 0); + + XGUI_Workbench* aPage = new XGUI_Workbench(aDoc); + aDoc->setWidget(aPage); + + myDesktop->addDockWidget(Qt::TopDockWidgetArea, aDoc); + if (myMenuTabs.length() > 1) { + myDesktop->tabifyDockWidget(myMenuTabs.last(), aDoc); + } + + + myMenuTabs.append(aDoc); + return myMenuTabs.length() - 1; +} + + +int XGUI_MainMenu::addGroup(int thePageId) +{ + XGUI_Workbench* aPage = dynamic_cast(myMenuTabs[thePageId]->widget()); + return aPage->addGroup(); +} + +void XGUI_MainMenu::addCommand(int thePageId, int theGroupId, XGUI_Command* theCommand) +{ + XGUI_Workbench* aPage = dynamic_cast(myMenuTabs[thePageId]->widget()); + aPage->addCommand(theGroupId, theCommand); +} + diff --git a/src/XGUI/XGUI_MainMenu.h b/src/XGUI/XGUI_MainMenu.h new file mode 100644 index 000000000..3521be3c0 --- /dev/null +++ b/src/XGUI/XGUI_MainMenu.h @@ -0,0 +1,33 @@ +#ifndef XGUI_MainMenu_H +#define XGUI_MainMenu_H + +#include +#include + +class QTabWidget; +class QLabel; +class QAction; +class XGUI_Command; +class XGUI_MainWindow; +class QDockWidget; + + +class XGUI_MainMenu : public QObject +{ + Q_OBJECT +public: + XGUI_MainMenu(XGUI_MainWindow *parent); + virtual ~XGUI_MainMenu(); + + int addWorkbench(QString theTitle); + + int addGroup(int thePageId); + + void addCommand(int thePageId, int theGroupId, XGUI_Command* theCommand); + +private: + XGUI_MainWindow* myDesktop; + QList myMenuTabs; +}; + +#endif diff --git a/src/XGUI/XGUI_MainWindow.cpp b/src/XGUI/XGUI_MainWindow.cpp new file mode 100644 index 000000000..3c4e99b49 --- /dev/null +++ b/src/XGUI/XGUI_MainWindow.cpp @@ -0,0 +1,155 @@ +#include "XGUI_MainWindow.h" +#include "XGUI_MainMenu.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +XGUI_MainWindow::XGUI_MainWindow(QWidget* parent) : + QMainWindow(parent), myObjectBrowser(0) +{ + //menuBar(); + myMenuBar = new XGUI_MainMenu(this); + + QDockWidget* aDoc = new QDockWidget(this); + aDoc->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + aDoc->setWindowTitle(tr("OBJECT_BROWSER_TITLE")); + myObjectBrowser = new QTreeWidget(aDoc); + myObjectBrowser->setColumnCount(1); + myObjectBrowser->setHeaderHidden(true); + aDoc->setWidget(myObjectBrowser); + addDockWidget(Qt::LeftDockWidgetArea, aDoc); + aDoc->hide(); + + aDoc = new QDockWidget(this); + aDoc->setFeatures(QDockWidget::AllDockWidgetFeatures | QDockWidget::DockWidgetVerticalTitleBar); + aDoc->setMinimumHeight(20); + aDoc->setWindowTitle("Console"); + QTextEdit* aTextEdt = new QTextEdit(aDoc); + aTextEdt->setText(">>>"); + aTextEdt->setMinimumHeight(20); + aDoc->setWidget(aTextEdt); + addDockWidget(Qt::BottomDockWidgetArea, aDoc); + + QMdiArea* aMdiArea = new QMdiArea(this); + setCentralWidget(aMdiArea); + + aMdiArea->addSubWindow(getSubWindow(), Qt::FramelessWindowHint); + + fillObjectBrowser(); + +} + + +QWidget* XGUI_MainWindow::getSubWindow() +{ + QMdiSubWindow* aSub = new QMdiSubWindow(this); + QLabel* aLbl = new QLabel(aSub); + aLbl->setFrameStyle(QFrame::Sunken); + aLbl->setFrameShape(QFrame::Panel); + aLbl->setPixmap(QPixmap(":pictures/ViewPort.png")); + aLbl->setScaledContents(true); + aSub->setWidget(aLbl); + + QStringList aPictures; + aPictures<<":pictures/occ_view_camera_dump.png"<<":pictures/occ_view_style_switch.png"; + aPictures<<":pictures/occ_view_triedre.png"<<":pictures/occ_view_fitall.png"; + aPictures<<":pictures/occ_view_fitarea.png"<<":pictures/occ_view_zoom.png"; + aPictures<<":pictures/occ_view_pan.png"<<":pictures/occ_view_glpan.png"; + aPictures<<":pictures/occ_view_rotate.png"<<":pictures/occ_view_front.png"; + aPictures<<":pictures/occ_view_back.png"<<":pictures/occ_view_left.png"; + aPictures<<":pictures/occ_view_right.png"<<":pictures/occ_view_top.png"; + aPictures<<":pictures/occ_view_bottom.png"<<":pictures/occ_view_clone.png"; + + QToolBar* aBar = new QToolBar(aSub); + aBar->setGeometry(0,0,500,30); + + QAction* aBtn; + foreach(QString aName, aPictures) { + aBtn = new QAction(aBar); + aBtn->setIcon(QIcon(aName)); + aBar->addAction(aBtn); + } + + aBar = new QToolBar(aSub); + aBar->setGeometry(615,0,100,25); + QStringList aWndIcons; + aWndIcons<<":pictures/wnd_minimize.png"<<":pictures/wnd_maximize.png"<<":pictures/wnd_close.png"; + foreach(QString aName, aWndIcons) { + aBtn = new QAction(aBar); + aBtn->setIcon(QIcon(aName)); + aBar->addAction(aBtn); + } + + return aSub; +} + + +XGUI_MainWindow::~XGUI_MainWindow(void) +{ +} + +//****************************************************** +void XGUI_MainWindow::showObjectBrowser() +{ + myObjectBrowser->parentWidget()->show(); +} + +//****************************************************** +void XGUI_MainWindow::hideObjectBrowser() +{ + myObjectBrowser->parentWidget()->hide(); +} + +//****************************************************** +void XGUI_MainWindow::fillObjectBrowser() +{ + QStringList aNames; + aNames << "Parameters" << "Constructions"; + aNames << "Part 1" << "Part 2" << "Part 3"; + aNames << "Properties"; + + QStringList aIcons; + aIcons << ":pictures/params_folder.png"; + aIcons << ":pictures/constr_folder.png"; + aIcons << ":pictures/part_ico.png"; + aIcons << ":pictures/part_ico.png"; + aIcons << ":pictures/part_ico.png"; + aIcons << ":pictures/properties.png"; + + QList aItems; + foreach(QString aName, aNames) { + QTreeWidgetItem* aItem = new QTreeWidgetItem(myObjectBrowser); + aItem->setText(0, aName); + aItems.append(aItem); + } + for(int i = 0; i < aItems.length(); i++) { + aItems[i]->setIcon(0, QIcon(aIcons[i])); + } + myObjectBrowser->addTopLevelItems(aItems); + + for (int i = 2; i < 5; i++) { + QTreeWidgetItem* aItem = new QTreeWidgetItem(aItems[i]); + aItem->setText(0, "Parameters"); + aItem->setIcon(0, QIcon(":pictures/params_folder.png")); + + aItem = new QTreeWidgetItem(aItems[i]); + aItem->setText(0, "Construction"); + aItem->setIcon(0, QIcon(":pictures/constr_folder.png")); + + aItem = new QTreeWidgetItem(aItems[i]); + aItem->setText(0, "Bodies"); + aItem->setIcon(0, QIcon(":pictures/part_ico.png")); + + aItem = new QTreeWidgetItem(aItems[i]); + aItem->setText(0, "Features"); + aItem->setIcon(0, QIcon(":pictures/features.png")); + } +} diff --git a/src/XGUI/XGUI_MainWindow.h b/src/XGUI/XGUI_MainWindow.h new file mode 100644 index 000000000..dfd5703c8 --- /dev/null +++ b/src/XGUI/XGUI_MainWindow.h @@ -0,0 +1,33 @@ +#ifndef XGUI_MAINWINDOW_H +#define XGUI_MAINWINDOW_H + +#include + +class XGUI_MainMenu; +class QTreeWidget; + +class XGUI_MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + XGUI_MainWindow(QWidget* parent = 0); + virtual ~XGUI_MainWindow(); + + XGUI_MainMenu* menuObject() const { return myMenuBar; } + + QTreeWidget* objectBrowser() const { return myObjectBrowser; } + void showObjectBrowser(); + void hideObjectBrowser(); + +private: + //!! For test purposes only + QWidget* getSubWindow(); + void fillObjectBrowser(); + + + XGUI_MainMenu* myMenuBar; + QTreeWidget* myObjectBrowser; +}; + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_MenuGroupPanel.cpp b/src/XGUI/XGUI_MenuGroupPanel.cpp new file mode 100644 index 000000000..b88960f7b --- /dev/null +++ b/src/XGUI/XGUI_MenuGroupPanel.cpp @@ -0,0 +1,61 @@ +#include "XGUI_MenuGroupPanel.h" +#include "XGUI_Command.h" + +#include +#include +#include +#include + +#include + +XGUI_MenuGroupPanel::XGUI_MenuGroupPanel(QWidget *parent) : + QWidget(parent), myNewRow(0), myNewCol(0), myMaxRow(1) +{ + myLayout = new QGridLayout(this); + myLayout->setSpacing(0); + myLayout->setMargin(0); + myLayout->setContentsMargins(0,0,0,0); +} + + +void XGUI_MenuGroupPanel::addCommand(XGUI_Command* theAction) +{ + addWidget(theAction->requestWidget(this)); +} + +void XGUI_MenuGroupPanel::placeWidget(QWidget* theWgt) +{ + if (myMaxRow == myNewRow) { + myNewRow = 0; + myNewCol++; + } + myLayout->addWidget(theWgt, myNewRow, myNewCol, Qt::AlignLeft); + myNewRow++; +} + +void XGUI_MenuGroupPanel::addWidget(QWidget* theWgt) +{ + placeWidget(theWgt); + myWidgets.append(theWgt); +} + + +void XGUI_MenuGroupPanel::resizeEvent(QResizeEvent* theEvent) +{ + QWidget::resizeEvent(theEvent); + if (myWidgets.size() == 0) + return; + + int aH = theEvent->size().height(); + int aMaxRow = (int) floor(double(aH / MIN_BUTTON_HEIGHT)); + if (aMaxRow == myMaxRow) + return; + + myMaxRow = aMaxRow; + QListIterator aIt(myWidgets); + myNewRow = 0; + myNewCol = 0; + while (aIt.hasNext()) { + placeWidget(aIt.next()); + } +} diff --git a/src/XGUI/XGUI_MenuGroupPanel.h b/src/XGUI/XGUI_MenuGroupPanel.h new file mode 100644 index 000000000..7fe95cff5 --- /dev/null +++ b/src/XGUI/XGUI_MenuGroupPanel.h @@ -0,0 +1,33 @@ + +#ifndef XGUI_MenuGroupPanel_H +#define XGUI_MenuGroupPanel_H + +#include +#include + +class QGridLayout; +class XGUI_Command; + +class XGUI_MenuGroupPanel : public QWidget +{ + Q_OBJECT +public: + explicit XGUI_MenuGroupPanel(QWidget *parent = 0); + + void addCommand(XGUI_Command* theAction); + +protected: + virtual void resizeEvent(QResizeEvent *theEvent); + +private: + void addWidget(QWidget* theWgt); + void placeWidget(QWidget* theWgt); + + QList myWidgets; + QGridLayout* myLayout; + int myNewRow; + int myNewCol; + int myMaxRow; +}; + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Module.h b/src/XGUI/XGUI_Module.h new file mode 100644 index 000000000..bac802a69 --- /dev/null +++ b/src/XGUI/XGUI_Module.h @@ -0,0 +1,24 @@ + +#ifndef XGUI_Module_H +#define XGUI_Module_H + +#include + +class XGUI_Module +{ +public: + //! Returns a string in XML format with definition of the module commands + virtual QString moduleDescription() const = 0; +}; + + +//! This function must return a new module instance. +extern "C" +{ + typedef XGUI_Module* (*CREATE_FUNC)(); +} + +#define CREATE_MODULE "createModule" + + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Tools.cpp b/src/XGUI/XGUI_Tools.cpp new file mode 100644 index 000000000..ef83b089c --- /dev/null +++ b/src/XGUI/XGUI_Tools.cpp @@ -0,0 +1,77 @@ + +#include "XGUI_Tools.h" + +#include + + +//****************************************************************** +QString library( const QString& str ) +{ + QString path = dir( str, false ); + QString name = file( str, false ); + QString ext = extension( str ); + +#ifndef WIN32 + if ( !name.startsWith( "lib" ) ) + name = QString( "lib" ) + name; +#endif + +#ifdef WIN32 + QString libExt( "dll" ); +#else + QString libExt( "so" ); +#endif + + if ( ext.toLower() != QString( "so" ) && ext.toLower() != QString( "dll" ) ) + { + if ( !name.isEmpty() && !ext.isEmpty() ) + name += QString( "." ); + name += ext; + } + + ext = libExt; + + QString fileName = addSlash( path ) + name + QString( "." ) + ext; + + return fileName; +} + +//****************************************************************** +QString dir( const QString& path, bool isAbs ) +{ + QDir aDir = QFileInfo( path ).dir(); + QString dirPath = isAbs ? aDir.absolutePath() : aDir.path(); + if ( dirPath == QString( "." ) ) + dirPath = QString(); + return dirPath; +} + + +//****************************************************************** +QString file( const QString& path, bool withExt ) +{ + QString fPath = path; + while ( !fPath.isEmpty() && ( fPath[fPath.length() - 1] =='\\' || fPath[fPath.length() - 1] == '/' ) ) + fPath.remove( fPath.length() - 1, 1 ); + + if ( withExt ) + return QFileInfo( fPath ).fileName(); + else + return QFileInfo( fPath ).completeBaseName(); +} + +//****************************************************************** +QString extension( const QString& path, bool full ) +{ + return full ? QFileInfo( path ).completeSuffix() : QFileInfo( path ).suffix(); +} + +//****************************************************************** +QString addSlash( const QString& path ) +{ + QString res = path; + if ( !res.isEmpty() && res.at( res.length() - 1 ) != QChar( '/' ) && + res.at( res.length() - 1 ) != QChar( '\\' ) ) + res += QDir::separator(); + return res; +} diff --git a/src/XGUI/XGUI_Tools.h b/src/XGUI/XGUI_Tools.h new file mode 100644 index 000000000..0fe6b2f5a --- /dev/null +++ b/src/XGUI/XGUI_Tools.h @@ -0,0 +1,63 @@ + +#ifndef XGUI_Tools_H +#define XGUI_Tools_H + +#include + +/*! + \brief Convert the given parameter to the platform-specific library name. + + The function appends platform-specific prefix (lib) and suffix (.dll/.so) + to the library file name. + For example, if \a str = "mylib", "libmylib.so" is returned for Linux and + mylib.dll for Windows. + + \param str short library name + \return full library name +*/ +QString library( const QString& str ); + +/*! + \brief Return directory part of the file path. + + If the file path does not include directory part (the file is in the + current directory), null string is returned. + + \param path file path + \param abs if true (default) \a path parameter is treated as absolute file path + \return directory part of the file path +*/ +QString dir( const QString& path, bool isAbs = true); + + +/*! + \brief Return file name part of the file path. + + \param path file path + \param withExt if true (default) complete file name (with all + extension except the last) is returned, otherwise only base name + is returned + \return file name part of the file path +*/ +QString file( const QString& path, bool withExt = true ); + +/*! + \brief Return extension part of the file path. + + \param path file path + \param full if true complete extension (all extensions, dot separated) + is returned, otherwise (default) only last extension is returned + \return extension part of the file path +*/ +QString extension( const QString& path, bool full = false ); + + +/*! + \brief Add a slash (platform-specific) to the end of \a path + if it is not already there. + \param path directory path + \return modified path (with slash added to the end) +*/ +QString addSlash( const QString& path ); + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_Workbench.cpp b/src/XGUI/XGUI_Workbench.cpp new file mode 100644 index 000000000..9a539f184 --- /dev/null +++ b/src/XGUI/XGUI_Workbench.cpp @@ -0,0 +1,157 @@ +#include "XGUI_Workbench.h" +#include "XGUI_MenuGroupPanel.h" + +#include +#include +#include + + +#define SCROLL_STEP 20 + +//************************************************** +class CommandsArea : public QScrollArea +{ +public: + CommandsArea(QWidget* theParent) : QScrollArea(theParent) {} + +protected: + virtual void resizeEvent(QResizeEvent * theEvent); +}; + +void CommandsArea::resizeEvent(QResizeEvent* theEvent) +{ + QScrollArea::resizeEvent(theEvent); + QRect aRect = widget()->childrenRect(); + QSize aNewSize = theEvent->size(); + if (aRect.width() > aNewSize.width()) + aNewSize.setWidth(aRect.width() * 2); + widget()->resize(aNewSize); +} + + +//************************************************** +XGUI_Workbench::XGUI_Workbench(QWidget *theParent) : + QWidget(theParent) +{ + setMinimumHeight(30); + QHBoxLayout* aMainLayout = new QHBoxLayout(this); + aMainLayout->setSpacing(0); + aMainLayout->setMargin(0); + aMainLayout->setContentsMargins(0,0,0,0); + + myLeftButton = new QPushButton("<", this); + myLeftButton->setMaximumWidth(14); + //myLeftButton->setEnabled(false); + myLeftButton->setVisible(false); + connect(myLeftButton,SIGNAL(clicked()), this, SLOT(onLeftScroll())); + aMainLayout->addWidget(myLeftButton); + + myCommandsArea = new CommandsArea(this); + aMainLayout->addWidget(myCommandsArea); + + myChildWidget = new QWidget(myCommandsArea); + myCommandsArea->setWidget(myChildWidget); + myCommandsArea->setAlignment(Qt::AlignLeft | Qt::AlignTop); + myCommandsArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + myCommandsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + myLayout = new QHBoxLayout(myChildWidget); + myLayout->setSpacing(0); + myLayout->setMargin(0); + myLayout->setContentsMargins(0,0,0,0); + + myRightButton = new QPushButton(">", this); + myRightButton->setMaximumWidth(14); + //myRightButton->setEnabled(false); + myRightButton->setVisible(false); + connect(myRightButton,SIGNAL(clicked()), this, SLOT(onRightScroll())); + aMainLayout->addWidget(myRightButton); + +} + +int XGUI_Workbench::addGroup() +{ + if (!myLayout->isEmpty()) { + int aNb = myLayout->count(); + QLayoutItem* aItem = myLayout->itemAt(aNb - 1); + myLayout->removeItem(aItem); + } + XGUI_MenuGroupPanel* aGroup = new XGUI_MenuGroupPanel(myChildWidget); + myLayout->addWidget(aGroup); + addSeparator(); + myLayout->addStretch(); + myGroups.append(aGroup); + return myGroups.size() - 1; +} + +void XGUI_Workbench::addSeparator() +{ + QFrame* aLine = new QFrame(myChildWidget); + aLine->setFrameShape(QFrame::VLine); + aLine->setFrameShadow(QFrame::Sunken); + myLayout->addWidget(aLine); +} + +void XGUI_Workbench::addCommand(int theGroupId, XGUI_Command* theCommand) +{ + XGUI_MenuGroupPanel* aGroup = myGroups.at(theGroupId); + aGroup->addCommand(theCommand); +} + + +void XGUI_Workbench::resizeEvent(QResizeEvent* theEvent) +{ + QWidget::resizeEvent(theEvent); + QSize aSize = theEvent->size(); + myLeftButton->setMinimumHeight(aSize.height() - 2); + myRightButton->setMinimumHeight(aSize.height() - 2); + + QSize aS = myChildWidget->sizeHint(); + int aW = myChildWidget->width(); + if (aW < aS.width()) + myChildWidget->resize(aS.width(), myChildWidget->height()); + + //myLeftButton->setEnabled(isExceedsLeft()); + //myRightButton->setEnabled(isExceedsRight()); + myLeftButton->setVisible(isExceedsLeft()); + myRightButton->setVisible(isExceedsRight()); +} + + +void XGUI_Workbench::onLeftScroll() +{ + if (!isExceedsLeft()) + return; + myChildWidget->move( myChildWidget->pos().x() + SCROLL_STEP, 0 ); + myLeftButton->setVisible(isExceedsLeft()); + myRightButton->setVisible(isExceedsRight()); + //myLeftButton->setEnabled(isExceedsLeft()); + //myRightButton->setEnabled(isExceedsRight()); +} + + +void XGUI_Workbench::onRightScroll() +{ + if (!isExceedsRight()) + return; + myChildWidget->move( myChildWidget->pos().x() - SCROLL_STEP, 0 ); + //myLeftButton->setEnabled(isExceedsLeft()); + //myRightButton->setEnabled(isExceedsRight()); + myLeftButton->setVisible(isExceedsLeft()); + myRightButton->setVisible(isExceedsRight()); +} + + +bool XGUI_Workbench::isExceedsLeft() +{ + QPoint aPos = myChildWidget->pos(); + return (aPos.x() < 0); +} + +bool XGUI_Workbench::isExceedsRight() +{ + QPoint aPos = myChildWidget->pos(); + int aVPWidth = myCommandsArea->viewport()->rect().width(); + int aWgtWidth = myChildWidget->childrenRect().width(); + return ((aVPWidth - aPos.x()) < aWgtWidth); +} diff --git a/src/XGUI/XGUI_Workbench.h b/src/XGUI/XGUI_Workbench.h new file mode 100644 index 000000000..d7916351a --- /dev/null +++ b/src/XGUI/XGUI_Workbench.h @@ -0,0 +1,48 @@ + +#ifndef XGUI_Workbench_H +#define XGUI_Workbench_H + +#include +#include +#include + +class QHBoxLayout; +class XGUI_MenuGroupPanel; +class QPushButton; +class CommandsArea; +class XGUI_Command; + + +class XGUI_Workbench : public QWidget +{ + Q_OBJECT +public: + XGUI_Workbench(QWidget* theParent); + + int addGroup(); + + void addCommand(int theGroupId, XGUI_Command* theCommand); + +private slots: + void onLeftScroll(); + void onRightScroll(); + +protected: + virtual void resizeEvent(QResizeEvent * theEvent); + +private: + void addSeparator(); + bool isExceedsLeft(); + bool isExceedsRight(); + + + QWidget* myChildWidget; + QHBoxLayout* myLayout; + QList myGroups; + + CommandsArea* myCommandsArea; + QPushButton* myRightButton; + QPushButton* myLeftButton; +}; + +#endif; \ No newline at end of file diff --git a/src/XGUI/XGUI_Workshop.cpp b/src/XGUI/XGUI_Workshop.cpp new file mode 100644 index 000000000..2644722fe --- /dev/null +++ b/src/XGUI/XGUI_Workshop.cpp @@ -0,0 +1,255 @@ +#include "XGUI_Workshop.h" +#include "XGUI_MainWindow.h" +#include "XGUI_MainMenu.h" +#include "XGUI_Command.h" +#include "XGUI_Tools.h" +#include "XGUI_Module.h" + +#include +#include +#include + +#ifdef WIN32 +#include +#else +#include +#endif + + +XGUI_Workshop::XGUI_Workshop() : + QObject() +{ + myMainWindow = new XGUI_MainWindow(); + + // Set Logo + //XGUI_MainMenu* aMenuBar = myMainWindow->menuBar(); + //aMenuBar->setLogo(QPixmap(":pictures/OCCLogo.png")); +} + +//****************************************************** +XGUI_Workshop::~XGUI_Workshop(void) +{ +} + +//****************************************************** +void XGUI_Workshop::startApplication() +{ + initMenu(); + //loadModules(); + myMainWindow->show(); +} + +//****************************************************** +void XGUI_Workshop::initMenu() +{ + int aPageId = addWorkbench(tr("HOME_MENU_TITLE")); + + // File commands group + int aGroupId = addPageGroup(aPageId); + + XGUI_Command* aCommand; + + aCommand = createMenuCommand(aPageId, aGroupId, NEW_CMD, tr("NEW_MENU"), tr("NEW_MENU_TIP"), + QIcon(":pictures/new.png"), QKeySequence::New); + connect(aCommand, SIGNAL(triggered()), this, SLOT(onNew())); + + aCommand = createMenuCommand(aPageId, aGroupId, OPEN_CMD, tr("OPEN_MENU"), tr("OPEN_MENU_TIP"), + QIcon(":pictures/open.png"), QKeySequence::Open); + connect(aCommand, SIGNAL(triggered()), this, SLOT(onOpen())); + + aCommand = createMenuCommand(aPageId, aGroupId, SAVE_CMD, tr("SAVE_MENU"), tr("SAVE_MENU_TIP"), + QIcon(":pictures/save.png"), QKeySequence::Save); + connect(aCommand, SIGNAL(triggered()), this, SLOT(onSave())); + aCommand->setEnabled(false); + + aCommand = createMenuCommand(aPageId, aGroupId, SAVEAS_CMD, tr("SAVEAS_MENU"), tr("SAVEAS_MENU_TIP"), + QIcon(":pictures/save.png")); + connect(aCommand, SIGNAL(triggered()), this, SLOT(onSaveAs())); + aCommand->setEnabled(false); + + aCommand = createMenuCommand(aPageId, aGroupId, EXIT_CMD, tr("EXIT_MENU"), tr("EXIT_MENU_TIP"), + QIcon(":pictures/close.png"), QKeySequence::Close); + connect(aCommand, SIGNAL(triggered()), this, SLOT(onExit())); + + + // Edit commands group + aGroupId = addPageGroup(aPageId); + + aCommand = createMenuCommand(aPageId, aGroupId, UNDO_CMD, tr("UNDO_MENU"), tr("UNDO_MENU_TIP"), + QIcon(":pictures/undo.png"), QKeySequence::Undo); + + aCommand = createMenuCommand(aPageId, aGroupId, REDO_CMD, tr("REDO_MENU"), tr("REDO_MENU_TIP"), + QIcon(":pictures/redo.png"), QKeySequence::Redo); + + aCommand = createMenuCommand(aPageId, aGroupId, CUT_CMD, tr("CUT_MENU"), tr("CUT_MENU_TIP"), + QIcon(":pictures/cut.png"), QKeySequence::Cut); + + aCommand = createMenuCommand(aPageId, aGroupId, COPY_CMD, tr("COPY_MENU"), tr("COPY_MENU_TIP"), + QIcon(":pictures/copy.png"), QKeySequence::Copy); + + aCommand = createMenuCommand(aPageId, aGroupId, PASTE_CMD, tr("PASTE_MENU"), tr("PASTE_MENU_TIP"), + QIcon(":pictures/paste.png"), QKeySequence::Paste); + + // Tests + aPageId = addWorkbench("Primitives"); + aGroupId = addPageGroup(aPageId); + + aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Box", "Create Box", QIcon(":pictures/box.png")); + aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Cylinder", "Create Cylinder", QIcon(":pictures/cylinder.png")); + aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Disk", "Create Disk", QIcon(":pictures/disk.png")); + aCommand = createMenuCommand(aPageId, aGroupId, LAST_CMD, "Torus", "Create Torus", QIcon(":pictures/torus.png")); + + aPageId = addWorkbench("Operations"); + +} + +//****************************************************** +XGUI_Command* XGUI_Workshop::createMenuCommand(int thePageId, int theGroupId, XCommandId theCmdId, + const QString& theTitle, const QString& theTip, + const QIcon& theIcon, const QKeySequence& theKeys) +{ + XGUI_Command* aCommand = new XGUI_Command(theIcon, theTitle, this); + aCommand->setToolTip(theTip); + if (!theKeys.isEmpty()) + aCommand->setShortcut(theKeys); + addCommand(theCmdId, thePageId, theGroupId, aCommand); + return aCommand; +} + +//****************************************************** +int XGUI_Workshop::addWorkbench(const QString& theName) +{ + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + return aMenuBar->addWorkbench(theName); +} + +//****************************************************** +int XGUI_Workshop::addPageGroup(int thePageId) +{ + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + return aMenuBar->addGroup(thePageId); +} + +//****************************************************** +void XGUI_Workshop::addCommand(XCommandId theCommandId, int thePageId, int theGroupId, XGUI_Command* theCommand) +{ + XGUI_MainMenu* aMenuBar = myMainWindow->menuObject(); + aMenuBar->addCommand(thePageId, theGroupId, theCommand); + myCommands[theCommandId] = theCommand; +} + +//****************************************************** +XGUI_Command* XGUI_Workshop::command(XCommandId theId) const +{ + if (myCommands.contains(theId)) + return myCommands[theId]; + return 0; +} + +//****************************************************** +void XGUI_Workshop::onExit() +{ + qApp->exit(); +} + +//****************************************************** +void XGUI_Workshop::onNew() +{ + myMainWindow->showObjectBrowser(); +} + +//****************************************************** +void XGUI_Workshop::onOpen() +{ + QString aFileName = QFileDialog::getOpenFileName(mainWindow()); +} + +//****************************************************** +void XGUI_Workshop::onSave() +{ +} + +//****************************************************** +void XGUI_Workshop::onSaveAs() +{ + QString aFileName = QFileDialog::getSaveFileName(mainWindow()); +} + +//****************************************************** +XGUI_Module* XGUI_Workshop::loadModule(const QString& theModule) +{ + QString libName = library( theModule ); + if ( libName.isEmpty() ) + { + qWarning( qPrintable( tr( "Information about module \"%1\" doesn't exist." ).arg( theModule ) ) ); + return 0; + } + + QString err; + CREATE_FUNC crtInst = 0; + +#ifdef WIN32 + HINSTANCE modLib = ::LoadLibrary( (LPTSTR) libName.utf16() ); + if ( !modLib ) + { + LPVOID lpMsgBuf; + ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, 0, ::GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, 0 ); + QString aMsg((char*)&lpMsgBuf); + err = QString( "Failed to load %1. %2" ).arg( libName ).arg( aMsg ); + ::LocalFree( lpMsgBuf ); + } + else + { + crtInst = (CREATE_FUNC)::GetProcAddress( modLib, CREATE_MODULE ); + if ( !crtInst ) + { + LPVOID lpMsgBuf; + ::FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, 0, ::GetLastError(), 0, (LPTSTR)&lpMsgBuf, 0, 0 ); + QString aMsg((char*)&lpMsgBuf); + err = QString( "Failed to find %1 function. %2" ).arg( CREATE_MODULE ).arg(aMsg ); + ::LocalFree( lpMsgBuf ); + } + } +#else + void* modLib = dlopen( libName.toLatin1(), RTLD_LAZY ); + if ( !modLib ) + err = QString( "Can not load library %1. %2" ).arg( libName ).arg( dlerror() ); + else + { + crtInst = (CREATE_FUNC)dlsym( modLib, GET_MODULE_NAME ); + if ( !crtInst ) + err = QString( "Failed to find function %1. %2" ).arg( CREATE_MODULE ).arg( dlerror() ); + } +#endif + + XGUI_Module* aModule = crtInst ? crtInst() : 0; + + if ( !err.isEmpty() ) { + if ( mainWindow() && mainWindow()->isVisible() ) + QMessageBox::warning( mainWindow(), tr( "Error" ), err ); + else + qWarning( qPrintable( err ) ); + } + return aModule; +} + +//****************************************************** +void XGUI_Workshop::loadModules() +{ + // Test of modules loading + QStringList aModules; + aModules << "GeomModule"; + + foreach(QString aName, aModules) { + XGUI_Module* aModule = loadModule(aName); + buildModuleMenu(aModule->moduleDescription()); + } +} + +//****************************************************** +void XGUI_Workshop::buildModuleMenu(const QString& theXML) +{ + +} diff --git a/src/XGUI/XGUI_Workshop.h b/src/XGUI/XGUI_Workshop.h new file mode 100644 index 000000000..9b7980196 --- /dev/null +++ b/src/XGUI/XGUI_Workshop.h @@ -0,0 +1,68 @@ + +#ifndef XGUI_WORKSHOP_H +#define XGUI_WORKSHOP_H + +#include +#include +#include +#include + +class XGUI_MainWindow; +class XGUI_Command; +class XGUI_Module; + +class XGUI_Workshop: public QObject +{ + Q_OBJECT +public: + enum XCommandId { + NEW_CMD, + OPEN_CMD, + SAVE_CMD, + SAVEAS_CMD, + EXIT_CMD, + UNDO_CMD, + REDO_CMD, + COPY_CMD, + CUT_CMD, + PASTE_CMD, + LAST_CMD + }; + + XGUI_Workshop(); + virtual ~XGUI_Workshop(); + + void startApplication(); + + XGUI_Command* command(XCommandId theId) const; + + XGUI_MainWindow* mainWindow() const { return myMainWindow; } + +public slots: + void onNew(); + void onOpen(); + void onSave(); + void onSaveAs(); + void onExit(); + +private: + void initMenu(); + + XGUI_Module* loadModule(const QString& theModule); + void loadModules(); + + void buildModuleMenu(const QString& theXML); + + int addWorkbench(const QString& theName); + int addPageGroup(int thePageId); + void addCommand(XCommandId theCommandId, int thePageId, int theGroupId, XGUI_Command* theCommand); + XGUI_Command* createMenuCommand(int thePageId, int theGroupId, XCommandId theCmdId, + const QString& theTitle, const QString& theTip, + const QIcon& theIcon = QIcon(), const QKeySequence& theKeys = QKeySequence()); + + QMap myCommands; + + XGUI_MainWindow* myMainWindow; +}; + +#endif \ No newline at end of file diff --git a/src/XGUI/XGUI_msg_en.ts b/src/XGUI/XGUI_msg_en.ts new file mode 100644 index 000000000..94a8cc9a9 --- /dev/null +++ b/src/XGUI/XGUI_msg_en.ts @@ -0,0 +1,108 @@ + + + + + @default + + + XGUI_Workshop + + HOME_MENU_TITLE + Home + + + NEW_MENU + New + + + NEW_MENU_TIP + Create new document + + + OPEN_MENU + Open... + + + OPEN_MENU_TIP + Open document + + + SAVE_MENU + Save + + + SAVE_MENU_TIP + Save document + + + SAVEAS_MENU + Save As... + + + SAVEAS_MENU_TIP + Save document in another file + + + EXIT_MENU + Exit + + + EXIT_MENU_TIP + Exit from application + + + UNDO_MENU + Undo + + + UNDO_MENU_TIP + Undo last command + + + REDO_MENU + Redo + + + REDO_MENU_TIP + Redo last command + + + CUT_MENU + Cut + + + CUT_MENU_TIP + Cut selected object + + + COPY_MENU + Copy + + + COPY_MENU_TIP + Copy selected object + + + PASTE_MENU + Paste + + + PASTE_MENU_TIP + Paste copied object + + + + XGUI_MainWindow + + OBJECT_BROWSER_TITLE + Object Browser + + + + XGUI_MainMenu + + MENU_TITLE + Menu + + + diff --git a/src/XGUI/XGUI_pictures.qrc b/src/XGUI/XGUI_pictures.qrc new file mode 100644 index 000000000..f882c6cf9 --- /dev/null +++ b/src/XGUI/XGUI_pictures.qrc @@ -0,0 +1,64 @@ + + + pictures/new.png + pictures/open.png + pictures/save.png + pictures/close.png + pictures/copy.png + pictures/cut.png + pictures/paste.png + pictures/redo.png + pictures/undo.png + + pictures/box.png + pictures/cylinder.png + pictures/disk.png + pictures/torus.png + pictures/ViewPort.png + + pictures/occ_view_ambient.png + pictures/occ_view_anticlockwise.png + pictures/occ_view_back.png + pictures/occ_view_bottom.png + pictures/occ_view_camera_dump.png + pictures/occ_view_clipping.png + pictures/occ_view_clipping_pressed.png + pictures/occ_view_clockwise.png + pictures/occ_view_clone.png + pictures/occ_view_fitall.png + pictures/occ_view_fitarea.png + pictures/occ_view_front.png + pictures/occ_view_glpan.png + pictures/occ_view_graduated_axes.png + pictures/occ_view_left.png + pictures/occ_view_maximized.png + pictures/occ_view_minimized.png + pictures/occ_view_pan.png + pictures/occ_view_preselection.png + pictures/occ_view_presets.png + pictures/occ_view_reset.png + pictures/occ_view_return_3d_view.png + pictures/occ_view_right.png + pictures/occ_view_rotate.png + pictures/occ_view_rotation_point.png + pictures/occ_view_scaling.png + pictures/occ_view_selection.png + pictures/occ_view_shoot.png + pictures/occ_view_style_switch.png + pictures/occ_view_top.png + pictures/occ_view_triedre.png + pictures/occ_view_zoom.png + pictures/occ_view_zooming_style_switch.png + + pictures/wnd_close.png + pictures/wnd_minimize.png + pictures/wnd_maximize.png + + pictures/params_folder.png + pictures/constr_folder.png + pictures/part_ico.png + pictures/properties.png + pictures/features.png + + + diff --git a/src/XGUI/pictures/ViewPort.png b/src/XGUI/pictures/ViewPort.png new file mode 100644 index 0000000000000000000000000000000000000000..b8273017dfce7169d1510100f0429f042fe82a92 GIT binary patch literal 4583 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 FV1i0inA-pV literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/close.png b/src/XGUI/pictures/close.png new file mode 100644 index 0000000000000000000000000000000000000000..3868c161df8e4dff9d6db073905c4a5e54441a50 GIT binary patch literal 940 zcmV;d15^BoP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 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 t;zGDD*|UZFt&2n%ss002ovPDHLkV1hUEdmjJ* literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/cut.png b/src/XGUI/pictures/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..5f022d0962334b7f11e25317dc33a1a23f506e7a GIT binary patch literal 927 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 Q@~ literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/new.png b/src/XGUI/pictures/new.png new file mode 100644 index 0000000000000000000000000000000000000000..2321ace5b8f00f8fe5fde8bbee482174676627d0 GIT binary patch literal 623 zcmV-#0+9WQP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00F;AL_t(IPkqk4OIuMG25_SmuHYz0p`Zv(Vu$pPuv4K+eXa}8ajYK6uA`%i4qPI~D`64Pku?5p&no4bsP5g+O`}khX#bcA)2Yzs0c+SJE z6VgoDNJkazq=ht)nt5iiSo}7dE%Lu{t5xpldHPOjYI;mP!)?7X!;GbJr4k^zye#23 zf2#QWf!{{slWFRye^Yg2bZ3|4&WeDD=P&RxdyIc4MP+%#dn8HHTk1X{6(i<&lJTQF zAj4_9KVy8IBqIV%lIZ3{YRXeRdafIL`RNUqF;Tyn=UgAMZcQm|2R#?cFHQ zz$EosN&U^sa?GI!<9k^kRi=LL{Zg=PfGc`Oy+sb6&Va+u zxP23t6U=S^c8z*_bOu~&j86p>=vi2;Juv19?i3th1)}*f?OyaJ&Z+x}R16H5`iJ7C z!B+<_247}0rZVk*ZtB~o?nly1?hQO7z2r4{qho@M5E`g^a1G8F+1d^diX;F4002ov JPDHLkV1gti0TloM literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_ambient.png b/src/XGUI/pictures/occ_view_ambient.png new file mode 100644 index 0000000000000000000000000000000000000000..7f411531766ea57ea588e7203b346f54b70eae2c GIT binary patch literal 1435 zcmV;M1!Ve(P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ>5lKWrRCwBA{Qv(y0|Uc;W+1@^#N0qE2*jd5EM8W& zeciu*{}_J!_`&e`^Jj*4@7{s&(W5OvK>3$I{2GYg1MycN{>8xH_!l6682|s@#|Y%G z0x>7lFbN=*DK6f!y0^EN0R*0Z{l@SQXt6X8H<&LYBg1h0`phU^UatE`GdGdsTkI!e>$B$nnp?Wx> zW-tN-5X?XpAZCYpS>P*FBPclj1HJs`KM4N^^WOu#{`2Qgu>74nPnBN2d@lgi3o?Td zAb^lv2ns_^FR$*!ixw?n`1}px&DX#GGW-F$?hnvl5dRa5=e5EBCgfD8q(Szf+;2^Ihu^!nEyhE>a!0KNNV3|~HdVlXf^X88L17g*ihyU&Dv|Ng_Rq$CM4g8?9bSfGae1x5S9g*&B-i~U!z zv$KbR!U<&9zCC*wf}^4tzI^_~@CztrYGKL1{N)ovYI-_DZ*S&`7cbtifm0sDjQ;=u z1T*lDx_W%0wjO)DwY4O}uV23ye*gXrcBP$z1H-QE+ZpcPzQtf|XV38T@goMNFQ36C zeEs_4%b!1g-!d{Xd;ysOG7BJpK;ibEm)EP#((YsY!qtBnlCr-u+j|?9_eqy+AErNlQlaoPLLX3f#nHd_ce;M-f@)#B_tl0eF!9 zf(>F}VPRkb8p_NBG5E)iUtgJ+m>x+;2;Z1Lf4j1U4HLtKv$sAlGBWZ41Q5u}DvHVs z4AUq6W?*II$TK#ybv$!Sc-rqD@(VaPIKTz~HG|UxPy?9%@8ACqQc}YAyuHmIzIydR zR#lym!Nmh?nFl}sfn50ID=T;1!7$w z_7xKo`ws&B{r&%4U0whC`uc)W#D6_KrK5#~p%M4*FOvX<#Q&Sm+5bnxGK1t|0Ro5- zls|!9kprbepds&oG%wU9IaXG;oqm3P47cxXU13N z(<0)2W_3+wWpFnC#c=l2KXZTpf)oI7ypIKl1%Oxyh^;}cIdS5|e{LRz|1Z9A{QvMD zg7ZpQ{wt|4{!h+i28&;L$o?PXQc!*d2q1I=nSq!ah$TVZK74p$6g1)g-?WzvZXi02 zN&tJe0%Qh205LJ3g8$GI{{x6We);nKSzB95nY6UXoj0%lGc;EI0eK6q7?`0LI-CA5 zEL-q*I?%8VkQhJ!v0yRqFVsK=F)@J$!0=@f7UtW#am{;`GsgwDOzr!qDJJn#SwxhP p;rY}53@=~&p9oai0W$y~zyQ_0WlB6gqLcst002ovPDHLkV1go8n*0C& literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_anticlockwise.png b/src/XGUI/pictures/occ_view_anticlockwise.png new file mode 100644 index 0000000000000000000000000000000000000000..991586fe6d877a528f2afa6647ccfcc5d92bd742 GIT binary patch literal 936 zcmV;Z16TZsP)Px#24YJ`L;wH)!2rW+L(~EQ000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2ipS= z4lN>7IvUFW000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}00096NklPd;6H+|O^Vu6z7 z4s~3M?o?9V`F1TwzxVk2QBwFH=!LAk#r?^to6_D_$p@Epa+brIP|3pWpF(gxtE}55(Lu()1*vndf(OPJ{e(Oq7+P%smWR1JeOtY;gI+Wq83ZiSkTTx;q4w_|xg4Wswb?UG|+nzEs(_m~Y%XimZ{!(Nu53xqCWbsuBtg+tPK*Jon!d- zNdkJX*fuM%G5VxM6hZRnmW4P9<>$i%ri?L}$Yc=@nrk*IfAg;5_RT-gZJYSIGF&h3 z|MXIsA^G&PJM2GrosU0BlAOLFeg|Ie$}llHh3;6q)EXtENBlE%WR}s9M;O^Tx_(L$ z)`g?T!lH+5#BFB0|o}uq|-SP&DA6lmAw4w zbJWHwi^P`DJ$k|SY85oZ=>2VsZ z*|B4WqSelM8i#wf{7CTOSGdP0;NbJ3?dMNl#apQghtI|SW_jEcbAlNt8e+u5$H3Gf zD54n^6{T{VXH(*w9)HIxEDCW90uCPxT*~IIdR4n8u|p(Jf$t^q z>bS!nR-h>-40+fb+8DXnCM1eC{NOkd(7=$iXi}o}f-m6>3`*9o6ODOP_yimhm>Zui zG}`hbQ1Rdy@qqk8yv&RZ3{8?JcvHL^y5xm;{xF$-(cYxsz+f1(n~QY85oZ=>2VsZ z*|B5B!*98+i+FBt(PTgNh2fDbP^Kks#{Byti(=V~&Kyry>ftU@4rc>h5?ccECN?~SvV9{NplD|gqRB`G_1%| z0J`JBB!;6Vb_>@1<5+D007H_2!PC{x JWt~$(699I+gjE0l literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_camera_dump.png b/src/XGUI/pictures/occ_view_camera_dump.png new file mode 100644 index 0000000000000000000000000000000000000000..b02616f2975e7a3865a236ee75380bdae5ce59f7 GIT binary patch literal 682 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`j)FbFd;%$g$s6l6(v z^mSxl*w|O|J8&|PuaN8!GAr-fh{`~)M&uq%*z+h+?Aj!ZYz}<83#0idNZ{NHLm{arOf}-0Di4NZr z4h;-Rj?WrQvR=Mwyy^F?%;4dFDJdx)KR>?&vt5iYrhzo>YRaCjpLk={x^?G1e0dpc zAf2Wt^rJsV!+{}D;>9cZGar846mH{Q?tkd0S>BzF%TD3t{4*BXIQ-IfVA%M8i#s*c zlr1kVj?FMpku6S6PGNSxV@Sx9M(Gn`0zzpIgandKboIMkOJX=8&cMX6ys@Kkl!Hi5Cs~Z*GuUfUrsH3ynxPybcSy{#2e*VG@J6ax= z#n~Osp1^ImwK3)gt3rdprHAi&vk!iGdwaWNpPVI=nU9lGQ{we?u{?kG+WrXQ(cn=9 z+IG10^fX=PhwiSfjl8q1O0@zxr4<@xOt_qoo~}Mam+y-f$9#+0wuLz-jo8f1&D+fL z?z+m40n#|u4mYG61ddHVaiyUq`r4~d9q8ZdYn zozP=;ncaEPUC6S9SjZ)j11xdTOVx|PwNDx OD+W(jKbLh*2~7Z6;rO)x literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_clipping.png b/src/XGUI/pictures/occ_view_clipping.png new file mode 100644 index 0000000000000000000000000000000000000000..0356a9a319903f0f6864653fbfdb4c5e57b030c7 GIT binary patch literal 809 zcmV+^1J?YBP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;pGibPRCwBA{Qv(y12q9a05K7xXz}93{}~w>iLx0W zfS5>h06{|m0tjp%&~`X(DF_6)Mi_`WVPePtS?#p6U<|bY0fgZ~RnUh1}2F7cOZU)=HqXSY`|D#1!;t*WN>JK06+jSK~(%>_{Q{? z;Ttmqe`op2px(V=GEnLfmN5J-mAFmr3sBt`rhg1yfJS}#|BvCrA4nzw2q3TvUo!s$ z+VmgnLPnq>Mu_X)0`W~OE(C!$&lr9IBl17Pe_#au2BwVPe;~dD2p|S%X#)!Qa3C(7 zS>p~8=m6qGScHHQHYlb3M=hFU=P$R0sjUa;1(^X5KrApDf%q5@UwFd)w+rerT&{z= z^4@Q-t8OA?fNuZ+#DJwd1i8uzIl16)Ay%~j0mOpMX0S~VObB481qdK)27ZTPVgQC( nfB<47u?qMPNvXI2K!5=NR>;YS7u$tM00000NkvXXu0mjf*2zO> literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_clipping_pressed.png b/src/XGUI/pictures/occ_view_clipping_pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e38a8aa7ee31c1798621f901830915d7a2c3312e GIT binary patch literal 560 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 literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_fitarea.png b/src/XGUI/pictures/occ_view_fitarea.png new file mode 100644 index 0000000000000000000000000000000000000000..450dc56c6ce722c040b4e5b77459207e8256cd58 GIT binary patch literal 912 zcmV;B18@9^P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<21!IgRCwBA`2YVu0|yT@j4)mLY4&S1Wi z-OcbHM57sG48)m^9-he_0f7usvT_X1pFT0(yLC(8&W#(k0Oh^{@n4u?fB<44!Y5g^ z-MvYH5s?faC;S8YMon9X!N%2{!P42~V^d*1!@s|O;pPAY5EB8zLY%$4ll;RYzy^Ww zzyAz>|Nmq7`|lrvqn8hZdq5CKT`^1pKmZXkFx1h@8)yK~5THSSfQEqa-+v50fBt0n z`uQ`1xxGC|T`bJU00BhE%bd(CtYFsw%>%pe_wU~f-@kqZ8u)|Z&#&KLF(43ts^eU0F)F)_Iu>vs%)X>*Rt^|Sq00D$yAS*L-7tFAGPoM68`t<2NpzvEDJ`2PkgPEZQ zf?W3=>e4ST{Qv>Pgyb@bC5sj@fV}w<7@K#WJlO{{>@HC171XfPKztRHl%RYNeIJNF z01K4gATvM(3qSzDi!W_$?G#}ip4rTdj11l(AtV=F=_OOZ1q?s{!3|_&WMorRR4o7X z>z4u0Wlx|ky9mWEfcQ5q!$2+r83v*O0tneaP`Ky0YCsD8wiRZ mF(6igmT$M9kwFpw2rvMsC6+#;$I7?>0000Y85oZ=>2VsZ z*|B5B!*98+i+FBt(PTgNh2fDbP^Kks#{Byti(=V~&Kyry>ftU@fIOolmwP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZc>jKeOv$OzL15I`)*h9FA-UC3*1Z~uwm?OTSQ4<0bQ ze(?e}13&j7BtjOg8oBY{u_wj195)S?b{&f6+rwNh(Uq* zK0ZGF9!TB4fBzVey$%pSph#d!NlE$3!NI}s_3KxL7r?*=#V#=XRDg2aKr9Qy%0Mg# zwcu`6R@RnZzkY$$K7Ra|;oiM_44*%L1}7(g00Oy$^}~k`3@Z!_7=WS-7i47_^npo& z_1d*NKskL-Yy$BYAm#zl;o;#2riOWv!1Q5tTw%b52J!EBN z_zMj9Ye2(a0MpVAL405VabQDXA%mWt-g{_beh*a#GW3?PurN#?D4ah51P}|7@?T7UooaWF76FUtY(e=N8Ih<%~* zEa-Xx0ti>}^$+SLM<6zX=4AnBQUWFN&ro@cDgYqB0GrW?VpB4t`v3p{07*qoM6N<$ Eg6tg6&Hw-a literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_graduated_axes.png b/src/XGUI/pictures/occ_view_graduated_axes.png new file mode 100644 index 0000000000000000000000000000000000000000..2b44c06fe8f81517d47267c43b62963b1a40ace5 GIT binary patch literal 650 zcmV;50(Jd~P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;07*naRCwBA`2YVu13vJ;#00+rGyo7lOhl>^2V!nw z6aoYg6EUs>(l3CN1Th8z1P}uOFY`hTtpZ{%5TB5F00G1ZGLVsx5tqD-v9a-EdQCNfLQPa2gtCsK+A5ow_`|FR8+v2prCjU#9x5;7eD|p;W6xQM@I)% zNswVkaw;im)@h0~(eq!v4A!D0vqkfUqTOAz&=O z72}z~P*n2)XZiygwjW4+hNeGeXkLE?5I{H$B#=8+11XSg&w&`EmJON~p8y09x`9ld z_NV`DKWORzWII9=Edx~ZZzvm-#Xf;F1Mxj*8Uz`@1_t3dn`h<~8@7^L|d)KHL1 ze}W8xNdg2A*vnoHXZ{0SrUEUZ_(8!0HSimcxAr-fh{`~)M&uq%*z_77_!_Cc2#L?H+cT&#Iy1!N(L5z>Y85oZ=>2VsZ z*|B5B!*98+i+FBt(PTgNh2fDbP^KmC#?I{d9c7Xy4CLo`8t9#9wE>E{s2+a6pwJL8 z;qV!cZhoyh-WMEl+8P-g7!Dp5xLNA`-0Tsr^OAzYKsOvY;*iQ9;1FUipwO@)Pr-p9 z@UBAx!=hb{AX~kiLciL@^}c%5zoCnnMWC&*WfBk1fh!J^FNg)$u|3iU+0>VK;-z4O zK?Bcjh9m9{ZA>fz!c%!}GcMf^WGSz(xpL`}($0V*X%ZeX3JnL?m`*#VW_(=i)HG9n z!Mzq~HYNr}7UK!hC#Ero+N((XV9k0Fp5oZRkhG*sltCbY;YM8g@#-Jb&H@9L!PC{x JWt~$(69BoFkt+ZI literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_maximized.png b/src/XGUI/pictures/occ_view_maximized.png new file mode 100644 index 0000000000000000000000000000000000000000..8e19d6a23c327451f78cefdbe090ce2ac1978471 GIT binary patch literal 236 zcmeAS@N?(olHy`uVBq!ia0vp^d?3uh1SBVD?P>#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#Dwhb4qUzP$<5Ph`-JULvAsp9}b@cVq6!#3oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#Dwhb4lIHhsH)?@G^E_P~LpZJ{>*(vJDe!GDFfb@7`SKvV0T zZlI|B_w#f9Mu7(A&`@5E$G5hg7HFF`O^-2u;Z7mfmp3=7EAk{K7yImAtl?_Rwuo_e w(3)cjfmMHgFsem(I2>YKehFx~z~mT)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZb!otG-18H_3W&!c>DFz52f`;Yh z=KlYG@Zf(vJw1@2;y}!e&rpB>!e<*(Vq)UoNnv3OZ?0TnIIE=v5_imOsnQ(>_Q@}D9Q|HpzmfY=u#@9*!A5&HlE#0WDiKR^HPSD@Ek zzkbaCa@oa;7a4y4{_O{p(+6UCAm#(&Px|`$DQaqJ3~X#{4Da5(V|e)RA;Yz6*FdiR z0t!=r00NsF6BF}yLQoI`!>?Zq4Bx&nFns>Zz!(z)vWNqS-$A_va>-9lVB{=URRycP zpsdWG&(6-kdhOZ^SVRE?5Q~nE&fmqMp$spM9AUWs@+E@^Q1mI#KqwFe;@8la1=_~I z2J*$jJ9ilVe*DOA?ZXF#7k~dU%-7RnNW63j9QyzP#B$}z6$wUv{}&HSOBrrFdBPyW z&(HAr=TDe{d{D#gLnA=o6)=Lf|NhPJ2I#_XKyN<>8oU@7aj@722p~`x$^o%15O2W} zQ4K(R5QwirT?%sXD=g|(05K?CodF0SP#A)o^9gFhL?B)Zjj^{zMn(Vgg6j zxpU_jK79D#4wN$jVr3vsfvN|&{yoSXfB<5F#?CWnLd}P!GmwE_`1tr3R)vHxJUVoU z;RMiI;U7Ty82F(McnHLu(3}E_l-nS400M{wntfhCo&E)yX#avZ-#{@A45MF<9x;Hz z4lSY{BV~fOP)EH02p|@y4KPE$Kyv_tjEu~^`}glN965WI;l_&>3~!m4VFpeGVn3)0 zVaeeeEFA&_5G?D#4E+fW52hzio+tt7dm^Ah;l~e#JMZ4X4D5u`pP`QU2lWw%{s$01 zxUwNTH0uR`vRkc+3M|{L0pd2OxFS>?3IGToW*i2Bk`pV``xg$qd*=yF8X#vr0J$9M zy07T20tg^xJOwPwRUpGpK{Y>y#^wX4;lH73-~b@N0A_|Q{Wj4Xb^rhX07*qoM6N<$ Ef)-GsSpWb4 literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_preselection.png b/src/XGUI/pictures/occ_view_preselection.png new file mode 100644 index 0000000000000000000000000000000000000000..cd5baec98256e8357c1aa7501b5f404628558e96 GIT binary patch literal 621 zcmV-z0+RiSP)+110s2Wq zK~y-)y_8)@Q(+j#f9GtieNibbwnej#ElzbaoEH(&MbS-kQ|l&ZH&J*|kZd9p2z@AM zX_+x$AtkY!h@c=E5*baJL=A*4+(m4iTn0*GXeM;#Io-@4@|dpCbMw9r@B9Av^F06e z5hO{XT9L_QFqZdP6<`g(=6Z0yPRtQct2J5ZDbo<4hxXsDsL_ZEk`KmD6RK@hRq9gL(hw0GR*!6_S!b9XCO zD2fJbb_WP%hMtdNwVH@TA{>`xniK2(_#rD&XtCC?zIH2u!OX))Pw4L-!0-3VI#1He z0yRxVQRWd1CX7Zib2CK-2k#M%wA2lSH|qh@`nJ(jzRgZkEXbgiaJ#n<3Y}n+V%>H@PfUufJHV2#a`mj>HExN{sSJ5lhM>WvL7d6Z#wrj{M9z)5%ep*7G80G zAc`fK;6f5EUA|6RTNm%g#&Eh^$K*Q)^?~K#82GJa>9?_H-_54Q+$Z^B+qS!yo|@u^ zQo0BTOWLixx&ZfbwQ29@Ivflhy<#+3S!=b2JkAaArSAO%t^ue1e^00000NkvXX Hu0mjfoPHRK literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_presets.png b/src/XGUI/pictures/occ_view_presets.png new file mode 100644 index 0000000000000000000000000000000000000000..b436f946d809ea5f2331543a6d2482ba0789ced1 GIT binary patch literal 545 zcmV++0^a?JP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ-mq|oHRCwCNl)-A-KoEw%4LNKehvanvy;S4{l2g3U zQ|Kw=VcZQEoLo{?ImtE&>Y+vjlhV9O4hHEU&>jqvgKX6+x3L9<4h-6Fg?|2>nUxX| z6pB>{h+=J{W9+SifUKU`G!ua)y9+Ah<>xN|M&pFn`75Jw(!5T_iKI`d>?Wvc2PYp+ z060H8$Mg)|d%iuT0Qk~Vl*Nt?rLI{rsvX(B#r7?xXDG^o_`y;63Kkt}=)G^&$4AEi z^ezlqYYq+%(1&`vqWmtoxY)^ZYa?CkBz;T;sk`>K3>=!CAsHpy4R28j;;#;XyWuTW zS>YFct3egaq1qe|cVCN|PiBYXqW0H0eM~9Jf~u^z{CtV+Tk<03>iUZ8d$v_CQjr9L zT5I&8F1(A~Mpr+cM$P)iG}~Z+KrlLuR5s1T?|b~h2VGx%G#Cz+GyvMX-sSglIRWji zw;2eJye;Af$7DQN(gbMp|8$tob8fy^X3w+6Q9cj3lSA9Lfulch=Ng6%XF!|VH|5|LZ6HnY2DTKF00000NkvXXu0mjf48-Oy literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_reset.png b/src/XGUI/pictures/occ_view_reset.png new file mode 100644 index 0000000000000000000000000000000000000000..66f81e60471b7b587c37166a4e206b45f74e7fc2 GIT binary patch literal 918 zcmV;H18Mw;P)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<3`s;mRCwBA`2YVu0}KO!sHi9>h~bSaP6`GHAOZXQ009Iu ztVK?a_y6WCKL3CH$@>5IfA;^Iw`2aBnTdlW&7exTp@zi+u{AD30Ro7Lk&#hUNQk5Q z?D;STpjR1~nHj+nii&(-KGfwPzyqZXfLH~Ij{*P!hzW=@vvYJAfQEtvwrzdL@b~Y3 zhTx#>3=Q?CrT~SeL)CtP(l4O+3pN7*0*D2Ojg5^(!JOKflMHLu++jF%N|j;rru$QX z!I2B}0Zi>zGy}h4GY}wvKrZ|XauEp3n0^K5WhREsj&mSx69e%89{T_R1ajfcn>Rmz zIq%;60AXz)^A6B;zi?=K-}sfC-?tzTH62r z+1dZM`}+RpVPyp=a)o&VAb=Q=3jlDg;ox}n@#jy5zyJSR0p*SZ#Xz=e0L9NFXlO8m zC@V8qN=Sg!-~8}_;lk_J40EqvXW0Gtu^UimH$VWPmo_{g8)rH={0C|R3ET$aE+9^W z#_sAO0|T(@KsZfX8>D6hvI_wMh!MSr0=mcm=$i9OU0oSe`1u*u-@C_f=i^5PHYO$p zdueHgKqVyxW?=4l`t>V=_OfLRAAkK40Gja;rXL`H7_pRjAVWa`o#`Ya<56K`#Na9` ziz0vj(bVy)>Fd0f229V9h zDQ0_Mt>#L#0$o?hWZr7R%8ly+0q*Z}TwLsvOcod)529&4_VyyQw6xOSKa8%25Td*8 z9dqo>8gkx+>q5VX^G-%yNFdOFI3D*Bg|pv%0!QU*8aZ|B}?oxwJyZ zKpuFp07IcET&@XA$Hm2+n)b5UIEG;y134fAY85oZ=>2VsZ z*|B5B!*98+i+FBt(PTgNh2fDbP^Kks#{Byti(=V~-rU*hZ=iRg)dnc)qI&oNgF=IZ z+e1T-)tEt-^Qz2HlD1A~(F>qKK76+Qun1m?!43yrq?2vj_HMm!+@5HB-h z14EPK3EmX%hAw#_o&BefBz>vE(*)?7Fuoo~q89ZJ6T-G@yGywqE CrHFz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;>`6pHRCwBA{Qv(y12R~;bm{-kpFcBXWMnWhkO2S! zh!NSqB}nm z_#K0zqZ|V(D=WjUUAu@f7$ATcKn6xcL;xu(AT|MFC6Lhn$B!BQ-@VK5ALvjZpYgx7 zwe^1|C#U~lNjw-JfZz;ORn`9w9x(jhw~yifBP`+xG}xButP{r|6^ zpz#0SKaeu^{~*hO@{?f(!3+aofB<4dk7WS?0kC9s^&AE_w@?O<^q)V#kOc;9VxlU; z?b~;NzENS&)YJs4-?V8HO4tGf5EFWs{`m1Dg_)Td7#X2pgMR&j81~}_14CcmZ3Z

_Vnz58}j`-1H-p(2n+(i@MQS?`!|ES zx;=;+j;t9VfLO2?s3j(*3Dyh@GoVI@D?x^T`SOK;2)s#xwr&D>UEJd0|XE@ z1Al$^@Qag!gA?p!NcjC^`1I*D!^e*=zzTrof(`uo^&N=&7g;kv0AVxm!p)nP>@QyI zX7KP>0Cd@Bpld$>4SWSQ@aolD3??S}49d!`4A-yk1*t!dtQjDHFbs5aa|0V@W77-F zdJn*cefjbZY~bh5AVYyp`ui6w_wwaUkd`&b`T+t6ZlIr^-+x##0LI+pFJF3c^!0s# zhP?qA1j4U@?6*KeAl|)m=P)pg|7HPG#V=$70RjjmmBTPF(TW1`G$keD|2{qy|2;iR z|J&Lo{r~WR;lH7w;eQ?;eo(@0$CmW~0tj!u1Z6QGzQNBg3e1Mm|F2(X_^+$03o^_G zmmYusVjz^+p$5wVu`v)3EF1s=2qWuJ3IGC#iGj)hAb_ZDAV7ct0CqnRZB|4ZssI20 M07*qoM6N<$f-H}K!2kdN literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_rotation_point.png b/src/XGUI/pictures/occ_view_rotation_point.png new file mode 100644 index 0000000000000000000000000000000000000000..fc303e3ea1641720028b23ddcba356ec9564f733 GIT binary patch literal 858 zcmV-g1Eu_lP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;&`Cr=RCwBA{Qv(y12q9a05LI882|(j3n2xJjEp=$ zUwlF0Gntv0{Y6)I>eMMdAoU9%fLI6^=ETFpv=>P8f((Tjrjxc7uI9?DU>H*th+hK) z5DOl|(wrQ)X5N4Bo8ilsf1*JCH<-(i3}FzmDPVYaWCDn(4a8Rg0*D2NVIDx2&Ft+I zVKA|J1QOx_Vpb4CIdl?S-QCrB$l7Fp_%T2LF<~(*lZ}mW`_lOm3@S>j4AtdA47xh( zmw-}Je*E|WR>O5;Ha2&F!jJgz1R9!?lPNH{t5t-7lamoeE-v{6!_gC>3?d>T$g#Tx zNIeANi$Hu5Ab=P^1|nl1UT15$7oh-U)v zN+4be3JM@D1Y#FZI06I^Mx+1@1;u1BDE-;na;A0kyk~gy_z%O(DPj!jYHT1S!capw zf%qp7zXjs^Q2ZVsfEaOQJ)nUG!0 zfcQDkyOG|W+zhtPk3nM72$fC%0R(d)HxO&VybMZ*Kn%(T(<@2@|NHrHgTyKbxekN@ z0tlRJfJp>opga&808C$X-6moRSbzY68ORPz1|V-rL*<@A k6RS8-%_(9_Y=8g*0FLr@0@O3lmjD0&07*qoM6N<$f_(BtfB*mh literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_scaling.png b/src/XGUI/pictures/occ_view_scaling.png new file mode 100644 index 0000000000000000000000000000000000000000..fa8cbbc71e4c929f859c045ef73c53a8e431fcad GIT binary patch literal 1128 zcmV-u1eg1XP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<-bqA3RCwBAWME+U&wvRS8OQ_x0R+T(>KN|dzmIO{e|!cB3JNm3fB&8lAb?mvoPYm+0}cDluw~ADhHu}# zG5q-P10*a9#BYH3JIJtY+qN;tm^=cjy$r;^{{3V)KS_(hL0F$5wapM@7}#Kd0Ad0W zfB*kt_zP6vnkd5HlO@6M{X57E1{WY!2O0Kq(sG7hzkUH-|CQm)-_H!+fcVS=4TcXN zzcZw?8ZdMu9)>wo9Uy?fF8l*D4CGyq!OJ>sgIx&(hCng7LB{F@=9M24Za_ZLW*3q(Awn8@%T`x(Ra?aB=A+%Gfy`1g(BOpOi0 z_aA>4_O4B3@RrbI`1tKD+=T!E!~zR%5M0^ykm2XgpD3>Q_vJg#t6#vb26^@8|L+W6 zz5;{jFGStfA0HULe*XYh4-h~si0Ecy2rrWdht=fCNCy7+2@H}S41fOoVfYP>yuS?p z|NUk7_xBH2{>QIx3_pK=gR2J!AQnWL_zzAO%i8aux$qmSM44 zr-1U$nf5XKV*UkJ4-h~oUS0(ZLuis=Ko-BSN{7K9>@vf?A3)cA{ljpf#f-s4+zKc= zn?d-O6~o+ZWgw+On`RgZ&3zzHiG8lwhV)*wDHLox+F@tGj!$1Ha zfKXh>$iM`4B{FDiYy=YMDR4W(X#{63lEgQF00QUbOK%r}vmPu9nu+DY6yAhlbtuLM zKv8`YAb?O@xPIaja3pYYax!pnaV3LjW@csvMn*`afszgggVh7YKx~kDaKr)g|NsC0 z4FLiO6c7#RWxn8?qGry;plQj?!1`5*p=)Ij1M?SohNcC+3{0P885-t!1Nm|ct&9B` zSidPSv@G&xVE>`W(7rr?f$f_jL+6Shh6NLLX8;7?n9NZC1cD&gPZ0f+h~E$dUv997 z^c=3o1`ZQcQc)$9g%(I*1S?!wIIfhpHy^Hq6@qo(gwI*_q|P z00M{M{=1zFpFVzL`10r^Qp zK~y-)y_8F6Q$ZAlznjE(jR8%trHz{UNXobiO>v=t3|%rGg-8pbHl+YU87b zR>fjaFlYozanV);5foZX7i~dYNEVWK+mM>ZhR}+FH_f<-^_7G+1`ix&hMD;|bIw0U z5kgQei^t=bN^@BUSUZsZ0pw11u4dSY^L79)fPp&O{{!ycKUrU3QL)n~9@P(+OeVQ} zHOdyxFujrX6$4F`HgtW7r_WwvFxu$ryFvQR-hYcwQ4CnE4UEO&^n`AqI)}MCw6FFE z4F)6Ytqq{4Jby8c#bPEH45Dd=u<4zD{g4$!xXxl@gMAx{QDyMS5dHo4@OV60g)384 zBb2g;u75?fnlYJF^4UC*$bIH>nU+fzNBQ{HR~A@VHnPa)#Vq-p2E_sn$5sM?BQ!Q_ zB9TboJDky0l|xxvVsT-Xjy+!1s4ix-6sOMyak+LzCq_0O9UY`)RaKUnQ&Fz2q6$c$Ul8Lm60b; zompN#9vG4C)(-jL;eed|v=A!w&|m#$4ol6^`&-GTCc?LGUSAfRTe!p9cQlioo8y~a zI0qz@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;uSrBfRCwBAWMFV${ipVyfq{Y3f@8+V452(`t#1s! z+WvGL_|5}2@EupOvSlHoVQU0DVRhW89V8K3|lfLJ&}nHUTh>=>Rhd}VmSAO@8C z!Jx))li{5kQ1%4F6NbMKg#ZD>^8e2-7I}uZ4DT3Jfzo#wn1F&m85kLUYXOBGGrWW; z1PCCYI3v(38wP!bGYqy2%?wfu-xv-td|+T?W8i1t0_y_A8U4TeyL z+YCw!{tRIZtPDSYGoS!~0Al(Qe}jP?sF4-u(_)}29T@T$UNaOixa*)Q1PCCe-v_?D z|MCAn11Hd)^FYshV>rO@4CsphZltgQ0)PNwI{4_k)x<5Ufv(m9Vs4<@uK^W41Uk?{ zjX@9?R!{&CKrBG~?%~RQAy#Q-Aako!Dw`?8Mg~uYyZ=6lFz7IxWB3SB2oOLZg&!HN zK3@;?wkQMpve&;1d0CzSL-qEL>ue123<59{0Rjl5@E0)n{xG~^Fk}$_!nEKK1Gk2q z2p2m8I57Uf6aoYg3)sP*fnoCz=w)#RW(FPxWqxZ82EP9cZy0U?0{{vD0*D1l|6zCz zRLTJiCk_TRjwo^7H{XE1I>qqXSwTkh$!P`#fB<5K2h=}c%zb6}0#yEnKlY&r%m0&% z!s-fc-wW>~3hP^J0tg^R1`MEG7Siy6(~jXHFtGT5;qx8nr|;JQ0*K{5ilXqX7Z(K= ziZ!UEXCG$x!2X2oDCRSqb?1*)Kp#J6_yiW@WRPay00=MuP5R37E0wPP00000NkvXXu0mjf DY-mW# literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_style_switch.png b/src/XGUI/pictures/occ_view_style_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..b0a9c807e016446374173db06507c4d237312483 GIT binary patch literal 782 zcmV+p1M&QcP)_#cKcn03CEi zSad^gZEa<4bO1wgWnpw>WFU8GbZ8({Xk{QrNlj4iWF>9@00MGJL_t&-)76tdOB_KM z#(#6Spd0VpfEGCmvA8QN6zl}WN))tA<0mj5z%P}`P7WeSG(`kO1uZN@(GX77^KLJ< zx3jZ5JCnlPq48hRC2uwJ!26p&&-226S+}>hc5Q9Vo}8T6zwH&>g|&CRQc8PpaKPc= zAtNIr3=a>Zl%iIvQ7)I6nVAuP3_LwOwU?Kd%+Ai@x-P9&3&+WkWrj4>?CtFVu(Y)F z2r9&#l)En;9UZZ_xQOezB#Gkco6qO3mwd0?5Hy=qDiw?|?Ck73`xOs>j^h9jh9N4J z1nrcMpDfic4UCDoxw&C_dYU+nIX^$QuL8T*w${?=L=3*kh?5o$DI8 z&-3s+k9VaJ0E~e+mObFu*cjW}+bE@MUtgbi^2uqMJ{bh9Goq-2Qi@zIhcO1NHRI#s z?C$QqZp!b6NGXw0qP0eAO&EsM>vde$LoB+2u@iHQl0kB2qAD?m;U~Klu|@dL=Xf7K|mOWWLbvRnnI!Q@+`O8ZM(j{&fMG_tyT+T3|W?; zltM~Lnx;68gAjuK{e4zfR~Z@_65R|x0s>rIT-a*0N~KaEpUY85oZ=>2Vsp zxwF;ZMLKQCQTF62hL3y=3`vWw7|74>G|)TIY6Dc`qI&oNgF-{Zgu^^1f3h%|9d-cn z9wfeaZqBN=VpY}rhu?Bt=d|VCn$jH1r_eA%Vg(NaQ^zYdCKiFKyeu3FtE4#u974O2ZYzRgvtQ98zfuwPaa_K;WgpRWqg{f@Q+Er!RLuY+Z?$@R^}5MxE*R( zQZyVG3mdKI;Vst0Grx_ AY5)KL literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_triedre.png b/src/XGUI/pictures/occ_view_triedre.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5894dc380f7595ee865b43f1a94779c5aee3fa GIT binary patch literal 698 zcmV;r0!96aP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;FiAu~RCwBA{Qv(y12q9a05O0Jgkf}$kdQ#KZ2$qp zgirF{zkdv;PoMsO_Uv+^4F(7xoCZcjMEw8w@gqZEU?9-ozaSxbAm$=uAV2`&^D>u- ziOK&nXO{jydUWRhEnC|DLk-0X00Ib~m$_cQe$8;_4l~1#ADW1qB5eL_|aw*x6aZd?0=erEvm)0Aj%>DI_Gsz`?-* zbR`>z`;{020RjlGfvl{o3`|TQPp}c44gmrPZ#raTWP~VU!fvm(w>L)800b`7drzdCp!Z(GYbPq`|sbs7`}Y@&hY2YUj~2x zLUCbYV&Z?8VOzFr0kQ4&?CAl~%Yb+e5Vr$y4H9mTjEwx>-JJnalL1l>5I`s{w6nAO z|MKNah7~KC7>tY}O!n{ZJLBkB)B#O<-=Hy#4!EJ|6C`&XAb?N|1SXOHKY#vY0A@9Y z@83T&xVV%QBN_A%nrzSk$S^G^`x-z1p@*SnO-;=;V`Dak=g;3Vym|A9p{{PeC)BWq zIMN_22Z6wAfB-@_5R_Lz2ADvF9suzfD1JjsIs^zH^aKX-(rGALgix-)1^@yGTe3kf g1c=JRFaQu>05%EfVPBu~R{#J207*qoM6N<$g3D|Y2LJ#7 literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_zoom.png b/src/XGUI/pictures/occ_view_zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..386c966d156f0a6f53e780aed211b78aa473a11b GIT binary patch literal 797 zcmV+&1LFLNP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;lSxEDRCwBA{Qv(y12q9a05LI882|(j3yAp6z=+{Y zPKN)C$b3dd#y}ty1;mO#{0NBG0DZR%T^~RIu^?$iH}pTm97baxo$2V|nd}h|$RH&v z$MF2=6XU&Gw*&&^{D5-Pfd(IhX#xl!22dE{!$2^nw!8QLxyR4`p9SL6kDmTN`QXX_ zWA`8bZ*#;G5q}bli};<&kW}F_F#1|4FCbe zLcl;aW)@bkYk=l~UHJR=Z-(z*zXA>X!SLtTZ?G6R8lV6mfC#zp)YS{;8GeIY^y?SH zmrtJL&@bUdShR+{AGJO5=h2iF{4FCbeh%aFS!;qhwm-oZ8)$14pg@qY@ zeEZJuHQCMa{8~Mt^J>giRqA}jO>3c z1H=E4va%p=odM!xbbSB;gf&vMwY4kQSXkOs#l;z(e)s?i_{6_||1JOqf%@|&kL7?$ zo&q&r!=@J?fH1-kXjm!Gur4*AVb6g9|Mtt5%Bxqec3{&C%ChKL6d-_@&RKiH#D= b009O7QZ{F9XF19?00000NkvXXu0mjfwM|pG literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/occ_view_zooming_style_switch.png b/src/XGUI/pictures/occ_view_zooming_style_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3a4867098920df40aebdfd7981a0720d638444 GIT binary patch literal 3389 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 literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/paste.png b/src/XGUI/pictures/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..12e3ce92c03fa2b4fd2a1c397a82760f2d0a06c4 GIT binary patch literal 902 zcmV;119|+3P)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00P!YL_t(IPkobJNRwd{$HlvXg6g#>ze}CE&Fw|kbZl;OZ1Zc=a4Kbrmd=m- zn4y(fXhNi^D>NFB3L1uPtqb#OWy?%A%`^%#8G2Dc*^O69DB{0&la``&;0Mon9?p+* z4m>XZ2!g?27@15ae0_XpsoZ<>dY7oYUP%;}6szME@#-jPl$yiks6`^tqrTogOixWi zcV7pRBu4^+0v+!{u~6;l>8YklgB*gJw{94lo2zl@ayp7jQxL`p!{ERmOamsUR4VB8 zdeq;p2N_BtBQq9-#Ysp=Jc(oO`$nj8ZEiCLHhu5tx~^!8~knGB^JnE5BA@Fd7gT6aZIOSMd%( zZVn5|ct6nTK1fbIjf|{(w01l}{|gJorslD-2K-!FhVEe-m?5l+9Re=b3!!2K(kk1L zU1x$M?J8t33Ak3>fWeVZc+fox-Qy9M$LGM~i+Y`cJT)6)i9hJk1&|iDfR|bcX-NlS zsx63AY0%dB48w01U>JOluD*Aeoc#fTP%`8cWM(kn;ZFl2LI9F|6vzEM;6~#^P(Fmf z*fP*qd}yxJqVc}o!RyHdM2e+<1^Kyb$mD)VI}_~aMkpq6*q;mX>^+>26u>WJyWr)- z0{EgW0{i?0d7FE%qe_+_IX#!^LI^rP2{lbmp*Mep;ng<>W1pA76HDzWg9)#MQ{a_z|h@k{}{V*r{8K@YB5^yht@4;^M}RF5&jd>un4}9!

2Mg&!S c;1E&s8)|&@x&ZE>2LJ#707*qoM6N<$f-4w-O8@`> literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/properties.png b/src/XGUI/pictures/properties.png new file mode 100644 index 0000000000000000000000000000000000000000..62b3bae74174829424cbdef5c4148086d3099448 GIT binary patch literal 827 zcmV-B1H}A^P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A00082Nkl?+@ z-H0$40~rw!At6Rgh#-kBy6Z0}h$3Ie%rvFQLZYi~BC}e)XF8{A&R1r-H{G1NGgI?z z?$h%-+cdlQp6B=SJm2s4dCoan(4Zh>paqixS^vLxT6L}pD(pH=ht6e*rS?K3N9AfN zNhOyKE23n0 zU*Ig(AkqeltrD9c*vN{v8sDb}T(Vlkf~Kj*5tNB?VyKa;MH-pOX08dzp1+p;$w&P5 z++*_N9md-4Q(jW2@^#2SJQ^XL3Q{iC67JVj+BDV&YPo6ENPB9yCHvK$yL2^G(9?Pw zPO3mlk2{<%UfsIq;0@LXsS)r_!!b>9F9Gdo@JWzUd&A z1Y;X)jv~%oC}MjpM%q|})GVd8Lc$~OO}n~?Nzn;a98P8DXA;DBV8%$3V2`ED7SXj` zV#Y4<6@!h<6n1+ttBHs?pS-d{I8QLM0aLp$4U7wX``{HvBXaIBU@Rpuyd&AVNg#zs z9mLYm@L`bWt~nZ9^R#)xyz@t?b4~E1V}h5iX?(GaNg##CLa7561tvj26av!5tf-G{ zWnB!(-Ypmve2+t4U_DDYk%Ut^8{99BUi3?4$s20==@&u}0#~t0L>GK>l z?Li)Q#;NaHrrH&ys&j$ruOV7`7wHb=2t+k<*g}@TAA@1B=#lTCD@b6jvJi9hq$U+Fv{sK+Xy%OMKtcU;r002ovPDHLk FV1gCGcPjt@ literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/redo.png b/src/XGUI/pictures/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..e60913e19ffc665f512f7d72d48a001ad598704a GIT binary patch literal 702 zcmV;v0zv(WP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00It4L_t(IPh+45Un6hJO>+FkFLD@)lf^zd$D$Q50V`mp07wx|9`E#{C|~=%^Ox`=B+?=MiAwwz)D?8 z>i)i}s{emy&iwzSyZis!#>W4zf&4ec#sBXB4cQ+V`M7PF_X1FCB@oYJV`ko>$j|>@iJ$)!D-#pQ`Gr8N1;p$?3}yBSnH24END;Ha*&wETQ8Bjf*xxVZo8f`b094G96`m4Si(I~^SUD+>s$ zgQ~|0#6-Ec=0s>}{-5XN^?!GG`2Qm@G5-%oM}u9p$lLqBl7PS!pgNSmLkFP1DF@=i zKztX79|Q3dC004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00R6;L_t(IPj!%KNRx3K#~&kVmXyviMT;y`BO^2I0PRroC?{SeYuGx>a;vFx zUOA6VL@V9e=JKd!I@?s3t&((ViFSAvzKCY1A$HN}(`z62_NWMj?!|}S|IPoy=l3Ig zISR*9;wEj5y7QYt_u_Zm<6(=`82YEPl%^j^#VteoPvk{2Z0uJP5rSHGq3Wr*v}ptb zZ$F`Te8wVUpGXLA^&myvGjoJfSh>p9(T!lG)Ve3jI?Sn6FVQtPvE;`E%#*)yqTmtO zMQzmHsB}HUhPh`>z@r7i>Q{I=^Z{4(6BZeG_YEft9wJ`aO8G^mH8NJ)`7IKReg0#S ziI2Y!D}I33yoZ!8D`jaxh4HOL-n{>c=o|y0atzd-2*F~(Gg@#%+ij88?>-_jvl$T? z&6LmaEB_19=p%OYk7IQ5yG6#Pej;3`N2pLwc^~^na9Q4A7HNhdtmuZ?Fbrk$5EM;= zxY;-WxxNoFUEkcyt?WW@iVnd7EwwA0-^j3;6KH6G$(*Ad0jH!BG4zq*3ynCL|A5|? z&K2npma4^JUL6kc8xSPW(eGMnX9#b;Ac8L7%S>iLRo`qHI4AGLPId)$vsIMmL2l#n6%0Ru>AKG$ATFbb#aB-GCzMWK5EYY`vx~^Yv^?@O zKbwp{pGHO{@W~)fHW|iKkzTA^(kC+O%Vw{D8Y`=12MB_&vSX}q@LRWO$2q36r+B@~ zHi?7FHYq)&>zv)B_D)-Awn*)q+@wrr56N0bH;L^ASMf?~n?!;jcK-!2yI*RSfB-H4 O0000!UCL literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/torus.png b/src/XGUI/pictures/torus.png new file mode 100644 index 0000000000000000000000000000000000000000..af76fc00c1367863c65397f9d8108c04caac744b GIT binary patch literal 1149 zcmV-@1cLjCP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ<^GQTORCwBA{Qv(y12q9a05Rf{C@(Mn|L4yihF`ya zf$`6uKN-G%|IYCB>sN*?TejfT2M|CkxD1lEievcs`!B-}ApZU5AH$!&{}}%M`_J$T z$Told`u~p~KNv1vyog~iKmef#6crWyS9C~b`1<27!{_h67(Rdd&G7x#UxqKA-Z8Lo z2{14MRWma&f(`x)v|w+46vMM;&v<}ZzrxG_2q3tDd3kyNm7LOm2K`}p`{@V6s}DaI z-hBEF^zKiFAD`bcaPW#Su(7c+aIv#7u(B|L^?+Qxv)zy3+qZ9ULjeK^Y+!nN`hPX| z9H7hoFueKrgW<`WFAQ(qzGwLPFqR-j9n8GZu| z1O?09c2AHoU_$`{2pon$8yLO-UH0zt4~FOOzcajj_mScIhZhW|7vy0Cx<@5APV>e*6w}-Difsz*s#tJrShn0J?!p zOiT_QH9Hu-eSQNBj^7M_etrdtu`ryNl?IYl0SF+bckkXYyngeB;m3bYhCj?aKyL{m z8}ekJNe(~-EkJw(h+n{Tn46nlQ1q#0`1}Xt-R}&)zkg=<`tAwb+W-N? z^6J$qhHw8k8NR%F&hQVE9DtaUU!1|Sb|=GyISDnQqM{7^{QL}@oSa}C>Vb{Gi2Kg) z{>5X4@9&=h!}=w||3ANB21)<~5Ga=QL0+*hUIz>dW(H7VV`gCk#w0TXFDEMl4-hl` z`NF`-Bf#(nn5aK}|IP3M7;zt8KV|s#_7TI6kFOYR?wSS*q6+{4!~zW`hQGkT{R7O` zOhCi_|NF=Aosk2ah(THXA22O`{rdx)$lrhY33k=@_fNrw{rdU=<~oo$F8~4v8*E@Wh40vgQDz|6|dz{JeT@blXT1~v{}V2pkP8t|Us$EVi}KY@w;H&Fb+ z@l`O_fg*1WKmfsViZT#~0C9&=R0q&i|Db99KbZdY{UZYlD+j}$U*8%202BG|Z=ZmM ze_?oZYCUpl07c#!fB=FS$PG=H9za|J643G~273Ju!@s}4!U1R?$fck}49Yo=POgP{ z6J{7FN$mj900D$tI3ODeqJ8ibdk2uh4Q?1H>j4B1a`E*QDhLl?P%?n#QFH*4zXSE^ z1z6z#5J1=pN^Yn@Do~e7U{Uh|YRDZZ8(w??1P~)0Z*ddh!msEO009O7)dj%qN9-@j P00000NkvXXu0mjfJuwB1 literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/undo.png b/src/XGUI/pictures/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..d69af82cebe067c3e386f16b453b0052c9276f91 GIT binary patch literal 721 zcmV;?0xtcDP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00009 za7bBm000XT000XT0n*)m`~Uy|8gxZibW?9;ba!ELWdKlNX>N2bPDNB8b~7$DE-^7j z^FlWO00JRNL_t(IPh+43UEh=l;fY=PJuh-HA7 z8HjNLBW4!Xt?toPZ)z4?`yX4q;=i$5@^d}M*auoRq4&fTbg#0oar6My$wQQ*0(MRw zp+48tsXucUfBv7j===Ye>F@uCPI&o0YRa4cDf7Pk&t3lae^Bkd|NN5b_krrIAlguY z8jq;*3LXEZkCtgG|LX;{|5vbx{h?%&@>SET>W5v{+JDhAKL5AN+x(43RH+xJo*$wO z0T_W;gPD!1m0w!-5s#Sae_m#QH#-qGTEU9AtosL*@q{KMshQfEWXS1Ok%w6~2xpe=3JD>ql z27W)8SlHJAm4ea+rVE7R49*9%-}oOf^~3+*o`?TE>(2hS%iRKw6)_E`|G+>#22_>? z#2_zX4TESP-VMYLfcOa%gV^VQcrg&i1F;qmvjZ_!0E!6(Aoc*_2p|T<1c(j>VizD* z1Y%Ag21Pqo0FnR&4k+|Nu>r%Ngu@NQEI>>xz`y_ij6R-JRI_0B00000NkvXXu0mjf DK4~;k literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/wnd_close.png b/src/XGUI/pictures/wnd_close.png new file mode 100644 index 0000000000000000000000000000000000000000..74b9af91927d834d01fd0d7d54ce2c9a3a42d76b GIT binary patch literal 779 zcmV+m1N8ifP)91j^EtPTT1|U8QuVY?eYHqKSSK zP3o7x#7F%IgmygBVw*mDl7H^Z{OA78x#wJf^N>g+(A}*)`QG z5RTB`_EMce+Rq7v1K^?@u()CXf6xoz7!8!yDW$`H4viiQVXJBa++G(roc6hNHhJa` zc)tgNK1C=T#LYg4#zR25R*jil>eLtT{GdaAuGwmA2T&d-c>V5!!d9NyEp9Qmxe|`j ziex$g4vI7tOS{$FMw-cFlc$u|)oH@xv;lB4TdF3p9zS6L`{g|*5)D-xF1xRMSgLOC z7MSARP8Hv+kyxnx2--m{*z6VvMS>8Zy#!`G*)JEFkDm^i! z57&EQSe~y>rx{P4Jq8WqI_>n@dK|C^u()ifPp27dDGN*U z^*)3m0U({Lwv9rzno6%R=}dwtY~>hiY=vzs3$T+mn9{vzjZvdfBXyxZ39Q1lxt*_O za!Cf)+FBy^2Uli$r+^So1&^UvC9Uv!asn@3M*|?0O5yp7r!a4LH=D=I>FhdY&DZp^ zI_lx02LqV>=f-B1VTE_&n|?;e8M}28xLj@nAnp)D|3JTRN;i4Tjw+i=)$ZND8$(OU zO0JNPx!jIl*?fw5pNO9Is(T6ipVtD2MW9ltL~^<8_V~oBFC(MFPBbrJi4vhmDCP_J z3YkoHXME!2*U=lJE*_6}vFCCRm&4&S04zz3eYkpUkW2Ite1g#M`uYfvc1r7BSCpMy$Yx?I literal 0 HcmV?d00001 diff --git a/src/XGUI/pictures/wnd_maximize.png b/src/XGUI/pictures/wnd_maximize.png new file mode 100644 index 0000000000000000000000000000000000000000..3874a255508eaab3d07b2dafcbb3c4ee3bba28de GIT binary patch literal 688 zcmV;h0#E&kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0006XNkliLZMKkw6yWZALzxiCdGO0!D94eoMiIe?#z7V zJ3EVoX_|&yZk0S2dn%PuFL#voNHSJP>#BPCfqt zm?x3c;%GcTqghAO{s5m6_ukYno{Z4#g*1wD5s2J~{|yjbDS-*V$@CbO-N4@KT};m= z7>@cFA0G+8kGYB^VC~jgtiZA?Cc2(X$N2Q+44=QAV{-Ztrv%(5C5~eeK#anf*iLMV z*&B8p4Xci@&GdYN+Ws!M=MbQ!6cAuu3MoZV31FF&{0hB(2SLaM82v#P@6ER` z>+jI!&V|VHe22wrEEMuFpjxZoaCm^I>&uh7EqM-)`tpBJ-QAh%+Dy}~D1ff(F`(Ov zNWRDVg9DVFK4uReJz&(G^$t7Y1F{9+-u=5sBoYb`hF%O1F80lN^P3-XTAB2pe$bu; z9TgY3v`Sew2Z&h}KomQ!{XG(QDi#pWQ*-;iI$c+uOMs9PMfI#{nm3C#imX^HB%;Vk z>sNIdTUp7%^I9+r0~UQ`8YPjPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02*{fSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+qRNAp5A0007gNklZI&d%WVQfdGXw(V@&|g+vsJ`?FOU>xyQ-^arl)`X zz3zug^ZWf6A0Hzh@4MIQ?d1Y~jEUU9z20jgCv0NkHkMbyNF-y3#@5Iqh{YoaEzDzP zb_PqUUl3155Q$SRu}05Pgg(#r8({XqedLQ0w2Fd_f&^J9LDkC0Nf|7!g;A0V&}s^# zLN=giC8ki0L%6CwV55*jCYyrOuuv)&P?n1Xk*Ty=B3A)Y zK8r$W1I@i{9JcmEu~t=JIdx>DG+OOLZ0$I3sewezqI8@q0A9?c)=gaijyp%FR8?eh zDRfTT*gtHdb#x%!D>e1%5vHc6kW9s)R%Dcw0;8_%xYNS7AE)^K^9=2iuQ(xKmXuU= zO*9IxE{g5+?ZvC-NTvx=l?8~;f_LR=I%jR9X+8$2<1<)Z4U6scjZ0ZtSrl_nD`on5 z9XrhiY{!7()@d$V{lRiTDxJi~xetRiPEJk`bxCZ3tJvM&rioi38uglp`v*;e;q&USVi!s%|X(83&h^!On> z9#0S8I3{`h+;NRAN$%Pd4MY27ImS61gZp30-t5{9%GpMjp8wdiUS4+rFyK<*WwBnb z{^swzm_tlcCwRSUS-ogGn>-ExT#Do9?C!m37Q7Q=!QiCFb#-6hWUZD?o+!`Fx5^Z72^3&xnpame61`LM5_`%eS@0c#WrwlEB`o&W#< M07*qoM6N<$f~_oG`2YX_ literal 0 HcmV?d00001 -- 2.39.2