nvp
[dorian] / widgets / listwindow.h
index f912df3..f8d8ab4 100644 (file)
@@ -1,61 +1,92 @@
 #ifndef LISTWINDOW_H
 #define LISTWINDOW_H
 
-#include <QMainWindow>
+#include "mainbase.h"
+
 #include <QDialogButtonBox>
 #include <QList>
 
-class QListView;
 class QString;
-class QHBoxLayout;
 class QPushButton;
+class FlickCharm;
+class QAbstractItemModel;
+class QListWidget;
 class QModelIndex;
-class QItemSelection;
+class QListWidgetItem;
 
 /** A window with a list and menu actions (Maemo) or buttons (non-Maemo). */
-class ListWindow: public QMainWindow
+class ListWindow: public MainBase
 {
     Q_OBJECT
 
 public:
-    explicit ListWindow(QWidget *parent = 0);
+    /**
+     * Constructor.
+     * @param   noItems Text to display when the list has no items.
+     * @param   parent  Parent widget.
+     */
+    explicit ListWindow(const QString &noItems, QWidget *parent = 0);
 
-    /** Add a list view to the window. */
-    void addList(QListView *list);
+    /** Set the model for the list. */
+    void setModel(QAbstractItemModel *model);
+
+    /** Get model. */
+    QAbstractItemModel *model() const;
 
     /**
-     * Add an action to the window: either a button, or, on Maemo, a top
-     * level menu item.
-     * Activating the action invokes the slot with no parameters.
+     * Add an action button to the beginning of the list (Maemo) or to the
+     * tool bar (non-Maemo).
      */
-    void addAction(const QString &title, QObject *receiver, const char *slot,
-        QDialogButtonBox::ButtonRole role = QDialogButtonBox::ActionRole);
+    void addButton(const QString &title, QObject *receiver, const char *slot,
+                   const QString &iconPath = QString());
 
     /**
-     * Add an action to the selected item in the list: either a button which is
-     * enabled when a list item is selected, or, on Maemo, a pop-up menu item
-     * which is displayed when a list item is long-pressed.
-     * Activating the action invokes the slot with no parameters.
+     * Add an action button to the tool bar, which is only active if a list
+     * item is selected.
      */
-    void addItemAction(const QString &title, QObject *receiver,
-                       const char *slot);
+    void addItemButton(const QString &title, QObject *receiver,
+                       const char *slot, const QString &iconPath = QString());
+
+    /** Add an action to the menu. */
+    QAction *addMenuAction(const QString &title, QObject *receiver,
+                           const char *slot);
+
+    /** Get current (selected) item. */
+    QModelIndex currentItem() const;
+
+signals:
+    /** Emitted when a list item is activated. */
+    void activated(const QModelIndex &index);
+
+public slots:
+    /** Set the current (selected) item. */
+    void setCurrentItem(const QModelIndex &item);
 
 protected slots:
-    void onSelectionChanged(const QItemSelection &selected,
-                            const QItemSelection &deselected);
-#ifndef Q_WS_MAEMO_5
-    void activateItemButtons();
-#endif
+    void onItemActivated(const QModelIndex &);
+    void populateList();
 
 protected:
+    struct Button {
+        QString title;
+        QObject *receiver;
+        const char *slot;
+        QString iconName;
+    };
+    void insertButton(int row, const Button &button);
 #ifdef Q_WS_MAEMO_5
     void closeEvent(QCloseEvent *event);
-#else
-    QDialogButtonBox *buttonBox;
-    QList<QPushButton *> itemButtons;
 #endif
-    QHBoxLayout *frameLayout;
-    QListView *list;
+
+private:
+    QListWidget *list;
+    QAbstractItemModel *mModel;
+    QList<Button> buttons;
+    QString noItems;
+#ifdef Q_OS_SYMBIAN
+    FlickCharm *charm;
+#endif
+    QList<QAction *>itemActions;
 };
 
 #endif // LISTWINDOW_H