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