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.
 
 
 
 
 

234 lines
5.0 KiB

/****************************************************************************
**
** A simple widget to mark and select entries in a list.
**
** Copyright (C) 1997 by Markku Hihnala.
** This class is freely distributable under the GNU Public License.
**
*****************************************************************************/
#include "marklist.h"
#include <qtabdialog.h>
#include <qmultilinedit.h>
#include <qbuttongroup.h>
#include <qradiobutton.h>
#include <qlabel.h>
#include <qcombobox.h>
#include <qlayout.h>
#include <stdio.h>
#include <qstring.h>
#include <qpainter.h>
#include <qdrawutil.h>
#include <kapp.h>
#include <qpopupmenu.h>
#include <klocale.h>
MarkList::MarkList( QWidget * parent , const char * name )
: QTableView( parent, name ), sel(-1), drag(-1), items()
{
setFrameStyle( Panel | Sunken );
setTableFlags( Tbl_autoVScrollBar | Tbl_cutCellsV
| Tbl_snapToVGrid | Tbl_clipCellPainting);
setLineWidth( 2 );
setCellHeight( fontMetrics().lineSpacing() );
setNumCols( 2 );
pup = new QPopupMenu;
pup->setMouseTracking(TRUE);
pup->insertItem( i18n("Mark current"), this, SLOT(markSelected()) );
pup->insertItem( i18n("Unmark current"), this, SLOT(unmarkSelected()) );
pup->insertItem( i18n("Mark all"), this, SLOT(markAll()) );
pup->insertItem( i18n("Mark even"), this, SLOT(markEven()) );
pup->insertItem( i18n("Mark odd"), this, SLOT(markOdd()) );
pup->insertItem( i18n("Toggle marks"), this, SLOT(toggleMarks()) );
pup->insertItem( i18n("Remove marks"), this, SLOT(removeMarks()) );
}
void MarkList::insertItem ( const char *text, int index)
{
MarkListItem *mli = new MarkListItem( text );
items.insert( index, mli );
setNumRows( items.count() );
}
int MarkList::count()
{
return items.count();
}
void MarkList::setAutoUpdate ( bool enable)
{
QTableView::setAutoUpdate( enable );
if (enable) update();
}
void MarkList::clear()
{
items.clear();
sel = -1;
update();
}
int MarkList::cellWidth( int col )
{
return col==0 ? 16 : width()-16-2*frameWidth();
}
void MarkList::paintCell( QPainter *p, int row, int col)
{
if ( col == 0 && items.at( row )->mark() )
{
p->setBrush( red );
p->drawEllipse( 5, 4, 6, 6 );
}
if ( col == 1 )
{
if ( items.at( row )->select() )
{
QColorGroup cg = QApplication::palette().normal();
QBrush tmpB(colorGroup().light());
qDrawShadePanel( p, 0, 0, cellWidth( 1 ) - 1, cellHeight(),
cg, FALSE, 1, &tmpB);
}
QFontMetrics fm = p->fontMetrics();
int yPos; // vertical text position
if ( 10 < fm.height() )
yPos = fm.ascent() + fm.leading()/2;
else
yPos = 5 - fm.height()/2 + fm.ascent();
p->drawText( 4, yPos, items.at( row )->text() );
}
}
void MarkList::mousePressEvent ( QMouseEvent *e )
{
int i = findRow( e->pos().y() );
if ( i == -1 )
return;
MarkListItem *it = items.at( i );
if ( e->button() == LeftButton )
select( i );
else if ( e->button() == RightButton )
pup->popup( mapToGlobal( e->pos() ) );
else if ( e->button() == MidButton )
{
it->setMark( !it->mark() );
updateCell( i, 0 );
drag = i;
}
}
void MarkList::mouseMoveEvent ( QMouseEvent *e )
{
if (e->state() != MidButton)
return;
int i = findRow( e->pos().y() );
if ( i == drag || i == -1 )
return;
do {
drag += i > drag ? 1 : -1;
items.at( drag )->setMark( !items.at( drag )->mark() );
updateCell( drag, 0 );
} while ( i != drag );
}
void MarkList::select( int i )
{
if ( i < 0 || i >= int(items.count()) || i == sel )
return;
MarkListItem *it = items.at( i );
if ( sel != -1 )
{
items.at( sel )->setSelect( FALSE );
updateCell( sel, 1 );
}
it->setSelect( TRUE );
sel = i;
updateCell( i, 1 );
emit selected( i );
emit selected( it->text() );
if ( ( i<=0 || rowIsVisible( i-1 ) ) &&
( i>=int(items.count())-1 || rowIsVisible( i+1 ) ) )
return;
setTopCell( QMAX( 0, i - viewHeight()/cellHeight()/2 ) );
}
void MarkList::markSelected()
{
if ( sel == -1 )
return;
MarkListItem *it = items.at( sel );
it->setMark( TRUE );
updateCell( sel, 0 );
}
void MarkList::unmarkSelected()
{
if ( sel == -1 )
return;
MarkListItem *it = items.at( sel );
it->setMark( FALSE );
updateCell( sel, 0 );
}
void MarkList::markAll()
{
changeMarks( 1 );
}
void MarkList::markEven()
{
changeMarks( 1, 2 );
}
void MarkList::markOdd()
{
changeMarks( 1, 1 );
}
void MarkList::removeMarks()
{
changeMarks( 0 );
}
void MarkList::toggleMarks()
{
changeMarks( 2 );
}
void MarkList::changeMarks( int how, int which )
{
MarkListItem *it;
QString t;
setUpdatesEnabled( FALSE );
for ( int i=items.count(); i-->0 ; )
{
if ( which )
{
t = items.at( i )->text();
if ( t.toInt() % 2 == which - 1 )
continue;
}
it = items.at( i );
if ( how == 2 )
it->setMark( ! it->mark() );
else it->setMark( how );
updateCell( i, 0 );
}
setUpdatesEnabled( TRUE );
}
QStrList *MarkList::markList()
{
QStrList *l = new QStrList;
for ( unsigned i=0 ; i < items.count(); i++ )
if ( ( items.at( i ) )->mark() )
l->append( items.at( i )->text() );
return l;
}