diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 05b1175698..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,59 +0,0 @@ -{ - "files.associations": { - "chrono": "cpp", - "list": "cpp", - "array": "cpp", - "atomic": "cpp", - "bit": "cpp", - "*.tcc": "cpp", - "cctype": "cpp", - "charconv": "cpp", - "clocale": "cpp", - "cmath": "cpp", - "condition_variable": "cpp", - "cstdarg": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "ctime": "cpp", - "cwchar": "cpp", - "cwctype": "cpp", - "deque": "cpp", - "unordered_map": "cpp", - "vector": "cpp", - "exception": "cpp", - "algorithm": "cpp", - "functional": "cpp", - "iterator": "cpp", - "memory": "cpp", - "memory_resource": "cpp", - "netfwd": "cpp", - "numeric": "cpp", - "optional": "cpp", - "random": "cpp", - "ratio": "cpp", - "string": "cpp", - "string_view": "cpp", - "system_error": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "utility": "cpp", - "fstream": "cpp", - "initializer_list": "cpp", - "iosfwd": "cpp", - "iostream": "cpp", - "istream": "cpp", - "limits": "cpp", - "mutex": "cpp", - "new": "cpp", - "ostream": "cpp", - "sstream": "cpp", - "stdexcept": "cpp", - "streambuf": "cpp", - "thread": "cpp", - "cinttypes": "cpp", - "typeinfo": "cpp" - } -} \ No newline at end of file diff --git a/README.md b/README.md index 755f1905bf..d2339126c8 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ As of now, here is the list of achievements of this project: * Battery status * Firmware validation * System information + * Pushbutton action (back to previous screen and back to main screen) - Supported by 3 companion apps (development is in progress): * [Gadgetbridge](https://codeberg.org/Freeyourgadget/Gadgetbridge/) (on Android via F-Droid) * [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS and Linux) diff --git a/doc/buildAndProgram.md b/doc/buildAndProgram.md index afd526e06e..e31022737f 100644 --- a/doc/buildAndProgram.md +++ b/doc/buildAndProgram.md @@ -222,4 +222,4 @@ Loading section .sec6, size 0x10000 lma 0x30000 Loading section .sec7, size 0xdf08 lma 0x40000 Start address 0x0, load size 314200 Transfer rate: 45 KB/sec, 969 bytes/write. -``` +``` \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index aca865439e..dede987b3b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -417,6 +417,7 @@ list(APPEND SOURCE_FILES displayapp/screens/settings/Settings.cpp displayapp/screens/settings/SettingWatchFace.cpp displayapp/screens/settings/SettingTimeFormat.cpp + displayapp/screens/settings/SettingPushButtonAction.cpp displayapp/screens/settings/SettingWakeUp.cpp displayapp/screens/settings/SettingDisplay.cpp displayapp/screens/settings/SettingSteps.cpp diff --git a/src/components/settings/Settings.h b/src/components/settings/Settings.h index 4409425be4..fde617040c 100644 --- a/src/components/settings/Settings.h +++ b/src/components/settings/Settings.h @@ -9,6 +9,7 @@ namespace Pinetime { namespace Controllers { class Settings { public: + enum class SettingPushButtonAction { BACK, WATCHFACE }; enum class ClockType { H24, H12 }; enum class Vibration { ON, OFF }; enum class WakeUpMode { None, SingleTap, DoubleTap, RaiseWrist }; @@ -41,6 +42,16 @@ namespace Pinetime { return settingsMenu; }; + void SetSettingPushButtonAction(SettingPushButtonAction pushButtonAction) { + if (pushButtonAction != settings.pushButtonAction) + settingsChanged = true; + settings.pushButtonAction = pushButtonAction; + }; + SettingPushButtonAction GetSettingPushButtonAction() const { + return settings.pushButtonAction; + }; + + void SetClockType(ClockType clocktype) { if (clocktype != settings.clockType) settingsChanged = true; @@ -109,6 +120,7 @@ namespace Pinetime { WakeUpMode wakeUpMode = WakeUpMode::None; Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium; + SettingPushButtonAction pushButtonAction = SettingPushButtonAction::BACK; }; SettingsData settings; diff --git a/src/displayapp/Apps.h b/src/displayapp/Apps.h index 684e3a46b5..2346c595de 100644 --- a/src/displayapp/Apps.h +++ b/src/displayapp/Apps.h @@ -27,6 +27,7 @@ namespace Pinetime { QuickSettings, Settings, SettingWatchFace, + SettingPushButtonAction, SettingTimeFormat, SettingDisplay, SettingWakeUp, diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 04ebd2d328..bb723ea133 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -38,6 +38,7 @@ #include "displayapp/screens/settings/QuickSettings.h" #include "displayapp/screens/settings/Settings.h" #include "displayapp/screens/settings/SettingWatchFace.h" +#include "displayapp/screens/settings/SettingPushButtonAction.h" #include "displayapp/screens/settings/SettingTimeFormat.h" #include "displayapp/screens/settings/SettingWakeUp.h" #include "displayapp/screens/settings/SettingDisplay.h" @@ -199,7 +200,17 @@ void DisplayApp::Refresh() { PushMessageToSystemTask(System::Messages::GoToSleep); } else { if (!currentScreen->OnButtonPushed()) { - LoadApp(returnToApp, returnDirection); + switch (settingsController.GetSettingPushButtonAction()) + { + case Pinetime::Controllers::Settings::SettingPushButtonAction::BACK: + LoadApp(returnToApp, returnDirection); + break; + case Pinetime::Controllers::Settings::SettingPushButtonAction::WATCHFACE: + LoadApp(Apps::Clock, DisplayApp::FullRefreshDirections::LeftAnim); + break; + default: + break; + } } } break; @@ -315,6 +326,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) currentScreen = std::make_unique(this, settingsController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); break; + case Apps::SettingPushButtonAction: + currentScreen = std::make_unique(this, settingsController); + ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); + break; case Apps::SettingDisplay: currentScreen = std::make_unique(this, settingsController); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); diff --git a/src/displayapp/screens/ApplicationList.cpp b/src/displayapp/screens/ApplicationList.cpp index 78c7cd9a4b..1678fbe145 100644 --- a/src/displayapp/screens/ApplicationList.cpp +++ b/src/displayapp/screens/ApplicationList.cpp @@ -24,8 +24,7 @@ ApplicationList::ApplicationList(Pinetime::Applications::DisplayApp* app, }, [this]() -> std::unique_ptr { return CreateScreen2(); - }, - //[this]() -> std::unique_ptr { return CreateScreen3(); } + } }, Screens::ScreenListModes::UpDown} { } diff --git a/src/displayapp/screens/settings/SettingPushButtonAction.cpp b/src/displayapp/screens/settings/SettingPushButtonAction.cpp new file mode 100644 index 0000000000..a8c93d5652 --- /dev/null +++ b/src/displayapp/screens/settings/SettingPushButtonAction.cpp @@ -0,0 +1,90 @@ +#include "SettingPushButtonAction.h" +#include +#include "displayapp/DisplayApp.h" +#include "displayapp/screens/Screen.h" +#include "displayapp/screens/Symbols.h" + +using namespace Pinetime::Applications::Screens; + +namespace { + static void event_handler(lv_obj_t* obj, lv_event_t event) { + SettingPushButtonAction* screen = static_cast(obj->user_data); + screen->UpdateSelected(obj, event); + } +} + +SettingPushButtonAction::SettingPushButtonAction(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) + : Screen(app), 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, 60); + lv_obj_set_width(container1, LV_HOR_RES - 20); + lv_obj_set_height(container1, LV_VER_RES - 50); + 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, "Button action"); + 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::list); + lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER); + lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0); + + optionsTotal = 0; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " Go Back"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetSettingPushButtonAction() == Controllers::Settings::SettingPushButtonAction::BACK) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + + + optionsTotal++; + cbOption[optionsTotal] = lv_checkbox_create(container1, nullptr); + lv_checkbox_set_text_static(cbOption[optionsTotal], " Watchface"); + cbOption[optionsTotal]->user_data = this; + lv_obj_set_event_cb(cbOption[optionsTotal], event_handler); + if (settingsController.GetSettingPushButtonAction() == Controllers::Settings::SettingPushButtonAction::WATCHFACE) { + lv_checkbox_set_checked(cbOption[optionsTotal], true); + } + optionsTotal++; +} + +SettingPushButtonAction::~SettingPushButtonAction() { + lv_obj_clean(lv_scr_act()); + settingsController.SaveSettings(); +} + +bool SettingPushButtonAction::Refresh() { + return running; +} + +void SettingPushButtonAction::UpdateSelected(lv_obj_t* object, lv_event_t event) { + if (event == LV_EVENT_VALUE_CHANGED) { + for (int i = 0; i < optionsTotal; i++) { + if (object == cbOption[i]) { + lv_checkbox_set_checked(cbOption[i], true); + + if (i == 0) { + settingsController.SetSettingPushButtonAction(Controllers::Settings::SettingPushButtonAction::BACK); + }; + if (i == 1) { + settingsController.SetSettingPushButtonAction(Controllers::Settings::SettingPushButtonAction::WATCHFACE); + }; + + } else { + lv_checkbox_set_checked(cbOption[i], false); + } + } + } +} \ No newline at end of file diff --git a/src/displayapp/screens/settings/SettingPushButtonAction.h b/src/displayapp/screens/settings/SettingPushButtonAction.h new file mode 100644 index 0000000000..8f240c57da --- /dev/null +++ b/src/displayapp/screens/settings/SettingPushButtonAction.h @@ -0,0 +1,28 @@ +#pragma once + +#include +#include +#include "components/settings/Settings.h" +#include "displayapp/screens/Screen.h" + +namespace Pinetime { + + namespace Applications { + namespace Screens { + + class SettingPushButtonAction : public Screen { + public: + SettingPushButtonAction(DisplayApp* app, Pinetime::Controllers::Settings& settingsController); + ~SettingPushButtonAction() override; + + bool Refresh() override; + void UpdateSelected(lv_obj_t* object, lv_event_t event); + + private: + Controllers::Settings& settingsController; + uint8_t optionsTotal; + lv_obj_t* cbOption[2]; + }; + } + } +} diff --git a/src/displayapp/screens/settings/Settings.cpp b/src/displayapp/screens/settings/Settings.cpp index e63a35846e..f225c7cb53 100644 --- a/src/displayapp/screens/settings/Settings.cpp +++ b/src/displayapp/screens/settings/Settings.cpp @@ -18,6 +18,10 @@ Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controller }, [this]() -> std::unique_ptr { return CreateScreen2(); + } + , + [this]() -> std::unique_ptr { + return CreateScreen3(); }}, Screens::ScreenListModes::UpDown} { } @@ -45,8 +49,7 @@ std::unique_ptr Settings::CreateScreen1() { {Symbols::clock, "Time format", Apps::SettingTimeFormat}, {Symbols::clock, "Watch face", Apps::SettingWatchFace}, }}; - - return std::make_unique(0, 2, app, settingsController, applications); + return std::make_unique(0, 3, app, settingsController, applications); } std::unique_ptr Settings::CreateScreen2() { @@ -54,9 +57,19 @@ std::unique_ptr Settings::CreateScreen2() { std::array applications {{ {Symbols::shoe, "Steps", Apps::SettingSteps}, {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}, + {Symbols::list, "Button Action", Apps::SettingPushButtonAction}, {Symbols::check, "Firmware", Apps::FirmwareValidation}, - {Symbols::list, "About", Apps::SysInfo}, }}; - - return std::make_unique(1, 2, app, settingsController, applications); + return std::make_unique(1, 3, app, settingsController, applications); } + +std::unique_ptr Settings::CreateScreen3() { + + std::array applications {{ + {Symbols::list, "About", Apps::SysInfo}, + {Symbols::list, "", Apps::None}, + {Symbols::list, "", Apps::None}, + {Symbols::list, "", Apps::None}, + }}; + return std::make_unique(2, 3, app, settingsController, applications); +} \ No newline at end of file diff --git a/src/displayapp/screens/settings/Settings.h b/src/displayapp/screens/settings/Settings.h index 711a6be6d0..12dd051460 100644 --- a/src/displayapp/screens/settings/Settings.h +++ b/src/displayapp/screens/settings/Settings.h @@ -21,10 +21,11 @@ namespace Pinetime { private: Controllers::Settings& settingsController; - ScreenList<2> screens; + ScreenList<3> screens; std::unique_ptr CreateScreen1(); std::unique_ptr CreateScreen2(); + std::unique_ptr CreateScreen3(); }; } }