| 29 | #include <QTimer> |
| 30 | |
| 31 | MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { |
| 32 | setWindowTitle("Device Manager"); |
| 33 | resize(640, 480); |
| 34 | |
| 35 | m_model = new DeviceModel(this); |
| 36 | |
| 37 | m_tree = new QTreeView(this); |
| 38 | m_tree->setModel(m_model); |
| 39 | m_tree->setHeaderHidden(true); |
| 40 | m_tree->setRootIsDecorated(true); |
| 41 | m_tree->setIndentation(16); |
| 42 | m_tree->setContextMenuPolicy(Qt::CustomContextMenu); |
| 43 | setCentralWidget(m_tree); |
| 44 | |
| 45 | connect(m_tree, &QTreeView::doubleClicked, |
| 46 | this, &MainWindow::showProperties); |
| 47 | connect(m_tree, &QTreeView::customContextMenuRequested, |
| 48 | this, &MainWindow::showContextMenu); |
| 49 | connect(m_tree->selectionModel(), |
| 50 | &QItemSelectionModel::currentChanged, |
| 51 | this, [this](const QModelIndex &, const QModelIndex &) { |
| 52 | onSelectionChanged(); |
| 53 | }); |
| 54 | |
| 55 | buildMenus(); |
| 56 | buildToolbar(); |
| 57 | statusBar()->showMessage("Scanning for hardware..."); |
| 58 | startScan(); |
| 59 | |
| 60 | m_rescanTimer = new QTimer(this); |
| 61 | m_rescanTimer->setSingleShot(true); |
| 62 | m_rescanTimer->setInterval(500); |
| 63 | connect(m_rescanTimer, &QTimer::timeout, this, &MainWindow::refresh); |
| 64 | |
| 65 | m_udevMonitor = new UdevMonitor(this); |
| 66 | connect(m_udevMonitor, &UdevMonitor::deviceChanged, |
| 67 | m_rescanTimer, qOverload<>(&QTimer::start)); |
| 68 | } |
| 69 | |
| 70 | MainWindow::~MainWindow() { |
| 71 | if (m_scanner && m_scanner->isRunning()) { |
nothing calls this directly
no outgoing calls
no test coverage detected