2025-11-28 00:35:46 +09:00

162 lines
4.4 KiB
C++

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved
#pragma once
#include "UIAnimationHelper.h"
enum STORYBOARD_ID
{
STORYBOARD_ID_NONE,
STORYBOARD_ID_SLIDE,
STORYBOARD_ID_SLIDE_AFTER_WAVE,
STORYBOARD_ID_WAVE,
};
template <class CPriorityComparison>
class CPriorityComparisonBase :
public CUIAnimationPriorityComparisonBase<CPriorityComparison>
{
public:
// IUIAnimationPriorityComparison
IFACEMETHODIMP
HasPriority
(
IUIAnimationStoryboard *pStoryboardScheduled, // Currently scheduled storyboard
IUIAnimationStoryboard *pStoryboardNew, // New storyboard that conflicts with scheduled storyboard
UI_ANIMATION_PRIORITY_EFFECT priorityEffect // Potential effect on attempt to schedule storyboard if HasPriority returns S_FALSE
)
{
UINT32 storyboardIdScheduled;
HRESULT hr = UIAnimation_GetStoryboardTag(
pStoryboardScheduled,
STORYBOARD_ID_NONE,
NULL,
&storyboardIdScheduled
);
if (SUCCEEDED(hr))
{
UINT32 storyboardIdNew;
hr = UIAnimation_GetStoryboardTag(
pStoryboardNew,
STORYBOARD_ID_NONE,
NULL,
&storyboardIdNew
);
if (SUCCEEDED(hr))
{
bool fHasPriority = HasPriority(
storyboardIdScheduled,
storyboardIdNew,
priorityEffect
);
hr = (fHasPriority ? S_OK : S_FALSE);
}
}
return hr;
}
protected:
virtual bool HasPriority(
UINT32 storyboardIdScheduled,
UINT32 storyboardIdNew,
UI_ANIMATION_PRIORITY_EFFECT priorityEffect
) = 0;
};
class CCancelPriorityComparison :
public CPriorityComparisonBase<CCancelPriorityComparison>
{
public:
virtual bool HasPriority(
UINT32 storyboardIdScheduled,
UINT32 /* storyboardIdNew */,
UI_ANIMATION_PRIORITY_EFFECT /* priorityEffect */
)
{
// In this application, storyboards are canceled to avoid failure or delay
// By default, storyboards cannot cancel other storyboards
bool fHasPriority = false;
// SLIDE_AFTER_WAVE can be canceled by any other storyboard
if (storyboardIdScheduled == STORYBOARD_ID_SLIDE_AFTER_WAVE)
{
fHasPriority = true;
}
return fHasPriority;
}
};
class CTrimPriorityComparison :
public CPriorityComparisonBase<CTrimPriorityComparison>
{
public:
virtual bool HasPriority(
UINT32 storyboardIdScheduled,
UINT32 storyboardIdNew,
UI_ANIMATION_PRIORITY_EFFECT priorityEffect
)
{
bool fHasPriority = false;
// In this application, storyboards are trimmed only to avoid failure
if (priorityEffect == UI_ANIMATION_PRIORITY_EFFECT_FAILURE)
{
// By default, storyboards can trim other storyboards
fHasPriority = true;
if (storyboardIdScheduled == STORYBOARD_ID_SLIDE_AFTER_WAVE &&
storyboardIdNew == STORYBOARD_ID_WAVE)
{
// WAVE can trim SLIDE_AFTER_WAVE
fHasPriority = true;
}
else
{
switch (storyboardIdNew)
{
case STORYBOARD_ID_SLIDE:
case STORYBOARD_ID_SLIDE_AFTER_WAVE:
case STORYBOARD_ID_WAVE:
// Otherwise, SLIDE, SLIDE_AFTER_WAVE, and WAVE cannot trim each other
switch (storyboardIdScheduled)
{
case STORYBOARD_ID_SLIDE:
case STORYBOARD_ID_SLIDE_AFTER_WAVE:
case STORYBOARD_ID_WAVE:
fHasPriority = false;
break;
}
break;
}
}
}
return fHasPriority;
}
};