2
0
forked from Ivasoft/DSView

update app config manager

This commit is contained in:
dreamsourcelabTAI
2021-10-28 11:03:50 +08:00
parent 91dd746f2d
commit fed30a0e57
39 changed files with 692 additions and 474 deletions

View File

@@ -21,17 +21,16 @@
*/
#ifdef ENABLE_DECODE
#include <libsigrokdecode4DSL/libsigrokdecode.h>
#include "dock/protocoldock.h"
#endif
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <boost/shared_ptr.hpp>
#include <QAction>
#include <QApplication>
#include <QButtonGroup>
#include <QFileDialog>
#include <QMessageBox>
@@ -48,6 +47,7 @@
#include <QEvent>
#include <QtGlobal>
#include <QScreen>
#include <QApplication>
#include "mainwindow.h"
@@ -91,6 +91,7 @@
#include <list>
#include <libusb.h>
#include "../ui/msgbox.h"
#include "config/appconfig.h"
using boost::shared_ptr;
using boost::dynamic_pointer_cast;
@@ -174,7 +175,7 @@ void MainWindow::setup_ui()
addToolBar(_logo_bar);
// Setup the dockWidget
#ifdef ENABLE_DECODE
// protocol dock
_protocol_dock=new QDockWidget(tr("Protocol"),this);
_protocol_dock->setObjectName("protocol_dock");
@@ -186,7 +187,7 @@ void MainWindow::setup_ui()
_protocol_dock->setWidget(_protocol_widget);
qDebug() << "Protocol decoder enabled!\n";
#endif
// measure dock
_measure_dock=new QDockWidget(tr("Measurement"),this);
_measure_dock->setObjectName("measure_dock");
@@ -206,9 +207,9 @@ void MainWindow::setup_ui()
_search_widget = new dock::SearchDock(_search_dock, *_view, _session);
_search_dock->setWidget(_search_widget);
#ifdef ENABLE_DECODE
addDockWidget(Qt::RightDockWidgetArea,_protocol_dock);
#endif
addDockWidget(Qt::RightDockWidgetArea,_trigger_dock);
addDockWidget(Qt::RightDockWidgetArea,_dso_trigger_dock);
addDockWidget(Qt::RightDockWidgetArea, _measure_dock);
@@ -228,9 +229,9 @@ void MainWindow::setup_ui()
_logo_bar->installEventFilter(this);
_dso_trigger_dock->installEventFilter(this);
_trigger_dock->installEventFilter(this);
#ifdef ENABLE_DECODE
_protocol_dock->installEventFilter(this);
#endif
_measure_dock->installEventFilter(this);
_search_dock->installEventFilter(this);
@@ -239,13 +240,10 @@ void MainWindow::setup_ui()
QString(tr("Set Default Device failed")), _1));
// defaut language
QSettings settings(QApplication::organizationName(), QApplication::applicationName());
QLocale locale;
settings.beginGroup("MainFrame");
switchLanguage(settings.value("language", locale.language()).toInt());
switchTheme(settings.value("style", "dark").toString());
settings.endGroup();
AppConfig &app = AppConfig::Instance();
switchLanguage(app._frameOptions.language);
switchTheme(app._frameOptions.style);
// UI initial
_measure_widget->add_dist_measure();
@@ -288,9 +286,9 @@ void MainWindow::setup_ui()
connect(_logo_bar, SIGNAL(setLanguage(int)), this, SLOT(switchLanguage(int)));
connect(_logo_bar, SIGNAL(openDoc()), this, SLOT(openDoc()));
#ifdef ENABLE_DECODE
connect(_protocol_widget, SIGNAL(protocol_updated()), _view, SLOT(signals_changed()));
#endif
connect(_sampling_bar, SIGNAL(device_selected()), this, SLOT(update_device_list()));
connect(_sampling_bar, SIGNAL(device_updated()), this, SLOT(reload()));
@@ -329,21 +327,23 @@ void MainWindow::update_device_list()
if (_msg)
_msg->close();
switchLanguage(_language);
AppConfig &app = AppConfig::Instance();
switchLanguage(app._frameOptions.language);
_session.stop_capture();
_view->reload();
_trigger_widget->device_updated();
#ifdef ENABLE_DECODE
_protocol_widget->del_all_protocol();
#endif
_trig_bar->reload();
shared_ptr<pv::device::DevInst> selected_device = _session.get_device();
boost::shared_ptr<pv::device::DevInst> selected_device = _session.get_device();
_device_manager.add_device(selected_device);
_session.init_signals();
_sampling_bar->set_device_list(_device_manager.devices(), selected_device);
shared_ptr<pv::device::File> file_dev;
boost::shared_ptr<pv::device::File> file_dev;
if((file_dev = dynamic_pointer_cast<pv::device::File>(selected_device))) {
// check version
if (selected_device->dev_inst()->mode == LOGIC) {
@@ -360,11 +360,11 @@ void MainWindow::update_device_list()
}
}
#ifdef ENABLE_DECODE
// load decoders
StoreSession ss(_session);
ss.load_decoders(_protocol_widget, file_dev->get_decoders());
#endif
// load session
load_session_json(file_dev->get_session(), true);
@@ -386,7 +386,7 @@ void MainWindow::update_device_list()
#endif
if (dir.exists()) {
QString str = dir.absolutePath() + "/";
QString lang_name = ".ses" + QString::number(_language);
QString lang_name = ".ses" + QString::number(app._frameOptions.language);
QString ses_name = str +
selected_device->name() +
QString::number(selected_device->dev_inst()->mode) +
@@ -712,11 +712,14 @@ void MainWindow::session_save()
#else
QString path = QStandardPaths::writableLocation(QStandardPaths::DataLocation);
#endif
AppConfig &app = AppConfig::Instance();
if(dir.mkpath(path)) {
dir.cd(path);
QString driver_name = _session.get_device()->name();
QString mode_name = QString::number(_session.get_device()->dev_inst()->mode);
QString lang_name = ".ses" + QString::number(_language);
QString lang_name = ".ses" + QString::number(app._frameOptions.language);
QString file_name = dir.absolutePath() + "/" +
driver_name + mode_name +
lang_name + ".dsc";
@@ -725,9 +728,9 @@ void MainWindow::session_save()
store_session(file_name);
}
}
QSettings settings(QApplication::organizationName(), QApplication::applicationName());
settings.setValue("windowState", saveState());
app._frameOptions.windowState = saveState();
app.SaveFrame();
}
void MainWindow::closeEvent(QCloseEvent *event)
@@ -739,9 +742,9 @@ void MainWindow::closeEvent(QCloseEvent *event)
void MainWindow::on_protocol(bool visible)
{
#ifdef ENABLE_DECODE
_protocol_dock->setVisible(visible);
#endif
}
void MainWindow::on_trigger(bool visible)
@@ -761,8 +764,8 @@ void MainWindow::on_trigger(bool visible)
void MainWindow::commit_trigger(bool instant)
{
int i = 0;
const QString TRIG_KEY("WarnofMultiTrig");
QSettings settings(QApplication::organizationName(), QApplication::applicationName());
AppConfig &app = AppConfig::Instance();
ds_trigger_init();
@@ -781,8 +784,7 @@ void MainWindow::commit_trigger(bool instant)
i++;
}
}
if (!settings.contains(TRIG_KEY) &&
i > 1) {
if (app._appOptions.warnofMultiTrig && i > 1) {
dialogs::DSMessageBox msg(this);
msg.mBox()->setText(tr("Trigger"));
msg.mBox()->setInformativeText(tr("Trigger setted on multiple channels! "
@@ -806,7 +808,10 @@ void MainWindow::commit_trigger(bool instant)
}
}
if (msg.mBox()->clickedButton() == noMoreButton)
settings.setValue(TRIG_KEY, false);
{
app._appOptions.warnofMultiTrig = false;
app.SaveApp();
}
}
}
}
@@ -824,9 +829,8 @@ void MainWindow::on_search(bool visible)
void MainWindow::on_screenShot()
{
const QString DIR_KEY("ScreenShotPath");
QSettings settings(QApplication::organizationName(), QApplication::applicationName());
QString default_name = settings.value(DIR_KEY).toString() + "/DSView" + QDateTime::currentDateTime().toString("-yyMMdd-hhmmss");
AppConfig &app = AppConfig::Instance();
QString default_name = app._userHistory.screenShotPath + "/DSView" + QDateTime::currentDateTime().toString("-yyMMdd-hhmmss");
QPixmap pixmap;
QScreen *screen = QGuiApplication::primaryScreen();
QDesktopWidget *desktop = QApplication::desktop();
@@ -838,10 +842,16 @@ void MainWindow::on_screenShot()
tr("Save As"), default_name,
tr("%1 Files (*.%2);;All Files (*)")
.arg(format.toUpper()).arg(format));
if (!fileName.isEmpty()) {
QDir CurrentDir;
settings.setValue(DIR_KEY, CurrentDir.filePath(fileName));
if (!fileName.isEmpty()) {
pixmap.save(fileName, format.toLatin1());
fileName = GetDirectoryName(fileName);
if (app._userHistory.screenShotPath != fileName){
app._userHistory.screenShotPath = fileName;
app.SaveHistory();
}
}
}
@@ -915,6 +925,8 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev)
return false;
}
AppConfig &app = AppConfig::Instance();
// check language
if (sessionObj.contains("Language")) {
switchLanguage(sessionObj["Language"].toInt());
@@ -922,7 +934,7 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev)
bool language_matched = _session.get_device()->set_config(NULL, NULL, SR_CONF_OPERATION_MODE,
g_variant_new_string(sessionObj["Operation Mode"].toString().toUtf8()));
if (!language_matched) {
if (_language != QLocale::Chinese)
if (app._frameOptions.language != QLocale::Chinese)
switchLanguage(QLocale::Chinese);
else
switchLanguage(QLocale::English);
@@ -930,11 +942,11 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev)
}
// clear decoders
#ifdef ENABLE_DECODE
if (sdi->mode == LOGIC) {
_protocol_widget->del_all_protocol();
}
#endif
// load device settings
GVariant *gvar_opts;
@@ -1075,13 +1087,13 @@ bool MainWindow::load_session_json(QJsonDocument json, bool file_dev)
}
on_trigger(false);
#ifdef ENABLE_DECODE
// load decoders
if (sessionObj.contains("decoder")) {
StoreSession ss(_session);
ss.load_decoders(_protocol_widget, sessionObj["decoder"].toArray());
}
#endif
// load measure
if (sessionObj.contains("measure")) {
@@ -1103,6 +1115,8 @@ bool MainWindow::store_session(QString name)
outStream.setCodec("UTF-8");
//outStream.setGenerateByteOrderMark(true); // UTF-8 without BOM
AppConfig &app = AppConfig::Instance();
GVariant *gvar_opts;
GVariant *gvar;
gsize num_opts;
@@ -1112,7 +1126,7 @@ bool MainWindow::store_session(QString name)
sessionVar["Version"]= QJsonValue::fromVariant(Session_Version);
sessionVar["Device"] = QJsonValue::fromVariant(sdi->driver->name);
sessionVar["DeviceMode"] = QJsonValue::fromVariant(sdi->mode);
sessionVar["Language"] = QJsonValue::fromVariant(_language);
sessionVar["Language"] = QJsonValue::fromVariant(app._frameOptions.language);
if ((sr_config_list(sdi->driver, sdi, NULL, SR_CONF_DEVICE_SESSIONS, &gvar_opts) != SR_OK))
return false; /* Driver supports no device instance sessions. */
@@ -1180,10 +1194,10 @@ bool MainWindow::store_session(QString name)
sessionVar["trigger"] = _trigger_widget->get_session();
}
#ifdef ENABLE_DECODE
StoreSession ss(_session);
sessionVar["decoder"] = ss.json_decoders();
#endif
if (_session.get_device()->dev_inst()->mode == DSO) {
sessionVar["measure"] = _view->get_viewstatus()->get_session();
@@ -1198,9 +1212,20 @@ bool MainWindow::store_session(QString name)
void MainWindow::restore_dock()
{
// default dockwidget size
QSettings settings(QApplication::organizationName(), QApplication::applicationName());
restoreState(settings.value("windowState").toByteArray());
// default dockwidget size
AppConfig &app = AppConfig::Instance();
QByteArray st = app._frameOptions.windowState;
if (!st.isEmpty()){
try
{
restoreState(st);
}
catch(...)
{
MsgBox::Show(NULL, "restore window status error!");
}
}
if (_session.get_device()->dev_inst()->mode != DSO) {
_dso_trigger_dock->setVisible(false);
_trig_bar->update_trig_btn(_trigger_dock->isVisible());
@@ -1209,9 +1234,9 @@ void MainWindow::restore_dock()
_trig_bar->update_trig_btn(_dso_trigger_dock->isVisible());
}
if (_session.get_device()->dev_inst()->mode != LOGIC) {
#ifdef ENABLE_DECODE
on_protocol(false);
#endif
}
_trig_bar->update_protocol_btn(_protocol_dock->isVisible());
_trig_bar->update_measure_btn(_measure_dock->isVisible());
@@ -1223,7 +1248,7 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
(void) object;
if ( event->type() == QEvent::KeyPress ) {
const vector< shared_ptr<view::Signal> > sigs(_session.get_signals());
const vector< boost::shared_ptr<view::Signal> > sigs(_session.get_signals());
QKeyEvent *ke = (QKeyEvent *) event;
switch(ke->key()) {
case Qt::Key_S:
@@ -1238,11 +1263,11 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
else
on_trigger(!_trigger_dock->isVisible());
break;
#ifdef ENABLE_DECODE
case Qt::Key_D:
on_protocol(!_protocol_dock->isVisible());
break;
#endif
case Qt::Key_M:
on_measure(!_measure_dock->isVisible());
break;
@@ -1268,8 +1293,8 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
_view->zoom(-1);
break;
case Qt::Key_0:
BOOST_FOREACH(const shared_ptr<view::Signal> s, sigs) {
shared_ptr<view::DsoSignal> dsoSig;
BOOST_FOREACH(const boost::shared_ptr<view::Signal> s, sigs) {
boost::shared_ptr<view::DsoSignal> dsoSig;
if ((dsoSig = dynamic_pointer_cast<view::DsoSignal>(s))) {
if (dsoSig->get_index() == 0)
dsoSig->set_vDialActive(!dsoSig->get_vDialActive());
@@ -1281,8 +1306,8 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
update();
break;
case Qt::Key_1:
BOOST_FOREACH(const shared_ptr<view::Signal> s, sigs) {
shared_ptr<view::DsoSignal> dsoSig;
BOOST_FOREACH(const boost::shared_ptr<view::Signal> s, sigs) {
boost::shared_ptr<view::DsoSignal> dsoSig;
if ((dsoSig = dynamic_pointer_cast<view::DsoSignal>(s))) {
if (dsoSig->get_index() == 1)
dsoSig->set_vDialActive(!dsoSig->get_vDialActive());
@@ -1294,8 +1319,8 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
update();
break;
case Qt::Key_Up:
BOOST_FOREACH(const shared_ptr<view::Signal> s, sigs) {
shared_ptr<view::DsoSignal> dsoSig;
BOOST_FOREACH(const boost::shared_ptr<view::Signal> s, sigs) {
boost::shared_ptr<view::DsoSignal> dsoSig;
if ((dsoSig = dynamic_pointer_cast<view::DsoSignal>(s))) {
if (dsoSig->get_vDialActive()) {
dsoSig->go_vDialNext(true);
@@ -1306,8 +1331,8 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
}
break;
case Qt::Key_Down:
BOOST_FOREACH(const shared_ptr<view::Signal> s, sigs) {
shared_ptr<view::DsoSignal> dsoSig;
BOOST_FOREACH(const boost::shared_ptr<view::Signal> s, sigs) {
boost::shared_ptr<view::DsoSignal> dsoSig;
if ((dsoSig = dynamic_pointer_cast<view::DsoSignal>(s))) {
if (dsoSig->get_vDialActive()) {
dsoSig->go_vDialPre(true);
@@ -1324,46 +1349,51 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event)
}
return false;
}
int MainWindow::language() const
{
return _language;
}
void MainWindow::switchLanguage(int language)
{
shared_ptr<pv::device::DevInst> dev = _session.get_device();
boost::shared_ptr<pv::device::DevInst> dev = _session.get_device();
dev->set_config(NULL, NULL, SR_CONF_LANGUAGE, g_variant_new_int16(language));
AppConfig &app = AppConfig::Instance();
if (_language != language) {
_language = language;
if (_language != QLocale::English) {
_qtTrans.load(":/qt_"+QString::number(_language));
qApp->installTranslator(&_qtTrans);
_myTrans.load(":/my_"+QString::number(_language));
qApp->installTranslator(&_myTrans);
retranslateUi();
} else {
qApp->removeTranslator(&_qtTrans);
qApp->removeTranslator(&_myTrans);
retranslateUi();
}
qApp->setProperty("Language", _language);
if (app._frameOptions.language != language)
{
app._frameOptions.language = language;
app.SaveFrame();
}
if (language != QLocale::English)
{
_qtTrans.load(":/qt_" + QString::number(language));
qApp->installTranslator(&_qtTrans);
_myTrans.load(":/my_" + QString::number(language));
qApp->installTranslator(&_myTrans);
retranslateUi();
}
else
{
qApp->removeTranslator(&_qtTrans);
qApp->removeTranslator(&_myTrans);
retranslateUi();
}
}
void MainWindow::switchTheme(QString style)
{
if (_style != style) {
_style = style;
qApp->setProperty("Style", _style);
QString qssRes = ":/"+_style+".qss";
QFile qss(qssRes);
qss.open(QFile::ReadOnly | QFile::Text);
qApp->setStyleSheet(qss.readAll());
qss.close();
_session.data_updated();
AppConfig &app = AppConfig::Instance();
if (app._frameOptions.style != style)
{
app._frameOptions.style = style;
app.SaveFrame();
}
QString qssRes = ":/" + style + ".qss";
QFile qss(qssRes);
qss.open(QFile::ReadOnly | QFile::Text);
qApp->setStyleSheet(qss.readAll());
qss.close();
_session.data_updated();
}
void MainWindow::openDoc()
@@ -1374,8 +1404,10 @@ void MainWindow::openDoc()
QDir dir(DS_RES_PATH);
dir.cdUp();
#endif
AppConfig &app = AppConfig::Instance();
int lan = app._frameOptions.language;
QDesktopServices::openUrl(
QUrl("file:///"+dir.absolutePath() + "/ug"+QString::number(_language)+".pdf"));
QUrl("file:///"+dir.absolutePath() + "/ug"+QString::number(lan)+".pdf"));
}
} // namespace pv