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.
tdemultimedia/kscd/bwlednum.cpp

592 lines
13 KiB

/*
* BW_LED_Number a very very primitive LED
*
* Copyright: Bernd Johannes Wuebben, wuebben@math.cornell.edu
*
* $Id$
*
*/
#include "bwlednum.h"
#include "tqbitarray.h"
#include "tqpainter.h"
#include <stdio.h>
#include "bwlednum.moc"
#define NUM_OF_SEGMENTS 8
#define STOP_CHAR 25
static char segs[14][8] =
{ { 0, 1, 2, 4, 5, 6,25, 0}, // 0
{ 2, 5,25, 0, 0, 0, 0, 0}, // 1
{ 1, 2, 3, 4, 6,25 ,0, 0}, // 2
{ 1, 2, 3, 5, 6,25, 0, 0}, // 3
{ 0, 3, 2, 5 ,25, 0, 0, 0}, // 4
{ 0, 1, 3, 5, 6,25, 0, 0}, // 5
{ 0, 1, 3, 4, 5, 6,25, 0}, // 6
{ 1,2 , 5,25, 0, 0, 0, 0}, // 7
{ 0, 1, 2, 3, 4, 5, 6,25}, // 8
{ 0, 1, 2, 3, 5, 6,25, 0}, // 9
{ 3,25, 0, 0, 0, 0, 0, 0}, // -
{ 7,25, 0, 0, 0, 0, 0, 0}, // .
{ 8, 9,25, 0, 0, 0, 0, 0}, // :
{25, 0, 0, 0, 0, 0, 0, 0} }; // blank
BW_LED_Number::BW_LED_Number( TQWidget *parent, const char *name )
: TQFrame( parent, name ){
offcolor = TQColor(100,0,0);
showOffColon(FALSE);
smallLED = false;
current_symbol = ' ';
old_segments = &segs[13][0]; // nothing
current_segments = &segs[13][0]; // nothing
setLEDColor(yellow,black);
}
void dump_segments(char * segs){
printf("dumping segments:");
for (int i = 0; i <=7; i++){
printf("%d:",segs[i]);
}
printf("\n");
}
BW_LED_Number::~BW_LED_Number(){
}
void BW_LED_Number::resizeEvent( TQResizeEvent * ){
}
void BW_LED_Number::mouseReleaseEvent( TQMouseEvent * /* e */ )
{
emit(clicked());
}
void BW_LED_Number::showOffColon(bool off){
show_off_colon = off;
}
void BW_LED_Number::setLEDColor( const TQColor& fgColor, const TQColor& bgColor ){
fgcolor = fgColor;
bgcolor = bgColor;
TQColorGroup old_cg = this->colorGroup();
TQColorGroup new_cg( fgColor, bgColor,
fgColor, fgColor, fgColor,
fgColor, fgColor );
this->setPalette(TQPalette(new_cg, new_cg, new_cg));
}
static char *getSegments( char s)
{
if (s >= '0' && s <= '9'){
return segs[s - '0'];
}
int j;
switch ( s ) {
case '-':
j = 10;
break;
case 'O':
j = 0;
break;
case '.':
j = 11;
break;
case ':':
j = 12;
break;
default:
j = 13;
break;
}
return segs[j];
}
void BW_LED_Number::drawContents( TQPainter *p ){
drawSymbol( p, current_symbol,TRUE );
}
void BW_LED_Number::display(int i ){
if( (i<0) || (i> 9))
return;
display( (char)('0'+ i));
}
void BW_LED_Number::display(char s){
TQPainter p;
p.begin( this );
old_segments = current_segments;
current_symbol = s;
current_segments = getSegments(s);
drawSymbol(&p,s,FALSE);
p.end();
}
void BW_LED_Number::setSmallLED(bool a_boolean){
smallLED = a_boolean;
}
void BW_LED_Number::drawSymbol( TQPainter *p,char ,bool repaint ){
// printf("drawSymbol repaint = %d\n",repaint);
TQPoint pos;
int xSegment_Length, ySegment_Length, Segment_Length, xAdvance;
int Xoffset, Yoffset, space;
space = 1;
xSegment_Length = width()*5/((5 + space) + space) ;
ySegment_Length = height()*5/12;
Segment_Length = ySegment_Length > xSegment_Length ? xSegment_Length : ySegment_Length;
xAdvance = Segment_Length*( 5 + space )/5 +1 ;
// Xoffset = ( width() - xAdvance + Segment_Length/5 )/2; // origininal
Xoffset = ( width() - xAdvance + Segment_Length/4 )/2;
Yoffset = ( height() - Segment_Length*2 )/2;
pos = TQPoint( Xoffset , Yoffset );
if(repaint){
// this draw the non-illumintated segments
if(show_off_colon){// we want to show the colon which is actually ugly and
// by default not shown.
for(int l = 0; l <= NUM_OF_SEGMENTS +1; l++){
drawSegment(pos,(char) l,*p,Segment_Length,TRUE); //erase segment
}
}
else{
for(int l = 0; l <= NUM_OF_SEGMENTS -1; l++){
drawSegment(pos,(char) l,*p,Segment_Length,TRUE); //erase segment
}
}
// now draw the illuminated segments
for(int l = 0; l <= NUM_OF_SEGMENTS -1; l++){
if(current_segments[l] != STOP_CHAR){
drawSegment(pos,current_segments[l],*p,Segment_Length,FALSE); // draw segment
}
else{
break;
}
}
}
else{ // we are not repainting ourselves due to a repaint event but rather
// genuinely changing the symbol that is to be displayed
for(int l = 0; l <= NUM_OF_SEGMENTS -1; l++){
if(current_segments[l] != STOP_CHAR){
if(!seg_contained_in(current_segments[l],old_segments))
drawSegment(pos,current_segments[l],*p,Segment_Length,FALSE); // draw segment
}
else{
break;
}
}
for(int k = 0; k <= NUM_OF_SEGMENTS -1; k++){
if(old_segments[k] != STOP_CHAR){
if(!seg_contained_in(old_segments[k],current_segments))
drawSegment(pos,old_segments[k],*p,Segment_Length,TRUE); //erase segment
}
else{
break;
}
}
}
}
bool BW_LED_Number::seg_contained_in( char c, char* seg){
bool result = FALSE;
while ( *seg != STOP_CHAR){
// printf("Comparing %d with %d\n",c,*seg);
if ( c == *seg )
result = TRUE;
seg++;
}
return result;
}
void BW_LED_Number::setLEDoffColor(TQColor color){
offcolor = color;
}
void BW_LED_Number::drawSegment( const TQPoint &pos, char seg_number, TQPainter &p,
int Segment_Length, bool erase){
TQPoint pt = pos;
TQColorGroup g = colorGroup();
TQColor lightColor,darkColor;
if ( erase ){
lightColor = offcolor;
darkColor = offcolor;
} else {
lightColor = g.light();
darkColor = g.dark();
}
// int Width = (int) Segment_Length/5 ; // original
int Width = (int) Segment_Length/4;
TQBrush brush(g.light());
TQPointArray pts;
pt.ry() += (TQCOORD)Width/2;
if (erase){
p.setBrush(offcolor);
brush.setColor(offcolor);
}
else
p.setBrush(g.light());
if(!smallLED){
switch ( seg_number ) {
case 0 :
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x(), pt.y() ,
pt.x(), pt.y()-Width +1,
pt.x() + Width-1, pt.y());
p.drawPolygon(pts);
pts.setPoints(3,pt.x(), pt.y() + Segment_Length -Width - Width/2 -1 ,
pt.x() + Width -1 , pt.y() -Width +Segment_Length - Width/2 -1,
pt.x() , pt.y() + Segment_Length - 3*Width/4 -1);
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
p.fillRect(pt.x(),pt.y()+ Width/2 -1, Width ,
Segment_Length - Width -Width +1 ,brush);
break;
case 1 :
p.fillRect(pt.x()+Width,pt.y()- Width , Segment_Length -2* Width, Width ,brush);
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x()+1, pt.y()-Width ,
pt.x()+Width, pt.y()-Width ,
pt.x() + Width, pt.y() -1 );
p.drawPolygon(pts);
pts.setPoints(3,pt.x()+ Segment_Length - Width , pt.y() - Width,
pt.x()+ Segment_Length -1, pt.y() - Width,
pt.x() + Segment_Length - Width , pt.y() -1 );
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
break;
case 2 :
pt.rx() += (TQCOORD)(Segment_Length);
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x() , pt.y() ,
pt.x() , pt.y() - Width + 1, // changes from 1 to 2
pt.x() - Width +1, pt.y() );
p.drawPolygon(pts);
pts.setPoints(3,pt.x() , pt.y() + Segment_Length - Width - Width/2 -1,
pt.x() , pt.y() + Segment_Length - 3*Width/4 - 1,
pt.x() - Width +1, pt.y() + Segment_Length - Width - Width/2 -1);
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
p.fillRect(pt.x() - Width+1 ,pt.y() + Width/2- 1, Width ,
Segment_Length - Width - Width + 1 ,brush);
break;
case 3 :
pt.ry() += (TQCOORD)Segment_Length;
p.setPen(g.background());
pts.setPoints(3,pt.x()-1 , pt.y() - Width/2 -1,
pt.x() + Width+2, pt.y()-Width -1 ,//
pt.x() + Width+2, pt.y() );
p.drawPolygon(pts);
pts.setPoints(3,pt.x() + Segment_Length + 1, pt.y() - Width/2 -1 ,
pt.x() + Segment_Length - Width - 2 ,
pt.y() - Width -1,
pt.x() + Segment_Length - Width - 2, pt.y() );
p.drawPolygon(pts);
p.setPen(g.light());
p.fillRect(pt.x() + Width -1 ,pt.y() - Width, Segment_Length- 2* Width + 3,
Width ,brush);
break;
case 4 :
pt.ry() += (TQCOORD)(Segment_Length +1);
p.fillRect(pt.x(), pt.y(), Width , Segment_Length - Width - Width/2 ,brush);
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x(), pt.y(),
pt.x(), pt.y()-Width+1,
pt.x() + Width-1, pt.y());
p.drawPolygon(pts);
pts.setPoints(3,pt.x(), pt.y() + Segment_Length -Width - Width/2 -1 ,
pt.x() + Width -1 , pt.y() -Width +Segment_Length - Width/2 -1 ,
pt.x() , pt.y() + Segment_Length - 3*Width/4 -1);
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
break;
case 5 :
pt.rx() += (TQCOORD)(Segment_Length );
pt.ry() += (TQCOORD)(Segment_Length +1);
p.fillRect(pt.x() - Width +1 ,pt.y(), Width ,
Segment_Length - Width - Width/2 ,brush);
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x() , pt.y(),
pt.x() , pt.y() - Width +1,
pt.x() - Width +1, pt.y());
p.drawPolygon(pts);
pts.setPoints(3,pt.x() , pt.y() + Segment_Length - Width - Width/2 -1,
pt.x() , pt.y() + Segment_Length - 3*Width/4 -1,
pt.x() - Width +1, pt.y() + Segment_Length - Width - Width/2 -1);
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
break;
case 6 :
pt.ry() += (TQCOORD)(Segment_Length*2 );
p.fillRect(pt.x() + Width ,pt.y() -Width , Segment_Length -2* Width ,
Width ,brush);
if (erase)
p.setPen(offcolor);
pts.setPoints(3,pt.x()+1, pt.y()-1,
pt.x() + Width, pt.y() - Width,
pt.x() + Width, pt.y() - 1 );
p.drawPolygon(pts);
pts.setPoints(3, pt.x() + Segment_Length - 1, pt.y()-1,
pt.x() + Segment_Length - Width , pt.y() - Width,
pt.x() + Segment_Length - Width , pt.y() - 1 );
p.drawPolygon(pts);
if (erase)
p.setPen(g.light());
break;
case 7 :
pt.rx() += (TQCOORD)(Segment_Length/2);
pt.ry() += (TQCOORD)(Segment_Length*2);
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
break;
case 8 :
pt.ry() += (TQCOORD)(Segment_Length/2 + Width/2);
pt.rx() += (TQCOORD)(Segment_Length/2 - Width/2 + 1);
if (!show_off_colon && erase) {
p.setBrush(bgcolor);
brush.setColor(bgcolor);
}
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
p.moveTo(pt);
if (!show_off_colon && erase) {
p.setBrush(fgcolor);
brush.setColor(fgcolor);
}
break;
case 9 :
pt.ry() += (TQCOORD)(3*Segment_Length/2 + Width/2);
pt.rx() += (TQCOORD)(Segment_Length/2 - Width/2 + 1);
if (!show_off_colon && erase) {
p.setBrush(bgcolor);
brush.setColor(bgcolor);
}
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
if (!show_off_colon && erase) {
p.setBrush(fgcolor);
brush.setColor(fgcolor);
}
break;
}
} /* if (!smallLED) */
else{
pt.ry() += (TQCOORD)Width/2;
switch ( seg_number ) {
case 0 :
p.fillRect(pt.x(),pt.y()+ Width /2, Width , Segment_Length - Width -Width/2 ,brush);
break;
case 1 :
p.fillRect(pt.x()+Width,pt.y()- Width , Segment_Length -2* Width, Width ,brush);
break;
case 2 :
pt.rx() += (TQCOORD)(Segment_Length);
p.fillRect(pt.x()-Width,pt.y()+ Width/2, Width ,
Segment_Length - Width -Width/2 ,brush);
break;
case 3 :
pt.ry() += (TQCOORD)Segment_Length;
p.fillRect(pt.x() + Width ,pt.y() - Width, Segment_Length- 2* Width, Width ,brush);
break;
case 4 :
pt.ry() += (TQCOORD)(Segment_Length );
p.fillRect(pt.x(), pt.y(), Width , Segment_Length - Width - Width/2 ,brush);
break;
case 5 :
pt.rx() += (TQCOORD)(Segment_Length );
pt.ry() += (TQCOORD)(Segment_Length );
p.fillRect(pt.x() - Width ,pt.y(), Width ,
Segment_Length - Width - Width/2 ,brush);
break;
case 6 :
pt.ry() += (TQCOORD)(Segment_Length*2);
p.fillRect(pt.x() + Width ,pt.y() -Width , Segment_Length -2* Width ,
Width ,brush);
break;
case 7 :
pt.rx() += (TQCOORD)(Segment_Length/2);
pt.ry() += (TQCOORD)(Segment_Length*2);
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
break;
case 8 :
pt.ry() += (TQCOORD)(Segment_Length/2 + Width/2);
pt.rx() += (TQCOORD)(Segment_Length/2 - Width/2 + 1);
if (!show_off_colon && erase) {
p.setBrush(bgcolor);
brush.setColor(bgcolor);
}
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
p.moveTo(pt);
if (!show_off_colon && erase) {
p.setBrush(fgcolor);
brush.setColor(fgcolor);
}
break;
case 9 :
pt.ry() += (TQCOORD)(3*Segment_Length/2 + Width/2);
pt.rx() += (TQCOORD)(Segment_Length/2 - Width/2 + 1);
if (!show_off_colon && erase) {
p.setBrush(bgcolor);
brush.setColor(bgcolor);
}
p.fillRect(pt.x() ,pt.y() - Width , Width , Width ,brush);
if (!show_off_colon && erase) {
p.setBrush(fgcolor);
brush.setColor(fgcolor);
}
break;
}
} /* end smallLED */
}