diff options
Diffstat (limited to 'apps/settings.c')
-rw-r--r-- | apps/settings.c | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/apps/settings.c b/apps/settings.c index 23b81173bd..e8963b05df 100644 --- a/apps/settings.c +++ b/apps/settings.c | |||
@@ -1245,6 +1245,194 @@ bool set_int(const unsigned char* string, | |||
1245 | return set_int_ex(string, unit, voice_unit, variable, function, | 1245 | return set_int_ex(string, unit, voice_unit, variable, function, |
1246 | step, min, max, formatter, NULL); | 1246 | step, min, max, formatter, NULL); |
1247 | } | 1247 | } |
1248 | |||
1249 | /* Useful for time and other multi integer settings */ | ||
1250 | bool set_multi_int(const char* string, | ||
1251 | const struct opt_items * names, | ||
1252 | struct opt_settings * variable, | ||
1253 | int varcount, | ||
1254 | bool *changes_accepted) | ||
1255 | { | ||
1256 | int i, j, w, h; | ||
1257 | char buf[32]; | ||
1258 | long button; | ||
1259 | int cursor = 0; | ||
1260 | bool done = false; | ||
1261 | int value[varcount]; | ||
1262 | int pos = 0; | ||
1263 | |||
1264 | /* store current values in temp array */ | ||
1265 | for(j = 0; j < varcount; j++) | ||
1266 | value[j] = *(int*)variable[j].setting; | ||
1267 | |||
1268 | /* initialize screen */ | ||
1269 | FOR_NB_SCREENS(i) | ||
1270 | { | ||
1271 | screens[i].clear_display(); | ||
1272 | #ifdef HAVE_LCD_BITMAP | ||
1273 | screens[i].setmargins(0, 8); | ||
1274 | #endif | ||
1275 | } | ||
1276 | |||
1277 | gui_syncstatusbar_draw(&statusbars, true); | ||
1278 | |||
1279 | FOR_NB_SCREENS(i) | ||
1280 | screens[i].getstringsize("3", &w, &h); | ||
1281 | |||
1282 | /* print title */ | ||
1283 | snprintf(buf, sizeof(buf), "%s", string); | ||
1284 | FOR_NB_SCREENS(i) | ||
1285 | screens[i].puts(0, 0, buf); | ||
1286 | |||
1287 | /* print variable names */ | ||
1288 | for(j = 0; j < varcount ; j++) | ||
1289 | { | ||
1290 | if (j > 0) | ||
1291 | { | ||
1292 | snprintf(buf, sizeof(buf), ":"); | ||
1293 | FOR_NB_SCREENS(i) | ||
1294 | screens[i].puts(pos - 2, 1, buf); | ||
1295 | } | ||
1296 | |||
1297 | snprintf(buf, sizeof(buf), "%s", P2STR(names[j].string)); | ||
1298 | FOR_NB_SCREENS(i) | ||
1299 | screens[i].puts(pos, 1, buf); | ||
1300 | |||
1301 | pos += strlen(buf) + 3; | ||
1302 | } | ||
1303 | |||
1304 | /* print button instructions */ | ||
1305 | snprintf(buf, sizeof(buf), "%s", str(LANG_MULTIINT_CONFIRM)); | ||
1306 | FOR_NB_SCREENS(i) | ||
1307 | screens[i].puts(0, 5, buf); | ||
1308 | |||
1309 | while(!done) | ||
1310 | { | ||
1311 | pos = 0; | ||
1312 | |||
1313 | /* print variables */ | ||
1314 | for(j = 0; j < varcount; j++) | ||
1315 | { | ||
1316 | if (j > 0) | ||
1317 | { | ||
1318 | snprintf(buf, sizeof(buf), " :"); | ||
1319 | FOR_NB_SCREENS(i) | ||
1320 | screens[i].puts(pos - 3, 3, buf); | ||
1321 | } | ||
1322 | |||
1323 | snprintf(buf, sizeof(buf), "%d", value[j]); | ||
1324 | |||
1325 | FOR_NB_SCREENS(i) | ||
1326 | screens[i].puts(pos, 3, buf); | ||
1327 | |||
1328 | snprintf(buf, sizeof(buf), "%d", variable[j].setting_max); | ||
1329 | |||
1330 | #ifdef HAVE_LCD_BITMAP | ||
1331 | /* highlight currently selected integer */ | ||
1332 | if (cursor == j) | ||
1333 | { | ||
1334 | FOR_NB_SCREENS(i) | ||
1335 | { | ||
1336 | screens[i].set_drawmode(DRMODE_COMPLEMENT); | ||
1337 | screens[i].fillrect(pos * w - 1, 8 + 3 * h, | ||
1338 | strlen(buf)*w + 1, h); | ||
1339 | screens[i].set_drawmode(DRMODE_SOLID); | ||
1340 | } | ||
1341 | } | ||
1342 | #endif | ||
1343 | |||
1344 | pos += strlen(buf) + 3; | ||
1345 | } | ||
1346 | |||
1347 | #ifdef HAVE_LCD_BITMAP | ||
1348 | FOR_NB_SCREENS(i) | ||
1349 | screens[i].update(); | ||
1350 | #endif | ||
1351 | |||
1352 | button = get_action(CONTEXT_SETTINGS, TIMEOUT_BLOCK); | ||
1353 | |||
1354 | switch (button) | ||
1355 | { | ||
1356 | case ACTION_STD_NEXT: | ||
1357 | cursor ++; | ||
1358 | |||
1359 | if (cursor >= varcount) | ||
1360 | cursor = varcount - 1; | ||
1361 | |||
1362 | if (global_settings.talk_menu) | ||
1363 | talk_id(names[cursor].voice_id, false); | ||
1364 | break; | ||
1365 | |||
1366 | case ACTION_STD_PREV: | ||
1367 | /* cancel if pressing left when cursor | ||
1368 | is already at the far left */ | ||
1369 | if (cursor == 0) | ||
1370 | { | ||
1371 | *changes_accepted = false; | ||
1372 | gui_syncsplash(HZ/2, str(LANG_MENU_SETTING_CANCEL)); | ||
1373 | done = true; | ||
1374 | } | ||
1375 | else | ||
1376 | { | ||
1377 | cursor --; | ||
1378 | |||
1379 | if (cursor < 0) | ||
1380 | cursor = 0; | ||
1381 | |||
1382 | if (global_settings.talk_menu) | ||
1383 | talk_id(names[cursor].voice_id, false); | ||
1384 | } | ||
1385 | break; | ||
1386 | |||
1387 | case ACTION_SETTINGS_INC: | ||
1388 | case ACTION_SETTINGS_INCREPEAT: | ||
1389 | value[cursor] += 1; | ||
1390 | |||
1391 | if (value[cursor] > variable[cursor].setting_max) | ||
1392 | value[cursor] = 0; | ||
1393 | |||
1394 | if (global_settings.talk_menu) | ||
1395 | talk_unit(INT, value[cursor], NULL); | ||
1396 | break; | ||
1397 | |||
1398 | case ACTION_SETTINGS_DEC: | ||
1399 | case ACTION_SETTINGS_DECREPEAT: | ||
1400 | value[cursor] -= 1; | ||
1401 | |||
1402 | if (value[cursor] < 0) | ||
1403 | value[cursor] = variable[cursor].setting_max; | ||
1404 | |||
1405 | if (global_settings.talk_menu) | ||
1406 | talk_unit(INT, value[cursor], NULL); | ||
1407 | break; | ||
1408 | |||
1409 | case ACTION_STD_OK: | ||
1410 | *changes_accepted = true; | ||
1411 | done = true; | ||
1412 | break; | ||
1413 | |||
1414 | case ACTION_STD_CANCEL: | ||
1415 | *changes_accepted = false; | ||
1416 | gui_syncsplash(HZ/2, str(LANG_MENU_SETTING_CANCEL)); | ||
1417 | done = true; | ||
1418 | |||
1419 | default: | ||
1420 | if (default_event_handler(button) == SYS_USB_CONNECTED) | ||
1421 | return true; | ||
1422 | } | ||
1423 | } | ||
1424 | /* store values if accepted */ | ||
1425 | if(*changes_accepted) | ||
1426 | { | ||
1427 | for(j = 0; j < varcount; j++) | ||
1428 | *(int*)variable[j].setting = value[j]; | ||
1429 | } | ||
1430 | |||
1431 | action_signalscreenchange(); | ||
1432 | |||
1433 | return false; | ||
1434 | } | ||
1435 | |||
1248 | /* NOTE: the 'type' parameter specifies the actual type of the variable | 1436 | /* NOTE: the 'type' parameter specifies the actual type of the variable |
1249 | that 'variable' points to. not the value within. Only variables with | 1437 | that 'variable' points to. not the value within. Only variables with |
1250 | type 'bool' should use parameter BOOL. | 1438 | type 'bool' should use parameter BOOL. |