diff --git a/scwx-qt/scwx-qt.cmake b/scwx-qt/scwx-qt.cmake index dd855214..dbc5f65a 100644 --- a/scwx-qt/scwx-qt.cmake +++ b/scwx-qt/scwx-qt.cmake @@ -156,6 +156,7 @@ set(UI_UI source/scwx/qt/ui/alert_dialog.ui source/scwx/qt/ui/radar_site_dialog.ui source/scwx/qt/ui/settings_dialog.ui) set(HDR_UTIL source/scwx/qt/util/color.hpp + source/scwx/qt/util/file.hpp source/scwx/qt/util/font.hpp source/scwx/qt/util/font_buffer.hpp source/scwx/qt/util/json.hpp @@ -164,6 +165,7 @@ set(HDR_UTIL source/scwx/qt/util/color.hpp source/scwx/qt/util/q_file_buffer.hpp source/scwx/qt/util/q_file_input_stream.hpp) set(SRC_UTIL source/scwx/qt/util/color.cpp + source/scwx/qt/util/file.cpp source/scwx/qt/util/font.cpp source/scwx/qt/util/font_buffer.cpp source/scwx/qt/util/json.cpp diff --git a/scwx-qt/scwx-qt.qrc b/scwx-qt/scwx-qt.qrc index ef423a2a..1f0aaee9 100644 --- a/scwx-qt/scwx-qt.qrc +++ b/scwx-qt/scwx-qt.qrc @@ -23,6 +23,20 @@ res/icons/font-awesome-6/sliders-solid.svg res/icons/font-awesome-6/square-minus-regular.svg res/icons/font-awesome-6/square-plus-regular.svg + res/palettes/wct/CC.pal + res/palettes/wct/Default16.pal + res/palettes/wct/DOD_DSD.pal + res/palettes/wct/DR.pal + res/palettes/wct/DV.pal + res/palettes/wct/ET.pal + res/palettes/wct/KDP.pal + res/palettes/wct/KDP2.pal + res/palettes/wct/OHP.pal + res/palettes/wct/SRV.pal + res/palettes/wct/STP.pal + res/palettes/wct/SW.pal + res/palettes/wct/VIL.pal + res/palettes/wct/ZDR.pal res/textures/lines/default-1x7.png res/textures/lines/test-pattern.png diff --git a/scwx-qt/source/scwx/qt/map/map_widget.cpp b/scwx-qt/source/scwx/qt/map/map_widget.cpp index 5ead3411..b770ab66 100644 --- a/scwx-qt/source/scwx/qt/map/map_widget.cpp +++ b/scwx-qt/source/scwx/qt/map/map_widget.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include #include @@ -415,7 +416,7 @@ void MapWidget::SelectRadarProduct( radarId, common::GetRadarProductGroupName(group), product, - util::TimeString(time)); + scwx::util::TimeString(time)); p->SetRadarSite(radarId); p->selectedTime_ = time; @@ -796,7 +797,7 @@ void MapWidgetImpl::RadarProductManagerConnect() }); // Load file - util::async( + scwx::util::async( [=]() { if (group == common::RadarProductGroup::Level2) @@ -830,7 +831,7 @@ void MapWidgetImpl::RadarProductManagerDisconnect() void MapWidgetImpl::InitializeNewRadarProductView( const std::string& colorPalette) { - util::async( + scwx::util::async( [=]() { auto radarProductView = context_->radar_product_view(); @@ -841,8 +842,10 @@ void MapWidgetImpl::InitializeNewRadarProductView( .GetValue(); if (!colorTableFile.empty()) { + std::unique_ptr colorTableStream = + util::OpenFile(colorTableFile); std::shared_ptr colorTable = - common::ColorTable::Load(colorTableFile); + common::ColorTable::Load(*colorTableStream); radarProductView->LoadColorTable(colorTable); } diff --git a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp index e5f8cb7a..5a16f508 100644 --- a/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp +++ b/scwx-qt/source/scwx/qt/ui/settings_dialog.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -557,8 +558,10 @@ void SettingsDialogImpl::LoadColorTablePreview(const std::string& key, scwx::util::async( [key, value, imageLabel]() { + std::unique_ptr is = util::OpenFile(value); std::shared_ptr colorTable = - common::ColorTable::Load(value); + common::ColorTable::Load(*is); + if (colorTable->IsValid()) { auto& conversions = kColorTableConversions_.at(key); diff --git a/scwx-qt/source/scwx/qt/util/file.cpp b/scwx-qt/source/scwx/qt/util/file.cpp new file mode 100644 index 00000000..b129e6ce --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/file.cpp @@ -0,0 +1,32 @@ +#include +#include + +#include + +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ + +static const std::string logPrefix_ = "scwx::qt::util::file"; + +std::unique_ptr OpenFile(const std::string& filename, + std::ios_base::openmode mode) +{ + if (filename.starts_with(':')) + { + return std::make_unique(filename, mode); + } + else + { + return std::make_unique(filename, mode); + } +} + +} // namespace util +} // namespace qt +} // namespace scwx diff --git a/scwx-qt/source/scwx/qt/util/file.hpp b/scwx-qt/source/scwx/qt/util/file.hpp new file mode 100644 index 00000000..20aae984 --- /dev/null +++ b/scwx-qt/source/scwx/qt/util/file.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include +#include +#include + +namespace scwx +{ +namespace qt +{ +namespace util +{ + +std::unique_ptr +OpenFile(const std::string& filename, + std::ios_base::openmode mode = std::ios_base::in); + +} // namespace util +} // namespace qt +} // namespace scwx diff --git a/wxdata/include/scwx/common/color_table.hpp b/wxdata/include/scwx/common/color_table.hpp index 608ec13b..4a630900 100644 --- a/wxdata/include/scwx/common/color_table.hpp +++ b/wxdata/include/scwx/common/color_table.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -28,7 +29,7 @@ public: explicit ColorTable(); ~ColorTable(); - ColorTable(const ColorTable&) = delete; + ColorTable(const ColorTable&) = delete; ColorTable& operator=(const ColorTable&) = delete; ColorTable(ColorTable&&) noexcept; @@ -40,6 +41,7 @@ public: bool IsValid() const; static std::shared_ptr Load(const std::string& filename); + static std::shared_ptr Load(std::istream& is); private: std::unique_ptr p; diff --git a/wxdata/source/scwx/common/color_table.cpp b/wxdata/source/scwx/common/color_table.cpp index 7636ed09..17935576 100644 --- a/wxdata/source/scwx/common/color_table.cpp +++ b/wxdata/source/scwx/common/color_table.cpp @@ -137,13 +137,16 @@ bool ColorTable::IsValid() const std::shared_ptr ColorTable::Load(const std::string& filename) { logger_->debug("Loading color table: {}", filename); + std::ifstream f(filename, std::ios_base::in); + return Load(f); +} +std::shared_ptr ColorTable::Load(std::istream& is) +{ std::shared_ptr p = std::make_shared(); - std::ifstream f(filename, std::ios_base::in); - std::string line; - while (scwx::util::getline(f, line)) + while (scwx::util::getline(is, line)) { std::string token; std::istringstream tokens(line);