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);