1 // -*- C++ -*-
2 /**
3  * \file GuiIdListModel.h
4  * This file is part of LyX, the document processor.
5  * Licence details can be found in the file COPYING.
6  *
7  * \author Richard Heck
8  *
9  * Some of this code is based upon qstringlistmodel.{h,cpp}, which is
10  * part of the Qt toolkit, copyright (C) 1992-2007 Trolltech ASA, and
11  * released under the General Public License.
12  *
13  * Full author contact details are available in file CREDITS.
14  */
15 
16 #ifndef GUIIDLISTMODEL_H
17 #define GUIIDLISTMODEL_H
18 
19 #include "support/qstring_helpers.h"
20 
21 #include <QAbstractListModel>
22 #include <vector>
23 #include <string>
24 
25 namespace lyx {
26 namespace frontend {
27 
28 /**
29  * A QAbstractListModel that associates an identifying string with
30  * each item, as well as a display string. The display string is set
31  * with setUIString; the identifying string, with setIDString.
32  *
33  * This is intended to be used, for example, with GuiSelectionManager.
34  * In that case, one needs to recover from selectedModel which items
35  * have been selected. One may not wish to do so using the string that
36  * is there *displayed*, since, among other things, that string may be
37  * translated. So the id can be used to identify the items in this case.
38  */
39 class GuiIdListModel : public QAbstractListModel {
40 public:
41 	///
GuiIdListModel()42 	GuiIdListModel() {}
43 	//////////////////////////////////////////////////////////////////////
44 	// Methods overridden from QAbstractListModel
45 	//////////////////////////////////////////////////////////////////////
46 	///
47 	int rowCount(QModelIndex const & = QModelIndex()) const
48 		{ return userData_.size(); }
49 
50 	///
51 	virtual QVariant data(QModelIndex const & index,
52 	                      int role = Qt::DisplayRole) const;
53 	///
54 	bool insertRows(int row, int count, QModelIndex const & parent = QModelIndex());
55 	///
56 	bool removeRows(int row, int count, QModelIndex const & parent = QModelIndex());
57 	///
clear()58 	void clear() { removeRows(0, rowCount()); }
59 	///
60 	virtual bool setData (QModelIndex const & index,
61 			const QVariant & value, int role = Qt::EditRole );
62 	///
63 	virtual QMap<int, QVariant> itemData(QModelIndex const & index ) const;
64 	//////////////////////////////////////////////////////////////////////
65 	// New methods
66 	//////////////////////////////////////////////////////////////////////
67 	///
68 	void insertRow(int const i, QString const & uiString,
69 			std::string const & idString, QString const & ttString);
70 	/// A convenience method, setting ttString to the same as uiString
71 	void insertRow(int const i, QString const & uiString,
72 			std::string const & idString);
73 	/// \return the index of the (first) item with idString
74 	/// \return -1 if not found
75 	int findIDString(std::string const & idString);
76 	///
getIDString(QModelIndex const & index)77 	virtual QString getIDString(QModelIndex const & index) const
78 		{ return data(index, Qt::UserRole).toString(); }
79 	///
getIDString(int const i)80 	virtual std::string getIDString(int const i) const
81 		{ return fromqstr(getIDString(index(i))); }
82 
83 private:
84 	/// noncopyable
85 	GuiIdListModel(GuiIdListModel const &);
86 	///
87 	void operator=(GuiIdListModel const &);
88 	///
setUIString(QModelIndex const & index,QString const & value)89 	void setUIString(QModelIndex const & index, QString const & value)
90 		{ setData(index, value); }
91 	///
setUIString(int const i,QString const & value)92 	void setUIString(int const i, QString const & value)
93 		{ setUIString(index(i), value); }
94 	///
setIDString(QModelIndex const & index,QString const & value)95 	void setIDString(QModelIndex const & index, QString const & value)
96 		{ setData(index, value, Qt::UserRole); }
97 	///
setIDString(int const i,std::string const & value)98 	void setIDString(int const i, std::string const & value)
99 		{ setIDString(index(i), toqstr(value)); }
100 	///
setTTString(QModelIndex const & index,QString const & value)101 	void setTTString(QModelIndex const & index, QString const & value)
102 		{ setData(index, value, Qt::ToolTipRole); }
103 	///
setTTString(int const i,QString const & value)104 	void setTTString(int const i, QString const & value)
105 		{ setTTString(index(i), value); }
106 	struct OurData {
107 		/// Qt::DisplayRole and Qt::EditRole
108 		QVariant uiString;
109 		/// Qt::UserRole
110 		QVariant idString;
111 		/// Qt::ToolTipRole
112 		QVariant ttString;
113 	};
114 	///
115 	std::vector<OurData> userData_;
116 	///
rowIsValid(int const i)117 	bool rowIsValid(int const i) const
118 	{
119 		return i >= 0 && i <= int(userData_.size());
120 	}
121 };
122 
123 
124 } // namespace frontend
125 } // namespace lyx
126 #endif //GUIIDLISTMODEL_H
127