diff options
Diffstat (limited to 'krec/krecfilewidgets.cpp')
-rw-r--r-- | krec/krecfilewidgets.cpp | 313 |
1 files changed, 313 insertions, 0 deletions
diff --git a/krec/krecfilewidgets.cpp b/krec/krecfilewidgets.cpp new file mode 100644 index 00000000..44fd6a4e --- /dev/null +++ b/krec/krecfilewidgets.cpp @@ -0,0 +1,313 @@ +/*************************************************************************** + copyright : (C) 2003 by Arnold Krille + email : arnold@arnoldarts.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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; version 2 of the License. * + * * + ***************************************************************************/ + +#include "krecfilewidgets.h" +#include "krecfilewidgets.moc" + +#include "krecfile.h" +#include "krecglobal.h" + +#include <kdebug.h> +#include <klocale.h> +#include <qlayout.h> +#include <qlabel.h> +#include <qpainter.h> +#include <qpointarray.h> +#include <qlineedit.h> +#include <kinputdialog.h> +#include <qregion.h> +#include <qrect.h> +#include <qfont.h> +#include <qfontmetrics.h> +#include <kpopupmenu.h> +#include <kactionclasses.h> +#include <kaction.h> + +KRecFileWidget::KRecFileWidget( KRecFile* file, QWidget* p, const char* n ) + : QFrame( p,n ) + , _file( 0 ) +{ + kdDebug( 60005 ) << k_funcinfo << file << endl; + setFrameStyle( QFrame::Panel|QFrame::Sunken ); + setLineWidth( 1 ); + setMinimumHeight( 20 ); + + setFile( file ); +} +KRecFileWidget::~KRecFileWidget() { + kdDebug( 60005 ) << k_funcinfo << endl; +} + +void KRecFileWidget::setFile( KRecFile* file ) { +kdDebug( 60005 ) << k_funcinfo << file << endl; + if ( _file != file ) { + _file = file; + //kdDebug( 60005 ) << "Removing widgets" << endl; + QValueList<KRecBufferWidget*>::iterator it = bufferwidgets.begin(); + while ( it != bufferwidgets.end() ) { + delete ( *it ); + ++it; + } + bufferwidgets.clear(); + resizeEvent(); + if ( _file ) { + for ( QValueList<KRecBuffer*>::iterator it = _file->_buffers.begin(); it != _file->_buffers.end(); ++it ) { + newBuffer( ( *it ) ); + } + connect( _file, SIGNAL( sNewBuffer( KRecBuffer* ) ), this, SLOT( newBuffer( KRecBuffer* ) ) ); + connect( _file, SIGNAL( sDeleteBuffer( KRecBuffer* ) ), this, SLOT( deleteBuffer( KRecBuffer* ) ) ); + //kdDebug( 60005 ) << _file->_currentBuffer << endl; + } + } +} + +void KRecFileWidget::resizeEvent( QResizeEvent* /*qre*/ ) { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _file ) { + int w = contentsRect().width(); + int h = contentsRect().height(); + QValueList<KRecBufferWidget*>::iterator it; + for ( it = bufferwidgets.begin(); it != bufferwidgets.end(); ++it ) { + int width, x; + if ( !_file->offsetSize()==0 && !( *it )->buffer()->size()==0 ) { + width = int ( float( ( *it )->buffer()->size() ) / _file->offsetSize() * w ); + x = int( float( ( *it )->buffer()->startpos() ) / _file->size() * w ) + contentsRect().left() ; + } else { + width = 5; + x = contentsRect().left(); + } + ( *it )->setGeometry( x, contentsRect().top(), width, h ); + } + } +} + +void KRecFileWidget::mouseReleaseEvent( QMouseEvent* qme ) { + kdDebug( 60005 ) << k_funcinfo << "(" << qme->x() << "|" << qme->y() << ")" << endl; +} + +void KRecFileWidget::newBuffer( KRecBuffer* buffer ) { + //kdDebug( 60005 ) << k_funcinfo << buffer << endl; + KRecBufferWidget *tmp = new KRecBufferWidget( buffer, this ); + connect( tmp, SIGNAL( popupMenu( KRecBufferWidget*, QPoint ) ), this, SLOT( popupMenu( KRecBufferWidget*, QPoint ) ) ); + bufferwidgets.append( tmp ); + tmp->show(); + resizeEvent(); +} +void KRecFileWidget::deleteBuffer( KRecBuffer* buffer ) { + //kdDebug( 60005 ) << k_funcinfo << buffer << endl; + QValueList<KRecBufferWidget*>::iterator it = bufferwidgets.begin(); + KRecBufferWidget* tmp = 0; + while ( it != bufferwidgets.end() ) { + if ( ( *it )->buffer() == buffer ) tmp = ( *it ); + ++it; + } + if ( tmp != 0 ) { + delete tmp; + bufferwidgets.remove( tmp ); + } +} + +void KRecFileWidget::popupMenu( KRecBufferWidget* bw, QPoint pos ) { + KPopupMenu tmp( this ); + KToggleAction* _activeaction = new KToggleAction( i18n( "Toggle Active/Disabled State" ), KShortcut(), this ); + _activeaction->setChecked( bw->buffer()->active() ); + connect( _activeaction, SIGNAL( toggled( bool ) ), bw->buffer(), SLOT( setActive( bool ) ) ); + KAction* _removeaction = new KAction( i18n( "Remove This Part" ), "fileremove", KShortcut(), bw->buffer(), SLOT( deleteBuffer() ), this ); + KAction* _changetitle = new KAction( i18n( "Change Title of This Part" ), KShortcut(), bw, SLOT( changeTitle() ), this ); + KAction* _changecomment = new KAction( i18n( "Change Comment of This Part" ), KShortcut(), bw, SLOT( changeComment() ), this ); + _activeaction->plug( &tmp ); + _changetitle->plug( &tmp ); + _changecomment->plug( &tmp ); + tmp.insertSeparator(); + _removeaction->plug( &tmp ); + + tmp.exec( pos ); + + delete _removeaction; + delete _changecomment; + delete _changetitle; + delete _activeaction; +} + + + +KRecBufferWidget::KRecBufferWidget( KRecBuffer* buffer, QWidget* p, const char* n ) + : QFrame( p,n ) + , _buffer( buffer ) + , _main_region( 0 ), _title_region( 0 ), _fileend_region( 0 ) + , alreadyreadsize( 0 ) +{ + connect( _buffer, SIGNAL( somethingChanged() ), this, SLOT( update() ) ); + kdDebug( 60005 ) << k_funcinfo << endl; +} +KRecBufferWidget::~KRecBufferWidget() { + kdDebug( 60005 ) << k_funcinfo << endl; +} + +void KRecBufferWidget::resizeEvent( QResizeEvent* ) { + //kdDebug( 60005 ) << k_funcinfo << endl; +} + +void KRecBufferWidget::initLayout() { + _title_height = fontMetrics().boundingRect( _buffer->filename() ).height() + 4; + if( height()/5 > _title_height ) _title_height = height()/5; + int _title_width = fontMetrics().boundingRect( _buffer->filename() ).width() + 10; + if ( _title_width > width() ) _title_width = width(); + if ( _main_region ) delete _main_region; + _main_region = new QRegion( QRect( 0, _title_height, width(), height()-_title_height ) ); + if ( _title_region ) delete _title_region; + if ( _buffer->active() ) + _title_region = new QRegion( QRect( 0, 0, _title_width, _title_height ) ); + else + _title_region = new QRegion( QRect( 0, _title_height/2, _title_width, _title_height/2 ) ); + if ( _fileend_region ) { delete _fileend_region; _fileend_region=0; } + if ( _buffer->active() ) + _fileend_region = new QRegion( QRect( width()-4, _title_height/2, 4, _title_height/2 ) ); + else + _fileend_region = new QRegion( QRect( width()-4, _title_height/4*3, 4, _title_height/4 ) ); + + setMask( _main_region->unite( *_title_region ).unite( *_fileend_region ) ); + + _topleft = _title_region->boundingRect().topLeft(); + _bottomleft = _main_region->boundingRect().bottomLeft(); + _bottomright = _main_region->boundingRect().bottomRight(); + _topright = _main_region->boundingRect().topRight(); + _bottommiddle = _title_region->boundingRect().bottomRight(); + _bottommiddle += QPoint( 0, 1 ); + _topmiddle = _title_region->boundingRect().topRight(); +} +void KRecBufferWidget::drawFrame( QPainter* p ) { + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( _buffer->active() ) + p->setBrush( colorGroup().highlight() ); + else + p->setBrush( colorGroup().highlight().dark() ); + p->setPen( QPen( colorGroup().dark(), 1 ) ); + p->drawRect( _title_region->boundingRect() ); + p->drawRect( _fileend_region->boundingRect() ); + + p->setBrush( QBrush() ); + p->setPen( QPen( colorGroup().dark(), 1 ) ); + p->drawRect( _main_region->boundingRect() ); + + p->setPen( QPen( colorGroup().highlightedText() ) ); + p->drawText( _title_region->boundingRect(), Qt::AlignCenter, _buffer->title() ); + +} +void KRecBufferWidget::drawContents( QPainter* p ) { + //kdDebug( 60005 ) << k_funcinfo << endl; + initSamples(); + int space = ( _main_region->boundingRect().height() - 2 ) / 2; + int xoffset = _main_region->boundingRect().top() + space + 1; + p->setPen( QPen( QColor( 0,0,255 ) ) ); + for ( uint i=0; i<samples1.count(); i++ ) + p->drawPoint( i, int( samples1[ i ]->getMax() * space + xoffset ) ); + for ( uint i=0; i<samples1.count(); i++ ) + p->drawPoint( i, int( samples1[ i ]->getMin() * space + xoffset ) ); + p->setPen( QPen( QColor( 255,0,0 ) ) ); + for ( uint i=0; i<samples1.count(); i++ ) + p->drawPoint( i, int( samples1[ i ]->getValue() * space + xoffset ) ); + p->setPen( QPen( QColor( 0,0,0 ) ) ); + QString comment = _buffer->comment(); + if ( comment.isNull() ) comment = i18n( "Lots of Data" ); + p->drawText( _main_region->boundingRect(), Qt::AlignCenter, comment ); +} +void KRecBufferWidget::paintEvent( QPaintEvent* ) { + initLayout(); + QPainter *p = new QPainter( this ); + drawFrame( p ); + drawContents( p ); + delete p; +} + +void KRecBufferWidget::mousePressEvent( QMouseEvent* qme ) { + kdDebug( 60005 ) << k_funcinfo << endl; + if ( _main_region->contains( qme->pos() ) || _title_region->contains( qme->pos() ) ) + if ( qme->button() == Qt::RightButton ) + emit popupMenu( this, qme->globalPos() ); +} +void KRecBufferWidget::mouseDoubleClickEvent( QMouseEvent* qme ) { + if ( _title_region->contains( qme->pos() ) ) + _buffer->setActive( !_buffer->active() ); +} + +void KRecBufferWidget::initSamples() { +#if 0 + /** + * Experimental. + * + * Doesn't really work since the conversion from char8/char16 to float in + * krecfile.cpp isn't working. + */ + //kdDebug( 60005 ) << k_funcinfo << endl; + if ( alreadyreadsize != _buffer->size() ) { + kdDebug( 60005 ) << k_funcinfo << "something to do" << endl; + while ( samples1.count() > 0 ) { + delete samples1.first(); + samples1.pop_front(); + } + while ( samples2.count() > 0 ) { + delete samples2.first(); + samples2.pop_front(); + } + Sample* tmp = new Sample(); + samples1.append( tmp ); + int j=0; + for ( int i=0; i<= _buffer->sizeInSamples(); ++i ) { + //for ( int i=0; i<= 10000; ++i ) { + if ( j/128 ) { + //kdDebug(60005) << "sample " << i << ": creating new Sample" << endl; + tmp = new Sample(); + samples1.append( tmp ); + j=0; + } + tmp->addValue( _buffer->getSample( i, 0 ) ); + //kdDebug(60005) << "Getting value " << _buffer->getSample( i,0 ) << endl; + ++j; + } + + tmp = new Sample; + samples2.append( tmp ); + j=0; + for ( uint i=0; i<samples1.count(); ++i ) { + if ( j/128 ) { + tmp = new Sample(); + samples2.append( tmp ); + j=0; + } + tmp->addValue( samples1[ i ]->getValue() ); + ++j; + } + +// for ( uint i=0; i<samples1.count(); ++i ) +// kdDebug(60005) << i << ": " << samples1[ i ]->getMin() << " < " << samples1[ i ]->getValue() << " < " << samples1[ i ]->getMax() << endl; + for ( uint i=0; i<samples2.count(); ++i ) + kdDebug(60005) << i << ": " << samples2[ i ]->getMin() << " < " << samples2[ i ]->getValue() << " < " << samples2[ i ]->getMax() << endl; + + alreadyreadsize = _buffer->size(); + } +#endif +} + + +void KRecBufferWidget::changeTitle() { + QString tmp = KInputDialog::getText( i18n( "New Title" ), i18n( "Enter new part title:" ), _buffer->title() ); + if ( !tmp.isNull() ) + _buffer->setTitle( tmp ); +} +void KRecBufferWidget::changeComment() { + QString tmp = KInputDialog::getText( i18n( "New Comment" ), i18n( "Enter new part comment:" ), _buffer->comment() ); + if ( !tmp.isNull() ) + _buffer->setComment( tmp ); +} + |