From f85170e93f1dc4697439323b773a7b0cdf86cc54 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Tue, 23 Nov 2021 17:24:15 +0800 Subject: [PATCH] update the app data directory get mode,fix switch language bug at macos --- DSView/main.cpp | 26 ++++++-------------- DSView/pv/appcontrol.cpp | 22 ++++++----------- DSView/pv/config/appconfig.cpp | 31 ++++++++++++++++++++++-- DSView/pv/config/appconfig.h | 6 +++++ DSView/pv/devicemanager.cpp | 3 ++- DSView/pv/dialogs/about.cpp | 7 +----- DSView/pv/interface/uicallback.h | 5 ++++ DSView/pv/mainframe.cpp | 13 ++++++++-- DSView/pv/mainwindow.cpp | 28 ++++++--------------- DSView/pv/mainwindow.h | 13 ++++++---- DSView/pv/prop/binding/deviceoptions.cpp | 24 +++++++++--------- DSView/pv/prop/binding/probeoptions.cpp | 11 ++++----- DSView/pv/toolbars/filebar.cpp | 11 +++------ DSView/pv/toolbars/logobar.cpp | 29 +++++++++++----------- DSView/pv/toolbars/logobar.h | 13 ++++++---- DSView/pv/ui/dscombobox.h | 3 ++- DSView/pv/view/devmode.cpp | 6 ++--- 17 files changed, 130 insertions(+), 121 deletions(-) diff --git a/DSView/main.cpp b/DSView/main.cpp index 210f9241..978f37b2 100755 --- a/DSView/main.cpp +++ b/DSView/main.cpp @@ -38,8 +38,6 @@ #include "config.h" #include "pv/appcontrol.h" -char DS_RES_PATH[256]; - void usage() { fprintf(stdout, @@ -53,6 +51,8 @@ void usage() "\n", DS_BIN_NAME, DS_DESCRIPTION); } +char DS_RES_PATH[256] = {0}; + int main(int argc, char *argv[]) { int ret = 0; @@ -142,24 +142,12 @@ int main(int argc, char *argv[]) if (argcFinal - optind > 1) { fprintf(stderr, "Only one file can be openened.\n"); return 1; - } else if (argcFinal - optind == 1) + } else if (argcFinal - optind == 1){ open_file = argvFinal[argcFinal - 1]; - - QDir dir(QCoreApplication::applicationDirPath()); - -#ifdef Q_OS_LINUX - if (dir.cd("..") && - dir.cd("share") && - dir.cd("DSView") && - dir.cd("res")) { - // the path command like: cd ../share/DSView/res - QString res_dir = dir.absolutePath() + "/"; - strcpy(DS_RES_PATH, res_dir.toUtf8().data()); - } else { - qDebug() << "DSView run ERROR: config files don't exist."; - return 1; - } -#endif + } + + QString path = GetAppDataDir(); + strcpy(DS_RES_PATH, path.toUtf8().data()); //#ifdef Q_OS_DARWIN //#endif diff --git a/DSView/pv/appcontrol.cpp b/DSView/pv/appcontrol.cpp index fb477aea..34fb8f99 100644 --- a/DSView/pv/appcontrol.cpp +++ b/DSView/pv/appcontrol.cpp @@ -31,6 +31,7 @@ #include "devicemanager.h" #include "sigsession.h" #include "dsvdef.h" +#include "config/appconfig.h" AppControl::AppControl() { @@ -71,23 +72,14 @@ bool AppControl::Init() { m_error = "DSView run ERROR: libsigrok init failed."; return false; - } - - // const char *decoderScriptDir = "/home/lala/tmpdir/any"; - //const char * decoderScriptDir = NULL; - - char decoderScriptDir[256] = {0}; - QDir dir(QCoreApplication::applicationDirPath()); -#ifdef Q_OS_LINUX - dir.cd("../share/DSView/decoders"); -#else - dir.cd("decoders"); -#endif - - strcpy(decoderScriptDir, dir.absolutePath().toUtf8().data()); + } + + QString dir = GetAppDataDir() + "/decoders"; + char path[256] = {0}; + strcpy(path, dir.toUtf8().data()); // Initialise libsigrokdecode - if (srd_init(decoderScriptDir) != SRD_OK) + if (srd_init(path) != SRD_OK) { m_error = "ERROR: libsigrokdecode init failed."; return false; diff --git a/DSView/pv/config/appconfig.cpp b/DSView/pv/config/appconfig.cpp index 42bc78d3..50aeb5cb 100644 --- a/DSView/pv/config/appconfig.cpp +++ b/DSView/pv/config/appconfig.cpp @@ -24,6 +24,9 @@ #include #include #include +#include +#include +#include #define MAX_PROTOCOL_FORMAT_LIST 15 @@ -126,10 +129,14 @@ void _loadFrame(FrameOptions &o, QSettings &st){ o.windowState = st.value("windowState", QByteArray()).toByteArray(); st.endGroup(); - if (o.language == -1){ + if (o.language == -1 || (o.language != LAN_CN && o.language != LAN_EN)){ //get local language QLocale locale; - o.language = locale.language(); + + if (QLocale::languageToString(locale.language()) == "Chinese") + o.language = LAN_CN; + else + o.language = LAN_EN; } } @@ -282,3 +289,23 @@ QString GetIconPath() } return ":/icons/" + style; } + +QString GetAppDataDir() +{ +//applicationDirPath not end with '/' +#ifdef Q_OS_LINUX + QDir dir(QCoreApplication::applicationDirPath()); + if (dir.cd("..") && dir.cd("share") &&dir.cd("DSView")) + { + return dir.absolutePath(); + } + qDebug() << "dir is not exists:" << QCoreApplication::applicationDirPath() + "/../share/DSView"; + assert(false); +#else + return QCoreApplication::applicationDirPath(); +#endif +} + +QString GetResourceDir(){ + return GetAppDataDir() + "/res"; +} diff --git a/DSView/pv/config/appconfig.h b/DSView/pv/config/appconfig.h index f01678ad..f9cdb6a8 100644 --- a/DSView/pv/config/appconfig.h +++ b/DSView/pv/config/appconfig.h @@ -27,6 +27,8 @@ #include #include +#define LAN_CN 25 +#define LAN_EN 31 //--------------------api--- @@ -34,6 +36,10 @@ QString GetDirectoryName(QString path); QString GetIconPath(); +QString GetAppDataDir(); + +QString GetResourceDir(); + //------------------class class StringPair diff --git a/DSView/pv/devicemanager.cpp b/DSView/pv/devicemanager.cpp index 51a4a128..448272ef 100755 --- a/DSView/pv/devicemanager.cpp +++ b/DSView/pv/devicemanager.cpp @@ -33,6 +33,7 @@ #include #include #include +#include "config/appconfig.h" using std::list; using std::map; @@ -116,7 +117,7 @@ void DeviceManager::driver_scan( // Check If DSL hardware driver if (strncmp(driver->name, "virtual", 7)) { - QDir dir(DS_RES_PATH); + QDir dir(GetResourceDir()); if (!dir.exists()) return; } diff --git a/DSView/pv/dialogs/about.cpp b/DSView/pv/dialogs/about.cpp index 3392d2a0..920dfeaa 100755 --- a/DSView/pv/dialogs/about.cpp +++ b/DSView/pv/dialogs/about.cpp @@ -76,13 +76,8 @@ About::About(QWidget *parent) : .arg("http://sigrok.org/"); QString changlogs = tr("Changelogs
"); - #ifndef Q_OS_LINUX - QDir dir(QCoreApplication::applicationDirPath()); - #else - QDir dir(DS_RES_PATH); - dir.cdUp(); - #endif + QDir dir(GetAppDataDir()); AppConfig &app = AppConfig::Instance(); int lan = app._frameOptions.language; diff --git a/DSView/pv/interface/uicallback.h b/DSView/pv/interface/uicallback.h index b7ae0054..58c2394c 100644 --- a/DSView/pv/interface/uicallback.h +++ b/DSView/pv/interface/uicallback.h @@ -27,3 +27,8 @@ class IDlgCallback public: virtual void OnDlgResult(bool bYes)=0; }; + +class IMainForm{ +public: + virtual void switchLanguage(int language)=0; +}; diff --git a/DSView/pv/mainframe.cpp b/DSView/pv/mainframe.cpp index a48232f6..cd9b1e71 100644 --- a/DSView/pv/mainframe.cpp +++ b/DSView/pv/mainframe.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include "dsvdef.h" #include "config/appconfig.h" @@ -449,12 +450,18 @@ void MainFrame::show_doc() dialogs::DSDialog dlg(this, true); dlg.setTitle(tr("Document")); + QString path = GetAppDataDir() + "/showDoc" + QString::number(lan)+ ".png"; + if (!QFile::exists(path)){ + path = ":/icons/showDoc"+QString::number(lan)+".png"; + } + QLabel tipsLabel; - tipsLabel.setPixmap(QPixmap(":/icons/showDoc"+QString::number(lan)+".png")); + tipsLabel.setPixmap(path); + QMessageBox msg; msg.setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint | Qt::WindowSystemMenuHint); msg.setContentsMargins(0, 0, 0, 0); - connect(&msg, SIGNAL(buttonClicked(QAbstractButton*)), &dlg, SLOT(accept())); + QPushButton *noMoreButton = msg.addButton(tr("Not Show Again"), QMessageBox::ActionRole); msg.addButton(tr("Ignore"), QMessageBox::ActionRole); QPushButton *openButton = msg.addButton(tr("Open"), QMessageBox::ActionRole); @@ -465,6 +472,8 @@ void MainFrame::show_doc() layout.setContentsMargins(0, 0, 0, 0); dlg.layout()->addLayout(&layout); + connect(&msg, SIGNAL(buttonClicked(QAbstractButton*)), &dlg, SLOT(accept())); + dlg.exec(); if (msg.clickedButton() == openButton) { diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 9f171525..44d528b6 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -286,7 +286,6 @@ void MainWindow::setup_ui() connect(_file_bar, SIGNAL(sig_store_session(QString)), this, SLOT(on_store_session(QString))); //logobar - connect(_logo_bar, SIGNAL(sig_setLanguage(int)), this, SLOT(on_setLanguage(int))); connect(_logo_bar, SIGNAL(sig_open_doc()), this, SLOT(on_open_doc())); @@ -302,6 +301,8 @@ void MainWindow::setup_ui() connect(_sampling_bar, SIGNAL(sig_show_calibration()), _view, SLOT(show_calibration())); connect(_dso_trigger_widget, SIGNAL(set_trig_pos(int)), _view, SLOT(set_trig_pos(int))); + + _logo_bar->set_mainform_callback(this); } @@ -397,12 +398,8 @@ void MainWindow::update_device_list() } else { _file_bar->set_settings_en(false); _logo_bar->dsl_connected(false); - #ifdef Q_OS_LINUX - QDir dir(DS_RES_PATH); - #else - QDir dir(QCoreApplication::applicationDirPath()); - assert(dir.cd("res")); - #endif + + QDir dir(GetResourceDir()); if (dir.exists()) { QString str = dir.absolutePath() + "/"; QString ses_name = str + @@ -1395,11 +1392,7 @@ bool MainWindow::eventFilter(QObject *object, QEvent *event) } return false; } - - void MainWindow::on_setLanguage(int language) - { - switchLanguage(language); - } + void MainWindow::switchLanguage(int language) { @@ -1414,7 +1407,7 @@ void MainWindow::switchLanguage(int language) app.SaveFrame(); } - if (language != QLocale::English) + if (language == LAN_CN) { _qtTrans.load(":/qt_" + QString::number(language)); qApp->installTranslator(&_qtTrans); @@ -1464,13 +1457,8 @@ void MainWindow::on_open_doc(){ } void MainWindow::openDoc() -{ - #ifndef Q_OS_LINUX - QDir dir(QCoreApplication::applicationDirPath()); - #else - QDir dir(DS_RES_PATH); - dir.cdUp(); - #endif +{ + QDir dir(GetAppDataDir()); AppConfig &app = AppConfig::Instance(); int lan = app._frameOptions.language; QDesktopServices::openUrl( diff --git a/DSView/pv/mainwindow.h b/DSView/pv/mainwindow.h index 446844b7..8cbf35a9 100755 --- a/DSView/pv/mainwindow.h +++ b/DSView/pv/mainwindow.h @@ -30,6 +30,7 @@ #include "dialogs/dsmessagebox.h" #include "interface/icallbacks.h" #include "eventobject.h" +#include "interface/uicallback.h" class QAction; class QMenuBar; @@ -72,7 +73,7 @@ using namespace pv::device; //The mainwindow,referenced by MainFrame //TODO: create graph view,toolbar,and show device list -class MainWindow : public QMainWindow, public ISessionCallback +class MainWindow : public QMainWindow, public ISessionCallback, public IMainForm { Q_OBJECT @@ -83,8 +84,7 @@ public: explicit MainWindow(QWidget *parent = 0); void openDoc(); - void switchLanguage(int language); - + private: void closeEvent(QCloseEvent *event); @@ -119,8 +119,7 @@ private slots: bool on_store_session(QString name); void device_detach_post(); void device_changed(bool close); - void on_device_selected(); - void on_setLanguage(int language); + void on_device_selected(); void on_capture_state_changed(int state); void on_data_updated(); @@ -139,6 +138,10 @@ private slots: signals: void prgRate(int progress); +//IMainForm +public: + void switchLanguage(int language); + //ISessionCallback public: void session_save(); diff --git a/DSView/pv/prop/binding/deviceoptions.cpp b/DSView/pv/prop/binding/deviceoptions.cpp index a0e051c2..0b25ba33 100755 --- a/DSView/pv/prop/binding/deviceoptions.cpp +++ b/DSView/pv/prop/binding/deviceoptions.cpp @@ -20,20 +20,18 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#include - -#include -#include -#include - -#include - #include "deviceoptions.h" -#include -#include -#include -#include +#include +#include +#include +#include + +#include "../bool.h" +#include "../double.h" +#include "../enum.h" +#include "../int.h" +#include "../config/appconfig.h" using namespace boost; using namespace std; @@ -73,7 +71,7 @@ DeviceOptions::DeviceOptions(struct sr_dev_inst *sdi) : if (sr_config_get(_sdi->driver, _sdi, NULL, NULL, SR_CONF_LANGUAGE, &gvar_tmp) == SR_OK) { if (gvar_tmp != NULL) { int language = g_variant_get_int16(gvar_tmp); - if (language == QLocale::Chinese) + if (language == LAN_CN) label_char = info->label_cn; g_variant_unref(gvar_tmp); } diff --git a/DSView/pv/prop/binding/probeoptions.cpp b/DSView/pv/prop/binding/probeoptions.cpp index 87647d9c..ec876265 100755 --- a/DSView/pv/prop/binding/probeoptions.cpp +++ b/DSView/pv/prop/binding/probeoptions.cpp @@ -19,21 +19,20 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "probeoptions.h" + #include #include #include -#include - #include - -#include "probeoptions.h" - #include #include #include #include +#include "../../config/appconfig.h" + using namespace boost; using namespace std; @@ -74,7 +73,7 @@ ProbeOptions::ProbeOptions(struct sr_dev_inst *sdi, if (sr_config_get(_sdi->driver, _sdi, NULL, NULL, SR_CONF_LANGUAGE, &gvar_tmp) == SR_OK) { if (gvar_tmp != NULL) { int language = g_variant_get_int16(gvar_tmp); - if (language == QLocale::Chinese) + if (language == LAN_CN) label_char = info->label_cn; g_variant_unref(gvar_tmp); } diff --git a/DSView/pv/toolbars/filebar.cpp b/DSView/pv/toolbars/filebar.cpp index fb708f96..81996711 100755 --- a/DSView/pv/toolbars/filebar.cpp +++ b/DSView/pv/toolbars/filebar.cpp @@ -191,13 +191,8 @@ void FileBar::on_actionLoad_triggered() } void FileBar::on_actionDefault_triggered() -{ -#ifdef Q_OS_LINUX - QDir dir(DS_RES_PATH); -#else - QDir dir(QCoreApplication::applicationDirPath()); - assert(dir.cd("res")); -#endif +{ + QDir dir(GetResourceDir()); if (!dir.exists()) { MsgBox::Show(NULL, "Cannot find default session file for this device!", this); return; @@ -205,7 +200,7 @@ void FileBar::on_actionDefault_triggered() QString driver_name = _session->get_device()->name(); QString mode_name = QString::number(_session->get_device()->dev_inst()->mode); - int language = QLocale::English; + int language = LAN_EN; GVariant *gvar_tmp = _session->get_device()->get_config(NULL, NULL, SR_CONF_LANGUAGE); if (gvar_tmp != NULL) { language = g_variant_get_int16(gvar_tmp); diff --git a/DSView/pv/toolbars/logobar.cpp b/DSView/pv/toolbars/logobar.cpp index 01da8850..c08d2bc1 100755 --- a/DSView/pv/toolbars/logobar.cpp +++ b/DSView/pv/toolbars/logobar.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include "logobar.h" #include "../dialogs/about.h" @@ -43,6 +44,8 @@ LogoBar::LogoBar(SigSession *session, QWidget *parent) : _session(session), _logo_button(this) { + _mainForm = NULL; + setMovable(false); setContentsMargins(0,0,0,0); @@ -118,7 +121,7 @@ void LogoBar::retranslateUi() _issue->setText(tr("&Bug Report")); AppConfig &app = AppConfig::Instance(); - if (app._frameOptions.language == QLocale::Chinese) + if (app._frameOptions.language == LAN_CN) _language->setIcon(QIcon(":/icons/Chinese.svg")); else _language->setIcon(QIcon(":/icons/English.svg")); @@ -170,14 +173,17 @@ void LogoBar::on_actionEn_triggered() { _language->setIcon(QIcon::fromTheme("file", QIcon(":/icons/English.svg"))); - sig_setLanguage(QLocale::English); + + assert(_mainForm); + _mainForm->switchLanguage(LAN_EN); } void LogoBar::on_actionCn_triggered() { _language->setIcon(QIcon::fromTheme("file", QIcon(":/icons/Chinese.svg"))); - sig_setLanguage(QLocale::Chinese); + assert(_mainForm); + _mainForm->switchLanguage(LAN_CN); } void LogoBar::on_actionAbout_triggered() @@ -187,22 +193,15 @@ void LogoBar::on_actionAbout_triggered() } void LogoBar::on_actionManual_triggered() -{ - #ifndef Q_OS_LINUX - QDir dir(QCoreApplication::applicationDirPath()); - #else - QDir dir(DS_RES_PATH); - dir.cdUp(); - #endif - QDesktopServices::openUrl( - QUrl("file:///"+dir.absolutePath() + "/ug.pdf")); +{ + QDir dir(GetAppDataDir()); + QDesktopServices::openUrl( QUrl("file:///"+dir.absolutePath() + "/ug.pdf")); } void LogoBar::on_actionIssue_triggered() { - QDir dir(QCoreApplication::applicationDirPath()); - QDesktopServices::openUrl( - QUrl(QLatin1String("https://github.com/DreamSourceLab/DSView/issues"))); + QDir dir(GetAppDataDir()); + QDesktopServices::openUrl(QUrl(QLatin1String("https://github.com/DreamSourceLab/DSView/issues"))); } void LogoBar::enable_toggle(bool enable) diff --git a/DSView/pv/toolbars/logobar.h b/DSView/pv/toolbars/logobar.h index 19cf5d3c..a3f8982b 100755 --- a/DSView/pv/toolbars/logobar.h +++ b/DSView/pv/toolbars/logobar.h @@ -27,10 +27,11 @@ #include #include #include +#include #include "../sigsession.h" +#include "../interface/uicallback.h" -#include namespace pv { namespace toolbars { @@ -49,6 +50,10 @@ public: //show the hardware device conneted status with logo picture void dsl_connected(bool conn); + inline void set_mainform_callback(IMainForm *callback){ + _mainForm = callback; + } + private: void changeEvent(QEvent *event); void retranslateUi(); @@ -59,10 +64,7 @@ private: void show_session_error( const QString text, const QString info_text); -signals: - //post event message to set language, MainWindow class receive it - void sig_setLanguage(int language); - +signals: //post event message to open user help document, MainWindow class receive it void sig_open_doc(); @@ -89,6 +91,7 @@ private: QAction *_about; QAction *_manual; QAction *_issue; + IMainForm *_mainForm; }; } // namespace toolbars diff --git a/DSView/pv/ui/dscombobox.h b/DSView/pv/ui/dscombobox.h index c8d1230e..00820d50 100644 --- a/DSView/pv/ui/dscombobox.h +++ b/DSView/pv/ui/dscombobox.h @@ -21,7 +21,6 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ - #ifndef DSCOMBOBOX_H #define DSCOMBOBOX_H @@ -43,4 +42,6 @@ private: int _contentWidth; }; + + #endif // DSCOMBOBOX_H diff --git a/DSView/pv/view/devmode.cpp b/DSView/pv/view/devmode.cpp index a69f082d..cfc6c0db 100755 --- a/DSView/pv/view/devmode.cpp +++ b/DSView/pv/view/devmode.cpp @@ -113,7 +113,7 @@ void DevMode::set_device() QAction *action = new QAction(this); action->setIcon(QIcon(iconPath+"square-"+icon_name)); - if (lan == QLocale::Chinese) + if (lan == LAN_CN) action->setText(mode->name_cn); else action->setText(mode->name); @@ -124,7 +124,7 @@ void DevMode::set_device() if (dev_inst->dev_inst()->mode == _mode_list[action]->mode) { QString icon_fname = iconPath + icon_name; _mode_btn->setIcon(QIcon(icon_fname)); - if (lan== QLocale::Chinese) + if (lan== LAN_CN) _mode_btn->setText(mode->name_cn); else _mode_btn->setText(mode->name); @@ -180,7 +180,7 @@ void DevMode::on_mode_change() QString icon_fname = iconPath + "/" + QString::fromLocal8Bit((*i).second->icon); _mode_btn->setIcon(QIcon(icon_fname)); - if (lan == QLocale::Chinese) + if (lan == LAN_CN) _mode_btn->setText((*i).second->name_cn); else _mode_btn->setText((*i).second->name);