+ restore_ui_settings();
+ if (open_file_name.empty())
+ select_init_device();
+ else
+ load_init_file(open_file_name, open_file_format);
+}
+
+MainWindow::~MainWindow()
+{
+ for (auto entry : view_docks_) {
+ const std::shared_ptr<QDockWidget> dock = entry.first;
+ dock->setWidget(0);
+ const std::shared_ptr<pv::view::View> view = entry.second;
+ session_.deregister_view(view);
+ }
+}
+
+QAction* MainWindow::action_open() const
+{
+ return action_open_;
+}
+
+QAction* MainWindow::action_save_as() const
+{
+ return action_save_as_;
+}
+
+QAction* MainWindow::action_save_selection_as() const
+{
+ return action_save_selection_as_;
+}
+
+QAction* MainWindow::action_connect() const
+{
+ return action_connect_;
+}
+
+QAction* MainWindow::action_quit() const
+{
+ return action_quit_;
+}
+
+QAction* MainWindow::action_view_zoom_in() const
+{
+ return action_view_zoom_in_;
+}
+
+QAction* MainWindow::action_view_zoom_out() const
+{
+ return action_view_zoom_out_;
+}
+
+QAction* MainWindow::action_view_zoom_fit() const
+{
+ return action_view_zoom_fit_;
+}
+
+QAction* MainWindow::action_view_zoom_one_to_one() const
+{
+ return action_view_zoom_one_to_one_;
+}
+
+QAction* MainWindow::action_view_sticky_scrolling() const
+{
+ return action_view_sticky_scrolling_;
+}
+
+QAction* MainWindow::action_view_coloured_bg() const
+{
+ return action_view_coloured_bg_;
+}
+
+QAction* MainWindow::action_view_show_cursors() const
+{
+ return action_view_show_cursors_;
+}
+
+QAction* MainWindow::action_about() const
+{
+ return action_about_;
+}
+
+#ifdef ENABLE_DECODE
+QMenu* MainWindow::menu_decoder_add() const
+{
+ return menu_decoders_add_;
+}
+#endif
+
+shared_ptr<pv::view::View> MainWindow::get_active_view() const
+{
+ // If there's only one view, use it...
+ if (view_docks_.size() == 1)
+ return view_docks_.begin()->second;
+
+ // ...otherwise find the dock widget the widget with focus is contained in
+ QObject *w = QApplication::focusWidget();
+ QDockWidget *dock = 0;
+
+ while (w) {
+ dock = qobject_cast<QDockWidget*>(w);
+ if (dock)
+ break;
+ w = w->parent();
+ }
+
+ // Get the view contained in the dock widget
+ for (auto entry : view_docks_)
+ if (entry.first.get() == dock)
+ return entry.second;
+
+ return shared_ptr<pv::view::View>();
+}
+
+shared_ptr<pv::view::View> MainWindow::add_view(const QString &title,
+ view::ViewType type, Session &session)
+{
+ shared_ptr<pv::view::View> v;
+
+ if (type == pv::view::TraceView)
+ v = make_shared<pv::view::View>(session, this);
+
+ if (v) {
+ shared_ptr<QDockWidget> dock = make_shared<QDockWidget>(title, this);
+ dock->setWidget(v.get());
+ dock->setObjectName(title);
+ addDockWidget(Qt::TopDockWidgetArea, dock.get());
+ view_docks_[dock] = v;
+
+ dock->setFeatures(QDockWidget::DockWidgetMovable |
+ QDockWidget::DockWidgetFloatable);
+
+ if (type == view::TraceView) {
+ connect(&session, SIGNAL(trigger_event(util::Timestamp)), v.get(),
+ SLOT(trigger_event(util::Timestamp)));
+ connect(v.get(), SIGNAL(sticky_scrolling_changed(bool)), this,
+ SLOT(sticky_scrolling_changed(bool)));
+ connect(v.get(), SIGNAL(always_zoom_to_fit_changed(bool)), this,
+ SLOT(always_zoom_to_fit_changed(bool)));
+
+ v->enable_sticky_scrolling(action_view_sticky_scrolling_->isChecked());
+ v->enable_coloured_bg(action_view_coloured_bg_->isChecked());
+ action_view_show_cursors_->setChecked(v->cursors_shown());
+ }
+
+ session.register_view(v);
+ }
+
+ return v;
+}
+
+void MainWindow::run_stop()
+{
+ switch (session_.get_capture_state()) {
+ case Session::Stopped:
+ session_.start_capture([&](QString message) {
+ session_error("Capture failed", message); });
+ break;
+ case Session::AwaitingTrigger:
+ case Session::Running:
+ session_.stop_capture();
+ break;
+ }
+}
+
+void MainWindow::select_device(shared_ptr<devices::Device> device)
+{
+ try {
+ if (device)
+ session_.set_device(device);
+ else
+ session_.set_default_device();
+ } catch (const QString &e) {
+ QMessageBox msg(this);
+ msg.setText(e);
+ msg.setInformativeText(tr("Failed to Select Device"));
+ msg.setStandardButtons(QMessageBox::Ok);
+ msg.setIcon(QMessageBox::Warning);
+ msg.exec();
+ }
+}
+
+void MainWindow::export_file(shared_ptr<OutputFormat> format,
+ bool selection_only)
+{
+ using pv::dialogs::StoreProgress;
+
+ // Make sure there's a view selected to pull the data from
+ shared_ptr<pv::view::View> view = get_active_view();
+ if (!view) {
+ show_session_error(tr("No View Selected"), tr("Please click on the " \
+ "view whose data you want to save and try again."));
+ return;