Controle deslizante circular / angular

A pergunta SO recente me lembrou de algum código que tentei escrever um tempo atrás. O objetivo é fazer umaCircularSlider[] objeto que pode ser usado para variáveis angulares em objetos dinâmicos.

A estrutura para minha solução (abaixo) vem doValueThumbSlider[] definido noFuncionalidade de manipulação avançada tutorial. A principal diferença é que, emValueThumbSlider[] o valor do controle deslizante e a posição doLocatorPlane[] são a mesma coisa, enquanto no meuCircularSlider[] eles não são - e isso leva a problemas.

O primeiro problema é que mover oLocator não alterará o valor do controle deslizante. Isso é corrigido usando o segundo argumento noDynamic: (x = #/Abs[Complex @@ #]) &.

Por sua vez, isso leva ao problema de que, se você definir externamente o valor do controle deslizante (t) de fora, ele retornará imediatamente ao seu valor anterior. Isso é corrigido mantendo o valor antigo (t0) e comparando comt. Se eles não corresponderem, assume-se que t mudou e, portanto, oLocator posiçãox é atualizado para sua nova posição.

CircularSlider[t_] := CircularSlider[t, {0, 1}];
CircularSlider[Dynamic[t_], {min_, max_}] /; max > min := 
 With[{d = (max - min)/(2. Pi)},
  DynamicModule[{td = t/d, x, t0}, x = {Cos[td], Sin[td]};
   LocatorPane[
    Dynamic[If[!NumberQ[t], t = min; x = {Cos[td], Sin[td]}];
     If[t != t0, t0 = t; x = {Cos[td], Sin[td]}];
     t = Mod[Arg[Complex @@ x] d, max, min]; t0 = t;
     x, (x = #/Abs[Complex @@ #]) &],
    Graphics[{AbsoluteThickness[1.5], Circle[], 
      Dynamic[{Text[NumberForm[t, {3, 2}], {0, 0}]}]}],
    ImageSize -> Small]]]

Então, minha pergunta é: alguém pode fazer isso funcionar com os kludges acima?

questionAnswers(1)

yourAnswerToTheQuestion