const char *MainBar::SettingOpenDirectory = "MainWindow/OpenDirectory";
const char *MainBar::SettingSaveDirectory = "MainWindow/SaveDirectory";
-MainBar::MainBar(Session &session, MainWindow &main_window,
- string open_file_name, string open_file_format) :
+MainBar::MainBar(Session &session, MainWindow &main_window) :
QToolBar("Sampling Bar", &main_window),
+ action_new_session_(new QAction(this)),
+ action_new_view_(new QAction(this)),
action_open_(new QAction(this)),
action_save_as_(new QAction(this)),
action_save_selection_as_(new QAction(this)),
icon_green_(":/icons/status-green.svg"),
icon_grey_(":/icons/status-grey.svg"),
run_stop_button_(this),
- run_stop_button_action_(nullptr),
- menu_button_(this)
+ run_stop_button_action_(nullptr)
#ifdef ENABLE_DECODE
, menu_decoders_add_(new pv::widgets::DecoderMenu(this, true))
#endif
setContextMenuPolicy(Qt::PreventContextMenu);
// Actions
+ action_new_session_->setText(tr("New &Session"));
+ action_new_session_->setIcon(QIcon::fromTheme("document-new",
+ QIcon(":/icons/document-new.png")));
+ connect(action_new_session_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionNewSession_triggered()));
+
+ action_new_view_->setText(tr("New &View"));
+ action_new_view_->setIcon(QIcon::fromTheme("window-new",
+ QIcon(":/icons/window-new.png")));
+ connect(action_new_view_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionNewView_triggered()));
+
action_open_->setText(tr("&Open..."));
action_open_->setIcon(QIcon::fromTheme("document-open",
QIcon(":/icons/document-open.png")));
action_open_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_O));
- action_open_->setObjectName(QString::fromUtf8("actionOpen"));
+ connect(action_open_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionOpen_triggered()));
action_save_as_->setText(tr("&Save As..."));
action_save_as_->setIcon(QIcon::fromTheme("document-save-as",
QIcon(":/icons/document-save-as.png")));
action_save_as_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_S));
- action_save_as_->setObjectName(QString::fromUtf8("actionSaveAs"));
+ connect(action_save_as_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionSaveAs_triggered()));
action_save_selection_as_->setText(tr("Save Selected &Range As..."));
action_save_selection_as_->setIcon(QIcon::fromTheme("document-save-as",
QIcon(":/icons/document-save-as.png")));
action_save_selection_as_->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_R));
- action_save_selection_as_->setObjectName(QString::fromUtf8("actionSaveSelectionAs"));
+ connect(action_save_selection_as_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionSaveSelectionAs_triggered()));
widgets::ExportMenu *menu_file_export = new widgets::ExportMenu(this,
session.device_manager().context());
this, SLOT(import_file(std::shared_ptr<sigrok::InputFormat>)));
action_connect_->setText(tr("&Connect to Device..."));
- action_connect_->setObjectName(QString::fromUtf8("actionConnect"));
+ connect(action_connect_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionConnect_triggered()));
action_view_zoom_in_->setText(tr("Zoom &In"));
action_view_zoom_in_->setIcon(QIcon::fromTheme("zoom-in",
QIcon(":/icons/zoom-in.png")));
// simply using Qt::Key_Plus shows no + in the menu
action_view_zoom_in_->setShortcut(QKeySequence::ZoomIn);
- action_view_zoom_in_->setObjectName(
- QString::fromUtf8("actionViewZoomIn"));
+ connect(action_view_zoom_in_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionViewZoomIn_triggered()));
action_view_zoom_out_->setText(tr("Zoom &Out"));
action_view_zoom_out_->setIcon(QIcon::fromTheme("zoom-out",
QIcon(":/icons/zoom-out.png")));
action_view_zoom_out_->setShortcut(QKeySequence::ZoomOut);
- action_view_zoom_out_->setObjectName(
- QString::fromUtf8("actionViewZoomOut"));
+ connect(action_view_zoom_out_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionViewZoomOut_triggered()));
action_view_zoom_fit_->setCheckable(true);
action_view_zoom_fit_->setText(tr("Zoom to &Fit"));
action_view_zoom_fit_->setIcon(QIcon::fromTheme("zoom-fit",
QIcon(":/icons/zoom-fit.png")));
action_view_zoom_fit_->setShortcut(QKeySequence(Qt::Key_F));
- action_view_zoom_fit_->setObjectName(
- QString::fromUtf8("actionViewZoomFit"));
+ connect(action_view_zoom_fit_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionViewZoomFit_triggered()));
action_view_zoom_one_to_one_->setText(tr("Zoom to O&ne-to-One"));
action_view_zoom_one_to_one_->setIcon(QIcon::fromTheme("zoom-original",
QIcon(":/icons/zoom-original.png")));
action_view_zoom_one_to_one_->setShortcut(QKeySequence(Qt::Key_O));
- action_view_zoom_one_to_one_->setObjectName(
- QString::fromUtf8("actionViewZoomOneToOne"));
+ connect(action_view_zoom_one_to_one_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionViewZoomOneToOne_triggered()));
action_view_show_cursors_->setCheckable(true);
action_view_show_cursors_->setIcon(QIcon::fromTheme("show-cursors",
QIcon(":/icons/show-cursors.svg")));
action_view_show_cursors_->setShortcut(QKeySequence(Qt::Key_C));
- action_view_show_cursors_->setObjectName(
- QString::fromUtf8("actionViewShowCursors"));
+ connect(action_view_show_cursors_, SIGNAL(triggered(bool)),
+ this, SLOT(on_actionViewShowCursors_triggered()));
action_view_show_cursors_->setText(tr("Show &Cursors"));
// Open button
session.device_manager().context(), action_open_);
connect(import_menu,
SIGNAL(format_selected(std::shared_ptr<sigrok::InputFormat>)),
- &main_window,
+ this,
SLOT(import_file(std::shared_ptr<sigrok::InputFormat>)));
open_button->setMenu(import_menu);
open_actions);
connect(export_menu,
SIGNAL(format_selected(std::shared_ptr<sigrok::OutputFormat>)),
- &main_window,
+ this,
SLOT(export_file(std::shared_ptr<sigrok::OutputFormat>)));
save_button->setMenu(export_menu);
#endif
// Setup the toolbar
+ addAction(action_new_session_);
+ addAction(action_new_view_);
+ addSeparator();
addWidget(open_button);
addWidget(save_button);
addSeparator();
addWidget(add_decoder_button);
#endif
- QWidget *const spacer = new QWidget();
- spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- addWidget(spacer);
-
- addWidget(&menu_button_);
-
sample_count_.installEventFilter(this);
sample_rate_.installEventFilter(this);
- QMetaObject::connectSlotsByName(this);
-
// Setup session_ events
- connect(&session_, SIGNAL(capture_state_changed(int)), this,
- SLOT(capture_state_changed(int)));
- connect(&session_, SIGNAL(device_selected()), this,
- SLOT(device_selected()));
-
- // Figure out which file/device to use
- if (open_file_name.empty())
- select_init_device();
- else
- load_init_file(open_file_name, open_file_format);
+ connect(&session_, SIGNAL(capture_state_changed(int)),
+ this, SLOT(capture_state_changed(int)));
+ connect(&session, SIGNAL(device_changed()),
+ this, SLOT(on_device_changed()));
+
+ update_device_list();
}
Session &MainBar::session(void) const
device_selector_.reset();
}
+void MainBar::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 MainBar::load_init_file(const std::string &file_name,
+ const std::string &format)
+{
+ shared_ptr<InputFormat> input_format;
+
+ DeviceManager& device_manager = session_.device_manager();
+
+ if (!format.empty()) {
+ const map<string, shared_ptr<InputFormat> > formats =
+ device_manager.context()->input_formats();
+ const auto iter = find_if(formats.begin(), formats.end(),
+ [&](const pair<string, shared_ptr<InputFormat> > f) {
+ return f.first == format; });
+ if (iter == formats.end()) {
+ cerr << "Unexpected input format: " << format << endl;
+ return;
+ }
+
+ input_format = (*iter).second;
+ }
+
+ load_file(QString::fromStdString(file_name), input_format);
+}
+
QAction* MainBar::action_open() const
{
return action_open_;
}
}
-void MainBar::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 MainBar::select_init_device()
-{
- QSettings settings;
- map<string, string> dev_info;
- list<string> key_list;
- shared_ptr<devices::HardwareDevice> device;
-
- DeviceManager& device_manager = session_.device_manager();
-
- // Re-select last used device if possible but only if it's not demo
- settings.beginGroup("Device");
- key_list.push_back("vendor");
- key_list.push_back("model");
- key_list.push_back("version");
- key_list.push_back("serial_num");
- key_list.push_back("connection_id");
-
- for (string key : key_list) {
- const QString k = QString::fromStdString(key);
- if (!settings.contains(k))
- continue;
-
- const string value = settings.value(k).toString().toStdString();
- if (!value.empty())
- dev_info.insert(std::make_pair(key, value));
- }
-
- if (dev_info.count("model") > 0)
- if (dev_info.at("model").find("Demo device") == std::string::npos)
- device = device_manager.find_device_from_info(dev_info);
-
- // When we can't find a device similar to the one we used last
- // time and there is at least one device aside from demo, use it
- if (!device) {
- for (shared_ptr<devices::HardwareDevice> dev : device_manager.devices()) {
- dev_info = device_manager.get_device_info(dev);
-
- if (dev_info.count("model") > 0)
- if (dev_info.at("model").find("Demo device") == std::string::npos) {
- device = dev;
- break;
- }
- }
- }
-
- select_device(device);
- update_device_list();
-
- settings.endGroup();
-}
-
void MainBar::load_file(QString file_name,
std::shared_ptr<sigrok::InputFormat> format,
const std::map<std::string, Glib::VariantBase> &options)
session_.start_capture([&, errorMessage](QString infoMessage) {
session_error(errorMessage, infoMessage); });
-}
-
-void MainBar::load_init_file(const std::string &file_name,
- const std::string &format)
-{
- shared_ptr<InputFormat> input_format;
-
- DeviceManager& device_manager = session_.device_manager();
-
- if (!format.empty()) {
- const map<string, shared_ptr<InputFormat> > formats =
- device_manager.context()->input_formats();
- const auto iter = find_if(formats.begin(), formats.end(),
- [&](const pair<string, shared_ptr<InputFormat> > f) {
- return f.first == format; });
- if (iter == formats.end()) {
- cerr << "Unexpected input format: " << format << endl;
- return;
- }
- input_format = (*iter).second;
- }
-
- load_file(QString::fromStdString(file_name), input_format);
+ session_.set_name(QFileInfo(file_name).fileName());
}
void MainBar::update_sample_rate_selector()
// Selection only? Verify that the cursors are active and fetch their values
if (selection_only) {
- if (!session_.main_view()->cursors()->enabled()) {
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ if (!trace_view->cursors()->enabled()) {
show_session_error(tr("Missing Cursors"), tr("You need to set the " \
"cursors before you can save the data enclosed by them " \
"to a session file (e.g. using ALT-V - Show Cursors)."));
const double samplerate = session_.get_samplerate();
- const pv::util::Timestamp& start_time = session_.main_view()->cursors()->first()->time();
- const pv::util::Timestamp& end_time = session_.main_view()->cursors()->second()->time();
+ const pv::util::Timestamp& start_time = trace_view->cursors()->first()->time();
+ const pv::util::Timestamp& end_time = trace_view->cursors()->second()->time();
const uint64_t start_sample =
std::max((double)0, start_time.convert_to<double>() * samplerate);
options = dlg.options();
}
+ session_.set_name(QFileInfo(file_name).fileName());
+
StoreProgress *dlg = new StoreProgress(file_name, format, options,
sample_range, session_, this);
dlg->run();
}
select_device(device);
+}
+void MainBar::on_device_changed()
+{
+ update_device_list();
update_device_config_widgets();
}
commit_sample_rate();
}
+void MainBar::on_actionNewSession_triggered()
+{
+ new_session();
+}
+
+void MainBar::on_actionNewView_triggered()
+{
+ new_view(&session_);
+}
+
void MainBar::on_actionOpen_triggered()
{
QSettings settings;
void MainBar::on_actionViewZoomIn_triggered()
{
- session_.main_view()->zoom(1);
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ trace_view->zoom(1);
}
void MainBar::on_actionViewZoomOut_triggered()
{
- session_.main_view()->zoom(-1);
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ trace_view->zoom(-1);
}
void MainBar::on_actionViewZoomFit_triggered()
{
- session_.main_view()->zoom_fit(action_view_zoom_fit_->isChecked());
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ trace_view->zoom_fit(action_view_zoom_fit_->isChecked());
}
void MainBar::on_actionViewZoomOneToOne_triggered()
{
- session_.main_view()->zoom_one_to_one();
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ trace_view->zoom_one_to_one();
}
void MainBar::on_actionViewShowCursors_triggered()
{
- const bool show = !session_.main_view()->cursors_shown();
+ views::TraceView::View *trace_view =
+ qobject_cast<views::TraceView::View*>(session_.main_view().get());
+
+ const bool show = !trace_view->cursors_shown();
if (show)
- session_.main_view()->centre_cursors();
+ trace_view->centre_cursors();
- session_.main_view()->show_cursors(show);
+ trace_view->show_cursors(show);
+}
+
+void MainBar::on_always_zoom_to_fit_changed(bool state)
+{
+ action_view_zoom_fit_->setChecked(state);
}
bool MainBar::eventFilter(QObject *watched, QEvent *event)