Store Sequence sequence location in a shared_ptr class
[mussa.git] / qui / seqbrowser / seqproperties / SequencePropertiesModel.cpp
1 #include "qui/seqbrowser/seqproperties/SequencePropertiesModel.hpp"
2
3 SequencePropertiesModel::SequencePropertiesModel(model_type orig, QObject *parent) 
4   : QAbstractTableModel(parent),
5     original_sequences(orig)
6 {
7   for(const_iterator glseq_i = original_sequences.begin();
8       glseq_i != original_sequences.end();
9       ++glseq_i)
10   {
11     // manage to convert out of all of our pointers to call 
12     // the glsequence copy constructor
13     model_item new_glseq(new GlSequence(*(glseq_i->get())));
14     sequences.push_back(new_glseq);
15   }
16 }
17
18 void SequencePropertiesModel::assign(
19     SequencePropertiesModel::size_type num, 
20     const SequencePropertiesModel::model_item val
21 )
22 {
23   sequences.assign(num, val);
24 }
25
26 SequencePropertiesModel::model_item SequencePropertiesModel::at(
27     SequencePropertiesModel::size_type index
28 )
29 {
30   return sequences.at(index);
31 }
32
33 SequencePropertiesModel::model_item SequencePropertiesModel::back()
34 {
35   return sequences.back();
36 }
37
38 SequencePropertiesModel::iterator SequencePropertiesModel::begin()
39 {
40   return sequences.begin();
41 }
42
43 SequencePropertiesModel::const_iterator SequencePropertiesModel::begin() const
44 {
45   return sequences.begin();
46 }
47
48 void SequencePropertiesModel::clear()
49 {
50   if (sequences.size() != 0) {
51     beginRemoveRows(QModelIndex(), 0, sequences.size()-1);
52     sequences.clear();
53     endRemoveRows();
54   }
55 }
56
57 SequencePropertiesModel::iterator SequencePropertiesModel::end()
58 {
59   return sequences.end();
60 }
61
62 SequencePropertiesModel::const_iterator SequencePropertiesModel::end() const
63 {
64   return sequences.end();
65 }
66
67 bool SequencePropertiesModel::empty() const
68 {
69   return sequences.empty();
70 }
71
72 SequencePropertiesModel::model_item SequencePropertiesModel::operator[](
73     SequencePropertiesModel::size_type index
74 )
75 {
76   return sequences[index];
77 }
78
79 void SequencePropertiesModel::pop_back()
80 {
81   int last_element = sequences.size()-1;
82   if (last_element >= 0) {
83     beginRemoveRows(QModelIndex(), last_element, last_element);
84     sequences.pop_back();
85     endRemoveRows();
86   } 
87 }
88
89 void SequencePropertiesModel::push_back(
90   SequencePropertiesModel::model_item item
91 )
92 {
93   int last_element = sequences.size();
94   beginInsertRows(QModelIndex(), last_element, last_element);
95   sequences.push_back(item);
96   endInsertRows();
97 }
98
99 SequencePropertiesModel::size_type SequencePropertiesModel::size() const
100 {
101   return sequences.size();
102 }
103
104 int 
105 SequencePropertiesModel::rowCount( const QModelIndex& parent) const
106 {
107   return sequences.size();
108 }
109
110 int 
111 SequencePropertiesModel::columnCount(const QModelIndex& parent) const
112 {
113   return 2;
114 }
115
116 QVariant 
117 SequencePropertiesModel::data(const QModelIndex &index, int role) const
118 {
119   if (!index.isValid())
120     return QVariant();
121   
122   if (index.row() >= sequences.size())
123     return QVariant();
124
125   if (index.column() >= 3)
126     return QVariant();
127
128   if (role == Qt::DisplayRole) {
129     if (index.column() == 0 ) {
130       model_item glseq = sequences[index.row()];
131       std::string name(glseq->get_name());
132       if (name.size() == 0) {
133         return QString(tr("Unnamed Sequence"));
134       } else {
135         return QVariant(QString(name.c_str()));
136       }
137     } else if (index.column() == 1) {
138       return QVariant(sequences[index.row()]->x());
139     } 
140   }
141   return QVariant();
142 }
143
144 QVariant 
145 SequencePropertiesModel::headerData(
146     int section, 
147     Qt::Orientation orientation, 
148     int role
149 ) const
150 {
151   if (role != Qt::DisplayRole)
152     return QVariant();
153
154   if (orientation == Qt::Horizontal) {
155     switch(section) {
156       case 0:
157         return QString("Sequence");
158         break;
159       case 1:
160         return QString("Offset to 0");
161         break;
162       default:
163         return QVariant();
164         break;
165     }
166   }
167   return QVariant();
168 }
169
170 bool SequencePropertiesModel::setData(
171    const QModelIndex& index, 
172    const QVariant &value, 
173    int role
174 )
175 {
176    bool isInt;
177    int intValue(value.toInt(&isInt));
178    if (index.isValid() and role == Qt::EditRole and isInt) {
179     model_item seq = sequences[index.row()];
180     switch(index.column()) {
181       case 0:
182         return false;
183         break;
184       case 1:
185         seq->setX(intValue);
186         break;
187       default:
188         return false;
189         break;
190     }
191     emit dataChanged(index, index);
192     return true;
193   } else {
194     return false;
195   }
196 }
197
198 Qt::ItemFlags SequencePropertiesModel::flags(const QModelIndex& index) const
199 {
200   if (!index.isValid())
201     return Qt::ItemIsEnabled;
202
203   // first column is not editable
204   if (index.column() == 0)
205     return QAbstractItemModel::flags(index);
206   else
207     return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
208 }
209
210 void SequencePropertiesModel::saveChanges()
211 {
212   const_iterator orig_seq_i = original_sequences.begin();
213   const_iterator new_seq_i = sequences.begin();
214
215   while(orig_seq_i != original_sequences.end() or new_seq_i != sequences.end())
216   {
217     // copy over properties
218     (*orig_seq_i)->setX((*new_seq_i)->x());
219     ++orig_seq_i;
220     ++new_seq_i;
221   }
222 }