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.
tdeutils/khexedit/bitswapwidget.cc

324 lines
6.1 KiB

/*
* khexedit - Versatile hex editor
* Copyright (C) 1999 Espen Sand, espensa@online.no
*
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
*/
#include <qpainter.h>
#include <kglobalsettings.h>
#include "bitswapwidget.h"
CDigitLabel::CDigitLabel( QWidget *parent, uint digit, const char *name )
:QLabel(parent, name), mDigit( digit ), mDotPosition( 0 )
{
setFocusPolicy( StrongFocus );
initialize();
}
CDigitLabel::~CDigitLabel( void )
{
}
void CDigitLabel::initialize( void )
{
QFont font( KGlobalSettings::generalFont() );
font.setBold( true );
setFont( font );
}
void CDigitLabel::paletteChange( const QPalette & )
{
update();
}
void CDigitLabel::setValue( uint digit, bool notify )
{
if( mDigit != digit )
{
if( notify == true )
{
emit valueChanged( this, digit, false );
}
mDigit = digit;
update();
if( notify == true )
{
emit valueChanged( this, mDigit, true );
}
}
}
void CDigitLabel::setDotPosition( uint dotPosition )
{
if( mDotPosition != dotPosition )
{
mDotPosition = dotPosition;
update();
}
}
QSize CDigitLabel::sizeHint( void ) const
{
int h = fontMetrics().height();
QSize s( h, h ); // Retangular
return( s );
}
#include <stdio.h>
void CDigitLabel::drawContents( QPainter *p )
{
QRect cr = contentsRect();
if( hasFocus() == true )
{
p->fillRect( cr, palette().active().highlight() );
p->setPen( palette().active().highlightedText() );
}
else
{
p->fillRect( cr, palette().active().base() );
p->setPen( palette().active().text() );
}
if( mDotPosition != 0 )
{
p->fillRect( cr.x()+2, cr.y()+2, 5, 5, Qt::red ); // UL
/*
if( mDotPosition == 1 )
{
p->fillRect( cr.x()+2, cr.y()+2, 5, 5, red ); // UL
}
else if( mDotPosition == 2 )
{
p->fillRect( cr.width()-7, cr.y()+2, 5, 5, red ); // UR
}
else if( mDotPosition == 3 )
{
p->fillRect( cr.x()+2, cr.height()-7, 5, 5, red ); // LL
}
else if( mDotPosition == 4 )
{
p->fillRect( cr.width()-7, cr.height()-7, 5, 5, red ); // LR
}
*/
}
QString text;
text.setNum( mDigit );
p->drawText( 0, 0, cr.width(), cr.height(), alignment(), text );
}
void CDigitLabel::keyPressEvent( QKeyEvent *e )
{
switch ( e->key() )
{
case Key_Left:
case Key_Up:
emit stepCell( this, false );
break;
case Key_Right:
case Key_Down:
emit stepCell( this, true );
break;
case Key_Escape:
e->ignore(); // Allow dialog or whatever use this one
return;
break;
default:
{
int val = e->text()[0].digitValue();
if( val >= 0 && val <= 7 )
{
setValue( val, true );
}
}
break;
}
e->accept();
}
CByteWidget::CByteWidget( QWidget *parent, const char *name )
:QWidget(parent, name)
{
mHBox = new QHBoxLayout( this, 0 );
for( uint i=0; i<8; i++ )
{
mDigit[i] = new CDigitLabel( this, 7-i );
mDigit[i]->setLineWidth( 1 );
mDigit[i]->setFixedSize( mDigit[i]->sizeHint()*2 );
mDigit[i]->setFrameStyle( QFrame::Panel | QFrame::Sunken );
mDigit[i]->setAlignment( AlignCenter );
connect( mDigit[i], SIGNAL(stepCell(const QObject *, bool )),
this, SLOT(stepCell(const QObject *, bool )));
connect( mDigit[i], SIGNAL(valueChanged(const QObject *, uint, bool )),
this, SLOT(valueChanged(const QObject *, uint, bool )));
mHBox->addWidget( mDigit[i] );
}
mHBox->addStretch();
}
CByteWidget::~CByteWidget( void )
{
for( uint i=0; i<8; i++ ) { delete mDigit[i]; }
delete mHBox;
}
void CByteWidget::stepCell( const QObject *obj, bool next )
{
for( uint i=0; i<8; i++ )
{
if( obj == mDigit[i] )
{
if( next == true )
{
mDigit[(i+1)%8]->setFocus();
}
else
{
mDigit[(i+7)%8]->setFocus();
}
}
}
}
void CByteWidget::valueChanged( const QObject *obj, uint val, bool after )
{
if( after == false )
{
for( uint i=0; i<8; i++ )
{
if( obj == mDigit[i] )
{
uint tmp = 7-mDigit[i]->value();
mDigit[tmp]->setValue( mDigit[i]->value(), false );
break;
}
}
if( mDigit[7-val]->value() != val )
{
uint tmp = mDigit[7-val]->value();
mDigit[7-tmp]->setValue( tmp, false );
mDigit[7-val]->setValue( val, false );
}
}
else
{
setBuddy( obj );
uint pos = 1;
for( uint i=0; i<8; i++ )
{
if( mDigit[i]->value() < (7-i) )
{
mDigit[i]->setDotPosition( pos );
mDigit[7-mDigit[i]->value()]->setDotPosition( pos );
pos++;
}
else if( mDigit[i]->value() == (7-i) )
{
mDigit[i]->setDotPosition( 0 );
}
}
}
}
void CByteWidget::reset( void )
{
for( uint i=0; i<8; i++ )
{
mDigit[i]->setValue( 7-i, false );
mDigit[i]->setDotPosition( 0 );
}
}
void CByteWidget::setBuddy( const QObject *obj )
{
for( uint i=0; i<8; i++ )
{
if( obj == mDigit[i] )
{
uint val = mDigit[i]->value();
if( val < 8 )
{
mDigit[7-val]->setValue( 7-i, false );
}
break;
}
}
}
bool CByteWidget::flag( QByteArray &buf )
{
bool swapPresent = false;
uint i, j;
buf.resize( 8 );
for( i=0; i<8; buf[i++] = 0 );
for( i=j=0; i<8; i++ )
{
if( mDigit[i]->value() < (7-i) )
{
buf[j] = 7 - i; j++;
buf[j] = mDigit[i]->value(); j++;
swapPresent = true;
}
}
return( swapPresent );
}
#include "bitswapwidget.moc"