feat: 添加ElaWidgetTool库
This commit is contained in:
185
ElaWidgetTools/DeveloperComponents/ElaNavigationView.cpp
Normal file
185
ElaWidgetTools/DeveloperComponents/ElaNavigationView.cpp
Normal file
@@ -0,0 +1,185 @@
|
||||
#include "ElaNavigationView.h"
|
||||
|
||||
#include <QDebug>
|
||||
#include <QHeaderView>
|
||||
#include <QModelIndex>
|
||||
#include <QMouseEvent>
|
||||
#include <QPainter>
|
||||
#include <QScrollBar>
|
||||
#include <QScroller>
|
||||
|
||||
#include "ElaMenu.h"
|
||||
#include "ElaNavigationModel.h"
|
||||
#include "ElaNavigationNode.h"
|
||||
#include "ElaNavigationStyle.h"
|
||||
#include "ElaScrollBar.h"
|
||||
#include "ElaToolTip.h"
|
||||
ElaNavigationView::ElaNavigationView(QWidget* parent)
|
||||
: QTreeView(parent)
|
||||
{
|
||||
setObjectName("ElaNavigationView");
|
||||
setStyleSheet("#ElaNavigationView{background-color:transparent;}");
|
||||
setAnimated(true);
|
||||
setHeaderHidden(true);
|
||||
setRootIsDecorated(false);
|
||||
setExpandsOnDoubleClick(false);
|
||||
setAutoScroll(false);
|
||||
setMouseTracking(true);
|
||||
setSelectionMode(QAbstractItemView::NoSelection);
|
||||
|
||||
// 滚动条设置
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
|
||||
ElaScrollBar* vScrollBar = new ElaScrollBar(this);
|
||||
connect(vScrollBar, &ElaScrollBar::rangeAnimationFinished, this, [=]() {
|
||||
doItemsLayout();
|
||||
});
|
||||
setVerticalScrollBar(vScrollBar);
|
||||
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||
ElaScrollBar* floatVScrollBar = new ElaScrollBar(vScrollBar, this);
|
||||
floatVScrollBar->setIsAnimation(true);
|
||||
floatVScrollBar->installEventFilter(this);
|
||||
|
||||
_navigationStyle = new ElaNavigationStyle(this->style());
|
||||
_navigationStyle->setNavigationView(this);
|
||||
setStyle(_navigationStyle);
|
||||
|
||||
QScroller::grabGesture(this->viewport(), QScroller::LeftMouseButtonGesture);
|
||||
QScroller* scroller = QScroller::scroller(this->viewport());
|
||||
QScrollerProperties properties = scroller->scrollerProperties();
|
||||
properties.setScrollMetric(QScrollerProperties::MousePressEventDelay, 0);
|
||||
properties.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
|
||||
properties.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOn);
|
||||
properties.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.35);
|
||||
properties.setScrollMetric(QScrollerProperties::OvershootScrollTime, 0.5);
|
||||
properties.setScrollMetric(QScrollerProperties::FrameRate, QScrollerProperties::Fps60);
|
||||
scroller->setScrollerProperties(properties);
|
||||
|
||||
connect(scroller, &QScroller::stateChanged, this, [=](QScroller::State newstate) {
|
||||
if (newstate == QScroller::Pressed)
|
||||
{
|
||||
_navigationStyle->setPressIndex(indexAt(mapFromGlobal(QCursor::pos())));
|
||||
viewport()->update();
|
||||
}
|
||||
else if (newstate == QScroller::Scrolling || newstate == QScroller::Inactive)
|
||||
{
|
||||
_navigationStyle->setPressIndex(QModelIndex());
|
||||
}
|
||||
});
|
||||
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, &ElaNavigationView::customContextMenuRequested, this, &ElaNavigationView::onCustomContextMenuRequested);
|
||||
|
||||
_compactToolTip = new ElaToolTip(this);
|
||||
}
|
||||
|
||||
ElaNavigationView::~ElaNavigationView()
|
||||
{
|
||||
}
|
||||
|
||||
void ElaNavigationView::navigationNodeStateChange(QVariantMap data)
|
||||
{
|
||||
this->_navigationStyle->navigationNodeStateChange(data);
|
||||
}
|
||||
|
||||
void ElaNavigationView::onCustomContextMenuRequested(const QPoint& pos)
|
||||
{
|
||||
if (!_pNavigationBarPrivate->_pIsAllowPageOpenInNewWindow)
|
||||
{
|
||||
return;
|
||||
}
|
||||
QModelIndex posIndex = indexAt(pos);
|
||||
if (!posIndex.isValid())
|
||||
{
|
||||
return;
|
||||
}
|
||||
ElaNavigationNode* posNode = static_cast<ElaNavigationNode*>(posIndex.internalPointer());
|
||||
if (!posNode->getIsExpanderNode())
|
||||
{
|
||||
ElaMenu menu;
|
||||
menu.setMenuItemHeight(27);
|
||||
QAction* openAction = menu.addElaIconAction(ElaIconType::ObjectGroup, "在新窗口中打开");
|
||||
connect(openAction, &QAction::triggered, this, [=]() {
|
||||
Q_EMIT navigationOpenNewWindow(posNode->getNodeKey());
|
||||
});
|
||||
menu.exec(mapToGlobal(pos));
|
||||
}
|
||||
}
|
||||
|
||||
void ElaNavigationView::mouseMoveEvent(QMouseEvent* event)
|
||||
{
|
||||
if (_pNavigationBarPrivate->_currentDisplayMode == ElaNavigationType::NavigationDisplayMode::Compact)
|
||||
{
|
||||
QModelIndex posIndex = indexAt(event->pos());
|
||||
if (!posIndex.isValid())
|
||||
{
|
||||
_compactToolTip->hide();
|
||||
return;
|
||||
}
|
||||
ElaNavigationNode* posNode = static_cast<ElaNavigationNode*>(posIndex.internalPointer());
|
||||
_compactToolTip->setToolTip(posNode->getNodeTitle());
|
||||
_compactToolTip->updatePos();
|
||||
_compactToolTip->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
_compactToolTip->hide();
|
||||
}
|
||||
QTreeView::mouseMoveEvent(event);
|
||||
}
|
||||
|
||||
void ElaNavigationView::mouseDoubleClickEvent(QMouseEvent* event)
|
||||
{
|
||||
_navigationStyle->setPressIndex(indexAt(event->pos()));
|
||||
viewport()->update();
|
||||
QTreeView::mouseDoubleClickEvent(event);
|
||||
}
|
||||
|
||||
void ElaNavigationView::mouseReleaseEvent(QMouseEvent* event)
|
||||
{
|
||||
QTreeView::mouseReleaseEvent(event);
|
||||
if (event->button() == Qt::LeftButton)
|
||||
{
|
||||
QModelIndex index = indexAt(event->pos());
|
||||
if (index.isValid())
|
||||
{
|
||||
Q_EMIT navigationClicked(index);
|
||||
}
|
||||
_navigationStyle->setPressIndex(QModelIndex());
|
||||
}
|
||||
}
|
||||
|
||||
bool ElaNavigationView::eventFilter(QObject* watched, QEvent* event)
|
||||
{
|
||||
switch (event->type())
|
||||
{
|
||||
case QEvent::MouseMove:
|
||||
case QEvent::HoverMove:
|
||||
{
|
||||
if (_pNavigationBarPrivate->_currentDisplayMode == ElaNavigationType::NavigationDisplayMode::Compact)
|
||||
{
|
||||
QModelIndex posIndex = indexAt(mapFromGlobal(QCursor::pos()));
|
||||
if (!posIndex.isValid())
|
||||
{
|
||||
_compactToolTip->hide();
|
||||
break;
|
||||
}
|
||||
ElaNavigationNode* posNode = static_cast<ElaNavigationNode*>(posIndex.internalPointer());
|
||||
_compactToolTip->setToolTip(posNode->getNodeTitle());
|
||||
_compactToolTip->updatePos();
|
||||
_compactToolTip->show();
|
||||
}
|
||||
else
|
||||
{
|
||||
_compactToolTip->hide();
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QAbstractItemView::eventFilter(watched, event);
|
||||
}
|
||||
Reference in New Issue
Block a user