/* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include "mappingtablewidget.h" #include "mappingtablemodel.h" #include "smglobals.h" MappingTableWidget::MappingTableWidget(const QString &table, QWidget *parent) : QWidget(parent), mTable(table), mCurrentId(-1){ //the view mView = new QTreeView; mView->setHeaderHidden(true); mModel = new MappingTableItemModel(this); mModel->setHeaderData(0, Qt::Horizontal, mTable); mView->setModel(mModel); mView->setAlternatingRowColors(true); //mapping model mMappingModel = static_cast(SmGlobals::instance()->model(mTable)); //editor QHBoxLayout *itemEditLayout = new QHBoxLayout; QString l1Text = QString(tr("&Edit %1")).arg(mTable); QLabel *l1 = new QLabel(l1Text); mItemEdit = new QLineEdit; QCompleter *completer = new QCompleter(this); completer->setModel(mMappingModel); mItemEdit->setCompleter(completer); l1->setBuddy(mItemEdit); itemEditLayout->addWidget(l1); itemEditLayout->addWidget(mItemEdit); //buttons QHBoxLayout *buttonLayout = new QHBoxLayout; mSearchItem = new QPushButton(tr("&Search...")); buttonLayout->addWidget(mSearchItem); buttonLayout->addStretch(); mAddItem = new QPushButton(tr("&Add item")); mRemoveItem = new QPushButton(tr("Remove item")); buttonLayout->addWidget(mAddItem); buttonLayout->addWidget(mRemoveItem); connect(mSearchItem, SIGNAL(clicked()), this, SLOT(searchItem())); connect(mAddItem, SIGNAL(clicked()), this, SLOT(addItem())); connect(mRemoveItem, SIGNAL(clicked()), this, SLOT(removeItem())); //layout QVBoxLayout *groupBoxLayout = new QVBoxLayout; groupBoxLayout->addWidget(mView); groupBoxLayout->addLayout(itemEditLayout); groupBoxLayout->addLayout(buttonLayout); QString gbCaption = QString(tr("Edit %1")).arg(mTable); QGroupBox *gb = new QGroupBox(gbCaption); gb->setLayout(groupBoxLayout); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(gb); setLayout(mainLayout); setContentsMargins(0, 0, 0, 0); } void MappingTableWidget::setStringList(const QStringList &list){ mModel->setStringList(list); } void MappingTableWidget::setEditEnabled(bool enabled){ mAddItem->setEnabled(enabled); mRemoveItem->setEnabled(enabled); mItemEdit->setEnabled(enabled); } void MappingTableWidget::searchItem(){ QStringList res = mMappingModel->findPartialName(mItemEdit->text()); if(res.isEmpty()){ return; } MappingTableResultDialog dlg(res, this); if(dlg.exec() == QDialog::Accepted){ mItemEdit->setText(dlg.selectedText()); } } void MappingTableWidget::addItem(){ QString value = mItemEdit->text().toLower().trimmed(); if(mModel->stringList().contains(value)){ return; } if(!mMappingModel->contains(value)){ mMappingModel->addItem(value); } int row = mModel->lowerBound(value); if(mModel->insertRows(row, 1)){ QModelIndex idx = mModel->index(row, 0); mModel->setData(idx, value); QModelIndex mapIndex = mMappingModel->find(value, 0, QModelIndex()); if(mapIndex.isValid()){ int id = mapIndex.data(MappingTableModel::ItemIdRole).toInt(); mMappingModel->addMapping(mCurrentId, id); } } mItemEdit->clear(); } void MappingTableWidget::removeItem(){ QModelIndexList selected = mView->selectionModel()->selectedRows(); if(selected.isEmpty()){ return; } foreach(QPersistentModelIndex i, selected){ QString item = i.data().toString(); mModel->removeRows(i.row(), 1); QModelIndex itemIdx = mMappingModel->find(item); if(itemIdx.isValid()){ mMappingModel->removeMapping(mCurrentId, itemIdx.data(MappingTableModel::ItemIdRole).toInt()); } } } MappingTableItemModel::MappingTableItemModel(QObject *parent) : QStringListModel(parent){ QSettings s; QString iconName = s.value("ui/folderIcon").toString(); mDecorationIcon = QIcon(SmGlobals::instance()->icons().value(iconName)); } QVariant MappingTableItemModel::data(const QModelIndex &index, int role) const{ if(role == Qt::DecorationRole){ return decorationIcon(); } return QStringListModel::data(index, role); } Qt::ItemFlags MappingTableItemModel::flags(const QModelIndex &index) const{ Q_UNUSED(index); return Qt::ItemIsEnabled | Qt::ItemIsSelectable; } int MappingTableItemModel::lowerBound(const QString &value) const{ int retval = 0; for(int i = 0; i < stringList().count(); ++i){ if(stringList().at(i) < value){ ++retval; }else{ break; } } return retval; } QModelIndex MappingTableItemModel::find(const QString &value) const{ int row = stringList().indexOf(value); if(row == -1){ return QModelIndex(); } return index(row, 0); } MappingTableResultDialog::MappingTableResultDialog(const QStringList &results, QWidget *parent, Qt::WindowFlags f) : SmDialog(parent, f){ mModel = new QStringListModel(results, this); mView = new QTreeView(this); mView->setModel(mModel); mView->setRootIsDecorated(false); mView->setSelectionMode(QAbstractItemView::SingleSelection); mView->setHeaderHidden(true); mView->setEditTriggers(QAbstractItemView::NoEditTriggers); mOk = new QPushButton(tr("Ok")); connect(mOk, SIGNAL(clicked()), this, SLOT(accept())); mCancel = new QPushButton(tr("Cancel")); connect(mCancel, SIGNAL(clicked()), this, SLOT(reject())); QLabel *caption = new QLabel(tr("Search results")); //layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(caption); mainLayout->addWidget(mView); QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->setAlignment(Qt::AlignCenter); buttonLayout->addWidget(mOk); buttonLayout->addWidget(mCancel); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } void MappingTableResultDialog::accept(){ QModelIndex cur = mView->selectionModel()->currentIndex(); if(cur.isValid()){ mSelectedText = cur.data(Qt::DisplayRole).toString(); } return QDialog::accept(); }