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 <eike.ziller@digia.com>
This commit is contained in:
Alessandro Portale
2014-06-03 13:10:31 +02:00
parent c778d7a336
commit 46df765740
3 changed files with 183 additions and 225 deletions

View File

@@ -30,6 +30,8 @@
#include "mimetypemagicdialog.h" #include "mimetypemagicdialog.h"
#include "mimedatabase.h" #include "mimedatabase.h"
#include <utils/headerviewstretcher.h>
#include <QMessageBox> #include <QMessageBox>
using namespace Core; using namespace Core;

View File

@@ -36,6 +36,7 @@
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <coreplugin/editormanager/ieditorfactory.h> #include <coreplugin/editormanager/ieditorfactory.h>
#include <coreplugin/editormanager/iexternaleditor.h> #include <coreplugin/editormanager/iexternaleditor.h>
#include <utils/headerviewstretcher.h>
#include <QAbstractTableModel> #include <QAbstractTableModel>
#include <QCoreApplication> #include <QCoreApplication>
@@ -45,7 +46,6 @@
#include <QScopedPointer> #include <QScopedPointer>
#include <QSet> #include <QSet>
#include <QStringList> #include <QStringList>
#include <QTableWidgetItem>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QtAlgorithms> #include <QtAlgorithms>
@@ -118,9 +118,6 @@ QVariant MimeTypeSettingsModel::data(const QModelIndex &modelIndex, int role) co
return type; return type;
else else
return m_handlersByMimeType.value(type); return m_handlersByMimeType.value(type);
} else if (role == Qt::TextAlignmentRole) {
if (column == 1)
return Qt::AlignCenter;
} }
return QVariant(); return QVariant();
} }
@@ -206,7 +203,6 @@ public:
virtual ~MimeTypeSettingsPrivate(); virtual ~MimeTypeSettingsPrivate();
void configureUi(QWidget *w); void configureUi(QWidget *w);
static void configureTable(QTableView *tableView);
bool checkSelectedMimeType() const; bool checkSelectedMimeType() const;
bool checkSelectedMagicHeader() const; bool checkSelectedMagicHeader() const;
@@ -277,12 +273,11 @@ void MimeTypeSettingsPrivate::configureUi(QWidget *w)
m_model->load(); m_model->load();
connect(m_ui.filterLineEdit, SIGNAL(textChanged(QString)), connect(m_ui.filterLineEdit, SIGNAL(textChanged(QString)),
this, SLOT(setFilterPattern(QString))); this, SLOT(setFilterPattern(QString)));
m_ui.mimeTypesTableView->setModel(m_filterModel); m_ui.mimeTypesTreeView->setModel(m_filterModel);
configureTable(m_ui.mimeTypesTableView); new Utils::HeaderViewStretcher(m_ui.mimeTypesTreeView->header(), 1);
configureTable(m_ui.magicHeadersTableWidget);
connect(m_ui.mimeTypesTableView->selectionModel(), connect(m_ui.mimeTypesTreeView->selectionModel(),
SIGNAL(currentChanged(QModelIndex,QModelIndex)), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
this, this,
SLOT(syncData(QModelIndex,QModelIndex))); 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.removeMagicButton, SIGNAL(clicked()), this, SLOT(removeMagicHeader()));
connect(m_ui.editMagicButton, SIGNAL(clicked()), this, SLOT(editMagicHeader())); connect(m_ui.editMagicButton, SIGNAL(clicked()), this, SLOT(editMagicHeader()));
connect(m_ui.resetButton, SIGNAL(clicked()), this, SLOT(resetMimeTypes())); connect(m_ui.resetButton, SIGNAL(clicked()), this, SLOT(resetMimeTypes()));
connect(m_ui.magicHeadersTableWidget->selectionModel(), connect(m_ui.magicHeadersTreeWidget,
SIGNAL(currentChanged(QModelIndex,QModelIndex)), SIGNAL(itemSelectionChanged()),
this,
SLOT(updateMagicHeaderButtons())); SLOT(updateMagicHeaderButtons()));
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 bool MimeTypeSettingsPrivate::checkSelectedMimeType() const
{ {
const QModelIndex &modelIndex = m_ui.mimeTypesTableView->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex();
if (!modelIndex.isValid()) { if (!modelIndex.isValid()) {
QMessageBox::critical(0, tr("Error"), tr("No MIME type selected.")); QMessageBox::critical(0, tr("Error"), tr("No MIME type selected."));
return false; return false;
@@ -324,7 +305,7 @@ bool MimeTypeSettingsPrivate::checkSelectedMimeType() const
bool MimeTypeSettingsPrivate::checkSelectedMagicHeader() const bool MimeTypeSettingsPrivate::checkSelectedMagicHeader() const
{ {
const QModelIndex &modelIndex = m_ui.magicHeadersTableWidget->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->selectionModel()->currentIndex();
if (!modelIndex.isValid()) { if (!modelIndex.isValid()) {
QMessageBox::critical(0, tr("Error"), tr("No magic header selected.")); QMessageBox::critical(0, tr("Error"), tr("No magic header selected."));
return false; return false;
@@ -371,7 +352,7 @@ void MimeTypeSettingsPrivate::syncMimeMagic()
// Gather the magic rules. // Gather the magic rules.
QHash<int, MagicRuleList> rulesByPriority; QHash<int, MagicRuleList> 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); const MagicData &data = getMagicHeaderRowData(row);
// @TODO: Validate magic rule? // @TODO: Validate magic rule?
MagicRule *magicRule; MagicRule *magicRule;
@@ -404,8 +385,7 @@ void MimeTypeSettingsPrivate::syncData(const QModelIndex &current,
clearSyncData(); clearSyncData();
m_ui.patternsLineEdit->clear(); m_ui.patternsLineEdit->clear();
m_ui.magicHeadersTableWidget->clearContents(); m_ui.magicHeadersTreeWidget->clear();
m_ui.magicHeadersTableWidget->setRowCount(0);
} }
if (current.isValid()) { if (current.isValid()) {
@@ -436,7 +416,7 @@ void MimeTypeSettingsPrivate::syncData(const QModelIndex &current,
void MimeTypeSettingsPrivate::handlePatternEdited() void MimeTypeSettingsPrivate::handlePatternEdited()
{ {
if (m_mimeForPatternSync == -1) { if (m_mimeForPatternSync == -1) {
const QModelIndex &modelIndex = m_ui.mimeTypesTableView->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_ui.mimeTypesTreeView->currentIndex();
if (modelIndex.isValid()) if (modelIndex.isValid())
markMimeForPatternSync(m_filterModel->mapToSource(modelIndex).row()); markMimeForPatternSync(m_filterModel->mapToSource(modelIndex).row());
} }
@@ -444,42 +424,34 @@ void MimeTypeSettingsPrivate::handlePatternEdited()
void MimeTypeSettingsPrivate::addMagicHeaderRow(const MagicData &data) void MimeTypeSettingsPrivate::addMagicHeaderRow(const MagicData &data)
{ {
const int row = m_ui.magicHeadersTableWidget->rowCount(); const int row = m_ui.magicHeadersTreeWidget->topLevelItemCount();
m_ui.magicHeadersTableWidget->insertRow(row);
editMagicHeaderRowData(row, data); editMagicHeaderRowData(row, data);
} }
MagicData MimeTypeSettingsPrivate::getMagicHeaderRowData(const int row) const MagicData MimeTypeSettingsPrivate::getMagicHeaderRowData(const int row) const
{ {
MagicData data; MagicData data;
data.m_value = m_ui.magicHeadersTableWidget->item(row, 0)->text(); data.m_value = m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(0);
data.m_type = m_ui.magicHeadersTableWidget->item(row, 1)->text(); data.m_type = m_ui.magicHeadersTreeWidget->topLevelItem(row)->text(1);
QPair<int, int> startEnd = QPair<int, int> 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_start = startEnd.first;
data.m_end = startEnd.second; 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; return data;
} }
void MimeTypeSettingsPrivate::editMagicHeaderRowData(const int row, const MagicData &data) void MimeTypeSettingsPrivate::editMagicHeaderRowData(const int row, const MagicData &data)
{ {
for (int col = 0; col < m_ui.magicHeadersTableWidget->columnCount(); ++col) { QTreeWidgetItem *item = new QTreeWidgetItem;
QTableWidgetItem *item = new QTableWidgetItem; item->setText(0, data.m_value);
if (col == 0) { item->setText(1, data.m_type);
item->setText(data.m_value); item->setText(2, MagicRule::toOffset(qMakePair(data.m_start, data.m_end)));
} else { item->setText(3, QString::number(data.m_priority));
item->setTextAlignment(Qt::AlignCenter); m_ui.magicHeadersTreeWidget->takeTopLevelItem(row);
if (col == 1) m_ui.magicHeadersTreeWidget->insertTopLevelItem(row, item);
item->setText(data.m_type); m_ui.magicHeadersTreeWidget->setCurrentItem(item);
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);
}
} }
void MimeTypeSettingsPrivate::addMagicHeader() void MimeTypeSettingsPrivate::addMagicHeader()
@@ -491,7 +463,7 @@ void MimeTypeSettingsPrivate::addMagicHeader()
if (dlg.exec()) { if (dlg.exec()) {
addMagicHeaderRow(dlg.magicData()); addMagicHeaderRow(dlg.magicData());
markMimeForMagicSync(m_filterModel->mapToSource( markMimeForMagicSync(m_filterModel->mapToSource(
m_ui.mimeTypesTableView->selectionModel()->currentIndex()).row()); m_ui.mimeTypesTreeView->currentIndex()).row());
} }
} }
@@ -500,9 +472,9 @@ void MimeTypeSettingsPrivate::removeMagicHeader()
if (!checkSelectedMagicHeader()) if (!checkSelectedMagicHeader())
return; 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( markMimeForMagicSync(m_filterModel->mapToSource(
m_ui.mimeTypesTableView->selectionModel()->currentIndex()).row()); m_ui.mimeTypesTreeView->currentIndex()).row());
} }
void MimeTypeSettingsPrivate::editMagicHeader() void MimeTypeSettingsPrivate::editMagicHeader()
@@ -511,11 +483,11 @@ void MimeTypeSettingsPrivate::editMagicHeader()
return; return;
MimeTypeMagicDialog dlg; MimeTypeMagicDialog dlg;
dlg.setMagicData(getMagicHeaderRowData(m_ui.magicHeadersTableWidget->currentRow())); dlg.setMagicData(getMagicHeaderRowData(m_ui.magicHeadersTreeWidget->indexOfTopLevelItem(m_ui.magicHeadersTreeWidget->currentItem())));
if (dlg.exec()) { 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( 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() void MimeTypeSettingsPrivate::updateMagicHeaderButtons()
{ {
const QModelIndex &modelIndex = m_ui.magicHeadersTableWidget->selectionModel()->currentIndex(); const QModelIndex &modelIndex = m_ui.magicHeadersTreeWidget->currentIndex();
const bool enabled = modelIndex.isValid(); const bool enabled = modelIndex.isValid();
m_ui.removeMagicButton->setEnabled(enabled); m_ui.removeMagicButton->setEnabled(enabled);
@@ -602,7 +574,7 @@ void MimeTypeSettings::apply()
{ {
if (!d->m_modifiedMimeTypes.isEmpty()) { if (!d->m_modifiedMimeTypes.isEmpty()) {
const QModelIndex &modelIndex = const QModelIndex &modelIndex =
d->m_ui.mimeTypesTableView->selectionModel()->currentIndex(); d->m_ui.mimeTypesTreeView->currentIndex();
if (modelIndex.isValid()) { if (modelIndex.isValid()) {
if (d->m_mimeForPatternSync == d->m_filterModel->mapToSource(modelIndex).row()) if (d->m_mimeForPatternSync == d->m_filterModel->mapToSource(modelIndex).row())
d->syncMimePattern(); d->syncMimePattern();

View File

@@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>593</width> <width>712</width>
<height>403</height> <height>696</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@@ -15,173 +15,157 @@
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QGroupBox" name="mimeTypesGroupBox"> <widget class="QSplitter" name="splitter">
<property name="title">
<string>Registered MIME Types</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QLineEdit" name="filterLineEdit">
<property name="placeholderText">
<string>Filter</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTableView" name="mimeTypesTableView">
<property name="showGrid">
<bool>false</bool>
</property>
<property name="gridStyle">
<enum>Qt::NoPen</enum>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="resetButton">
<property name="toolTip">
<string>Reset all to default.</string>
</property>
<property name="text">
<string>Reset All</string>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>476</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="detailsGroupBox">
<property name="title">
<string>Details</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="patternsLabel">
<property name="text">
<string>Patterns:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="patternsLineEdit"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTableWidget" name="magicHeadersTableWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>100</height>
</size>
</property>
<property name="showGrid">
<bool>false</bool>
</property>
<property name="gridStyle">
<enum>Qt::NoPen</enum>
</property>
<column>
<property name="text">
<string>Magic Header</string>
</property>
</column>
<column>
<property name="text">
<string>Type</string>
</property>
</column>
<column>
<property name="text">
<string>Range</string>
</property>
</column>
<column>
<property name="text">
<string>Priority</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="addMagicButton">
<property name="text">
<string>Add...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="editMagicButton">
<property name="text">
<string>Edit...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removeMagicButton">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>72</width>
<height>18</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Vertical</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="childrenCollapsible">
<size> <bool>false</bool>
<width>504</width>
<height>16</height>
</size>
</property> </property>
</spacer> <widget class="QGroupBox" name="mimeTypesGroupBox">
<property name="title">
<string>Registered MIME Types</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="2">
<widget class="QLineEdit" name="filterLineEdit">
<property name="placeholderText">
<string>Filter</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QPushButton" name="resetButton">
<property name="toolTip">
<string>Reset all to default.</string>
</property>
<property name="text">
<string>Reset All</string>
</property>
</widget>
</item>
<item row="2" column="1">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>476</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0" colspan="2">
<widget class="QTreeView" name="mimeTypesTreeView">
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QGroupBox" name="detailsGroupBox">
<property name="title">
<string>Details</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="patternsLabel">
<property name="text">
<string>Patterns:</string>
</property>
</widget>
</item>
<item>
<widget class="QLineEdit" name="patternsLineEdit"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QTreeWidget" name="magicHeadersTreeWidget">
<property name="rootIsDecorated">
<bool>false</bool>
</property>
<property name="uniformRowHeights">
<bool>true</bool>
</property>
<property name="columnCount">
<number>4</number>
</property>
<column>
<property name="text">
<string notr="true">Magic Header</string>
</property>
</column>
<column>
<property name="text">
<string>Type</string>
</property>
</column>
<column>
<property name="text">
<string>Range</string>
</property>
</column>
<column>
<property name="text">
<string>Priority</string>
</property>
</column>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="addMagicButton">
<property name="text">
<string>Add...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="editMagicButton">
<property name="text">
<string>Edit...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="removeMagicButton">
<property name="text">
<string>Remove</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>72</width>
<height>18</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</widget>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>