From e5ff55a3af4c53ca37f2ba6ef07c46bf11a919da Mon Sep 17 00:00:00 2001 From: Victor Yacovlev Date: Fri, 9 Aug 2013 17:54:50 +0400 Subject: [PATCH] Improved help viewer for use in small size window (not it can be docked into i/o console space) --- src/shared/docbookviewer/contentview.cpp | 37 ++++- src/shared/docbookviewer/contentview.h | 8 + src/shared/docbookviewer/docbookview.cpp | 14 ++ src/shared/docbookviewer/docbookview.h | 1 + src/shared/docbookviewer/docbookview_impl.cpp | 149 +++++++++++++++++- src/shared/docbookviewer/docbookview_impl.h | 28 +++- src/shared/docbookviewer/sidepanel.ui | 121 +++++++++++--- 7 files changed, 326 insertions(+), 32 deletions(-) diff --git a/src/shared/docbookviewer/contentview.cpp b/src/shared/docbookviewer/contentview.cpp index 33e8bdf0..bc87b6d5 100644 --- a/src/shared/docbookviewer/contentview.cpp +++ b/src/shared/docbookviewer/contentview.cpp @@ -10,7 +10,7 @@ namespace DocBookViewer { static const QString MainFontFamily = "Droid Serif,PT Serif,Garamond,Times New Roman,serif"; -static const QString MainFontSize = "14pt"; +static const QString MainFontSize = "12pt"; static const QString CodeFontFamily = "DejaVu Sans Mono,Liberation Mono,PT Sans Mono,Courier New,monospace"; @@ -23,11 +23,14 @@ ContentView::ContentView(QWidget *parent) setOpenLinks(false); connect(this, SIGNAL(anchorClicked(QUrl)), this, SLOT(handleInternalLink(QUrl))); + connect(verticalScrollBar(), SIGNAL(sliderMoved(int)), + this, SLOT(clearLastAnchorUrl())); + ignoreClearAnchorUrl_ = false; } QSize ContentView::minimumSizeHint() const { - return QSize(500, 400); + return QSize(500, 230); } void ContentView::reset() @@ -48,6 +51,7 @@ void ContentView::renderData(ModelPtr data) QString anchor = modelToLink(data); QUrl anchorUrl("#" + anchor); setSource(anchorUrl); + lastAnchorUrl_ = anchorUrl; } } @@ -1502,4 +1506,33 @@ QString ContentView::formatProgramSourceText( return result; } +void ContentView::resizeEvent(QResizeEvent *e) +{ + ignoreClearAnchorUrl_ = true; + QTextBrowser::resizeEvent(e);; + if (lastAnchorUrl_.isValid()) { + setSource(lastAnchorUrl_); + } +} + +void ContentView::wheelEvent(QWheelEvent *e) +{ + QTextBrowser::wheelEvent(e); + if (e->buttons() == Qt::NoButton) { + clearLastAnchorUrl(); + } +} + +void ContentView::clearLastAnchorUrl() +{ + if (!ignoreClearAnchorUrl_) { + lastAnchorUrl_.clear(); +// qDebug() << "Claar last anchor url"; + } + else { +// qDebug() << "Ignored clear last anchor url"; + } + ignoreClearAnchorUrl_ = false; +} + } diff --git a/src/shared/docbookviewer/contentview.h b/src/shared/docbookviewer/contentview.h index c28e6e40..4cc34d8d 100644 --- a/src/shared/docbookviewer/contentview.h +++ b/src/shared/docbookviewer/contentview.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include namespace DocBookViewer { @@ -27,6 +29,9 @@ signals: void itemRequest(ModelPtr model); private: + void resizeEvent(QResizeEvent *e); + void wheelEvent(QWheelEvent *e); + QString wrapHTML(const QString & body) const; QString render(ModelPtr data) const; QString renderElement(ModelPtr data) const; @@ -123,8 +128,11 @@ private: private /*fields*/: ModelPtr loadedModel_; + QUrl lastAnchorUrl_; + bool ignoreClearAnchorUrl_; private slots: + void clearLastAnchorUrl(); void handleInternalLink(const QUrl & url); diff --git a/src/shared/docbookviewer/docbookview.cpp b/src/shared/docbookviewer/docbookview.cpp index 854e3b3f..eda9d564 100644 --- a/src/shared/docbookviewer/docbookview.cpp +++ b/src/shared/docbookviewer/docbookview.cpp @@ -1,6 +1,8 @@ #include "docbookview.h" #include "docbookview_impl.h" +#include + namespace DocBookViewer { DocBookView::DocBookView(QWidget *parent) @@ -39,6 +41,18 @@ void DocBookView::showEvent(QShowEvent * event) QWidget::showEvent(event); } +void DocBookView::resizeEvent(QResizeEvent * event) +{ + if (event->size().width() < minimumWidth() || + event->size().height() < minimumHeight()) { + event->ignore(); + } + else { + event->accept(); + pImpl_->setSize(event->size()); + } +} + DocBookView::~DocBookView() { diff --git a/src/shared/docbookviewer/docbookview.h b/src/shared/docbookviewer/docbookview.h index e8c565ca..3b532236 100644 --- a/src/shared/docbookviewer/docbookview.h +++ b/src/shared/docbookviewer/docbookview.h @@ -56,6 +56,7 @@ protected: void showEvent(QShowEvent *); void closeEvent(QCloseEvent *); void hideEvent(QHideEvent *); + void resizeEvent(QResizeEvent *); private: class DocBookViewImpl* pImpl_; diff --git a/src/shared/docbookviewer/docbookview_impl.cpp b/src/shared/docbookviewer/docbookview_impl.cpp index 1bfa1d4d..ef90ad58 100644 --- a/src/shared/docbookviewer/docbookview_impl.cpp +++ b/src/shared/docbookviewer/docbookview_impl.cpp @@ -18,14 +18,33 @@ DocBookViewImpl::DocBookViewImpl(DocBookView *pClass) : QObject(pClass) , pClass_(pClass) , settings_(nullptr) + , compactModeFlag_(false) { - pClass_->setLayout(new QHBoxLayout); + + smallSizeContainer_ = new QWidget(pClass); + smallSizeContainer_->move(0, 0); + smallSizeContainer_->setLayout(new QHBoxLayout); + smallSizeContainer_->layout()->setContentsMargins(0, 24, 0, 0); + + background_ = new QWidget(pClass); + background_->move(0, 0); + + splitterRightWidget_ = new QStackedWidget(pClass); + + filler_ = new QWidget(pClass_); + splitterRightWidget_->addWidget(filler_); + + enoughtSizeContainer_ = new QWidget(pClass); + enoughtSizeContainer_->setLayout(new QHBoxLayout); + enoughtSizeContainer_->layout()->setContentsMargins(0, 0, 0, 0); + splitterRightWidget_->addWidget(enoughtSizeContainer_); + + splitter_ = new QSplitter(Qt::Horizontal, pClass_); sidePanel_ = new SidePanel(pClass_); splitter_->addWidget(sidePanel_); content_ = new ContentView(pClass_); - splitter_->addWidget(content_); - pClass_->layout()->addWidget(splitter_); + splitter_->addWidget(splitterRightWidget_); connect(sidePanel_, SIGNAL(itemPicked(ModelPtr)), this, SLOT(showAnItem(ModelPtr))); @@ -36,18 +55,132 @@ DocBookViewImpl::DocBookViewImpl(DocBookView *pClass) connect(this, SIGNAL(itemSelected(ModelPtr)), sidePanel_, SLOT(selectItem(ModelPtr))); + splitter_->setCollapsible(0, false); + splitter_->setCollapsible(1, false); + splitter_->move(0, 0); + + + toggleSideBar_ = new QLabel(pClass_); + toggleSideBar_->setFixedHeight(24); + toggleSideBar_->move(0, 0); + toggleSideBar_->setTextFormat(Qt::RichText); + connect(toggleSideBar_, SIGNAL(linkActivated(QString)), + this, SLOT(handleShowSideBarButton(QString))); + createActions(); + + background_->setStyleSheet("background-color: rgba(0,0,0,192);"); + sidePanel_->setAutoFillBackground(true); + splitter_->handle(1)->setAutoFillBackground(true); +} + + +void DocBookViewImpl::updateToggleSideBarButton() +{ + static const QString Hide = tr("Hide side bar"); + static const QString Show = tr("Show side bar"); + + const QString & text = isSideBarVisible() ? Hide : Show; + const QString action = isSideBarVisible() ? "#hide" : "#show"; + + const QString html = QString("%2").arg(action).arg(text); + + const int width = toggleSideBar_->fontMetrics().width(text) + 16; + + toggleSideBar_->setText(html); + toggleSideBar_->setFixedWidth(width); +} + +bool DocBookViewImpl::isSideBarVisible() const +{ + return compactModeFlag_ ? splitter_->isVisible() : sidePanel_->isVisible(); } +void DocBookViewImpl::handleShowSideBarButton(const QString &action) +{ + if (action=="#show") { + showSidePanel(); + } + else if (action=="#hide") { + hideSidePanel(); + } +} + +void DocBookViewImpl::setSize(const QSize &size) +{ + int minWidth = content_->minimumSizeHint().width() + + sidePanel_->minimumSizeHint().width(); + splitter_->move(0, 0); + splitter_->resize(size); + smallSizeContainer_->move(0, 0); + smallSizeContainer_->resize(size); + background_->move(0, 0); + background_->resize(size); + if (size.width() < minWidth) { + switchToCompactMode(); + } + else { + switchToEnoughtSizeMode(); + } + updateToggleSideBarButton(); +} + +void DocBookViewImpl::switchToCompactMode(bool force) +{ + if (compactModeFlag_ && !force) + return; + compactModeFlag_ = true; + splitterRightWidget_->setCurrentIndex(0); + smallSizeContainer_->layout()->addWidget(content_); + splitter_->setVisible(false); + updateToggleSideBarButton(); + background_->setVisible(isSideBarVisible()); +} + +void DocBookViewImpl::switchToEnoughtSizeMode(bool force) +{ + if (!compactModeFlag_ && !force) + return; + compactModeFlag_ = false; + splitterRightWidget_->setCurrentIndex(1); + enoughtSizeContainer_->layout()->addWidget(content_); + splitter_->setVisible(true); + updateToggleSideBarButton(); + background_->setVisible(false); +} + +void DocBookViewImpl::hideSidePanel() +{ + if (compactModeFlag_) + splitter_->setVisible(false); + else + sidePanel_->setVisible(false); + updateToggleSideBarButton(); + background_->setVisible(false); + enoughtSizeContainer_->layout()->setContentsMargins(0, 24, 0, 0); +} + +void DocBookViewImpl::showSidePanel() +{ + splitter_->setVisible(true); + sidePanel_->setVisible(true); + updateToggleSideBarButton(); + background_->setVisible(compactModeFlag_); + enoughtSizeContainer_->layout()->setContentsMargins(0, 0, 0, 0); +} QSize DocBookViewImpl::minimumSizeHint() const { - return QSize(800, 500); + int minW = qMax(sidePanel_->minimumSizeHint().width(), + content_->minimumSizeHint().width()); + int minH = qMax(sidePanel_->minimumSizeHint().height(), + content_->minimumSizeHint().height()); + return QSize(minW, minH); } QSize DocBookViewImpl::sizeHint() const { - return QSize(1000, 600); + return QSize(800, 600); } void DocBookViewImpl::updateSettings(ExtensionSystem::SettingsPtr settings, const QString &prefix) @@ -63,6 +196,7 @@ void DocBookViewImpl::saveState(ExtensionSystem::SettingsPtr settings, const QSt settings->setValue(prefix + "/SplitterState", splitter_->saveState()); sidePanel_->saveState(settings, prefix + "/SideBar"); + settings->setValue(prefix + "/CompactMode", compactModeFlag_); } void DocBookViewImpl::restoreState(ExtensionSystem::SettingsPtr settings, const QString &prefix) @@ -72,6 +206,11 @@ void DocBookViewImpl::restoreState(ExtensionSystem::SettingsPtr settings, const splitter_->restoreGeometry(settings->value(prefix + "/SplitterGeometry") .toByteArray()); sidePanel_->restoreState(settings, prefix + "/SideBar"); + setSize(pClass_->size()); + if (settings->value(prefix + "/CompactMode").toBool()) + switchToCompactMode(true); + else + switchToEnoughtSizeMode(true); } diff --git a/src/shared/docbookviewer/docbookview_impl.h b/src/shared/docbookviewer/docbookview_impl.h index f49982ed..865e2b8c 100644 --- a/src/shared/docbookviewer/docbookview_impl.h +++ b/src/shared/docbookviewer/docbookview_impl.h @@ -11,6 +11,8 @@ #include #include #include +#include +#include namespace DocBookViewer { @@ -43,6 +45,8 @@ public /* methods */: QSize minimumSizeHint() const; QSize sizeHint() const; + bool isSideBarVisible() const; + void createActions(); signals: @@ -51,6 +55,17 @@ signals: public slots: void showAnItem(ModelPtr model); void showPrintDialog(); + void hideSidePanel(); + void showSidePanel(); + void setSize(const QSize & size); + + void switchToCompactMode(bool force=false); + void switchToEnoughtSizeMode(bool force=false); + +private slots: + void updateToggleSideBarButton(); + void handleShowSideBarButton(const QString & action); + private /* fields */: DocBookView* pClass_; @@ -61,8 +76,17 @@ private /* fields */: SidePanel * sidePanel_; ContentView * content_; - QAction* actionToggleNavigationBar_; - QAction* actionShowPrintDialog_; + QAction * actionToggleNavigationBar_; + QAction * actionShowPrintDialog_; + + QLabel * toggleSideBar_; + QWidget * enoughtSizeContainer_; + QWidget * smallSizeContainer_; + QWidget * filler_; + QWidget * background_; + QStackedWidget * splitterRightWidget_; + + bool compactModeFlag_; }; diff --git a/src/shared/docbookviewer/sidepanel.ui b/src/shared/docbookviewer/sidepanel.ui index a3ff64d3..7d05ff83 100644 --- a/src/shared/docbookviewer/sidepanel.ui +++ b/src/shared/docbookviewer/sidepanel.ui @@ -6,13 +6,19 @@ 0 0 - 300 - 480 + 200 + 261 + + + 0 + 0 + + - 250 + 200 0 @@ -20,38 +26,45 @@ Form + + 0 + 0 - - - - - - true - + 0 - - + + 0 + + + + + + 10 + + - Contents + Examples true - - true - - - + + + + + 10 + + - Algorithms + Tables true @@ -59,25 +72,51 @@ - + + + + 10 + + - Examples + Contents true + + true + - + + + + 10 + + - Tables + Algorithms true + + + + + 0 + 28 + + + + + + + @@ -85,6 +124,12 @@ + + 0 + + + 0 + @@ -104,6 +149,9 @@ + + 10 + true @@ -118,6 +166,12 @@ + + 0 + + + 0 + @@ -137,6 +191,9 @@ + + 10 + false @@ -151,6 +208,12 @@ + + 0 + + + 0 + @@ -170,6 +233,9 @@ + + 10 + true @@ -184,6 +250,12 @@ + + 0 + + + 0 + @@ -203,6 +275,9 @@ + + 10 + true -- GitLab