1 /**
2  * \file frameobjectmodel.cpp
3  * Object model with frame information.
4  *
5  * \b Project: Kid3
6  * \author Urs Fleisch
7  * \date 02 Sep 2014
8  *
9  * Copyright (C) 2014-2018  Urs Fleisch
10  *
11  * This file is part of Kid3.
12  *
13  * Kid3 is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version.
17  *
18  * Kid3 is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
25  */
26 
27 #include "frameobjectmodel.h"
28 #include <QCoreApplication>
29 
30 /**
31  * Constructor.
32  * @param parent parent object
33  */
FrameObjectModel(QObject * parent)34 FrameObjectModel::FrameObjectModel(QObject* parent) : QObject(parent)
35 {
36 }
37 
38 /**
39  * Get frame name.
40  * @return translated frame name.
41  */
name() const42 QString FrameObjectModel::name() const
43 {
44   return m_frame.getExtendedType().getTranslatedName();
45 }
46 
47 /**
48  * Get internal frame name.
49  * @return internal frame name, e.g. "TXXX - User defined text information"
50  */
internalName() const51 QString FrameObjectModel::internalName() const
52 {
53   QString name(m_frame.getInternalName());
54   if (name.isEmpty()) {
55     name = m_frame.getName();
56   }
57   if (!name.isEmpty()) {
58     int nlPos = name.indexOf(QLatin1Char('\n'));
59     if (nlPos > 0) {
60       // probably "TXXX - User defined text information\nDescription" or
61       // "WXXX - User defined URL link\nDescription"
62       name.truncate(nlPos);
63     }
64     name = QCoreApplication::translate("@default", name.toLatin1().data());
65   }
66   return name;
67 }
68 
69 /**
70  * Get frame type.
71  * @return type, type Frame::Type.
72  */
type() const73 int FrameObjectModel::type() const
74 {
75   return m_frame.getType();
76 }
77 
78 /**
79  * Get frame value.
80  * @return frame value.
81  */
value() const82 QString FrameObjectModel::value() const
83 {
84   return m_frame.getValue();
85 }
86 
87 /**
88  * Set frame value.
89  * @param value value
90  */
setValue(const QString & value)91 void FrameObjectModel::setValue(const QString& value)
92 {
93   if (m_frame.getValue() != value) {
94     m_frame.setValueIfChanged(value);
95     emit valueChanged(m_frame.getValue());
96   }
97 }
98 
99 /**
100  * Get field list.
101  * @return fields.
102  */
fields()103 QList<QObject*> FrameObjectModel::fields()
104 {
105   QList<QObject*> lst;
106   const int numFields = m_frame.getFieldList().size();
107   if (numFields > 0) {
108     for (int i = 0; i < numFields; ++i) {
109       auto fieldObj = new FrameFieldObject(i, this);
110       connect(fieldObj, &FrameFieldObject::valueChanged,
111               this, &FrameObjectModel::fieldsChanged);
112       lst.append(fieldObj);
113     }
114   } else {
115     auto fieldObj = new FrameFieldObject(-1, this);
116     connect(fieldObj, &FrameFieldObject::valueChanged,
117             this, &FrameObjectModel::fieldsChanged);
118     lst.append(fieldObj);
119   }
120   return lst;
121 }
122 
123 /**
124  * Set from frame.
125  * @param frame frame
126  */
setFrame(const Frame & frame)127 void FrameObjectModel::setFrame(const Frame& frame)
128 {
129   m_frame = frame;
130 }
131 
132 /**
133  * Get frame from object information.
134  * @return frame.
135  */
getFrame() const136 Frame FrameObjectModel::getFrame() const
137 {
138   return m_frame;
139 }
140 
141 /**
142  * Get binary data from data field.
143  * @return binary data, empty if not available.
144  */
getBinaryData() const145 QByteArray FrameObjectModel::getBinaryData() const
146 {
147   QVariant var(Frame::getField(m_frame, Frame::ID_Data));
148   if (var.isValid()) {
149     return var.toByteArray();
150   }
151   return QByteArray();
152 }
153 
154 
155 /**
156  * Constructor.
157  * @param index index in field list
158  * @param parent parent object
159  */
FrameFieldObject(int index,FrameObjectModel * parent)160 FrameFieldObject::FrameFieldObject(int index, FrameObjectModel* parent)
161   : QObject(parent), m_index(index)
162 {
163 }
164 
165 /**
166  * Get field name.
167  * @return translated field name.
168  */
name() const169 QString FrameFieldObject::name() const
170 {
171   if (FrameObjectModel* fom = frameObject()) {
172     const Frame::FieldList& fields = fom->m_frame.getFieldList();
173     if (m_index >= 0 && m_index < fields.size()) {
174       return Frame::Field::getFieldIdName(
175             static_cast<Frame::FieldId>(fields.at(m_index).m_id));
176     }
177   }
178   return tr("Text");
179 }
180 
181 /**
182  * Get field ID.
183  * @return id, type Frame::FieldId.
184  */
id() const185 int FrameFieldObject::id() const {
186   if (FrameObjectModel* fom = frameObject()) {
187     const Frame::FieldList& fields = fom->m_frame.getFieldList();
188     if (m_index >= 0 && m_index < fields.size()) {
189       return fields.at(m_index).m_id;
190     }
191   }
192   return 0;
193 }
194 
195 /**
196  * Get field value.
197  * @return field value.
198  */
value() const199 QVariant FrameFieldObject::value() const {
200   if (FrameObjectModel* fom = frameObject()) {
201     const Frame::FieldList& fields = fom->m_frame.getFieldList();
202     if (m_index >= 0 && m_index < fields.size()) {
203       return fields.at(m_index).m_value;
204     } else {
205       return fom->value();
206     }
207   }
208   return QVariant();
209 }
210 
211 /**
212  * Set field value.
213  * @param value value
214  */
setValue(const QVariant & value)215 void FrameFieldObject::setValue(const QVariant& value)
216 {
217   if (FrameObjectModel* fom = frameObject()) {
218     Frame::FieldList& fields = fom->m_frame.fieldList();
219     if (m_index >= 0 && m_index < fields.size()) {
220       Frame::Field& fld = fields[m_index];
221       if (fld.m_value != value) {
222         fld.m_value = value;
223         emit valueChanged(fld.m_value);
224       }
225     } else {
226       fom->setValue(value.toString());
227     }
228   }
229 }
230 
231 /**
232  * Get frame type.
233  * @return type, type Frame::Type.
234  */
type() const235 int FrameFieldObject::type() const
236 {
237   if (FrameObjectModel* fom = frameObject()) {
238     return fom->type();
239   }
240   return Frame::FT_UnknownFrame;
241 }
242