From f216277736d57dda32228886cb0cf728e4ec614c Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Mon, 9 Mar 2026 00:07:51 +0300 Subject: [PATCH] samplerate button --- MainForm.pas | 109 ++++++++++++++++++++++++++++++++++++++------ hpsdr_settings.json | 2 +- 2 files changed, 97 insertions(+), 14 deletions(-) diff --git a/MainForm.pas b/MainForm.pas index 5df19bc..710cbd1 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -355,6 +355,8 @@ type procedure BuildUI; procedure ApplyDarkTheme; procedure StyleButton(B: TFlatButton; Active: Boolean = False); + procedure StyleSpanButton(B: TFlatButton; Active: Boolean = False); + procedure PositionSpanOverlayButtons; procedure UpdateVfoDisplay; function FormatFreq(Hz: Double): string; function ScaleX(X, Total, Width: Integer): Integer; @@ -687,12 +689,12 @@ begin // SampleRate — глобальный, не per-band. Не восстанавливаем из диапазона. // Обновляем только FSpanHz для отображения (берём текущий FSampleRate) FSpanHz := FSampleRate; - StyleButton(BtnSpan48k, FSampleRate = 48000); - StyleButton(BtnSpan96k, FSampleRate = 96000); - StyleButton(BtnSpan192k, FSampleRate = 192000); - StyleButton(BtnSpan384k, FSampleRate = 384000); - StyleButton(BtnSpan768k, FSampleRate = 768000); - StyleButton(BtnSpan1536k, FSampleRate = 1536000); + StyleSpanButton(BtnSpan48k, FSampleRate = 48000); + StyleSpanButton(BtnSpan96k, FSampleRate = 96000); + StyleSpanButton(BtnSpan192k, FSampleRate = 192000); + StyleSpanButton(BtnSpan384k, FSampleRate = 384000); + StyleSpanButton(BtnSpan768k, FSampleRate = 768000); + StyleSpanButton(BtnSpan1536k, FSampleRate = 1536000); // --- VFO A: центрируем на новой частоте, сбрасываем shift --- FCenterFreq := B.VfoA; // DDC = центр диапазона @@ -1255,7 +1257,12 @@ begin BtnSpan384k.Tag := 384000; BtnSpan768k.Tag := 768000; BtnSpan1536k.Tag := 1536000; - StyleButton(BtnSpan192k, True); + StyleSpanButton(BtnSpan48k, False); + StyleSpanButton(BtnSpan96k, False); + StyleSpanButton(BtnSpan192k, True); + StyleSpanButton(BtnSpan384k, False); + StyleSpanButton(BtnSpan768k, False); + StyleSpanButton(BtnSpan1536k, False); // Waterfall AGC + Noise Floor кнопки справа в той же панели BtnWfAGC := MakeBtn(PanelSpanButtons, 'WF AGC', 379, 3, 62, BTN_SM, BtnWfAGCClick); @@ -1294,6 +1301,16 @@ begin PbWaterfall.OnMouseMove := PbWaterfallMouseMove; PbWaterfall.OnMouseUp := PbWaterfallMouseUp; + // SPAN кнопки как оверлей на спектре (в стиле web) + BtnSpan48k.Parent := PanelRight; + BtnSpan96k.Parent := PanelRight; + BtnSpan192k.Parent := PanelRight; + BtnSpan384k.Parent := PanelRight; + BtnSpan768k.Parent := PanelRight; + BtnSpan1536k.Parent := PanelRight; + LblSpan.Visible := False; + PositionSpanOverlayButtons; + // Initial layout ResizeSpectrumPanels; end; @@ -1364,6 +1381,7 @@ begin PbSpectrum.SetBounds(0, TopOff, RW, SH); PbRuler.SetBounds (0, TopOff + SH, RW, 18); PbWaterfall.SetBounds(0, TopOff + SH + 18, RW, WH); + PositionSpanOverlayButtons; // Обновляем переменные размеров FSpectrumWidth := RW; @@ -1448,6 +1466,71 @@ begin B.Font.Size := 8; end; +procedure TMainForm.StyleSpanButton(B: TFlatButton; Active: Boolean); +begin + B.Active := Active; + B.ClrNorm := TColor($0013191B); + B.ClrActive := TColor($001E3C1E); + B.ClrHot := TColor($001E2D1E); + B.ClrBorder := TColor($005A7A5A); + B.ClrText := TColor($0090B890); + B.ClrTextAct := TColor($00AAFFAA); + B.Font.Name := 'Courier New'; + B.Font.Size := 7; +end; + +procedure TMainForm.PositionSpanOverlayButtons; +const + BTN_TOP = 6; + GAP = 3; + W48 = 40; + W96 = 40; + W192 = 44; + W384 = 44; + W768 = 44; + W1536 = 50; + HBTN = 18; +var + X, NeedW, BaseX, BaseY: Integer; +begin + if (PbSpectrum = nil) or (BtnSpan48k = nil) then Exit; + NeedW := W48 + W96 + W192 + W384 + W768 + W1536 + GAP * 5 + 8; + if PbSpectrum.Width < NeedW then + begin + BtnSpan48k.Visible := False; + BtnSpan96k.Visible := False; + BtnSpan192k.Visible := False; + BtnSpan384k.Visible := False; + BtnSpan768k.Visible := False; + BtnSpan1536k.Visible := False; + Exit; + end; + + BaseX := PbSpectrum.Left; + BaseY := PbSpectrum.Top; + X := BaseX + 56; + BtnSpan48k.SetBounds(X, BaseY + BTN_TOP, W48, HBTN); Inc(X, W48 + GAP); + BtnSpan96k.SetBounds(X, BaseY + BTN_TOP, W96, HBTN); Inc(X, W96 + GAP); + BtnSpan192k.SetBounds(X, BaseY + BTN_TOP, W192, HBTN); Inc(X, W192 + GAP); + BtnSpan384k.SetBounds(X, BaseY + BTN_TOP, W384, HBTN); Inc(X, W384 + GAP); + BtnSpan768k.SetBounds(X, BaseY + BTN_TOP, W768, HBTN); Inc(X, W768 + GAP); + BtnSpan1536k.SetBounds(X, BaseY + BTN_TOP, W1536, HBTN); + + BtnSpan48k.Visible := True; + BtnSpan96k.Visible := True; + BtnSpan192k.Visible := True; + BtnSpan384k.Visible := True; + BtnSpan768k.Visible := True; + BtnSpan1536k.Visible := True; + + BtnSpan48k.BringToFront; + BtnSpan96k.BringToFront; + BtnSpan192k.BringToFront; + BtnSpan384k.BringToFront; + BtnSpan768k.BringToFront; + BtnSpan1536k.BringToFront; +end; + // =========================================================================== // VFO // =========================================================================== @@ -3651,12 +3734,12 @@ begin DDCRate := NewRate div 1000; // Обновляем кнопки сразу — UI отзывчив - StyleButton(BtnSpan48k, FSampleRate = 48000); - StyleButton(BtnSpan96k, FSampleRate = 96000); - StyleButton(BtnSpan192k, FSampleRate = 192000); - StyleButton(BtnSpan384k, FSampleRate = 384000); - StyleButton(BtnSpan768k, FSampleRate = 768000); - StyleButton(BtnSpan1536k, FSampleRate = 1536000); + StyleSpanButton(BtnSpan48k, FSampleRate = 48000); + StyleSpanButton(BtnSpan96k, FSampleRate = 96000); + StyleSpanButton(BtnSpan192k, FSampleRate = 192000); + StyleSpanButton(BtnSpan384k, FSampleRate = 384000); + StyleSpanButton(BtnSpan768k, FSampleRate = 768000); + StyleSpanButton(BtnSpan1536k, FSampleRate = 1536000); Application.ProcessMessages; FBandCache[FCurrentBand].SpanHz := FSpanHz; // для обратной совместимости diff --git a/hpsdr_settings.json b/hpsdr_settings.json index 7c5bffb..a21aedb 100644 --- a/hpsdr_settings.json +++ b/hpsdr_settings.json @@ -307,7 +307,7 @@ "span_hz" : 1.9200000000000000E+005 }, "3" : { - "vfo_a" : 7.1100000000000000E+006, + "vfo_a" : 7.1250000000000000E+006, "vfo_b" : 7.1000000000000000E+006, "mode" : 0, "filter_idx" : 5,