1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
/*
SPDX-FileCopyrightText: 2008 Vladimir Prus <ghost@cs.msu.su>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "treeview.h"
#include "treemodel.h"
#include <QGuiApplication>
#include <QScreen>
using namespace KDevelop;
AsyncTreeView::AsyncTreeView(TreeModel& treeModel, QWidget* parent)
: QTreeView(parent)
, m_treeModel(treeModel)
, m_autoResizeColumns(true)
{
connect (this, &AsyncTreeView::expanded,
this, &AsyncTreeView::slotExpanded);
connect (this, &AsyncTreeView::collapsed,
this, &AsyncTreeView::slotCollapsed);
connect (this, &AsyncTreeView::clicked,
this, &AsyncTreeView::slotClicked);
connect(&m_treeModel, &TreeModel::itemChildrenReady, this, &AsyncTreeView::slotExpandedDataReady);
}
void AsyncTreeView::slotExpanded(const QModelIndex &index)
{
m_treeModel.expanded(mapViewIndexToTreeModelIndex(index));
}
void AsyncTreeView::slotCollapsed(const QModelIndex &index)
{
m_treeModel.collapsed(mapViewIndexToTreeModelIndex(index));
resizeColumnsAutomatically();
}
void AsyncTreeView::slotClicked(const QModelIndex &index)
{
m_treeModel.clicked(mapViewIndexToTreeModelIndex(index));
resizeColumnsAutomatically();
}
QSize AsyncTreeView::sizeHint() const
{
//Assuming that columns are always resized to fit their contents, return a size that will fit all without a scrollbar
QMargins margins = contentsMargins();
int horizontalSize = margins.left() + margins.right();
for (int i = 0; i < model()->columnCount(); ++i) {
horizontalSize += columnWidth(i);
}
horizontalSize = qMin(horizontalSize, QGuiApplication::primaryScreen()->geometry().width()*3/4);
return QSize(horizontalSize, margins.top() + margins.bottom() + sizeHintForRow(0));
}
void AsyncTreeView::resizeColumns()
{
for (int i = 0; i < model()->columnCount(); ++i) {
this->resizeColumnToContents(i);
}
this->updateGeometry();
}
void AsyncTreeView::setAutoResizeColumns(bool on)
{
m_autoResizeColumns = on;
resizeColumnsAutomatically();
}
TreeModel& AsyncTreeView::treeModel()
{
return m_treeModel;
}
void AsyncTreeView::slotExpandedDataReady()
{
resizeColumnsAutomatically();
}
QModelIndex AsyncTreeView::mapViewIndexToTreeModelIndex(const QModelIndex& viewIndex) const
{
return viewIndex;
}
void AsyncTreeView::resizeColumnsAutomatically()
{
if (m_autoResizeColumns) {
resizeColumns();
}
}
#include "moc_treeview.cpp"
|