anchor.diff:  
   procedure TKMRadioGroup.MouseUp(X,Y: Integer; Shift: TShiftState; Button: TMouseButton);
   var
  -  NewIndex: Integer;
  +  Changed: Boolean;
   begin
     if (csDown in State) and (Button = mbLeft) then
     begin
  -    NewIndex := EnsureRange((Y-AbsTop) div Round(Height/Count), 0, Count - 1); //Clicking at wrong place can select invalid ID
  -    if (NewIndex <> fItemIndex) and (fItems[NewIndex].Enabled) then
  +    UpdateMouseOverPositions(X,Y);
  +    if (fMouseOverItem <> -1) and fItems[fMouseOverItem].Enabled then
       begin
  -      fItemIndex := NewIndex;
  -      if Assigned(fOnChange) then
  +      Changed := False;
  +      if (fMouseOverItem = fItemIndex) then
  +      begin
  +        if AllowUncheck then
  +        begin
  +          fItemIndex := -1; //Uncheck
  +          Changed := True;
  +        end;
  +      end else begin
  +        fItemIndex := fMouseOverItem;
  +        Changed := True;
  +      end;
  +
  +      if Changed and Assigned(fOnChange) then
         begin
           fOnChange(Self);
           Exit; //Don't generate OnClick after OnChanged event (esp. when reloading Game on local change)
  
positive.code:   protected
      function GetHint: UnicodeString; override;
    public
      DrawChkboxOutline: Boolean;
      LineColor: TColor4; //color of outline
      LineWidth: Byte;
  
negative.code:   fItemIndex := -1;
    LineWidth := 1;
    LineColor := clChkboxOutline;
    AllowUncheck := False;
  end;
  
  
  