From 75bc6566f6474ab7fcb158f6789ac6e31e71aa73 Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 19 Mar 2020 21:11:44 +0100 Subject: [PATCH 01/11] rework RViz panel There's no need for individually resizable columns, but all numeric content should autoresize and be visible all the time. We will add an option to hide the time column in the future. Remove intermediate AutoAdjustingTreeView layer to simplify code. Resizing the columns did not work perfectly well before and the auto_hide_cols_ feature was not really used. --- .../src/task_list_model.cpp | 153 +++++++----------- .../src/task_list_model.h | 48 +++--- .../motion_planning_tasks/src/task_panel.cpp | 19 +-- .../motion_planning_tasks/src/task_view.ui | 43 +++-- 4 files changed, 125 insertions(+), 138 deletions(-) diff --git a/visualization/motion_planning_tasks/src/task_list_model.cpp b/visualization/motion_planning_tasks/src/task_list_model.cpp index 26dcdf83..e04b0b92 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.cpp +++ b/visualization/motion_planning_tasks/src/task_list_model.cpp @@ -2,6 +2,7 @@ * Software License Agreement (BSD License) * * Copyright (c) 2017, Bielefeld University + * Copyright (c) 2020, Hamburg University * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -359,99 +360,7 @@ Qt::DropActions TaskListModel::supportedDropActions() const { return Qt::CopyAction | Qt::MoveAction; } -AutoAdjustingTreeView::AutoAdjustingTreeView(QWidget* parent) : QTreeView(parent) { -// consider viewportSizeHint() -#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0) - setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); -#endif -} - -void AutoAdjustingTreeView::setStretchSection(int section) { - stretch_section_ = section; - updateGeometry(); -} - -void AutoAdjustingTreeView::setAutoHideSections(const QList& sections) { - auto_hide_cols_ = sections; - updateGeometry(); -} - -void AutoAdjustingTreeView::setModel(QAbstractItemModel* model) { - size_hints_.clear(); - QTreeView::setModel(model); - - updateGeometry(); -} - -QSize AutoAdjustingTreeView::viewportSizeHint() const { - bool preferred = sizePolicy().horizontalPolicy() & QSizePolicy::ShrinkFlag; - auto m = model(); - auto* h = header(); - size_hints_.clear(); - - int width = 0; - for (int i = 0, end = m ? m->columnCount() : 0; i < end; ++i) { - size_hints_.push_back(h->sectionSizeHint(i)); - if (preferred || !auto_hide_cols_.contains(i)) - width += size_hints_.back(); - } - - QSize main_size(width, sizeHintForRow(0) * ((!preferred || !m) ? 2 : m->rowCount())); - - // add size for header - QSize header_size(0, header()->isVisible() ? header()->height() : 0); - - // add size for scrollbars - QSize scrollbars(verticalScrollBar()->isVisible() ? verticalScrollBar()->width() : 0, - horizontalScrollBar()->isVisible() ? horizontalScrollBar()->height() : 0); - - return main_size + header_size + scrollbars; -} - -void AutoAdjustingTreeView::resizeEvent(QResizeEvent* event) { - auto* m = model(); - int columns = m ? m->columnCount() : 0; - if ((int)size_hints_.size() != columns) - viewportSizeHint(); - - // auto hide/show columns > 0, stretch last column to width - int available_width = event->size().width(); - - int required_width = std::accumulate(size_hints_.begin(), size_hints_.end(), 0); - std::vector width = size_hints_; - - // if required is larger than available width, try to hide some columns - QListIterator it(auto_hide_cols_); - for (it.toBack(); it.hasPrevious() && required_width > available_width;) { - int section = it.previous(); - required_width -= size_hints_[section]; - width[section] = 0; - } - - // extend width to current column width if possible - for (int i = 0; i < columns; ++i) { - if (i == stretch_section_) - continue; // ignore auto-stretch section for now - int delta = columnWidth(i) > 0 ? columnWidth(i) - width[i] : 0; - if (delta < 0 || required_width + delta <= available_width) { - width[i] += delta; - required_width += delta; - } - } - - // stretch section if there is still space available - if (stretch_section_ >= 0 && stretch_section_ < (int)width.size() && width[stretch_section_] > 0 && - available_width > required_width) - width[stretch_section_] += available_width - required_width; - - // apply stuff - for (int i = 0; i < columns; ++i) - setColumnWidth(i, width[i]); -} - -TaskListView::TaskListView(QWidget* parent) : AutoAdjustingTreeView(parent) { - setStretchSection(0); -} +TaskListView::TaskListView(QWidget* parent) : QTreeView(parent) {} // dropping onto an item, should expand this item void TaskListView::dropEvent(QDropEvent* event) { @@ -460,6 +369,64 @@ void TaskListView::dropEvent(QDropEvent* event) { if (event->isAccepted()) expand(index); } + +void TaskListView::setModel(QAbstractItemModel* model) { + QTreeView::setModel(model); + if (header()->count() >= 4) { + header()->setSectionResizeMode(0, QHeaderView::Stretch); + updateColumnWidth(); + } +} + +void TaskListView::dataChanged(const QModelIndex& /*topLeft*/, const QModelIndex& bottomRight, + const QVector& /*roles*/) { + if (bottomRight.column() > 0) { + updateColumnWidth(); + } +} + +void TaskListView::updateColumnWidth() { + for (int i = 3; i > 0; --i) { + header()->setSectionResizeMode(i, QHeaderView::ResizeToContents); + } +} + +SolutionListView::SolutionListView(QWidget* parent) : QTreeView(parent) {} + +void SolutionListView::setModel(QAbstractItemModel* model) { + QTreeView::setModel(model); + updateColumnWidth(); +} + +void SolutionListView::dataChanged(const QModelIndex& /*topLeft*/, const QModelIndex& bottomRight, + const QVector& /*roles*/) { + if (bottomRight.column() > 0) { + updateColumnWidth(); + } +} + +void SolutionListView::resizeEvent(QResizeEvent* e) { + QTreeView::resizeEvent(e); + updateColumnWidth(); +} + +void SolutionListView::updateColumnWidth() { + // do nothing if current model is not what we expect + if (header()->count() < 3) { + return; + } + + for (int i = 0; i < 2; ++i) { + header()->setSectionResizeMode(i, QHeaderView::ResizeToContents); + } + + const int stretch_size = viewport()->size().width() - header()->sectionPosition(2); + + const int content_size = sizeHintForColumn(2); + + header()->resizeSection(2, std::max(stretch_size, content_size)); +} + } // namespace moveit_rviz_plugin #include "moc_task_list_model.cpp" diff --git a/visualization/motion_planning_tasks/src/task_list_model.h b/visualization/motion_planning_tasks/src/task_list_model.h index 13a31b5b..fd27c159 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.h +++ b/visualization/motion_planning_tasks/src/task_list_model.h @@ -2,6 +2,7 @@ * Software License Agreement (BSD License) * * Copyright (c) 2017, Bielefeld University + * Copyright (c) 2020, Hamburg University * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -47,6 +48,7 @@ #include #include +#include #include #include @@ -178,34 +180,34 @@ protected Q_SLOTS: void highlightStage(size_t id); }; -class AutoAdjustingTreeView : public QTreeView -{ - Q_OBJECT - Q_PROPERTY(int stretchSection READ stretchSection WRITE setStretchSection) - - mutable std::vector size_hints_; // size hints for sections - QList auto_hide_cols_; // auto-hiding sections - int stretch_section_ = -1; - -public: - AutoAdjustingTreeView(QWidget* parent = nullptr); - - int stretchSection() const { return stretch_section_; } - void setStretchSection(int section); - - void setAutoHideSections(const QList& sections); - - void setModel(QAbstractItemModel* model) override; - QSize viewportSizeHint() const override; - void resizeEvent(QResizeEvent* event) override; -}; - -class TaskListView : public AutoAdjustingTreeView +class TaskListView : public QTreeView { Q_OBJECT public: TaskListView(QWidget* parent = nullptr); void dropEvent(QDropEvent* event) override; + + void setModel(QAbstractItemModel* model) override; + void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, + const QVector& roles = QVector()) override; + +protected: + void updateColumnWidth(); +}; + +class SolutionListView : public QTreeView +{ + Q_OBJECT +public: + SolutionListView(QWidget* parent = nullptr); + + void setModel(QAbstractItemModel* model) override; + void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, + const QVector& roles = QVector()) override; + void resizeEvent(QResizeEvent* event) override; + +protected: + void updateColumnWidth(); }; } // namespace moveit_rviz_plugin diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 797d69f8..fee4cad9 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -234,9 +234,6 @@ TaskViewPrivate::TaskViewPrivate(TaskView* q_ptr) : q_ptr(q_ptr), exec_action_cl tasks_view->setDropIndicatorShown(true); tasks_view->setDragEnabled(true); - solutions_view->setAutoHideSections({ 1, 2 }); - solutions_view->setStretchSection(2); - // init actions tasks_view->addActions({ actionAddLocalTask, actionRemoveTaskTreeRows }); } @@ -304,15 +301,15 @@ void TaskView::save(rviz::Config config) { write_splitter_sizes(d_ptr->tasks_property_splitter, "property_splitter"); write_splitter_sizes(d_ptr->tasks_solutions_splitter, "solutions_splitter"); - auto write_column_sizes = [&config](QTreeView* view, const QString& key) { + auto write_column_sizes = [&config](QHeaderView* view, const QString& key) { rviz::Config group = config.mapMakeChild(key); - for (int c = 0, end = view->header()->count(); c != end; ++c) { + for (int c = 0, end = view->count(); c != end; ++c) { rviz::Config item = group.listAppendNew(); - item.setValue(view->columnWidth(c)); + item.setValue(view->sectionSize(c)); } }; - write_column_sizes(d_ptr->tasks_view, "tasks_view_columns"); - write_column_sizes(d_ptr->solutions_view, "solutions_view_columns"); + write_column_sizes(d_ptr->tasks_view->header(), "tasks_view_columns"); + write_column_sizes(d_ptr->solutions_view->header(), "solutions_view_columns"); const QHeaderView* view = d_ptr->solutions_view->header(); rviz::Config group = config.mapMakeChild("solution_sorting"); @@ -413,10 +410,10 @@ void TaskView::onCurrentStageChanged(const QModelIndex& current, const QModelInd } // update the PropertyModel - view = d_ptr->property_view; - sm = view->selectionModel(); + QTreeView* pview = d_ptr->property_view; + sm = pview->selectionModel(); m = task ? task->getPropertyModel(task_index) : nullptr; - view->setModel(m); + pview->setModel(m); delete sm; // we don't store the selection model } diff --git a/visualization/motion_planning_tasks/src/task_view.ui b/visualization/motion_planning_tasks/src/task_view.ui index 8ae8aa59..bdda7ec6 100644 --- a/visualization/motion_planning_tasks/src/task_view.ui +++ b/visualization/motion_planning_tasks/src/task_view.ui @@ -31,7 +31,7 @@ Qt::Vertical - + 0 @@ -64,11 +64,23 @@ Qt::ActionsContextMenu + + 15 + + + true + + + true + + + true + false - + 1 @@ -78,6 +90,15 @@ QAbstractItemView::ExtendedSelection + + QAbstractItemView::SelectRows + + + Qt::ElideNone + + + QAbstractItemView::ScrollPerPixel + false @@ -87,15 +108,15 @@ true - - false - + + true + - + 0 @@ -141,16 +162,16 @@ QTreeView
task_list_model.h
- - moveit_rviz_plugin::AutoAdjustingTreeView - QTreeView -
task_list_model.h
-
rviz::PropertyTreeWidget QTreeView
rviz/properties/property_tree_widget.h
+ + moveit_rviz_plugin::SolutionListView + QTreeView +
task_list_model.h
+
From a380fea938f4371ada76cbd5422d8f765d7a840e Mon Sep 17 00:00:00 2001 From: v4hn Date: Wed, 15 Apr 2020 22:14:08 +0200 Subject: [PATCH 02/11] panel: unify alignment of header texts User feedback said it's awkward and I quite agree. :) --- visualization/motion_planning_tasks/src/remote_task_model.cpp | 2 +- visualization/motion_planning_tasks/src/task_list_model.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/visualization/motion_planning_tasks/src/remote_task_model.cpp b/visualization/motion_planning_tasks/src/remote_task_model.cpp index fbb9f8c2..cc6775e2 100644 --- a/visualization/motion_planning_tasks/src/remote_task_model.cpp +++ b/visualization/motion_planning_tasks/src/remote_task_model.cpp @@ -495,7 +495,7 @@ QVariant RemoteSolutionModel::headerData(int section, Qt::Orientation orientatio return tr("comment"); } case Qt::TextAlignmentRole: - return section == 2 ? Qt::AlignLeft : Qt::AlignRight; + return Qt::AlignLeft; } } return QAbstractItemModel::headerData(section, orientation, role); diff --git a/visualization/motion_planning_tasks/src/task_list_model.cpp b/visualization/motion_planning_tasks/src/task_list_model.cpp index e04b0b92..8b29c4a9 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.cpp +++ b/visualization/motion_planning_tasks/src/task_list_model.cpp @@ -81,7 +81,7 @@ QVariant TaskListModel::horizontalHeader(int column, int role) { break; case Qt::TextAlignmentRole: - return column == 0 ? Qt::AlignLeft : Qt::AlignRight; + return Qt::AlignLeft; case Qt::ToolTipRole: switch (column) { From 73fdca17081ecd37e2d7ffc318850edf683eace1 Mon Sep 17 00:00:00 2001 From: v4hn Date: Wed, 15 Apr 2020 22:15:15 +0200 Subject: [PATCH 03/11] panel: lower-case header texts either all lower or all upper case. --- visualization/motion_planning_tasks/src/task_list_model.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/visualization/motion_planning_tasks/src/task_list_model.cpp b/visualization/motion_planning_tasks/src/task_list_model.cpp index 8b29c4a9..9bf53fc3 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.cpp +++ b/visualization/motion_planning_tasks/src/task_list_model.cpp @@ -61,7 +61,7 @@ QVariant TaskListModel::horizontalHeader(int column, int role) { case Qt::DisplayRole: switch (column) { case 0: - return tr("Name"); + return tr("name"); case 1: return tr(u8"✓"); case 2: From 853e7324e997db1cf595061711baa47e99e03136 Mon Sep 17 00:00:00 2001 From: v4hn Date: Wed, 15 Apr 2020 22:19:11 +0200 Subject: [PATCH 04/11] panel: have property-view occupy much less space by default The initially more important part of the panel is clearly the task structure. For longer tasks, the empty properties-view adds a scrollbar to the task when none would be needed. --- visualization/motion_planning_tasks/src/task_panel.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index fee4cad9..be1cd4a8 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -260,6 +260,9 @@ TaskView::TaskView(moveit_rviz_plugin::TaskPanel* parent, rviz::Property* root) : SubPanel(parent), d_ptr(new TaskViewPrivate(this)) { Q_D(TaskView); + d_ptr->tasks_property_splitter->setStretchFactor(0, 3); + d_ptr->tasks_property_splitter->setStretchFactor(1, 1); + // connect signals connect(d->actionRemoveTaskTreeRows, SIGNAL(triggered()), this, SLOT(removeSelectedStages())); connect(d->actionAddLocalTask, SIGNAL(triggered()), this, SLOT(addTask())); From 7d510c79d326674c3d32e144bfe0ea6fb6c623d8 Mon Sep 17 00:00:00 2001 From: v4hn Date: Wed, 15 Apr 2020 22:23:10 +0200 Subject: [PATCH 05/11] solutions view: show the comment as tooltip Makes much more sense than the internal id. --- visualization/motion_planning_tasks/src/remote_task_model.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/visualization/motion_planning_tasks/src/remote_task_model.cpp b/visualization/motion_planning_tasks/src/remote_task_model.cpp index cc6775e2..f9f58be4 100644 --- a/visualization/motion_planning_tasks/src/remote_task_model.cpp +++ b/visualization/motion_planning_tasks/src/remote_task_model.cpp @@ -509,9 +509,11 @@ QVariant RemoteSolutionModel::data(const QModelIndex& index, int role) const { switch (role) { case Qt::UserRole: - case Qt::ToolTipRole: return item.id; + case Qt::ToolTipRole: + return item.comment; + case Qt::DisplayRole: switch (index.column()) { case 0: From 95dad831269770cda06d53d09864b4916cb2c313 Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 14:22:57 +0200 Subject: [PATCH 06/11] panel: add margin above buttons --- visualization/motion_planning_tasks/src/task_panel.ui | 3 +++ 1 file changed, 3 insertions(+) diff --git a/visualization/motion_planning_tasks/src/task_panel.ui b/visualization/motion_planning_tasks/src/task_panel.ui index fc0b0797..4af2bd78 100644 --- a/visualization/motion_planning_tasks/src/task_panel.ui +++ b/visualization/motion_planning_tasks/src/task_panel.ui @@ -28,6 +28,9 @@
+ + 2 + From 1b3f8fe8c38bb4ae8f12530ba702070e57524958 Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 18:18:22 +0200 Subject: [PATCH 07/11] panel: remove "interactive" add task from context menu until there is anything reasonable to add. At the moment, there isn't. This is one of the UI end-points for Robert's proposed drag&drop task system. --- visualization/motion_planning_tasks/src/task_panel.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index be1cd4a8..379f6936 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -235,7 +235,8 @@ TaskViewPrivate::TaskViewPrivate(TaskView* q_ptr) : q_ptr(q_ptr), exec_action_cl tasks_view->setDragEnabled(true); // init actions - tasks_view->addActions({ actionAddLocalTask, actionRemoveTaskTreeRows }); + // TODO(v4hn): add actionAddLocalTask once there is something meaningful to add + tasks_view->addActions({ /*actionAddLocalTask,*/ actionRemoveTaskTreeRows }); } std::pair TaskViewPrivate::getTaskListModel(const QModelIndex& index) const { From 6baf9f6a1b1646aaa930a4d4d82528f04e0f3086 Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 17:12:22 +0200 Subject: [PATCH 08/11] panel: optionally disable time column --- visualization/motion_planning_tasks/src/task_panel.cpp | 9 +++++++++ visualization/motion_planning_tasks/src/task_panel.h | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 379f6936..04c37bd9 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -288,6 +288,9 @@ TaskView::TaskView(moveit_rviz_plugin::TaskPanel* parent, rviz::Property* root) initial_task_expand->addOption("Top-level Expanded", EXPAND_TOP); initial_task_expand->addOption("All Expanded", EXPAND_ALL); initial_task_expand->addOption("All Closed", EXPAND_NONE); + + show_time_column = new rviz::BoolProperty("Show Computation Times", true, "Show the 'time' column", configs); + connect(show_time_column, SIGNAL(changed()), this, SLOT(onShowTimeChanged())); } TaskView::~TaskView() { @@ -475,6 +478,12 @@ void TaskView::onExecCurrentSolution() const { d_ptr->exec_action_client_.sendGoal(goal); } +void TaskView::onShowTimeChanged() { + auto* header = d_ptr->tasks_view->header(); + if (header->count() > 3) + d_ptr->tasks_view->header()->setSectionHidden(3, !show_time_column->getBool()); +} + GlobalSettingsWidgetPrivate::GlobalSettingsWidgetPrivate(GlobalSettingsWidget* q_ptr, rviz::Property* root) : q_ptr(q_ptr) { setupUi(q_ptr); diff --git a/visualization/motion_planning_tasks/src/task_panel.h b/visualization/motion_planning_tasks/src/task_panel.h index 19f683fb..20df43e9 100644 --- a/visualization/motion_planning_tasks/src/task_panel.h +++ b/visualization/motion_planning_tasks/src/task_panel.h @@ -47,6 +47,7 @@ class QIcon; namespace rviz { class WindowManagerInterface; class Property; +class BoolProperty; class EnumProperty; } @@ -125,6 +126,8 @@ protected: }; rviz::EnumProperty* initial_task_expand; + rviz::BoolProperty* show_time_column; + public: TaskView(TaskPanel* parent, rviz::Property* root); ~TaskView() override; @@ -141,6 +144,7 @@ protected Q_SLOTS: void onCurrentSolutionChanged(const QModelIndex& current, const QModelIndex& previous); void onSolutionSelectionChanged(const QItemSelection& selected, const QItemSelection& deselected); void onExecCurrentSolution() const; + void onShowTimeChanged(); }; class GlobalSettingsWidgetPrivate; From da6d6779918588540e345c71e707a908a4d28ebb Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 18:20:16 +0200 Subject: [PATCH 09/11] add "show time column" to context menu --- .../motion_planning_tasks/src/task_panel.cpp | 9 +++++++-- visualization/motion_planning_tasks/src/task_view.ui | 11 +++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 04c37bd9..534bd929 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -234,9 +234,11 @@ TaskViewPrivate::TaskViewPrivate(TaskView* q_ptr) : q_ptr(q_ptr), exec_action_cl tasks_view->setDropIndicatorShown(true); tasks_view->setDragEnabled(true); + actionShowTimeColumn->setChecked(true); + // init actions // TODO(v4hn): add actionAddLocalTask once there is something meaningful to add - tasks_view->addActions({ /*actionAddLocalTask,*/ actionRemoveTaskTreeRows }); + tasks_view->addActions({ /*actionAddLocalTask,*/ actionRemoveTaskTreeRows, actionShowTimeColumn }); } std::pair TaskViewPrivate::getTaskListModel(const QModelIndex& index) const { @@ -267,6 +269,7 @@ TaskView::TaskView(moveit_rviz_plugin::TaskPanel* parent, rviz::Property* root) // connect signals connect(d->actionRemoveTaskTreeRows, SIGNAL(triggered()), this, SLOT(removeSelectedStages())); connect(d->actionAddLocalTask, SIGNAL(triggered()), this, SLOT(addTask())); + connect(d->actionShowTimeColumn, &QAction::triggered, [this](bool checked) { show_time_column->setValue(checked); }); connect(d->tasks_view->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), this, SLOT(onCurrentStageChanged(QModelIndex, QModelIndex))); @@ -480,8 +483,10 @@ void TaskView::onExecCurrentSolution() const { void TaskView::onShowTimeChanged() { auto* header = d_ptr->tasks_view->header(); + bool show = show_time_column->getBool(); if (header->count() > 3) - d_ptr->tasks_view->header()->setSectionHidden(3, !show_time_column->getBool()); + d_ptr->tasks_view->header()->setSectionHidden(3, !show); + d_ptr->actionShowTimeColumn->setChecked(show); } GlobalSettingsWidgetPrivate::GlobalSettingsWidgetPrivate(GlobalSettingsWidget* q_ptr, rviz::Property* root) diff --git a/visualization/motion_planning_tasks/src/task_view.ui b/visualization/motion_planning_tasks/src/task_view.ui index bdda7ec6..c2881ea6 100644 --- a/visualization/motion_planning_tasks/src/task_view.ui +++ b/visualization/motion_planning_tasks/src/task_view.ui @@ -155,6 +155,17 @@ Add task + + + true + + + ShowTimeColumn + + + show time column + +
From 287287d23b299efd3c96edc22f3ec93f097471dd Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 18:37:06 +0200 Subject: [PATCH 10/11] panel: only local models can be edited --- .../motion_planning_tasks/src/local_task_model.cpp | 2 ++ .../motion_planning_tasks/src/remote_task_model.cpp | 7 ------- .../motion_planning_tasks/src/remote_task_model.h | 1 - .../motion_planning_tasks/src/task_list_model.cpp | 7 ------- visualization/motion_planning_tasks/src/task_list_model.h | 1 - 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/visualization/motion_planning_tasks/src/local_task_model.cpp b/visualization/motion_planning_tasks/src/local_task_model.cpp index 56d24f2d..c789de65 100644 --- a/visualization/motion_planning_tasks/src/local_task_model.cpp +++ b/visualization/motion_planning_tasks/src/local_task_model.cpp @@ -134,6 +134,8 @@ Qt::ItemFlags LocalTaskModel::flags(const QModelIndex& index) const { // dropping into containers is enabled if (c && stage_factory_) flags |= Qt::ItemIsDropEnabled; + if (index.column() == 0) + flags |= Qt::ItemIsEditable; // name is editable return flags; } diff --git a/visualization/motion_planning_tasks/src/remote_task_model.cpp b/visualization/motion_planning_tasks/src/remote_task_model.cpp index f9f58be4..59746e35 100644 --- a/visualization/motion_planning_tasks/src/remote_task_model.cpp +++ b/visualization/motion_planning_tasks/src/remote_task_model.cpp @@ -232,13 +232,6 @@ QModelIndex RemoteTaskModel::parent(const QModelIndex& child) const { return this->index(p); } -Qt::ItemFlags RemoteTaskModel::flags(const QModelIndex& index) const { - Qt::ItemFlags flags = BaseTaskModel::flags(index); - if (index.column() == 0) - flags |= Qt::ItemIsEditable; // name is editable - return flags; -} - QVariant RemoteTaskModel::data(const QModelIndex& index, int role) const { Node* n = node(index); if (!n) diff --git a/visualization/motion_planning_tasks/src/remote_task_model.h b/visualization/motion_planning_tasks/src/remote_task_model.h index a547afff..e9f07e77 100644 --- a/visualization/motion_planning_tasks/src/remote_task_model.h +++ b/visualization/motion_planning_tasks/src/remote_task_model.h @@ -81,7 +81,6 @@ public: QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override; QModelIndex parent(const QModelIndex& index) const override; - Qt::ItemFlags flags(const QModelIndex& index) const override; QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override; bool setData(const QModelIndex& index, const QVariant& value, int role = Qt::EditRole) override; diff --git a/visualization/motion_planning_tasks/src/task_list_model.cpp b/visualization/motion_planning_tasks/src/task_list_model.cpp index 9bf53fc3..ea516c6e 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.cpp +++ b/visualization/motion_planning_tasks/src/task_list_model.cpp @@ -114,13 +114,6 @@ QVariant BaseTaskModel::data(const QModelIndex& index, int role) const { return QVariant(); } -Qt::ItemFlags BaseTaskModel::flags(const QModelIndex& index) const { - Qt::ItemFlags flags = QAbstractItemModel::flags(index); - if (index.column() == 0) - flags |= Qt::ItemIsEditable; // name is editable - return flags; -} - QVariant BaseTaskModel::flowIcon(moveit::task_constructor::InterfaceFlags f) { static const QIcon CONNECT_ICON = icons::CONNECT.icon(); static const QIcon FORWARD_ICON = icons::FORWARD.icon(); diff --git a/visualization/motion_planning_tasks/src/task_list_model.h b/visualization/motion_planning_tasks/src/task_list_model.h index fd27c159..7369dd5d 100644 --- a/visualization/motion_planning_tasks/src/task_list_model.h +++ b/visualization/motion_planning_tasks/src/task_list_model.h @@ -96,7 +96,6 @@ public: QVariant data(const QModelIndex& index, int role) const override; virtual void setStageFactory(const StageFactoryPtr& factory) {} - Qt::ItemFlags flags(const QModelIndex& index) const override; unsigned int taskFlags() const { return flags_; } static QVariant flowIcon(moveit::task_constructor::InterfaceFlags f); From 9dc43e49fedc2f4a1973b730172b32168a7c791b Mon Sep 17 00:00:00 2001 From: v4hn Date: Thu, 16 Apr 2020 19:18:27 +0200 Subject: [PATCH 11/11] panel: start with all options expanded --- visualization/motion_planning_tasks/src/task_panel.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/visualization/motion_planning_tasks/src/task_panel.cpp b/visualization/motion_planning_tasks/src/task_panel.cpp index 534bd929..9084c03e 100644 --- a/visualization/motion_planning_tasks/src/task_panel.cpp +++ b/visualization/motion_planning_tasks/src/task_panel.cpp @@ -499,6 +499,8 @@ GlobalSettingsWidgetPrivate::GlobalSettingsWidgetPrivate(GlobalSettingsWidget* q GlobalSettingsWidget::GlobalSettingsWidget(moveit_rviz_plugin::TaskPanel* parent, rviz::Property* root) : SubPanel(parent), d_ptr(new GlobalSettingsWidgetPrivate(this, root)) { Q_D(GlobalSettingsWidget); + + d->view->expandAll(); connect(d->properties, &rviz::PropertyTreeModel::configChanged, this, &GlobalSettingsWidget::configChanged); }