/* * Copyright 2008 Jason A. Donenfeld */ #include "AutoSizingList.h" #include "CollectionModel.h" #include "CollectionFilter.h" #include #include AutoSizingList::AutoSizingList(QWidget *parent) : QTreeView(parent) , m_suggestedRatio1(0) , m_suggestedRatio2(0) , m_suggestedRatio3(0) , m_childWidget(0) { setUniformRowHeights(true); setDragEnabled(true); setDragDropMode(QAbstractItemView::DragOnly); setRootIsDecorated(false); setAllColumnsShowFocus(true); setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionMode(QAbstractItemView::ExtendedSelection); header()->setResizeMode(QHeaderView::Fixed); } void AutoSizingList::rowChange() { CollectionFilter *filter = qobject_cast(model()); if(filter && filter->rowCount() == 0) return; header()->setStretchLastSection(false); CollectionModel *collectionModel = 0; if(filter) collectionModel = qobject_cast(filter->sourceModel()); if(collectionModel) collectionModel->setFakeBoldState(true); double suggestedWidth0 = qMin(sizeHintForColumn(0), 70); setColumnWidth(0, suggestedWidth0); double suggestedWidth1 = sizeHintForColumn(1); double suggestedWidth2 = sizeHintForColumn(2); double suggestedWidth3 = sizeHintForColumn(3); if(collectionModel) collectionModel->setFakeBoldState(false); header()->setStretchLastSection(true); double suggestedWidthTotal = suggestedWidth0 + suggestedWidth1 + suggestedWidth2 + suggestedWidth3; m_suggestedRatio1 = (double)suggestedWidth1 / (double)suggestedWidthTotal; m_suggestedRatio2 = (double)suggestedWidth2 / (double)suggestedWidthTotal; m_suggestedRatio3 = (double)suggestedWidth3 / (double)suggestedWidthTotal; bool b; double remain; #define DELTA .000000001 #define MAX (.42 - DELTA) do { b = false; if(m_suggestedRatio1 > MAX + DELTA) { remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX; m_suggestedRatio1 = MAX; m_suggestedRatio2 = (m_suggestedRatio2 / (m_suggestedRatio2 + m_suggestedRatio3)) * remain; m_suggestedRatio3 = (m_suggestedRatio3 / (m_suggestedRatio2 + m_suggestedRatio3)) * remain; b = true; } if(m_suggestedRatio2 > MAX + DELTA) { remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX; m_suggestedRatio2 = MAX; m_suggestedRatio1 = (m_suggestedRatio1 / (m_suggestedRatio1 + m_suggestedRatio3)) * remain; m_suggestedRatio3 = (m_suggestedRatio3 / (m_suggestedRatio1 + m_suggestedRatio3)) * remain; b = true; } if(m_suggestedRatio3 > MAX + DELTA) { remain = m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3 - MAX; m_suggestedRatio3 = MAX; m_suggestedRatio2 = (m_suggestedRatio2 / (m_suggestedRatio2 + m_suggestedRatio1)) * remain; m_suggestedRatio1 = (m_suggestedRatio1 / (m_suggestedRatio2 + m_suggestedRatio1)) * remain; b = true; } } while(b); #undef DELTA #undef MAX fixColumnSizes(); } void AutoSizingList::fixColumnSizes() { if(m_suggestedRatio1 + m_suggestedRatio2 + m_suggestedRatio3) { int width = viewport()->width() - 40; //HACK: Why not 0? setColumnWidth(1, m_suggestedRatio1 * width); setColumnWidth(2, m_suggestedRatio2 * width); setColumnWidth(3, m_suggestedRatio3 * width); } /*QModelIndexList indexes = selectedIndexes(); if(indexes.count() > 0 && indexes[0].isValid()) scrollTo(indexes[0], QAbstractItemView::PositionAtCenter); else { CollectionFilter *filter = qobject_cast(model()); if(filter) { QModelIndex index = filter->currentItem(); if(index.isValid()) scrollTo(filter->mapFromSource(index), QAbstractItemView::PositionAtCenter); } }*/ } void AutoSizingList::resizeEvent(QResizeEvent *event) { QWidget::resizeEvent(event); fixColumnSizes(); if(m_childWidget) { QRect rect = viewport()->geometry(); rect.setHeight(rect.height() - (int)(m_childWidget->sizeHint().height() * .5)); m_childWidget->setGeometry(rect); } } void AutoSizingList::setChildWidget(QWidget *child) { m_childWidget = child; child->setParent(this); } void AutoSizingList::setModel(CollectionFilter *model) { connect(model, SIGNAL(filterChanged()), this, SLOT(rowChange())); QTreeView::setModel(model); rowChange(); }