X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fglobalsettings.cpp;h=df44162fe3372de01f626e731b928c086eebaae3;hp=7fd1249cfd5d4fd525251ea03dca6b58186f76ff;hb=fb64180193664005567570724d52b685913e15ed;hpb=28ceff251c776bcf99eafae691e70a521af15957 diff --git a/pv/globalsettings.cpp b/pv/globalsettings.cpp index 7fd1249c..df44162f 100644 --- a/pv/globalsettings.cpp +++ b/pv/globalsettings.cpp @@ -19,21 +19,35 @@ #include "globalsettings.hpp" -using std::function; +#include +#include +#include +#include + using std::map; -using std::multimap; +using std::string; +using std::vector; namespace pv { -const QString GlobalSettings::Key_View_AlwaysZoomToFit = "View_AlwaysZoomToFit"; +const QString GlobalSettings::Key_View_ZoomToFitDuringAcq = "View_ZoomToFitDuringAcq"; const QString GlobalSettings::Key_View_ZoomToFitAfterAcq = "View_ZoomToFitAfterAcq"; -const QString GlobalSettings::Key_View_ColouredBG = "View_ColouredBG"; +const QString GlobalSettings::Key_View_TriggerIsZeroTime = "View_TriggerIsZeroTime"; +const QString GlobalSettings::Key_View_ColoredBG = "View_ColoredBG"; const QString GlobalSettings::Key_View_StickyScrolling = "View_StickyScrolling"; const QString GlobalSettings::Key_View_ShowSamplingPoints = "View_ShowSamplingPoints"; const QString GlobalSettings::Key_View_ShowAnalogMinorGrid = "View_ShowAnalogMinorGrid"; +const QString GlobalSettings::Key_View_ConversionThresholdDispMode = "View_ConversionThresholdDispMode"; +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_Dec_InitialStateConfigurable = "Dec_InitialStateConfigurable"; +const QString GlobalSettings::Key_Dec_ExportFormat = "Dec_ExportFormat"; +const QString GlobalSettings::Key_Log_BufferSize = "Log_BufferSize"; +const QString GlobalSettings::Key_Log_NotifyOfStacktrace = "Log_NotifyOfStacktrace"; -multimap< QString, function > GlobalSettings::callbacks_; +vector GlobalSettings::callbacks_; bool GlobalSettings::tracking_ = false; map GlobalSettings::tracked_changes_; @@ -49,19 +63,49 @@ void GlobalSettings::set_defaults_where_needed() if (!contains(Key_View_ZoomToFitAfterAcq)) setValue(Key_View_ZoomToFitAfterAcq, true); - // Enable coloured trace backgrounds by default - if (!contains(Key_View_ColouredBG)) - setValue(Key_View_ColouredBG, true); + // Enable colored trace backgrounds by default + if (!contains(Key_View_ColoredBG)) + setValue(Key_View_ColoredBG, true); // Enable showing sampling points by default if (!contains(Key_View_ShowSamplingPoints)) setValue(Key_View_ShowSamplingPoints, true); + + if (!contains(Key_View_DefaultDivHeight)) + setValue(Key_View_DefaultDivHeight, + 3 * QFontMetrics(QApplication::font()).height()); + + if (!contains(Key_View_DefaultLogicHeight)) + setValue(Key_View_DefaultLogicHeight, + 2 * QFontMetrics(QApplication::font()).height()); + + if (!contains(Key_View_SnapDistance)) + setValue(Key_View_SnapDistance, 15); + + if (!contains(Key_Dec_ExportFormat)) + setValue(Key_Dec_ExportFormat, "%s %d: %c: %1"); + + // Default to 500 lines of backlog + if (!contains(Key_Log_BufferSize)) + setValue(Key_Log_BufferSize, 500); + + // Notify user of existing stack trace by default + if (!contains(Key_Log_NotifyOfStacktrace)) + setValue(Key_Log_NotifyOfStacktrace, true); +} + +void GlobalSettings::add_change_handler(GlobalSettingsInterface *cb) +{ + callbacks_.push_back(cb); } -void GlobalSettings::register_change_handler(const QString key, - function cb) +void GlobalSettings::remove_change_handler(GlobalSettingsInterface *cb) { - callbacks_.emplace(key, cb); + for (auto cb_it = callbacks_.begin(); cb_it != callbacks_.end(); cb_it++) + if (*cb_it == cb) { + callbacks_.erase(cb_it); + break; + } } void GlobalSettings::setValue(const QString &key, const QVariant &value) @@ -73,11 +117,12 @@ void GlobalSettings::setValue(const QString &key, const QVariant &value) QSettings::setValue(key, value); - // Call all registered callbacks for this key - auto range = callbacks_.equal_range(key); + // TODO Emulate noquote() + qDebug() << "Setting" << key << "changed to" << value; - for (auto it = range.first; it != range.second; it++) - it->second(value); + // Call all registered callbacks + for (GlobalSettingsInterface *cb : callbacks_) + cb->on_setting_changed(key, value); } void GlobalSettings::start_tracking() @@ -102,4 +147,65 @@ void GlobalSettings::undo_tracked_changes() tracked_changes_.clear(); } +void GlobalSettings::store_gvariant(QSettings &settings, GVariant *v) +{ + const GVariantType *var_type = g_variant_get_type(v); + char *var_type_str = g_variant_type_dup_string(var_type); + + QByteArray var_data = QByteArray((const char*)g_variant_get_data(v), + g_variant_get_size(v)); + + settings.setValue("value", var_data); + settings.setValue("type", var_type_str); + + g_free(var_type_str); +} + +GVariant* GlobalSettings::restore_gvariant(QSettings &settings) +{ + QString raw_type = settings.value("type").toString(); + GVariantType *var_type = g_variant_type_new(raw_type.toUtf8()); + + QByteArray data = settings.value("value").toByteArray(); + + gpointer var_data = g_memdup((gconstpointer)data.constData(), + (guint)data.size()); + + GVariant *value = g_variant_new_from_data(var_type, var_data, + data.size(), false, g_free, var_data); + + g_variant_type_free(var_type); + + return value; +} + +void GlobalSettings::store_variantbase(QSettings &settings, Glib::VariantBase v) +{ + const QByteArray var_data = QByteArray((const char*)v.get_data(), v.get_size()); + + settings.setValue("value", var_data); + settings.setValue("type", QString::fromStdString(v.get_type_string())); +} + +Glib::VariantBase GlobalSettings::restore_variantbase(QSettings &settings) +{ + QString raw_type = settings.value("type").toString(); + GVariantType *var_type = g_variant_type_new(raw_type.toUtf8()); + + QByteArray data = settings.value("value").toByteArray(); + + gpointer var_data = g_memdup((gconstpointer)data.constData(), + (guint)data.size()); + + GVariant *value = g_variant_new_from_data(var_type, var_data, + data.size(), false, g_free, var_data); + + Glib::VariantBase ret_val = Glib::VariantBase(value, true); + + g_variant_type_free(var_type); + g_variant_unref(value); + + return ret_val; +} + } // namespace pv