1 // Copyright (c) Charles J. Cliffe
2 // SPDX-License-Identifier: GPL-2.0+
3 
4 #include "InteractiveCanvas.h"
5 
6 #include "wx/wxprec.h"
7 
8 #ifndef WX_PRECOMP
9 #include "wx/wx.h"
10 #endif
11 
12 #if !wxUSE_GLCANVAS
13 #error "OpenGL required: set wxUSE_GLCANVAS to 1 and rebuild the library"
14 #endif
15 
16 #include "CubicSDR.h"
17 
18 #include <wx/numformatter.h>
19 
InteractiveCanvas(wxWindow * parent,const wxGLAttributes & dispAttrs)20 InteractiveCanvas::InteractiveCanvas(wxWindow *parent, const wxGLAttributes& dispAttrs) :
21         wxGLCanvas(parent, dispAttrs, wxID_ANY,  wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE),
22         parent(parent), shiftDown(false), altDown(false), ctrlDown(false), centerFreq(0), bandwidth(0), lastBandwidth(0), isView(
23         false) {
24     mouseTracker.setTarget(this);
25 }
26 
27 InteractiveCanvas::~InteractiveCanvas() = default;
28 
setView(long long center_freq_in,long long bandwidth_in)29 void InteractiveCanvas::setView(long long center_freq_in, long long bandwidth_in) {
30     isView = true;
31     centerFreq = center_freq_in;
32     bandwidth = bandwidth_in;
33     lastBandwidth = 0;
34 }
35 
disableView()36 void InteractiveCanvas::disableView() {
37     isView = false;
38     centerFreq = wxGetApp().getFrequency();
39     bandwidth = wxGetApp().getSampleRate();
40     lastBandwidth = 0;
41 }
42 
getViewState() const43 bool InteractiveCanvas::getViewState() const {
44     return isView;
45 }
46 
getFrequencyAt(float x)47 long long InteractiveCanvas::getFrequencyAt(float x) {
48     long long iqCenterFreq = getCenterFrequency();
49     long long iqBandwidth = getBandwidth();
50     long long freq = iqCenterFreq - (long long)(0.5 * (long double) iqBandwidth) + ((long double) x * (long double) iqBandwidth);
51 
52     return freq;
53 }
54 
getFrequencyAt(float x,long long iqCenterFreq,long long iqBandwidth)55 long long InteractiveCanvas::getFrequencyAt(float x, long long iqCenterFreq, long long iqBandwidth) {
56     long long freq = iqCenterFreq - (long long)(0.5 * (long double) iqBandwidth) + ((long double) x * (long double) iqBandwidth);
57 
58     return freq;
59 }
60 
setCenterFrequency(long long center_freq_in)61 void InteractiveCanvas::setCenterFrequency(long long center_freq_in) {
62     centerFreq = center_freq_in;
63 }
64 
getCenterFrequency() const65 long long InteractiveCanvas::getCenterFrequency() const {
66     if (isView) {
67         return centerFreq;
68     } else {
69         return wxGetApp().getFrequency();
70     }
71 }
72 
setBandwidth(long long bandwidth_in)73 void InteractiveCanvas::setBandwidth(long long bandwidth_in) {
74     bandwidth = bandwidth_in;
75 }
76 
getBandwidth() const77 long long InteractiveCanvas::getBandwidth() const {
78     if (isView) {
79         return bandwidth;
80     } else {
81         return wxGetApp().getSampleRate();
82     }
83 }
84 
getMouseTracker()85 MouseTracker *InteractiveCanvas::getMouseTracker() {
86     return &mouseTracker;
87 }
88 
isAltDown() const89 bool InteractiveCanvas::isAltDown() const {
90     return altDown;
91 }
92 
isCtrlDown() const93 bool InteractiveCanvas::isCtrlDown() const {
94     return ctrlDown;
95 }
96 
isShiftDown() const97 bool InteractiveCanvas::isShiftDown() const {
98     return shiftDown;
99 }
100 
OnKeyUp(wxKeyEvent & event)101 void InteractiveCanvas::OnKeyUp(wxKeyEvent& event) {
102     shiftDown = event.ShiftDown();
103     altDown = event.AltDown();
104     ctrlDown = event.ControlDown();
105 }
106 
OnKeyDown(wxKeyEvent & event)107 void InteractiveCanvas::OnKeyDown(wxKeyEvent& event) {
108     shiftDown = event.ShiftDown();
109     altDown = event.AltDown();
110     ctrlDown = event.ControlDown();
111 }
112 
OnMouseMoved(wxMouseEvent & event)113 void InteractiveCanvas::OnMouseMoved(wxMouseEvent& event) {
114     mouseTracker.OnMouseMoved(event);
115 
116     shiftDown = event.ShiftDown();
117     altDown = event.AltDown();
118     ctrlDown = event.ControlDown();
119 }
120 
OnMouseDown(wxMouseEvent & event)121 void InteractiveCanvas::OnMouseDown(wxMouseEvent& event) {
122     mouseTracker.OnMouseDown(event);
123 
124     shiftDown = event.ShiftDown();
125     altDown = event.AltDown();
126     ctrlDown = event.ControlDown();
127 }
128 
OnMouseWheelMoved(wxMouseEvent & event)129 void InteractiveCanvas::OnMouseWheelMoved(wxMouseEvent& event) {
130     mouseTracker.OnMouseWheelMoved(event);
131 }
132 
OnMouseReleased(wxMouseEvent & event)133 void InteractiveCanvas::OnMouseReleased(wxMouseEvent& event) {
134     mouseTracker.OnMouseReleased(event);
135 
136     shiftDown = event.ShiftDown();
137     altDown = event.AltDown();
138     ctrlDown = event.ControlDown();
139 }
140 
OnMouseLeftWindow(wxMouseEvent & event)141 void InteractiveCanvas::OnMouseLeftWindow(wxMouseEvent& event) {
142     mouseTracker.OnMouseLeftWindow(event);
143 
144     shiftDown = false;
145     altDown = false;
146     ctrlDown = false;
147 }
148 
OnMouseEnterWindow(wxMouseEvent & event)149 void InteractiveCanvas::OnMouseEnterWindow(wxMouseEvent& event) {
150     mouseTracker.OnMouseEnterWindow(event);
151 
152     shiftDown = event.ShiftDown();
153     altDown = event.AltDown();
154     ctrlDown = event.ControlDown();
155 }
156 
setStatusText(std::string statusText)157 void InteractiveCanvas::setStatusText(std::string statusText) {
158 
159     wxGetApp().getAppFrame()->setStatusText(this, statusText);
160 }
161 
setStatusText(std::string statusText,int value)162 void InteractiveCanvas::setStatusText(std::string statusText, int value) {
163 
164     wxGetApp().getAppFrame()->setStatusText(statusText, value);
165 }
166 
OnMouseRightDown(wxMouseEvent & event)167 void InteractiveCanvas::OnMouseRightDown(wxMouseEvent& event) {
168     mouseTracker.OnMouseRightDown(event);
169 }
170 
OnMouseRightReleased(wxMouseEvent & event)171 void InteractiveCanvas::OnMouseRightReleased(wxMouseEvent& event) {
172     mouseTracker.OnMouseRightReleased(event);
173 }
174 
isMouseInView()175 bool InteractiveCanvas::isMouseInView() {
176     return mouseTracker.mouseInView();
177 }
178 
isMouseDown()179 bool InteractiveCanvas::isMouseDown() {
180     return mouseTracker.mouseInView() && mouseTracker.mouseDown();
181 }
182