/***************************************************************************
* Copyright (C) 2005 by Teppei Tamra *
* TAM(tam-t@par.odn.ne.jp) *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program 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 General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include "nagisakeyboard.h"
#include <qfile.h>
NagisaKeyboard::NagisaKeyboard(QWidget *parent, const char *name)
: QWidget(parent, name)
{
init();
}
NagisaKeyboard::NagisaKeyboard(const QString &xml, QWidget *parent, const char *name)
: QWidget(parent, name)
{
init();
setTableFile(xml);
}
void NagisaKeyboard::init()
{
grid = new QGridLayout(this,1,1,0,KeyButton::buttonSize);
}
NagisaKeyboard::~NagisaKeyboard()
{
}
/*!
\fn NagisaKeyboard::layout()
*/
void NagisaKeyboard::layout()
{
for(unsigned int i = 0;i < keys.count();i ++) {
grid->remove(keys[i]);
grid->addMultiCellWidget(keys[i],
keys[i]->getY(),keys[i]->getY() + keys[i]->getH(),
keys[i]->getX(),keys[i]->getX() + keys[i]->getW());
}
adjustSize();
show();
}
/*!
\fn NagisaKeyboard::pressed(const QString &name,const QString &modifier)
*/
void NagisaKeyboard::pressed(const QString &name,const QString &modifier)
{
QString keyEvent;
if (uniq(modifiers).join("+") != "") keyEvent = uniq(modifiers).join("+") + "+" + name;
else keyEvent = name;
emit status(keyEvent);
show();
emit pressed(keyEvent);
if (modifier != "") {
modifiers.append(modifier);
modifiers.sort();
for(unsigned int i = 0;i < keys.count();i ++) {
keys[i]->changeGroup(uniq(modifiers).join("+"));
}
}
}
/*!
\fn NagisaKeyboard::released(const QString &name,const QString &modifier)
*/
void NagisaKeyboard::released(const QString &name,const QString &modifier)
{
QString keyEvent;
if (uniq(modifiers).join("+") != "") keyEvent = uniq(modifiers).join("+") + "+" + name;
else keyEvent = name;
emit status("");
show();
emit released(keyEvent);
if (modifier != "") {
// iteratorでremoveしなきゃダメ。
modifiers.remove(modifiers.find(modifier));
for(unsigned int i = 0;i < keys.count();i ++) {
keys[i]->changeGroup(uniq(modifiers).join("+"));
}
}
}
/*!
\fn NagisaKeyboard::parser(const QString &xml)
*/
void NagisaKeyboard::parser(const QString &xml)
{
QFile file(xml);
if (!file.open(IO_ReadOnly)) {
file.setName(QString(NAGISADATADIR) + "/" + xml);
if (!file.open(IO_ReadOnly)) {
return;
}
}
if (!doc.setContent(&file)) return;
file.close();
QDomElement root = doc.documentElement();
QDomNode node = root.firstChild();
while(!node.isNull()) {
QDomElement element = node.toElement();
if(!element.isNull()) {
if (element.tagName() == "key") {
KeyButton *key = new KeyButton(this,
element.attribute("x","0").toInt(),
element.attribute("y","0").toInt(),
element.attribute("width","2").toInt(),
element.attribute("height","2").toInt(),
element.attribute("color","white"),
element.attribute("type","button") == "toggle"
);
connect(key,SIGNAL(pressed(const QString&, const QString& )),this,SLOT(pressed(const QString&, const QString& )));
connect(key,SIGNAL(released(const QString&, const QString& )),this,SLOT(released(const QString&, const QString& )));
QDomNode group = element.firstChild();
while(!group.isNull()) {
QDomElement groupElement = group.toElement();
if (!groupElement.isNull()) {
if (groupElement.tagName() == "group") {
key->appendGroup(KeyGroup(
groupElement.attribute("name",""),
groupElement.text(),
groupElement.attribute("event",""),
groupElement.attribute("modifier","")
));
}
}
group = group.nextSibling();
}
keys.append(key);
}
}
node = node.nextSibling();
}
}
/*!
\fn NagisaKeyboard::setTableFile(const QString &xml)
*/
void NagisaKeyboard::setTableFile(const QString &xml)
{
parser(xml);
layout();
show();
}
/*!
\fn NagisaKeyboard::uniq(const QStringList &list)
*/
const QStringList NagisaKeyboard::uniq(const QStringList &list)
{
QStringList res;
for(unsigned int i = 0;i < list.count();i ++) {
if (!res.contains(list[i])) res.append(list[i]);
}
return res;
}