created a working quick ring setting gui
This commit is contained in:
parent
8a40eaa9c5
commit
e19e870290
@ -13,6 +13,7 @@ namespace Pinetime {
|
||||
enum class Notification : uint8_t { On, Off, Sleep };
|
||||
enum class ChimesOption : uint8_t { None, Hours, HalfHours };
|
||||
enum class WakeUpMode : uint8_t { SingleTap = 0, DoubleTap = 1, RaiseWrist = 2, Shake = 3, LowerWrist = 4 };
|
||||
enum class QuickApp : uint8_t { MusicPlayer = 0, Calculator = 1, Flashlight = 2, Step = 3, HeartRate = 4 }; //, Alarm = 5, Timer = 6, Stopwatch = 7 };
|
||||
enum class Colors : uint8_t {
|
||||
White,
|
||||
Silver,
|
||||
@ -241,6 +242,34 @@ namespace Pinetime {
|
||||
return getWakeUpModes()[static_cast<size_t>(mode)];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// New Settings
|
||||
void SetQuickRModes(QuickApp App_now, bool enabled) {
|
||||
if (enabled != isQuickROn(App_now)) {
|
||||
settingsChanged = true;
|
||||
}
|
||||
settings.quickApp.set(static_cast<size_t>(App_now), enabled);
|
||||
};
|
||||
|
||||
std::bitset<5> getQuickRModes() const {
|
||||
return settings.quickApp;
|
||||
}
|
||||
|
||||
bool isQuickROn(const QuickApp app_holder) const {
|
||||
return getQuickRModes()[static_cast<size_t>(app_holder)];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void SetBrightness(Controllers::BrightnessController::Levels level) {
|
||||
if (level != settings.brightLevel) {
|
||||
settingsChanged = true;
|
||||
@ -279,6 +308,7 @@ namespace Pinetime {
|
||||
struct SettingsData {
|
||||
uint32_t version = settingsVersion;
|
||||
uint32_t stepsGoal = 10000;
|
||||
uint32_t setquickr = 10000;
|
||||
uint32_t screenTimeOut = 15000;
|
||||
|
||||
ClockType clockType = ClockType::H24;
|
||||
@ -292,6 +322,7 @@ namespace Pinetime {
|
||||
WatchFaceInfineat watchFaceInfineat;
|
||||
|
||||
std::bitset<5> wakeUpMode {0};
|
||||
std::bitset<5> quickApp {0};
|
||||
uint16_t shakeWakeThreshold = 150;
|
||||
|
||||
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
|
||||
|
@ -38,7 +38,8 @@ namespace Pinetime {
|
||||
SettingShakeThreshold,
|
||||
SettingBluetooth,
|
||||
Error,
|
||||
Calculator
|
||||
Calculator,
|
||||
SettingQuickR
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "displayapp/screens/settings/SettingChimes.h"
|
||||
#include "displayapp/screens/settings/SettingShakeThreshold.h"
|
||||
#include "displayapp/screens/settings/SettingBluetooth.h"
|
||||
#include "displayapp/screens/settings/SettingQuickR.h"
|
||||
|
||||
#include "libs/lv_conf.h"
|
||||
|
||||
@ -293,6 +294,11 @@ void DisplayApp::Refresh() {
|
||||
}
|
||||
};
|
||||
|
||||
std::bitset<5> quick_app = settingsController.getQuickRModes();
|
||||
bool value = (quick_app[0] ? 1 : 0 );
|
||||
NRF_LOG_INFO("Value of Quick app: %i", value);
|
||||
|
||||
|
||||
if (!currentScreen->OnTouchEvent(gesture)) {
|
||||
if (currentApp == Apps::Clock || currentApp == Apps::Music || currentApp == Apps::Calculator || currentApp == Apps::QuickSettings) {
|
||||
switch (gesture) {
|
||||
@ -313,18 +319,18 @@ void DisplayApp::Refresh() {
|
||||
case TouchEvents::SwipeRight:
|
||||
if (currentApp == Apps::Clock) {
|
||||
LoadNewScreen(Apps::QuickSettings, DisplayApp::FullRefreshDirections::RightAnim);
|
||||
} else if (currentApp == Apps::QuickSettings) {
|
||||
} else if (currentApp == Apps::QuickSettings && quick_app[1]) {
|
||||
LoadNewScreen(Apps::Calculator, DisplayApp::FullRefreshDirections::RightAnim);
|
||||
} else if (currentApp == Apps::Calculator) {
|
||||
} else if (currentApp == Apps::Calculator && quick_app[0]) {
|
||||
LoadNewScreen(Apps::Music, DisplayApp::FullRefreshDirections::RightAnim);
|
||||
} else {
|
||||
LoadNewScreen(Apps::Clock, DisplayApp::FullRefreshDirections::RightAnim);
|
||||
}
|
||||
break;
|
||||
case TouchEvents::SwipeLeft:
|
||||
if (currentApp == Apps::Clock) {
|
||||
if (currentApp == Apps::Clock && quick_app[0]) {
|
||||
LoadNewScreen(Apps::Music, DisplayApp::FullRefreshDirections::LeftAnim);
|
||||
} else if (currentApp == Apps::Music) {
|
||||
} else if (currentApp == Apps::Music && quick_app[1]) {
|
||||
LoadNewScreen(Apps::Calculator, DisplayApp::FullRefreshDirections::LeftAnim);
|
||||
} else if (currentApp == Apps::Calculator) {
|
||||
LoadNewScreen(Apps::QuickSettings, DisplayApp::FullRefreshDirections::LeftAnim);
|
||||
@ -583,6 +589,9 @@ void DisplayApp::LoadScreen(Apps app, DisplayApp::FullRefreshDirections directio
|
||||
case Apps::Calculator:
|
||||
currentScreen = std::make_unique<Screens::Calculator>();
|
||||
break;
|
||||
case Apps::SettingQuickR:
|
||||
currentScreen = std::make_unique<Screens::SettingQuickR>(settingsController);
|
||||
break;
|
||||
}
|
||||
currentApp = app;
|
||||
}
|
||||
|
77
src/displayapp/screens/settings/SettingQuickR.cpp
Normal file
77
src/displayapp/screens/settings/SettingQuickR.cpp
Normal file
@ -0,0 +1,77 @@
|
||||
#include "displayapp/screens/settings/SettingQuickR.h"
|
||||
#include <lvgl/lvgl.h>
|
||||
#include "displayapp/DisplayApp.h"
|
||||
#include "displayapp/screens/Symbols.h"
|
||||
#include "displayapp/InfiniTimeTheme.h"
|
||||
|
||||
using namespace Pinetime::Applications::Screens;
|
||||
|
||||
|
||||
|
||||
namespace {
|
||||
void event_handler(lv_obj_t* obj, lv_event_t event) {
|
||||
auto* screen = static_cast<SettingQuickR*>(obj->user_data);
|
||||
if (event == LV_EVENT_VALUE_CHANGED) {
|
||||
screen->UpdateSelected(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SettingQuickR::SettingQuickR(Pinetime::Controllers::Settings& settingsController) : settingsController {settingsController} {
|
||||
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr);
|
||||
|
||||
lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
|
||||
lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10);
|
||||
lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
|
||||
lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||
|
||||
lv_obj_set_pos(container1, 10, 35);
|
||||
lv_obj_set_width(container1, LV_HOR_RES - 20);
|
||||
lv_obj_set_height(container1, LV_VER_RES - 20);
|
||||
lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
|
||||
|
||||
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
|
||||
lv_label_set_text_static(title, "Quick Ring");
|
||||
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
|
||||
lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15);
|
||||
|
||||
lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr);
|
||||
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
|
||||
lv_label_set_text_static(icon, Symbols::check);
|
||||
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
|
||||
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
||||
|
||||
for (unsigned int i = 0; i < options.size(); i++) {
|
||||
cbOption[i] = lv_checkbox_create(container1, nullptr);
|
||||
lv_checkbox_set_text(cbOption[i], options[i].name);
|
||||
if (settingsController.isQuickROn(static_cast<Controllers::Settings::QuickApp>(i))) {
|
||||
lv_checkbox_set_checked(cbOption[i], true);
|
||||
}
|
||||
cbOption[i]->user_data = this;
|
||||
lv_obj_set_event_cb(cbOption[i], event_handler);
|
||||
}
|
||||
}
|
||||
|
||||
SettingQuickR::~SettingQuickR() {
|
||||
lv_obj_clean(lv_scr_act());
|
||||
settingsController.SaveSettings();
|
||||
}
|
||||
|
||||
void SettingQuickR::UpdateSelected(lv_obj_t* object) {
|
||||
// Find the index of the checkbox that triggered the event
|
||||
for (size_t i = 0; i < options.size(); i++) {
|
||||
if (cbOption[i] == object) {
|
||||
bool currentState = settingsController.isQuickROn(options[i].quickApp);
|
||||
settingsController.SetQuickRModes(options[i].quickApp, !currentState);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Update checkbox according to current wakeup modes.
|
||||
// This is needed because we can have extra logic when setting or unsetting wakeup modes,
|
||||
// for example, when setting SingleTap, DoubleTap is unset and vice versa.
|
||||
auto modes = settingsController.getQuickRModes();
|
||||
for (size_t i = 0; i < options.size(); ++i) {
|
||||
lv_checkbox_set_checked(cbOption[i], modes[i]);
|
||||
}
|
||||
}
|
42
src/displayapp/screens/settings/SettingQuickR.h
Normal file
42
src/displayapp/screens/settings/SettingQuickR.h
Normal file
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <cstdint>
|
||||
#include <lvgl/lvgl.h>
|
||||
#include "components/settings/Settings.h"
|
||||
#include "displayapp/screens/Screen.h"
|
||||
|
||||
namespace Pinetime {
|
||||
|
||||
namespace Applications {
|
||||
namespace Screens {
|
||||
|
||||
class SettingQuickR : public Screen {
|
||||
public:
|
||||
SettingQuickR(Pinetime::Controllers::Settings& settingsController);
|
||||
~SettingQuickR() override;
|
||||
void UpdateSelected(lv_obj_t* object);
|
||||
|
||||
private:
|
||||
struct Option {
|
||||
Controllers::Settings::QuickApp quickApp;
|
||||
const char* name;
|
||||
};
|
||||
|
||||
static constexpr std::array<Option, 5> options = {{
|
||||
{Controllers::Settings::QuickApp::MusicPlayer, "Music Player"},
|
||||
{Controllers::Settings::QuickApp::Calculator, "Calculator"},
|
||||
{Controllers::Settings::QuickApp::Flashlight, "Flashlight"},
|
||||
{Controllers::Settings::QuickApp::Step, "Steps"},
|
||||
{Controllers::Settings::QuickApp::HeartRate, "Heart Rate"},
|
||||
// {Controllers::Settings::QuickApp::Alarm, "Alarm"},
|
||||
// {Controllers::Settings::QuickApp::Timer, "Timer"},
|
||||
// {Controllers::Settings::QuickApp::Stopwatch, "Stopwatch"},
|
||||
}};
|
||||
|
||||
lv_obj_t* cbOption[options.size()];
|
||||
Controllers::Settings& settingsController;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@ -29,7 +29,7 @@ namespace Pinetime {
|
||||
static constexpr int entriesPerScreen = 4;
|
||||
|
||||
// Increment this when more space is needed
|
||||
static constexpr int nScreens = 3;
|
||||
static constexpr int nScreens = 4;
|
||||
|
||||
static constexpr std::array<List::Applications, entriesPerScreen * nScreens> entries {{
|
||||
{Symbols::sun, "Display", Apps::SettingDisplay},
|
||||
@ -40,11 +40,14 @@ namespace Pinetime {
|
||||
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||
{Symbols::clock, "Date&Time", Apps::SettingSetDateTime},
|
||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
|
||||
{Symbols::clock, "Chimes", Apps::SettingChimes},
|
||||
{Symbols::check, "QuickRing", Apps::SettingQuickR},
|
||||
|
||||
|
||||
{Symbols::clock, "Chimes", Apps::SettingChimes},
|
||||
{Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold},
|
||||
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
||||
{Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth},
|
||||
|
||||
{Symbols::list, "About", Apps::SysInfo},
|
||||
|
||||
// {Symbols::none, "None", Apps::None},
|
||||
|
Loading…
Reference in New Issue
Block a user