Statesmanager
Объект предназначен для постановки объектов в очередь выполнения единообразными командами. Можно применять для управления отображением всплывающих окон.
Содержание
Параметры
- объект открытия (obj) - объект который будет переведён в заданное состояние, если данный объект будет первым в очереди на открытие и передадим менеджеру окон состояние next;
- состояние открытия (st) - перевести выбранный объект в заданное состояние;
- объект back (obj_b) - объект который будет переведён в заданное состояние, если данный объект будет первым в очереди на закрытие и передадим менеджеру окон состояние back;
- состояние back (st_b) - перевести выбранный объект в заданное состояние.
Дополнительные параметры
изменить состояние объекта - очередь back пуста:
- объект ( obj ) - Перевести объект в состояние из следующего поля;
- состояние ( st ) - Новое состояние для объекта из предыдущего поля.
изменить состояние объекта - очередь next пуста:
- объект ( obj ) - Перевести объект в состояние из следующего поля;
- состояние ( st ) - Новое состояние для объекта из предыдущего поля.
Параметры которые мы можем считать из statesmanager
- n_back - количество событий в очереди на закрытие (не учитывая события добавленные как попапы);
- n_next - количество событий в очереди на открытие (не учитывая события добавленные как попапы).
Состояния
- add_first - добавить событие в начало очереди на открытие;
- add_first_uni - добавить событие в начало очереди на открытие, но если данное событие уже добавлено в очередь, то повторно оно не добавиться (удобно если окно не должно открываться дважды);
- add_last - добавить событие в конец очереди на открытие;
- add_last_uni - добавить событие в начало очереди на закрытие, но если данное событие уже добавлено в очередь, то повторно оно не добавиться;
- add_popup - добавить в очередь попапов событие, и сразу его открыть (добавляется в очередь беков на закрытие в начало). Примечание попапы добавляются в свою очередь на закрытие и открытие, параметры объекта statesmanagera (n_back и n_next) не повышаются при добавления попапа.
- next - активировать первое событие в очереди на открытие;
- back - активировать back для текущего события в очереди на закрытие;
- clear - очищает стек очереди, очищает обе очереди (на открытие и на закрытие, включая попапы);
- clear_back - очищает стек очереди на закрытие ( очередь окон на закрытие, очередь попапов не трогает);
- delete - удалить из очереди элемент с id из param;
- log - записывает в лог, три очереди ( очередь next и две очереди беков (попапы и окна)):
================================================== NEXT QUEUE id = 15, st = open id = 18, st = open id = 21, st = open id = 72, st = open id = 68, st = open id = 80, st = open id = 80, st = open id = 76, st = open 03/10/14 11:53:17.485: ================================================== POPUP QUEUE 03/10/14 11:53:17.485: ================================================== BACK QUEUE id = 11, st = open
Альтернативное описание состояний, взятое прямиком из кода
"idle", //!< Состояние простоя "add_first", //!< Добавить событие в начало очереди "add_last", //!< Добавить событие в конец очереди "add_first_uni", //!< Добавить событие в начало очереди "add_last_uni", //!< Добавить событие в конец очереди "next", //!< Активировать первое событие в очереди "back", //!< Активировать back для текущего события в очереди "clear", //!< Очистить обе очереди "add_popup", //!< Начать ветку попапов от текущего элемента очереди. Срабатывает //!< сразу, до зачиски всех попапов next не делает ничего, back сначала //!< закрывает попапы "delete", //!< Удалить из очереди элемент с id из param; "log" //!< Вывести содержимое всех трех очередей в лог
Схема работы
1) Добавить объекты по одному в очередь
2) вызывать состояния next или back - объекты у которых вызваны состояния убираются из очереди очередь разбирается с конца
Пример реализации
Очередь из окон
Задача: У нас открывается окно 1, после его закрытия открывается окно 2,окно 3 и т.д. (после закрытия одного окна открывается другое).
Пример: Закончили уровень, и после закрытия окна с результатами, мы должны показать два окошка с новыми задачами.
Реализация:
- 1) Открываем окно с результатами:
- Из машины окна, вызываем состояние next машине обработчику менеджера окон (9win_root). Предварительно записываем состояния для закрытия и открытия данного окна(машины; состояния close и open соответственно):
- В машине обработчике менеджера окон (9win_root), в состоянии next мы задаём менеджеру окон и передаём состояние add_first, а затем next. То есть мы добавляем первым в очередь на открытие наше окно с результатами и эго открываем:
- 2) Добавляем в очередь окно с задачей:
- Из машины окна, вызываем состояние add машине обработчику менеджера окон (9win_root). Предварительно записываем состояния для закрытия и открытия данного окна(машины; состояния close и open соответственно):
- В машине обработчике менеджера окон (9win_root), в состоянии add мы задаём менеджеру окон и передаём состояние add_last( то есть мы добавляем окно в конец очереди на открытие).
- 3) Аналогично добавляем другие задачи.
- 4) Для закрытия окна с результатами уровня, мы передаём менеджеру окон состояние back (закрываем окно, первое в списке на закрытие), а затем состояние next (открываем первое окно в очереди на открытие, в нашем случае - первую добавленную задачу) .