diff --git a/src/plugins/coreplugin/dialogs/newdialog.cpp b/src/plugins/coreplugin/dialogs/newdialog.cpp index 119f37b550c2e01da0df2efa5be23fe79128859d..40e2cda706cf1335a3367c4c122415fc0a564288 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.cpp +++ b/src/plugins/coreplugin/dialogs/newdialog.cpp @@ -36,15 +36,16 @@ #include <QtGui/QHeaderView> #include <QtGui/QPushButton> +#include <QtGui/QStandardItem> #include <QtCore/QDebug> Q_DECLARE_METATYPE(Core::IWizard*) -static inline Core::IWizard *wizardOfItem(const QTreeWidgetItem *item = 0) +static inline Core::IWizard *wizardOfItem(const QStandardItem *item = 0) { if (!item) return 0; - return qVariantValue<Core::IWizard*>(item->data(0, Qt::UserRole)); + return item->data(Qt::UserRole).value<Core::IWizard*>(); } using namespace Core; @@ -56,16 +57,20 @@ NewDialog::NewDialog(QWidget *parent) : m_okButton(0), m_preferredWizardKinds(0) { - typedef QMap<QString, QTreeWidgetItem *> CategoryItemMap; + typedef QMap<QString, QStandardItem *> CategoryItemMap; m_ui->setupUi(this); m_okButton = m_ui->buttonBox->button(QDialogButtonBox::Ok); m_okButton->setDefault(true); m_okButton->setText(tr("&Create")); m_ui->templatesTree->header()->hide(); - connect(m_ui->templatesTree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), - this, SLOT(currentItemChanged(QTreeWidgetItem*))); - connect(m_ui->templatesTree, SIGNAL(itemActivated(QTreeWidgetItem*,int)), m_okButton, SLOT(animateClick())); + m_model = new QStandardItemModel(this); + m_ui->templatesTree->setModel(m_model); + + connect(m_ui->templatesTree, SIGNAL(clicked(const QModelIndex&)), + this, SLOT(currentItemChanged(const QModelIndex&))); + connect(m_ui->templatesTree, SIGNAL(activated(const QModelIndex&)), + m_okButton, SLOT(animateClick())); connect(m_okButton, SIGNAL(clicked()), this, SLOT(okButtonClicked())); connect(m_ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); @@ -86,65 +91,65 @@ void NewDialog::setPreferredWizardKinds(IWizard::WizardKinds kinds) void NewDialog::setWizards(QList<IWizard*> wizards) { - typedef QMap<QString, QTreeWidgetItem *> CategoryItemMap; + typedef QMap<QString, QStandardItem *> CategoryItemMap; qStableSort(wizards.begin(), wizards.end(), wizardLessThan); CategoryItemMap categories; - QVariant wizardPtr; - m_ui->templatesTree->clear(); + m_model->clear(); foreach (IWizard *wizard, wizards) { // ensure category root const QString categoryName = wizard->category(); CategoryItemMap::iterator cit = categories.find(categoryName); if (cit == categories.end()) { - QTreeWidgetItem *categoryItem = new QTreeWidgetItem(m_ui->templatesTree); + QStandardItem *parentItem = m_model->invisibleRootItem(); + QStandardItem *categoryItem = new QStandardItem(); + parentItem->appendRow(categoryItem); categoryItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - categoryItem->setText(0, wizard->displayCategory()); - qVariantSetValue<IWizard*>(wizardPtr, 0); - categoryItem->setData(0, Qt::UserRole, wizardPtr); + categoryItem->setText(wizard->displayCategory()); + categoryItem->setData(QVariant::fromValue(0), Qt::UserRole); cit = categories.insert(categoryName, categoryItem); } // add item - QTreeWidgetItem *wizardItem = new QTreeWidgetItem(cit.value(), QStringList(wizard->displayName())); - wizardItem->setIcon(0, wizard->icon()); - qVariantSetValue<IWizard*>(wizardPtr, wizard); - wizardItem->setData(0, Qt::UserRole, wizardPtr); + QStandardItem *wizardItem = new QStandardItem(wizard->displayName()); + wizardItem->setIcon(wizard->icon()); + wizardItem->setData(QVariant::fromValue(wizard), Qt::UserRole); wizardItem->setFlags(Qt::ItemIsEnabled|Qt::ItemIsSelectable); + cit.value()->appendRow(wizardItem); } } Core::IWizard *NewDialog::showDialog() { - QTreeWidgetItem *itemToSelect = 0; + QStandardItem *itemToSelect = 0; if (m_preferredWizardKinds == 0) { m_ui->templatesTree->expandAll(); - if (QTreeWidgetItem *rootItem = m_ui->templatesTree->topLevelItem(0)) { - if (rootItem->childCount()) + if (QStandardItem *rootItem = m_model->invisibleRootItem()->child(0)) { + if (rootItem->rowCount()) itemToSelect = rootItem->child(0); } } else { - for (int i = 0; i < m_ui->templatesTree->topLevelItemCount(); ++i) { - QTreeWidgetItem *category = m_ui->templatesTree->topLevelItem(i); + for (int i = 0; i < m_model->invisibleRootItem()->rowCount(); ++i) { + QStandardItem *category = m_model->invisibleRootItem()->child(i); bool hasOnlyPreferred = true; - for (int j = 0; j < category->childCount(); ++j) { - QTreeWidgetItem *item = category->child(j); - if (!(item->data(0, Qt::UserRole).value<IWizard*>() + for (int j = 0; j < category->rowCount(); ++j) { + QStandardItem *item = category->child(j); + if (!(item->data(Qt::UserRole).value<IWizard*>() ->kind() & m_preferredWizardKinds)) { hasOnlyPreferred = false; break; } } - category->setExpanded(hasOnlyPreferred); - if (hasOnlyPreferred && itemToSelect == 0 && category->childCount() > 0) { + m_ui->templatesTree->setExpanded(category->index(), hasOnlyPreferred); + if (hasOnlyPreferred && itemToSelect == 0 && category->rowCount() > 0) { itemToSelect = category->child(0); } } } if (itemToSelect) { - m_ui->templatesTree->scrollToItem(itemToSelect); - m_ui->templatesTree->setCurrentItem(itemToSelect); + m_ui->templatesTree->scrollTo(itemToSelect->index()); + m_ui->templatesTree->setCurrentIndex(itemToSelect->index()); } updateOkButton(); if (exec() != Accepted) @@ -159,12 +164,12 @@ NewDialog::~NewDialog() IWizard *NewDialog::currentWizard() const { - return wizardOfItem(m_ui->templatesTree->currentItem()); + return wizardOfItem(m_model->itemFromIndex(m_ui->templatesTree->currentIndex())); } -void NewDialog::currentItemChanged(QTreeWidgetItem *cat) +void NewDialog::currentItemChanged(const QModelIndex &index) { - + QStandardItem* cat = m_model->itemFromIndex(index); if (const IWizard *wizard = wizardOfItem(cat)) m_ui->descLabel->setText(wizard->description()); else @@ -174,7 +179,7 @@ void NewDialog::currentItemChanged(QTreeWidgetItem *cat) void NewDialog::okButtonClicked() { - if (m_ui->templatesTree->currentItem()) + if (m_ui->templatesTree->currentIndex().isValid()) accept(); } diff --git a/src/plugins/coreplugin/dialogs/newdialog.h b/src/plugins/coreplugin/dialogs/newdialog.h index a37e794aec84aa2542e6f0069f84a89678dbeeec..c279a0cb7e4dcea810499328c8117041bf328d34 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.h +++ b/src/plugins/coreplugin/dialogs/newdialog.h @@ -37,8 +37,10 @@ QT_BEGIN_NAMESPACE class QPushButton; -class QTreeWidgetItem; +class QStandardItem; +class QStandardItemModel; class QStringList; +class QModelIndex; QT_END_NAMESPACE namespace Core { @@ -63,7 +65,7 @@ public: Core::IWizard *showDialog(); private slots: - void currentItemChanged(QTreeWidgetItem *cat); + void currentItemChanged(const QModelIndex &); void okButtonClicked(); void updateOkButton(); @@ -71,6 +73,7 @@ private: Core::IWizard *currentWizard() const; Ui::NewDialog *m_ui; + QStandardItemModel *m_model; QPushButton *m_okButton; IWizard::WizardKinds m_preferredWizardKinds; }; diff --git a/src/plugins/coreplugin/dialogs/newdialog.ui b/src/plugins/coreplugin/dialogs/newdialog.ui index 275a0a3c945db9f63feaf18a8a95c6ad6eb5ca66..0d19072dc1790966946e1a263aad77ac4636cdaf 100644 --- a/src/plugins/coreplugin/dialogs/newdialog.ui +++ b/src/plugins/coreplugin/dialogs/newdialog.ui @@ -15,18 +15,13 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QTreeWidget" name="templatesTree"> + <widget class="QTreeView" name="templatesTree"> <property name="minimumSize"> <size> <width>400</width> <height>301</height> </size> </property> - <column> - <property name="text"> - <string>1</string> - </property> - </column> </widget> </item> <item>