summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--kaddressbook/views/cardview.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/kaddressbook/views/cardview.cpp b/kaddressbook/views/cardview.cpp
index 65f793c..6351c11 100644
--- a/kaddressbook/views/cardview.cpp
+++ b/kaddressbook/views/cardview.cpp
@@ -611,96 +611,97 @@ void CardViewItem::showFullString( const QPoint &itempos, CardViewTip *tip )
611 611
612CardViewItem::Field *CardViewItem::fieldAt( const QPoint & itempos ) const 612CardViewItem::Field *CardViewItem::fieldAt( const QPoint & itempos ) const
613{ 613{
614 int ypos = mView->d->mBFm->height() + 7 + mView->d->mItemMargin; 614 int ypos = mView->d->mBFm->height() + 7 + mView->d->mItemMargin;
615 int iy = itempos.y(); 615 int iy = itempos.y();
616 // skip below caption 616 // skip below caption
617 if ( iy <= ypos ) 617 if ( iy <= ypos )
618 return 0; 618 return 0;
619 // try find a field 619 // try find a field
620 bool showEmpty = mView->showEmptyFields(); 620 bool showEmpty = mView->showEmptyFields();
621 int fh = mView->d->mFm->height(); 621 int fh = mView->d->mFm->height();
622 int maxLines = mView->maxFieldLines(); 622 int maxLines = mView->maxFieldLines();
623 Field *f; 623 Field *f;
624 for ( f = d->mFieldList.first(); f; f = d->mFieldList.next() ) 624 for ( f = d->mFieldList.first(); f; f = d->mFieldList.next() )
625 { 625 {
626 if ( showEmpty || !f->second.isEmpty() ) 626 if ( showEmpty || !f->second.isEmpty() )
627 ypos += ( QMIN( f->second.contains('\n')+1, maxLines ) *fh)+2; 627 ypos += ( QMIN( f->second.contains('\n')+1, maxLines ) *fh)+2;
628 if ( iy <= ypos ) 628 if ( iy <= ypos )
629 break; 629 break;
630 } 630 }
631 return f ? f : 0; 631 return f ? f : 0;
632} 632}
633//END CardViewItem 633//END CardViewItem
634 634
635//BEGIN CardView 635//BEGIN CardView
636 636
637CardView::CardView(QWidget *parent, const char *name) 637CardView::CardView(QWidget *parent, const char *name)
638 : QScrollView(parent, name), 638 : QScrollView(parent, name),
639 d(new CardViewPrivate()) 639 d(new CardViewPrivate())
640{ 640{
641 d->mItemList.setAutoDelete(true); 641 d->mItemList.setAutoDelete(true);
642 d->mSeparatorList.setAutoDelete(true); 642 d->mSeparatorList.setAutoDelete(true);
643 643
644 QFont f = font(); 644 QFont f = font();
645 d->mFm = new QFontMetrics(f); 645 d->mFm = new QFontMetrics(f);
646 f.setBold(true); 646 f.setBold(true);
647 d->mHeaderFont = f; 647 d->mHeaderFont = f;
648 d->mBFm = new QFontMetrics(f); 648 d->mBFm = new QFontMetrics(f);
649 d->mTip = ( new CardViewTip( viewport() ) ), 649 d->mTip = ( new CardViewTip( viewport() ) ),
650 d->mTip->hide(); 650 d->mTip->hide();
651 d->mTimer = ( new QTimer(this, "mouseTimer") ), 651 d->mTimer = ( new QTimer(this, "mouseTimer") ),
652 652
653 viewport()->setMouseTracking( true ); 653 viewport()->setMouseTracking( true );
654 viewport()->setFocusProxy(this); 654 viewport()->setFocusProxy(this);
655 viewport()->setFocusPolicy(WheelFocus); 655 viewport()->setFocusPolicy(WheelFocus);
656 viewport()->setBackgroundMode(PaletteBase); 656 viewport()->setBackgroundMode(PaletteBase);
657 657
658 connect( d->mTimer, SIGNAL(timeout()), this, SLOT(tryShowFullText()) ); 658 connect( d->mTimer, SIGNAL(timeout()), this, SLOT(tryShowFullText()) );
659 connect( this, SIGNAL(executed(CardViewItem *)), this, SIGNAL( doubleClicked(CardViewItem *)) );
659 660
660//US setBackgroundMode(PaletteBackground, PaletteBase); 661//US setBackgroundMode(PaletteBackground, PaletteBase);
661 setBackgroundMode(PaletteBackground); 662 setBackgroundMode(PaletteBackground);
662 663
663 // no reason for a vertical scrollbar 664 // no reason for a vertical scrollbar
664 setVScrollBarMode(AlwaysOff); 665 setVScrollBarMode(AlwaysOff);
665} 666}
666 667
667CardView::~CardView() 668CardView::~CardView()
668{ 669{
669 delete d->mFm; 670 delete d->mFm;
670 delete d->mBFm; 671 delete d->mBFm;
671 delete d; 672 delete d;
672 d = 0; 673 d = 0;
673} 674}
674 675
675void CardView::insertItem(CardViewItem *item) 676void CardView::insertItem(CardViewItem *item)
676{ 677{
677 d->mItemList.inSort(item); 678 d->mItemList.inSort(item);
678 setLayoutDirty(true); 679 setLayoutDirty(true);
679} 680}
680 681
681void CardView::takeItem(CardViewItem *item) 682void CardView::takeItem(CardViewItem *item)
682{ 683{
683 if ( d->mCurrentItem == item ) 684 if ( d->mCurrentItem == item )
684 d->mCurrentItem = item->nextItem(); 685 d->mCurrentItem = item->nextItem();
685 d->mItemList.take(d->mItemList.findRef(item)); 686 d->mItemList.take(d->mItemList.findRef(item));
686 687
687 setLayoutDirty(true); 688 setLayoutDirty(true);
688} 689}
689 690
690void CardView::clear() 691void CardView::clear()
691{ 692{
692 d->mItemList.clear(); 693 d->mItemList.clear();
693 694
694 setLayoutDirty(true); 695 setLayoutDirty(true);
695} 696}
696 697
697CardViewItem *CardView::currentItem() 698CardViewItem *CardView::currentItem()
698{ 699{
699 if ( ! d->mCurrentItem && d->mItemList.count() ) 700 if ( ! d->mCurrentItem && d->mItemList.count() )
700 d->mCurrentItem = d->mItemList.first(); 701 d->mCurrentItem = d->mItemList.first();
701 return d->mCurrentItem; 702 return d->mCurrentItem;
702} 703}
703 704
704void CardView::setCurrentItem( CardViewItem *item ) 705void CardView::setCurrentItem( CardViewItem *item )
705{ 706{
706 if ( !item ) 707 if ( !item )
@@ -1221,98 +1222,98 @@ void CardView::contentsMouseReleaseEvent(QMouseEvent *e)
1221 if ( d->mResizeAnchor ) 1222 if ( d->mResizeAnchor )
1222 { 1223 {
1223 // finish the resizing: 1224 // finish the resizing:
1224 unsetCursor(); 1225 unsetCursor();
1225 // hide rubber bands 1226 // hide rubber bands
1226 int newiw = d->mItemWidth - ((d->mResizeAnchor - d->mRubberBandAnchor)/d->span); 1227 int newiw = d->mItemWidth - ((d->mResizeAnchor - d->mRubberBandAnchor)/d->span);
1227 drawRubberBands( 0 ); 1228 drawRubberBands( 0 );
1228 // we should move to reflect the new position if we are scrolled. 1229 // we should move to reflect the new position if we are scrolled.
1229 if ( contentsX() ) 1230 if ( contentsX() )
1230 { 1231 {
1231 int newX = QMAX( 0, ( d->pressed * ( newiw + d->colspace + d->mSepWidth ) ) - e->x() ); 1232 int newX = QMAX( 0, ( d->pressed * ( newiw + d->colspace + d->mSepWidth ) ) - e->x() );
1232 setContentsPos( newX, contentsY() ); 1233 setContentsPos( newX, contentsY() );
1233 } 1234 }
1234 // set new item width 1235 // set new item width
1235 setItemWidth( newiw ); 1236 setItemWidth( newiw );
1236 // reset anchors 1237 // reset anchors
1237 d->mResizeAnchor = 0; 1238 d->mResizeAnchor = 0;
1238 d->mRubberBandAnchor = 0; 1239 d->mRubberBandAnchor = 0;
1239 return; 1240 return;
1240 } 1241 }
1241 1242
1242 // If there are accel keys, we will not emit signals 1243 // If there are accel keys, we will not emit signals
1243 if ((e->state() & Qt::ShiftButton) || (e->state() & Qt::ControlButton)) 1244 if ((e->state() & Qt::ShiftButton) || (e->state() & Qt::ControlButton))
1244 return; 1245 return;
1245 1246
1246 // Get the item at this position 1247 // Get the item at this position
1247 CardViewItem *item = itemAt(e->pos()); 1248 CardViewItem *item = itemAt(e->pos());
1248 1249
1249 if (item && KGlobalSettings::singleClick()) 1250 if (item && KGlobalSettings::singleClick())
1250 { 1251 {
1251 emit executed(item); 1252 emit executed(item);
1252 } 1253 }
1253} 1254}
1254 1255
1255void CardView::contentsMouseDoubleClickEvent(QMouseEvent *e) 1256void CardView::contentsMouseDoubleClickEvent(QMouseEvent *e)
1256{ 1257{
1257 QScrollView::contentsMouseDoubleClickEvent(e); 1258 QScrollView::contentsMouseDoubleClickEvent(e);
1258 1259
1259 CardViewItem *item = itemAt(e->pos()); 1260 CardViewItem *item = itemAt(e->pos());
1260 1261
1261 if (item) 1262 if (item)
1262 { 1263 {
1263 d->mCurrentItem = item; 1264 d->mCurrentItem = item;
1264 } 1265 }
1265 1266
1266 if (item && !KGlobalSettings::singleClick()) 1267 if (item && !KGlobalSettings::singleClick())
1267 { 1268 {
1268 emit executed(item); 1269 emit executed(item);
1269 } 1270 } else
1270 emit doubleClicked(item); 1271 emit doubleClicked(item);
1271} 1272}
1272 1273
1273void CardView::contentsMouseMoveEvent( QMouseEvent *e ) 1274void CardView::contentsMouseMoveEvent( QMouseEvent *e )
1274{ 1275{
1275 // resizing 1276 // resizing
1276 if ( d->mResizeAnchor ) 1277 if ( d->mResizeAnchor )
1277 { 1278 {
1278 int x = e->x(); 1279 int x = e->x();
1279 if ( x != d->mRubberBandAnchor ) 1280 if ( x != d->mRubberBandAnchor )
1280 drawRubberBands( x ); 1281 drawRubberBands( x );
1281 return; 1282 return;
1282 } 1283 }
1283 1284
1284 if (d->mLastClickOnItem && (e->state() & Qt::LeftButton) && 1285 if (d->mLastClickOnItem && (e->state() & Qt::LeftButton) &&
1285 ((e->pos() - d->mLastClickPos).manhattanLength() > 4)) { 1286 ((e->pos() - d->mLastClickPos).manhattanLength() > 4)) {
1286 1287
1287 startDrag(); 1288 startDrag();
1288 return; 1289 return;
1289 } 1290 }
1290 1291
1291 d->mTimer->start( 500 ); 1292 d->mTimer->start( 500 );
1292 1293
1293 // see if we are over a separator 1294 // see if we are over a separator
1294 // only if we actually have them painted? 1295 // only if we actually have them painted?
1295 if ( d->mDrawSeparators ) 1296 if ( d->mDrawSeparators )
1296 { 1297 {
1297 int colcontentw = d->mItemWidth + (2*d->mItemSpacing); 1298 int colcontentw = d->mItemWidth + (2*d->mItemSpacing);
1298 int colw = colcontentw + d->mSepWidth; 1299 int colw = colcontentw + d->mSepWidth;
1299 int m = e->x()%colw; 1300 int m = e->x()%colw;
1300 if ( m >= colcontentw && m > 0 ) 1301 if ( m >= colcontentw && m > 0 )
1301 { 1302 {
1302 setCursor( SplitVCursor ); // Why does this fail sometimes? 1303 setCursor( SplitVCursor ); // Why does this fail sometimes?
1303 d->mOnSeparator = true; 1304 d->mOnSeparator = true;
1304 } 1305 }
1305 else 1306 else
1306 { 1307 {
1307 setCursor( ArrowCursor ); 1308 setCursor( ArrowCursor );
1308 d->mOnSeparator = false; 1309 d->mOnSeparator = false;
1309 } 1310 }
1310 } 1311 }
1311} 1312}
1312 1313
1313void CardView::enterEvent( QEvent * ) 1314void CardView::enterEvent( QEvent * )
1314{ 1315{
1315 d->mTimer->start( 500 ); 1316 d->mTimer->start( 500 );
1316} 1317}
1317 1318
1318void CardView::leaveEvent( QEvent * ) 1319void CardView::leaveEvent( QEvent * )
@@ -1407,99 +1408,101 @@ void CardView::keyPressEvent( QKeyEvent *e )
1407 case Key_Home: 1408 case Key_Home:
1408 aItem = d->mItemList.first(); 1409 aItem = d->mItemList.first();
1409 setCurrentItem( aItem ); 1410 setCurrentItem( aItem );
1410 break; 1411 break;
1411 case Key_End: 1412 case Key_End:
1412 aItem = d->mItemList.last(); 1413 aItem = d->mItemList.last();
1413 setCurrentItem( aItem ); 1414 setCurrentItem( aItem );
1414 break; 1415 break;
1415 case Key_Prior: // PageUp 1416 case Key_Prior: // PageUp
1416 { 1417 {
1417 // QListView: "Make the item above the top visible and current" 1418 // QListView: "Make the item above the top visible and current"
1418 // TODO if contentsY(), pick the top item of the leftmost visible column 1419 // TODO if contentsY(), pick the top item of the leftmost visible column
1419 if ( contentsX() <= 0 ) 1420 if ( contentsX() <= 0 )
1420 return; 1421 return;
1421 int cw = columnWidth(); 1422 int cw = columnWidth();
1422 int theCol = ( QMAX( 0, ( contentsX()/cw) * cw ) ) + d->mItemSpacing; 1423 int theCol = ( QMAX( 0, ( contentsX()/cw) * cw ) ) + d->mItemSpacing;
1423 aItem = itemAt( QPoint( theCol + 1, d->mItemSpacing + 1 ) ); 1424 aItem = itemAt( QPoint( theCol + 1, d->mItemSpacing + 1 ) );
1424 if ( aItem ) 1425 if ( aItem )
1425 setCurrentItem( aItem ); 1426 setCurrentItem( aItem );
1426 } 1427 }
1427 break; 1428 break;
1428 case Key_Next: // PageDown 1429 case Key_Next: // PageDown
1429 { 1430 {
1430 // QListView: "Make the item below the bottom visible and current" 1431 // QListView: "Make the item below the bottom visible and current"
1431 // find the first not fully visible column. 1432 // find the first not fully visible column.
1432 // TODO: consider if a partly visible (or even hidden) item at the 1433 // TODO: consider if a partly visible (or even hidden) item at the
1433 // bottom of the rightmost column exists 1434 // bottom of the rightmost column exists
1434 int cw = columnWidth(); 1435 int cw = columnWidth();
1435 int theCol = ( (( contentsX() + visibleWidth() )/cw) * cw ) + d->mItemSpacing + 1; 1436 int theCol = ( (( contentsX() + visibleWidth() )/cw) * cw ) + d->mItemSpacing + 1;
1436 // if separators are on, we may need to we may be one column further right if only the spacing/sep is hidden 1437 // if separators are on, we may need to we may be one column further right if only the spacing/sep is hidden
1437 if ( d->mDrawSeparators && cw - (( contentsX() + visibleWidth() )%cw) <= int( d->mItemSpacing + d->mSepWidth ) ) 1438 if ( d->mDrawSeparators && cw - (( contentsX() + visibleWidth() )%cw) <= int( d->mItemSpacing + d->mSepWidth ) )
1438 theCol += cw; 1439 theCol += cw;
1439 1440
1440 // make sure this is not too far right 1441 // make sure this is not too far right
1441 while ( theCol > contentsWidth() ) 1442 while ( theCol > contentsWidth() )
1442 theCol -= columnWidth(); 1443 theCol -= columnWidth();
1443 1444
1444 aItem = itemAt( QPoint( theCol, d->mItemSpacing + 1 ) ); 1445 aItem = itemAt( QPoint( theCol, d->mItemSpacing + 1 ) );
1445 1446
1446 if ( aItem ) 1447 if ( aItem )
1447 setCurrentItem( aItem ); 1448 setCurrentItem( aItem );
1448 } 1449 }
1449 break; 1450 break;
1450 case Key_Space: 1451 case Key_Space:
1451 setSelected( d->mCurrentItem, !d->mCurrentItem->isSelected() ); 1452 setSelected( d->mCurrentItem, !d->mCurrentItem->isSelected() );
1452 emit selectionChanged(); 1453 emit selectionChanged();
1453 break; 1454 break;
1454 case Key_Return: 1455 case Key_Return:
1455 case Key_Enter: 1456 case Key_Enter:
1456 emit returnPressed( d->mCurrentItem ); 1457 {
1457 emit executed( d->mCurrentItem ); 1458 emit returnPressed( d->mCurrentItem );
1459 emit executed( d->mCurrentItem );
1460 }
1458 break; 1461 break;
1459 default: 1462 default:
1460 if ( (e->state() & ControlButton) && e->key() == Key_A ) 1463 if ( (e->state() & ControlButton) && e->key() == Key_A )
1461 { 1464 {
1462 // select all 1465 // select all
1463 selectAll( true ); 1466 selectAll( true );
1464 break; 1467 break;
1465 } 1468 }
1466 // if we have a string, do autosearch 1469 // if we have a string, do autosearch
1467 else if ( ! e->text().isEmpty() && e->text()[0].isPrint() ) 1470 else if ( ! e->text().isEmpty() && e->text()[0].isPrint() )
1468 { 1471 {
1469 1472
1470 } 1473 }
1471 break; 1474 break;
1472 } 1475 }
1473 // handle selection 1476 // handle selection
1474 if ( aItem ) 1477 if ( aItem )
1475 { 1478 {
1476 if ( d->mSelectionMode == CardView::Extended ) 1479 if ( d->mSelectionMode == CardView::Extended )
1477 { 1480 {
1478 if ( (e->state() & ShiftButton) ) 1481 if ( (e->state() & ShiftButton) )
1479 { 1482 {
1480 // shift button: toggle range 1483 // shift button: toggle range
1481 // if control button is pressed, leave all items 1484 // if control button is pressed, leave all items
1482 // and toggle selection current->old current 1485 // and toggle selection current->old current
1483 // otherwise, ?????? 1486 // otherwise, ??????
1484 bool s = ! aItem->isSelected(); 1487 bool s = ! aItem->isSelected();
1485 int from, to, a, b; 1488 int from, to, a, b;
1486 a = d->mItemList.findRef( aItem ); 1489 a = d->mItemList.findRef( aItem );
1487 b = d->mItemList.findRef( old ); 1490 b = d->mItemList.findRef( old );
1488 from = a < b ? a : b; 1491 from = a < b ? a : b;
1489 to = a > b ? a : b; 1492 to = a > b ? a : b;
1490 1493
1491 if ( to - from > 1 ) 1494 if ( to - from > 1 )
1492 { 1495 {
1493 bool b = signalsBlocked(); 1496 bool b = signalsBlocked();
1494 blockSignals(true); 1497 blockSignals(true);
1495 selectAll(false); 1498 selectAll(false);
1496 blockSignals(b); 1499 blockSignals(b);
1497 } 1500 }
1498 1501
1499 //kdDebug()<<"selecting items "<<from<<" - "<<to<<" ( "<<s<<" )"<<endl; 1502 //kdDebug()<<"selecting items "<<from<<" - "<<to<<" ( "<<s<<" )"<<endl;
1500 CardViewItem *item; 1503 CardViewItem *item;
1501 for ( ; from <= to; from++ ) 1504 for ( ; from <= to; from++ )
1502 { 1505 {
1503 item = d->mItemList.at( from ); 1506 item = d->mItemList.at( from );
1504 item->setSelected( s ); 1507 item->setSelected( s );
1505 repaintItem( item ); 1508 repaintItem( item );