108 lines
3.3 KiB
C#
108 lines
3.3 KiB
C#
using System;
|
|
|
|
using Codice.Client.Common.Threading;
|
|
|
|
namespace Unity.PlasticSCM.Editor.UI
|
|
{
|
|
internal class UnityThreadWaiterBuilder : IThreadWaiterBuilder
|
|
{
|
|
IThreadWaiter IThreadWaiterBuilder.GetWaiter()
|
|
{
|
|
return new UnityThreadWaiter(mPlasticTimerBuilder, false);
|
|
}
|
|
|
|
IThreadWaiter IThreadWaiterBuilder.GetWaiter(int timerIntervalMilliseconds)
|
|
{
|
|
return new UnityThreadWaiter(mPlasticTimerBuilder, false, timerIntervalMilliseconds);
|
|
}
|
|
|
|
IThreadWaiter IThreadWaiterBuilder.GetModalWaiter()
|
|
{
|
|
return new UnityThreadWaiter(mPlasticTimerBuilder, true);
|
|
}
|
|
|
|
IThreadWaiter IThreadWaiterBuilder.GetModalWaiter(int timerIntervalMilliseconds)
|
|
{
|
|
return new UnityThreadWaiter(mPlasticTimerBuilder, true, timerIntervalMilliseconds);
|
|
}
|
|
|
|
IPlasticTimer IThreadWaiterBuilder.GetTimer(
|
|
int timerIntervalMilliseconds, ThreadWaiter.TimerTick timerTickDelegate)
|
|
{
|
|
return mPlasticTimerBuilder.Get(false, timerIntervalMilliseconds, timerTickDelegate);
|
|
}
|
|
|
|
static IPlasticTimerBuilder mPlasticTimerBuilder = new UnityPlasticTimerBuilder();
|
|
}
|
|
|
|
internal class UnityThreadWaiter : IThreadWaiter
|
|
{
|
|
Exception IThreadWaiter.Exception { get { return mThreadOperation.Exception; } }
|
|
|
|
internal UnityThreadWaiter(
|
|
IPlasticTimerBuilder timerBuilder, bool bModalMode)
|
|
{
|
|
mPlasticTimer = timerBuilder.Get(bModalMode, OnTimerTick);
|
|
}
|
|
|
|
internal UnityThreadWaiter(
|
|
IPlasticTimerBuilder timerBuilder,
|
|
bool bModalMode,
|
|
int timerIntervalMilliseconds)
|
|
{
|
|
mPlasticTimer = timerBuilder.Get(bModalMode, timerIntervalMilliseconds, OnTimerTick);
|
|
}
|
|
|
|
void IThreadWaiter.Execute(
|
|
PlasticThread.Operation threadOperationDelegate,
|
|
PlasticThread.Operation afterOperationDelegate)
|
|
{
|
|
((IThreadWaiter)(this)).Execute(threadOperationDelegate, afterOperationDelegate, null);
|
|
}
|
|
|
|
void IThreadWaiter.Execute(
|
|
PlasticThread.Operation threadOperationDelegate,
|
|
PlasticThread.Operation afterOperationDelegate,
|
|
PlasticThread.Operation timerTickDelegate)
|
|
{
|
|
mThreadOperation = new PlasticThread(threadOperationDelegate);
|
|
mAfterOperationDelegate = afterOperationDelegate;
|
|
mTimerTickDelegate = timerTickDelegate;
|
|
|
|
mPlasticTimer.Start();
|
|
|
|
mThreadOperation.Execute();
|
|
}
|
|
|
|
void IThreadWaiter.Cancel()
|
|
{
|
|
mbCancelled = true;
|
|
}
|
|
|
|
void OnTimerTick()
|
|
{
|
|
if (mThreadOperation.IsRunning)
|
|
{
|
|
if (mTimerTickDelegate != null)
|
|
EditorDispatcher.Dispatch(() => mTimerTickDelegate());
|
|
|
|
return;
|
|
}
|
|
|
|
mPlasticTimer.Stop();
|
|
|
|
if (mbCancelled)
|
|
return;
|
|
|
|
EditorDispatcher.Dispatch(() => mAfterOperationDelegate());
|
|
}
|
|
|
|
bool mbCancelled = false;
|
|
|
|
IPlasticTimer mPlasticTimer;
|
|
PlasticThread mThreadOperation;
|
|
PlasticThread.Operation mTimerTickDelegate;
|
|
PlasticThread.Operation mAfterOperationDelegate;
|
|
}
|
|
}
|