3 #include <QAbstractItemModel>
5 #include "listwindow.h"
10 #include "flickcharm.h"
13 ListWindow::ListWindow(const QString &noItems_, QWidget *parent):
14 MainBase(parent), mModel(0), noItems(noItems_)
16 #if defined(Q_WS_MAEMO_5)
17 setAttribute(Qt::WA_Maemo5StackedWindow, true);
19 setAttribute(Qt::WA_DeleteOnClose);
21 list = new QListWidget(this);
22 list->setSelectionMode(QAbstractItemView::SingleSelection);
23 #if defined(Q_OS_SYMBIAN)
24 list->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
27 setCentralWidget(list);
30 charm = new FlickCharm(this);
31 // charm->activateOn(list);
32 QAction *closeAction = new QAction(parent? tr("Back"): tr("Exit"), this);
33 closeAction->setSoftKeyRole(QAction::NegativeSoftKey);
34 connect(closeAction, SIGNAL(triggered()), this, SLOT(close()));
35 MainBase::addAction(closeAction);
36 #endif // Q_OS_SYMBIAN
38 connect(list, SIGNAL(activated(const QModelIndex &)),
39 this, SLOT(onItemActivated(const QModelIndex &)));
40 connect(list, SIGNAL(itemSelectionChanged()),
41 this, SLOT(onItemSelectionChanged()));
42 connect(list, SIGNAL(itemSelectionChanged()),
43 this, SIGNAL(itemSelectionChanged()));
46 void ListWindow::populateList()
51 list->setIconSize(QSize(48, 48)); // FIXME
52 list->setUniformItemSizes(true);
53 if (mModel && mModel->rowCount()) {
54 for (int i = 0; i < mModel->rowCount(); i++) {
55 QModelIndex index = mModel->index(i, 0);
56 QString text = mModel->data(index, Qt::DisplayRole).toString();
57 QVariant imageData = mModel->data(index, Qt::DecorationRole);
58 QIcon icon(QPixmap::fromImage(imageData.value<QImage>()));
59 (void)new QListWidgetItem(icon, text, list);
62 QListWidgetItem *item = new QListWidgetItem(noItems);
63 item->setFlags(Qt::NoItemFlags);
66 for (int i = 0; i < buttons.count(); i++) {
67 insertButton(i, buttons[i]);
71 void ListWindow::insertButton(int row, const Button &b)
73 QPushButton *pushButton = new QPushButton(
74 QIcon(Platform::instance()->icon(b.iconName)), b.title, this);
76 pushButton->setFixedWidth(list->width());
78 connect(pushButton, SIGNAL(clicked()), b.receiver, b.slot);
79 QListWidgetItem *item = new QListWidgetItem();
80 item->setFlags(Qt::NoItemFlags);
81 list->insertItem(row, item);
82 list->setItemWidget(item, pushButton);
85 void ListWindow::setModel(QAbstractItemModel *aModel)
91 connect(mModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
92 this, SLOT(populateList()));
93 connect(mModel, SIGNAL(rowsRemoved(QModelIndex, int, int)),
94 this, SLOT(populateList()));
95 connect(mModel, SIGNAL(rowsInserted(QModelIndex, int, int)),
96 this, SLOT(populateList()));
97 connect(mModel, SIGNAL(layoutChanged()), this, SLOT(populateList()));
101 QAbstractItemModel *ListWindow::model() const
106 void ListWindow::addButton(const QString &title, QObject *receiver,
107 const char *slot, const QString &iconName)
111 #if defined(Q_WS_MAEMO_5)
114 b.receiver = receiver;
116 b.iconName = iconName;
117 insertButton(buttons.length(), b);
120 (void)addToolBarAction(receiver, slot, iconName, title, true);
124 void ListWindow::addItemButton(const QString &title, QObject *receiver,
125 const char *slot, const QString &iconName)
128 #if defined(Q_WS_MAEMO_5)
134 QAction *toolBarAction =
135 addToolBarAction(receiver, slot, iconName, title, true);
136 toolBarAction->setEnabled(false);
137 itemActions.append(toolBarAction);
141 QAction *ListWindow::addMenuAction(const QString &title, QObject *receiver,
146 #if defined(Q_WS_MAEMO_5)
147 action = menuBar()->addAction(title);
148 connect(action, SIGNAL(triggered()), receiver, slot);
149 #elif defined(Q_OS_SYMBIAN)
150 action = new QAction(title, this);
151 connect(action, SIGNAL(triggered()), receiver, slot);
152 action->setSoftKeyRole(QAction::PositiveSoftKey);
153 menuBar()->addAction(action);
158 action = new QAction(this);
163 void ListWindow::onItemActivated(const QModelIndex &index)
167 // Work around Qt/Symbian^3 bug: Disabled list items still can be selected
171 if (!mModel->rowCount()) {
175 int row = index.row() - buttons.count();
176 qDebug() << "Activated" << index.row() << ", emit activated(" << row
178 emit activated(mModel->index(row, 0));
181 void ListWindow::setCurrentItem(const QModelIndex &item)
183 int index = item.row();
184 list->setCurrentItem(list->item(index + buttons.count()));
187 QModelIndex ListWindow::currentItem() const
190 QListWidgetItem *currentItem = list->currentItem();
192 int row = list->row(currentItem) - buttons.count();
193 qDebug() << "Current row is" << row;
194 return mModel->index(row, 0);
196 return QModelIndex();
201 void ListWindow::closeEvent(QCloseEvent *event)
203 // Work around Maemo/Qt bug: Menu items are not removed on close
206 QMainWindow::closeEvent(event);
209 #endif // Q_WS_MAEMO_5
211 void ListWindow::onItemSelectionChanged()
214 bool enabled = currentItem().isValid();
215 foreach (QAction *action, itemActions) {
216 action->setEnabled(enabled);