From 9e8b7d5b37d985c73531f8f536728c3fa217d073 Mon Sep 17 00:00:00 2001 From: Lukáš Lalinský Date: Fri, 27 Mar 2009 00:07:16 +0100 Subject: Show the data type column as an editable combo box --- src/items/database/columnlistmodel.h | 9 +++++ src/items/database/columnlistview.cpp | 28 +++++++++++++++ src/utils/comboboxdelegate.cpp | 67 +++++++++++++++++++++++++++++++++++ src/utils/comboboxdelegate.h | 42 ++++++++++++++++++++++ src/utils/utils.pri | 6 +++- 5 files changed, 151 insertions(+), 1 deletion(-) create mode 100644 src/utils/comboboxdelegate.cpp create mode 100644 src/utils/comboboxdelegate.h diff --git a/src/items/database/columnlistmodel.h b/src/items/database/columnlistmodel.h index 61b1047..ce4cd25 100644 --- a/src/items/database/columnlistmodel.h +++ b/src/items/database/columnlistmodel.h @@ -26,6 +26,15 @@ class ColumnListModel : public QAbstractTableModel Q_OBJECT public: + + enum ColumnType { + NameColumn = 0, + TypeColumn, + RequiredColumn, + PrimaryKeyColumn, + NotesColumn, + }; + ColumnListModel(QObject *parent = 0); ColumnList *columnList() const { return m_columnList; } diff --git a/src/items/database/columnlistview.cpp b/src/items/database/columnlistview.cpp index cbfb4b9..8256123 100644 --- a/src/items/database/columnlistview.cpp +++ b/src/items/database/columnlistview.cpp @@ -19,6 +19,7 @@ #include "columnlistview.h" #include "databasecommands.h" #include "diagramdocument.h" +#include "utils/comboboxdelegate.h" ColumnListView::ColumnListView(QWidget *parent) : QTreeView(parent) @@ -27,6 +28,33 @@ ColumnListView::ColumnListView(QWidget *parent) setItemsExpandable(false); setExpandsOnDoubleClick(false); setModel(new ColumnListModel(this)); + ComboBoxDelegate *delegate = new ComboBoxDelegate(this); + delegate->setEditable(true); + // FIXME postgresql specific, not a complete list + delegate->setOptions(QStringList() + << "BIGINT" + << "BIGSERIAL" + << "BIT(n)" + << "VARBIT(n)" + << "BOOLEAN" + << "VARCHAR(n)" + << "CHAR(n)" + << "DATE" + << "INTEGER" + << "MONEY" + << "NUMERIC(p,s)" + << "REAL" + << "SMALLINT" + << "SERIAL" + << "TEXT" + << "TIME" + << "TIME WITH TIME ZONE" + << "TIMESTAMP" + << "TIMESTAMP WITH TIME ZONE" + << "UUID" + << "XML" + ); + setItemDelegateForColumn(ColumnListModel::TypeColumn, delegate); } void diff --git a/src/utils/comboboxdelegate.cpp b/src/utils/comboboxdelegate.cpp new file mode 100644 index 0000000..ae3ca41 --- /dev/null +++ b/src/utils/comboboxdelegate.cpp @@ -0,0 +1,67 @@ +// Copyright (C) 2009 Lukas Lalinsky +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +#include +#include "comboboxdelegate.h" + +ComboBoxDelegate::ComboBoxDelegate(QObject *parent) + : QItemDelegate(parent), m_editable(false) +{ +} + +void +ComboBoxDelegate::setOptions(const QStringList &options) +{ + m_options = options; +} + +void +ComboBoxDelegate::setEditable(bool editable) +{ + m_editable = editable; +} + +QWidget * +ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */, const QModelIndex &/* index */) const +{ + QComboBox *editor = new QComboBox(parent); + if (m_editable) + editor->setEditable(m_editable); + editor->addItems(m_options); + return editor; +} + +void +ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const +{ + QComboBox *comboBox = qobject_cast(editor); + QString value = index.model()->data(index, Qt::EditRole).toString(); + // FIXME assumes that editable==true + comboBox->setEditText(value); +} + +void +ComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const +{ + QComboBox *comboBox = qobject_cast(editor); + model->setData(index, comboBox->currentText()); +} + +void +ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &/* index */) const +{ + editor->setGeometry(option.rect); +} diff --git a/src/utils/comboboxdelegate.h b/src/utils/comboboxdelegate.h new file mode 100644 index 0000000..85cc609 --- /dev/null +++ b/src/utils/comboboxdelegate.h @@ -0,0 +1,42 @@ +// Copyright (C) 2009 Lukas Lalinsky +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +#ifndef UTILS_COMBOBOXDELEGATE_H +#define UTILS_COMBOBOXDELEGATE_H + +#include + +class ComboBoxDelegate : public QItemDelegate +{ + Q_OBJECT + +public: + ComboBoxDelegate(QObject *parent = 0); + + void setOptions(const QStringList &options); + void setEditable(bool editable); + + QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; + void setEditorData(QWidget *editor, const QModelIndex &index) const; + void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const; + void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const; + +protected: + QStringList m_options; + bool m_editable; +}; + +#endif diff --git a/src/utils/utils.pri b/src/utils/utils.pri index d8ce23e..46db201 100644 --- a/src/utils/utils.pri +++ b/src/utils/utils.pri @@ -5,4 +5,8 @@ include(iconloader/iconloader.pri) HEADERS += \ factory.h \ range.h \ - singelton.h + singelton.h \ + comboboxdelegate.h + +SOURCES += \ + comboboxdelegate.cpp -- cgit v1.2.3-54-g00ecf