fix(tci): клик по DX-споту на доп. пане слал номер ПАНА вместо номера приёмника

Приёмником TCI в этой ветке стал слот СЛАЙСА (TCI_MAX_RX = 1 + MAX_SLICES,
«панадаптером приёмник быть перестал»), а PanNSpectrumMouseDown отдавал в
rx_clicked_on_spot P.PanId. Клик по пану 1 уезжал как «rx_clicked_on_spot:1,…»,
то есть адресовал слайс в слоте 0 — возможно, стоящий на ГЛАВНОМ пане, — а то и
приёмник, которого нет вовсе: клиенты, фильтрующие по номеру, такое уведомление
просто теряют. Вызов rx0 с главного пана был и остаётся верным.

Теперь номер берётся у слайса, который на спот и увели: DXTuneSpotOnPan стал
функцией и возвращает его, TTCIAdapter.RxOfSlice переводит id в номер TCI.

Заодно два следствия того же места:

  * Не увели ничего (спот вне полосы захвата зумнутого пана, слоты кончились) —
    молчим. Иначе уведомление уходило под номером 0, то есть от имени главного
    приёмника, который никуда не двигался, и логгер открывал карточку QSO с QSY
    на частоту, где радио не стоит.

  * AddSliceAtFreqPan стал функцией и честно сообщает, что получилось. При
    неудаче (нет свободных слотов, частота вне захвата) он не трогает
    FActiveSliceId, а DXTuneSpotOnPan читал именно его — и уводил на спот ЧУЖОЙ
    слайс, вообще говоря с другого пана, вместе с SetSliceModeBW и
    PushSliceFlagState не на том пане.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-20 16:06:53 +03:00
co-authored by Claude Opus 5
parent 11d8e11ba5
commit 6e4ba1c1c5
2 changed files with 43 additions and 12 deletions
+10
View File
@@ -353,6 +353,10 @@ type
{ Уведомление о клике по споту на панораме (§4.4) — зовёт UI. }
procedure NotifySpotClicked(const Call: string; FreqHz: Double;
Rx: Integer = 0; Ch: Integer = 0);
{ Номер TCI-приёмника, за которым стоит слайс Id. Нужен UI: уведомления
адресуются номерами TCI, а он знает только id слайса. 0 — слайса нет в
снимке (или Id = 0): адресуем главный тракт, он есть всегда. }
function RxOfSlice(Id: Integer): Integer;
{ Статус фокуса главного окна (APP_FOCUS) — зовёт UI. }
procedure NotifyAppFocus(InFocus: Boolean);
@@ -3790,6 +3794,12 @@ end;
Уведомления, которые инициирует UI
═══════════════════════════════════════════════════════════════════════════ }
function TTCIAdapter.RxOfSlice(Id: Integer): Integer;
var Rx, Ch: Integer;
begin
if SliceRxCh(Id, Rx, Ch) then Result := Rx else Result := 0;
end;
procedure TTCIAdapter.NotifySpotClicked(const Call: string; FreqHz: Double;
Rx, Ch: Integer);
begin