26 #include "hgvgquadrenderer.h" |
26 #include "hgvgquadrenderer.h" |
27 #include "hgvgimage.h" |
27 #include "hgvgimage.h" |
28 #include "hgwidgetitem.h" |
28 #include "hgwidgetitem.h" |
29 #include "trace.h" |
29 #include "trace.h" |
30 |
30 |
|
31 //#include <hbstyleoptioncheckbox.h> |
|
32 //#include <hbcheckbox> |
31 #include <hbgridviewitem> |
33 #include <hbgridviewitem> |
32 #include <hbgridview> |
34 #include <hbgridview> |
33 #include <hbiconitem> |
35 #include <hbiconitem> |
34 #include <qabstractitemmodel> |
36 #include <qabstractitemmodel> |
35 #include "hglongpressvisualizer.h" |
37 #include "hglongpressvisualizer.h" |
48 mRenderer(0), |
50 mRenderer(0), |
49 mTapCount(0), |
51 mTapCount(0), |
50 mAnimateUsingScrollBar(false), |
52 mAnimateUsingScrollBar(false), |
51 mSelectionMode(HgWidget::NoSelection), |
53 mSelectionMode(HgWidget::NoSelection), |
52 mSelectionModel(0), |
54 mSelectionModel(0), |
53 mMarkImage(0), |
55 mMarkImageOn(0), |
|
56 mMarkImageOff(0), |
54 mSpringVelAtDragStart(0), |
57 mSpringVelAtDragStart(0), |
55 mDragged(false), |
58 mDragged(false), |
56 mFramesDragged(0), |
59 mFramesDragged(0), |
57 mHitItemView(NULL), |
60 mHitItemView(NULL), |
58 mLongPressVisualizer(NULL), |
61 mLongPressVisualizer(NULL), |
59 mLongPressTimer(NULL), |
62 mLongPressTimer(NULL), |
60 mHitItemIndex(NULL), |
63 mHitItemIndex(-1), |
61 mItemSizePolicy(HgWidget::ItemSizeUserDefined), |
64 mItemSizePolicy(HgWidget::ItemSizeAutomatic), |
62 mOrientation(Qt::Vertical) |
65 mOrientation(Qt::Vertical), |
|
66 mDelayedScrollToIndex(), |
|
67 mIgnoreTap(false) |
63 { |
68 { |
64 FUNC_LOG; |
69 FUNC_LOG; |
65 |
70 |
66 grabGesture(Qt::PanGesture); |
71 grabGesture(Qt::PanGesture); |
67 grabGesture(Qt::TapGesture); |
72 grabGesture(Qt::TapGesture); |
190 |
196 |
191 void HgContainer::dimensions(qreal &screenSize, qreal &worldSize) |
197 void HgContainer::dimensions(qreal &screenSize, qreal &worldSize) |
192 { |
198 { |
193 const QRectF containerRect(rect()); |
199 const QRectF containerRect(rect()); |
194 |
200 |
195 // TODO, fix logic |
201 if (scrollDirection()== Qt::Vertical) { |
196 if (containerRect.height() > containerRect.width()) { |
|
197 // assume we are in portrait mode, ofcource this might not be the case |
202 // assume we are in portrait mode, ofcource this might not be the case |
198 screenSize = containerRect.height()/(mRenderer->getImageSize().height() + mRenderer->getSpacing().height()); |
203 screenSize = containerRect.height()/(mRenderer->getImageSize().height() + mRenderer->getSpacing().height()); |
199 worldSize = worldWidth(); |
204 worldSize = worldWidth(); |
200 } |
205 } |
201 else{ |
206 else{ |
212 } |
217 } |
213 |
218 |
214 void HgContainer::setOrientation(Qt::Orientation orientation, bool animate) |
219 void HgContainer::setOrientation(Qt::Orientation orientation, bool animate) |
215 { |
220 { |
216 FUNC_LOG; |
221 FUNC_LOG; |
217 |
222 |
218 mOrientation = orientation; |
223 mOrientation = orientation; |
219 mRenderer->setOrientation(orientation, false); |
224 mRenderer->setOrientation(orientation); |
|
225 mRenderer->setScrollDirection(orientation, animate); |
|
226 if (!mSpring.isActive() && mSpring.pos().x() > worldWidth()) |
|
227 boundSpring(); |
|
228 |
220 } |
229 } |
221 |
230 |
222 void HgContainer::scrollToPosition(qreal value, bool animate) |
231 void HgContainer::scrollToPosition(qreal value, bool animate) |
223 { |
232 { |
224 FUNC_LOG; |
233 FUNC_LOG; |
241 |
250 |
242 void HgContainer::scrollTo(const QModelIndex &index) |
251 void HgContainer::scrollTo(const QModelIndex &index) |
243 { |
252 { |
244 FUNC_LOG; |
253 FUNC_LOG; |
245 |
254 |
246 if (index.isValid() && mRenderer->getRowCount() > 0) { |
255 if (index.isValid() && mRenderer->getRowCount() > 0 ) { |
247 scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false); |
256 |
|
257 QRectF containerRect(rect()); |
|
258 if (containerRect.isNull()) { |
|
259 // Container hasn't been resized yet. We need to know the container |
|
260 // size before we can calculate if index we are scrolling to is valid. |
|
261 // Store scrollTo index and scrolling is performed when container is resized. |
|
262 mDelayedScrollToIndex = index; |
|
263 } |
|
264 |
|
265 // Container has some size. We can try to calculate if scrollto index is valid. |
|
266 // ScrollTo index will be the top item in grid and left item on coverflow. |
|
267 |
|
268 if (!mRenderer->coverflowModeEnabled()) { |
|
269 // Grid case |
|
270 int itemsOnScreen = 0; |
|
271 if (scrollDirection()== Qt::Vertical) { |
|
272 const int rowHeight = mRenderer->getImageSize().height() + mRenderer->getSpacing().height(); |
|
273 itemsOnScreen = containerRect.height()/rowHeight; |
|
274 if ((int)containerRect.height()%rowHeight) { |
|
275 itemsOnScreen++; |
|
276 } |
|
277 itemsOnScreen *= rowCount(); |
|
278 if (itemsOnScreen + index.row() > mItems.count()) { |
|
279 int newItem = mItems.count()-itemsOnScreen; |
|
280 |
|
281 if (mItems.count()%rowCount()) |
|
282 newItem += rowCount() - (mItems.count()%rowCount()); |
|
283 if (newItem < 0) |
|
284 newItem = 0; |
|
285 |
|
286 scrollToPosition(QPointF(newItem/mRenderer->getRowCount(),0), false); |
|
287 } else { |
|
288 scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false); |
|
289 } |
|
290 } else { |
|
291 // Scrolldirection is horizontal |
|
292 const int rowWidth = mRenderer->getImageSize().width() + mRenderer->getSpacing().width(); |
|
293 itemsOnScreen = containerRect.width()/rowWidth; |
|
294 if ((int)containerRect.height()%rowWidth) { |
|
295 itemsOnScreen++; |
|
296 } |
|
297 itemsOnScreen *= rowCount(); |
|
298 if (itemsOnScreen + index.row() > mItems.count()) { |
|
299 int newItem = mItems.count()-itemsOnScreen; |
|
300 |
|
301 if (mItems.count()%rowCount()) |
|
302 newItem += rowCount() - (mItems.count()%rowCount()); |
|
303 if (newItem < 0) newItem = 0; |
|
304 |
|
305 scrollToPosition(QPointF(newItem/mRenderer->getRowCount(),0), false); |
|
306 } else { |
|
307 scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false); |
|
308 } |
|
309 } |
|
310 updateBySpringPosition(); |
|
311 } else { |
|
312 // Coverflow case. TODO, this will need some finetuning. |
|
313 scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false); |
|
314 updateBySpringPosition(); |
|
315 } |
248 } |
316 } |
249 } |
317 } |
250 |
318 |
251 void HgContainer::itemDataChanged(const QModelIndex &firstIndex, const QModelIndex &lastIndex) |
319 void HgContainer::itemDataChanged(const QModelIndex &firstIndex, const QModelIndex &lastIndex) |
252 { |
320 { |
325 } |
393 } |
326 |
394 |
327 int HgContainer::flags(int index) const |
395 int HgContainer::flags(int index) const |
328 { |
396 { |
329 if (index >= 0 && index < itemCount()) { |
397 if (index >= 0 && index < itemCount()) { |
330 if (mSelectionModel && mSelectionModel->isSelected(mSelectionModel->model()->index(index, 0))) { |
398 if (mSelectionMode != HgWidget::NoSelection) { |
331 return 1; // TODO: Assign flag to mark indicator |
399 // TODO, fix these returns values when we can use the checkbox indicators. |
|
400 if (mSelectionModel && mSelectionModel->isSelected(mSelectionModel->model()->index(index, 0))) { |
|
401 return 1; // TODO: Assign flag to mark indicator |
|
402 } else |
|
403 return 0; |
332 } |
404 } |
333 } |
405 } |
334 return 0; |
406 return 0; |
335 } |
407 } |
336 |
408 |
337 const HgImage *HgContainer::indicator(int flags) const |
409 const HgImage *HgContainer::indicator(int flags) const |
338 { |
410 { |
339 if (flags & 1) { |
411 if (flags & 1) { |
340 return mMarkImage; |
412 return mMarkImageOn; |
|
413 } |
|
414 else if (flags & 2) { |
|
415 return mMarkImageOff; |
341 } |
416 } |
342 |
417 |
343 return 0; |
418 return 0; |
344 } |
419 } |
345 |
420 |
361 |
436 |
362 void HgContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
437 void HgContainer::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
363 { |
438 { |
364 Q_UNUSED(option) |
439 Q_UNUSED(option) |
365 Q_UNUSED(widget) |
440 Q_UNUSED(widget) |
|
441 |
|
442 // update spring position at paint if needed, |
|
443 // this is hack for scrollbar, since dragging it |
|
444 // causes also paint events in here |
366 if (mSpring.updatePositionIfNeeded()) |
445 if (mSpring.updatePositionIfNeeded()) |
367 { |
446 { |
368 // spring works always in one dimension, that is, x coord. |
|
369 qreal pos = mSpring.pos().x(); |
447 qreal pos = mSpring.pos().x(); |
370 onScrollPositionChanged(pos); |
448 onScrollPositionChanged(pos); |
371 emit scrollPositionChanged(pos, true); |
449 emit scrollPositionChanged(pos, true); |
372 } |
450 } |
373 |
451 |
374 QRectF vp = painter->viewport(); |
452 QPainter::RenderHints hints = painter->renderHints(); |
375 QRectF rts = mapRectToScene(drawableRect()); |
453 painter->setRenderHint(QPainter::SmoothPixmapTransform, true); |
376 QRectF r; |
454 |
377 |
|
378 // transform rectangle to vg space & |
|
379 // rotate rendering according to orientation |
|
380 if (mOrientation == Qt::Horizontal) { |
|
381 r = QRectF(vp.width()-(rts.height()+rts.top()), rts.left(), rts.height(), rts.width()); |
|
382 |
|
383 mRenderer->setRect(r); |
|
384 |
|
385 mRenderer->setCameraRotationZ(-90); |
|
386 } |
|
387 else { |
|
388 r = QRectF(rts.left(), vp.height()-(rts.height()+rts.top()), rts.width(), rts.height()); |
|
389 mRenderer->setCameraRotationZ(0); |
|
390 |
|
391 mRenderer->setRect(r); |
|
392 |
|
393 if (!mSpring.isActive() && mSpring.pos().x() > worldWidth()) |
|
394 boundSpring(); |
|
395 } |
|
396 |
455 |
397 // interpolate spring velocity towards zero, this is done |
456 // interpolate spring velocity towards zero, this is done |
398 // so that spring velocity for rendering doesn't drop directly to |
457 // so that spring velocity for rendering doesn't drop directly to |
399 // zero when dragging starts |
458 // zero when dragging starts |
400 qreal springVel = mSpring.velocity().x(); |
459 qreal springVel = mSpring.velocity().x(); |
406 |
465 |
407 // setup rendering and draw the current view |
466 // setup rendering and draw the current view |
408 mRenderer->setCameraDistance(getCameraDistance(springVel)); |
467 mRenderer->setCameraDistance(getCameraDistance(springVel)); |
409 mRenderer->setCameraRotationY(getCameraRotationY(springVel)); |
468 mRenderer->setCameraRotationY(getCameraRotationY(springVel)); |
410 mRenderer->draw(mSpring.startPos(), mSpring.pos(), mSpring.endPos(), |
469 mRenderer->draw(mSpring.startPos(), mSpring.pos(), mSpring.endPos(), |
411 springVel, painter); |
470 springVel, painter, sceneTransform(), rect()); |
412 |
471 |
|
472 painter->setRenderHint(QPainter::SmoothPixmapTransform, false); |
413 } |
473 } |
414 |
474 |
415 void HgContainer::resizeEvent(QGraphicsSceneResizeEvent *event) |
475 void HgContainer::resizeEvent(QGraphicsSceneResizeEvent *event) |
416 { |
476 { |
417 FUNC_LOG; |
477 FUNC_LOG; |
418 |
478 |
419 HbWidget::resizeEvent(event); |
479 HbWidget::resizeEvent(event); |
|
480 |
|
481 if (mDelayedScrollToIndex.isValid()) { |
|
482 scrollTo(mDelayedScrollToIndex); |
|
483 // set scrollto index to invalid value. |
|
484 mDelayedScrollToIndex = QModelIndex(); |
|
485 } |
420 } |
486 } |
421 |
487 |
422 // this needs to be implemented for gesture framework to work |
488 // this needs to be implemented for gesture framework to work |
423 void HgContainer::mousePressEvent(QGraphicsSceneMouseEvent *event) |
489 void HgContainer::mousePressEvent(QGraphicsSceneMouseEvent *event) |
424 { |
490 { |
425 Q_UNUSED(event); |
491 Q_UNUSED(event); |
|
492 if (mSpring.isActive() && !mRenderer->coverflowModeEnabled()) { |
|
493 // We could do some small animation when scrolling is stopped. |
|
494 mSpring.cancel(); |
|
495 update(); |
|
496 mIgnoreTap = true; |
|
497 } else { |
|
498 mIgnoreTap = false; |
|
499 } |
426 } |
500 } |
427 |
501 |
428 void HgContainer::gestureEvent(QGestureEvent *event) |
502 void HgContainer::gestureEvent(QGestureEvent *event) |
429 { |
503 { |
430 FUNC_LOG; |
504 FUNC_LOG; |
472 |
546 |
473 QImage markImage(":/images/mark.svg"); |
547 QImage markImage(":/images/mark.svg"); |
474 if (markImage.isNull()) { |
548 if (markImage.isNull()) { |
475 ERROR("Failed to load :/images/mark.svg"); |
549 ERROR("Failed to load :/images/mark.svg"); |
476 } |
550 } |
477 mMarkImage = mQuadRenderer->createNativeImage(); |
551 mMarkImageOn = mQuadRenderer->createNativeImage(); |
478 HANDLE_ERROR_NULL(mMarkImage); |
552 HANDLE_ERROR_NULL(mMarkImageOn); |
479 if (mMarkImage) { |
553 if (mMarkImageOn) { |
480 mMarkImage->setImage(markImage); |
554 mMarkImageOn->setImage(markImage); |
481 } |
555 } |
482 |
556 |
|
557 /* mMarkImageOn = mQuadRenderer->createNativeImage(); |
|
558 HANDLE_ERROR_NULL(mMarkImageOn); |
|
559 mMarkImageOff = mQuadRenderer->createNativeImage(); |
|
560 HANDLE_ERROR_NULL(mMarkImageOff); |
|
561 |
|
562 // Fetch icons for marking mode (on and off states). |
|
563 QGraphicsItem* checkBox = style()->createPrimitive(HbStyle::P_CheckBox_icon, this); |
|
564 HbIconItem* iconItem = static_cast<HbIconItem*>(checkBox); |
|
565 HbStyleOptionCheckBox checkBoxOption; |
|
566 checkBoxOption.state = QStyle::State_On; |
|
567 style()->updatePrimitive(iconItem, HbStyle::P_CheckBox_icon, &checkBoxOption); |
|
568 |
|
569 if (mMarkImageOn) { |
|
570 mMarkImageOn->setPixmap(iconItem->icon().pixmap()); |
|
571 } |
|
572 |
|
573 checkBoxOption.state = QStyle::State_Off; |
|
574 style()->updatePrimitive(iconItem, HbStyle::P_CheckBox_icon, &checkBoxOption); |
|
575 if (mMarkImageOff) { |
|
576 mMarkImageOff->setPixmap(iconItem->icon().pixmap()); |
|
577 } |
|
578 |
|
579 delete checkBox; |
|
580 */ |
483 connect(&mSpring, SIGNAL(updated()), SLOT(updateBySpringPosition())); |
581 connect(&mSpring, SIGNAL(updated()), SLOT(updateBySpringPosition())); |
|
582 connect(&mSpring, SIGNAL(started()), SIGNAL(scrollingStarted())); |
|
583 connect(&mSpring, SIGNAL(started()), SLOT(onScrollingStarted())); |
484 connect(&mSpring, SIGNAL(ended()), SIGNAL(scrollingEnded())); |
584 connect(&mSpring, SIGNAL(ended()), SIGNAL(scrollingEnded())); |
485 connect(&mSpring, SIGNAL(started()), SIGNAL(scrollingStarted())); |
585 connect(&mSpring, SIGNAL(ended()), SLOT(onScrollingEnded())); |
486 connect(mRenderer, SIGNAL(renderingNeeded()), SLOT(redraw())); |
586 connect(mRenderer, SIGNAL(renderingNeeded()), SLOT(redraw())); |
487 |
587 |
488 } |
588 } |
489 |
589 |
490 qreal HgContainer::worldWidth() const |
590 qreal HgContainer::worldWidth() const |
531 |
631 |
532 qreal pos = mSpring.pos().x(); |
632 qreal pos = mSpring.pos().x(); |
533 qreal delta(0); |
633 qreal delta(0); |
534 qreal itemSide(0); |
634 qreal itemSide(0); |
535 |
635 |
536 if (mOrientation == mRenderer->getOrientation()) { |
636 if (mOrientation == mRenderer->getScrollDirection()) { |
537 delta = gesture->delta().y(); |
637 delta = gesture->delta().y(); |
538 } |
638 } |
539 else { |
639 else { |
540 delta = gesture->delta().x(); |
640 delta = gesture->delta().x(); |
541 } |
641 } |
542 |
642 |
543 if (mRenderer->getOrientation() == Qt::Vertical) |
643 if (mRenderer->getScrollDirection() == Qt::Vertical) |
544 itemSide = mRenderer->getImageSize().height()+mRenderer->getSpacing().height(); |
644 itemSide = mRenderer->getImageSize().height()+mRenderer->getSpacing().height(); |
545 else |
645 else |
546 itemSide = mRenderer->getImageSize().width()+mRenderer->getSpacing().width(); |
646 itemSide = mRenderer->getImageSize().width()+mRenderer->getSpacing().width(); |
547 |
647 |
548 if (gesture->state() == Qt::GestureStarted) { |
648 if (gesture->state() == Qt::GestureStarted) { |
652 FUNC_LOG; |
752 FUNC_LOG; |
653 |
753 |
654 // If there is content, mSelectionModel must always exist - either default or client-provided |
754 // If there is content, mSelectionModel must always exist - either default or client-provided |
655 if (!mSelectionModel) return false; |
755 if (!mSelectionModel) return false; |
656 |
756 |
657 mHitItem = getItemAt(pos, mHitItemIndex); |
757 int index = -1; |
|
758 mHitItem = getItemAt(pos, index); |
658 if (mHitItem) |
759 if (mHitItem) |
659 { |
760 { |
660 int index = mHitItemIndex; |
|
661 |
|
662 HgWidgetItem* item = itemByIndex(index); |
761 HgWidgetItem* item = itemByIndex(index); |
663 if (item && action != DoubleTap) { |
762 if (item && action != DoubleTap) { |
664 if (action == LongTap) { |
763 if (action == LongTap) { |
665 INFO("Long tap:" << item->modelIndex().row()); |
764 INFO("Long tap:" << item->modelIndex().row()); |
|
765 |
666 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
766 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
667 |
767 |
668 if (!mRenderer->coverflowModeEnabled()) |
768 if (!mRenderer->coverflowModeEnabled()) |
669 selectItem(); |
769 selectItem(index); |
670 |
770 |
671 emit longPressed(item->modelIndex(), pos); |
771 emit longPressed(item->modelIndex(), pos); |
672 } |
772 } |
673 else if (mSelectionMode == HgWidget::MultiSelection) { |
773 else if (mSelectionMode == HgWidget::MultiSelection) { |
674 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
774 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
675 INFO("Select:" << item->modelIndex().row()); |
775 INFO("Select:" << item->modelIndex().row()); |
703 update(); // It would be enough to update the item |
803 update(); // It would be enough to update the item |
704 } |
804 } |
705 else { |
805 else { |
706 INFO("Tap:" << item->modelIndex().row()); |
806 INFO("Tap:" << item->modelIndex().row()); |
707 |
807 |
708 if (mRenderer->coverflowModeEnabled()) |
808 if (mRenderer->coverflowModeEnabled()) { //coverflow and t-bone modes |
709 { |
|
710 if (qAbs(qreal(index) - mSpring.pos().x()) < 0.01f) |
809 if (qAbs(qreal(index) - mSpring.pos().x()) < 0.01f) |
711 { |
810 { |
712 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
811 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
713 emit activated(item->modelIndex()); |
812 emit activated(item->modelIndex()); |
714 } |
813 } |
715 else |
814 else |
716 { |
815 { |
717 mSpring.animateToPos(QPointF(index, 0)); |
816 mSpring.animateToPos(QPointF(index, 0)); |
718 } |
817 } |
719 } |
818 } |
720 else |
819 else { //grid mode |
721 { |
820 if (!mIgnoreTap) { |
722 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
821 mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); |
723 selectItem(); |
822 selectItem(index); |
724 emit activated(item->modelIndex()); |
823 emit activated(item->modelIndex()); |
|
824 } |
725 } |
825 } |
726 } |
826 } |
727 } |
827 } |
728 |
828 |
729 return true; |
829 return true; |
736 } |
836 } |
737 } |
837 } |
738 |
838 |
739 bool HgContainer::getItemPoints(int index, QPolygonF& points) |
839 bool HgContainer::getItemPoints(int index, QPolygonF& points) |
740 { |
840 { |
741 QPolygonF poly; |
841 return mRenderer->getItemPoints(index, points); |
742 if (!mRenderer->getItemPoints(index, poly)) |
|
743 return false; |
|
744 |
|
745 bool invertible; |
|
746 QTransform t = qtToVgTransform().inverted(&invertible); |
|
747 |
|
748 points = t.map(poly); |
|
749 return true; |
|
750 } |
842 } |
751 |
843 |
752 QList<QModelIndex> HgContainer::getVisibleItemIndices() const |
844 QList<QModelIndex> HgContainer::getVisibleItemIndices() const |
753 { |
845 { |
754 QList<HgQuad*> quads = mRenderer->getVisibleQuads(); |
846 QList<HgQuad*> quads = mRenderer->getVisibleQuads(); |
764 |
856 |
765 void HgContainer::itemDataChanged(const int &firstIndex, const int &lastIndex) |
857 void HgContainer::itemDataChanged(const int &firstIndex, const int &lastIndex) |
766 { |
858 { |
767 FUNC_LOG; |
859 FUNC_LOG; |
768 |
860 |
769 // if screen is frequently updated no need to update now. |
|
770 if (mSpring.isActive() || mDragged ) return; |
|
771 |
|
772 // TODO FIX THIS FUNCTION!!!!!!!!!!!!!!!!!!!!!! |
|
773 |
|
774 int firstItemOnScreen = 0, lastItemOnScreen = 0; |
861 int firstItemOnScreen = 0, lastItemOnScreen = 0; |
775 firstItemOnScreen = mSpring.pos().x(); |
862 firstItemOnScreen = mSpring.pos().x(); |
776 firstItemOnScreen *= rowCount(); |
863 firstItemOnScreen *= rowCount(); |
777 |
864 |
778 int itemsOnScreen = mRenderer->getVisibleQuads().count(); |
865 int itemsOnScreen = mRenderer->getVisibleQuads().count(); |
816 iconItem->setAspectRatioMode(Qt::IgnoreAspectRatio); |
905 iconItem->setAspectRatioMode(Qt::IgnoreAspectRatio); |
817 iconItem->setIcon(icon); |
906 iconItem->setIcon(icon); |
818 |
907 |
819 mHitItemView->resize(mRenderer->getImageSize().width(), |
908 mHitItemView->resize(mRenderer->getImageSize().width(), |
820 mRenderer->getImageSize().height()); |
909 mRenderer->getImageSize().height()); |
|
910 */ |
821 } |
911 } |
822 |
912 |
823 void HgContainer::updateSelectedItem() |
913 void HgContainer::updateSelectedItem() |
824 { |
914 { |
825 if (!mHitItemView || mHitItemIndex == -1) |
915 if (!mHitItemView || mHitItemIndex == -1) |
827 |
917 |
828 QPolygonF points; |
918 QPolygonF points; |
829 if (!getItemPoints(mHitItemIndex, points)) |
919 if (!getItemPoints(mHitItemIndex, points)) |
830 { |
920 { |
831 // the item was not rendered, we must hide |
921 // the item was not rendered, we must hide |
832 // our qt item |
922 // our qt item |
833 mHitItemView->setVisible(false); |
923 mHitItemView->setVisible(false); |
|
924 return; |
|
925 } |
|
926 |
|
927 QRectF bounds = points.boundingRect(); |
|
928 if (!(rect().contains(bounds) || rect().intersects(bounds))) |
|
929 { |
|
930 mHitItemView->setVisible(false); |
|
931 return; |
834 } |
932 } |
835 |
933 |
836 QPolygonF img; |
934 QPolygonF img; |
837 img.append(QPointF(3,mHitItemView->boundingRect().height()-3)); |
935 img.append(QPointF(3,mHitItemView->boundingRect().height()-3)); |
838 img.append(QPointF(mHitItemView->boundingRect().width()-3,mHitItemView->boundingRect().height()-3)); |
936 img.append(QPointF(mHitItemView->boundingRect().width()-3,mHitItemView->boundingRect().height()-3)); |
840 img.append(QPointF(3,3)); |
938 img.append(QPointF(3,3)); |
841 |
939 |
842 QTransform t; |
940 QTransform t; |
843 QTransform::quadToQuad(img, points, t); |
941 QTransform::quadToQuad(img, points, t); |
844 |
942 |
845 mHitItemView->setTransform(t); |
943 //t.translate(50,50); |
|
944 bool bOk; |
|
945 mHitItemView->setTransform(t * this->transform().inverted(&bOk)); |
846 mHitItemView->setVisible(true); |
946 mHitItemView->setVisible(true); |
847 } |
947 } |
848 |
948 |
849 void HgContainer::unselectItem() |
949 void HgContainer::unselectItem() |
850 { |
950 { |
922 if (mLongPressTimer && mLongPressVisualizer) |
1021 if (mLongPressTimer && mLongPressVisualizer) |
923 { |
1022 { |
924 mLongPressTimer->stop(); |
1023 mLongPressTimer->stop(); |
925 mLongPressVisualizer->stop(); |
1024 mLongPressVisualizer->stop(); |
926 } |
1025 } |
927 } |
|
928 |
|
929 QTransform HgContainer::qtToVgTransform() const |
|
930 { |
|
931 QTransform t; |
|
932 if (mOrientation == Qt::Vertical) |
|
933 { |
|
934 t.translate(0, drawableRect().bottom()); |
|
935 t.scale(1, -1); |
|
936 } |
|
937 else // horizontal |
|
938 { |
|
939 t.translate(drawableRect().bottom(), 0); |
|
940 t.scale(-1, 1); |
|
941 t.translate(0, drawableRect().right()); |
|
942 t.rotate(-90, Qt::ZAxis); |
|
943 } |
|
944 return t; |
|
945 } |
|
946 |
|
947 QPointF HgContainer::mapQtToVg(const QPointF& p) const |
|
948 { |
|
949 QTransform t = qtToVgTransform(); |
|
950 return t.map(p); |
|
951 } |
1026 } |
952 |
1027 |
953 qreal HgContainer::getCameraDistance(qreal springVelocity) |
1028 qreal HgContainer::getCameraDistance(qreal springVelocity) |
954 { |
1029 { |
955 Q_UNUSED(springVelocity) |
1030 Q_UNUSED(springVelocity) |
979 void HgContainer::onScrollPositionChanged(qreal pos) |
1054 void HgContainer::onScrollPositionChanged(qreal pos) |
980 { |
1055 { |
981 Q_UNUSED(pos) |
1056 Q_UNUSED(pos) |
982 } |
1057 } |
983 |
1058 |
|
1059 void HgContainer::onScrollingStarted() |
|
1060 { |
|
1061 // By default do nothing |
|
1062 } |
|
1063 |
|
1064 void HgContainer::onScrollingEnded() |
|
1065 { |
|
1066 // By default do nothing |
|
1067 } |
|
1068 |
984 void HgContainer::handleCurrentChanged(const QModelIndex ¤t) |
1069 void HgContainer::handleCurrentChanged(const QModelIndex ¤t) |
985 { |
1070 { |
986 Q_UNUSED(current) |
1071 Q_UNUSED(current) |
987 // By default do nothing |
1072 // By default do nothing |
988 } |
|
989 |
|
990 QRectF HgContainer::drawableRect() const |
|
991 { |
|
992 return rect(); |
|
993 } |
1073 } |
994 |
1074 |
995 void HgContainer::setDefaultImage(QImage defaultImage) |
1075 void HgContainer::setDefaultImage(QImage defaultImage) |
996 { |
1076 { |
997 HgQuadRenderer *renderer = mRenderer->getRenderer(); |
1077 HgQuadRenderer *renderer = mRenderer->getRenderer(); |