21 #include <QPushButton>
22 #include <QHBoxLayout>
25 #include "layercamera.h"
28 CameraPropertiesDialog::CameraPropertiesDialog(QString name,
int width,
int height) : QDialog()
30 QLabel* nameLabel =
new QLabel(tr(
"Camera name:"));
31 nameBox =
new QLineEdit();
32 nameBox->setText(name);
33 QHBoxLayout* nameLayout =
new QHBoxLayout();
34 nameLayout->addWidget(nameLabel);
35 nameLayout->addWidget(nameBox);
37 QLabel* sizeLabel =
new QLabel(tr(
"Camera size:"));
38 widthBox =
new QSpinBox();
39 heightBox =
new QSpinBox();
40 widthBox->setValue(width);
41 heightBox->setValue(height);
42 widthBox->setMaximum(10000);
43 heightBox->setMaximum(10000);
44 widthBox->setMinimum(1);
45 heightBox->setMinimum(1);
46 QHBoxLayout* sizeLayout =
new QHBoxLayout();
47 sizeLayout->addWidget(sizeLabel);
48 sizeLayout->addWidget(widthBox);
49 sizeLayout->addWidget(heightBox);
51 QPushButton* okButton =
new QPushButton(tr(
"Ok"));
52 QPushButton* cancelButton =
new QPushButton(tr(
"Cancel"));
53 QHBoxLayout* buttonLayout =
new QHBoxLayout();
54 buttonLayout->addWidget(okButton);
55 buttonLayout->addWidget(cancelButton);
57 QGridLayout* layout =
new QGridLayout();
58 layout->addLayout(nameLayout, 0, 0);
59 layout->addLayout(sizeLayout, 1, 0);
60 layout->addLayout(buttonLayout, 2, 0);
62 connect(okButton, SIGNAL(pressed()),
this, SLOT(accept()));
63 connect(cancelButton, SIGNAL(pressed()),
this, SLOT(reject()));
66 CameraPropertiesDialog::~CameraPropertiesDialog()
70 QString CameraPropertiesDialog::getName()
72 return nameBox->text();
75 void CameraPropertiesDialog::setName(QString name)
77 nameBox->setText(name);
80 int CameraPropertiesDialog::getWidth()
82 return widthBox->value();
85 void CameraPropertiesDialog::setWidth(
int width)
87 widthBox->setValue(width);
90 int CameraPropertiesDialog::getHeight()
92 return heightBox->value();
95 void CameraPropertiesDialog::setHeight(
int height)
97 heightBox->setValue(height);
104 mName = QString(tr(
"Camera Layer"));
105 viewRect = QRect( QPoint(-320,-240), QSize(640,480) );
109 LayerCamera::~LayerCamera()
113 Camera* LayerCamera::getCameraAtFrame(
int frameNumber)
115 return static_cast< Camera*
>( getKeyFrameAt( frameNumber ) );
118 Camera* LayerCamera::getLastCameraAtFrame(
int frameNumber,
int increment)
120 return static_cast< Camera*
>( getLastKeyFrameAtPosition( frameNumber + increment ) );
123 QTransform LayerCamera::getViewAtFrame(
int frameNumber)
125 if ( keyFrameCount() == 0 )
130 Camera* camera1 =
static_cast< Camera*
>( getLastKeyFrameAtPosition( frameNumber ) );
132 int nextFrame = getNextKeyFramePosition( frameNumber );
133 Camera* camera2 =
static_cast< Camera*
>( getLastKeyFrameAtPosition( nextFrame ) );
135 if (camera1 == NULL && camera2 == NULL)
139 else if (camera1 == NULL && camera2 != NULL)
141 return camera2->view;
143 else if (camera2 == NULL && camera1 != NULL)
145 return camera1->view;
148 if ( camera1 == camera2 )
150 return camera1->view;
153 int frame1 = camera1->pos();
154 int frame2 = camera2->pos();
157 qreal c2 = ( frameNumber - frame1 + 0.0 ) / ( frame2 - frame1 );
161 auto interpolation = [=](
double f1,
double f2 ) ->
double
163 return f1 * c1 + f2 * c2;
166 return QTransform( interpolation( camera1->view.m11(), camera2->view.m11() ),
167 interpolation( camera1->view.m12(), camera2->view.m12() ),
168 interpolation( camera1->view.m21(), camera2->view.m21() ),
169 interpolation( camera1->view.m22(), camera2->view.m22() ),
170 interpolation( camera1->view.dx(), camera2->view.dx() ),
171 interpolation( camera1->view.dy(), camera2->view.dy() ) );
175 QRect LayerCamera::getViewRect()
181 QSize LayerCamera::getViewSize()
183 return viewRect.size();
186 void LayerCamera::loadImageAtFrame(
int frameNumber, QTransform view )
188 if ( keyExists( frameNumber ) )
190 removeKeyFrame( frameNumber );
198 Status LayerCamera::saveKeyFrame(
KeyFrame* pKeyFrame, QString path )
201 Q_UNUSED( pKeyFrame );
206 void LayerCamera::editProperties()
208 if ( dialog == NULL )
212 dialog->setName(mName);
213 dialog->setWidth(viewRect.width());
214 dialog->setHeight(viewRect.height());
215 int result = dialog->exec();
216 if (result == QDialog::Accepted)
218 mName = dialog->getName();
219 viewRect = QRect(-dialog->getWidth()/2, -dialog->getHeight()/2, dialog->getWidth(), dialog->getHeight());
225 QDomElement LayerCamera::createDomElement( QDomDocument& doc )
227 QDomElement layerTag = doc.createElement(
"layer");
229 layerTag.setAttribute(
"name", mName);
230 layerTag.setAttribute(
"visibility", mVisible);
231 layerTag.setAttribute(
"type", type());
232 layerTag.setAttribute(
"width", viewRect.width());
233 layerTag.setAttribute(
"height", viewRect.height());
235 foreachKeyFrame( [&](
KeyFrame* pKeyFrame )
238 QDomElement keyTag = doc.createElement(
"camera");
239 keyTag.setAttribute(
"frame", camera->pos() );
241 keyTag.setAttribute(
"m11", camera->view.m11() );
242 keyTag.setAttribute(
"m12", camera->view.m12() );
243 keyTag.setAttribute(
"m21", camera->view.m21() );
244 keyTag.setAttribute(
"m22", camera->view.m22() );
245 keyTag.setAttribute(
"dx", camera->view.dx() );
246 keyTag.setAttribute(
"dy", camera->view.dy() );
247 layerTag.appendChild( keyTag );
253 void LayerCamera::loadDomElement(QDomElement element, QString dataDirPath)
255 Q_UNUSED(dataDirPath);
257 mName = element.attribute(
"name");
260 int width = element.attribute(
"width" ).toInt();
261 int height = element.attribute(
"height" ).toInt();
262 viewRect = QRect( -width / 2, -height / 2, width, height );
264 QDomNode imageTag = element.firstChild();
265 while (!imageTag.isNull())
267 QDomElement imageElement = imageTag.toElement();
268 if (!imageElement.isNull())
270 if (imageElement.tagName() ==
"camera")
272 int frame = imageElement.attribute(
"frame").toInt();
274 qreal m11 = imageElement.attribute(
"m11").toDouble();
275 qreal m12 = imageElement.attribute(
"m12").toDouble();
276 qreal m21 = imageElement.attribute(
"m21").toDouble();
277 qreal m22 = imageElement.attribute(
"m22").toDouble();
278 qreal dx = imageElement.attribute(
"dx").toDouble();
279 qreal dy = imageElement.attribute(
"dy").toDouble();
281 loadImageAtFrame( frame, QTransform( m11, m12, m21, m22, dx, dy ) );
284 imageTag = imageTag.nextSibling();