From 46df765740679d94af70beec6d2a69eb2ffc88a0 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 3 Jun 2014 13:10:31 +0200 Subject: [PATCH] MimeTypeSettings: Use QTreeView instead of QTableView QTreeView is a better list view with columns than QTableView. One special reason for this change is that QTreeView finds a proper default row height regardless of the system DPI. Change-Id: I0a4091585d4745fd91179c82a55682f88f8d2549 Reviewed-by: Eike Ziller --- .../coreplugin/mimetypemagicdialog.cpp | 2 + src/plugins/coreplugin/mimetypesettings.cpp | 92 ++--- .../coreplugin/mimetypesettingspage.ui | 314 +++++++++--------- 3 files changed, 183 insertions(+), 225 deletions(-) diff --git a/src/plugins/coreplugin/mimetypemagicdialog.cpp b/src/plugins/coreplugin/mimetypemagicdialog.cpp index f089231a4ad..e24fd788113 100644 --- a/src/plugins/coreplugin/mimetypemagicdialog.cpp +++ b/src/plugins/coreplugin/mimetypemagicdialog.cpp @@ -30,6 +30,8 @@ #include "mimetypemagicdialog.h" #include "mimedatabase.h" +#include + #include using namespace Core; diff --git a/src/plugins/coreplugin/mimetypesettings.cpp b/src/plugins/coreplugin/mimetypesettings.cpp index 22824414ee1..f2a589168a7 100644 --- a/src/plugins/coreplugin/mimetypesettings.cpp +++ b/src/plugins/coreplugin/mimetypesettings.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -45,7 +46,6 @@ #include #include #include -#include #include #include @@ -118,9 +118,6 @@ QVariant MimeTypeSettingsModel::data(const QModelIndex &modelIndex, int role) co return type; else return m_handlersByMimeType.value(type); - } else if (role == Qt::TextAlignmentRole) { - if (column == 1) - return Qt::AlignCenter; } return QVariant(); } @@ -206,7 +203,6 @@ public: virtual ~MimeTypeSettingsPrivate(); void configureUi(QWidget *w); - static void configureTable(QTableView *tableView); bool checkSelectedMimeType() const; bool checkSelectedMagicHeader() const; @@ -277,12 +273,11 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) m_model->load(); connect(m_ui.filterLineEdit, SIGNAL(textChanged(QString)), this, SLOT(setFilterPattern(QString))); - m_ui.mimeTypesTableView->setModel(m_filterModel); + m_ui.mimeTypesTreeView->setModel(m_filterModel); - configureTable(m_ui.mimeTypesTableView); - configureTable(m_ui.magicHeadersTableWidget); + new Utils::HeaderViewStretcher(m_ui.mimeTypesTreeView->header(), 1); - connect(m_ui.mimeTypesTableView->selectionModel(), + connect(m_ui.mimeTypesTreeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(syncData(QModelIndex,QModelIndex))); @@ -292,29 +287,15 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w) connect(m_ui.removeMagicButton, SIGNAL(clicked()), this, SLOT(removeMagicHeader())); connect(m_ui.editMagicButton, SIGNAL(clicked()), this, SLOT(editMagicHeader())); connect(m_ui.resetButton, SIGNAL(clicked()), this, SLOT(resetMimeTypes())); - connect(m_ui.magicHeadersTableWidget->selectionModel(), - SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, + connect(m_ui.magicHeadersTreeWidget, + SIGNAL(itemSelectionChanged()), SLOT(updateMagicHeaderButtons())); updateMagicHeaderButtons(); } -void MimeTypeSettingsPrivate::configureTable(QTableView *tableView) -{ - tableView->setSelectionBehavior(QAbstractItemView::SelectRows); - tableView->setSelectionMode(QAbstractItemView::SingleSelection); - tableView->verticalHeader()->setVisible(false); - tableView->horizontalHeader()->setResizeMode(QHeaderView::Stretch); - tableView->horizontalHeader()->setResizeMode(0, QHeaderView::Interactive); - tableView->horizontalHeader()->resizeSection( - 0, 4 * tableView->horizontalHeader()->defaultSectionSize()); - tableView->horizontalHeader()->setHighlightSections(false); - tableView->setEditTriggers(QAbstractItemView::NoEditTriggers); -} - bool MimeTypeSettingsPrivate::checkSelectedMimeType() const { - const QModelIndex &modelIndex = m_ui.mimeTypesTableView->selectionModel()->currentIndex(); + const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex(); if (!modelIndex.isValid()) { QMessageBox::critical(0, tr("Error"), tr("No MIME type selected.")); return false; @@ -324,7 +305,7 @@ bool MimeTypeSettingsPrivate::checkSelectedMimeType() const bool MimeTypeSettingsPrivate::checkSelectedMagicHeader() const { - const QModelIndex &modelIndex = m_ui.magicHeadersTableWidget->selectionModel()->currentIndex(); + const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->selectionModel()->currentIndex(); if (!modelIndex.isValid()) { QMessageBox::critical(0, tr("Error"), tr("No magic header selected.")); return false; @@ -371,7 +352,7 @@ void MimeTypeSettingsPrivate::syncMimeMagic() // Gather the magic rules. QHash rulesByPriority; - for (int row = 0; row < m_ui.magicHeadersTableWidget->rowCount(); ++row) { + for (int row = 0; row < m_ui.magicHeadersTreeWidget->topLevelItemCount(); ++row) { const MagicData &data = getMagicHeaderRowData(row); // @TODO: Validate magic rule? MagicRule *magicRule; @@ -404,8 +385,7 @@ void MimeTypeSettingsPrivate::syncData(const QModelIndex ¤t, clearSyncData(); m_ui.patternsLineEdit->clear(); - m_ui.magicHeadersTableWidget->clearContents(); - m_ui.magicHeadersTableWidget->setRowCount(0); + m_ui.magicHeadersTreeWidget->clear(); } if (current.isValid()) { @@ -436,7 +416,7 @@ void MimeTypeSettingsPrivate::syncData(const QModelIndex ¤t, void MimeTypeSettingsPrivate::handlePatternEdited() { if (m_mimeForPatternSync == -1) { - const QModelIndex &modelIndex = m_ui.mimeTypesTableView->selectionModel()->currentIndex(); + const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex(); if (modelIndex.isValid()) markMimeForPatternSync(m_filterModel->mapToSource(modelIndex).row()); } @@ -444,42 +424,34 @@ void MimeTypeSettingsPrivate::handlePatternEdited() void MimeTypeSettingsPrivate::addMagicHeaderRow(const MagicData &data) { - const int row = m_ui.magicHeadersTableWidget->rowCount(); - m_ui.magicHeadersTableWidget->insertRow(row); + const int row = m_ui.magicHeadersTreeWidget->topLevelItemCount(); editMagicHeaderRowData(row, data); } MagicData MimeTypeSettingsPrivate::getMagicHeaderRowData(const int row) const { MagicData data; - data.m_value = m_ui.magicHeadersTableWidget->item(row, 0)->text(); - data.m_type = m_ui.magicHeadersTableWidget->item(row, 1)->text(); + data.m_value = m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(0); + data.m_type = m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(1); QPair startEnd = - MagicRule::fromOffset(m_ui.magicHeadersTableWidget->item(row, 2)->text()); + MagicRule::fromOffset(m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(2)); data.m_start = startEnd.first; data.m_end = startEnd.second; - data.m_priority = m_ui.magicHeadersTableWidget->item(row, 3)->text().toInt(); + data.m_priority = m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(3).toInt(); return data; } void MimeTypeSettingsPrivate::editMagicHeaderRowData(const int row, const MagicData &data) { - for (int col = 0; col < m_ui.magicHeadersTableWidget->columnCount(); ++col) { - QTableWidgetItem *item = new QTableWidgetItem; - if (col == 0) { - item->setText(data.m_value); - } else { - item->setTextAlignment(Qt::AlignCenter); - if (col == 1) - item->setText(data.m_type); - else if (col == 2) - item->setText(MagicRule::toOffset(qMakePair(data.m_start, data.m_end))); - else - item->setText(QString::number(data.m_priority)); - } - m_ui.magicHeadersTableWidget->setItem(row, col, item); - } + QTreeWidgetItem *item = new QTreeWidgetItem; + item->setText(0, data.m_value); + item->setText(1, data.m_type); + item->setText(2, MagicRule::toOffset(qMakePair(data.m_start, data.m_end))); + item->setText(3, QString::number(data.m_priority)); + m_ui.magicHeadersTreeWidget->takeTopLevelItem(row); + m_ui.magicHeadersTreeWidget->insertTopLevelItem(row, item); + m_ui.magicHeadersTreeWidget->setCurrentItem(item); } void MimeTypeSettingsPrivate::addMagicHeader() @@ -491,7 +463,7 @@ void MimeTypeSettingsPrivate::addMagicHeader() if (dlg.exec()) { addMagicHeaderRow(dlg.magicData()); markMimeForMagicSync(m_filterModel->mapToSource( - m_ui.mimeTypesTableView->selectionModel()->currentIndex()).row()); + m_ui.mimeTypesTreeView->currentIndex()).row()); } } @@ -500,9 +472,9 @@ void MimeTypeSettingsPrivate::removeMagicHeader() if (!checkSelectedMagicHeader()) return; - m_ui.magicHeadersTableWidget->removeRow(m_ui.magicHeadersTableWidget->currentRow()); + m_ui.magicHeadersTreeWidget->takeTopLevelItem(m_ui.magicHeadersTreeWidget->indexOfTopLevelItem(m_ui.magicHeadersTreeWidget->currentItem())); markMimeForMagicSync(m_filterModel->mapToSource( - m_ui.mimeTypesTableView->selectionModel()->currentIndex()).row()); + m_ui.mimeTypesTreeView->currentIndex()).row()); } void MimeTypeSettingsPrivate::editMagicHeader() @@ -511,11 +483,11 @@ void MimeTypeSettingsPrivate::editMagicHeader() return; MimeTypeMagicDialog dlg; - dlg.setMagicData(getMagicHeaderRowData(m_ui.magicHeadersTableWidget->currentRow())); + dlg.setMagicData(getMagicHeaderRowData(m_ui.magicHeadersTreeWidget->indexOfTopLevelItem(m_ui.magicHeadersTreeWidget->currentItem()))); if (dlg.exec()) { - editMagicHeaderRowData(m_ui.magicHeadersTableWidget->currentRow(), dlg.magicData()); + editMagicHeaderRowData(m_ui.magicHeadersTreeWidget->indexOfTopLevelItem(m_ui.magicHeadersTreeWidget->currentItem()), dlg.magicData()); markMimeForMagicSync(m_filterModel->mapToSource( - m_ui.mimeTypesTableView->selectionModel()->currentIndex()).row()); + m_ui.mimeTypesTreeView->currentIndex()).row()); } } @@ -558,7 +530,7 @@ void MimeTypeSettingsPrivate::resetMimeTypes() void MimeTypeSettingsPrivate::updateMagicHeaderButtons() { - const QModelIndex &modelIndex = m_ui.magicHeadersTableWidget->selectionModel()->currentIndex(); + const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->currentIndex(); const bool enabled = modelIndex.isValid(); m_ui.removeMagicButton->setEnabled(enabled); @@ -602,7 +574,7 @@ void MimeTypeSettings::apply() { if (!d->m_modifiedMimeTypes.isEmpty()) { const QModelIndex &modelIndex = - d->m_ui.mimeTypesTableView->selectionModel()->currentIndex(); + d->m_ui.mimeTypesTreeView->currentIndex(); if (modelIndex.isValid()) { if (d->m_mimeForPatternSync == d->m_filterModel->mapToSource(modelIndex).row()) d->syncMimePattern(); diff --git a/src/plugins/coreplugin/mimetypesettingspage.ui b/src/plugins/coreplugin/mimetypesettingspage.ui index 095494b528c..2b4e6fbadc6 100644 --- a/src/plugins/coreplugin/mimetypesettingspage.ui +++ b/src/plugins/coreplugin/mimetypesettingspage.ui @@ -6,8 +6,8 @@ 0 0 - 593 - 403 + 712 + 696 @@ -15,173 +15,157 @@ - - - Registered MIME Types - - - - - - Filter - - - - - - - false - - - Qt::NoPen - - - - - - - Reset all to default. - - - Reset All - - - - - - - Qt::Horizontal - - - - 476 - 20 - - - - - - - - - - - Details - - - - - - - - Patterns: - - - - - - - - - - - - - - - 0 - 0 - - - - - 16777215 - 100 - - - - false - - - Qt::NoPen - - - - Magic Header - - - - - Type - - - - - Range - - - - - Priority - - - - - - - - - - Add... - - - - - - - Edit... - - - - - - - Remove - - - - - - - Qt::Vertical - - - - 72 - 18 - - - - - - - - - - - - - + Qt::Vertical - - - 504 - 16 - + + false - + + + Registered MIME Types + + + + + + Filter + + + + + + + Reset all to default. + + + Reset All + + + + + + + Qt::Horizontal + + + + 476 + 20 + + + + + + + + false + + + true + + + + + + + + Details + + + + + + + + Patterns: + + + + + + + + + + + + + + false + + + true + + + 4 + + + + Magic Header + + + + + Type + + + + + Range + + + + + Priority + + + + + + + + + + Add... + + + + + + + Edit... + + + + + + + Remove + + + + + + + Qt::Vertical + + + + 72 + 18 + + + + + + + + + + +