Newer
Older
scim-wnn / nagisa / src / keybutton.cpp
@tamra tamra on 29 Oct 2005 5 KB なぎさたん投入。
/***************************************************************************
 *   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 <qfont.h>
#include <qlayout.h>
#include <qtooltip.h>
#include "keybutton.h"
#include <iostream>

KeyGroup::KeyGroup()
{
}

KeyGroup::KeyGroup(const QString &_name,const QString &_label,const QString &_event,const QString &_modifier)
{
    setValue(_name,_label,_event,_modifier);
}

KeyGroup::~KeyGroup()
{
}

void KeyGroup::setValue(const QString &_name,const QString &_label,const QString &_event,const QString &_modifier)
{
    QStringList l = QStringList::split("+",_name);
    l.sort();
    name = l.join("+");
    label = _label;
    event = _event;
    modifier = _modifier;

}


KeyButton::KeyButton(QWidget *parent,
        unsigned int pos_x,unsigned int pos_y,
        unsigned int width, unsigned int height,const QColor &keycolor,
        bool toggled,const char *name)
 : QPushButton(parent, name)
{
    x = pos_x;
    y = pos_y;
    w = width;
    h = height;
    holded = false;
    color = keycolor;
    if (toggled) setToggleButton(true);
    timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(hold()));

//    QToolTip::add(this,l.replace('\n',' ') + "\n[" + event + "]");

    setSizePolicy(QSizePolicy::Fixed,QSizePolicy::Fixed);
    setFixedHeight(h * 20);
    setFixedWidth(w * 20);
    setPaletteBackgroundColor(color);
    
    if (isToggleButton()) {
        connect(this,SIGNAL(toggled(bool)),this,SLOT(keyToggled(bool)));
    } else {
        connect(this,SIGNAL(pressed()),this,SLOT(keyPressed()));
        connect(this,SIGNAL(released()),this,SLOT(keyReleased()));
    }
}


KeyButton::~KeyButton()
{
}


/*!
    \fn KeyButton::updateLabel()
 */
void KeyButton::updateLabel()
{
    QFont f = font();
    int s = (w > h ? h : w);
    if (current.label.length() > 1) f.setPixelSize(6 * s);
    else f.setPixelSize(12 * s);
    setFont(f);
    setText(current.label);
    update();
    show();
}



/*!
    \fn KeyButton::getX()
 */
int KeyButton::getX()
{
    return x;
}


/*!
    \fn KeyButton::getY()
 */
int KeyButton::getY()
{
    return y;
}


/*!
    \fn KeyButton::getH()
 */
int KeyButton::getH()
{
    return h;
}


/*!
    \fn KeyButton::getW()
 */
int KeyButton::getW()
{
    return w;
}


/*!
    \fn KeyButton::getElement(QDomDocument &doc)
 */
QDomElement KeyButton::getElement(QDomDocument &doc)
{
    QDomElement element = doc.createElement("key");
    element.setAttribute("x",x);
    element.setAttribute("y",y);
    element.setAttribute("width",w);
    element.setAttribute("height",h);
    element.setAttribute("type","button");
    element.setAttribute("color",color.name());

    for(unsigned int i = 0;i < list.count();i ++) {
        QDomElement e = doc.createElement("group");
        e.setAttribute("name",list[i].name);
        e.setAttribute("modifier",list[i].modifier);
        e.setAttribute("event",list[i].event);
        e.appendChild(doc.createTextNode(list[i].label));
        element.appendChild(e);
    }
    return element;
}


/*!
    \fn KeyButton::appendGroup(KeyGroup group)
 */
void KeyButton::appendGroup(KeyGroup group)
{
    list.append(group);
    if (list.count() == 1) {
        current = list[0];
        updateLabel();
    }
}



/*!
    \fn KeyButton::changeGroup(const QString &name)
 */
void KeyButton::changeGroup(const QString &name)
{
    for(unsigned int i = 0;i < list.count();i ++) {
        if ((list[i].name == name) || ((list[i].name == "") && (name == ""))) {
            current = list[i];
            break;
        }
    }
    updateLabel();
}


/*!
    \fn KeyButton::keyPressed()
 */
void KeyButton::keyPressed()
{
    if (!holded) {
        timer->stop();
        timer->start(1000);
        emit pressed(current.event,current.modifier);
    } else {
        setPaletteBackgroundColor(color);
        holded = false;
    }
}


/*!
    \fn KeyButton::keyReleased()
 */
void KeyButton::keyReleased()
{
    timer->stop();
    if (!holded)
        emit released(current.event,current.modifier);
}


/*!
    \fn KeyButton::keyToggled(bool s)
 */
void KeyButton::keyToggled(bool s)
{
    if (s) keyPressed();
    else keyReleased();
}


/*!
    \fn KeyButton::hold()
 */
void KeyButton::hold()
{
    if (!isToggleButton()) {
        holded = true;
        setPaletteBackgroundColor(QColor("red"));
    }
}