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
|
/*
SPDX-FileCopyrightText: 2008 Vladimir Prus <ghost@cs.msu.su>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "treeview.h"
#include "treemodel.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QScreen>
#include <QSortFilterProxyModel>
using namespace KDevelop;
AsyncTreeView::AsyncTreeView(TreeModel* model, QSortFilterProxyModel *proxy, QWidget *parent = nullptr)
: QTreeView(parent)
, m_proxy(proxy)
{
connect (this, &AsyncTreeView::expanded,
this, &AsyncTreeView::slotExpanded);
connect (this, &AsyncTreeView::collapsed,
this, &AsyncTreeView::slotCollapsed);
connect (this, &AsyncTreeView::clicked,
this, &AsyncTreeView::slotClicked);
connect (model, &TreeModel::itemChildrenReady,
this, &AsyncTreeView::slotExpandedDataReady);
}
void AsyncTreeView::slotExpanded(const QModelIndex &index)
{
static_cast<TreeModel*>(model())->expanded(m_proxy->mapToSource(index));
}
void AsyncTreeView::slotCollapsed(const QModelIndex &index)
{
static_cast<TreeModel*>(model())->collapsed(m_proxy->mapToSource(index));
resizeColumns();
}
void AsyncTreeView::slotClicked(const QModelIndex &index)
{
static_cast<TreeModel*>(model())->clicked(m_proxy->mapToSource(index));
resizeColumns();
}
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::slotExpandedDataReady()
{
resizeColumns();
}
|