#include "globalsettings.hpp"
#include "toolbars/mainbar.hpp"
#include "util.hpp"
-#include "view/view.hpp"
+#include "views/trace/view.hpp"
#include "views/trace/standardbar.hpp"
#include <libsigrokcxx/libsigrokcxx.hpp>
using std::bind;
using std::dynamic_pointer_cast;
using std::make_shared;
-using std::map;
using std::placeholders::_1;
using std::shared_ptr;
using std::string;
const QString MainWindow::WindowTitle = tr("PulseView");
-MainWindow::MainWindow(DeviceManager &device_manager,
- string open_file_name, string open_file_format,
- QWidget *parent) :
+MainWindow::MainWindow(DeviceManager &device_manager, QWidget *parent) :
QMainWindow(parent),
device_manager_(device_manager),
session_selector_(this),
GlobalSettings::register_change_handler(GlobalSettings::Key_View_ShowAnalogMinorGrid,
bind(&MainWindow::on_settingViewShowAnalogMinorGrid_changed, this, _1));
+ GlobalSettings settings;
+ settings.set_defaults_where_needed();
+
setup_ui();
restore_ui_settings();
-
- if (!open_file_name.empty()) {
- shared_ptr<Session> session = add_session();
- session->load_init_file(open_file_name, open_file_format);
- }
-
- // Add empty default session if there aren't any sessions
- if (sessions_.size() == 0) {
- shared_ptr<Session> session = add_session();
-
- map<string, string> dev_info;
- shared_ptr<devices::HardwareDevice> other_device, demo_device;
-
- // Use any available device that's not demo
- for (shared_ptr<devices::HardwareDevice> dev : device_manager_.devices()) {
- if (dev->hardware_device()->driver()->name() == "demo") {
- demo_device = dev;
- } else {
- other_device = dev;
- }
- }
-
- // ...and if there isn't any, just use demo then
- session->select_device(other_device ? other_device : demo_device);
- }
}
MainWindow::~MainWindow()
if (type == views::ViewTypeTrace)
// This view will be the main view if there's no main bar yet
- v = make_shared<views::TraceView::View>(session,
+ v = make_shared<views::trace::View>(session,
(main_bar ? false : true), dock_main);
if (!v)
dock_main->setCentralWidget(v.get());
dock->setWidget(dock_main);
+ dock->setContextMenuPolicy(Qt::PreventContextMenu);
dock->setFeatures(QDockWidget::DockWidgetMovable |
QDockWidget::DockWidgetFloatable | QDockWidget::DockWidgetClosable);
SLOT(trigger_event(util::Timestamp)));
if (type == views::ViewTypeTrace) {
- views::TraceView::View *tv =
- qobject_cast<views::TraceView::View*>(v.get());
+ views::trace::View *tv =
+ qobject_cast<views::trace::View*>(v.get());
tv->enable_coloured_bg(settings.value(GlobalSettings::Key_View_ColouredBG).toBool());
tv->enable_show_sampling_points(settings.value(GlobalSettings::Key_View_ShowSamplingPoints).toBool());
void MainWindow::remove_session(shared_ptr<Session> session)
{
+ // Determine the height of the button before it collapses
int h = new_session_button_->height();
+ // Stop capture while the session still exists so that the UI can be
+ // updated in case we're currently running. If so, this will schedule a
+ // call to our on_capture_state_changed() slot for the next run of the
+ // event loop. We need to have this executed immediately or else it will
+ // be dismissed since the session object will be deleted by the time we
+ // leave this method and the event loop gets a chance to run again.
+ session->stop_capture();
+ QApplication::processEvents();
+
for (shared_ptr<views::ViewBase> view : session->views())
remove_view(view);
if (last_focused_session_ == session)
last_focused_session_.reset();
+ // Remove the session from our list of sessions (which also destroys it)
sessions_.remove_if([&](shared_ptr<Session> s) {
return s == session; });
}
}
+void MainWindow::add_session_with_file(string open_file_name,
+ string open_file_format)
+{
+ shared_ptr<Session> session = add_session();
+ session->load_init_file(open_file_name, open_file_format);
+}
+
+void MainWindow::add_default_session()
+{
+ // Only add the default session if there would be no session otherwise
+ if (sessions_.size() > 0)
+ return;
+
+ shared_ptr<Session> session = add_session();
+
+ // Check the list of available devices. Prefer the one that was
+ // found with user supplied scan specs (if applicable). Then try
+ // one of the auto detected devices that are not the demo device.
+ // Pick demo in the absence of "genuine" hardware devices.
+ shared_ptr<devices::HardwareDevice> user_device, other_device, demo_device;
+ for (shared_ptr<devices::HardwareDevice> dev : device_manager_.devices()) {
+ if (dev == device_manager_.user_spec_device()) {
+ user_device = dev;
+ } else if (dev->hardware_device()->driver()->name() == "demo") {
+ demo_device = dev;
+ } else {
+ other_device = dev;
+ }
+ }
+ if (user_device)
+ session->select_device(user_device);
+ else if (other_device)
+ session->select_device(other_device);
+ else
+ session->select_device(demo_device);
+}
+
+void MainWindow::save_sessions()
+{
+ QSettings settings;
+ int id = 0;
+
+ for (shared_ptr<Session> session : sessions_) {
+ // Ignore sessions using the demo device or no device at all
+ if (session->device()) {
+ shared_ptr<devices::HardwareDevice> device =
+ dynamic_pointer_cast< devices::HardwareDevice >
+ (session->device());
+
+ if (device &&
+ device->hardware_device()->driver()->name() == "demo")
+ continue;
+
+ settings.beginGroup("Session" + QString::number(id++));
+ settings.remove(""); // Remove all keys in this group
+ session->save_settings(settings);
+ settings.endGroup();
+ }
+ }
+
+ settings.setValue("sessions", id);
+}
+
+void MainWindow::restore_sessions()
+{
+ QSettings settings;
+ int i, session_count;
+
+ session_count = settings.value("sessions", 0).toInt();
+
+ for (i = 0; i < session_count; i++) {
+ settings.beginGroup("Session" + QString::number(i));
+ shared_ptr<Session> session = add_session();
+ session->restore_settings(settings);
+ settings.endGroup();
+ }
+}
+
void MainWindow::setup_ui()
{
setObjectName(QString::fromUtf8("MainWindow"));
// Set the window icon
QIcon icon;
- icon.addFile(QString(":/icons/sigrok-logo-notext.png"));
+ icon.addFile(QString(":/icons/pulseview.png"));
setWindowIcon(icon);
view_sticky_scrolling_shortcut_ = new QShortcut(QKeySequence(Qt::Key_S), this, SLOT(on_view_sticky_scrolling_shortcut()));
void MainWindow::save_ui_settings()
{
QSettings settings;
- int id = 0;
settings.beginGroup("MainWindow");
settings.setValue("state", saveState());
settings.setValue("geometry", saveGeometry());
settings.endGroup();
-
- for (shared_ptr<Session> session : sessions_) {
- // Ignore sessions using the demo device or no device at all
- if (session->device()) {
- shared_ptr<devices::HardwareDevice> device =
- dynamic_pointer_cast< devices::HardwareDevice >
- (session->device());
-
- if (device &&
- device->hardware_device()->driver()->name() == "demo")
- continue;
-
- settings.beginGroup("Session" + QString::number(id++));
- settings.remove(""); // Remove all keys in this group
- session->save_settings(settings);
- settings.endGroup();
- }
- }
-
- settings.setValue("sessions", id);
}
void MainWindow::restore_ui_settings()
{
QSettings settings;
- int i, session_count;
settings.beginGroup("MainWindow");
resize(1000, 720);
settings.endGroup();
-
- session_count = settings.value("sessions", 0).toInt();
-
- for (i = 0; i < session_count; i++) {
- settings.beginGroup("Session" + QString::number(i));
- shared_ptr<Session> session = add_session();
- session->restore_settings(settings);
- settings.endGroup();
- }
}
shared_ptr<Session> MainWindow::get_tab_session(int index) const
event->ignore();
} else {
save_ui_settings();
+ save_sessions();
event->accept();
}
}
{
shared_ptr<Session> session = get_tab_session(index);
- assert(session);
+ if (!session)
+ return;
if (session->data_saved() || (QMessageBox::question(this, tr("Confirmation"),
tr("This session contains unsaved data. Close it anyway?"),
shared_ptr<views::ViewBase> viewbase = entry.second;
// Only trace views have this setting
- views::TraceView::View* view =
- qobject_cast<views::TraceView::View*>(viewbase.get());
+ views::trace::View* view =
+ qobject_cast<views::trace::View*>(viewbase.get());
if (view)
view->enable_coloured_bg(state);
}
shared_ptr<views::ViewBase> viewbase = entry.second;
// Only trace views have this setting
- views::TraceView::View* view =
- qobject_cast<views::TraceView::View*>(viewbase.get());
+ views::trace::View* view =
+ qobject_cast<views::trace::View*>(viewbase.get());
if (view)
view->enable_show_sampling_points(state);
}
shared_ptr<views::ViewBase> viewbase = entry.second;
// Only trace views have this setting
- views::TraceView::View* view =
- qobject_cast<views::TraceView::View*>(viewbase.get());
+ views::trace::View* view =
+ qobject_cast<views::trace::View*>(viewbase.get());
if (view)
view->enable_show_analog_minor_grid(state);
}