You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ktechlab/src/electronics/components/pushswitch.cpp

205 lines
5.6 KiB

/***************************************************************************
* Copyright (C) 2005 by David Saxton *
* david@bluehaze.org *
* *
* 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. *
***************************************************************************/
#include "canvasitemparts.h"
#include "libraryitem.h"
#include "pushswitch.h"
#include "switch.h"
#include <tdelocale.h>
#include <tqpainter.h>
#include <tqpixmap.h>
#include <tqpoint.h>
#include <tqpointarray.h>
//BEGIN class ECPTBSwitch
Item* ECPTBSwitch::construct( ItemDocument *itemDocument, bool newItem, const char *id )
{
return new ECPTBSwitch( (ICNDocument*)itemDocument, newItem, id );
}
LibraryItem* ECPTBSwitch::libraryItem()
{
return new LibraryItem(
TQString("ec/ptb_switch"),
i18n("Push-to-Break"),
i18n("Switches"),
"ptb.png",
LibraryItem::lit_component,
ECPTBSwitch::construct );
}
ECPTBSwitch::ECPTBSwitch( ICNDocument *icnDocument, bool newItem, const char *id )
: Component( icnDocument, newItem, (id) ? id : "ptb_switch" )
{
m_name = i18n("Push to Break");
setSize( -16, -16, 32, 24 );
addButton( "button", TQRect( -16, 8, 32, 20 ), "" );
createProperty( "button_text", Variant::Type::String );
property("button_text")->setCaption( i18n("Button Text") );
Variant * v = createProperty( "bounce", Variant::Type::Bool );
v->setCaption( i18n("Bounce") );
v->setAdvanced(true);
v->setValue(false);
v = createProperty( "bounce_period", Variant::Type::Double );
v->setCaption( i18n("Bounce Period") );
v->setAdvanced(true);
v->setUnit("s");
v->setValue(5e-3);
init1PinLeft(0);
init1PinRight(0);
m_switch = createSwitch( m_pPNode[0], m_pNNode[0], false );
pressed = false;
}
ECPTBSwitch::~ECPTBSwitch()
{
}
void ECPTBSwitch::dataChanged()
{
button("button")->setText( dataString("button_text") );
bool bounce = dataBool("bounce");
int bouncePeriod_ms = int(dataDouble("bounce_period")*1e3);
m_switch->setBounce( bounce, bouncePeriod_ms );
}
void ECPTBSwitch::drawShape( TQPainter &p )
{
initPainter(p);
int _x = (int)x()-16;
int _y = (int)y()-8;
const int radius = 2;
const int _height = height()-8;
int dy = pressed ? 6 : 4;
p.drawLine( _x+width()/4, _y+dy, _x+(3*width())/4, _y+dy ); // Top horizontal line
p.drawLine( _x, _y+(_height/2)-radius+dy, _x+width(), _y+(_height/2)-radius+dy ); // Bottom horizontal line
p.drawLine( _x+width()/2, _y+dy, _x+width()/2, _y+(_height/2)-radius+dy ); // Vertical line
p.drawEllipse( _x, _y+(_height/2)-radius, 2*radius, 2*radius ); // Left circle
p.drawEllipse( _x+width()-2*radius+1, _y+(_height/2)-radius, 2*radius, 2*radius ); // Right circle
deinitPainter(p);
}
void ECPTBSwitch::buttonStateChanged( const TQString &id, bool state )
{
if ( id != "button" )
return;
m_switch->setState( state ? Switch::Open : Switch::Closed );
pressed = state;
}
//END class ECPTBSwitch
//BEGIN class ECPTMSwitch
Item* ECPTMSwitch::construct( ItemDocument *itemDocument, bool newItem, const char *id )
{
return new ECPTMSwitch( (ICNDocument*)itemDocument, newItem, id );
}
LibraryItem* ECPTMSwitch::libraryItem()
{
return new LibraryItem(
TQString("ec/ptm_switch"),
i18n("Push-to-Make"),
i18n("Switches"),
"ptm.png",
LibraryItem::lit_component,
ECPTMSwitch::construct );
}
ECPTMSwitch::ECPTMSwitch( ICNDocument *icnDocument, bool newItem, const char *id )
: Component( icnDocument, newItem, (id) ? id : "ptm_switch" )
{
m_name = i18n("Push to Make");
setSize( -16, -16, 32, 24 );
addButton( "button", TQRect( -16, 8, 32, 20 ), "" );
createProperty( "button_text", Variant::Type::String );
property("button_text")->setCaption( i18n("Button Text") );
Variant * v = createProperty( "bounce", Variant::Type::Bool );
v->setCaption("Bounce");
v->setAdvanced(true);
v->setValue(false);
v = createProperty( "bounce_period", Variant::Type::Double );
v->setCaption("Bounce Period");
v->setAdvanced(true);
v->setUnit("s");
v->setValue(5e-3);
init1PinLeft(0);
init1PinRight(0);
m_switch = createSwitch( m_pPNode[0], m_pNNode[0], true );
pressed = false;
}
ECPTMSwitch::~ECPTMSwitch()
{
}
void ECPTMSwitch::dataChanged()
{
button("button")->setText( dataString("button_text") );
bool bounce = dataBool("bounce");
int bouncePeriod_ms = int(dataDouble("bounce_period")*1e3);
m_switch->setBounce( bounce, bouncePeriod_ms );
}
void ECPTMSwitch::drawShape( TQPainter &p )
{
initPainter(p);
int _x = (int)x()-16;
int _y = (int)y()-8;
const int radius = 2;
const int _height = height()-8;
int dy = pressed ? 1 : 3;
p.drawLine( _x+width()/4, _y-dy, _x+(3*width())/4, _y-dy ); // Top horizontal line
p.drawLine( _x, _y+(_height/2)-radius-dy, _x+width(), _y+(_height/2)-radius-dy ); // Bottom horizontal line
p.drawLine( _x+width()/2, _y-dy, _x+width()/2, _y+(_height/2)-radius-dy ); // Vertical line
p.drawEllipse( _x, _y+(_height/2)-radius, 2*radius, 2*radius ); // Left circle
p.drawEllipse( _x+width()-2*radius+1, _y+(_height/2)-radius, 2*radius, 2*radius ); // Right circle
deinitPainter(p);
}
void ECPTMSwitch::buttonStateChanged( const TQString &id, bool state )
{
if ( id != "button" ) return;
m_switch->setState( state ? Switch::Closed : Switch::Open );
pressed = state;
}
//END class ECPTMSwitch