--- a/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Fri Apr 16 14:54:01 2010 +0300
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsmenuview.cpp Mon May 03 12:24:59 2010 +0300
@@ -52,16 +52,21 @@
\param window Main window.
*/
-HsMenuView::HsMenuView(HbMainWindow *window):
+HsMenuView::HsMenuView():
mBuilder(),
- mWindow(window),
mModel(NULL),
- mMenuSearch(this),
+ mFirstVisibleIndex(),
+ mLastVisibleIndex(),
mToolBarActionGroup(new QActionGroup(mBuilder.toolBar())),
- mMenuMode(NormalHsMenuMode)
+ mMenuMode(NormalHsMenuMode),
+ mProxyModel(new QSortFilterProxyModel(this))
{
setUpToolBar();
connectItemViewsSignals();
+
+ mProxyModel->setFilterRole(CaItemModel::TextRole);
+ mProxyModel->setFilterKeyColumn(1);
+ mProxyModel->setSortRole(CaItemModel::TextRole);
}
/*!
@@ -98,13 +103,17 @@
}
/*!
- Sets model for item view.
+ Sets model for item view without connecting scroll signals
- \return Model shown by item view.
+ \param model Model to show by item view
*/
-const HsMenuItemModel *HsMenuView::model() const
+void HsMenuView::setModelToView(QAbstractItemModel *model)
{
- return mModel;
+ HSMENUTEST_FUNC_ENTRY("HsMenuView::setModelToView");
+
+ mBuilder.listView()->setModel(model);
+
+ HSMENUTEST_FUNC_EXIT("HsMenuView::setModelToView");
}
/*!
@@ -136,22 +145,6 @@
HSMENUTEST_FUNC_EXIT("HsAllCollectionsState::scrollTo");
}
-/*!
- Scrolls item view to requested item.
- Does not close search panel.
- \param index The index of the item the view is to be scrolled.
- \param hint Where the target item should be positioned in visible area
- after scroll.
- */
-void HsMenuView::scrollToWithoutHidingSearchPanel(const QModelIndex &index,
- HbAbstractItemView::ScrollHint hint)
-{
- HSMENUTEST_FUNC_ENTRY("HsMenuView::scrollToWithoutHidingSearchPanel");
- hideSearchPanelOnScrolling(false);
- scrollTo(index, hint);
- hideSearchPanelOnScrolling(true);
- HSMENUTEST_FUNC_EXIT("HsMenuView::scrollToWithoutHidingSearchPanel");
-}
/*!
Makes the UI to show or hide view label.
@@ -176,20 +169,18 @@
{
HSMENUTEST_FUNC_ENTRY("HsMenuView::setSearchPanelVisible");
if (mBuilder.searchPanel()->isVisible() != visible) {
- const static Hb::SceneItems statusPaneItems(
- Hb::SecondarySoftKeyItem
- | Hb::TitlePaneItem
- | Hb::IndicatorItems);
+ if (visible) {
+ mFirstVisibleIndex = firstVisibleItemIndex();
+ mBuilder.setSearchPanelVisible(visible);
+ mBuilder.view()->hideItems(Hb::AllItems);
+ connectSearchPanelSignals();
- if (visible) {
- mWindow->hideItems(statusPaneItems);
- connectSearchPanelSignals();
} else {
- mWindow->showItems(statusPaneItems);
+ mLastVisibleIndex = firstVisibleItemIndex();
+ mBuilder.view()->showItems(Hb::AllItems);
+ mBuilder.setSearchPanelVisible(visible);
disconnectSearchPanelSignals();
}
-
- mBuilder.setSearchPanelVisible(visible);
}
HSMENUTEST_FUNC_EXIT("HsMenuView::setSearchPanelVisible");
}
@@ -267,6 +258,9 @@
setSearchPanelVisible(true);
HSMENUTEST_FUNC_EXIT("HsMenuView::showSearchPanel");
}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC SKIP
+#endif //COVERAGE_MEASUREMENT skipped: it doubles other method
/*!
* Makes search panel visible.
@@ -278,6 +272,9 @@
setSearchPanelVisible(false);
HSMENUTEST_FUNC_EXIT("HsMenuView::hideSearchPanel");
}
+#ifdef COVERAGE_MEASUREMENT
+#pragma CTC ENDSKIP
+#endif //COVERAGE_MEASUREMENT
/*!
Scrolls item view to requested row.
@@ -294,8 +291,8 @@
/*!
Converts scroll hints.
- \param Qt hint Where the target item should be positioned in visible area
- after scroll.
+ \param Qt hint Where the target item should be positioned in
+ visible area after scroll.
\return Qrbit version of hint
*/
HbAbstractItemView::ScrollHint HsMenuView::convertScrollHint(
@@ -343,6 +340,36 @@
}
/*!
+ Connects \a activated and \a longPressed signals coming from search list
+ view to emit corresponding signal of this object with translated model index
+*/
+void HsMenuView::connectSearchItemViewsSignals()
+{
+ const HbListView *const listView = mBuilder.listView();
+
+ connect(listView, SIGNAL(activated(QModelIndex)),
+ this, SLOT(activatedProxySlot(QModelIndex)));
+ connect(listView, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+ this, SLOT(longPressedProxySlot(HbAbstractViewItem *, QPointF)));
+
+}
+
+/*!
+ Disconnects \a activated and \a longPressed signals coming from list
+ view from to emit corresponding signal
+ of this object with translated model index
+*/
+void HsMenuView::disconnectSearchItemViewsSignals()
+{
+ const HbListView *const listView = mBuilder.listView();
+
+ disconnect(listView, SIGNAL(activated(QModelIndex)),
+ this, SLOT(activatedProxySlot(QModelIndex)));
+ disconnect(listView, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+ this, SLOT(longPressedProxySlot(HbAbstractViewItem *, QPointF)));
+}
+
+/*!
Connects model's \a scrollTo signal with the object \a scrollToRow slot.
*/
void HsMenuView::connectModelSignals()
@@ -366,47 +393,39 @@
*/
void HsMenuView::connectSearchPanelSignals()
{
+ disconnectModelSignals();
+ disconnectItemViewsSignals();
+
+ searchBegins();
+ connectSearchItemViewsSignals();
+
connect(mBuilder.searchPanel(), SIGNAL(exitClicked()),
this, SLOT(hideSearchPanel()));
+ connect(mBuilder.searchPanel(), SIGNAL(criteriaChanged(QString)),
+ this, SLOT(findItem(QString)));
+ scrollTo(mProxyModel->mapFromSource(mFirstVisibleIndex),
+ HbAbstractItemView::PositionAtTop);
- connect(mBuilder.searchPanel(), SIGNAL(criteriaChanged(QString)),
- &mMenuSearch, SLOT(findItem(QString)));
-
- hideSearchPanelOnScrolling(true);
}
/*!
Disconnects signals \a exitClicked and \a criteriaChanged emitted
by search panel from handling slots of the object or its members
+ Scrolls view to state before connections
*/
void HsMenuView::disconnectSearchPanelSignals()
{
+ disconnectSearchItemViewsSignals();
+
disconnect(mBuilder.searchPanel(), SIGNAL(exitClicked()),
this, SLOT(hideSearchPanel()));
disconnect(mBuilder.searchPanel(), SIGNAL(criteriaChanged(QString)),
- &mMenuSearch, SLOT(findItem(QString)));
-
- hideSearchPanelOnScrolling(false);
-}
+ this, SLOT(findItem(QString)));
-/*!
- Connects or disconnects item views' (list) \a scrollingStarted
- signal with the object \a hideSearchPanel slot.
- \param hide When true connects the signals with the slots, otherwise
- disconnects them.
- */
-void HsMenuView::hideSearchPanelOnScrolling(bool hide)
-{
- const HbListView *const listView = mBuilder.listView();
-
- if (hide) {
- connect(listView, SIGNAL(scrollingStarted()),
- this, SLOT(hideSearchPanel()));
- } else {
- disconnect(listView, SIGNAL(scrollingStarted()),
- this, SLOT(hideSearchPanel()));
- }
+ searchFinished();
+ connectModelSignals();
+ connectItemViewsSignals();
}
/*!
@@ -427,6 +446,20 @@
HSMENUTEST_FUNC_EXIT("HsMenuView::construct()");
}
+void HsMenuView::hideToolBar()
+{
+ HSMENUTEST_FUNC_ENTRY("HsMenuView::hideToolBar()");
+ mBuilder.view()->hideItems(Hb::ToolBarItem);
+ HSMENUTEST_FUNC_EXIT("HsMenuView::hideToolBar()");
+}
+
+void HsMenuView::showToolBar()
+{
+ HSMENUTEST_FUNC_ENTRY("HsMenuView::showToolBar()");
+ mBuilder.view()->showItems(Hb::ToolBarItem);
+ HSMENUTEST_FUNC_EXIT("HsMenuView::showToolBar()");
+}
+
HsMenuMode HsMenuView::getHsMenuMode()
{
return mMenuMode;
@@ -436,3 +469,80 @@
{
mMenuMode = menuMode;
}
+/*!
+ Looks up for item and if found scrolls to it.
+ \param criteriaStr The item name to find.
+ */
+void HsMenuView::findItem(QString criteriaStr)
+{
+ qDebug
+ () << QString("hsmenuview::findItem: %1").arg(criteriaStr);
+ HSMENUTEST_FUNC_ENTRY("hsmenuview::findItem");
+
+ if ("" != criteriaStr) {
+ mProxyModel->setFilterRegExp(QRegExp(criteriaStr,
+ Qt::CaseInsensitive, QRegExp::FixedString));
+ }
+ else {
+ mProxyModel->setFilterRegExp(QRegExp(QString(".*"),
+ Qt::CaseInsensitive, QRegExp::RegExp));
+ // scroll to first item in model
+ mBuilder.listView()->scrollTo(
+ mProxyModel->mapFromSource(mModel->index(0)),
+ HbAbstractItemView::PositionAtTop);
+ }
+ HSMENUTEST_FUNC_EXIT("hsmenuview::findItem");
+}
+
+/*!
+ Initializes search.
+ */
+void HsMenuView::searchBegins()
+{
+ HSMENUTEST_FUNC_ENTRY("hsmenuview::searchBegins");
+ mProxyModel->invalidate();
+ mProxyModel->setSourceModel(mModel);
+ mProxyModel->setFilterRegExp(QRegExp(QString(".*"), Qt::CaseInsensitive,
+ QRegExp::RegExp));
+ setModelToView(mProxyModel);
+ HSMENUTEST_FUNC_EXIT("hsmenuview::searchBegins");
+}
+
+/*!
+ Ends search, scrolls view to last visible item in search view
+ */
+void HsMenuView::searchFinished()
+{
+ HSMENUTEST_FUNC_ENTRY("hsmenuview::searchFinished");
+ QModelIndex temp = mProxyModel->mapToSource(mLastVisibleIndex);
+ setModel(mModel);
+ mBuilder.listView()->scrollTo(temp, HbAbstractItemView::PositionAtTop);
+ HSMENUTEST_FUNC_EXIT("hsmenuview::searchFinished");
+}
+
+/*!
+ * Slot used to translate activated signal from proxy model to normal model
+ */
+void HsMenuView::activatedProxySlot(const QModelIndex &index)
+{
+ emit activated(mProxyModel->mapToSource(index));
+}
+
+/*!
+ * Slot used to translate longPressed signal from proxy model to normal model
+ */
+void HsMenuView::longPressedProxySlot(HbAbstractViewItem *item,
+ const QPointF &coords)
+{
+ /*
+ this is a kind of hack, introduced for reasons:
+ item object should be reusable later, but orbit (or qt) prevents setting
+ its index model to previous state
+ */
+ mSearchIndex = mProxyModel->mapToSource(item->modelIndex());
+ HbAbstractViewItem* itemNew = item->createItem();
+ itemNew->setModelIndex(mSearchIndex);
+ emit longPressed(itemNew, coords);
+ delete itemNew;
+}
+