New version. Update home page link in About box.
[dorian] / widgets / listwindow.cpp
index db92196..e12f4c2 100644 (file)
 #include "flickcharm.h"
 #endif
 
-ListWindow::ListWindow(QWidget *parent): QMainWindow(parent), model(0)
+ListWindow::ListWindow(const QString &noItems_, QWidget *parent):
+        QMainWindow(parent), mModel(0), noItems(noItems_)
 {
 #if defined(Q_WS_MAEMO_5)
     setAttribute(Qt::WA_Maemo5StackedWindow, true);
 #endif
+    setAttribute(Qt::WA_DeleteOnClose);
 
     list = new QListWidget(this);
+    list->setSelectionMode(QAbstractItemView::SingleSelection);
+#if defined(Q_OS_SYMBIAN)
+    list->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+#endif
     populateList();
     setCentralWidget(list);
 
 #ifdef Q_OS_SYMBIAN
     charm = new FlickCharm(this);
-    charm->activateOn(list);
+    // charm->activateOn(list);
     QAction *closeAction = new QAction(parent? tr("Back"): tr("Exit"), this);
     closeAction->setSoftKeyRole(QAction::NegativeSoftKey);
     connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
     QMainWindow::addAction(closeAction);
 #endif // Q_OS_SYMBIAN
 
-#ifdef Q_WS_MAC
-    // FIXME
-    // addAction(tr("Close"), this, SLOT(close()), QString(),
-    //           QDialogButtonBox::RejectRole);
-#endif // Q_WS_MAC
-
     connect(list, SIGNAL(activated(const QModelIndex &)),
-            this, SLOT(onItemActicvated(const QModelIndex &)));
+            this, SLOT(onItemActivated(const QModelIndex &)));
 }
 
 void ListWindow::populateList()
@@ -44,50 +44,78 @@ void ListWindow::populateList()
     TRACE;
 
     list->clear();
-    if (model) {
-        for (int i = 0; i < model->rowCount(); i++) {
-            QModelIndex index = model->index(i, 0);
-            QString text = model->data(index, Qt::DisplayRole).toString();
-            QIcon icon;
-            QVariant iconData = model->data(index, Qt::DecorationRole);
-            if (iconData.canConvert<QIcon>()) {
-                icon = iconData.value<QIcon>();
-            }
+    list->setIconSize(QSize(48, 48)); // FIXME
+    list->setUniformItemSizes(true);
+    if (mModel && mModel->rowCount()) {
+        for (int i = 0; i < mModel->rowCount(); i++) {
+            QModelIndex index = mModel->index(i, 0);
+            QString text = mModel->data(index, Qt::DisplayRole).toString();
+            QVariant imageData = mModel->data(index, Qt::DecorationRole);
+            QIcon icon(QPixmap::fromImage(imageData.value<QImage>()));
             (void)new QListWidgetItem(icon, text, list);
         }
+    } else {
+        QListWidgetItem *item = new QListWidgetItem(noItems);
+        item->setFlags(Qt::NoItemFlags);
+        list->addItem(item);
     }
     for (int i = 0; i < buttons.count(); i++) {
-        QListWidgetItem *item = new QListWidgetItem();
-        list->insertItem(i, item);
-        list->setItemWidget(item, buttons[i]);
+        insertButton(i, buttons[i]);
     }
 }
 
-void ListWindow::setModel(QAbstractItemModel *model_)
+void ListWindow::insertButton(int row, const Button &b)
+{
+    QPushButton *pushButton = new QPushButton(
+        QIcon(Platform::instance()->icon(b.iconName)), b.title, this);
+#ifdef Q_OS_SYMBIAN
+    pushButton->setFixedWidth(list->width());
+#endif
+    connect(pushButton, SIGNAL(clicked()), b.receiver, b.slot);
+    QListWidgetItem *item = new QListWidgetItem();
+    item->setFlags(Qt::NoItemFlags);
+    list->insertItem(row, item);
+    list->setItemWidget(item, pushButton);
+}
+
+void ListWindow::setModel(QAbstractItemModel *aModel)
 {
-    model = model_;
+    TRACE;
+    mModel = aModel;
     populateList();
-    if (model) {
-        connect(model,
-                SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &)),
+    if (mModel) {
+        connect(mModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
+                this, SLOT(populateList()));
+        connect(mModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
                 this, SLOT(populateList()));
+        connect(mModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
+                this, SLOT(populateList()));
+        connect(mModel, SIGNAL(layoutChanged()), this, SLOT(populateList()));
     }
 }
 
+QAbstractItemModel *ListWindow::model() const
+{
+    return mModel;
+}
+
 void ListWindow::addButton(const QString &title, QObject *receiver,
                            const char *slot, const QString &iconName)
 {
     TRACE;
 
-    QPushButton *button = new QPushButton(QIcon(Platform::instance()->
-                                                icon(iconName)), title, this);
-    connect(button, SIGNAL(clicked()), receiver, slot);
-    buttons.append(button);
-
-    int pos = buttons.length() - 1;
-    QListWidgetItem *item = new QListWidgetItem();
-    list->insertItem(pos, item);
-    list->setItemWidget(item, button);
+#ifdef Q_OS_SYMBIAN
+    Q_UNUSED(iconName);
+    addMenuAction(title, receiver, slot);
+#else
+    Button b;
+    b.title = title;
+    b.receiver = receiver;
+    b.slot = slot;
+    b.iconName = iconName;
+    insertButton(buttons.length(), b);
+    buttons.append(b);
+#endif
 }
 
 QAction *ListWindow::addMenuAction(const QString &title, QObject *receiver,
@@ -113,10 +141,39 @@ QAction *ListWindow::addMenuAction(const QString &title, QObject *receiver,
     return action;
 }
 
-void ListWindow::onItemActivated(const QModelIndex &)
+void ListWindow::onItemActivated(const QModelIndex &index)
 {
     TRACE;
-    // FIXME
+
+    // Work around Qt/Symbian^3 bug: Disabled list items still can be selected
+    if (!mModel) {
+        return;
+    }
+    if (!mModel->rowCount()) {
+        return;
+    }
+
+    int row = index.row() - buttons.count();
+    qDebug() << "Activated" << index.row() << ", emit activated(" << row << ")";
+    emit activated(mModel->index(row, 0));
+}
+
+void ListWindow::setCurrentItem(const QModelIndex &item)
+{
+    int index = item.row();
+    list->setCurrentItem(list->item(index + buttons.count()));
+}
+
+QModelIndex ListWindow::currentItem() const
+{
+    TRACE;
+    QListWidgetItem *currentItem = list->currentItem();
+    if (currentItem) {
+        int row = list->row(currentItem) - buttons.count();
+        qDebug() << "Current row is" << row;
+        return mModel->index(row, 0);
+    }
+    return QModelIndex();
 }
 
 #ifdef Q_WS_MAEMO_5
@@ -125,7 +182,7 @@ void ListWindow::closeEvent(QCloseEvent *event)
 {
     // Work around Maemo/Qt bug: Menu items are not removed on close
     menuBar()->clear();
-    // FIXME: Is this needed? event->accept();
+    event->accept();
     QMainWindow::closeEvent(event);
 }