#ifndef NAVIGATIONMODEWRAPPER_H #define NAVIGATIONMODEWRAPPER_H #include "navigationmode.h" #include #include #include #include #include "listwidget.h" #include "treewidget.h" namespace vnotex { template class NavigationModeWrapper : public NavigationMode { public: NavigationModeWrapper(T *p_widget); // NavigationMode. protected: QVector getVisibleNavigationItems() Q_DECL_OVERRIDE; void placeNavigationLabel(int p_idx, void *p_item, QLabel *p_label) Q_DECL_OVERRIDE; void handleTargetHit(void *p_item) Q_DECL_OVERRIDE; private: QVector getVisibleItems() const { return QVector(); } T *m_widget = nullptr; }; template NavigationModeWrapper::NavigationModeWrapper(T *p_widget) : NavigationMode(NavigationMode::Type::DoubleKeys, p_widget), m_widget(p_widget) { } template QVector NavigationModeWrapper::getVisibleNavigationItems() { QVector items; auto rawItems = getVisibleItems(); items.reserve(rawItems.size()); for (auto it : rawItems) { items.push_back(it); } return items; } template void NavigationModeWrapper::placeNavigationLabel(int p_idx, void *p_item, QLabel *p_label) { Q_UNUSED(p_idx); Q_ASSERT(p_item); int extraWidth = p_label->width() + 2; auto vbar = m_widget->verticalScrollBar(); if (vbar && vbar->minimum() != vbar->maximum()) { extraWidth += vbar->width(); } auto item = static_cast(p_item); const auto rt = m_widget->visualItemRect(item); const int x = rt.x() + m_widget->width() - extraWidth; const int y = rt.y(); p_label->move(x, y); } template void NavigationModeWrapper::handleTargetHit(void *p_item) { Q_ASSERT(p_item); auto item = static_cast(p_item); m_widget->setCurrentItem(item); m_widget->setFocus(); } template <> inline QVector NavigationModeWrapper::getVisibleItems() const { return TreeWidget::getVisibleItems(m_widget); } template <> inline QVector NavigationModeWrapper::getVisibleItems() const { return ListWidget::getVisibleItems(m_widget); } } #endif // NAVIGATIONMODEWRAPPER_H