diff --git a/src/blackgui/overlaymessages.cpp b/src/blackgui/overlaymessages.cpp index 858c4aa51..cb51441ca 100644 --- a/src/blackgui/overlaymessages.cpp +++ b/src/blackgui/overlaymessages.cpp @@ -60,7 +60,6 @@ namespace BlackGui ui->tvp_StatusMessages->setResizeMode(CStatusMessageView::ResizingAlways); ui->tvp_StatusMessages->setForceColumnsToMaxSize(false); // problems with multiline entries, with T138 we need multiline messages - ui->tvp_StatusMessages->setWordWrap(true); ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave); ui->fr_Confirmation->setVisible(false); this->setDefaultConfirmationButton(QMessageBox::Cancel); @@ -159,15 +158,18 @@ namespace BlackGui return; } + //! \fixme KB 2017-09 a possible alternative maybe is to resize rows always to content -> performance? if (appendOldMessages && !ui->tvp_StatusMessages->isEmpty()) { CStatusMessageList messagesWithOld(messages); messagesWithOld.push_back(ui->tvp_StatusMessages->container()); + ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(messages.size()); ui->tvp_StatusMessages->updateContainerMaybeAsync(messagesWithOld); this->setModeToMessages(messagesWithOld.hasErrorMessages()); } else { + ui->tvp_StatusMessages->rowsResizeModeBasedOnThreshold(messages.size()); ui->tvp_StatusMessages->updateContainerMaybeAsync(messages); this->setModeToMessages(messages.hasErrorMessages()); } diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 51a5c7fff..fde433897 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -112,6 +112,9 @@ namespace BlackGui connect(this, &QTableView::doubleClicked, this, &CViewBaseNonTemplate::ps_doubleClicked); this->horizontalHeader()->setSortIndicatorShown(true); + // setting resize mode rowsResizeModeToContent() causes extremly slow views + // default, see: m_rowResizeMode + // scroll modes this->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); this->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); @@ -414,12 +417,12 @@ namespace BlackGui // when not set to auto, then lets set how we want to resize rows if (m_rowResizeMode == Interactive) { - QAction *a = menuActions.addAction(BlackMisc::CIcons::resizeVertical16(), " Resize rows to content (auto)", CMenuAction::pathViewResize(), nullptr, { this, &CViewBaseNonTemplate::rowsResizeModeToContent }); + QAction *a = menuActions.addAction(CIcons::resizeVertical16(), " Resize rows to content (auto), can be slow", CMenuAction::pathViewResize(), nullptr, { this, &CViewBaseNonTemplate::rowsResizeModeToContent }); a->setEnabled(enabled && !autoResize); } else { - QAction *a = menuActions.addAction(BlackMisc::CIcons::resizeVertical16(), "Resize rows interactively", CMenuAction::pathViewResize(), nullptr, { this, &CViewBaseNonTemplate::rowsResizeModeToInteractive }); + QAction *a = menuActions.addAction(CIcons::resizeVertical16(), "Resize rows interactively", CMenuAction::pathViewResize(), nullptr, { this, &CViewBaseNonTemplate::rowsResizeModeToInteractive }); a->setEnabled(!autoResize); } @@ -505,9 +508,9 @@ namespace BlackGui void CViewBaseNonTemplate::init() { - const int fh = qRound(1.5 * this->getHorizontalHeaderFontHeight()); this->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); // faster mode this->horizontalHeader()->setStretchLastSection(true); + const int fh = qRound(1.5 * this->getHorizontalHeaderFontHeight()); this->verticalHeader()->setDefaultSectionSize(fh); // for height this->verticalHeader()->setMinimumSectionSize(fh); // for height @@ -640,6 +643,18 @@ namespace BlackGui m_rowResizeMode = Content; } + void CViewBaseNonTemplate::rowsResizeModeBasedOnThreshold(int elements) + { + if (elements > ResizeRowsToContentThreshold) + { + this->rowsResizeModeToInteractive(); + } + else + { + this->rowsResizeModeToContent(); + } + } + int CViewBaseNonTemplate::showLoadIndicator(int containerSizeDependent, int timeoutMs, bool processEvents) { if (!m_enabledLoadIndicator) { return -1; } @@ -705,21 +720,25 @@ namespace BlackGui { // resize to maximum magic trick from: // http://stackoverflow.com/q/3433664/356726 - // vpNew.setWidth(std::numeric_limits::max()); // largest finite value this->setVisible(false); - const QRect vpOriginal = this->viewport()->geometry(); if (m_forceColumnsToMaxSize) { + // vpNew.setWidth(std::numeric_limits::max()); // largest finite value const QRect screenGeometry = QApplication::desktop()->screenGeometry(); QRect vpNew = vpOriginal; vpNew.setWidth(screenGeometry.width()); this->viewport()->setGeometry(vpNew); } - m_resizeCount++; this->resizeColumnsToContents(); // columns - this->resizeRowsToContents(); // rows + + // useless if mode is Interactive + if (m_rowResizeMode == Content) + { + this->resizeRowsToContents(); // rows + } + m_resizeCount++; // re-stretch if (m_forceStretchLastColumnWhenResized) { this->horizontalHeader()->setStretchLastSection(true); } @@ -748,7 +767,7 @@ namespace BlackGui dockWidget->addToContextMenu(dockWidgetSubMenu); } - QPoint globalPos = this->mapToGlobal(pos); + const QPoint globalPos = this->mapToGlobal(pos); menu.exec(globalPos); } @@ -882,7 +901,7 @@ namespace BlackGui } else if (reallyResize) { - this->resizeToContents(); + this->resizeToContents(); // mode based resize } else if (presize && !presizeThresholdReached) { diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index 617d77a5f..149c9a106 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -141,6 +141,10 @@ namespace BlackGui //! When to use pre-sizing with random elements static constexpr int ResizeSubsetThreshold = 250; + //! When to use rows resizing (which is slow) + //! \see rowsResizeModeToContent + static constexpr int ResizeRowsToContentThreshold = 20; + //! Clear data virtual void clear() = 0; @@ -269,7 +273,7 @@ namespace BlackGui //! Force that columns are extended to full viewport width. //! Workaround as of https://stackoverflow.com/q/3433664/356726 - void setForceColumnsToMaxSize (bool force) { m_forceColumnsToMaxSize = force; } + void setForceColumnsToMaxSize(bool force) { m_forceColumnsToMaxSize = force; } signals: //! Ask for new data from currently loaded data @@ -322,8 +326,12 @@ namespace BlackGui void rowsResizeModeToInteractive(); //! Resize mode to content + //! \remark extremely slow for larger views (means views with many rows) void rowsResizeModeToContent(); + //! Set content/interactive mode based on ResizeRowsToContentThreshold + void rowsResizeModeBasedOnThreshold(int elements); + //! Show loading indicator //! \param containerSizeDependent check against resize threshold if indicator makes sense //! \param timeoutMs timeout the loading indicator