RabbitCommon v2.3.3
Loading...
Searching...
No Matches
mainwindow.cpp
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
3
4#include "mainwindow.h"
5#include "mimetypemodel.h"
6
7#include <QApplication>
8#include <QFileDialog>
9#include <QFileInfo>
10#include <QInputDialog>
11#include <QItemSelectionModel>
12#include <QMenu>
13#include <QMenuBar>
14#include <QMessageBox>
15#include <QMimeDatabase>
16#include <QMimeType>
17#include <QSplitter>
18#include <QStatusBar>
19
20MainWindow::MainWindow(QWidget *parent)
21 : QMainWindow(parent)
22 , m_model(new MimetypeModel(this))
23 , m_treeView(new QTreeView(this))
24 , m_detailsText(new QTextEdit(this))
25 , m_findIndex(0)
26{
27 setWindowTitle(tr("Qt Mime Database Browser"));
28
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);
33
34 QAction *exitAction = fileMenu->addAction(tr("E&xit"), qApp, &QApplication::quit);
35 exitAction->setShortcuts(QKeySequence::Quit);
36
37 QMenu *findMenu = menuBar()->addMenu(tr("&Edit"));
38 QAction *findAction =
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);
46
47 menuBar()->addMenu(tr("&About"))->addAction(tr("&About Qt"), qApp, &QApplication::aboutQt);
48
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);
55 if (!items.isEmpty())
56 m_treeView->expand(m_model->indexFromItem(items.constFirst()));
57
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);
63
64 updateFindActions();
65}
66
67void MainWindow::currentChanged(const QModelIndex &index)
68{
69 if (index.isValid())
70 m_detailsText->setText(MimetypeModel::formatMimeTypeInfo(m_model->mimeType(index)));
71 else
72 m_detailsText->clear();
73}
74
75void MainWindow::selectAndGoTo(const QModelIndex &index)
76{
77 m_treeView->scrollTo(index, QAbstractItemView::PositionAtCenter);
78 m_treeView->setCurrentIndex(index);
79}
80
81void MainWindow::detectFile()
82{
83 const QString fileName = QFileDialog::getOpenFileName(this, tr("Choose File"));
84 if (fileName.isEmpty())
85 return;
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(),
93 mimeType.name()));
94 selectAndGoTo(index);
95 } else {
96 QMessageBox::information(this, tr("Unknown File Type"),
97 tr("The type of %1 could not be determined.")
98 .arg(QDir::toNativeSeparators(fileName)));
99 }
100}
101
102void MainWindow::updateFindActions()
103{
104 const bool findNextPreviousEnabled = m_findMatches.size() > 1;
105 m_findNextAction->setEnabled(findNextPreviousEnabled);
106 m_findPreviousAction->setEnabled(findNextPreviousEnabled);
107}
108
109void MainWindow::findPrevious()
110{
111 if (--m_findIndex < 0)
112 m_findIndex = m_findMatches.size() - 1;
113 if (m_findIndex >= 0)
114 selectAndGoTo(m_findMatches.at(m_findIndex));
115}
116
117void MainWindow::findNext()
118{
119 if (++m_findIndex >= m_findMatches.size())
120 m_findIndex = 0;
121 if (m_findIndex < m_findMatches.size())
122 selectAndGoTo(m_findMatches.at(m_findIndex));
123}
124
125void MainWindow::find()
126{
127 QInputDialog inputDialog(this);
128 inputDialog.setWindowTitle(tr("Find"));
129 inputDialog.setLabelText(tr("Text:"));
130 if (inputDialog.exec() != QDialog::Accepted)
131 return;
132 const QString value = inputDialog.textValue().trimmed();
133 if (value.isEmpty())
134 return;
135
136 m_findMatches.clear();
137 m_findIndex = 0;
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));
143 updateFindActions();
144 if (!m_findMatches.isEmpty())
145 selectAndGoTo(m_findMatches.constFirst());
146}