/*************************************************************************** * * * Copyright (C) 2005, 2006 by Kevin Gilbert * * kev.gilbert@cdu.edu.au * * * * 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 #include #include #include #include #include #include #include #include #include #include #include #include "global.h" #include "indexwidget.h" #include "mainwidget.h" #include "scanstack.h" #include "scanwidget.h" // constructor // =========== IndexWidget::IndexWidget( ScanStack* scanStack, MainWidget* parent, const char* name ) : TQScrollView( parent, name ), m_blinkTimer( NULL ), m_scanCount( 0 ), m_scanStack( scanStack ) { setDragAutoScroll( true ); viewport( )->setAcceptDrops( true ); } // calculateIndex // ============== short IndexWidget::calculateIndex( const ushort y ) { TQFontMetrics metrics = fontMetrics( ); byte height = metrics.height( ); ushort index = y / height; return index > m_scanStack->count( ) - 1 ? -1 : index; } // contentsContextMenuEvent // ======================== void IndexWidget::contentsContextMenuEvent( TQContextMenuEvent* event ) { short index = calculateIndex( event->y( )); if( index < 0 ) return; ScanWidget* scanWidget = m_scanStack->makeScanWidgetVisible( index ); emit( visibleScanWidgetChanged( scanWidget )); TQPopupMenu* contextMenu = new TQPopupMenu( this, "context menu" ); TDEIconLoader* iconLoader = TDEGlobal::iconLoader( ); TQIconSet profileLoad = iconLoader->loadIconSet( "profileload", TDEIcon::Small ); TQIconSet profileSave = iconLoader->loadIconSet( "profilesave", TDEIcon::Small ); TQIconSet profileSaveAs = iconLoader->loadIconSet( "profilesaveas", TDEIcon::Small ); TQIconSet scanClose = iconLoader->loadIconSet( "scanclose", TDEIcon::Small ); TQIconSet scanDuplicate = iconLoader->loadIconSet( "scanduplicate", TDEIcon::Small ); TQIconSet scanNew = iconLoader->loadIconSet( "scannew", TDEIcon::Small ); TQIconSet scanRename = iconLoader->loadIconSet( "scanrename", TDEIcon::Small ); contextMenu->insertItem( scanClose, i18n( "&Close scan" ), parent( ), SLOT( slotScanClose( )), CTRL+Key_W ); contextMenu->insertItem( scanDuplicate, i18n( "&Duplicate scan" ), parent( ), SLOT( slotScanDuplicate( )), CTRL+Key_C ); contextMenu->insertItem( scanNew, i18n( "&New scan..." ), parent( ), SLOT( slotScanNew( )), CTRL+Key_N ); contextMenu->insertItem( scanRename, i18n( "&Rename scan..." ), parent( ), SLOT( slotScanRename( )), Key_F2 ); contextMenu->insertItem( i18n( "&Use target host name" ), parent( ), SLOT( slotUseTargetHost( ))); contextMenu->insertSeparator( ); contextMenu->insertItem( profileLoad, i18n( "&Load profile..." ), parent( ), SLOT( slotProfileLoad( ))); contextMenu->insertItem( profileSave, i18n( "&Save profile..." ), parent( ), SLOT( slotProfileSave( ))); contextMenu->insertItem( profileSaveAs, i18n( "&Save profile as..." ), parent( ), SLOT( slotProfileSaveAs( ))); contextMenu->exec( event->globalPos( )); } // contentsDragMoveEvent // ===================== void IndexWidget::contentsDragMoveEvent( TQDragMoveEvent* event ) { short index = calculateIndex( event->pos( ).y( )); index = index < 0 ? m_scanStack->count( ) - 1 : index; ScanWidget* scanWidget = m_scanStack->makeScanWidgetVisible( index ); emit( visibleScanWidgetChanged( scanWidget )); } // contentsMouseMoveEvent // ====================== void IndexWidget::contentsMouseMoveEvent( TQMouseEvent* event ) { if( event->stateAfter( ) != TQt::LeftButton ) return; short index = calculateIndex( event->y( )); if( index < 0 ) return; TQStoredDrag* drag = new TQStoredDrag( "application/octet-stream", this ); drag->dragMove( ); ScanWidget* scanWidget = m_scanStack->moveScanWidget( index ); scanWidget->ignoreTabChanges( true ); m_scanStack->raiseWidget( scanWidget ); scanWidget->ignoreTabChanges( false ); emit( visibleScanWidgetChanged( scanWidget )); } // contentsMousePressEvent // ======================= void IndexWidget::contentsMousePressEvent( TQMouseEvent* event ) { if( event->stateAfter( ) != TQt::LeftButton ) return; short index = calculateIndex( event->y( )); if( index < 0 ) return; ScanWidget* scanWidget = m_scanStack->makeScanWidgetVisible( index ); emit( visibleScanWidgetChanged( scanWidget )); if( scanWidget->state( ) == ScanWidget::finished ) scanWidget->state( ScanWidget::dormant ); } // drawContents // ============ void IndexWidget::drawContents( TQPainter* painter, int clipx, int clipy, int clipw, int cliph ) { painter->fillRect( clipx, clipy, clipw, cliph, TDEGlobalSettings::baseColor( )); painter->setBackgroundMode( TQt::OpaqueMode ); TQFontMetrics metrics = fontMetrics( ); byte height = metrics.height( ); byte aWidth2 = 2 * metrics.width( "*" ); ushort x = height / 2; ushort xMax = 0; ushort y = 0; ushort i; for( m_scanStack->resetScanWidgets( i ); m_scanStack->moreScanWidgets( i ); y += height, m_scanStack->nextScanWidget( i )) { ScanWidget* scanWidget = m_scanStack->currentScanWidget( i ); switch( scanWidget->state( )) { case ScanWidget::dormant: if( m_scanStack->isVisibleWidget( scanWidget )) { painter->fillRect( 0, y, visibleWidth( ), height, TDEGlobalSettings::alternateBackgroundColor( )); painter->setBackgroundColor( TDEGlobalSettings::alternateBackgroundColor( )); painter->setPen( TDEGlobalSettings::buttonTextColor( )); break; } painter->setBackgroundColor( TDEGlobalSettings::baseColor( )); painter->setPen( TDEGlobalSettings::buttonTextColor( )); break; case ScanWidget::finished: painter->fillRect( 0, y, visibleWidth( ), height, TDEGlobalSettings::highlightColor( )); painter->setBackgroundColor( TDEGlobalSettings::highlightColor( )); painter->setPen( TDEGlobalSettings::activeTextColor( )); break; case ScanWidget::running: if( m_highlight ) { painter->fillRect( 0, y, visibleWidth( ), height, TDEGlobalSettings::highlightColor( )); painter->setBackgroundColor( TDEGlobalSettings::highlightColor( )); painter->setPen( TDEGlobalSettings::activeTextColor( )); break; } if( m_scanStack->isVisibleWidget( scanWidget )) { painter->fillRect( 0, y, visibleWidth( ), height, TDEGlobalSettings::alternateBackgroundColor( )); painter->setBackgroundColor( TDEGlobalSettings::alternateBackgroundColor( )); painter->setPen( TDEGlobalSettings::buttonTextColor( )); break; } painter->fillRect( 0, y, visibleWidth( ), height, TDEGlobalSettings::baseColor( )); painter->setBackgroundColor( TDEGlobalSettings::baseColor( )); painter->setPen( TDEGlobalSettings::buttonTextColor( )); break; } if( scanWidget->useTargetHost( )) painter->drawText( x, y + metrics.ascent( ), "*" ); painter->drawText( x + aWidth2, y + metrics.ascent( ), scanWidget->scanName( )); xMax = _max_( xMax, x + aWidth2 + metrics.width( scanWidget->scanName( ))); } if( m_scanCount ) m_highlight = !m_highlight; resizeContents( xMax + height / 2, y ); } // ensureCurrentVisible // ==================== void IndexWidget::ensureCurrentVisible( ) { short index = m_scanStack->indexOfVisibleScanWidget( ); if( index < 0 ) return; TQFontMetrics metrics = fontMetrics( ); short y = index * metrics.height( ) - height( ) / 2; setContentsPos( 0, y ); updateContents( ); } // ensureCurrentVisible // ==================== void IndexWidget::slotRepaint( ) { repaintContents( false ); } // slotScanStarted // =============== void IndexWidget::slotScanStarted( ) { if( m_scanCount++ ) return; Q_ASSERT( m_blinkTimer == NULL ); m_blinkTimer = new TQTimer( this ); connect( m_blinkTimer, SIGNAL( timeout( )), SLOT( slotRepaint( ))); m_blinkTimer->start( 500 ); m_highlight = true; } // slotScanStopped // =============== void IndexWidget::slotScanStopped( ScanWidget* scanWidget ) { scanWidget->state( scanWidget == m_scanStack->visibleWidget( ) ? ScanWidget::dormant : ScanWidget::finished ); updateContents( ); if( --m_scanCount ) return; delete m_blinkTimer; m_blinkTimer = NULL; } #include "indexwidget.moc"