jenya7 0 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба У меня на экране сначала загружается главный экран с разделами меню. Потом я кнопками выбираю раздел и если я нажимаю ENTER появляется другой экран со своими разделами меню. Я могу вернутся на предыдущий экран и предыдущий выбранный раздел должен быть подсвечен. Вопрос где хранить индекс текущего выбранного экрана и индекс выбранного раздела в нем? Сделать массив индексов экрана и в каждом экране массив разделов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба У меня на экране сначала загружается главный экран с разделами меню. Потом я кнопками выбираю раздел и если я нажимаю ENTER появляется другой экран со своими разделами меню. Я могу вернутся на предыдущий экран и предыдущий выбранный раздел должен быть подсвечен. Вопрос где хранить индекс текущего выбранного экрана и индекс выбранного раздела в нем? Сделать массив индексов экрана и в каждом экране массив разделов? Я делаю так. Вся управляющая программа должна быть описана как самый верхний автомат состояний. И каким-то состояниям этого автомата должны быть приписаны разные экраны. В некоторых экранах есть "меню", которые тоже представляют собой автоматы состояний. И, соотв. каждому состоянию должно быть приписано условие отображения на этом экране. Нижние автоматы передают верхнему свое состояние или флаги. Как только сделаете чтобы отображение соответствовало состоянию автомата, так все далее будет легко и просто... Состояние главного автомата покажет, какой экран активный и в какой экран можно переходить, а в какой - нельзя. Соотв. нижний автомат покажет, какой пункт меню был нажат, какой выполнен, в какой можно переходить, а в какой - нельзя... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2016 Опубликовано 25 октября, 2016 (изменено) · Жалоба Я делаю так. Вся управляющая программа должна быть описана как самый верхний автомат состояний. И каким-то состояниям этого автомата должны быть приписаны разные экраны. В некоторых экранах есть "меню", которые тоже представляют собой автоматы состояний. И, соотв. каждому состоянию должно быть приписано условие отображения на этом экране. Нижние автоматы передают верхнему свое состояние или флаги. Как только сделаете чтобы отображение соответствовало состоянию автомата, так все далее будет легко и просто... Состояние главного автомата покажет, какой экран активный и в какой экран можно переходить, а в какой - нельзя. Соотв. нижний автомат покажет, какой пункт меню был нажат, какой выполнен, в какой можно переходить, а в какой - нельзя... Но должна же быть какая то глобальная структура хранящая состояния автомата. В принципе зная выбранный экран и выбранный раздел в нем я в свиче могу перебрать все кейсы и решить какое действие предпринять. Мне нужно найти какую нибудь компактную форму хранения выбранных разделов. Не хочу создавать двойной массив. Изменено 25 октября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба Но должна же быть какая то глобальная структура хранящая состояния автомата. В принципе зная выбранный экран и выбранный раздел в нем я в свиче могу перебрать все кейсы и решить какое действие предпринять. Мне нужно найти какую нибудь компактную форму хранения выбранных разделов. Не хочу создавать двойной массив. Массив структур... Или классы состояний автомата. В главном автомате - указатель на текущий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2016 Опубликовано 25 октября, 2016 (изменено) · Жалоба а что если так typedef struct SCREEN1_S { uint8_t item_idx; }SCREEN1; typedef struct SCREEN2_S { uint8_t item_idx; }SCREEN2; typedef struct SCREEN3_S { uint8_t item_idx; }SCREEN3; typedef struct SCREENS_S { SCREEN1 scr1; SCREEN2 scr2; SCREEN3 scr3; }SCREENS; нет. структура хранит выбранный раздел меню но из нее не видно какой экран выбран. о. есть идея. можно немного модифицировать. typedef struct SCREEN1_S { uint8_t item_idx; uint8_t selected; }SCREEN1; typedef struct SCREEN2_S { uint8_t item_idx; uint8_t selected; }SCREEN2; typedef struct SCREEN3_S { uint8_t item_idx; uint8_t selected; }SCREEN3; typedef struct SCREENS_S { SCREEN1 scr1; SCREEN2 scr2; SCREEN3 scr3; }SCREENS; теперь есть индикация выбранного экрана. Изменено 25 октября, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба а что если так typedef struct SCREEN1_S { uint8_t item_idx; }SCREEN1; typedef struct SCREEN2_S { uint8_t item_idx; }SCREEN2; typedef struct SCREEN3_S { uint8_t item_idx; }SCREEN3; typedef struct SCREENS_S { SCREEN1 scr1; SCREEN2 scr2; SCREEN3 scr3; }SCREENS; Ну просто беда с Вами... Забудьте, что у Вас "экраны"... Вы же не картины в Эрмитаже рисуете. Любой Ваш "экран" - это набор примитивов графики, их координаты на экране, тексты и их координаты на экране и фон... Соответственно, определите один "экран", т.е создайте его описание как массив или структуру или класс с этими графическими примитивами... Потом соответственно, главный экран, соответствующий верхнему автомату будет содержать массив экранов и указатель на активный по состоянию главного автомата... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба Ну просто беда с Вами... Забудьте, что у Вас "экраны"... Вы же не картины в Эрмитаже рисуете. Любой Ваш "экран" - это набор примитивов графики, их координаты на экране, тексты и их координаты на экране и фон... Соответственно, определите один "экран", т.е создайте его описание как массив или структуру или класс с этими графическими примитивами... Потом соответственно, главный экран, соответствующий верхнему автомату будет содержать массив экранов и указатель на активный по состоянию главного автомата... У меня библиотека которая создает экраны. Каждый экран это набор графических элементов - кнопки, лейблы, чекбоксы, и.т.д Я могу вызвать экран и работать с графическими элементами - в моем случае это элементы типа LABEL - каждый LABEL это пункт меню. мне лишь нужно знать выбранный экран и пункт меню в нем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба У меня библиотека которая создает экраны. Каждый экран это набор графических элементов - кнопки, лейблы, чекбоксы, и.т.д Я могу вызвать экран и работать с графическими элементами - в моем случае это элементы типа LABEL - каждый LABEL это пункт меню. мне лишь нужно знать выбранный экран и пункт меню в нем. Ну вот, значит прорисовывать экран не нужно. И все же - экран - это массив " элементы типа LABEL", и любое действие с этими элементами должно возвращать указатель на то, какой элемент был активен... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба У меня на экране сначала загружается главный экран с разделами меню. Потом я кнопками выбираю раздел и если я нажимаю ENTER появляется другой экран со своими разделами меню. Я могу вернутся на предыдущий экран и предыдущий выбранный раздел должен быть подсвечен. Вопрос где хранить индекс текущего выбранного экрана и индекс выбранного раздела в нем? Сделать массив индексов экрана и в каждом экране массив разделов? Можно - как вариант, для простых реализаций. Основной элемент меню - консольный цикл. Нечто автомато-подобное :) Под ним подразумевается ввод оператором команд (Up-Down-Left-Right, Enter, Esc), вывод информации на экран, режим редактирования. В этот цикл встраивается прикладная часть, зависящая от конкретный задач в данном пункте меню. Меню строится как обычные вызовы функций, тем самым легко обеспечивается "возвращаемость" параметров и установок пунктов-разделов меню при выходе "вверх". Недостаток - разрастается стек при большой вложенности. Если требуется легко масштабируемое-изменяемое меню, то все "типовые" данные (наименования пунктов, номерация, вызываемые ф-ии итп) заносятся в массив структур. При этом сама функция, реализующая меню, будет проядка сотни строк, и ОДНА :) Вся прикладная функциональность прописывается в таблицу в виде констант, литералов, указателей на прикладные функции-"обработчики". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба Если требуется легко масштабируемое-изменяемое меню, то все "типовые" данные (наименования пунктов, номерация, вызываемые ф-ии итп) заносятся в массив структур. При этом сама функция, реализующая меню, будет проядка сотни строк, и ОДНА :) Вся прикладная функциональность прописывается в таблицу в виде констант, литералов, указателей на прикладные функции-"обработчики". мне даже не надо сохранять наименования пунктов и вызываемые функции. достаточно выбранный пункт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 25 октября, 2016 Опубликовано 25 октября, 2016 · Жалоба мне даже не надо сохранять наименования пунктов и вызываемые функции. достаточно выбранный пункт. меню сделайте как четырёхнаправленный список, тогда при возвращении наверх всегда будете знать откуда возвращаетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 26 октября, 2016 Опубликовано 26 октября, 2016 · Жалоба меню сделайте как четырёхнаправленный список, тогда при возвращении наверх всегда будете знать откуда возвращаетесь. В смысле двусвязный список, в котором есть элементы "входов" и "выходов" в списки, соотв-ие уровням меню ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 26 октября, 2016 Опубликовано 26 октября, 2016 · Жалоба меню сделайте как четырёхнаправленный список, тогда при возвращении наверх всегда будете знать откуда возвращаетесь. это как? В смысле двусвязный список, в котором есть элементы "входов" и "выходов" в списки, соотв-ие уровням меню ? это как? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 26 октября, 2016 Опубликовано 26 октября, 2016 · Жалоба Вам нужен стек, каждый элемент которого хранит номер экрана (или указатедь на экран) и номер (или указатель) текущего элемента в нем. Тогда при вызове вложенного меню вы заталкиваете в стек текущее меню и текущий элемент в нем, а при закрытии меню извлекаете из стека верхний элемент и отрисовываете Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 26 октября, 2016 Опубликовано 26 октября, 2016 · Жалоба В смысле двусвязный список, в котором есть элементы "входов" и "выходов" в списки, соотв-ие уровням меню ? У каждого элемента есть указатели на соседей для навигации в пределах списка, наверх в предыдущий уровень, и вниз в следующий. typedef const struct Menu_Item { const struct Menu_Item *Next; /**< Pointer to the next menu item of this menu item */ const struct Menu_Item *Previous; /**< Pointer to the previous menu item of this menu item */ const struct Menu_Item *Parent; /**< Pointer to the parent menu item of this menu item */ const struct Menu_Item *Child; /**< Pointer to the child menu item of this menu item */ void (*SelectCallback)(void); /**< Pointer to the optional menu-specific select callback of this menu item */ void (*EnterCallback)(void); /**< Pointer to the optional menu-specific enter callback of this menu item */ const char Text[]; /**< Menu item text to pass to the menu display callback function */ } Menu_Item_t; https://github.com/abcminiuser/micromenu-v2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться