Holiday Themes
This commit is contained in:
@@ -598,7 +598,9 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) {
|
||||
|
||||
// lanelines
|
||||
for (int i = 0; i < std::size(scene.lane_line_vertices); ++i) {
|
||||
if (customColors != 0) {
|
||||
if (currentHolidayTheme != 0) {
|
||||
painter.setBrush(std::get<3>(holidayThemeConfiguration[currentHolidayTheme]).begin()->second);
|
||||
} else if (customColors != 0) {
|
||||
painter.setBrush(std::get<3>(themeConfiguration[customColors]).begin()->second);
|
||||
} else {
|
||||
painter.setBrush(QColor::fromRgbF(1.0, 1.0, 1.0, std::clamp<float>(scene.lane_line_probs[i], 0.0, 0.7)));
|
||||
@@ -608,7 +610,9 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) {
|
||||
|
||||
// road edges
|
||||
for (int i = 0; i < std::size(scene.road_edge_vertices); ++i) {
|
||||
if (customColors != 0) {
|
||||
if (currentHolidayTheme != 0) {
|
||||
painter.setBrush(std::get<3>(holidayThemeConfiguration[currentHolidayTheme]).begin()->second);
|
||||
} else if (customColors != 0) {
|
||||
painter.setBrush(std::get<3>(themeConfiguration[customColors]).begin()->second);
|
||||
} else {
|
||||
painter.setBrush(QColor::fromRgbF(1.0, 0, 0, std::clamp<float>(1.0 - scene.road_edge_stds[i], 0.0, 1.0)));
|
||||
@@ -638,7 +642,12 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) {
|
||||
float lin_grad_point = (height() - scene.track_vertices[i].y()) / height();
|
||||
|
||||
// If acceleration is between -0.2 and 0.2, resort to the theme color
|
||||
if (std::abs(acceleration[i]) < 0.2 && (customColors != 0)) {
|
||||
if (std::abs(acceleration[i]) < 0.2 && (currentHolidayTheme != 0)) {
|
||||
const auto &colorMap = std::get<3>(holidayThemeConfiguration[currentHolidayTheme]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
bg.setColorAt(position, brush.color());
|
||||
}
|
||||
} else if (std::abs(acceleration[i]) < 0.2 && (customColors != 0)) {
|
||||
const auto &colorMap = std::get<3>(themeConfiguration[customColors]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
bg.setColorAt(position, brush.color());
|
||||
@@ -659,6 +668,11 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) {
|
||||
}
|
||||
}
|
||||
|
||||
} else if (currentHolidayTheme != 0) {
|
||||
const auto &colorMap = std::get<3>(holidayThemeConfiguration[currentHolidayTheme]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
bg.setColorAt(position, brush.color());
|
||||
}
|
||||
} else if (customColors != 0) {
|
||||
const auto &colorMap = std::get<3>(themeConfiguration[customColors]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
@@ -696,6 +710,12 @@ void AnnotatedCameraWidget::drawLaneLines(QPainter &painter, const UIState *s) {
|
||||
pe.setColorAt(0.0, QColor::fromHslF(205 / 360., 0.85, 0.56, 1.0));
|
||||
pe.setColorAt(0.5, QColor::fromHslF(205 / 360., 0.85, 0.56, 0.5));
|
||||
pe.setColorAt(1.0, QColor::fromHslF(205 / 360., 0.85, 0.56, 0.1));
|
||||
} else if (currentHolidayTheme != 0) {
|
||||
const auto &colorMap = std::get<3>(holidayThemeConfiguration[currentHolidayTheme]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
QColor darkerColor = brush.color().darker(120);
|
||||
pe.setColorAt(position, darkerColor);
|
||||
}
|
||||
} else if (customColors != 0) {
|
||||
const auto &colorMap = std::get<3>(themeConfiguration[customColors]);
|
||||
for (const auto &[position, brush] : colorMap) {
|
||||
@@ -847,7 +867,9 @@ void AnnotatedCameraWidget::drawLead(QPainter &painter, const cereal::RadarState
|
||||
|
||||
// chevron
|
||||
QPointF chevron[] = {{x + (sz * 1.25), y + sz}, {x, y}, {x - (sz * 1.25), y + sz}};
|
||||
if (customColors != 0) {
|
||||
if (currentHolidayTheme != 0) {
|
||||
painter.setBrush(std::get<3>(holidayThemeConfiguration[currentHolidayTheme]).begin()->second);
|
||||
} else if (customColors != 0) {
|
||||
painter.setBrush(std::get<3>(themeConfiguration[customColors]).begin()->second);
|
||||
} else {
|
||||
painter.setBrush(redColor(fillAlpha));
|
||||
@@ -1000,14 +1022,51 @@ void AnnotatedCameraWidget::initializeFrogPilotWidgets() {
|
||||
// Custom themes configuration
|
||||
themeConfiguration = {
|
||||
{1, {"frog_theme", 4, QColor(23, 134, 68, 242), {{0.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.1))}}}},
|
||||
{0.5, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.1))}}}},
|
||||
{2, {"tesla_theme", 4, QColor(0, 72, 255, 255), {{0.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{0.5, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{3, {"stalin_theme", 6, QColor(255, 0, 0, 255), {{0.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
};
|
||||
|
||||
// Holiday themes configuration
|
||||
holidayThemeConfiguration = {
|
||||
{1, {"april_fools", 4, QColor(255, 165, 0, 255), {{0.0, QBrush(QColor::fromHslF(39 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(39 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(39 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{2, {"christmas", 4, QColor(0, 72, 255, 255), {{0.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{3, {"cinco_de_mayo", 6, QColor(255, 0, 0, 255), {{0.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.1))}}}}
|
||||
{1.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{4, {"easter", 4, QColor(200, 150, 200, 255), {{0.0, QBrush(QColor::fromHslF(300 / 360., 0.31, 0.69, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(300 / 360., 0.31, 0.69, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(300 / 360., 0.31, 0.69, 0.1))}}}},
|
||||
{5, {"fourth_of_july", 4, QColor(0, 72, 255, 255), {{0.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(223 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{6, {"halloween", 6, QColor(255, 0, 0, 255), {{0.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{7, {"new_years_day", 4, QColor(23, 134, 68, 242), {{0.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.1))}}}},
|
||||
{8, {"st_patricks_day", 4, QColor(0, 128, 0, 255), {{0.0, QBrush(QColor::fromHslF(120 / 360., 1.0, 0.25, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(120 / 360., 1.0, 0.25, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(120 / 360., 1.0, 0.25, 0.1))}}}},
|
||||
{9, {"thanksgiving", 6, QColor(255, 0, 0, 255), {{0.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(0 / 360., 1.0, 0.5, 0.1))}}}},
|
||||
{10, {"valentines_day", 4, QColor(23, 134, 68, 242), {{0.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.1))}}}},
|
||||
{11, {"world_frog_day", 4, QColor(23, 134, 68, 242), {{0.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.9))},
|
||||
{0.5, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.5))},
|
||||
{1.0, QBrush(QColor::fromHslF(144 / 360., 0.71, 0.31, 0.1))}}}},
|
||||
};
|
||||
|
||||
// Initialize the timer for the turn signal animation
|
||||
@@ -1076,18 +1135,25 @@ void AnnotatedCameraWidget::updateFrogPilotWidgets(QPainter &p) {
|
||||
}
|
||||
|
||||
// Update the turn signal animation images upon toggle change
|
||||
if (customSignals != scene.custom_signals) {
|
||||
if (customSignals != scene.custom_signals || currentHolidayTheme != scene.current_holiday_theme) {
|
||||
currentHolidayTheme = scene.current_holiday_theme;
|
||||
customSignals = scene.custom_signals;
|
||||
|
||||
QString theme_path = QString("../frogpilot/assets/custom_themes/%1/images").arg(themeConfiguration.find(customSignals) != themeConfiguration.end() ?
|
||||
std::get<0>(themeConfiguration[customSignals]) : "");
|
||||
|
||||
QStringList imagePaths;
|
||||
int availableImages = std::get<1>(themeConfiguration[customSignals]);
|
||||
if (currentHolidayTheme != 0) {
|
||||
auto themeConfigIt = holidayThemeConfiguration.find(currentHolidayTheme);
|
||||
QString themeConfigKey = themeConfigIt != holidayThemeConfiguration.end() ? std::get<0>(themeConfigIt->second) : "";
|
||||
themePath = QString("../frogpilot/assets/holiday_themes/%1/images").arg(themeConfigKey);
|
||||
availableImages = std::get<1>(themeConfigIt->second);
|
||||
} else {
|
||||
auto themeConfigIt = themeConfiguration.find(customSignals);
|
||||
QString themeConfigKey = themeConfigIt != themeConfiguration.end() ? std::get<0>(themeConfigIt->second) : "";
|
||||
themePath = QString("../frogpilot/assets/custom_themes/%1/images").arg(themeConfigKey);
|
||||
availableImages = std::get<1>(themeConfigIt->second);
|
||||
}
|
||||
|
||||
for (int i = 1; i <= totalFrames; ++i) {
|
||||
int imageIndex = ((i - 1) % availableImages) + 1;
|
||||
QString imagePath = theme_path + QString("/turn_signal_%1.png").arg(imageIndex);
|
||||
QString imagePath = themePath + QString("/turn_signal_%1.png").arg(imageIndex);
|
||||
imagePaths.push_back(imagePath);
|
||||
}
|
||||
|
||||
@@ -1099,8 +1165,8 @@ void AnnotatedCameraWidget::updateFrogPilotWidgets(QPainter &p) {
|
||||
signalImgVector.push_back(pixmap.transformed(QTransform().scale(-1, 1))); // Flipped image
|
||||
}
|
||||
|
||||
signalImgVector.push_back(QPixmap(theme_path + "/turn_signal_1_red.png")); // Regular blindspot image
|
||||
signalImgVector.push_back(QPixmap(theme_path + "/turn_signal_1_red.png").transformed(QTransform().scale(-1, 1))); // Flipped blindspot image
|
||||
signalImgVector.push_back(QPixmap(themePath + "/turn_signal_1_red.png")); // Regular blindspot image
|
||||
signalImgVector.push_back(QPixmap(themePath + "/turn_signal_1_red.png").transformed(QTransform().scale(-1, 1))); // Flipped blindspot image
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -141,10 +141,12 @@ private:
|
||||
float laneWidthRight;
|
||||
float speedConversion;
|
||||
|
||||
int availableImages;
|
||||
int cameraView;
|
||||
int conditionalSpeed;
|
||||
int conditionalSpeedLead;
|
||||
int conditionalStatus;
|
||||
int currentHolidayTheme;
|
||||
int customColors;
|
||||
int customSignals;
|
||||
int obstacleDistance;
|
||||
@@ -153,9 +155,12 @@ private:
|
||||
|
||||
QString leadDistanceUnit;
|
||||
QString leadSpeedUnit;
|
||||
QString themePath;
|
||||
QStringList imagePaths;
|
||||
|
||||
size_t animationFrameIndex;
|
||||
|
||||
std::unordered_map<int, std::tuple<QString, int, QColor, std::map<double, QBrush>>> holidayThemeConfiguration;
|
||||
std::unordered_map<int, std::tuple<QString, int, QColor, std::map<double, QBrush>>> themeConfiguration;
|
||||
std::vector<QPixmap> signalImgVector;
|
||||
|
||||
|
||||
@@ -47,6 +47,30 @@ Sidebar::Sidebar(QWidget *parent) : QFrame(parent), onroad(false), flag_pressed(
|
||||
isStorageLeft = params.getBool("ShowStorageLeft");
|
||||
isStorageUsed = params.getBool("ShowStorageUsed");
|
||||
|
||||
holidayThemeConfiguration = {
|
||||
{1, {"april_fools", {QColor(255, 165, 0)}}},
|
||||
{2, {"christmas", {QColor(0, 72, 255)}}},
|
||||
{3, {"cinco_de_mayo", {QColor(255, 0, 0)}}},
|
||||
{4, {"easter", {QColor(200, 150, 200)}}},
|
||||
{5, {"fourth_of_july", {QColor(0, 72, 255)}}},
|
||||
{6, {"halloween", {QColor(255, 0, 0)}}},
|
||||
{7, {"new_years_day", {QColor(23, 134, 68)}}},
|
||||
{8, {"st_patricks_day", {QColor(0, 128, 0)}}},
|
||||
{9, {"thanksgiving", {QColor(255, 0, 0)}}},
|
||||
{10, {"valentines_day", {QColor(23, 134, 68)}}},
|
||||
{11, {"world_frog_day", {QColor(0, 72, 255)}}},
|
||||
};
|
||||
|
||||
for (auto &[key, themeData] : holidayThemeConfiguration) {
|
||||
QString &themeName = themeData.first;
|
||||
QString base = QString("../frogpilot/assets/holiday_themes/%1/images").arg(themeName);
|
||||
std::vector<QString> paths = {base + "/button_home.png", base + "/button_flag.png", base + "/button_settings.png"};
|
||||
|
||||
home_imgs[key] = loadPixmap(paths[0], home_btn.size());
|
||||
flag_imgs[key] = loadPixmap(paths[1], home_btn.size());
|
||||
settings_imgs[key] = loadPixmap(paths[2], settings_btn.size(), Qt::IgnoreAspectRatio);
|
||||
}
|
||||
|
||||
themeConfiguration = {
|
||||
{0, {"stock", {QColor(255, 255, 255)}}},
|
||||
{1, {"frog_theme", {QColor(23, 134, 68)}}},
|
||||
@@ -135,11 +159,17 @@ void Sidebar::updateState(const UIState &s) {
|
||||
setProperty("netStrength", strength > 0 ? strength + 1 : 0);
|
||||
|
||||
// FrogPilot properties
|
||||
home_img = home_imgs[scene.custom_icons];
|
||||
flag_img = flag_imgs[scene.custom_icons];
|
||||
settings_img = settings_imgs[scene.custom_icons];
|
||||
|
||||
currentColors = themeConfiguration[scene.custom_colors].second;
|
||||
if (scene.current_holiday_theme != 0) {
|
||||
home_img = home_imgs[scene.current_holiday_theme];
|
||||
flag_img = flag_imgs[scene.current_holiday_theme];
|
||||
settings_img = settings_imgs[scene.current_holiday_theme];
|
||||
currentColors = holidayThemeConfiguration[scene.current_holiday_theme].second;
|
||||
} else {
|
||||
home_img = home_imgs[scene.custom_icons];
|
||||
flag_img = flag_imgs[scene.custom_icons];
|
||||
settings_img = settings_imgs[scene.custom_icons];
|
||||
currentColors = themeConfiguration[scene.custom_colors].second;
|
||||
}
|
||||
|
||||
auto frogpilotDeviceState = sm["frogpilotDeviceState"].getFrogpilotDeviceState();
|
||||
|
||||
|
||||
@@ -77,6 +77,7 @@ private:
|
||||
bool isStorageLeft;
|
||||
bool isStorageUsed;
|
||||
|
||||
std::unordered_map<int, std::pair<QString, std::vector<QColor>>> holidayThemeConfiguration;
|
||||
std::unordered_map<int, std::pair<QString, std::vector<QColor>>> themeConfiguration;
|
||||
std::unordered_map<int, QPixmap> flag_imgs;
|
||||
std::unordered_map<int, QPixmap> home_imgs;
|
||||
|
||||
@@ -190,14 +190,34 @@ class Soundd:
|
||||
custom_sounds = self.params.get_int("CustomSounds") if custom_theme else 0
|
||||
|
||||
theme_configuration = {
|
||||
0: "stock",
|
||||
1: "frog_theme",
|
||||
2: "tesla_theme",
|
||||
3: "stalin_theme"
|
||||
}
|
||||
|
||||
theme_name = theme_configuration.get(custom_sounds, "stock")
|
||||
self.sound_directory = BASEDIR + ("/selfdrive/frogpilot/assets/custom_themes/" + theme_name + "/sounds/" if custom_sounds else "/selfdrive/assets/sounds/")
|
||||
holiday_themes = custom_theme and self.params.get_bool("HolidayThemes")
|
||||
current_holiday_theme = self.params_memory.get_int("CurrentHolidayTheme") if holiday_themes else 0
|
||||
|
||||
holiday_theme_configuration = {
|
||||
1: "april_fools",
|
||||
2: "christmas",
|
||||
3: "cinco_de_mayo",
|
||||
4: "easter",
|
||||
5: "fourth_of_july",
|
||||
6: "halloween",
|
||||
7: "new_years_day",
|
||||
8: "st_patricks_day",
|
||||
9: "thanksgiving",
|
||||
10: "valentines_day",
|
||||
11: "world_frog_day",
|
||||
}
|
||||
|
||||
if current_holiday_theme != 0:
|
||||
theme_name = holiday_theme_configuration.get(current_holiday_theme)
|
||||
self.sound_directory = BASEDIR + ("/selfdrive/frogpilot/assets/holiday_themes/" + theme_name + "/sounds/")
|
||||
else:
|
||||
theme_name = theme_configuration.get(custom_sounds)
|
||||
self.sound_directory = BASEDIR + ("/selfdrive/frogpilot/assets/custom_themes/" + theme_name + "/sounds/" if custom_sounds else "/selfdrive/assets/sounds/")
|
||||
|
||||
self.load_sounds()
|
||||
|
||||
|
||||
@@ -305,6 +305,7 @@ void ui_update_frogpilot_params(UIState *s) {
|
||||
scene.custom_colors = custom_theme ? params.getInt("CustomColors") : 0;
|
||||
scene.custom_icons = custom_theme ? params.getInt("CustomIcons") : 0;
|
||||
scene.custom_signals = custom_theme ? params.getInt("CustomSignals") : 0;
|
||||
scene.holiday_themes = custom_theme && params.getBool("HolidayThemes");
|
||||
|
||||
scene.driver_camera = params.getBool("DriverCamera");
|
||||
scene.experimental_mode_via_screen = params.getBool("ExperimentalModeViaScreen") && params.getBool("ExperimentalModeActivation");
|
||||
@@ -394,6 +395,9 @@ void UIState::update() {
|
||||
if (scene.conditional_experimental) {
|
||||
scene.conditional_status = paramsMemory.getInt("CEStatus");
|
||||
}
|
||||
if (scene.holiday_themes) {
|
||||
scene.current_holiday_theme = paramsMemory.getInt("CurrentHolidayTheme");
|
||||
}
|
||||
}
|
||||
|
||||
void UIState::setPrimeType(PrimeType type) {
|
||||
|
||||
@@ -187,6 +187,7 @@ typedef struct UIScene {
|
||||
bool full_map;
|
||||
bool hide_speed;
|
||||
bool hide_speed_ui;
|
||||
bool holiday_themes;
|
||||
bool lead_info;
|
||||
bool map_open;
|
||||
bool model_ui;
|
||||
@@ -207,6 +208,7 @@ typedef struct UIScene {
|
||||
int conditional_speed;
|
||||
int conditional_speed_lead;
|
||||
int conditional_status;
|
||||
int current_holiday_theme;
|
||||
int custom_colors;
|
||||
int custom_icons;
|
||||
int custom_signals;
|
||||
|
||||
Reference in New Issue
Block a user