From 03534a036a3ccf3dc73bdaf4605a5ae36c0b0a55 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Wed, 3 Apr 2024 18:50:27 +0800 Subject: [PATCH] fix: unable to switch language on windows --- DSView/pv/appcontrol.cpp | 28 +------- DSView/pv/appcontrol.h | 8 +-- DSView/pv/dialogs/calibration.cpp | 30 ++++++--- DSView/pv/dialogs/calibration.h | 10 ++- DSView/pv/dialogs/dsdialog.h | 5 +- DSView/pv/dialogs/lissajousoptions.cpp | 35 +++++++--- DSView/pv/dialogs/lissajousoptions.h | 16 +++-- DSView/pv/dialogs/mathoptions.cpp | 36 +++++++---- DSView/pv/dialogs/mathoptions.h | 14 ++-- DSView/pv/dock/dsotriggerdock.cpp | 26 ++++---- DSView/pv/dock/dsotriggerdock.h | 11 ++-- DSView/pv/dock/measuredock.cpp | 26 ++++---- DSView/pv/dock/measuredock.h | 10 +-- DSView/pv/dock/protocoldock.cpp | 27 ++++---- DSView/pv/dock/protocoldock.h | 10 +-- DSView/pv/dock/searchdock.cpp | 28 ++++---- DSView/pv/dock/searchdock.h | 12 ++-- DSView/pv/dock/triggerdock.cpp | 30 ++++----- DSView/pv/dock/triggerdock.h | 12 ++-- DSView/pv/interface/icallbacks.h | 7 +- DSView/pv/mainwindow.cpp | 44 ++++--------- DSView/pv/toolbars/filebar.cpp | 24 ++++--- DSView/pv/toolbars/filebar.h | 12 ++-- DSView/pv/toolbars/logobar.cpp | 24 ++++--- DSView/pv/toolbars/logobar.h | 11 ++-- DSView/pv/toolbars/samplingbar.cpp | 24 ++++--- DSView/pv/toolbars/samplingbar.h | 18 +++--- DSView/pv/toolbars/titlebar.cpp | 23 ++++--- DSView/pv/toolbars/titlebar.h | 16 +++-- DSView/pv/toolbars/trigbar.cpp | 25 ++++---- DSView/pv/toolbars/trigbar.h | 11 ++-- DSView/pv/ui/fn.cpp | 36 ----------- DSView/pv/ui/fn.h | 2 - DSView/pv/ui/uimanager.cpp | 88 ++++++++++++++++++++++++++ DSView/pv/ui/uimanager.h | 61 ++++++++++++++++++ DSView/pv/view/devmode.cpp | 29 +++++---- DSView/pv/view/devmode.h | 14 ++-- DSView/pv/view/header.cpp | 23 +++++-- DSView/pv/view/header.h | 12 +++- DSView/pv/view/view.cpp | 23 ++++++- DSView/pv/view/view.h | 12 +++- DSView/pv/view/viewport.cpp | 20 ++++++ DSView/pv/view/viewport.h | 15 +++-- 43 files changed, 589 insertions(+), 359 deletions(-) create mode 100644 DSView/pv/ui/uimanager.cpp create mode 100644 DSView/pv/ui/uimanager.h diff --git a/DSView/pv/appcontrol.cpp b/DSView/pv/appcontrol.cpp index 0e1fec53..d5cb559b 100644 --- a/DSView/pv/appcontrol.cpp +++ b/DSView/pv/appcontrol.cpp @@ -152,30 +152,4 @@ bool AppControl::TopWindowIsMaximized() return _topWindow->isMaximized(); } return false; -} - -void AppControl::add_font_form(IFontForm *form) -{ - assert(form); - _font_forms.push_back(form); -} - -void AppControl::remove_font_form(IFontForm *form) -{ - assert(form); - - for (auto it = _font_forms.begin(); it != _font_forms.end(); it++) - { - if ( *(it) == form){ - _font_forms.erase(it); - break; - } - } -} - -void AppControl::update_font_forms() -{ - for (auto f : _font_forms){ - f->update_font(); - } -} +} \ No newline at end of file diff --git a/DSView/pv/appcontrol.h b/DSView/pv/appcontrol.h index a2f32893..399579b3 100644 --- a/DSView/pv/appcontrol.h +++ b/DSView/pv/appcontrol.h @@ -26,7 +26,6 @@ struct sr_context; class QWidget; -class IFontForm; namespace pv{ class SigSession; @@ -66,15 +65,10 @@ public: bool TopWindowIsMaximized(); - void add_font_form(IFontForm *form); - void remove_font_form(IFontForm *form); - void update_font_forms(); - public: std::string _open_file_name; private: pv::SigSession *_session; - QWidget *_topWindow; - std::vector _font_forms; + QWidget *_topWindow; }; diff --git a/DSView/pv/dialogs/calibration.cpp b/DSView/pv/dialogs/calibration.cpp index 8103be85..9fd97689 100644 --- a/DSView/pv/dialogs/calibration.cpp +++ b/DSView/pv/dialogs/calibration.cpp @@ -35,6 +35,8 @@ #include "../sigsession.h" #include "../ui/langresource.h" #include "../ui/msgbox.h" +#include "../ui/fn.h" +#include "../config/appconfig.h" using namespace std; @@ -96,22 +98,18 @@ Calibration::Calibration(QWidget *parent) : connect(_reset_btn, SIGNAL(clicked()), this, SLOT(on_reset())); connect(_exit_btn, SIGNAL(clicked()), this, SLOT(reject())); - retranslateUi(); + ADD_UI(this); } -Calibration::~Calibration(){ +Calibration::~Calibration() +{ DESTROY_QT_OBJECT(_save_btn); DESTROY_QT_OBJECT(_abort_btn); DESTROY_QT_OBJECT(_reset_btn); DESTROY_QT_OBJECT(_exit_btn); DESTROY_QT_OBJECT(_flayout); -} -void Calibration::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - DSDialog::changeEvent(event); + REMOVE_UI(this); } void Calibration::retranslateUi() @@ -349,5 +347,21 @@ void Calibration::on_reset() } } +void Calibration::UpdateLanguage() +{ + retranslateUi(); +} + +void Calibration::UpdateTheme() +{ +} + +void Calibration::UpdateFont() +{ + QFont font = this->font(); + font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); + ui::set_form_font(this, font); +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/calibration.h b/DSView/pv/dialogs/calibration.h index 4bbdbf46..0e1fb5a3 100644 --- a/DSView/pv/dialogs/calibration.h +++ b/DSView/pv/dialogs/calibration.h @@ -28,10 +28,10 @@ #include #include #include - #include #include "../toolbars/titlebar.h" #include "dsdialog.h" +#include "../ui/uimanager.h" class DeviceAgent; @@ -39,7 +39,7 @@ namespace pv { namespace dialogs { -class Calibration : public DSDialog +class Calibration : public DSDialog, public IUiWindow { Q_OBJECT @@ -59,9 +59,13 @@ protected: void reject(); private: - void changeEvent(QEvent *event); void retranslateUi(); + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + private slots: void set_value(int value); void on_save(); diff --git a/DSView/pv/dialogs/dsdialog.h b/DSView/pv/dialogs/dsdialog.h index a1e7b05d..83783203 100644 --- a/DSView/pv/dialogs/dsdialog.h +++ b/DSView/pv/dialogs/dsdialog.h @@ -40,7 +40,7 @@ namespace dialogs { class Shadow; //DSView any dialog base class -class DSDialog : public QDialog, IFontForm +class DSDialog : public QDialog { Q_OBJECT @@ -67,8 +67,7 @@ public: void SetTitleSpace(int h); - //IFontForm - void update_font() override; + void update_font(); void show(); diff --git a/DSView/pv/dialogs/lissajousoptions.cpp b/DSView/pv/dialogs/lissajousoptions.cpp index 05c27184..ebcd3288 100644 --- a/DSView/pv/dialogs/lissajousoptions.cpp +++ b/DSView/pv/dialogs/lissajousoptions.cpp @@ -20,10 +20,6 @@ */ #include "lissajousoptions.h" -#include "../sigsession.h" -#include "../view/view.h" -#include "../view/lissajoustrace.h" - #include #include #include @@ -31,9 +27,13 @@ #include #include +#include "../sigsession.h" +#include "../view/view.h" +#include "../view/lissajoustrace.h" #include "../ui/langresource.h" +#include "../ui/fn.h" +#include "../config/appconfig.h" - using namespace boost; using namespace std; using namespace pv::view; @@ -140,14 +140,12 @@ LissajousOptions::LissajousOptions(SigSession *session, QWidget *parent) : connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); - retranslateUi(); + ADD_UI(this); } -void LissajousOptions::changeEvent(QEvent *event) +LissajousOptions::~LissajousOptions() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - DSDialog::changeEvent(event); + REMOVE_UI(this); } void LissajousOptions::retranslateUi() @@ -200,5 +198,22 @@ void LissajousOptions::reject() QDialog::reject(); } +void LissajousOptions::UpdateLanguage() +{ + retranslateUi(); +} + +void LissajousOptions::UpdateTheme() +{ + +} + +void LissajousOptions::UpdateFont() +{ + QFont font = this->font(); + font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); + ui::set_form_font(this, font); +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/lissajousoptions.h b/DSView/pv/dialogs/lissajousoptions.h index 5561f4e5..50e10391 100644 --- a/DSView/pv/dialogs/lissajousoptions.h +++ b/DSView/pv/dialogs/lissajousoptions.h @@ -30,11 +30,11 @@ #include #include #include - - #include "../view/dsosignal.h" #include "../toolbars/titlebar.h" #include "dsdialog.h" +#include "../ui/uimanager.h" + namespace pv { @@ -46,7 +46,7 @@ class View; namespace dialogs { -class LissajousOptions : public DSDialog +class LissajousOptions : public DSDialog, public IUiWindow { Q_OBJECT @@ -56,10 +56,16 @@ private: public: LissajousOptions(SigSession *session, QWidget *parent); -private: - void changeEvent(QEvent *event); + ~LissajousOptions(); + +private: void retranslateUi(); + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + protected: void accept(); void reject(); diff --git a/DSView/pv/dialogs/mathoptions.cpp b/DSView/pv/dialogs/mathoptions.cpp index e8b29580..908b9408 100644 --- a/DSView/pv/dialogs/mathoptions.cpp +++ b/DSView/pv/dialogs/mathoptions.cpp @@ -20,19 +20,19 @@ */ #include "mathoptions.h" -#include "../sigsession.h" -#include "../view/view.h" -#include "../view/mathtrace.h" -#include "../data/mathstack.h" - #include #include #include #include #include +#include "../sigsession.h" +#include "../view/view.h" +#include "../view/mathtrace.h" +#include "../data/mathstack.h" #include "../ui/langresource.h" - +#include "../ui/fn.h" +#include "../config/appconfig.h" using namespace boost; using namespace std; @@ -155,14 +155,12 @@ MathOptions::MathOptions(SigSession *session, QWidget *parent) : connect(&_button_box, SIGNAL(rejected()), this, SLOT(reject())); connect(&_button_box, SIGNAL(accepted()), this, SLOT(accept())); - retranslateUi(); + ADD_UI(this); } -void MathOptions::changeEvent(QEvent *event) +MathOptions::~MathOptions() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - DSDialog::changeEvent(event); + REMOVE_UI(this); } void MathOptions::retranslateUi() @@ -228,5 +226,21 @@ void MathOptions::reject() QDialog::reject(); } +void MathOptions::UpdateLanguage() +{ + retranslateUi(); +} + +void MathOptions::UpdateTheme() +{ +} + +void MathOptions::UpdateFont() +{ + QFont font = this->font(); + font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); + ui::set_form_font(this, font); +} + } // namespace dialogs } // namespace pv diff --git a/DSView/pv/dialogs/mathoptions.h b/DSView/pv/dialogs/mathoptions.h index fd155158..b6ccd7b6 100644 --- a/DSView/pv/dialogs/mathoptions.h +++ b/DSView/pv/dialogs/mathoptions.h @@ -30,11 +30,10 @@ #include #include #include - - #include "../view/dsosignal.h" #include "../toolbars/titlebar.h" #include "dsdialog.h" +#include "../ui/uimanager.h" namespace pv { @@ -46,7 +45,7 @@ class View; namespace dialogs { -class MathOptions : public DSDialog +class MathOptions : public DSDialog, public IUiWindow { Q_OBJECT @@ -55,11 +54,16 @@ private: public: MathOptions(SigSession *session, QWidget *parent); + ~MathOptions(); -private: - void changeEvent(QEvent *event); +private: void retranslateUi(); + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + protected: void accept(); void reject(); diff --git a/DSView/pv/dock/dsotriggerdock.cpp b/DSView/pv/dock/dsotriggerdock.cpp index ed4fd478..86f36512 100644 --- a/DSView/pv/dock/dsotriggerdock.cpp +++ b/DSView/pv/dock/dsotriggerdock.cpp @@ -170,22 +170,12 @@ DsoTriggerDock::DsoTriggerDock(QWidget *parent, SigSession *session) : //_widget->setGeometry(0, 0, sizeHint().width(), sizeHint().height()); _widget->setObjectName("dsoTriggerWidget"); - retranslateUi(); - - update_font(); + ADD_UI(this); } DsoTriggerDock::~DsoTriggerDock() { -} - -void DsoTriggerDock::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QScrollArea::changeEvent(event); + REMOVE_UI(this); } void DsoTriggerDock::retranslateUi() @@ -487,7 +477,17 @@ void DsoTriggerDock::update_view() connect(_margin_slider, SIGNAL(valueChanged(int)), this, SLOT(margin_changed(int))); } -void DsoTriggerDock::update_font() +void DsoTriggerDock::UpdateLanguage() +{ + retranslateUi(); +} + +void DsoTriggerDock::UpdateTheme() +{ + reStyle(); +} + +void DsoTriggerDock::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/dock/dsotriggerdock.h b/DSView/pv/dock/dsotriggerdock.h index 4c5c3f27..15d558a6 100644 --- a/DSView/pv/dock/dsotriggerdock.h +++ b/DSView/pv/dock/dsotriggerdock.h @@ -29,11 +29,11 @@ #include #include #include - #include #include "../ui/dscombobox.h" #include "../interface/icallbacks.h" +#include "../ui/uimanager.h" namespace pv { @@ -41,7 +41,7 @@ class SigSession; namespace dock { -class DsoTriggerDock : public QScrollArea, public IFontForm +class DsoTriggerDock : public QScrollArea, public IUiWindow { Q_OBJECT @@ -55,13 +55,14 @@ public: private: void paintEvent(QPaintEvent *e); - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); bool check_trig_channel(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; signals: void set_trig_pos(int percent); diff --git a/DSView/pv/dock/measuredock.cpp b/DSView/pv/dock/measuredock.cpp index a46e294c..e4bac7b4 100644 --- a/DSView/pv/dock/measuredock.cpp +++ b/DSView/pv/dock/measuredock.cpp @@ -143,8 +143,6 @@ MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession *session) : _widget->setGeometry(0, 0, sizeHint().width(), 2000); _widget->setObjectName("measureWidget"); - retranslateUi(); - add_dist_measure(); connect(_dist_add_btn, SIGNAL(clicked()), this, SLOT(add_dist_measure())); @@ -152,20 +150,12 @@ MeasureDock::MeasureDock(QWidget *parent, View &view, SigSession *session) : connect(_fen_checkBox, SIGNAL(stateChanged(int)), &_view, SLOT(set_measure_en(int))); connect(&_view, SIGNAL(measure_updated()), this, SLOT(measure_updated())); - update_font(); + ADD_UI(this); } MeasureDock::~MeasureDock() { -} - -void MeasureDock::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QScrollArea::changeEvent(event); + REMOVE_UI(this); } void MeasureDock::retranslateUi() @@ -860,7 +850,17 @@ void MeasureDock::del_cursor() _view.update(); } -void MeasureDock::update_font() +void MeasureDock::UpdateLanguage() +{ + retranslateUi(); +} + +void MeasureDock::UpdateTheme() +{ + reStyle(); +} + +void MeasureDock::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/dock/measuredock.h b/DSView/pv/dock/measuredock.h index 570111b3..76d6c785 100644 --- a/DSView/pv/dock/measuredock.h +++ b/DSView/pv/dock/measuredock.h @@ -42,6 +42,7 @@ #include "../ui/dscombobox.h" #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" namespace pv { @@ -73,7 +74,7 @@ struct cursor_opt_info view::Cursor *cursor; }; -class MeasureDock : public QScrollArea, public IFontForm +class MeasureDock : public QScrollArea, public IUiWindow { Q_OBJECT @@ -87,12 +88,13 @@ public: void reload(); private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; void build_dist_pannel(); void build_edge_pannel(); diff --git a/DSView/pv/dock/protocoldock.cpp b/DSView/pv/dock/protocoldock.cpp index 636ad0e6..4db6538e 100644 --- a/DSView/pv/dock/protocoldock.cpp +++ b/DSView/pv/dock/protocoldock.cpp @@ -204,8 +204,6 @@ ProtocolDock::ProtocolDock(QWidget *parent, view::View &view, SigSession *sessio this->setWidget(split_widget); split_widget->setObjectName("protocolWidget"); - retranslateUi(); - connect(_dn_nav_button, SIGNAL(clicked()),this, SLOT(nav_table_view())); connect(_bot_save_button, SIGNAL(clicked()),this, SLOT(export_table_view())); connect(_bot_set_button, SIGNAL(clicked()),this, SLOT(set_model())); @@ -224,7 +222,7 @@ ProtocolDock::ProtocolDock(QWidget *parent, view::View &view, SigSession *sessio connect(_pro_search_button, SIGNAL(clicked()), this, SLOT(show_protocol_select())); - update_font(); + ADD_UI(this); } ProtocolDock::~ProtocolDock() @@ -237,6 +235,8 @@ ProtocolDock::~ProtocolDock() //clear protocol infos list RELEASE_ARRAY(_decoderInfoList); + + REMOVE_UI(this); } void ProtocolDock::retranslateUi() @@ -271,15 +271,6 @@ void ProtocolDock::reStyle() } } -void ProtocolDock::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QScrollArea::changeEvent(event); -} - int ProtocolDock::decoder_name_cmp(const void *a, const void *b) { return strcmp(((const srd_decoder*)a)->name, @@ -1060,7 +1051,17 @@ bool ProtocolDock::protocol_sort_callback(const DecoderInfoItem *o1, const Decod } } - void ProtocolDock::update_font() +void ProtocolDock::UpdateLanguage() +{ + retranslateUi(); +} + +void ProtocolDock::UpdateTheme() +{ + reStyle(); +} + +void ProtocolDock::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/dock/protocoldock.h b/DSView/pv/dock/protocoldock.h index 21628a55..83af269e 100644 --- a/DSView/pv/dock/protocoldock.h +++ b/DSView/pv/dock/protocoldock.h @@ -46,6 +46,7 @@ #include "searchcombobox.h" #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" struct DecoderInfoItem{ void *_data_handle; //srd_decoder* type @@ -73,7 +74,7 @@ public IProtocolItemLayerCallback, public IKeywordActive, public ISearchItemClick, public IDecoderPannel, -public IFontForm +public IUiWindow { Q_OBJECT @@ -91,7 +92,6 @@ public: void update_view_status(); private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); int get_protocol_index_by_id(QString id); @@ -116,8 +116,10 @@ private: //IDecoderPannel void update_deocder_item_name(void *trace_handel, const char *name) override; - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; signals: void protocol_updated(); diff --git a/DSView/pv/dock/searchdock.cpp b/DSView/pv/dock/searchdock.cpp index a5cd1c15..85471196 100644 --- a/DSView/pv/dock/searchdock.cpp +++ b/DSView/pv/dock/searchdock.cpp @@ -82,25 +82,15 @@ SearchDock::SearchDock(QWidget *parent, View &view, SigSession *session) : setLayout(layout); - retranslateUi(); - - update_font(); - connect(&_pre_button, SIGNAL(clicked()), this, SLOT(on_previous())); connect(&_nxt_button, SIGNAL(clicked()),this, SLOT(on_next())); + + ADD_UI(this); } SearchDock::~SearchDock() { -} - -void SearchDock::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QWidget::changeEvent(event); + REMOVE_UI(this); } void SearchDock::retranslateUi() @@ -253,7 +243,17 @@ void SearchDock::on_set() } } -void SearchDock::update_font() +void SearchDock::UpdateLanguage() +{ + retranslateUi(); +} + +void SearchDock::UpdateTheme() +{ + reStyle(); +} + +void SearchDock::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/dock/searchdock.h b/DSView/pv/dock/searchdock.h index 4eb5c300..a88548fd 100644 --- a/DSView/pv/dock/searchdock.h +++ b/DSView/pv/dock/searchdock.h @@ -44,6 +44,7 @@ #include "../widgets/fakelineedit.h" #include "../ui/dscombobox.h" #include "../interface/icallbacks.h" +#include "../ui/uimanager.h" namespace pv { @@ -59,7 +60,7 @@ namespace widgets { namespace dock { -class SearchDock : public QWidget, public IFontForm +class SearchDock : public QWidget, public IUiWindow { Q_OBJECT @@ -69,13 +70,14 @@ public: void paintEvent(QPaintEvent *); -private: - void changeEvent(QEvent *event); +private: void retranslateUi(); void reStyle(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; public slots: void on_previous(); diff --git a/DSView/pv/dock/triggerdock.cpp b/DSView/pv/dock/triggerdock.cpp index 0ca41329..96c20cf3 100644 --- a/DSView/pv/dock/triggerdock.cpp +++ b/DSView/pv/dock/triggerdock.cpp @@ -131,22 +131,12 @@ TriggerDock::TriggerDock(QWidget *parent, SigSession *session) : this->setWidget(_widget); _widget->setObjectName("triggerWidget"); - retranslateUi(); - - update_font(); + ADD_UI(this); } TriggerDock::~TriggerDock() { -} - -void TriggerDock::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QScrollArea::changeEvent(event); + REMOVE_UI(this); } void TriggerDock::retranslateUi() @@ -196,10 +186,6 @@ void TriggerDock::reStyle() { } -void TriggerDock::paintEvent(QPaintEvent *) -{ -} - void TriggerDock::simple_trigger() { _stages_label->setDisabled(true); @@ -1071,7 +1057,17 @@ void TriggerDock::on_serial_hex_changed() _is_serial_val_setting = false; } -void TriggerDock::update_font() +void TriggerDock::UpdateLanguage() +{ + retranslateUi(); +} + +void TriggerDock::UpdateTheme() +{ + reStyle(); +} + +void TriggerDock::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/dock/triggerdock.h b/DSView/pv/dock/triggerdock.h index edc157d3..ee756010 100644 --- a/DSView/pv/dock/triggerdock.h +++ b/DSView/pv/dock/triggerdock.h @@ -42,6 +42,7 @@ #include #include "../ui/dscombobox.h" #include "../interface/icallbacks.h" +#include "../ui/uimanager.h" namespace pv { @@ -49,7 +50,7 @@ class SigSession; namespace dock { -class TriggerDock : public QScrollArea, public IFontForm +class TriggerDock : public QScrollArea, public IUiWindow { Q_OBJECT @@ -60,8 +61,6 @@ public: TriggerDock(QWidget *parent, SigSession *session); ~TriggerDock(); - void paintEvent(QPaintEvent *); - void update_view(); QJsonObject get_session(); @@ -72,7 +71,6 @@ public: void try_commit_trigger(); private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); @@ -86,8 +84,10 @@ private: */ bool commit_trigger(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; private slots: void simple_trigger(); diff --git a/DSView/pv/interface/icallbacks.h b/DSView/pv/interface/icallbacks.h index 3a5a4b32..5bc7bfb3 100644 --- a/DSView/pv/interface/icallbacks.h +++ b/DSView/pv/interface/icallbacks.h @@ -109,13 +109,8 @@ public: virtual void update_deocder_item_name(void *trace_handel, const char *name)=0; }; -class IFontForm +enum ParentNativeEvent { -public: - virtual void update_font()=0; -}; - -enum ParentNativeEvent{ PARENT_EVENT_DISPLAY_CHANGED = 0, }; diff --git a/DSView/pv/mainwindow.cpp b/DSView/pv/mainwindow.cpp index 0a5b3f4e..b9c1a4ce 100644 --- a/DSView/pv/mainwindow.cpp +++ b/DSView/pv/mainwindow.cpp @@ -102,6 +102,7 @@ #include "mainframe.h" #include "dsvdef.h" #include +#include "ui/uimanager.h" namespace pv { @@ -120,7 +121,6 @@ namespace pv assert(_frame); _title_bar = title_bar; - AppControl::Instance()->add_font_form(title_bar); _session = AppControl::Instance()->GetSession(); _session->set_callback(this); @@ -193,11 +193,6 @@ namespace pv addToolBar(_file_bar); addToolBar(_logo_bar); - AppControl::Instance()->add_font_form(_sampling_bar); - AppControl::Instance()->add_font_form(_trig_bar); - AppControl::Instance()->add_font_form(_file_bar); - AppControl::Instance()->add_font_form(_logo_bar); - // Setup the dockWidget _protocol_dock = new QDockWidget(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_PROTOCOL_DOCK_TITLE), "Decode Protocol"), this); _protocol_dock->setObjectName("protocol_dock"); @@ -252,20 +247,8 @@ namespace pv switchLanguage(app.frameOptions.language); switchTheme(app.frameOptions.style); - retranslateUi(); - _sampling_bar->set_view(_view); - - // Add the font form - AppControl::Instance()->add_font_form(_protocol_widget); - AppControl::Instance()->add_font_form(_dso_trigger_widget); - AppControl::Instance()->add_font_form(_measure_widget); - AppControl::Instance()->add_font_form(_search_widget); - AppControl::Instance()->add_font_form(_trigger_widget); - AppControl::Instance()->add_font_form(_view->get_time_view()); - AppControl::Instance()->add_font_form(_view); - // event connect(&_event, SIGNAL(session_error()), this, SLOT(on_session_error())); connect(&_event, SIGNAL(signals_changed()), this, SLOT(on_signals_changed())); @@ -1395,22 +1378,20 @@ namespace pv if (language == LAN_CN) { - _qtTrans.load(":/qt_" + QString::number(language)); - qApp->installTranslator(&_qtTrans); - _myTrans.load(":/my_" + QString::number(language)); - qApp->installTranslator(&_myTrans); - retranslateUi(); + // _qtTrans.load(":/qt_" + QString::number(language)); + //qApp->installTranslator(&_qtTrans); + //_myTrans.load(":/my_" + QString::number(language)); + // qApp->installTranslator(&_myTrans); } else if (language == LAN_EN) { - qApp->removeTranslator(&_qtTrans); - qApp->removeTranslator(&_myTrans); - retranslateUi(); + // qApp->removeTranslator(&_qtTrans); + // qApp->removeTranslator(&_myTrans); } - // QEvent langEvent(QEvent::LanguageChange); - // QApplication::sendEvent(QApplication::instance(), &langEvent); - // QCoreApplication::sendPostedEvents(); + retranslateUi(); + + UiManager::Instance()->Update(UI_UPDATE_ACTION_LANG); } void MainWindow::switchTheme(QString style) @@ -1428,7 +1409,8 @@ namespace pv qss.open(QFile::ReadOnly | QFile::Text); qApp->setStyleSheet(qss.readAll()); qss.close(); - + + UiManager::Instance()->Update(UI_UPDATE_ACTION_THEME); data_updated(); } @@ -2112,7 +2094,7 @@ namespace pv break; case DSV_MSG_FONT_OPTIONS_CHANGED: - AppControl::Instance()->update_font_forms(); + UiManager::Instance()->Update(UI_UPDATE_ACTION_FONT); break; case DSV_MSG_DATA_POOL_CHANGED: _view->check_measure(); diff --git a/DSView/pv/toolbars/filebar.cpp b/DSView/pv/toolbars/filebar.cpp index 9dc4e0d6..f562431c 100644 --- a/DSView/pv/toolbars/filebar.cpp +++ b/DSView/pv/toolbars/filebar.cpp @@ -85,8 +85,6 @@ FileBar::FileBar(SigSession *session, QWidget *parent) : _file_button.setMenu(_menu); addWidget(&_file_button); - retranslateUi(); - connect(_action_load, SIGNAL(triggered()), this, SLOT(on_actionLoad_triggered())); connect(_action_store, SIGNAL(triggered()), this, SLOT(on_actionStore_triggered())); connect(_action_default, SIGNAL(triggered()), this, SLOT(on_actionDefault_triggered())); @@ -95,16 +93,12 @@ FileBar::FileBar(SigSession *session, QWidget *parent) : connect(_action_export, SIGNAL(triggered()), this, SIGNAL(sig_export())); connect(_action_capture, SIGNAL(triggered()), this, SLOT(on_actionCapture_triggered())); - update_font(); + ADD_UI(this); } -void FileBar::changeEvent(QEvent *event) +FileBar::~FileBar() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QToolBar::changeEvent(event); + REMOVE_UI(this); } void FileBar::retranslateUi() @@ -255,7 +249,17 @@ void FileBar::update_view_status() _menu_session->setEnabled(bEnable && is_hardware); } -void FileBar::update_font() +void FileBar::UpdateLanguage() +{ + retranslateUi(); +} + +void FileBar::UpdateTheme() +{ + reStyle(); +} + +void FileBar::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/toolbars/filebar.h b/DSView/pv/toolbars/filebar.h index 47be6461..950697c0 100644 --- a/DSView/pv/toolbars/filebar.h +++ b/DSView/pv/toolbars/filebar.h @@ -30,30 +30,34 @@ #include "../sigsession.h" #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" namespace pv { namespace toolbars { //toolbar button,referenced by MainWindow //TODO: load session file, sorte session, load log data file, sorte data, export data -class FileBar : public QToolBar, public IFontForm +class FileBar : public QToolBar, public IUiWindow { Q_OBJECT public: explicit FileBar(SigSession *session, QWidget *parent = 0); + ~FileBar(); + void update_view_status(); QString genDefaultSessionFile(); private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; signals: void sig_load_file(QString); diff --git a/DSView/pv/toolbars/logobar.cpp b/DSView/pv/toolbars/logobar.cpp index f6120e18..3e3f6062 100644 --- a/DSView/pv/toolbars/logobar.cpp +++ b/DSView/pv/toolbars/logobar.cpp @@ -114,8 +114,6 @@ LogoBar::LogoBar(SigSession *session, QWidget *parent) : margin->setMinimumWidth(20); addWidget(margin); - retranslateUi(); - connect(_action_en, SIGNAL(triggered()), this, SLOT(on_actionEn_triggered())); connect(_action_cn, SIGNAL(triggered()), this, SLOT(on_actionCn_triggered())); connect(_about, SIGNAL(triggered()), this, SLOT(on_actionAbout_triggered())); @@ -124,16 +122,12 @@ LogoBar::LogoBar(SigSession *session, QWidget *parent) : connect(_update, SIGNAL(triggered()), this, SLOT(on_action_update())); connect(_log, SIGNAL(triggered()), this, SLOT(on_action_setting_log())); - update_font(); + ADD_UI(this); } -void LogoBar::changeEvent(QEvent *event) +LogoBar::~LogoBar() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QToolBar::changeEvent(event); + REMOVE_UI(this); } void LogoBar::retranslateUi() @@ -348,7 +342,17 @@ void LogoBar::on_clear_log_file() } } -void LogoBar::update_font() +void LogoBar::UpdateLanguage() +{ + retranslateUi(); +} + +void LogoBar::UpdateTheme() +{ + reStyle(); +} + +void LogoBar::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/toolbars/logobar.h b/DSView/pv/toolbars/logobar.h index acadc266..19fea7fd 100644 --- a/DSView/pv/toolbars/logobar.h +++ b/DSView/pv/toolbars/logobar.h @@ -32,18 +32,20 @@ #include "../sigsession.h" #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" namespace pv { namespace toolbars { //The tool button for help,is a ui class,referenced by MainWindow //TODO: switch language,submit bug descript, -class LogoBar : public QToolBar, public IFontForm +class LogoBar : public QToolBar, public IUiWindow { Q_OBJECT public: explicit LogoBar(SigSession *session, QWidget *parent = 0); + ~LogoBar(); void enable_toggle(bool enable); @@ -55,12 +57,13 @@ public: } private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; signals: //post event message to open user help document, MainWindow class receive it diff --git a/DSView/pv/toolbars/samplingbar.cpp b/DSView/pv/toolbars/samplingbar.cpp index 576dcb06..062348fd 100644 --- a/DSView/pv/toolbars/samplingbar.cpp +++ b/DSView/pv/toolbars/samplingbar.cpp @@ -128,7 +128,6 @@ namespace pv _instant_action = addWidget(&_instant_button); update_view_status(); - update_font(); connect(&_device_selector, SIGNAL(currentIndexChanged(int)), this, SLOT(on_device_selected())); connect(&_configure_button, SIGNAL(clicked()), this, SLOT(on_configure())); @@ -139,15 +138,13 @@ namespace pv connect(_action_repeat, SIGNAL(triggered()), this, SLOT(on_collect_mode())); connect(_action_loop, SIGNAL(triggered()), this, SLOT(on_collect_mode())); connect(&_sample_rate, SIGNAL(currentIndexChanged(int)), this, SLOT(on_samplerate_sel(int))); + + ADD_UI(this); } - void SamplingBar::changeEvent(QEvent *event) + SamplingBar::~SamplingBar() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QToolBar::changeEvent(event); + REMOVE_UI(this); } void SamplingBar::retranslateUi() @@ -1244,7 +1241,6 @@ namespace pv _mode_button.setIcon(QIcon(iconPath + SINGLE_ACTION_ICON)); } - void SamplingBar::run_or_stop() { on_run_stop(); @@ -1255,7 +1251,17 @@ namespace pv on_instant_stop(); } - void SamplingBar::update_font() + void SamplingBar::UpdateLanguage() + { + retranslateUi(); + } + + void SamplingBar::UpdateTheme() + { + reStyle(); + } + + void SamplingBar::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/toolbars/samplingbar.h b/DSView/pv/toolbars/samplingbar.h index d16a95f5..bbb686ee 100644 --- a/DSView/pv/toolbars/samplingbar.h +++ b/DSView/pv/toolbars/samplingbar.h @@ -27,14 +27,14 @@ #include #include #include - +#include #include #include #include #include "../ui/dscombobox.h" #include "../interface/icallbacks.h" -#include #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" struct st_dev_inst; class QAction; @@ -59,7 +59,7 @@ namespace pv namespace toolbars { - class SamplingBar : public QToolBar, public IFontForm + class SamplingBar : public QToolBar, public IUiWindow { Q_OBJECT @@ -76,7 +76,8 @@ namespace pv public: - SamplingBar(SigSession *session, QWidget *parent); + SamplingBar(SigSession *session, QWidget *parent); + ~SamplingBar(); double hori_knob(int dir); double get_hori_res(); @@ -104,8 +105,7 @@ namespace pv signals: void sig_store_session_data(); - private: - void changeEvent(QEvent *event); + private: void retranslateUi(); void reStyle(); void set_sample_rate(uint64_t sample_rate); @@ -123,8 +123,10 @@ namespace pv bool action_run_stop(); bool action_instant_stop(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; private slots: void on_collect_mode(); diff --git a/DSView/pv/toolbars/titlebar.cpp b/DSView/pv/toolbars/titlebar.cpp index 9478c053..006d1db1 100644 --- a/DSView/pv/toolbars/titlebar.cpp +++ b/DSView/pv/toolbars/titlebar.cpp @@ -98,21 +98,16 @@ TitleBar::TitleBar(bool top, QWidget *parent, ITitleParent *titleParent, bool ha lay1->setSpacing(0); setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - update_font(); + + ADD_UI(this); } TitleBar::~TitleBar(){ DESTROY_QT_OBJECT(_minimizeButton); DESTROY_QT_OBJECT(_maximizeButton); DESTROY_QT_OBJECT(_closeButton); -} -void TitleBar::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::StyleChange) - reStyle(); - QWidget::changeEvent(event); + REMOVE_UI(this); } void TitleBar::reStyle() @@ -314,7 +309,17 @@ void TitleBar::mouseDoubleClickEvent(QMouseEvent *event) } } -void TitleBar::update_font() +void TitleBar::UpdateLanguage() +{ + +} + +void TitleBar::UpdateTheme() +{ + reStyle(); +} + +void TitleBar::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize+1); diff --git a/DSView/pv/toolbars/titlebar.h b/DSView/pv/toolbars/titlebar.h index b3f61b04..7af3ed5d 100644 --- a/DSView/pv/toolbars/titlebar.h +++ b/DSView/pv/toolbars/titlebar.h @@ -25,6 +25,7 @@ #include #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" class QHBoxLayout; @@ -44,7 +45,7 @@ public: namespace toolbars { -class TitleBar : public QWidget, public IFontForm +class TitleBar : public QWidget, public IUiWindow { Q_OBJECT @@ -55,17 +56,22 @@ public: void setTitle(QString title); QString title(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; inline void set_native(){ _is_native = true; } + inline void update_font(){ + UpdateFont(); + } + void EnableAbleDrag(bool bEnabled); -private: - void changeEvent(QEvent *event); +private: void reStyle(); bool ParentIsMaxsized(); diff --git a/DSView/pv/toolbars/trigbar.cpp b/DSView/pv/toolbars/trigbar.cpp index 02f7b500..d41eb238 100644 --- a/DSView/pv/toolbars/trigbar.cpp +++ b/DSView/pv/toolbars/trigbar.cpp @@ -108,8 +108,6 @@ TrigBar::TrigBar(SigSession *session, QWidget *parent) : _search_action = addWidget(&_search_button); _function_action = addWidget(&_function_button); _display_action = addWidget(&_setting_button); //must be created - - retranslateUi(); connect(&_trig_button, SIGNAL(clicked()),this, SLOT(trigger_clicked())); connect(&_protocol_button, SIGNAL(clicked()),this, SLOT(protocol_clicked())); @@ -123,17 +121,12 @@ TrigBar::TrigBar(SigSession *session, QWidget *parent) : connect(_light_style, SIGNAL(triggered()), this, SLOT(on_actionLight_triggered())); connect(_action_dispalyOptions, SIGNAL(triggered()), this, SLOT(on_display_setting())); - update_font(); + ADD_UI(this); } -//语言变化 -void TrigBar::changeEvent(QEvent *event) +TrigBar::~TrigBar() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - else if (event->type() == QEvent::StyleChange) - reStyle(); - QToolBar::changeEvent(event); + REMOVE_UI(this); } void TrigBar::retranslateUi() @@ -371,7 +364,17 @@ void TrigBar::update_checked_status() _search_button.setChecked(opt->searchDock); } -void TrigBar::update_font() +void TrigBar::UpdateLanguage() +{ + retranslateUi(); +} + +void TrigBar::UpdateTheme() +{ + reStyle(); +} + +void TrigBar::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/toolbars/trigbar.h b/DSView/pv/toolbars/trigbar.h index bffe83f3..95d18380 100644 --- a/DSView/pv/toolbars/trigbar.h +++ b/DSView/pv/toolbars/trigbar.h @@ -28,6 +28,7 @@ #include #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" class DockOptions; @@ -39,24 +40,26 @@ namespace toolbars { //boolbar, referenced by MainWindow //TODO:show the property panel about protocol\trigger -class TrigBar : public QToolBar, public IFontForm +class TrigBar : public QToolBar, public IUiWindow { Q_OBJECT public: explicit TrigBar(SigSession *session, QWidget *parent = 0); + ~TrigBar(); void reload(); void update_view_status(); private: - void changeEvent(QEvent *event); void retranslateUi(); void reStyle(); DockOptions* getDockOptions(); void update_checked_status(); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; signals: void sig_setTheme(QString style); diff --git a/DSView/pv/ui/fn.cpp b/DSView/pv/ui/fn.cpp index e2ab0d12..7b45e989 100644 --- a/DSView/pv/ui/fn.cpp +++ b/DSView/pv/ui/fn.cpp @@ -147,40 +147,4 @@ namespace ui } } - void adjust_form_size(QWidget *wid) - { - assert(wid); - - auto labels = wid->findChildren(); - for(auto o : labels) - { - QSize size = o->sizeHint(); - size.setWidth(size.width() + 5); - o->setFixedWidth(size.width()); - } - - int groupMaxWith = 0; - - auto groups = wid->findChildren(); - for(auto o : groups) - { - QSize size = o->sizeHint(); - int w = size.width() + 5; - if (w > groupMaxWith){ - groupMaxWith = w; - } - } - - auto groups2 = wid->findChildren(); - for(auto o : groups2) - { - o->setFixedWidth(groupMaxWith); - - QWidget *parent = dynamic_cast(o->parent()); - if (parent != NULL){ - parent->setFixedWidth(groupMaxWith + 10); - } - } - } - } // namespace ui \ No newline at end of file diff --git a/DSView/pv/ui/fn.h b/DSView/pv/ui/fn.h index dc936604..68458902 100644 --- a/DSView/pv/ui/fn.h +++ b/DSView/pv/ui/fn.h @@ -37,8 +37,6 @@ namespace ui void set_form_font(QWidget *wid, QFont font); - void adjust_form_size(QWidget *wid); - } // namespace ui #endif \ No newline at end of file diff --git a/DSView/pv/ui/uimanager.cpp b/DSView/pv/ui/uimanager.cpp new file mode 100644 index 00000000..3444b9d9 --- /dev/null +++ b/DSView/pv/ui/uimanager.cpp @@ -0,0 +1,88 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2024 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "uimanager.h" +#include + +UiManager::UiManager() +{ +} + +UiManager* UiManager::Instance() +{ + static UiManager *ins = nullptr; + + if (ins == nullptr){ + ins = new UiManager(); + } + + return ins; +} + +void UiManager::AddWindow(IUiWindow *w) +{ + assert(w); + + for (auto it = m_widgets.begin(); it != m_widgets.end(); ++it) + { + if ((*it) == w){ + return; + } + } + + m_widgets.push_back(w); + + //Init the ui. + w->UpdateLanguage(); + w->UpdateTheme(); + w->UpdateFont(); +} + +void UiManager::RemoveWindow(IUiWindow *w) +{ + assert(w); + + for (auto it = m_widgets.begin(); it != m_widgets.end(); ++it) + { + if ((*it) == w){ + m_widgets.erase(it); + break; + } + } +} + +void UiManager::Update(UiUpdateAction action) +{ + for (auto it = m_widgets.begin(); it != m_widgets.end(); ++it) + { + IUiWindow *w = (*it); + + if (action == UI_UPDATE_ACTION_LANG){ + w->UpdateLanguage(); + } + else if (action == UI_UPDATE_ACTION_THEME){ + w->UpdateTheme(); + } + else if (action == UI_UPDATE_ACTION_FONT){ + w->UpdateFont(); + } + } +} \ No newline at end of file diff --git a/DSView/pv/ui/uimanager.h b/DSView/pv/ui/uimanager.h new file mode 100644 index 00000000..8cd5ca09 --- /dev/null +++ b/DSView/pv/ui/uimanager.h @@ -0,0 +1,61 @@ +/* + * This file is part of the DSView project. + * DSView is based on PulseView. + * + * Copyright (C) 2024 DreamSourceLab + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef UI_MANAGER_H +#define UI_MANAGER_H + +#include + +class IUiWindow +{ +public: + virtual void UpdateLanguage()=0; + virtual void UpdateTheme()=0; + virtual void UpdateFont()=0; +}; + +enum UiUpdateAction +{ + UI_UPDATE_ACTION_LANG = 0, + UI_UPDATE_ACTION_THEME = 1, + UI_UPDATE_ACTION_FONT = 2, +}; + +class UiManager +{ +private: + UiManager(); + +public: + static UiManager* Instance(); + + void AddWindow(IUiWindow *w); + void RemoveWindow(IUiWindow *w); + void Update(UiUpdateAction action); + +private: + std::vector m_widgets; +}; + +#define ADD_UI(o) UiManager::Instance()->AddWindow(o); +#define REMOVE_UI(o) UiManager::Instance()->RemoveWindow(o); + +#endif \ No newline at end of file diff --git a/DSView/pv/view/devmode.cpp b/DSView/pv/view/devmode.cpp index cb9858dc..a366675f 100644 --- a/DSView/pv/view/devmode.cpp +++ b/DSView/pv/view/devmode.cpp @@ -90,19 +90,14 @@ DevMode::DevMode(QWidget *parent, SigSession *session) : layout->setStretch(1, 100); setLayout(layout); - update_font(); - connect(_close_button, SIGNAL(clicked()), this, SLOT(on_close())); + + ADD_UI(this); } - -void DevMode::changeEvent(QEvent *event) +DevMode::~DevMode() { - if (event->type() == QEvent::LanguageChange) - set_device(); - else if (event->type() == QEvent::StyleChange) - set_device(); - QWidget::changeEvent(event); + REMOVE_UI(this); } void DevMode::set_device() @@ -173,7 +168,7 @@ void DevMode::set_device() _bFile = true; } - update_font(); + UpdateFont(); update(); } @@ -232,7 +227,7 @@ void DevMode::on_mode_change() } } - update_font(); + UpdateFont(); } void DevMode::on_close() @@ -280,7 +275,17 @@ const struct dev_mode_name* DevMode::get_mode_name(int mode) assert(false); } -void DevMode::update_font() +void DevMode::UpdateLanguage() +{ + set_device(); +} + +void DevMode::UpdateTheme() +{ + set_device(); +} + +void DevMode::UpdateFont() { QFont font = this->font(); font.setPointSizeF(AppConfig::Instance().appOptions.fontSize); diff --git a/DSView/pv/view/devmode.h b/DSView/pv/view/devmode.h index 50658887..27b5355c 100644 --- a/DSView/pv/view/devmode.h +++ b/DSView/pv/view/devmode.h @@ -35,6 +35,7 @@ #include "../interface/icallbacks.h" #include "../ui/xtoolbutton.h" +#include "../ui/uimanager.h" struct dev_mode_name{ int _mode; @@ -50,7 +51,7 @@ class SigSession; namespace view { //devece work mode select list -class DevMode : public QWidget, public IFontForm +class DevMode : public QWidget, public IUiWindow { Q_OBJECT @@ -60,6 +61,8 @@ private: public: DevMode(QWidget *parent, SigSession *session); + ~DevMode(); + private: void paintEvent(QPaintEvent *event); @@ -67,12 +70,13 @@ private: void mousePressEvent(QMouseEvent * event); void mouseReleaseEvent(QMouseEvent *event); void mouseMoveEvent(QMouseEvent *event); - void leaveEvent(QEvent *event); - void changeEvent(QEvent *event); + void leaveEvent(QEvent *event); const dev_mode_name* get_mode_name(int mode); - //IFontForm - void update_font() override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; public slots: void set_device(); diff --git a/DSView/pv/view/header.cpp b/DSView/pv/view/header.cpp index d0fd9316..5e57bd5c 100644 --- a/DSView/pv/view/header.cpp +++ b/DSView/pv/view/header.cpp @@ -73,14 +73,13 @@ Header::Header(View &parent) : connect(nameEdit, SIGNAL(editingFinished()), this, SLOT(on_action_set_name_triggered())); - retranslateUi(); + + ADD_UI(this); } -void Header::changeEvent(QEvent *event) +Header::~Header() { - if (event->type() == QEvent::LanguageChange) - retranslateUi(); - QWidget::changeEvent(event); + REMOVE_UI(this); } void Header::retranslateUi() @@ -512,6 +511,20 @@ void Header::header_resize() } } +void Header::UpdateLanguage() +{ + retranslateUi(); +} + +void Header::UpdateTheme() +{ + retranslateUi(); +} + +void Header::UpdateFont() +{ +} + } // namespace view } // namespace pv diff --git a/DSView/pv/view/header.h b/DSView/pv/view/header.h index 8779cba8..b6fd66ce 100644 --- a/DSView/pv/view/header.h +++ b/DSView/pv/view/header.h @@ -26,9 +26,9 @@ #include #include - #include #include +#include "../ui/uimanager.h" namespace pv { namespace view { @@ -38,18 +38,19 @@ class View; //the left panel of main graph //created by View -class Header : public QWidget +class Header : public QWidget, public IUiWindow { Q_OBJECT public: Header(View &parent); + ~Header(); + private: pv::view::Trace* get_mTrace(int &action, const QPoint &pt); private: - void changeEvent(QEvent *event); void retranslateUi(); void paintEvent(QPaintEvent *event); @@ -65,6 +66,11 @@ private: void changeName(QMouseEvent *event); void changeColor(QMouseEvent *event); + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + public: int get_nameEditWidth(); void header_resize(); diff --git a/DSView/pv/view/view.cpp b/DSView/pv/view/view.cpp index 659a8405..c4d0406f 100644 --- a/DSView/pv/view/view.cpp +++ b/DSView/pv/view/view.cpp @@ -122,8 +122,6 @@ View::View(SigSession *session, pv::toolbars::SamplingBar *sampling_bar, QWidget _header = new Header(*this); _devmode = new DevMode(this, session); - AppControl::Instance()->add_font_form(_devmode); - setViewportMargins(headerWidth(), RulerHeight, 0, 0); // windows splitter @@ -202,11 +200,15 @@ View::View(SigSession *session, pv::toolbars::SamplingBar *sampling_bar, QWidget connect(_header, SIGNAL(traces_moved()),this, SLOT(on_traces_moved())); connect(_header, SIGNAL(header_updated()),this, SLOT(header_updated())); + + ADD_UI(this); } -View::~View(){ +View::~View() +{ DESTROY_OBJECT(_trig_cursor); DESTROY_OBJECT(_search_cursor); + REMOVE_UI(this); } void View::show_wait_trigger() @@ -1422,5 +1424,20 @@ Cursor* View::get_cursor_by_index(int index) return NULL; } +void View::UpdateLanguage() +{ + +} + +void View::UpdateTheme() +{ + +} + +void View::UpdateFont() +{ + update_font(); +} + } // namespace view } // namespace pv diff --git a/DSView/pv/view/view.h b/DSView/pv/view/view.h index 70942e61..d80a9ba5 100644 --- a/DSView/pv/view/view.h +++ b/DSView/pv/view/view.h @@ -43,6 +43,7 @@ #include "viewstatus.h" #include "../dsvdef.h" #include "../interface/icallbacks.h" +#include "../ui/uimanager.h" class DeviceAgent; @@ -69,7 +70,8 @@ class Viewport; class LissajousFigure; //created by MainWindow -class View : public QScrollArea, public IFontForm{ +class View : public QScrollArea, public IUiWindow +{ Q_OBJECT private: @@ -324,11 +326,15 @@ public: return _time_viewport; } - //IFontForm - void update_font() override; + void update_font(); void check_measure(); bool header_is_draging(); + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + signals: void hover_point_changed(); void cursor_update(); diff --git a/DSView/pv/view/viewport.cpp b/DSView/pv/view/viewport.cpp index c14c37d9..9c082497 100644 --- a/DSView/pv/view/viewport.cpp +++ b/DSView/pv/view/viewport.cpp @@ -115,6 +115,13 @@ Viewport::Viewport(View &parent, View_type type) : connect(yAction, SIGNAL(triggered(bool)), this, SLOT(add_cursor_y())); connect(xAction, SIGNAL(triggered(bool)), this, SLOT(add_cursor_x())); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),this, SLOT(show_contextmenu(const QPoint&))); + + ADD_UI(this); +} + +Viewport::~Viewport() +{ + REMOVE_UI(this); } int Viewport::get_total_height() @@ -2066,5 +2073,18 @@ void Viewport::update_lang() _xAction->setText(L_S(STR_PAGE_DLG, S_ID(IDS_DLG_ADD_X_CURSOR), "Add X-cursor")); } +void Viewport::UpdateLanguage() +{ +} + +void Viewport::UpdateTheme() +{ +} + +void Viewport::UpdateFont() +{ + update_font(); +} + } // namespace view } // namespace pv diff --git a/DSView/pv/view/viewport.h b/DSView/pv/view/viewport.h index e684816f..22ef323c 100644 --- a/DSView/pv/view/viewport.h +++ b/DSView/pv/view/viewport.h @@ -36,6 +36,7 @@ #include "../view/view.h" #include "../dsvdef.h" #include "../interface/icallbacks.h" +#include "../ui/uimanager.h" class QPainter; class QPaintEvent; @@ -62,7 +63,7 @@ class View; //main graph view port, in the middle region //draw the left and right rule scale //created by View -class Viewport : public QWidget, public IFontForm +class Viewport : public QWidget, public IUiWindow { Q_OBJECT @@ -102,6 +103,7 @@ public: public: explicit Viewport(View &parent, View_type type); + ~Viewport(); int get_total_height(); QPoint get_mouse_point(); @@ -118,18 +120,19 @@ public: void show_wait_trigger(); void update_lang(); - - //IFontForm - void update_font() override; - + void update_font(); void measure(); - void update(int event); protected: bool event(QEvent *event) override; void paintEvent(QPaintEvent *event) override; + //IUiWindow + void UpdateLanguage() override; + void UpdateTheme() override; + void UpdateFont() override; + private: void doPaint(); void mousePressEvent(QMouseEvent *event) override;