X-Git-Url: https://vcs.maemo.org/git/?a=blobdiff_plain;f=widgets%2Flistwindow.cpp;h=e12f4c2f4a15ee6afcd60cb533321586beea61fd;hb=d472b48485a397a24a3e4b1f5f6f2725b191ed40;hp=a1c9be356ebd12b502993cc997057a1fc25e0ea8;hpb=86f8b4db28c0a66442d43ba292f3013cd0974a4e;p=dorian diff --git a/widgets/listwindow.cpp b/widgets/listwindow.cpp index a1c9be3..e12f4c2 100644 --- a/widgets/listwindow.cpp +++ b/widgets/listwindow.cpp @@ -10,33 +10,33 @@ #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() @@ -46,48 +46,76 @@ void ListWindow::populateList() list->clear(); list->setIconSize(QSize(48, 48)); // FIXME list->setUniformItemSizes(true); - if (model) { - for (int i = 0; i < model->rowCount(); i++) { - QModelIndex index = model->index(i, 0); - QString text = model->data(index, Qt::DisplayRole).toString(); - QVariant imageData = model->data(index, Qt::DecorationRole); + 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())); (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(); - item->setFlags(Qt::NoItemFlags); - 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) { - model = model_; + 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) +{ + 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; + + // 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; - // FIXME + 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); }