Watch face selection using CMake
The list of watch face to build into the firmware is now set by CMake (-DENABLE_WATCHFACES). Fix SettingWatchFace : convert to index to/from WatchFace when needed.
This commit is contained in:
parent
12acef6a71
commit
22f6d4a40b
|
@ -489,10 +489,11 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
|
||||||
currentScreen = std::make_unique<Screens::Settings>(this, settingsController);
|
currentScreen = std::make_unique<Screens::Settings>(this, settingsController);
|
||||||
break;
|
break;
|
||||||
case Apps::SettingWatchFace: {
|
case Apps::SettingWatchFace: {
|
||||||
std::array<Screens::CheckboxList::Item, UserWatchFaceTypes::Count> items;
|
std::array<Screens::SettingWatchFace::Item, UserWatchFaceTypes::Count> items;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (const auto& userWatchFace : userWatchFaces) {
|
for (const auto& userWatchFace : userWatchFaces) {
|
||||||
items[i++] = Screens::CheckboxList::Item {userWatchFace.name, userWatchFace.isAvailable(controllers.filesystem)};
|
items[i++] =
|
||||||
|
Screens::SettingWatchFace::Item {userWatchFace.name, userWatchFace.watchFace, userWatchFace.isAvailable(controllers.filesystem)};
|
||||||
}
|
}
|
||||||
currentScreen = std::make_unique<Screens::SettingWatchFace>(this, std::move(items), settingsController, filesystem);
|
currentScreen = std::make_unique<Screens::SettingWatchFace>(this, std::move(items), settingsController, filesystem);
|
||||||
} break;
|
} break;
|
||||||
|
|
|
@ -71,12 +71,7 @@ namespace Pinetime {
|
||||||
static constexpr size_t Count = sizeof...(Ws);
|
static constexpr size_t Count = sizeof...(Ws);
|
||||||
};
|
};
|
||||||
|
|
||||||
using UserWatchFaceTypes = WatchFaceTypeList<WatchFace::Digital,
|
using UserWatchFaceTypes = WatchFaceTypeList<@WATCHFACE_TYPES@>;
|
||||||
WatchFace::Analog,
|
|
||||||
WatchFace::PineTimeStyle,
|
|
||||||
WatchFace::Terminal,
|
|
||||||
WatchFace::Infineat,
|
|
||||||
WatchFace::CasioStyleG7710>;
|
|
||||||
|
|
||||||
static_assert(UserWatchFaceTypes::Count >= 1);
|
static_assert(UserWatchFaceTypes::Count >= 1);
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,12 @@ else ()
|
||||||
set(USERAPP_TYPES "${DEFAULT_USER_APP_TYPES}" CACHE STRING "List of user apps to build into the firmware")
|
set(USERAPP_TYPES "${DEFAULT_USER_APP_TYPES}" CACHE STRING "List of user apps to build into the firmware")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if(DEFINED ENABLE_WATCHFACES)
|
||||||
|
set(WATCHFACE_TYPES ${ENABLE_WATCHFACES} CACHE STRING "List of watch faces to build into the firmware")
|
||||||
|
else()
|
||||||
|
set(WATCHFACE_TYPES "WatchFace::Digital, WatchFace::Analog, WatchFace::PineTimeStyle, WatchFace::Terminal, WatchFace::Infineat, WatchFace::CasioStyleG7710" CACHE STRING "List of watch faces to build into the firmware")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_library(infinitime_apps INTERFACE)
|
add_library(infinitime_apps INTERFACE)
|
||||||
target_sources(infinitime_apps INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/Apps.h")
|
target_sources(infinitime_apps INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/Apps.h")
|
||||||
target_include_directories(infinitime_apps INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/")
|
target_include_directories(infinitime_apps INTERFACE "${CMAKE_CURRENT_BINARY_DIR}/")
|
||||||
|
|
|
@ -9,6 +9,37 @@ using namespace Pinetime::Applications::Screens;
|
||||||
constexpr const char* SettingWatchFace::title;
|
constexpr const char* SettingWatchFace::title;
|
||||||
constexpr const char* SettingWatchFace::symbol;
|
constexpr const char* SettingWatchFace::symbol;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
uint32_t IndexOf(const std::array<Pinetime::Applications::Screens::SettingWatchFace::Item,
|
||||||
|
Pinetime::Applications::UserWatchFaceTypes::Count>& watchfaces,
|
||||||
|
Pinetime::Applications::WatchFace watchface) {
|
||||||
|
size_t index = 0;
|
||||||
|
auto found = std::find_if(watchfaces.begin(),
|
||||||
|
watchfaces.end(),
|
||||||
|
[&index, &watchface](const Pinetime::Applications::Screens::SettingWatchFace::Item& item) {
|
||||||
|
const bool result = item.watchface == watchface;
|
||||||
|
if (!result) {
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
if (found == watchfaces.end()) {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pinetime::Applications::WatchFace IndexToWatchFace(const std::array<Pinetime::Applications::Screens::SettingWatchFace::Item,
|
||||||
|
Pinetime::Applications::UserWatchFaceTypes::Count>& watchfaces,
|
||||||
|
size_t index) {
|
||||||
|
if (index >= watchfaces.size()) {
|
||||||
|
return watchfaces[0].watchface;
|
||||||
|
}
|
||||||
|
return watchfaces[index].watchface;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto SettingWatchFace::CreateScreenList() const {
|
auto SettingWatchFace::CreateScreenList() const {
|
||||||
std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
|
std::array<std::function<std::unique_ptr<Screen>()>, nScreens> screens;
|
||||||
for (size_t i = 0; i < screens.size(); i++) {
|
for (size_t i = 0; i < screens.size(); i++) {
|
||||||
|
@ -20,7 +51,7 @@ auto SettingWatchFace::CreateScreenList() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app,
|
SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app,
|
||||||
std::array<Screens::CheckboxList::Item, UserWatchFaceTypes::Count>&& watchfaceItems,
|
std::array<Screens::SettingWatchFace::Item, UserWatchFaceTypes::Count>&& watchfaceItems,
|
||||||
Pinetime::Controllers::Settings& settingsController,
|
Pinetime::Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::FS& filesystem)
|
Pinetime::Controllers::FS& filesystem)
|
||||||
: app {app},
|
: app {app},
|
||||||
|
@ -44,7 +75,8 @@ std::unique_ptr<Screen> SettingWatchFace::CreateScreen(unsigned int screenNum) c
|
||||||
if (i + (screenNum * settingsPerScreen) >= watchfaceItems.size()) {
|
if (i + (screenNum * settingsPerScreen) >= watchfaceItems.size()) {
|
||||||
watchfacesOnThisScreen[i] = {"", false};
|
watchfacesOnThisScreen[i] = {"", false};
|
||||||
} else {
|
} else {
|
||||||
watchfacesOnThisScreen[i] = watchfaceItems[i + (screenNum * settingsPerScreen)];
|
auto& item = watchfaceItems[i + (screenNum * settingsPerScreen)];
|
||||||
|
watchfacesOnThisScreen[i] = Screens::CheckboxList::Item {item.name, item.enabled};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,9 +85,9 @@ std::unique_ptr<Screen> SettingWatchFace::CreateScreen(unsigned int screenNum) c
|
||||||
nScreens,
|
nScreens,
|
||||||
title,
|
title,
|
||||||
symbol,
|
symbol,
|
||||||
static_cast<uint32_t>(settingsController.GetWatchFace()),
|
static_cast<uint32_t>(IndexOf(watchfaceItems, settingsController.GetWatchFace())),
|
||||||
[&settings = settingsController](uint32_t index) {
|
[this, &settings = settingsController](uint32_t index) {
|
||||||
settings.SetWatchFace(static_cast<WatchFace>(index));
|
settings.SetWatchFace(IndexToWatchFace(watchfaceItems, index));
|
||||||
settings.SaveSettings();
|
settings.SaveSettings();
|
||||||
},
|
},
|
||||||
watchfacesOnThisScreen);
|
watchfacesOnThisScreen);
|
||||||
|
|
|
@ -19,8 +19,14 @@ namespace Pinetime {
|
||||||
|
|
||||||
class SettingWatchFace : public Screen {
|
class SettingWatchFace : public Screen {
|
||||||
public:
|
public:
|
||||||
|
struct Item {
|
||||||
|
const char* name;
|
||||||
|
WatchFace watchface;
|
||||||
|
bool enabled;
|
||||||
|
};
|
||||||
|
|
||||||
SettingWatchFace(DisplayApp* app,
|
SettingWatchFace(DisplayApp* app,
|
||||||
std::array<Screens::CheckboxList::Item, UserWatchFaceTypes::Count>&& watchfaceItems,
|
std::array<Item, UserWatchFaceTypes::Count>&& watchfaceItems,
|
||||||
Pinetime::Controllers::Settings& settingsController,
|
Pinetime::Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::FS& filesystem);
|
Pinetime::Controllers::FS& filesystem);
|
||||||
~SettingWatchFace() override;
|
~SettingWatchFace() override;
|
||||||
|
@ -33,7 +39,7 @@ namespace Pinetime {
|
||||||
std::unique_ptr<Screen> CreateScreen(unsigned int screenNum) const;
|
std::unique_ptr<Screen> CreateScreen(unsigned int screenNum) const;
|
||||||
|
|
||||||
static constexpr int settingsPerScreen = 4;
|
static constexpr int settingsPerScreen = 4;
|
||||||
std::array<Screens::CheckboxList::Item, UserWatchFaceTypes::Count> watchfaceItems;
|
std::array<Item, UserWatchFaceTypes::Count> watchfaceItems;
|
||||||
static constexpr int nScreens = UserWatchFaceTypes::Count > 0 ? (UserWatchFaceTypes ::Count - 1) / settingsPerScreen + 1 : 1;
|
static constexpr int nScreens = UserWatchFaceTypes::Count > 0 ? (UserWatchFaceTypes ::Count - 1) / settingsPerScreen + 1 : 1;
|
||||||
|
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user