summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2014-05-15 16:22:25 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2014-05-15 16:22:25 +0200
commit920815fe503f809e17b13f1551c71cd6a501483e (patch)
tree467cb315f01da789841dc67ca9188dac389a75eb
parent2f6c50d2764138583dcf89d86b13440a23f217cf (diff)
downloadgeneric-gui-920815fe503f809e17b13f1551c71cd6a501483e.tar.gz
generic-gui-920815fe503f809e17b13f1551c71cd6a501483e.tar.bz2
generic-gui-920815fe503f809e17b13f1551c71cd6a501483e.zip
Moved all the Adapters function to a common base
-rw-r--r--qt_adapter.hpp96
1 files changed, 66 insertions, 30 deletions
diff --git a/qt_adapter.hpp b/qt_adapter.hpp
index 23a8c9f..9a5c383 100644
--- a/qt_adapter.hpp
+++ b/qt_adapter.hpp
@@ -7,6 +7,7 @@
#include <QAbstractTableModel>
#include <QTableView>
+#include <QListView>
#include <QVariant>
#include <memory>
@@ -21,10 +22,27 @@ struct QtModelType
typedef void type;
};
+template <bool singular>
+struct QtVectorModels;
+
+template <>
+struct QtVectorModels<true>
+{
+ typedef QAbstractListModel type;
+};
+
+template <>
+struct QtVectorModels<false>
+{
+ typedef QAbstractTableModel type;
+};
+
template <typename V>
struct QtModelType<std::vector<V>>
{
- typedef QAbstractTableModel type;
+ typedef typename QtVectorModels<
+ friendly_fusion::result_of::size<V>::type::value == 1
+ >::type type;
};
template <typename V>
@@ -62,47 +80,27 @@ struct QtWidget : public T {
}
};
-template <typename Model>
+template <typename T, typename Model>
struct QtAdapterBase : public Model, public FusionModelObserver
{
- virtual void cell_changed(int row, int column) override
- {
- emit this->dataChanged(this->createIndex(row, column), this->createIndex(row, column));
- }
-
- virtual void append_row_begin() override
- {
- this->beginInsertRows(QModelIndex(), this->rowCount(QModelIndex()), this->rowCount(QModelIndex()));
- }
-
- virtual void append_row_end() override
- {
- this->endInsertRows();
- }
-};
-
-template <typename T>
-struct QtAdapter<T, QAbstractTableModel> : public QtAdapterBase<QAbstractTableModel>
-{
- typedef QTableView view;
- typedef QtWidget<view, T> widget;
-
std::shared_ptr<T> model;
- QtAdapter(std::shared_ptr<T> model)
+ QtAdapterBase(std::shared_ptr<T> model)
: model(model)
{}
- virtual int rowCount(QModelIndex const&) const override
- {
- return model->row_count();
- }
+ //ModelInterface
virtual int columnCount(QModelIndex const&) const override
{
return model->column_count();
}
+ virtual int rowCount(QModelIndex const&) const override
+ {
+ return model->row_count();
+ }
+
bool setData(QModelIndex const& index, QVariant const& value, int role) override final
{
if(role != Qt::EditRole) return false;
@@ -116,7 +114,7 @@ struct QtAdapter<T, QAbstractTableModel> : public QtAdapterBase<QAbstractTableMo
{
bool constness = is_const<typename T::row_type>(index.column());
- return QAbstractTableModel::flags(index) | (constness ? Qt::NoItemFlags : Qt::ItemIsEditable);
+ return Model::flags(index) | (constness ? Qt::NoItemFlags : Qt::ItemIsEditable);
}
virtual QVariant data(QModelIndex const& index, int role) const override
@@ -166,6 +164,44 @@ struct QtAdapter<T, QAbstractTableModel> : public QtAdapterBase<QAbstractTableMo
return QVariant();
}
+
+ //ObserverInterface
+
+ virtual void cell_changed(int row, int column) override
+ {
+ emit this->dataChanged(this->createIndex(row, column), this->createIndex(row, column));
+ }
+
+ virtual void append_row_begin() override
+ {
+ this->beginInsertRows(QModelIndex(), this->rowCount(QModelIndex()), this->rowCount(QModelIndex()));
+ }
+
+ virtual void append_row_end() override
+ {
+ this->endInsertRows();
+ }
+};
+
+template <typename T>
+struct QtAdapter<T, QAbstractListModel> : public QtAdapterBase<T, QAbstractListModel>
+{
+ typedef QtWidget<QListView, T> widget;
+
+ QtAdapter(std::shared_ptr<T> model)
+ : QtAdapterBase<T, QAbstractListModel>(model)
+ {}
+};
+
+template <typename T>
+struct QtAdapter<T, QAbstractTableModel> : public QtAdapterBase<T, QAbstractTableModel>
+{
+ typedef QtWidget<QTableView, T> widget;
+
+ QtAdapter(std::shared_ptr<T> model)
+ : QtAdapterBase<T, QAbstractTableModel>(model)
+ {}
+
};
template <typename Model>