#include "views/trace/view.hpp"
#include "views/trace/standardbar.hpp"
+#ifdef ENABLE_DECODE
+#include "subwindows/decoder_selector/subwindow.hpp"
+#endif
+
#include <libsigrokcxx/libsigrokcxx.hpp>
using std::dynamic_pointer_cast;
icon_green_(":/icons/status-green.svg"),
icon_grey_(":/icons/status-grey.svg")
{
- qRegisterMetaType<util::Timestamp>("util::Timestamp");
- qRegisterMetaType<uint64_t>("uint64_t");
-
GlobalSettings::add_change_handler(this);
setup_ui();
{
GlobalSettings::remove_change_handler(this);
+ // Make sure we no longer hold any shared pointers to widgets after the
+ // destructor finishes (goes for sessions and sub windows alike)
+
while (!sessions_.empty())
remove_session(sessions_.front());
+
+ sub_windows_.clear();
}
void MainWindow::show_session_error(const QString text, const QString info_text)
qDebug() << "Notifying user of session error:" << info_text;
QMessageBox msg;
- msg.setText(text);
- msg.setInformativeText(info_text);
+ msg.setText(text + "\n\n" + info_text);
msg.setStandardButtons(QMessageBox::Ok);
msg.setIcon(QMessageBox::Warning);
msg.exec();
QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable);
QAbstractButton *close_btn =
- dock->findChildren<QAbstractButton*>("qt_dockwidget_closebutton")
- .front(); // clazy:exclude=detaching-temporary
+ dock->findChildren<QAbstractButton*>("qt_dockwidget_closebutton") // clazy:exclude=detaching-temporary
+ .front();
connect(close_btn, SIGNAL(clicked(bool)),
this, SLOT(on_view_close_clicked()));
connect(main_bar.get(), SIGNAL(new_view(Session*)),
this, SLOT(on_new_view(Session*)));
+ connect(main_bar.get(), SIGNAL(show_decoder_selector(Session*)),
+ this, SLOT(on_show_decoder_selector(Session*)));
main_bar->action_view_show_cursors()->setChecked(tv->cursors_shown());
}
}
+shared_ptr<subwindows::SubWindowBase> MainWindow::add_subwindow(
+ subwindows::SubWindowType type, Session &session)
+{
+ GlobalSettings settings;
+ shared_ptr<subwindows::SubWindowBase> v;
+
+ QMainWindow *main_window = nullptr;
+ for (auto entry : session_windows_)
+ if (entry.first.get() == &session)
+ main_window = entry.second;
+
+ assert(main_window);
+
+ QString title = "";
+
+ switch (type) {
+#ifdef ENABLE_DECODE
+ case subwindows::SubWindowTypeDecoderSelector:
+ title = tr("Decoder Selector");
+ break;
+#endif
+ default:
+ break;
+ }
+
+ QDockWidget* dock = new QDockWidget(title, main_window);
+ dock->setObjectName(title);
+ main_window->addDockWidget(Qt::TopDockWidgetArea, dock);
+
+ // Insert a QMainWindow into the dock widget to allow for a tool bar
+ QMainWindow *dock_main = new QMainWindow(dock);
+ dock_main->setWindowFlags(Qt::Widget); // Remove Qt::Window flag
+
+#ifdef ENABLE_DECODE
+ if (type == subwindows::SubWindowTypeDecoderSelector)
+ v = make_shared<subwindows::decoder_selector::SubWindow>(session, dock_main);
+#endif
+
+ if (!v)
+ return nullptr;
+
+ sub_windows_[dock] = v;
+ dock_main->setCentralWidget(v.get());
+ dock->setWidget(dock_main);
+
+ dock->setContextMenuPolicy(Qt::PreventContextMenu);
+ dock->setFeatures(QDockWidget::DockWidgetMovable |
+ QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable);
+
+ QAbstractButton *close_btn =
+ dock->findChildren<QAbstractButton*>
+ ("qt_dockwidget_closebutton").front();
+
+ 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 (v->minimum_width() > 0)
+ dock->setMinimumSize(v->minimum_width(), 0);
+
+ return v;
+}
+
shared_ptr<Session> MainWindow::add_session()
{
static int last_session_id = 1;
// When there are no more tabs, the height of the QTabWidget
// drops to zero. We must prevent this to keep the static
// widgets visible
- for (QWidget *w : static_tab_widget_->findChildren<QWidget*>())
- w->setMinimumHeight(h); // clazy:exclude=range-loop
+ for (QWidget *w : static_tab_widget_->findChildren<QWidget*>()) // clazy:exclude=range-loop
+ w->setMinimumHeight(h);
int margin = static_tab_widget_->layout()->contentsMargins().bottom();
static_tab_widget_->setMinimumHeight(h + 2 * margin);
remove_session(session);
}
+void MainWindow::on_show_decoder_selector(Session *session)
+{
+#ifdef ENABLE_DECODE
+ // Close dock widget if it's already showing and return
+ for (auto entry : sub_windows_) {
+ QDockWidget* dock = entry.first;
+ if (dynamic_pointer_cast<subwindows::decoder_selector::SubWindow>(entry.second)) {
+ sub_windows_.erase(dock);
+ dock->close();
+ return;
+ }
+ }
+
+ // We get a pointer and need a reference
+ for (shared_ptr<Session> s : sessions_)
+ if (s.get() == session)
+ add_subwindow(subwindows::SubWindowTypeDecoderSelector, *s);
+#endif
+}
+
+void MainWindow::on_sub_window_close_clicked()
+{
+ // Find the dock widget that contains the close button that was clicked
+ QObject *w = QObject::sender();
+ QDockWidget *dock = nullptr;
+
+ while (w) {
+ dock = qobject_cast<QDockWidget*>(w);
+ if (dock)
+ break;
+ w = w->parent();
+ }
+
+ sub_windows_.erase(dock);
+ dock->close();
+}
+
void MainWindow::on_view_colored_bg_shortcut()
{
GlobalSettings settings;