diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp index adfdad325908174f7b00b18eccd3c95ef6bd4bb6..06c0e5087194f4298f98ad2edd81e27d58d190a2 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.cpp @@ -112,7 +112,7 @@ ArmarXMainWindow::ArmarXMainWindow(const armarx::ManagedIceObjectRegistryInterfa ui = new ::Ui::ArmarXMainWindow(); mutex3d.reset(new boost::recursive_mutex); - ArmarXWidgetInfoPtr viewerWidgetInfo(new ArmarXWidgetInfo(ArmarXWidgetController::createInstance<Viewer3DWidget>, QIcon(), QIcon())); + ArmarXWidgetInfoPtr viewerWidgetInfo(new ArmarXWidgetInfo(ArmarXWidgetController::createInstance<Viewer3DWidget>, Viewer3DWidget().getWidgetIcon(), QIcon())); availableWidgets[ARMARX_VIEWER_NAME] = viewerWidgetInfo; guiWindowBaseName = ARMARX_GUI_APPLICATION_NAME; @@ -140,7 +140,7 @@ ArmarXMainWindow::ArmarXMainWindow(const armarx::ManagedIceObjectRegistryInterfa // plugins QSet<QString> pluginDirs; - for (const std::string& packageName : packages) + for (const std::string & packageName : packages) { ARMARX_INFO << "Looking for gui plugins in package " << packageName; splashSceen->showMessage(splashscreenPrefix + QString::fromStdString(packageName), @@ -183,7 +183,7 @@ ArmarXMainWindow::ArmarXMainWindow(const armarx::ManagedIceObjectRegistryInterfa else { QStringList defaultWidgets = {"Meta.LogViewer"}; - for (auto& widgetName : defaultWidgets) + for (auto & widgetName : defaultWidgets) { if (existsWidget(widgetName)) { @@ -320,7 +320,7 @@ void ArmarXMainWindow::loadPlugins(const QSet<QString>& pluginDirs, bool searchR QList<QDir> directoriesToCheck; QStringList allFileNames; - for (const auto& pluginDir : pluginDirs) + for (const auto & pluginDir : pluginDirs) { directoriesToCheck.push_back(QDir(pluginDir)); @@ -341,7 +341,7 @@ void ArmarXMainWindow::loadPlugins(const QSet<QString>& pluginDirs, bool searchR QStringList fileNames = currentPluginDir.entryList(filters, QDir::Files); - for (auto& fileName : fileNames) + for (auto & fileName : fileNames) { fileName = currentPluginDir.absoluteFilePath(fileName); } @@ -831,7 +831,13 @@ ArmarXWidgetControllerPtr ArmarXMainWindow::createArmarXWidget(QString widgetNam ArmarXWidgetController::showMessageBox("Could not find widget with Name: " + widgetName); return NULL; } - + auto widgetUsage = mainSettings.value("WidgetUsageHistory").toList(); + widgetUsage.push_back(widgetName); + if (widgetUsage.size() > 40) + { + widgetUsage.pop_front(); + } + mainSettings.setValue("WidgetUsageHistory", widgetUsage); ArmarXWidgetControllerPtr w = it->second->createInstance(); w->setMainWindow(this); w->setInstanceName(customInstanceName); @@ -1079,7 +1085,7 @@ QMenu* ArmarXMainWindow::getCategoryMenu(const std::string& categoryString, QMen auto actions = menu->actions(); - for (QAction* action : actions) + for (QAction * action : actions) { if (action->text().toStdString() == *items.begin()) { @@ -1107,19 +1113,29 @@ QMenu* ArmarXMainWindow::getCategoryMenu(const std::string& categoryString, QMen void ArmarXMainWindow::updateAvailableWidgetList() { ui->menuAdd_Widget->clear(); - QWidgetAction* editAction = new QWidgetAction(ui->menuAdd_Widget); + + // QWidgetAction* editAction = new QWidgetAction(ui->menuAdd_Widget); QLineEdit* searchField = new QLineEdit(ui->menuAdd_Widget); + searchField->setMaximumWidth(250); searchField->setPlaceholderText("Widget Search"); - editAction->setDefaultWidget(searchField); - ui->menuAdd_Widget->addAction(editAction); + // editAction->setDefaultWidget(searchField); + // ui->menuAdd_Widget->addAction(editAction); QStringList widgetNameList; + + ui->toolBar->clear(); + + + QStringList mainWidgets = QStringList() << "Meta.LogViewer" << "Statecharts.StatechartEditor" << "Meta.SystemStateMonitor" << "Meta.ScenarioManager" << "MemoryX.WorkingMemoryGui"; + + QMap<QString, QAction*> actionList; + for (std::pair<QString, ArmarXWidgetInfoPtr> pair : availableWidgets) { if (!pair.second) { continue; } - + QString fullWidgetName = pair.first; QString widgetName = pair.first; widgetName = widgetName.remove(0, widgetName.lastIndexOf(".") + 1); widgetNameList << pair.first; @@ -1132,6 +1148,11 @@ void ArmarXMainWindow::updateAvailableWidgetList() action->setData(pair.first); menu->addAction(action); + if (mainWidgets.contains(fullWidgetName)) + { + ui->toolBar->addAction(action); + } + actionList[fullWidgetName] = action; connect(action, SIGNAL(triggered()), action, SLOT(addArmarXWidget()), Qt::UniqueConnection); connect(action, SIGNAL(clicked(QString, QString)), this, SLOT(createArmarXWidget(QString, QString)), Qt::UniqueConnection); @@ -1140,10 +1161,47 @@ void ArmarXMainWindow::updateAvailableWidgetList() InfixCompleter* completer = new InfixCompleter(widgetNameList, searchField); connect(searchField, SIGNAL(textEdited(QString)), completer, SLOT(setCompletionInfix(QString))); + connect(completer, SIGNAL(activated(QString)), completerAction, SLOT(triggered(QString))); connect(completerAction, SIGNAL(clicked(QString, QString)), this, SLOT(createArmarXWidget(QString, QString)), Qt::UniqueConnection); searchField->setCompleter(completer); + ui->toolBar->addSeparator(); + ui->toolBar->addWidget(searchField); + ui->toolBar->addSeparator(); + ui->toolBar->addWidget(new QLabel("Favorites:")); + + auto widgetUsageHistory = mainSettings.value("WidgetUsageHistory").toList(); + std::map<QString, int> widgetUsage; + for (auto & widgetName : widgetUsageHistory) + { + if (widgetUsage.count(widgetName.toString()) == 0) + { + widgetUsage[widgetName.toString()] = 1; + } + else + { + widgetUsage[widgetName.toString()] += 1; + } + } + std::multimap<int, QString> ranking; + for (auto it = widgetUsage.begin(); it != widgetUsage.end(); it++) + { + ranking.insert(std::make_pair(it->second, it->first)); + } + int i = 0; + int favCount = mainSettings.value("FavoriteWidgetCount", 6).toInt(); + mainSettings.setValue("FavoriteWidgetCount", favCount); + for (auto it = ranking.rbegin(); it != ranking.rend() && i < favCount ; it++) + { + auto& widgetName = it->second; + if (actionList.contains(widgetName) && !mainWidgets.contains(widgetName)) + { + ui->toolBar->addAction(actionList[it->second]); + i++; + } + } + } void ArmarXMainWindow::updateOpenWidgetList() @@ -1177,7 +1235,7 @@ void ArmarXMainWindow::updateRecentlyOpenedFileList() QMenu* menu = ui->menuRecently_Opened_Files; auto actions = menu->actions(); - for (QAction* action : actions) + for (QAction * action : actions) { if (!action->isCheckable() && !action->isSeparator()) { diff --git a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.ui b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.ui index 06f8db4ec4bb989be28b551b6fcf46acc024a073..d639323dd0b3e35ccda8f8b34110256756079c53 100644 --- a/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.ui +++ b/source/ArmarXGui/applications/ArmarXGui/ArmarXMainWindow.ui @@ -42,7 +42,7 @@ <x>0</x> <y>0</y> <width>1062</width> - <height>31</height> + <height>33</height> </rect> </property> <widget class="QMenu" name="menuFile"> @@ -87,6 +87,17 @@ <addaction name="menu"/> </widget> <widget class="QStatusBar" name="statusbar"/> + <widget class="QToolBar" name="toolBar"> + <property name="windowTitle"> + <string>toolBar</string> + </property> + <attribute name="toolBarArea"> + <enum>TopToolBarArea</enum> + </attribute> + <attribute name="toolBarBreak"> + <bool>false</bool> + </attribute> + </widget> <action name="actionSplitter"> <property name="checkable"> <bool>true</bool>