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