5#include "mimetypemodel.h"
10#include <QInputDialog>
11#include <QItemSelectionModel>
15#include <QMimeDatabase>
20MainWindow::MainWindow(QWidget *parent)
23 , m_treeView(new QTreeView(this))
24 , m_detailsText(new QTextEdit(this))
27 setWindowTitle(tr(
"Qt Mime Database Browser"));
29 QMenu *fileMenu = menuBar()->addMenu(tr(
"&File"));
30 QAction *detectFileAction =
31 fileMenu->addAction(tr(
"&Detect File Type..."),
this, &MainWindow::detectFile);
32 detectFileAction->setShortcuts(QKeySequence::Open);
34 QAction *exitAction = fileMenu->addAction(tr(
"E&xit"), qApp, &QApplication::quit);
35 exitAction->setShortcuts(QKeySequence::Quit);
37 QMenu *findMenu = menuBar()->addMenu(tr(
"&Edit"));
39 findMenu->addAction(tr(
"&Find..."),
this, &MainWindow::find);
40 findAction->setShortcuts(QKeySequence::Find);
41 m_findNextAction = findMenu->addAction(tr(
"Find &Next"),
this, &MainWindow::findNext);
42 m_findNextAction->setShortcuts(QKeySequence::FindNext);
43 m_findPreviousAction = findMenu->addAction(tr(
"Find &Previous"),
this,
44 &MainWindow::findPrevious);
45 m_findPreviousAction->setShortcuts(QKeySequence::FindPrevious);
47 menuBar()->addMenu(tr(
"&About"))->addAction(tr(
"&About Qt"), qApp, &QApplication::aboutQt);
49 QSplitter *centralSplitter =
new QSplitter(
this);
50 setCentralWidget(centralSplitter);
51 m_treeView->setUniformRowHeights(
true);
52 m_treeView->setModel(m_model);
53 const auto flags = Qt::MatchContains | Qt::MatchFixedString | Qt::MatchRecursive;
54 const auto items = m_model->findItems(
"application/octet-stream", flags);
56 m_treeView->expand(m_model->indexFromItem(items.constFirst()));
58 connect(m_treeView->selectionModel(), &QItemSelectionModel::currentChanged,
59 this, &MainWindow::currentChanged);
60 centralSplitter->addWidget(m_treeView);
61 m_detailsText->setReadOnly(
true);
62 centralSplitter->addWidget(m_detailsText);
67void MainWindow::currentChanged(
const QModelIndex &index)
70 m_detailsText->setText(MimetypeModel::formatMimeTypeInfo(m_model->mimeType(index)));
72 m_detailsText->clear();
75void MainWindow::selectAndGoTo(
const QModelIndex &index)
77 m_treeView->scrollTo(index, QAbstractItemView::PositionAtCenter);
78 m_treeView->setCurrentIndex(index);
81void MainWindow::detectFile()
83 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Choose File"));
84 if (fileName.isEmpty())
86 QMimeDatabase mimeDatabase;
87 const QFileInfo fi(fileName);
88 const QMimeType mimeType = mimeDatabase.mimeTypeForFile(fi);
89 const QModelIndex index = mimeType.isValid()
90 ? m_model->indexForMimeType(mimeType.name()) : QModelIndex();
91 if (index.isValid()) {
92 statusBar()->showMessage(tr(
"\"%1\" is of type \"%2\"").arg(fi.fileName(),
96 QMessageBox::information(
this, tr(
"Unknown File Type"),
97 tr(
"The type of %1 could not be determined.")
98 .arg(QDir::toNativeSeparators(fileName)));
102void MainWindow::updateFindActions()
104 const bool findNextPreviousEnabled = m_findMatches.size() > 1;
105 m_findNextAction->setEnabled(findNextPreviousEnabled);
106 m_findPreviousAction->setEnabled(findNextPreviousEnabled);
109void MainWindow::findPrevious()
111 if (--m_findIndex < 0)
112 m_findIndex = m_findMatches.size() - 1;
113 if (m_findIndex >= 0)
114 selectAndGoTo(m_findMatches.at(m_findIndex));
117void MainWindow::findNext()
119 if (++m_findIndex >= m_findMatches.size())
121 if (m_findIndex < m_findMatches.size())
122 selectAndGoTo(m_findMatches.at(m_findIndex));
125void MainWindow::find()
127 QInputDialog inputDialog(
this);
128 inputDialog.setWindowTitle(tr(
"Find"));
129 inputDialog.setLabelText(tr(
"Text:"));
130 if (inputDialog.exec() != QDialog::Accepted)
132 const QString value = inputDialog.textValue().trimmed();
136 m_findMatches.clear();
138 const auto flags = Qt::MatchContains | Qt::MatchFixedString | Qt::MatchRecursive;
139 const QList<QStandardItem *> items = m_model->findItems(value, flags);
140 for (
const QStandardItem *item : items)
141 m_findMatches.append(m_model->indexFromItem(item));
142 statusBar()->showMessage(tr(
"%n mime types match \"%1\".", 0, m_findMatches.size()).arg(value));
144 if (!m_findMatches.isEmpty())
145 selectAndGoTo(m_findMatches.constFirst());