// mainwindow.cpp - tabs CONTROLLER 1..3 and the selected controller (see mainwindow.h) #include "mainwindow.h" #include "deviceview.h" #include "panelwidget.h" #include "style.h" #include "tabbar.h" #include #include #include #include #include MainWindow::MainWindow(const QStringList &ports, int baudRate, QWidget *parent) : QWidget(parent) { setWindowTitle(QStringLiteral("AdvancedController - virtual front panel")); resize(980, 730); setMinimumSize(660, 480); QPalette windowPalette = palette(); windowPalette.setColor(QPalette::Window, Style::Background); windowPalette.setColor(QPalette::WindowText, Style::Text); setPalette(windowPalette); setAutoFillBackground(true); // --- tabs CONTROLLER 1..3 --- m_tabs = new TabBar(Devices, this); auto *tabsBox = new QHBoxLayout; tabsBox->setContentsMargins(8, 8, 8, 0); tabsBox->addWidget(m_tabs); // --- one device block per tab; only the selected one is shown, all keep working --- m_stack = new QStackedWidget(this); for (int i = 0; i < Devices; ++i) { auto *device = new DeviceView(i, baudRate, i < ports.size() ? ports.at(i) : QString(), m_stack); connect(device, &DeviceView::stateChanged, m_tabs, &TabBar::setState); m_stack->addWidget(device); m_devices.append(device); } auto *root = new QVBoxLayout(this); root->setContentsMargins(0, 0, 0, 0); root->setSpacing(0); root->addLayout(tabsBox); root->addWidget(m_stack, 1); connect(m_tabs, &TabBar::selected, this, &MainWindow::select); select(0); qApp->installEventFilter(this); // PC keyboard = cross pad } MainWindow::~MainWindow() { qApp->removeEventFilter(this); } void MainWindow::select(int index) { m_stack->setCurrentIndex(index); m_tabs->setActive(index); } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { const bool keyEvent = event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease; if (keyEvent && isActiveWindow() && !QApplication::activePopupWidget()) { auto *key = static_cast(event); QString button; switch (key->key()) { case Qt::Key_Up: button = QStringLiteral("UP"); break; case Qt::Key_Down: button = QStringLiteral("DOWN"); break; case Qt::Key_Left: button = QStringLiteral("LEFT"); break; case Qt::Key_Right: button = QStringLiteral("RIGHT"); break; case Qt::Key_Return: button = QStringLiteral("ENTER"); break; default: break; } if (!button.isEmpty()) { if (!key->isAutoRepeat()) { // ignore the key auto-repeat PanelWidget *panel = m_devices.at(m_stack->currentIndex())->panel(); if (event->type() == QEvent::KeyPress) panel->press(button); else panel->release(button); } return true; } } return QWidget::eventFilter(watched, event); }