Added location marker icon support to marker_types and marker_manager

This commit is contained in:
AdenKoperczak 2024-11-28 11:50:58 -05:00
parent 7ed89fdd5d
commit 6da34fc151
3 changed files with 67 additions and 14 deletions

View file

@ -1,5 +1,6 @@
#include <scwx/qt/manager/marker_manager.hpp> #include <scwx/qt/manager/marker_manager.hpp>
#include <scwx/qt/types/marker_types.hpp> #include <scwx/qt/types/marker_types.hpp>
#include <scwx/qt/util/color.hpp>
#include <scwx/qt/util/json.hpp> #include <scwx/qt/util/json.hpp>
#include <scwx/qt/main/application.hpp> #include <scwx/qt/main/application.hpp>
#include <scwx/util/logger.hpp> #include <scwx/util/logger.hpp>
@ -27,6 +28,12 @@ static const auto logger_ = scwx::util::Logger::Create(logPrefix_);
static const std::string kNameName_ = "name"; static const std::string kNameName_ = "name";
static const std::string kLatitudeName_ = "latitude"; static const std::string kLatitudeName_ = "latitude";
static const std::string kLongitudeName_ = "longitude"; static const std::string kLongitudeName_ = "longitude";
static const std::string kIconName_ = "icon";
static const std::string kIconColorName_ = "icon-color";
static const std::string defaultIconName = types::getMarkerIcons()[0].name;
static const boost::gil::rgba8_pixel_t defaultIconColor =
util::color::ToRgba8PixelT("#ffff0000");
class MarkerManager::Impl class MarkerManager::Impl
{ {
@ -59,10 +66,7 @@ public:
class MarkerManager::Impl::MarkerRecord class MarkerManager::Impl::MarkerRecord
{ {
public: public:
MarkerRecord(const std::string& name, double latitude, double longitude) :
markerInfo_ {types::MarkerInfo(name, latitude, longitude)}
{
}
MarkerRecord(const types::MarkerInfo& info) : MarkerRecord(const types::MarkerInfo& info) :
markerInfo_ {info} markerInfo_ {info}
{ {
@ -81,16 +85,47 @@ public:
{ {
jv = {{kNameName_, record->markerInfo_.name}, jv = {{kNameName_, record->markerInfo_.name},
{kLatitudeName_, record->markerInfo_.latitude}, {kLatitudeName_, record->markerInfo_.latitude},
{kLongitudeName_, record->markerInfo_.longitude}}; {kLongitudeName_, record->markerInfo_.longitude},
{kIconName_, record->markerInfo_.iconName},
{kIconColorName_, util::color::ToArgbString(record->markerInfo_.iconColor)}};
} }
friend MarkerRecord tag_invoke(boost::json::value_to_tag<MarkerRecord>, friend MarkerRecord tag_invoke(boost::json::value_to_tag<MarkerRecord>,
const boost::json::value& jv) const boost::json::value& jv)
{ {
return MarkerRecord(
const boost::json::object& jo = jv.as_object();
std::string iconName = defaultIconName;
boost::gil::rgba8_pixel_t iconColor = defaultIconColor;
if (jo.contains(kIconName_) && jo.at(kIconName_).is_string())
{
iconName = boost::json::value_to<std::string>(jv.at(kIconName_));
}
if (jo.contains(kIconColorName_) && jo.at(kIconName_).is_string())
{
try {
iconColor = util::color::ToRgba8PixelT(
boost::json::value_to<std::string>(jv.at(kIconColorName_)));
}
catch (const std::exception& ex)
{
logger_->warn(
"Could not parse color value in location-markers.json with the "
"following exception: {}",
ex.what());
}
}
return MarkerRecord(types::MarkerInfo(
boost::json::value_to<std::string>(jv.at(kNameName_)), boost::json::value_to<std::string>(jv.at(kNameName_)),
boost::json::value_to<double>(jv.at(kLatitudeName_)), boost::json::value_to<double>(jv.at(kLatitudeName_)),
boost::json::value_to<double>(jv.at(kLongitudeName_))); boost::json::value_to<double>(jv.at(kLongitudeName_)),
iconName,
iconColor));
} }
}; };

View file

@ -5,6 +5,7 @@
#include <string> #include <string>
#include <cstdint> #include <cstdint>
#include <boost/gil.hpp>
#include <QIcon> #include <QIcon>
namespace scwx namespace scwx
@ -17,15 +18,25 @@ typedef std::uint64_t MarkerId;
struct MarkerInfo struct MarkerInfo
{ {
MarkerInfo(const std::string& name, double latitude, double longitude) : MarkerInfo(const std::string& name,
name {name}, latitude {latitude}, longitude {longitude} double latitude,
double longitude,
const std::string iconName,
boost::gil::rgba8_pixel_t iconColor) :
name {name},
latitude {latitude},
longitude {longitude},
iconName {iconName},
iconColor {iconColor}
{ {
} }
MarkerId id; MarkerId id;
std::string name; std::string name;
double latitude; double latitude;
double longitude; double longitude;
std::string iconName;
boost::gil::rgba8_pixel_t iconColor;
}; };
struct MarkerIconInfo { struct MarkerIconInfo {

View file

@ -7,6 +7,8 @@
#include <scwx/qt/ui/open_url_dialog.hpp> #include <scwx/qt/ui/open_url_dialog.hpp>
#include <scwx/util/logger.hpp> #include <scwx/util/logger.hpp>
#include <scwx/qt/util/color.hpp>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
namespace scwx namespace scwx
@ -63,7 +65,12 @@ void MarkerSettingsWidgetImpl::ConnectSignals()
self_, self_,
[this]() [this]()
{ {
markerManager_->add_marker(types::MarkerInfo("", 0, 0)); markerManager_->add_marker(types::MarkerInfo(
"",
0,
0,
types::getMarkerIcons()[0].name,
util::color::ToRgba8PixelT("#ffff0000")));
}); });
QObject::connect( QObject::connect(
self_->ui->removeButton, self_->ui->removeButton,