//=============================================================================
//
// OpenFlipper
// Copyright (C) 2009 by Computer Graphics Group, RWTH Aachen
// www.openflipper.org
//
//-----------------------------------------------------------------------------
//
// License
//
// OpenFlipper is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// OpenFlipper is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with OpenFlipper. If not, see .
//
//-----------------------------------------------------------------------------
//
// $Revision: $
// $Author: $
// $Date: $
//
//=============================================================================
//== INCLUDES =================================================================
#include
#include
#include
#include "matrix4x4Widget.hh"
//== NAMESPACES ===============================================================
namespace VSI {
//=============================================================================
//
// CLASS VSI::Matrix4x4Widget - IMPLEMENTATION
//
//=============================================================================
/// Constructor
Matrix4x4Widget::Matrix4x4Widget(QMap< QString, QString > &_hints, QString _typeName, QWidget *_parent) :
TypeWidget (_hints, _typeName, _parent)
{
bool ok;
QGridLayout *gL = new QGridLayout;
for (int i = 0; i < 16; i++)
{
default_[i] = 0.0;
if (i%5 == 0) //set diagonal to 1, convenient for e.g. transformation matrices
default_[i] = 1.0;
}
ok = true;
if (_hints.contains ("default"))
{
QStringList sl = _hints["default"].split (',');
if (sl.length () == 16)
{
for (int i = 0; i < 16 && ok; i++)
default_[i] = sl[i].toFloat (&ok);
if (!ok)
for (int i = 0; i < 16; i++)
default_[i] = 0.0;
}
}
for (int i = 0; i < 16; i++)
fields_[i] = new QLineEdit;
for (int i = 0; i < 4; i++)
{
gL->addWidget (new QLabel ("("),i, 0);
gL->addWidget (fields_[i], i, 1);
gL->addWidget (new QLabel (","), i, 2);
gL->addWidget (fields_[i + 4], i, 3);
gL->addWidget (new QLabel (","), i, 4);
gL->addWidget (fields_[i + 8], i, 5);
gL->addWidget (new QLabel (","), i, 6);
gL->addWidget (fields_[i + 12], i, 7);
gL->addWidget (new QLabel (")"), i, 8);
}
for (int i = 0; i < 16; i++)
{
fields_[i]->setText (QString::number (default_[i]));
connect (fields_[i], SIGNAL (editingFinished ()), this, SLOT (editingFinished ()));
}
setLayout (gL);
for (int i = 0; i < 16; i++)
current_[i] = default_[i];
}
/// Destructor
Matrix4x4Widget::~ Matrix4x4Widget()
{
}
//------------------------------------------------------------------------------
/// Convert current value to string
QString Matrix4x4Widget::toValue()
{
QString rv = "Matrix4x4 (";
for (int i = 0; i < 16; i++)
rv += QString::number (current_[i]) + ",";
rv.remove (rv.length () - 1, 1);
rv += ")";
return rv;
}
//------------------------------------------------------------------------------
/// Read value from string
void Matrix4x4Widget::fromValue(QString _from)
{
if (_from.startsWith ("Matrix4x4 ("))
_from.remove (0, 11);
if (_from.endsWith (")"))
_from.remove (_from.length () - 1, 1);
QStringList sl = _from.split (',');
float v[16];
bool ok = true;
if (sl.length () == 16)
{
for (int i = 0; i < 16 && ok; i++)
v[i] = sl[i].toFloat (&ok);
if (ok)
for (int i = 0; i < 16; i++)
{
current_[i] = v[i];
fields_[i]->setText (QString::number (current_[i]));
}
}
}
//------------------------------------------------------------------------------
// handle slider changes
void Matrix4x4Widget::editingFinished ()
{
bool ok;
float v;
for (int i = 0; i < 16; i++)
{
v = fields_[i]->text ().toFloat (&ok);
if (ok)
current_[i] = v;
else
fields_[i]->setText (QString::number (current_[i]));
}
}
//------------------------------------------------------------------------------
/// Reset to default
void Matrix4x4Widget::toDefault()
{
for (int i = 0; i < 16; i++)
{
current_[i] = default_[i];
fields_[i]->setText (QString::number (current_[i]));
}
}
//------------------------------------------------------------------------------
}