Skip to content

Commit f89d5be

Browse files
committed
ticket:5760 Preserve the scroll position in documentation browser
1 parent 0a7b784 commit f89d5be

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

OMEdit/OMEditLIB/Modeling/DocumentationWidget.cpp

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ DocumentationWidget::DocumentationWidget(QWidget *pParent)
379379
// navigation history list
380380
mpDocumentationHistoryList = new QList<DocumentationHistory>();
381381
mDocumentationHistoryPos = -1;
382+
setExecutingPreviousNextButtons(false);
383+
setScrollPosition(QPoint(0, 0));
382384
// Documentation viewer layout
383385
QGridLayout *pGridLayout = new QGridLayout;
384386
pGridLayout->setContentsMargins(0, 0, 0, 0);
@@ -422,6 +424,18 @@ void DocumentationWidget::showDocumentation(LibraryTreeItem *pLibraryTreeItem)
422424
saveDocumentation(pLibraryTreeItem);
423425
return;
424426
}
427+
// write the scroll position
428+
if (!isExecutingPreviousNextButtons()) {
429+
saveScrollPosition();
430+
}
431+
// read the scroll position
432+
int index = mpDocumentationHistoryList->indexOf(DocumentationHistory(pLibraryTreeItem));
433+
if (index > -1 && isExecutingPreviousNextButtons()) {
434+
setScrollPosition(mpDocumentationHistoryList->at(index).mScrollPosition);
435+
} else {
436+
setScrollPosition(QPoint(0, 0));
437+
}
438+
// read documentation
425439
QString documentation = MainWindow::instance()->getOMCProxy()->getDocumentationAnnotation(pLibraryTreeItem);
426440
writeDocumentationFile(documentation);
427441
mpDocumentationViewer->setUrl(QUrl::fromLocalFile(mDocumentationFile.fileName()));
@@ -507,6 +521,19 @@ QString DocumentationWidget::queryCommandValue(const QString &commandName)
507521
return result.toString();
508522
}
509523

524+
/*!
525+
* \brief DocumentationWidget::saveScrollPosition
526+
* Saves the scroll position of the current page.
527+
*/
528+
void DocumentationWidget::saveScrollPosition()
529+
{
530+
if (mDocumentationHistoryPos > -1 && mpDocumentationHistoryList->size() > 0) {
531+
DocumentationHistory documentationHistory = mpDocumentationHistoryList->at(mDocumentationHistoryPos);
532+
documentationHistory.mScrollPosition = mpDocumentationViewer->page()->mainFrame()->scrollPosition();
533+
mpDocumentationHistoryList->replace(mDocumentationHistoryPos, documentationHistory);
534+
}
535+
}
536+
510537
/*!
511538
* \brief DocumentationWidget::createPixmapForToolButton
512539
* Creates a new pixmap which contains the QIcon and the QColor in the bottom.
@@ -631,9 +658,12 @@ void DocumentationWidget::updateDocumentationHistory(LibraryTreeItem *pLibraryTr
631658
void DocumentationWidget::previousDocumentation()
632659
{
633660
if (mDocumentationHistoryPos > 0) {
661+
saveScrollPosition();
634662
mDocumentationHistoryPos--;
663+
setExecutingPreviousNextButtons(true);
635664
LibraryTreeModel *pLibraryTreeModel = MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel();
636665
pLibraryTreeModel->showModelWidget(mpDocumentationHistoryList->at(mDocumentationHistoryPos).mpLibraryTreeItem);
666+
setExecutingPreviousNextButtons(false);
637667
}
638668
}
639669

@@ -645,9 +675,12 @@ void DocumentationWidget::previousDocumentation()
645675
void DocumentationWidget::nextDocumentation()
646676
{
647677
if ((mDocumentationHistoryPos + 1) < mpDocumentationHistoryList->count()) {
678+
saveScrollPosition();
648679
mDocumentationHistoryPos++;
680+
setExecutingPreviousNextButtons(true);
649681
LibraryTreeModel *pLibraryTreeModel = MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel();
650682
pLibraryTreeModel->showModelWidget(mpDocumentationHistoryList->at(mDocumentationHistoryPos).mpLibraryTreeItem);
683+
setExecutingPreviousNextButtons(false);
651684
}
652685
}
653686

@@ -1140,6 +1173,9 @@ DocumentationViewer::DocumentationViewer(DocumentationWidget *pDocumentationWidg
11401173
connect(page(), SIGNAL(linkClicked(QUrl)), SLOT(processLinkClick(QUrl)));
11411174
connect(page(), SIGNAL(linkHovered(QString,QString,QString)), SLOT(processLinkHover(QString,QString,QString)));
11421175
createActions();
1176+
if (!isContentEditable) {
1177+
connect(this, SIGNAL(loadFinished(bool)), SLOT(pageLoaded(bool)));
1178+
}
11431179
}
11441180

11451181
/*!
@@ -1267,6 +1303,18 @@ void DocumentationViewer::showContextMenu(QPoint point)
12671303
menu.exec(mapToGlobal(point));
12681304
}
12691305

1306+
/*!
1307+
* \brief DocumentationViewer::pageLoaded
1308+
* Scrolls the page after its finished loading.
1309+
* \param ok
1310+
*/
1311+
void DocumentationViewer::pageLoaded(bool ok)
1312+
{
1313+
Q_UNUSED(ok);
1314+
const QPoint scrollPosition = mpDocumentationWidget->getScrollPosition();
1315+
page()->mainFrame()->scroll(scrollPosition.x(), scrollPosition.y());
1316+
}
1317+
12701318
/*!
12711319
* \brief DocumentationViewer::createWindow
12721320
* \param type

OMEdit/OMEditLIB/Modeling/DocumentationWidget.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ class DocumentationHistory
5151
{
5252
public:
5353
LibraryTreeItem *mpLibraryTreeItem;
54-
DocumentationHistory(LibraryTreeItem *pLibraryTreeItem) {mpLibraryTreeItem = pLibraryTreeItem;}
54+
QPoint mScrollPosition;
55+
DocumentationHistory(LibraryTreeItem *pLibraryTreeItem)
56+
{
57+
mpLibraryTreeItem = pLibraryTreeItem;
58+
mScrollPosition = QPoint(0, 0);
59+
}
5560
bool operator==(const DocumentationHistory &documentationHistory) const
5661
{
5762
return (documentationHistory.mpLibraryTreeItem == this->mpLibraryTreeItem);
@@ -80,6 +85,11 @@ class DocumentationWidget : public QWidget
8085
void execCommand(const QString &commandName, const QString &valueArgument);
8186
bool queryCommandState(const QString &commandName);
8287
QString queryCommandValue(const QString &commandName);
88+
void saveScrollPosition();
89+
bool isExecutingPreviousNextButtons() const {return mExecutingPreviousNextButtons;}
90+
void setExecutingPreviousNextButtons(bool executingPreviousNextButtons) {mExecutingPreviousNextButtons = executingPreviousNextButtons;}
91+
QPoint getScrollPosition() const {return mScrollPosition;}
92+
void setScrollPosition(const QPoint &scrollPosition) {mScrollPosition = scrollPosition;}
8393
private:
8494
QFile mDocumentationFile;
8595
QAction *mpPreviousAction;
@@ -126,6 +136,8 @@ class DocumentationWidget : public QWidget
126136
EditType mEditType;
127137
QList<DocumentationHistory> *mpDocumentationHistoryList;
128138
int mDocumentationHistoryPos;
139+
bool mExecutingPreviousNextButtons;
140+
QPoint mScrollPosition;
129141

130142
QPixmap createPixmapForToolButton(QColor color, QIcon icon);
131143
void updatePreviousNextButtons();
@@ -177,6 +189,7 @@ public slots:
177189
void requestFinished();
178190
void processLinkHover(QString link, QString title, QString textContent);
179191
void showContextMenu(QPoint point);
192+
void pageLoaded(bool ok);
180193
protected:
181194
virtual QWebView* createWindow(QWebPage::WebWindowType type) override;
182195
virtual void keyPressEvent(QKeyEvent *event) override;

OMEdit/OMEditLIB/Modeling/LibraryTreeWidget.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1816,7 +1816,6 @@ void LibraryTreeModel::showModelWidget(LibraryTreeItem *pLibraryTreeItem, bool s
18161816
(pLibraryTreeItem->mClassInformation.preferredView.isEmpty() && pLibraryTreeItem->isDocumentationClass()) ||
18171817
(pLibraryTreeItem->mClassInformation.preferredView.isEmpty() &&
18181818
OptionsDialog::instance()->getGeneralSettingsPage()->getDefaultView().compare(Helper::documentationView) == 0))) {
1819-
MainWindow::instance()->getDocumentationWidget()->showDocumentation(pLibraryTreeItem);
18201819
bool state = MainWindow::instance()->getDocumentationDockWidget()->blockSignals(true);
18211820
MainWindow::instance()->getDocumentationDockWidget()->show();
18221821
MainWindow::instance()->getDocumentationDockWidget()->blockSignals(state);

0 commit comments

Comments
 (0)