aboutsummaryrefslogtreecommitdiffstats
path: root/desktop-widgets/tableview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'desktop-widgets/tableview.cpp')
-rw-r--r--desktop-widgets/tableview.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/desktop-widgets/tableview.cpp b/desktop-widgets/tableview.cpp
new file mode 100644
index 000000000..40d5199ec
--- /dev/null
+++ b/desktop-widgets/tableview.cpp
@@ -0,0 +1,145 @@
+#include "tableview.h"
+#include "modeldelegates.h"
+
+#include <QPushButton>
+#include <QSettings>
+
+TableView::TableView(QWidget *parent) : QGroupBox(parent)
+{
+ ui.setupUi(this);
+ ui.tableView->setItemDelegate(new DiveListDelegate(this));
+
+ QFontMetrics fm(defaultModelFont());
+ int text_ht = fm.height();
+
+ metrics.icon = &defaultIconMetrics();
+
+ metrics.rm_col_width = metrics.icon->sz_small + 2*metrics.icon->spacing;
+ metrics.header_ht = text_ht + 10; // TODO DPI
+
+ /* We want to get rid of the margin around the table, but
+ * we must be careful with some styles (e.g. GTK+) where the top
+ * margin is actually used to hold the label. We thus check the
+ * rectangles for the label and contents to make sure they do not
+ * overlap, and adjust the top contentsMargin accordingly
+ */
+
+ // start by setting all the margins at zero
+ QMargins margins;
+
+ // grab the label and contents dimensions and positions
+ QStyleOptionGroupBox option;
+ initStyleOption(&option);
+ QRect labelRect = style()->subControlRect(QStyle::CC_GroupBox, &option, QStyle::SC_GroupBoxLabel, this);
+ QRect contentsRect = style()->subControlRect(QStyle::CC_GroupBox, &option, QStyle::SC_GroupBoxContents, this);
+
+ /* we need to ensure that the bottom of the label is higher
+ * than the top of the contents */
+ int delta = contentsRect.top() - labelRect.bottom();
+ const int min_gap = metrics.icon->spacing;
+ if (delta <= min_gap) {
+ margins.setTop(min_gap - delta);
+ }
+ layout()->setContentsMargins(margins);
+
+ QIcon plusIcon(":plus");
+ plusBtn = new QPushButton(plusIcon, QString(), this);
+ plusBtn->setFlat(true);
+
+ /* now determine the icon and button size. Since the button will be
+ * placed in the label, make sure that we do not overflow, as it might
+ * get clipped
+ */
+ int iconSize = metrics.icon->sz_small;
+ int btnSize = iconSize + 2*min_gap;
+ if (btnSize > labelRect.height()) {
+ btnSize = labelRect.height();
+ iconSize = btnSize - 2*min_gap;
+ }
+ plusBtn->setIconSize(QSize(iconSize, iconSize));
+ plusBtn->resize(btnSize, btnSize);
+ connect(plusBtn, SIGNAL(clicked(bool)), this, SIGNAL(addButtonClicked()));
+}
+
+TableView::~TableView()
+{
+ QSettings s;
+ s.beginGroup(objectName());
+ // remove the old default
+ bool oldDefault = (ui.tableView->columnWidth(0) == 30);
+ for (int i = 1; oldDefault && i < ui.tableView->model()->columnCount(); i++) {
+ if (ui.tableView->columnWidth(i) != 80)
+ oldDefault = false;
+ }
+ if (oldDefault) {
+ s.remove("");
+ } else {
+ for (int i = 0; i < ui.tableView->model()->columnCount(); i++) {
+ if (ui.tableView->columnWidth(i) == defaultColumnWidth(i))
+ s.remove(QString("colwidth%1").arg(i));
+ else
+ s.setValue(QString("colwidth%1").arg(i), ui.tableView->columnWidth(i));
+ }
+ }
+ s.endGroup();
+}
+
+void TableView::setBtnToolTip(const QString &tooltip)
+{
+ plusBtn->setToolTip(tooltip);
+}
+
+void TableView::setModel(QAbstractItemModel *model)
+{
+ ui.tableView->setModel(model);
+ connect(ui.tableView, SIGNAL(clicked(QModelIndex)), model, SLOT(remove(QModelIndex)));
+
+ QSettings s;
+ s.beginGroup(objectName());
+ const int columnCount = ui.tableView->model()->columnCount();
+ for (int i = 0; i < columnCount; i++) {
+ QVariant width = s.value(QString("colwidth%1").arg(i), defaultColumnWidth(i));
+ ui.tableView->setColumnWidth(i, width.toInt());
+ }
+ s.endGroup();
+
+ ui.tableView->horizontalHeader()->setMinimumHeight(metrics.header_ht);
+}
+
+void TableView::fixPlusPosition()
+{
+ QStyleOptionGroupBox option;
+ initStyleOption(&option);
+ QRect labelRect = style()->subControlRect(QStyle::CC_GroupBox, &option, QStyle::SC_GroupBoxLabel, this);
+ QRect contentsRect = style()->subControlRect(QStyle::CC_GroupBox, &option, QStyle::QStyle::SC_GroupBoxFrame, this);
+ plusBtn->setGeometry( contentsRect.width() - plusBtn->width(), labelRect.y(), plusBtn->width(), labelRect.height());
+}
+
+// We need to manually position the 'plus' on cylinder and weight.
+void TableView::resizeEvent(QResizeEvent *event)
+{
+ fixPlusPosition();
+ QWidget::resizeEvent(event);
+}
+
+void TableView::showEvent(QShowEvent *event)
+{
+ QWidget::showEvent(event);
+ fixPlusPosition();
+}
+
+void TableView::edit(const QModelIndex &index)
+{
+ ui.tableView->edit(index);
+}
+
+int TableView::defaultColumnWidth(int col)
+{
+ QString text = ui.tableView->model()->headerData(col, Qt::Horizontal).toString();
+ return text.isEmpty() ? metrics.rm_col_width : defaultModelFontMetrics().width(text) + 4; // add small margin
+}
+
+QTableView *TableView::view()
+{
+ return ui.tableView;
+}