Fixed search history settings read and write and added search history
[situare] / src / ui / listview.cpp
index 995d039..40ec9c2 100644 (file)
 
 ListView::ListView(QWidget *parent)
     : QListWidget(parent),
-      m_previousItem(0)
+      m_currentItem(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    setSelectionMode(QAbstractItemView::SingleSelection);
+    setAutoFillBackground(false);
+    viewport()->setAutoFillBackground(false);
+
     connect(this, SIGNAL(itemClicked(QListWidgetItem*)),
             this, SLOT(listItemClicked(QListWidgetItem*)));
 }
@@ -52,23 +56,38 @@ void ListView::addListItemToView(ListItem *item)
     addItem(item);
 }
 
+void ListView::clearItemSelection()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    clearSelection();
+
+    if (m_currentItem)
+        m_currentItem->setSelected(false);
+}
+
 void ListView::clearList()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    qDeleteAll(m_listItems.begin(), m_listItems.end());
     m_listItems.clear();
     clear();
+
+    m_currentItem = 0;
 }
 
-void ListView::clearUnused(const QStringList &userIDs)
+void ListView::clearUnused(const QStringList &itemIDs)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     foreach (QString key, m_listItems.keys()) {
-        if (!userIDs.contains(key)) {
+        if (!itemIDs.contains(key)) {
             ListItem *item = m_listItems.take(key);
             if (item) {
                 takeItem(row(item));
+                if (m_currentItem == item)
+                    m_currentItem = 0;
                 delete item;
             }
         }
@@ -79,74 +98,173 @@ void ListView::clearFilter()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    if (m_previousItem)
-        m_previousItem->setSelected(false);
+    m_filteredItemIDs.clear();
 
     foreach (ListItem *item, m_listItems)
         setItemHidden(item, false);
 }
 
-bool ListView::contains(const QString &userID)
+bool ListView::contains(const QString &itemID)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    return m_listItems.contains(userID);
+    return m_listItems.contains(itemID);
 }
 
-void ListView::filter(const QList<QString> &userIDs)
+void ListView::filter(const QList<QString> &itemIDs)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
+    m_filteredItemIDs = itemIDs;
+
     foreach (ListItem *item, m_listItems) {
-        if (userIDs.contains(item->id()))
-            setItemHidden(item, false);
-        else
-            setItemHidden(item, true);
+        if (itemIDs.contains(m_listItems.key(item))) {
+            item->setHidden(false);
+        } else {
+            item->setSelected(false);
+            item->setHidden(true);
+        }
+    }
+
+    emit listItemSelectionChanged();
+}
+
+void ListView::filter(const QString &pattern)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_filteredItemIDs.isEmpty()) {
+        foreach (ListItem *item, m_listItems) {
+            if (item->title().contains(pattern, Qt::CaseInsensitive)) {
+                item->setHidden(false);
+            } else {
+                item->setSelected(false);
+                item->setHidden(true);
+            }
+        }
+    } else {
+        foreach (QString key, m_filteredItemIDs) {
+            ListItem *item = m_listItems.value(key);
+            if (item) {
+                if (item->title().contains(pattern, Qt::CaseInsensitive)) {
+                    item->setHidden(false);
+                } else {
+                    item->setSelected(false);
+                    item->setHidden(true);
+                }
+            }
+        }
     }
+
+    emit listItemSelectionChanged();
 }
 
-ListItem *ListView::takeListItemFromView(const QString &userID)
+ListItem *ListView::takeListItemFromView(const QString &itemID)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    ListItem *item = listItem(userID);
+    ListItem *item = listItem(itemID);
     takeItem(row(item));
     return item;
 }
 
+bool ListView::listItemClicked(ListItem *clickedItem)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_currentItem == clickedItem) {
+        clickedItem->toggleSelection();
+    } else {
+        if (m_currentItem)
+            m_currentItem->setSelected(false);
+
+        clickedItem->setSelected(true);
+    }
+    m_currentItem = clickedItem;
+
+    emit listItemSelectionChanged();
+
+    return clickedItem->isSelected();
+}
+
 void ListView::listItemClicked(QListWidgetItem *item)
 {
-    qWarning() << __PRETTY_FUNCTION__;
+    qDebug() << __PRETTY_FUNCTION__;
+
+    ListItem *currentItem = dynamic_cast<ListItem*>(item);
+
+    if (currentItem)
+        listItemClicked(currentItem);
+}
+
+ListItem *ListView::listItem(const QString &itemID)
+{
+    qDebug() << __PRETTY_FUNCTION__;
 
-    ListItem *currentItem = static_cast<ListItem*>(item);
+    return dynamic_cast<ListItem*>(m_listItems.value(itemID));
+}
 
-    if (currentItem) {
-        qWarning() << __PRETTY_FUNCTION__ << "currentItem != 0";
-        if (m_previousItem == currentItem) {
-            qWarning() << __PRETTY_FUNCTION__ << "previousItem == currentItem";
-            bool selected = currentItem->toggleSelection();
+ListItem *ListView::listItemAt(int index)
+{
+    qDebug() << __PRETTY_FUNCTION__;
 
-            if (selected)
-                ;//emit listItemClicked(currentItem->coordinates());
+    ListItem *listItem = 0;
 
-        } else {
-            qWarning() << __PRETTY_FUNCTION__ << "previousItem != currentItem";
-            if (m_previousItem)
-                m_previousItem->setSelected(false);
+    if (index < count())
+        listItem = dynamic_cast<ListItem*>(item(index));
 
-            currentItem->setSelected(true);
-            //emit listItemClicked(currentItem->coordinates());
-        }
+    return listItem;
+}
+
+void ListView::prependListItem(const QString &key, ListItem *item)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (!m_listItems.contains(key)) {
+        insertItem(0, item);
+        m_listItems.insert(key, item);
+    }
+}
 
-        m_previousItem = currentItem;
+void ListView::removeLastItem()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    ListItem *item = listItemAt(count() - 1);
+
+    if (item) {
+        if (item) {
+            m_listItems.remove(item->title());
+            takeItem(row(item));
+            if (m_currentItem == item)
+                m_currentItem = 0;
+            delete item;
+        }
     }
 }
 
+ListItem *ListView::selectedItem()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QList<QListWidgetItem *> selectedListItems = selectedItems();
+
+    if (!selectedListItems.isEmpty())
+        return dynamic_cast<ListItem *>(selectedListItems.first());
+    else
+        return 0;
+}
 
+void ListView::setSelectedItem(ListItem *item)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    listItemClicked(item);
+}
 
-ListItem *ListView::listItem(const QString &userID)
+ListView::~ListView()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    return static_cast<ListItem*>(m_listItems.value(userID));
+    clearList();
 }