diff --git a/MainForm.pas b/MainForm.pas index 0cf24af..ca6579b 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -267,6 +267,8 @@ type PanelVfoA: TPanel; LblVfoALabel: TLabel; FreqDispA: TFreqDisplay; + BtnTopVfoASelect: TFlatButton; + BtnTopVfoATX: TFlatButton; PanelVfoB: TPanel; LblVfoBLabel: TLabel; @@ -278,6 +280,7 @@ type BtnVfoSwap: TFlatButton; BtnVfoACopyB: TFlatButton; BtnVfoBCopyA: TFlatButton; + PanelTopVfoA: TPanel; PanelTopVfoB: TPanel; PanelBands: TPanel; @@ -378,6 +381,8 @@ type procedure ApplyVfoA(NewFreq: Int64); procedure FreqDispAClick(Sender: TObject); procedure FreqDispBClick(Sender: TObject); + procedure BtnTopVfoASelectClick(Sender: TObject); + procedure BtnTopVfoATXClick(Sender: TObject); procedure BtnTopVfoBSelectClick(Sender: TObject); procedure BtnTopVfoBTXClick(Sender: TObject); procedure ActivateVfo(Idx: Integer); @@ -1280,33 +1285,62 @@ begin Y := 2; - // VFO A + // VFO A (compact top block) + PanelTopVfoA := TPanel.Create(Self); + PanelTopVfoA.Parent := Self; + PanelTopVfoA.SetBounds(0, 0, TOP_VFO_W, 60); + PanelTopVfoA.BevelOuter := bvNone; + PanelTopVfoA.Color := CLR_PANEL; + PanelVfoA := TPanel.Create(Self); - PanelVfoA.Parent := PanelLeft; - PanelVfoA.SetBounds(0, Y, LEFT_W, 56); + PanelVfoA.Parent := PanelTopVfoA; + PanelVfoA.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H); PanelVfoA.BevelOuter := bvNone; + BtnTopVfoASelect := MakeBtn(PanelVfoA, 'A', 0, 7, 18, 16, BtnTopVfoASelectClick); + BtnTopVfoASelect.Font.Name := 'Courier New'; + BtnTopVfoASelect.Font.Size := 6; + BtnTopVfoASelect.Font.Bold := True; + BtnTopVfoASelect.ClrNorm := TColor($00303030); + BtnTopVfoASelect.ClrHot := TColor($00404040); + BtnTopVfoASelect.ClrActive := TColor($00404040); + BtnTopVfoASelect.ClrBorder := TColor($00505050); + BtnTopVfoASelect.ClrText := CLR_TEXTDIM; + BtnTopVfoASelect.ClrTextAct := CLR_TEXT; + + BtnTopVfoATX := MakeBtn(PanelVfoA, 'TX', 0, 25, 18, 16, BtnTopVfoATXClick); + BtnTopVfoATX.Font.Name := 'Courier New'; + BtnTopVfoATX.Font.Size := 6; + BtnTopVfoATX.Font.Bold := True; + BtnTopVfoATX.ClrNorm := TColor($00303030); + BtnTopVfoATX.ClrHot := TColor($00404040); + BtnTopVfoATX.ClrActive := TColor($00404040); + BtnTopVfoATX.ClrBorder := TColor($00505050); + BtnTopVfoATX.ClrText := CLR_TEXTDIM; + BtnTopVfoATX.ClrTextAct := CLR_TEXT; + LblVfoALabel := TLabel.Create(Self); LblVfoALabel.Parent := PanelVfoA; LblVfoALabel.Caption := 'VFO-A'; - LblVfoALabel.Left := 4; LblVfoALabel.Top := 2; + LblVfoALabel.Left := 0; LblVfoALabel.Top := 0; LblVfoALabel.Font.Name := 'Courier New'; LblVfoALabel.Font.Size := 7; LblVfoALabel.Font.Color := CLR_TEXTDIM; + LblVfoALabel.Visible := False; FreqDispA := TFreqDisplay.Create(Self); FreqDispA.Parent := PanelVfoA; - FreqDispA.SetBounds(0, 14, LEFT_W, 36); - FreqDispA.FontSize := 20; + FreqDispA.SetBounds(58, -2, TOP_VFO_W - 58, TOP_VFO_FREQ_H); + FreqDispA.FontSize := 22; FreqDispA.FontName := 'Courier New'; FreqDispA.Frequency := Round(FVfoA); FreqDispA.ColorNormal := CLR_FREQ; FreqDispA.ColorHover := TColor($0040DDFF); FreqDispA.ColorDim := CLR_TEXTDIM; + FreqDispA.MinMhzDigits := 3; + FreqDispA.DimLeadingZeros := True; FreqDispA.OnChange := FreqDispAChanged; FreqDispA.OnClick := FreqDispAClick; - Inc(Y, 58); - // VFO B (compact top block) PanelTopVfoB := TPanel.Create(Self); PanelTopVfoB.Parent := Self; @@ -1756,6 +1790,7 @@ const TOP_VFO_MIN_W = 244; TOP_VFO_BTN_H = 14; TOP_VFO_FREQ_H = 47; + TOP_VFO_PAIR_GAP = 8; SEP_GAP = 4; SETTINGS_GAP = 4; BTN_GAP = 4; @@ -1766,22 +1801,30 @@ var BtnX: Integer; SepLeft: Integer; LeftEdge: Integer; + LeftEdgeB: Integer; RightW: Integer; SMW: Integer; SMLeft: Integer; - TopVfoW: Integer; - NeedFreqW: Integer; + TopVfoAW: Integer; + TopVfoBW: Integer; + NeedFreqAW: Integer; + NeedFreqBW: Integer; NeedBtnW: Integer; + PairW: Integer; begin - if (PanelToolbar = nil) or (PanelTopVfoB = nil) then Exit; + if (PanelToolbar = nil) or (PanelSpanButtons = nil) or + (PanelTopVfoA = nil) or (PanelTopVfoB = nil) then Exit; Canvas.Font.Name := FreqDispB.FontName; Canvas.Font.Size := FreqDispB.FontSize; Canvas.Font.Style := [fsBold]; - NeedFreqW := FreqDispB.Left + Canvas.TextWidth('000.000.000') + 8; + NeedFreqAW := FreqDispA.Left + Canvas.TextWidth('000.000.000') + 8; + NeedFreqBW := FreqDispB.Left + Canvas.TextWidth('000.000.000') + 8; NeedBtnW := BtnVfoSwap.Width + BtnVfoACopyB.Width + BtnVfoBCopyA.Width + BTN_GAP * 2 + 8; - TopVfoW := Max(TOP_VFO_MIN_W, Max(NeedFreqW, NeedBtnW)); + TopVfoAW := Max(TOP_VFO_MIN_W, NeedFreqAW); + TopVfoBW := Max(TOP_VFO_MIN_W, Max(NeedFreqBW, NeedBtnW)); + PairW := TopVfoAW + TOP_VFO_PAIR_GAP + TopVfoBW; SepLeft := PanelToolbar.ClientWidth - MARGIN; if PanelLeft <> nil then @@ -1795,34 +1838,46 @@ begin end; end; - LeftEdge := SepLeft - SEP_GAP - TopVfoW; + LeftEdge := SepLeft - SEP_GAP - PairW; if BtnSettings <> nil then LeftEdge := Max(LeftEdge, BtnSettings.Left + BtnSettings.Width + SETTINGS_GAP); - if LeftEdge + TopVfoW > SepLeft - SEP_GAP then + if LeftEdge + PairW > SepLeft - SEP_GAP then begin + PanelTopVfoA.Visible := False; PanelTopVfoB.Visible := False; Exit; end; + PanelTopVfoA.Visible := True; PanelTopVfoB.Visible := True; BlockH := PanelToolbar.Height + PanelSpanButtons.Height - (MARGIN * 2); if BlockH < 56 then BlockH := 56; - PanelTopVfoB.SetBounds(LeftEdge, TOP_OFFSET, TopVfoW, BlockH); - PanelVfoB.SetBounds(0, 0, TopVfoW, TOP_VFO_FREQ_H); + LeftEdgeB := LeftEdge + TopVfoAW + TOP_VFO_PAIR_GAP; + + PanelTopVfoA.SetBounds(LeftEdge, TOP_OFFSET, TopVfoAW, BlockH); + PanelVfoA.SetBounds(0, 0, TopVfoAW, TOP_VFO_FREQ_H); + FreqDispA.SetBounds(FreqDispA.Left, FreqDispA.Top, + Max(20, TopVfoAW - FreqDispA.Left), TOP_VFO_FREQ_H); + BtnTopVfoASelect.Left := FreqDispA.Left - BtnTopVfoASelect.Width; + BtnTopVfoATX.Left := FreqDispA.Left - BtnTopVfoATX.Width; + + PanelTopVfoB.SetBounds(LeftEdgeB, TOP_OFFSET, TopVfoBW, BlockH); + PanelVfoB.SetBounds(0, 0, TopVfoBW, TOP_VFO_FREQ_H); FreqDispB.SetBounds(FreqDispB.Left, FreqDispB.Top, - Max(20, TopVfoW - FreqDispB.Left), TOP_VFO_FREQ_H); + Max(20, TopVfoBW - FreqDispB.Left), TOP_VFO_FREQ_H); BtnTopVfoBSelect.Left := FreqDispB.Left - BtnTopVfoBSelect.Width; BtnTopVfoBTX.Left := FreqDispB.Left - BtnTopVfoBTX.Width; BtnY := PanelTopVfoB.Height - TOP_VFO_BTN_H - 8; if BtnY < 42 then BtnY := 42; - PanelVfoButtons.SetBounds(4, BtnY, TopVfoW - 8, TOP_VFO_BTN_H); + PanelVfoButtons.SetBounds(4, BtnY, TopVfoBW - 8, TOP_VFO_BTN_H); BtnRowW := BtnVfoSwap.Width + BtnVfoACopyB.Width + BtnVfoBCopyA.Width + BTN_GAP * 2; BtnX := FreqDispB.Left + (FreqDispB.Width - BtnRowW) div 2 - PanelVfoButtons.Left; if BtnX < 0 then BtnX := 0; BtnVfoSwap.Left := BtnX; BtnVfoACopyB.Left := BtnVfoSwap.Left + BtnVfoSwap.Width + BTN_GAP; BtnVfoBCopyA.Left := BtnVfoACopyB.Left + BtnVfoACopyB.Width + BTN_GAP; + PanelTopVfoA.BringToFront; PanelTopVfoB.BringToFront; end; @@ -2011,6 +2066,7 @@ procedure TMainForm.ApplyDarkTheme; begin Color := CLR_BG; Font.Color := CLR_TEXT; DP(PanelToolbar); DP(PanelLeft); + DP(PanelTopVfoA); DP(PanelTopVfoB); DP(PanelVfoA); DP(PanelVfoB); DP(PanelVfoButtons); DP(PanelBands); DP(PanelMode); DP(PanelFilter); DP(PanelRX); DP(PanelTX); @@ -2127,33 +2183,53 @@ const begin FreqDispA.Frequency := Round(FVfoA); FreqDispB.Frequency := Round(FVfoB); + FreqDispA.FontSize := TOP_VFO_FONT; + FreqDispB.FontSize := TOP_VFO_FONT; + FreqDispA.Height := TOP_VFO_FREQ_H; + FreqDispB.Height := TOP_VFO_FREQ_H; + if FActiveVfo = 0 then begin - // VFO-A активен: яркий зелёный, крупный - FreqDispA.ColorNormal := CLR_FREQ; FreqDispA.FontSize := 20; - FreqDispB.ColorNormal := CLR_FREQ_DIM; FreqDispB.FontSize := TOP_VFO_FONT; - FreqDispA.Height := 36; - FreqDispB.Height := TOP_VFO_FREQ_H; + // VFO-A активен: яркий зелёный + FreqDispA.ColorNormal := CLR_FREQ; + FreqDispB.ColorNormal := CLR_FREQ_DIM; LblVfoALabel.Font.Color := CLR_FREQ; LblVfoBLabel.Font.Color := CLR_TEXTDIM; + if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, True); if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, False); end else begin - // VFO-B активен: яркий зелёный; размер зависит от размещения - FreqDispA.ColorNormal := CLR_FREQ_DIM; FreqDispA.FontSize := 14; + // VFO-B активен: яркий зелёный + FreqDispA.ColorNormal := CLR_FREQ_DIM; FreqDispB.ColorNormal := CLR_FREQ; - if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then - FreqDispB.FontSize := TOP_VFO_FONT - else - FreqDispB.FontSize := 20; - FreqDispA.Height := 28; - if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then - FreqDispB.Height := TOP_VFO_FREQ_H - else - FreqDispB.Height := 36; LblVfoALabel.Font.Color := CLR_TEXTDIM; LblVfoBLabel.Font.Color := CLR_FREQ; + if BtnTopVfoASelect <> nil then StyleButton(BtnTopVfoASelect, False); if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, True); end; + if BtnTopVfoATX <> nil then + begin + if not FSplitTxB then + begin + BtnTopVfoATX.ClrNorm := TColor($00000060); + BtnTopVfoATX.ClrHot := TColor($00000090); + BtnTopVfoATX.ClrActive := TColor($00000090); + BtnTopVfoATX.ClrBorder := TColor($001010B0); + BtnTopVfoATX.ClrText := TColor($00C8D8FF); + BtnTopVfoATX.ClrTextAct := TColor($00E8F0FF); + BtnTopVfoATX.Active := True; + end + else + begin + BtnTopVfoATX.ClrNorm := TColor($00303030); + BtnTopVfoATX.ClrHot := TColor($00404040); + BtnTopVfoATX.ClrActive := TColor($00404040); + BtnTopVfoATX.ClrBorder := TColor($00505050); + BtnTopVfoATX.ClrText := CLR_TEXTDIM; + BtnTopVfoATX.ClrTextAct := CLR_TEXT; + BtnTopVfoATX.Active := False; + end; + BtnTopVfoATX.Invalidate; + end; if BtnTopVfoBTX <> nil then begin if FSplitTxB then @@ -2178,11 +2254,6 @@ begin end; BtnTopVfoBTX.Invalidate; end; - if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then - begin - FreqDispB.FontSize := TOP_VFO_FONT; - FreqDispB.Height := TOP_VFO_FREQ_H; - end; FreqDispA.Invalidate; FreqDispB.Invalidate; LblVfoALabel.Invalidate; @@ -3191,6 +3262,25 @@ begin ActivateVfo(1); end; +procedure TMainForm.BtnTopVfoASelectClick(Sender: TObject); +begin + if FActiveVfo <> 0 then + ActivateVfo(0); +end; + +procedure TMainForm.BtnTopVfoATXClick(Sender: TObject); +begin + FSplitTxB := False; + UpdateVfoDisplay; + + if FNetwork.Connected and FNetwork.Running then + begin + FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, + FTransmitting, True, True); + FNetwork.SendFullHP; + end; +end; + procedure TMainForm.BtnTopVfoBSelectClick(Sender: TObject); begin if FActiveVfo <> 1 then @@ -3199,7 +3289,7 @@ end; procedure TMainForm.BtnTopVfoBTXClick(Sender: TObject); begin - FSplitTxB := not FSplitTxB; + FSplitTxB := True; if FSplitTxB and (FActiveVfo <> 0) then ActivateVfo(0) else