X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=pv%2Fglobalsettings.cpp;h=ca649befad8f318dab49f90e2ef73ad766756625;hb=e23d7aa0d9980c3c269cbddb4cfbb32350d7425c;hp=55ceb5a9e4e382b80cef0ad61cde72f0e0142888;hpb=37b0bd3594a0effb8252c22377f003deafc55b19;p=pulseview.git diff --git a/pv/globalsettings.cpp b/pv/globalsettings.cpp index 55ceb5a9..ca649bef 100644 --- a/pv/globalsettings.cpp +++ b/pv/globalsettings.cpp @@ -17,7 +17,9 @@ * along with this program; if not, see . */ -#include "globalsettings.hpp" +#include +#include +#include #include #include @@ -26,10 +28,16 @@ #include #include #include +#include +#include + +#include "globalsettings.hpp" +#include "application.hpp" using std::map; using std::pair; using std::string; +using std::stringstream; using std::vector; namespace pv { @@ -40,7 +48,10 @@ const vector< pair > Themes { {"DarkStyle", ":/themes/darkstyle/darkstyle.qss"} }; +const QString GlobalSettings::Key_General_Language = "General_Language"; const QString GlobalSettings::Key_General_Theme = "General_Theme"; +const QString GlobalSettings::Key_General_Style = "General_Style"; +const QString GlobalSettings::Key_General_SaveWithSetup = "General_SaveWithSetup"; const QString GlobalSettings::Key_View_ZoomToFitDuringAcq = "View_ZoomToFitDuringAcq"; const QString GlobalSettings::Key_View_ZoomToFitAfterAcq = "View_ZoomToFitAfterAcq"; const QString GlobalSettings::Key_View_TriggerIsZeroTime = "View_TriggerIsZeroTime"; @@ -55,14 +66,21 @@ const QString GlobalSettings::Key_View_DefaultDivHeight = "View_DefaultDivHeight const QString GlobalSettings::Key_View_DefaultLogicHeight = "View_DefaultLogicHeight"; const QString GlobalSettings::Key_View_ShowHoverMarker = "View_ShowHoverMarker"; const QString GlobalSettings::Key_View_SnapDistance = "View_SnapDistance"; +const QString GlobalSettings::Key_View_CursorFillColor = "View_CursorFillColor"; +const QString GlobalSettings::Key_View_CursorShowFrequency = "View_CursorShowFrequency"; +const QString GlobalSettings::Key_View_CursorShowInterval = "View_CursorShowInterval"; +const QString GlobalSettings::Key_View_CursorShowSamples = "View_CursorShowSamples"; const QString GlobalSettings::Key_Dec_InitialStateConfigurable = "Dec_InitialStateConfigurable"; const QString GlobalSettings::Key_Dec_ExportFormat = "Dec_ExportFormat"; +const QString GlobalSettings::Key_Dec_AlwaysShowAllRows = "Dec_AlwaysShowAllRows"; const QString GlobalSettings::Key_Log_BufferSize = "Log_BufferSize"; const QString GlobalSettings::Key_Log_NotifyOfStacktrace = "Log_NotifyOfStacktrace"; vector GlobalSettings::callbacks_; bool GlobalSettings::tracking_ = false; +bool GlobalSettings::is_dark_theme_ = false; map GlobalSettings::tracked_changes_; +QString GlobalSettings::default_style_; QPalette GlobalSettings::default_palette_; GlobalSettings::GlobalSettings() : @@ -71,11 +89,35 @@ GlobalSettings::GlobalSettings() : beginGroup("Settings"); } +void GlobalSettings::save_internal_defaults() +{ + default_style_ = qApp->style()->objectName(); + if (default_style_.isEmpty()) + default_style_ = "fusion"; + + default_palette_ = QApplication::palette(); +} + void GlobalSettings::set_defaults_where_needed() { + if (!contains(Key_General_Language)) { + // Determine and set default UI language + QString language = QLocale().uiLanguages().first(); // May return e.g. en-Latn-US // clazy:exclude=detaching-temporary + language = language.split("-").first(); + + setValue(Key_General_Language, language); + apply_language(); + } + // Use no theme by default if (!contains(Key_General_Theme)) setValue(Key_General_Theme, 0); + if (!contains(Key_General_Style)) + setValue(Key_General_Style, ""); + + // Save setup with .sr files by default + if (!contains(Key_General_SaveWithSetup)) + setValue(Key_General_SaveWithSetup, true); // Enable zoom-to-fit after acquisition by default if (!contains(Key_View_ZoomToFitAfterAcq)) @@ -92,9 +134,6 @@ void GlobalSettings::set_defaults_where_needed() // Enable filling logic signal high areas by default if (!contains(Key_View_FillSignalHighAreas)) setValue(Key_View_FillSignalHighAreas, true); - if (!contains(Key_View_FillSignalHighAreaColor)) - setValue(Key_View_FillSignalHighAreaColor, - QColor(0, 0, 0, 5 * 256 / 100).rgba()); if (!contains(Key_View_DefaultDivHeight)) setValue(Key_View_DefaultDivHeight, @@ -110,8 +149,16 @@ void GlobalSettings::set_defaults_where_needed() if (!contains(Key_View_SnapDistance)) setValue(Key_View_SnapDistance, 15); - if (!contains(Key_Dec_ExportFormat)) - setValue(Key_Dec_ExportFormat, "%s %d: %c: %1"); + if (!contains(Key_View_CursorShowInterval)) + setValue(Key_View_CursorShowInterval, true); + + if (!contains(Key_View_CursorShowFrequency)) + setValue(Key_View_CursorShowFrequency, true); + + // %c was used for the row name in the past so we need to transition such users + if (!contains(Key_Dec_ExportFormat) || + value(Key_Dec_ExportFormat).toString() == "%s %d: %c: %1") + setValue(Key_Dec_ExportFormat, "%s %d: %r: %1"); // Default to 500 lines of backlog if (!contains(Key_Log_BufferSize)) @@ -120,11 +167,33 @@ void GlobalSettings::set_defaults_where_needed() // Notify user of existing stack trace by default if (!contains(Key_Log_NotifyOfStacktrace)) setValue(Key_Log_NotifyOfStacktrace, true); + + // Default theme is bright, so use its color scheme if undefined + if (!contains(Key_View_CursorFillColor)) + set_bright_theme_default_colors(); } -void GlobalSettings::save_default_palette() +void GlobalSettings::set_bright_theme_default_colors() { - default_palette_ = QApplication::palette(); + setValue(Key_View_FillSignalHighAreaColor, + QColor(0, 0, 0, 5 * 256 / 100).rgba()); + + setValue(Key_View_CursorFillColor, + QColor(220, 231, 243).rgba()); +} + +void GlobalSettings::set_dark_theme_default_colors() +{ + setValue(Key_View_FillSignalHighAreaColor, + QColor(188, 188, 188, 9 * 256 / 100).rgba()); + + setValue(Key_View_CursorFillColor, + QColor(60, 60, 60).rgba()); +} + +bool GlobalSettings::current_theme_is_dark() +{ + return is_dark_theme_; } void GlobalSettings::apply_theme() @@ -141,6 +210,14 @@ void GlobalSettings::apply_theme() qApp->setPalette(default_palette_); + const QString style = value(Key_General_Style).toString(); + if (style.isEmpty()) + qApp->setStyle(default_style_); + else + qApp->setStyle(style); + + is_dark_theme_ = false; + if (theme_name.compare("QDarkStyleSheet") == 0) { QPalette dark_palette; dark_palette.setColor(QPalette::Window, QColor(53, 53, 53)); @@ -149,6 +226,7 @@ void GlobalSettings::apply_theme() dark_palette.setColor(QPalette::Dark, QColor(35, 35, 35)); dark_palette.setColor(QPalette::Highlight, QColor(42, 130, 218)); qApp->setPalette(dark_palette); + is_dark_theme_ = true; } else if (theme_name.compare("DarkStyle") == 0) { QPalette dark_palette; dark_palette.setColor(QPalette::Window, QColor(53, 53, 53)); @@ -172,11 +250,18 @@ void GlobalSettings::apply_theme() dark_palette.setColor(QPalette::HighlightedText, Qt::white); dark_palette.setColor(QPalette::Disabled, QPalette::HighlightedText, QColor(127, 127, 127)); qApp->setPalette(dark_palette); + is_dark_theme_ = true; } QPixmapCache::clear(); } +void GlobalSettings::apply_language() +{ + Application* a = qobject_cast(QApplication::instance()); + a->switch_language(value(Key_General_Language).toString()); +} + void GlobalSettings::add_change_handler(GlobalSettingsInterface *cb) { callbacks_.push_back(cb); @@ -224,7 +309,7 @@ void GlobalSettings::undo_tracked_changes() { tracking_ = false; - for (auto entry : tracked_changes_) + for (auto& entry : tracked_changes_) setValue(entry.first, entry.second); tracked_changes_.clear(); @@ -291,4 +376,28 @@ Glib::VariantBase GlobalSettings::restore_variantbase(QSettings &settings) return ret_val; } +void GlobalSettings::store_timestamp(QSettings &settings, const char *name, const pv::util::Timestamp &ts) +{ + stringstream ss; + boost::archive::text_oarchive oa(ss); + oa << boost::serialization::make_nvp(name, ts); + settings.setValue(name, QString::fromStdString(ss.str())); +} + +pv::util::Timestamp GlobalSettings::restore_timestamp(QSettings &settings, const char *name) +{ + util::Timestamp result; + stringstream ss; + ss << settings.value(name).toString().toStdString(); + + try { + boost::archive::text_iarchive ia(ss); + ia >> boost::serialization::make_nvp(name, result); + } catch (boost::archive::archive_exception&) { + qDebug() << "Could not restore setting" << name; + } + + return result; +} + } // namespace pv