summaryrefslogtreecommitdiff
path: root/src/main-view/DictTableModel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main-view/DictTableModel.cpp')
-rw-r--r--src/main-view/DictTableModel.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/main-view/DictTableModel.cpp b/src/main-view/DictTableModel.cpp
new file mode 100644
index 0000000..b7b7eed
--- /dev/null
+++ b/src/main-view/DictTableModel.cpp
@@ -0,0 +1,142 @@
+#include <QtGui>
+
+#include "DictTableModel.h"
+#include "UndoCommands.h"
+#include "../dictionary/Dictionary.h"
+#include "../dictionary/DicRecord.h"
+#include "../dictionary/Field.h"
+
+DictTableModel::DictTableModel( Dictionary* aDict, QObject *parent ):
+ QAbstractTableModel( parent ), m_dictionary( aDict )
+ {
+ m_undoStack = new QUndoStack( this );
+ connect( m_dictionary, SIGNAL(destroyed(QObject*)), SLOT(discardCurDictionary()) );
+ }
+
+int DictTableModel::rowCount( const QModelIndex &/*parent*/ ) const
+ {
+ if( m_dictionary )
+ return m_dictionary->entriesNum();
+ else
+ return 0;
+ }
+
+int DictTableModel::columnCount(const QModelIndex &/*parent*/) const
+ {
+ if( m_dictionary )
+ return m_dictionary->fieldsNum();
+ else
+ return 0;
+ }
+
+QVariant DictTableModel::data( const QModelIndex &index, int role ) const
+ {
+ if( !m_dictionary || !index.isValid() || index.row() >= rowCount() ||
+ index.column() >= columnCount() )
+ return QVariant();
+ QString text = m_dictionary->getFieldValue(index.row(), index.column());
+ switch(role)
+ {
+ case Qt::DisplayRole:
+ return QVariant();
+ case Qt::EditRole:
+ return m_dictionary->extendImagePaths(text);
+ case DicRecordRole:
+ {
+ const DicRecord* record = m_dictionary->getRecord(index.row());
+ return QVariant::fromValue(*record);
+ }
+ default:
+ return QVariant();
+ }
+ }
+
+QVariant DictTableModel::headerData( int section, Qt::Orientation orientation, int role ) const
+ {
+ if( !m_dictionary )
+ return QVariant();
+ switch( role )
+ {
+ case Qt::DisplayRole:
+ if(orientation == Qt::Vertical)
+ return QString::number( section + 1 );
+ else
+ {
+ if( section < columnCount() )
+ return m_dictionary->field( section )->name();
+ else
+ return QVariant();
+ }
+ default:
+ return QVariant();
+ }
+ }
+
+bool DictTableModel::setData( const QModelIndex &index, const QVariant &value, int role )
+ {
+ if( !index.isValid() || !m_dictionary )
+ return false;
+ if( value == data( index, role ) )
+ return false;
+
+ switch( role )
+ {
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ m_dictionary->setFieldValue(index.row(), index.column(), value.toString());
+ break;
+ case DicRecordRole:
+ {
+ DicRecord record = value.value<DicRecord>();
+ m_dictionary->setRecord( index.row(), record );
+ break;
+ }
+ default:
+ return false;
+ }
+ emit dataChanged( index, index );
+ return true;
+ }
+
+bool DictTableModel::insertRows( int position, int rows, const QModelIndex& /*parent*/ )
+ {
+ if( !m_dictionary )
+ return false;
+ beginInsertRows( QModelIndex(), position, position + rows - 1 );
+ m_dictionary->insertEntries( position, rows );
+ endInsertRows();
+ return true;
+ }
+
+bool DictTableModel::addFields( QStringList aFields )
+ {
+ if( !m_dictionary )
+ return false;
+ beginInsertColumns( QModelIndex(), columnCount(), columnCount() + aFields.size() - 1 );
+ m_dictionary->addFields( aFields );
+ endInsertColumns();
+ return true;
+ }
+
+bool DictTableModel::removeRows( int position, int rows, const QModelIndex& /*parent*/ )
+ {
+ if( !m_dictionary )
+ return false;
+ beginRemoveRows( QModelIndex(), position, position + rows - 1 );
+ m_dictionary->removeRecords( position, rows );
+ endRemoveRows();
+ return true;
+ }
+
+void DictTableModel::resetData() // TODO: Suspicious method, just reveals protected methods
+ {
+ beginResetModel();
+ endResetModel();
+ }
+
+void DictTableModel::discardCurDictionary()
+ {
+ beginResetModel();
+ m_dictionary = NULL;
+ endResetModel();
+ }