Index: plugins/projectmanagerview/projectmanagerview.cpp =================================================================== --- plugins/projectmanagerview/projectmanagerview.cpp +++ plugins/projectmanagerview/projectmanagerview.cpp @@ -140,6 +140,7 @@ // Need to set this to get horizontal scrollbar. Also needs to be done after // the setModel call m_ui->projectTreeView->header()->setSectionResizeMode( QHeaderView::ResizeToContents ); + m_ui->projectTreeView->header()->setStretchLastSection(false); } bool ProjectManagerView::eventFilter(QObject* obj, QEvent* event) Index: plugins/projectmanagerview/projectmanagerview.ui =================================================================== --- plugins/projectmanagerview/projectmanagerview.ui +++ plugins/projectmanagerview/projectmanagerview.ui @@ -17,7 +17,16 @@ Project Manager - + + 0 + + + 0 + + + 0 + + 0 @@ -38,6 +47,12 @@ Project Overview + + QAbstractScrollArea::AdjustToContents + + + Qt::ElideNone + false Index: plugins/projectmanagerview/projectmodelitemdelegate.cpp =================================================================== --- plugins/projectmanagerview/projectmodelitemdelegate.cpp +++ plugins/projectmanagerview/projectmodelitemdelegate.cpp @@ -113,7 +113,7 @@ void ProjectModelItemDelegate::drawBranchName(QPainter* painter, const QStyleOptionViewItem& option, const QRect& rect, const QString& branchName) const { - QString text = option.fontMetrics.elidedText(branchName, Qt::ElideRight, rect.width()); + QString text = option.fontMetrics.elidedText(branchName, Qt::ElideNone, rect.width()); bool selected = option.state & QStyle::State_Selected; QPalette::ColorGroup colorGroup = selected ? QPalette::Active : QPalette::Disabled; @@ -156,5 +156,5 @@ } QFontMetrics fm(painter->fontMetrics()); - painter->drawText(rect, fm.elidedText(text, Qt::ElideRight, rect.width())); + painter->drawText(rect, fm.elidedText(text, Qt::ElideNone, rect.width())); } Index: plugins/projectmanagerview/projecttreeview.h =================================================================== --- plugins/projectmanagerview/projecttreeview.h +++ plugins/projectmanagerview/projecttreeview.h @@ -69,7 +69,9 @@ protected: void keyPressEvent(QKeyEvent *event) override; + void resizeEvent(QResizeEvent *event) override; void dropEvent(QDropEvent* event) override; + bool eventFilter(QObject*, QEvent*) override; void drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const override; private: @@ -81,6 +83,7 @@ QPointer m_previousSelection; QPointer m_tooltip; QPersistentModelIndex m_idx; + bool m_isCocoa; }; #endif // KDEVPLATFORM_PLUGIN_PROJECTTREEVIEW_H Index: plugins/projectmanagerview/projecttreeview.cpp =================================================================== --- plugins/projectmanagerview/projecttreeview.cpp +++ plugins/projectmanagerview/projecttreeview.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -114,6 +115,9 @@ ProjectTreeView::ProjectTreeView( QWidget *parent ) : QTreeView( parent ), m_previousSelection ( nullptr ) +#ifdef Q_OS_MACOS + , m_isCocoa(QGuiApplication::platformName() == QStringLiteral("cocoa")) +#endif { header()->hide(); @@ -130,6 +134,8 @@ setAutoExpandDelay(300); setItemDelegate(new ProjectModelItemDelegate(this)); + setTextElideMode(Qt::ElideNone); + connect( this, &ProjectTreeView::customContextMenuRequested, this, &ProjectTreeView::popupContextMenu ); connect( this, &ProjectTreeView::activated, this, &ProjectTreeView::slotActivated ); @@ -139,6 +145,10 @@ this, &ProjectTreeView::restoreState ); connect( ICore::self()->projectController(), &IProjectController::projectClosed, this, &ProjectTreeView::projectClosed ); + + // install the event filter that will filter out the horizontal component + // from scrolling in response to QWheelEvents (i.e. touch input) + viewport()->installEventFilter(this); } ProjectTreeView::~ProjectTreeView() @@ -511,6 +521,43 @@ QTreeView::keyPressEvent(event); } +void ProjectTreeView::resizeEvent(QResizeEvent* event) +{ + header()->setMinimumSectionSize(viewport()->width()); + QTreeView::resizeEvent(event); +} + +bool ProjectTreeView::eventFilter(QObject* object, QEvent* event) +{ + switch (event->type()) { + case QEvent::Wheel: { + QWheelEvent *e = static_cast(event); + if ((e->pixelDelta().x() !=0 || e->angleDelta().x()!= 0 + || e->orientation() == Qt::Orientation::Horizontal) +#ifdef Q_OS_MACOS + // Cocoa: allow horizontal scrolling controlled by a physical mouse wheel + && (!m_isCocoa || e->source() != Qt::MouseEventNotSynthesized) +#endif + ){ + QPoint pixelDelta(e->pixelDelta()), angleDelta(e->angleDelta()); + pixelDelta.setX(0); + angleDelta.setX(0); + // discard the original event + e->ignore(); + if (!pixelDelta.isNull() || !angleDelta.isNull()) { + QWheelEvent filtered(e->posF(), e->globalPosF(), pixelDelta, angleDelta, + e->delta(), Qt::Orientation::Vertical, e->buttons(), + e->modifiers(), e->phase(), Qt::MouseEventSynthesizedByApplication, e->inverted()); + QCoreApplication::sendEvent(object, &filtered); + } + return true; + } + break; + } + } + return QTreeView::eventFilter(object, event); +} + void ProjectTreeView::drawBranches(QPainter* painter, const QRect& rect, const QModelIndex& index) const { if (WidgetColorizer::colorizeByProject()) {