[FL-2537, FL-2539, FL-2534, FL-2534, FL-2525]: UI and UX improvements (#1246)

* FL-2537: ON/OFF buttons
* FL-2539: cancelable lowbatt shutdown
* FL-2534: update storage format results screen, cleanup dialog_ex usage.
* FL-2534: storage setting UX rework
* FL-2525: unify arrows icons
* Remove unused icons
* UI: Rename Ok to OK
This commit is contained in:
あく
2022-05-19 19:07:45 +03:00
committed by GitHub
parent 513d098051
commit 9c3f465afd
31 changed files with 122 additions and 145 deletions

View File

@@ -80,7 +80,7 @@ static bool bt_pin_code_verify_event_handler(Bt* bt, uint32_t pin) {
string_init_printf(pin_str, "Verify code\n%06d", pin);
dialog_message_set_text(
bt->dialog_message, string_get_cstr(pin_str), 64, 4, AlignCenter, AlignTop);
dialog_message_set_buttons(bt->dialog_message, "Cancel", "Ok", NULL);
dialog_message_set_buttons(bt->dialog_message, "Cancel", "OK", NULL);
DialogMessageButton button = dialog_message_show(bt->dialogs, bt->dialog_message);
string_clear(pin_str);
return button == DialogMessageButtonCenter;

View File

@@ -125,7 +125,9 @@ static void desktop_view_locked_draw(Canvas* canvas, void* model) {
canvas_set_font(canvas, FontSecondary);
elements_bold_rounded_frame(canvas, 14, 2 + STATUS_BAR_Y_SHIFT, 99, 48);
elements_multiline_text(canvas, 65, 20 + STATUS_BAR_Y_SHIFT, "To unlock\npress:");
canvas_draw_icon(canvas, 65, 36 + STATUS_BAR_Y_SHIFT, &I_Back3_45x8);
canvas_draw_icon(canvas, 65, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8);
canvas_draw_icon(canvas, 80, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8);
canvas_draw_icon(canvas, 95, 36 + STATUS_BAR_Y_SHIFT, &I_Pin_back_arrow_10x8);
canvas_draw_icon(canvas, 16, 7 + STATUS_BAR_Y_SHIFT, &I_WarningDolphin_45x42);
canvas_draw_dot(canvas, 17, 61);
} else if(view_state == DesktopViewLockedStateUnlockedHintShown) {

View File

@@ -15,8 +15,8 @@ enum GpioOtg {
};
const char* const gpio_otg_text[GpioOtgSettingsNum] = {
"Off",
"On",
"OFF",
"ON",
};
static void gpio_scene_start_var_list_enter_callback(void* context, uint32_t index) {

View File

@@ -61,11 +61,7 @@ void ibutton_scene_read_crc_error_on_exit(void* context) {
ibutton_text_store_clear(ibutton);
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
ibutton_notification_message(ibutton, iButtonNotificationMessageRedOff);
}

View File

@@ -62,11 +62,7 @@ void ibutton_scene_read_not_key_error_on_exit(void* context) {
ibutton_text_store_clear(ibutton);
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
ibutton_notification_message(ibutton, iButtonNotificationMessageRedOff);
}

View File

@@ -76,12 +76,7 @@ void ibutton_scene_read_success_on_exit(void* context) {
ibutton_text_store_clear(ibutton);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_reset(dialog_ex);
ibutton_notification_message(ibutton, iButtonNotificationMessageGreenOff);
}

View File

@@ -59,7 +59,7 @@ static void infrared_progress_view_draw_callback(Canvas* canvas, void* _model) {
elements_multiline_text_aligned(
canvas, x + 33, y + 37, AlignCenter, AlignCenter, percents_string);
canvas_draw_icon(canvas, x + 11, y + height - 15, &I_Back_15x10);
canvas_draw_icon(canvas, x + 14, y + height - 14, &I_Pin_back_arrow_10x8);
canvas_draw_str(canvas, x + 30, y + height - 6, "= stop");
}

View File

@@ -168,10 +168,24 @@ static void power_check_low_battery(Power* power) {
}
// If battery low, update view and switch off power after timeout
if(power->battery_low) {
if(power->power_off_timeout) {
power_off_set_time_left(power->power_off, power->power_off_timeout--);
} else {
PowerOffResponse response = power_off_get_response(power->power_off);
if(response == PowerOffResponseDefault) {
if(power->power_off_timeout) {
power_off_set_time_left(power->power_off, power->power_off_timeout--);
} else {
power_off(power);
}
} else if(response == PowerOffResponseOk) {
power_off(power);
} else if(response == PowerOffResponseHide) {
view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE);
if(power->power_off_timeout) {
power_off_set_time_left(power->power_off, power->power_off_timeout--);
} else {
power_off(power);
}
} else if(response == PowerOffResponseCancel) {
view_dispatcher_switch_to_view(power->view_dispatcher, VIEW_NONE);
}
}
}

56
applications/power/power_service/views/power_off.c Executable file → Normal file
View File

@@ -7,6 +7,7 @@ struct PowerOff {
};
typedef struct {
PowerOffResponse response;
uint32_t time_left_sec;
} PowerOffModel;
@@ -21,18 +22,54 @@ static void power_off_draw_callback(Canvas* canvas, void* _model) {
canvas_draw_icon(canvas, 0, 18, &I_BatteryBody_52x28);
canvas_draw_icon(canvas, 16, 25, &I_FaceNopower_29x14);
elements_bubble(canvas, 54, 17, 70, 30);
canvas_set_font(canvas, FontSecondary);
elements_multiline_text_aligned(
canvas, 70, 23, AlignLeft, AlignTop, "Connect me\n to charger.");
snprintf(buff, sizeof(buff), "Poweroff in %lds.", model->time_left_sec);
canvas_draw_str_aligned(canvas, 64, 60, AlignCenter, AlignBottom, buff);
if(model->response == PowerOffResponseDefault) {
snprintf(buff, sizeof(buff), "Charge me!\nOff in %lds!", model->time_left_sec);
elements_multiline_text_aligned(canvas, 70, 23, AlignLeft, AlignTop, buff);
elements_button_left(canvas, "Cancel");
elements_button_center(canvas, "OK");
elements_button_right(canvas, "Hide");
} else {
snprintf(buff, sizeof(buff), "Charge me!\nDont't forget!");
elements_multiline_text_aligned(canvas, 70, 23, AlignLeft, AlignTop, buff);
canvas_draw_str_aligned(canvas, 64, 60, AlignCenter, AlignBottom, "Hold a second...");
}
}
static bool power_off_input_callback(InputEvent* event, void* context) {
PowerOff* power_off = context;
bool consumed = false;
PowerOffModel* model = view_get_model(power_off->view);
if(model->response == PowerOffResponseDefault && event->type == InputTypeShort) {
if(event->key == InputKeyOk) {
model->response = PowerOffResponseOk;
consumed = true;
} else if(event->key == InputKeyLeft) {
model->response = PowerOffResponseCancel;
consumed = true;
} else if(event->key == InputKeyRight) {
model->response = PowerOffResponseHide;
consumed = true;
}
}
view_commit_model(power_off->view, consumed);
return true;
}
PowerOff* power_off_alloc() {
PowerOff* power_off = malloc(sizeof(PowerOff));
power_off->view = view_alloc();
view_allocate_model(power_off->view, ViewModelTypeLocking, sizeof(PowerOffModel));
view_set_context(power_off->view, power_off);
view_set_draw_callback(power_off->view, power_off_draw_callback);
view_set_input_callback(power_off->view, power_off_input_callback);
return power_off;
}
@@ -55,3 +92,14 @@ void power_off_set_time_left(PowerOff* power_off, uint8_t time_left) {
return true;
});
}
PowerOffResponse power_off_get_response(PowerOff* power_off) {
furi_assert(power_off);
PowerOffResponse response;
with_view_model(
power_off->view, (PowerOffModel * model) {
response = model->response;
return false;
});
return response;
}

View File

@@ -2,6 +2,13 @@
typedef struct PowerOff PowerOff;
typedef enum {
PowerOffResponseDefault,
PowerOffResponseOk,
PowerOffResponseCancel,
PowerOffResponseHide,
} PowerOffResponse;
#include <gui/view.h>
PowerOff* power_off_alloc();
@@ -11,3 +18,5 @@ void power_off_free(PowerOff* power_off);
View* power_off_get_view(PowerOff* power_off);
void power_off_set_time_left(PowerOff* power_off, uint8_t time_left);
PowerOffResponse power_off_get_response(PowerOff* power_off);

View File

@@ -151,13 +151,7 @@ void storage_settings_scene_benchmark_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
string_reset(app->text_string);
}

View File

@@ -18,7 +18,7 @@ void storage_settings_scene_factory_reset_on_enter(void* context) {
dialog_ex_set_context(dialog_ex, app);
dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_factory_reset_dialog_callback);
dialog_ex_set_left_button_text(dialog_ex, "Back");
dialog_ex_set_left_button_text(dialog_ex, "Cancel");
dialog_ex_set_right_button_text(dialog_ex, "Erase");
dialog_ex_set_header(dialog_ex, "Confirm Factory Reset", 64, 10, AlignCenter, AlignCenter);
@@ -70,7 +70,10 @@ bool storage_settings_scene_factory_reset_on_event(void* context, SceneManagerEv
consumed = true;
break;
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = true;
}
return consumed;
}
@@ -78,13 +81,7 @@ void storage_settings_scene_factory_reset_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
string_reset(app->text_string);
}

View File

@@ -57,11 +57,5 @@ void storage_settings_scene_format_confirm_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
}

View File

@@ -39,18 +39,17 @@ void storage_settings_scene_formatting_on_enter(void* context) {
notification_message(app->notification, &sequence_reset_formatting_leds);
notification_message(app->notification, &sequence_blink_green_100);
dialog_ex_set_context(dialog_ex, app);
dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_formatting_dialog_callback);
if(error != FSE_OK) {
dialog_ex_set_header(dialog_ex, "Cannot format SD Card", 64, 10, AlignCenter, AlignCenter);
dialog_ex_set_text(
dialog_ex, storage_error_get_desc(error), 64, 32, AlignCenter, AlignCenter);
} else {
dialog_ex_set_header(dialog_ex, "SD card formatted", 64, 10, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, "Press back to return", 64, 32, AlignCenter, AlignCenter);
dialog_ex_set_header(dialog_ex, "Format complete!", 64, 32, AlignCenter, AlignCenter);
}
dialog_ex_set_context(dialog_ex, app);
dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_formatting_dialog_callback);
dialog_ex_set_left_button_text(dialog_ex, "Back");
dialog_ex_set_center_button_text(dialog_ex, "OK");
}
bool storage_settings_scene_formatting_on_event(void* context, SceneManagerEvent event) {
@@ -59,14 +58,13 @@ bool storage_settings_scene_formatting_on_event(void* context, SceneManagerEvent
if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) {
case DialogExResultLeft:
case DialogExResultCenter:
consumed = scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, StorageSettingsStart);
break;
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, StorageSettingsStart);
consumed = true;
}
return consumed;
@@ -76,11 +74,5 @@ void storage_settings_scene_formatting_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
}

View File

@@ -18,7 +18,6 @@ void storage_settings_scene_internal_info_on_enter(void* context) {
dialog_ex_set_context(dialog_ex, app);
dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_internal_info_dialog_callback);
dialog_ex_set_left_button_text(dialog_ex, "Back");
if(error != FSE_OK) {
dialog_ex_set_header(
dialog_ex, "Internal storage error", 64, 10, AlignCenter, AlignCenter);
@@ -56,13 +55,7 @@ void storage_settings_scene_internal_info_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
string_reset(app->text_string);
}

View File

@@ -15,7 +15,6 @@ void storage_settings_scene_sd_info_on_enter(void* context) {
dialog_ex_set_context(dialog_ex, app);
dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_sd_info_dialog_callback);
dialog_ex_set_left_button_text(dialog_ex, "Back");
if(sd_status != FSE_OK) {
dialog_ex_set_header(dialog_ex, "SD card not mounted", 64, 10, AlignCenter, AlignCenter);
dialog_ex_set_text(
@@ -62,13 +61,7 @@ void storage_settings_scene_sd_info_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
string_reset(app->text_string);
}

View File

@@ -11,9 +11,9 @@ void storage_settings_scene_unmount_confirm_on_enter(void* context) {
StorageSettings* app = context;
FS_Error sd_status = storage_sd_status(app->fs_api);
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_left_button_text(dialog_ex, "Back");
if(sd_status == FSE_NOT_READY) {
dialog_ex_set_center_button_text(dialog_ex, "OK");
dialog_ex_set_header(dialog_ex, "SD card not mounted", 64, 10, AlignCenter, AlignCenter);
dialog_ex_set_text(
dialog_ex,
@@ -23,6 +23,7 @@ void storage_settings_scene_unmount_confirm_on_enter(void* context) {
AlignCenter,
AlignCenter);
} else {
dialog_ex_set_left_button_text(dialog_ex, "Cancel");
dialog_ex_set_right_button_text(dialog_ex, "Unmount");
dialog_ex_set_header(dialog_ex, "Unmount SD card?", 64, 10, AlignCenter, AlignCenter);
dialog_ex_set_text(
@@ -42,6 +43,9 @@ bool storage_settings_scene_unmount_confirm_on_event(void* context, SceneManager
if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) {
case DialogExResultCenter:
consumed = scene_manager_previous_scene(app->scene_manager);
break;
case DialogExResultLeft:
consumed = scene_manager_previous_scene(app->scene_manager);
break;
@@ -50,7 +54,10 @@ bool storage_settings_scene_unmount_confirm_on_event(void* context, SceneManager
consumed = true;
break;
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = true;
}
return consumed;
}
@@ -58,11 +65,5 @@ void storage_settings_scene_unmount_confirm_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
}

View File

@@ -12,7 +12,7 @@ void storage_settings_scene_unmounted_on_enter(void* context) {
FS_Error error = storage_sd_unmount(app->fs_api);
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_left_button_text(dialog_ex, "Back");
dialog_ex_set_center_button_text(dialog_ex, "OK");
if(error == FSE_OK) {
dialog_ex_set_header(dialog_ex, "SD card unmounted", 64, 10, AlignCenter, AlignCenter);
@@ -39,14 +39,13 @@ bool storage_settings_scene_unmounted_on_event(void* context, SceneManagerEvent
if(event.type == SceneManagerEventTypeCustom) {
switch(event.event) {
case DialogExResultLeft:
case DialogExResultCenter:
consumed = scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, StorageSettingsStart);
break;
}
} else if(event.type == SceneManagerEventTypeBack) {
consumed = scene_manager_search_and_switch_to_previous_scene(
app->scene_manager, StorageSettingsStart);
consumed = true;
}
return consumed;
@@ -56,11 +55,5 @@ void storage_settings_scene_unmounted_on_exit(void* context) {
StorageSettings* app = context;
DialogEx* dialog_ex = app->dialog_ex;
dialog_ex_set_header(dialog_ex, NULL, 0, 0, AlignCenter, AlignCenter);
dialog_ex_set_text(dialog_ex, NULL, 0, 0, AlignCenter, AlignTop);
dialog_ex_set_icon(dialog_ex, 0, 0, NULL);
dialog_ex_set_left_button_text(dialog_ex, NULL);
dialog_ex_set_right_button_text(dialog_ex, NULL);
dialog_ex_set_result_callback(dialog_ex, NULL);
dialog_ex_set_context(dialog_ex, NULL);
dialog_ex_reset(dialog_ex);
}

View File

@@ -37,7 +37,7 @@ void subghz_scene_show_error_on_enter(void* context) {
if(scene_manager_get_scene_state(subghz->scene_manager, SubGhzSceneShowError) ==
SubGhzCustomEventManagerSet) {
widget_add_button_element(
subghz->widget, GuiButtonTypeRight, "Ok", subghz_scene_show_error_callback, subghz);
subghz->widget, GuiButtonTypeRight, "OK", subghz_scene_show_error_callback, subghz);
} else {
notification_message(subghz->notifications, &subghs_sequence_sd_error);
}

View File

@@ -30,8 +30,8 @@ static void log_level_changed(VariableItem* item) {
}
const char* const debug_text[] = {
"Disable",
"Enable",
"OFF",
"ON",
};
static void debug_changed(VariableItem* item) {