Добавлена обработка удаления экрана/экранов.
This commit is contained in:
parent
c43ef1e908
commit
9162a4212f
2 changed files with 58 additions and 5 deletions
|
|
@ -66,6 +66,9 @@ struct ScreenAction
|
|||
IScreen next;
|
||||
// Результат (используется для `Pop`, `Quit`).
|
||||
ScreenResult result;
|
||||
// Количество извлекаемых экранов.
|
||||
int popScreenCount;
|
||||
|
||||
/**
|
||||
* Ничего не делать.
|
||||
*
|
||||
|
|
@ -73,8 +76,9 @@ struct ScreenAction
|
|||
*/
|
||||
static ScreenAction none()
|
||||
{
|
||||
return ScreenAction(ActionKind.None, null, ScreenResult.none());
|
||||
return ScreenAction(ActionKind.None, null, ScreenResult.none(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Добавить новый экран поверх текущего.
|
||||
*
|
||||
|
|
@ -84,8 +88,9 @@ struct ScreenAction
|
|||
static ScreenAction push(IScreen screen)
|
||||
{
|
||||
// assert(isPointer!(typeof(result)), "ncuiNotNull expects a function that returns a pointer.");
|
||||
return ScreenAction(ActionKind.Push, screen, ScreenResult.none());
|
||||
return ScreenAction(ActionKind.Push, screen, ScreenResult.none(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Заменить верхний экран стека новым.
|
||||
*
|
||||
|
|
@ -94,8 +99,9 @@ struct ScreenAction
|
|||
*/
|
||||
static ScreenAction replace(IScreen screen)
|
||||
{
|
||||
return ScreenAction(ActionKind.Replace, screen, ScreenResult.none());
|
||||
return ScreenAction(ActionKind.Replace, screen, ScreenResult.none(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Закрыть верхний экран и передать результат родителю.
|
||||
*
|
||||
|
|
@ -104,8 +110,20 @@ struct ScreenAction
|
|||
*/
|
||||
static ScreenAction pop(ScreenResult result)
|
||||
{
|
||||
return ScreenAction(ActionKind.Pop, null, result);
|
||||
return ScreenAction(ActionKind.Pop, null, result, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Закрыть верхний экран и передать результат родителю.
|
||||
*
|
||||
* Params:
|
||||
* - result: результат закрываемого экрана.
|
||||
*/
|
||||
static ScreenAction popN(int count, ScreenResult result)
|
||||
{
|
||||
return ScreenAction(ActionKind.Pop, null, result, count < 1 ? 1 : count);
|
||||
}
|
||||
|
||||
/**
|
||||
* Завершить UI-цикл и вернуть финальный результат наружу.
|
||||
*
|
||||
|
|
@ -114,6 +132,6 @@ struct ScreenAction
|
|||
*/
|
||||
static ScreenAction quit(ScreenResult result)
|
||||
{
|
||||
return ScreenAction(ActionKind.Quit, null, result);
|
||||
return ScreenAction(ActionKind.Quit, null, result, 0);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,19 @@ private:
|
|||
// Конечный результат выполнения.
|
||||
ScreenResult _result;
|
||||
|
||||
// Извлечение из стека указанное количество экранов.
|
||||
void popMany(int screenCount)
|
||||
{
|
||||
if (screenCount < 1)
|
||||
screenCount = 1;
|
||||
|
||||
for (int i = 0; i < screenCount && _stack.length != 0; ++i)
|
||||
{
|
||||
_stack[$ - 1].close();
|
||||
_stack.popBack();
|
||||
}
|
||||
}
|
||||
|
||||
void apply(ScreenAction action)
|
||||
{
|
||||
while (_running && action.kind != ActionKind.None)
|
||||
|
|
@ -49,6 +62,28 @@ private:
|
|||
break;
|
||||
|
||||
case ActionKind.Pop:
|
||||
// Результат работы удаляемого экрана (дочерний экран).
|
||||
// Позже он будет передан родительскому экрану.
|
||||
auto childResult = action.result;
|
||||
// Количество удаляемых экранов.
|
||||
int screenCount = (action.popScreenCount <= 0) ? 1 : action.popScreenCount;
|
||||
popMany(screenCount);
|
||||
_session.clear();
|
||||
if (_stack.length == 0)
|
||||
{
|
||||
_result = childResult;
|
||||
_running = false;
|
||||
return;
|
||||
}
|
||||
auto parent = _stack[$ - 1];
|
||||
// Передача результата дочернего экрана первому экрану в стеке (родительскому экрану).
|
||||
auto actionResult = parent.onChildResult(_context, childResult);
|
||||
if (actionResult.kind != ActionKind.None)
|
||||
{
|
||||
action = actionResult;
|
||||
break;
|
||||
}
|
||||
action = parent.onShow(_context);
|
||||
break;
|
||||
|
||||
case ActionKind.Quit:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue