summaryrefslogtreecommitdiffstats
path: root/desktop-widgets/divelistview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/divelistview.cpp')
-rw-r--r--desktop-widgets/divelistview.cpp108
1 files changed, 50 insertions, 58 deletions
diff --git a/desktop-widgets/divelistview.cpp b/desktop-widgets/divelistview.cpp
index 5c80813ab..a4be59058 100644
--- a/desktop-widgets/divelistview.cpp
+++ b/desktop-widgets/divelistview.cpp
@@ -26,7 +26,8 @@
#include "core/metrics.h"
DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelection(false), sortColumn(0),
- currentOrder(Qt::DescendingOrder), dontEmitDiveChangedSignal(false), selectionSaved(false)
+ currentOrder(Qt::DescendingOrder), dontEmitDiveChangedSignal(false), selectionSaved(false),
+ initialColumnWidths(DiveTripModel::COLUMNS, 50) // Set up with default length 50
{
setItemDelegate(new DiveListDelegate(this));
setUniformRowHeights(true);
@@ -43,63 +44,15 @@ DiveListView::DiveListView(QWidget *parent) : QTreeView(parent), mouseClickSelec
setSelectionMode(ExtendedSelection);
header()->setContextMenuPolicy(Qt::ActionsContextMenu);
- const QFontMetrics metrics(defaultModelFont());
- int em = metrics.width('m');
- int zw = metrics.width('0');
-
- // Fixes for the layout needed for mac
-#ifdef Q_OS_MAC
- int ht = metrics.height();
- header()->setMinimumHeight(ht + 4);
-#endif
-
- // TODO FIXME we need this to get the header names
- // can we find a smarter way?
- tripModel = new DiveTripModel(this);
-
- // set the default width as a minimum between the hard-coded defaults,
- // the header text width and the (assumed) content width, calculated
- // based on type
- for (int col = DiveTripModel::NR; col < DiveTripModel::COLUMNS; ++col) {
- QString header_txt = tripModel->headerData(col, Qt::Horizontal, Qt::DisplayRole).toString();
- int width = metrics.width(header_txt);
- int sw = 0;
- switch (col) {
- case DiveTripModel::NR:
- case DiveTripModel::DURATION:
- sw = 8*zw;
- break;
- case DiveTripModel::DATE:
- sw = 14*em;
- break;
- case DiveTripModel::RATING:
- sw = static_cast<StarWidgetsDelegate*>(itemDelegateForColumn(col))->starSize().width();
- break;
- case DiveTripModel::SUIT:
- case DiveTripModel::SAC:
- sw = 7*em;
- break;
- case DiveTripModel::PHOTOS:
- sw = 5*em;
- break;
- case DiveTripModel::LOCATION:
- sw = 50*em;
- break;
- default:
- sw = 5*em;
- }
- if (sw > width)
- width = sw;
- width += zw; // small padding
- if (width > tripModel->columnWidth(col))
- tripModel->setColumnWidth(col, width);
- }
- delete tripModel;
-
-
header()->setStretchLastSection(true);
installEventFilter(this);
+
+ // TODO: We use a dummy DiveTripModel to calculated column widths.
+ // Change this to a global object.
+ DiveTripModel tripModel;
+ for (int i = DiveTripModel::NR; i < DiveTripModel::COLUMNS; i++)
+ calculateInitialColumnWidth(tripModel, i);
}
DiveListView::~DiveListView()
@@ -111,7 +64,7 @@ DiveListView::~DiveListView()
if (isColumnHidden(i))
continue;
// we used to hardcode them all to 100 - so that might still be in the settings
- if (columnWidth(i) == 100 || columnWidth(i) == tripModel->columnWidth(i))
+ if (columnWidth(i) == 100 || columnWidth(i) == initialColumnWidths[i])
settings.remove(QString("colwidth%1").arg(i));
else
settings.setValue(QString("colwidth%1").arg(i), columnWidth(i));
@@ -120,6 +73,45 @@ DiveListView::~DiveListView()
settings.endGroup();
}
+void DiveListView::calculateInitialColumnWidth(const DiveTripModel &tripModel, int col)
+{
+ const QFontMetrics metrics(defaultModelFont());
+ int em = metrics.width('m');
+ int zw = metrics.width('0');
+
+ QString header_txt = tripModel.headerData(col, Qt::Horizontal, Qt::DisplayRole).toString();
+ int width = metrics.width(header_txt);
+ int sw = 0;
+ switch (col) {
+ case DiveTripModel::NR:
+ case DiveTripModel::DURATION:
+ sw = 8*zw;
+ break;
+ case DiveTripModel::DATE:
+ sw = 14*em;
+ break;
+ case DiveTripModel::RATING:
+ sw = static_cast<StarWidgetsDelegate*>(itemDelegateForColumn(col))->starSize().width();
+ break;
+ case DiveTripModel::SUIT:
+ case DiveTripModel::SAC:
+ sw = 7*em;
+ break;
+ case DiveTripModel::PHOTOS:
+ sw = 5*em;
+ break;
+ case DiveTripModel::LOCATION:
+ sw = 50*em;
+ break;
+ default:
+ sw = 5*em;
+ }
+ if (sw > width)
+ width = sw;
+ width += zw; // small padding
+ initialColumnWidths[col] = std::max(initialColumnWidths[col], width);
+}
+
void DiveListView::setupUi()
{
QSettings settings;
@@ -137,7 +129,7 @@ void DiveListView::setupUi()
if (width.isValid())
setColumnWidth(i, width.toInt());
else
- setColumnWidth(i, tripModel->columnWidth(i));
+ setColumnWidth(i, initialColumnWidths[i]);
}
settings.endGroup();
if (firstRun)
@@ -424,7 +416,7 @@ void DiveListView::reload(DiveTripModel::Layout layout, bool forceSort)
QSortFilterProxyModel *m = qobject_cast<QSortFilterProxyModel *>(model());
QAbstractItemModel *oldModel = m->sourceModel();
- tripModel = new DiveTripModel(this);
+ DiveTripModel *tripModel = new DiveTripModel(this);
tripModel->setLayout(layout);
m->setSourceModel(tripModel);