]> sigrok.org Git - pulseview.git/blobdiff - pv/mainwindow.cpp
Add tabular decoder view
[pulseview.git] / pv / mainwindow.cpp
index d7f5c31a3e78e11857ee149473c3ff0f5f763d9b..6758d77df88a1854141964ab54e1b80a9be1ad4a 100644 (file)
@@ -40,6 +40,7 @@
 
 #include "mainwindow.hpp"
 
+#include "application.hpp"
 #include "devicemanager.hpp"
 #include "devices/hardwaredevice.hpp"
 #include "dialogs/settings.hpp"
@@ -51,7 +52,8 @@
 
 #ifdef ENABLE_DECODE
 #include "subwindows/decoder_selector/subwindow.hpp"
-#include "views/decoder_output/view.hpp"
+#include "views/decoder_binary/view.hpp"
+#include "views/tabular_decoder/view.hpp"
 #endif
 
 #include <libsigrokcxx/libsigrokcxx.hpp>
@@ -161,8 +163,10 @@ shared_ptr<views::ViewBase> MainWindow::add_view(views::ViewType type,
                // This view will be the main view if there's no main bar yet
                v = make_shared<views::trace::View>(session, (main_bar ? false : true), dock_main);
 #ifdef ENABLE_DECODE
-       if (type == views::ViewTypeDecoderOutput)
-               v = make_shared<views::decoder_output::View>(session, false, dock_main);
+       if (type == views::ViewTypeDecoderBinary)
+               v = make_shared<views::decoder_binary::View>(session, false, dock_main);
+       if (type == views::ViewTypeTabularDecoder)
+               v = make_shared<views::tabular_decoder::View>(session, false, dock_main);
 #endif
 
        if (!v)
@@ -221,6 +225,8 @@ shared_ptr<views::ViewBase> MainWindow::add_view(views::ViewType type,
                }
        }
 
+       v->setFocus();
+
        return v;
 }
 
@@ -256,7 +262,7 @@ shared_ptr<subwindows::SubWindowBase> MainWindow::add_subwindow(
        subwindows::SubWindowType type, Session &session)
 {
        GlobalSettings settings;
-       shared_ptr<subwindows::SubWindowBase> v;
+       shared_ptr<subwindows::SubWindowBase> w;
 
        QMainWindow *main_window = nullptr;
        for (auto& entry : session_windows_)
@@ -287,14 +293,14 @@ shared_ptr<subwindows::SubWindowBase> MainWindow::add_subwindow(
 
 #ifdef ENABLE_DECODE
        if (type == subwindows::SubWindowTypeDecoderSelector)
-               v = make_shared<subwindows::decoder_selector::SubWindow>(session, dock_main);
+               w = make_shared<subwindows::decoder_selector::SubWindow>(session, dock_main);
 #endif
 
-       if (!v)
+       if (!w)
                return nullptr;
 
-       sub_windows_[dock] = v;
-       dock_main->setCentralWidget(v.get());
+       sub_windows_[dock] = w;
+       dock_main->setCentralWidget(w.get());
        dock->setWidget(dock_main);
 
        dock->setContextMenuPolicy(Qt::PreventContextMenu);
@@ -311,13 +317,13 @@ shared_ptr<subwindows::SubWindowBase> MainWindow::add_subwindow(
        connect(close_btn, SIGNAL(clicked(bool)),
                this, SLOT(on_sub_window_close_clicked()));
 
-       if (v->has_toolbar())
-               dock_main->addToolBar(v->create_toolbar(dock_main));
+       if (w->has_toolbar())
+               dock_main->addToolBar(w->create_toolbar(dock_main));
 
-       if (v->minimum_width() > 0)
-               dock->setMinimumSize(v->minimum_width(), 0);
+       if (w->minimum_width() > 0)
+               dock->setMinimumSize(w->minimum_width(), 0);
 
-       return v;
+       return w;
 }
 
 shared_ptr<Session> MainWindow::add_session()
@@ -348,7 +354,7 @@ shared_ptr<Session> MainWindow::add_session()
 
        window->setDockNestingEnabled(true);
 
-       shared_ptr<views::ViewBase> main_view = add_view(views::ViewTypeTrace, *session);
+       add_view(views::ViewTypeTrace, *session);
 
        return session;
 }
@@ -566,10 +572,16 @@ void MainWindow::setup_ui()
 
 void MainWindow::update_acq_button(Session *session)
 {
-       int state = session->get_capture_state();
+       int state;
+       QString run_caption;
 
-       const QString run_caption =
-               session->using_file_device() ? tr("Reload") : tr("Run");
+       if (session) {
+               state = session->get_capture_state();
+               run_caption = session->using_file_device() ? tr("Reload") : tr("Run");
+       } else {
+               state = Session::Stopped;
+               run_caption = tr("Run");
+       }
 
        const QIcon *icons[] = {&icon_grey_, &icon_red_, &icon_green_};
        run_stop_button_->setIcon(*icons[state]);
@@ -844,6 +856,9 @@ void MainWindow::on_tab_close_requested(int index)
                tr("This session contains unsaved data. Close it anyway?"),
                QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes))
                remove_session(session);
+
+       if (sessions_.empty())
+               update_acq_button(nullptr);
 }
 
 void MainWindow::on_show_decoder_selector(Session *session)
@@ -884,6 +899,10 @@ void MainWindow::on_sub_window_close_clicked()
 
        sub_windows_.erase(dock);
        dock->close();
+
+       // Restore focus to the last used main view
+       if (last_focused_session_)
+               last_focused_session_->main_view()->setFocus();
 }
 
 void MainWindow::on_view_colored_bg_shortcut()