-rw-r--r-- | kaddressbook/views/cardview.cpp | 13 |
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 | ||
612 | CardViewItem::Field *CardViewItem::fieldAt( const QPoint & itempos ) const | 612 | CardViewItem::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 | ||
637 | CardView::CardView(QWidget *parent, const char *name) | 637 | CardView::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 | ||
667 | CardView::~CardView() | 668 | CardView::~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 | ||
675 | void CardView::insertItem(CardViewItem *item) | 676 | void 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 | ||
681 | void CardView::takeItem(CardViewItem *item) | 682 | void 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 | ||
690 | void CardView::clear() | 691 | void CardView::clear() |
691 | { | 692 | { |
692 | d->mItemList.clear(); | 693 | d->mItemList.clear(); |
693 | 694 | ||
694 | setLayoutDirty(true); | 695 | setLayoutDirty(true); |
695 | } | 696 | } |
696 | 697 | ||
697 | CardViewItem *CardView::currentItem() | 698 | CardViewItem *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 | ||
704 | void CardView::setCurrentItem( CardViewItem *item ) | 705 | void 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 | ||
1255 | void CardView::contentsMouseDoubleClickEvent(QMouseEvent *e) | 1256 | void 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 | ||
1273 | void CardView::contentsMouseMoveEvent( QMouseEvent *e ) | 1274 | void 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 | ||
1313 | void CardView::enterEvent( QEvent * ) | 1314 | void CardView::enterEvent( QEvent * ) |
1314 | { | 1315 | { |
1315 | d->mTimer->start( 500 ); | 1316 | d->mTimer->start( 500 ); |
1316 | } | 1317 | } |
1317 | 1318 | ||
1318 | void CardView::leaveEvent( QEvent * ) | 1319 | void 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 ); |