--- /dev/null
+/**
+ * \file GuiIdListModel.cpp
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Richard Heck
+ *
+ * Some of this code is based upon qstringlistmodel.{h,cpp}, which is
+ * part of the Qt toolkit, copyright (C) 1992-2007 Trolltech ASA, and
+ * released under the General Public License.
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "GuiIdListModel.h"
+
+using std::vector;
+
+namespace lyx {
+namespace frontend {
+
+GuiIdListModel::GuiIdListModel() :
+ QAbstractListModel()
+{}
+
+
+QVariant GuiIdListModel::data(QModelIndex const & index, int role) const
+{
+ int const row = index.row();
+ if (!rowIsValid(row))
+ return QVariant();
+ if (role == Qt::DisplayRole || role == Qt::EditRole)
+ return userData_[row].uiString;
+ if (role == Qt::UserRole)
+ return userData_[row].idString;
+ return QVariant();
+}
+
+
+bool GuiIdListModel::setData (QModelIndex const & index,
+ const QVariant & value, int role)
+{
+ int const row = index.row();
+ if (!rowIsValid(row))
+ return false;
+ if (role == Qt::DisplayRole || role == Qt::EditRole) {
+ userData_[row].uiString = value;
+ dataChanged(index, index);
+ return true;
+ }
+ if (role == Qt::UserRole) {
+ userData_[row].idString = value;
+ dataChanged(index, index);
+ return true;
+ }
+ return false;
+}
+
+
+bool GuiIdListModel::insertRows(int row, int count,
+ QModelIndex const & /*parent*/)
+{
+ if (!rowIsValid(row))
+ return false;
+ vector<OurData>::iterator it = userData_.begin() + row;
+ OurData const v;
+ beginInsertRows(QModelIndex(), row, row + count - 1);
+ userData_.insert(it, count, v);
+ endInsertRows();
+ return true;
+}
+
+
+bool GuiIdListModel::removeRows(int row, int count,
+ QModelIndex const & /*parent*/)
+{
+ if (!rowIsValid(row) || row + count > userData_.size() ||
+ count < 0)
+ return false;
+ if (count == 0)
+ return true;
+ vector<OurData>::iterator it = userData_.begin() + row;
+ beginRemoveRows(QModelIndex(), row, row + count - 1);
+ userData_.erase(it, it + count);
+ endRemoveRows();
+ return true;
+}
+
+
+void GuiIdListModel::insertRow(int const i, std::string const & uiString,
+ std::string const & idString)
+{
+ insertRows(i, 1);
+ setUIString(i, uiString);
+ setIDString(i, idString);
+}
+
+
+QMap<int, QVariant>
+ GuiIdListModel::itemData(QModelIndex const & index ) const
+{
+ int const row = index.row();
+ if (!rowIsValid(row))
+ return QMap<int, QVariant>();
+ QMap<int, QVariant> qm = QAbstractListModel::itemData(index);
+ qm[Qt::UserRole] = userData_[row].idString;
+ return qm;
+}
+
+/* The following functions are currently unused but are retained here in
+ case they should at some point be useful.
+
+QStringList GuiIdListModel::getIDStringList() const {
+ QStringList qsl;
+ vector<OurData>::const_iterator it = userData_.begin();
+ vector<OurData>::const_iterator end = userData_.end();
+ for (; it != end; ++it)
+ qsl.append(it->idString.toString());
+ return qsl;
+}
+
+
+void GuiIdListModel::insertRow(int const i, QString const & uiString,
+ QString const & idString)
+{
+ insertRows(i, 1);
+ setUIString(i, uiString);
+ setIDString(i, idString);
+}
+
+bool GuiIdListModel::containsID(QVariant const & q) const
+{
+ vector<OurData>::const_iterator it = userData_.begin();
+ vector<OurData>::const_iterator end = userData_.end();
+ for (; it != end; ++it)
+ if (it->idString == q)
+ return true;
+ return false;
+}
+*/
+
+}
+}
+
--- /dev/null
+// -*- C++ -*-
+/**
+ * \file GuiIdListModel.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Richard Heck
+ *
+ * Some of this code is based upon qstringlistmodel.{h,cpp}, which is
+ * part of the Qt toolkit, copyright (C) 1992-2007 Trolltech ASA, and
+ * released under the General Public License.
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef GUIIDLISTMODEL_H
+#define GUIIDLISTMODEL_H
+
+#include <QAbstractListModel>
+#include <vector>
+#include <string>
+
+#include "support/qstring_helpers.h"
+
+namespace lyx {
+namespace frontend {
+
+/**
+ * A QAbstractListModel that associates an identifying string with
+ * each item, as well as a display string. The display string is set
+ * with setUIString; the identifying string, with setIDString.
+ *
+ * This is intended to be used, for example, with GuiSelectionManager.
+ * In that case, one needs to recover from selectedModel which items
+ * have been selected. One may not wish to do so using the string that
+ * is there *displayed*, since, among other things, that string may be
+ * translated. So the id can be used to identify the items in this case.
+ */
+class GuiIdListModel : public QAbstractListModel {
+public:
+ ///
+ explicit GuiIdListModel();
+ //////////////////////////////////////////////////////////////////////
+ // Methods overridden from QAbstractListModel
+ //////////////////////////////////////////////////////////////////////
+ ///
+ inline int rowCount(QModelIndex const & parent = QModelIndex()) const;
+ ///
+ virtual QVariant data(QModelIndex const & index,
+ int role = Qt::DisplayRole) const;
+ ///
+ bool insertRows(int row, int count, QModelIndex const & parent = QModelIndex());
+ ///
+ bool removeRows(int row, int count, QModelIndex const & parent = QModelIndex());
+ ///
+ void clear() { removeRows(0, rowCount()); };
+ ///
+ virtual bool setData (QModelIndex const & index,
+ const QVariant & value, int role = Qt::EditRole );
+ ///
+ virtual QMap<int, QVariant> itemData(QModelIndex const & index ) const;
+ //////////////////////////////////////////////////////////////////////
+ // New methods
+ //////////////////////////////////////////////////////////////////////
+ ///
+ inline void setUIString(QModelIndex const & index, QString const & value)
+ { setData(index, value); };
+ ///
+ inline void setUIString(int const i, std::string const & value)
+ { setUIString(index(i), toqstr(value)); };
+ ///
+ inline void setIDString(QModelIndex const & index, QString const & value)
+ { setData(index, value, Qt::UserRole); };
+ ///
+ inline void setIDString(int const i, std::string const & value)
+ { setIDString(index(i), toqstr(value)); };
+ ///
+ virtual QString getIDString(QModelIndex const & index) const
+ { return data(index, Qt::UserRole).toString(); };
+ ///
+ virtual std::string getIDString(int const i) const
+ { return fromqstr(getIDString(index(i))); };
+ ///
+ void insertRow(int const i, std::string const & uiString,
+ std::string const & idString);
+ /* The following functions are currently unused but are retained here in
+ case they should at some point be useful.
+ ///
+ void setUIString(int const i, QString const & value)
+ { setUIString(index(i), value); };
+ ///
+ void setIDString(int const i, QString const & value)
+ { setIDString(index(i), value); };
+ ///
+ QStringList getIDStringList() const;
+ ///
+ void insertRow(int const i, QString const & uiString,
+ QString const & idString);
+ /// Returns whether the model contains an item with the given ID
+ bool containsID(QVariant const &) const;
+ */
+private:
+ /// noncopyable
+ GuiIdListModel(GuiIdListModel const &);
+ ///
+ struct OurData {
+ QVariant uiString;
+ QVariant idString;
+ };
+ ///
+ std::vector<OurData> userData_;
+ ///
+ inline bool rowIsValid(int const i) const
+ {
+ return (i >= 0 && (i <= userData_.size()));
+ }
+;
+};
+
+
+//definition is here to silence a warning
+inline int GuiIdListModel::rowCount(QModelIndex const &) const
+ { return userData_.size(); }
+
+}
+}
+#endif //GUIIDLISTMODEL_H