OpenCPN Partial API docs
Loading...
Searching...
No Matches
ienc_toolbar.cpp
Go to the documentation of this file.
1/**************************************************************************
2 * Copyright (C) 2017 by David S. Register *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, see <https://www.gnu.org/licenses/>. *
16 **************************************************************************/
17
24#include "config.h"
25
26#include <wx/wxprec.h>
27
28#ifndef WX_PRECOMP
29#include <wx/wx.h>
30#endif
31
32#include <wx/bitmap.h>
33#include <wx/brush.h>
34#include <wx/dcmemory.h>
35#include <wx/event.h>
36#include <wx/file.h>
37#include <wx/filename.h>
38#include <wx/log.h>
39
40#include "ienc_toolbar.h"
41
42#include "model/svg_utils.h"
43
44#include "chcanv.h"
45#include "ocpn_frame.h"
46#include "OCPNPlatform.h"
47#include "pluginmanager.h"
48#include "s52plib.h"
49#include "s52s57.h"
50#include "toolbar.h"
51
53
54//---------------------------------------------------------------------------------------
55// iENCToolbar Implementation
56//---------------------------------------------------------------------------------------
57
58iENCToolbar::iENCToolbar(wxWindow *parent, wxPoint position, long orient,
59 float size_factor)
60 : ocpnFloatingToolbarDialog(parent, position, orient, size_factor) {
61 LoadToolBitmaps();
62
63 wxSize a = m_bmMinimum.GetSize();
64 m_ptoolbar->SetToolBitmapSize(a);
65
66 m_pbmScratch = new wxBitmap(a.x, a.y);
67
68 m_bmTemplate = m_bmRMinus;
69
70 m_toolDensity =
71 m_ptoolbar->AddTool(ID_DENSITY, "Density", m_bmMinimum, m_bmMinimum);
72 m_ptoolbar->AddTool(ID_RPLUS, "RangePlus", m_bmRPlus, m_bmRPlus);
73 m_ptoolbar->AddTool(ID_RMINUS, "RangeMinus", m_bmRMinus, m_bmRMinus);
74
75 SetCanToggleOrientation(false);
76 EnableRolloverBitmaps(false);
77 DisableTooltips();
78
79 m_nDensity = 0;
80 SetDensityToolBitmap(m_nDensity);
81 m_range = 0;
82
83 m_ptoolbar->SetBackgroundColour(GetGlobalColor("DILG0"));
84
85 // Realize() the toolbar
86 Realize();
87 SetDefaultPosition();
88
89 m_state_timer.SetOwner(this, STATE_TIMER);
90 m_state_timer.Start(100, wxTIMER_CONTINUOUS);
91 this->Connect(wxEVT_TIMER, wxTimerEventHandler(iENCToolbar::StateTimerEvent),
92 NULL, this);
93}
94
95iENCToolbar::~iENCToolbar() {}
96
97void iENCToolbar::SetColorScheme(ColorScheme cs) {
98 m_nDensity = -1;
99 m_ptoolbar->SetBackgroundColour(GetGlobalColor("DILG0"));
100 SetRangeToolBitmap();
101 ocpnFloatingToolbarDialog::SetColorScheme(cs);
102 m_ptoolbar->InvalidateBitmaps();
103 RefreshToolbar();
104 m_range = 0;
105}
106
107void iENCToolbar::LoadToolBitmaps() {
108 wxString svgDir = g_Platform->GetSharedDataDir() + "uidata" +
109 wxFileName::GetPathSeparator();
110
111 int w = 96;
112 int h = 32;
113
114 if (::wxFileExists(svgDir + "iENC_All.svg")) {
115 m_bmAll = LoadSVG(svgDir + "iENC_All.svg", w, h);
116 m_bmMinimum = LoadSVG(svgDir + "iENC_Minimum.svg", w, h);
117 m_bmStandard = LoadSVG(svgDir + "iENC_Standard.svg", w, h);
118 m_bmUStd = LoadSVG(svgDir + "iENC_UserStd.svg", w, h);
119 m_bmRPlus = LoadSVG(svgDir + "iENC_RPlus.svg", w, h);
120 m_bmRMinus = LoadSVG(svgDir + "iENC_RMinus.svg", w, h);
121 } else {
122 wxLogMessage("Cannot find iENC icons at: " + svgDir);
123
124 m_bmMinimum = wxBitmap(96, 32);
125 m_bmStandard = wxBitmap(96, 32);
126 m_bmAll = wxBitmap(96, 32);
127 m_bmUStd = wxBitmap(96, 32);
128 m_bmRPlus = wxBitmap(96, 32);
129 m_bmRMinus = wxBitmap(96, 32);
130 }
131}
132
133void iENCToolbar::OnToolLeftClick(wxCommandEvent &event) {
134 int itemId = event.GetId();
135
136 ChartCanvas *cc = gFrame->GetPrimaryCanvas();
137
138 enum _DisCat nset = STANDARD;
139 double range;
140
141 switch (itemId) {
142 case ID_DENSITY:
143
144 if (++m_nDensity > 3) m_nDensity = 0;
145
146 SetDensityToolBitmap(m_nDensity);
147
148 switch (m_nDensity) {
149 case 0:
150 nset = DISPLAYBASE;
151 break;
152 case 1:
153 nset = STANDARD;
154 break;
155 case 2:
156 nset = OTHER;
157 break;
158 case 3:
159 nset = MARINERS_STANDARD;
160 break;
161 default:
162 nset = STANDARD;
163 break;
164 }
165
166 gFrame->SetENCDisplayCategory(cc, nset);
167
168 break;
169
170 case ID_RMINUS:
171 range = cc->GetCanvasRangeMeters();
172 range = wxRound(range * 10) / 10.;
173
174 if (range > 8000.) cc->SetCanvasRangeMeters(8000.);
175 if (range > 4000.)
176 cc->SetCanvasRangeMeters(4000.);
177 else if (range > 2000.)
178 cc->SetCanvasRangeMeters(2000.);
179 else if (range > 1600.)
180 cc->SetCanvasRangeMeters(1600.);
181 else if (range > 1200.)
182 cc->SetCanvasRangeMeters(1200.);
183 else if (range > 800.)
184 cc->SetCanvasRangeMeters(800.);
185 else if (range > 500.)
186 cc->SetCanvasRangeMeters(500.);
187 else if (range > 300.)
188 cc->SetCanvasRangeMeters(300.);
189
190 break;
191
192 case ID_RPLUS:
193 range = cc->GetCanvasRangeMeters();
194 range = wxRound(range * 10) / 10.;
195
196 if (range < 300.)
197 cc->SetCanvasRangeMeters(300.);
198 else if (range < 500.)
199 cc->SetCanvasRangeMeters(500.);
200 else if (range < 800.)
201 cc->SetCanvasRangeMeters(800.);
202 else if (range < 1200.)
203 cc->SetCanvasRangeMeters(1200.);
204 else if (range < 1600.)
205 cc->SetCanvasRangeMeters(1600.);
206 else if (range < 2000.)
207 cc->SetCanvasRangeMeters(2000.);
208 else if (range < 4000.)
209 cc->SetCanvasRangeMeters(4000.);
210 else if (range < 8000.)
211 cc->SetCanvasRangeMeters(8000.);
212
213 break;
214
215 default:
216 break;
217 }
218 m_ptoolbar->InvalidateBitmaps();
219 RefreshToolbar();
220}
221
222void iENCToolbar::SetDensityToolBitmap(int nDensity) {
223 int toolID = m_toolDensity->GetId();
224
225 if (nDensity == 0)
226 m_ptoolbar->SetToolBitmaps(ID_DENSITY, &m_bmMinimum, &m_bmMinimum);
227 else if (nDensity == 1)
228 m_ptoolbar->SetToolBitmaps(ID_DENSITY, &m_bmStandard, &m_bmStandard);
229 else if (nDensity == 2)
230 m_ptoolbar->SetToolBitmaps(ID_DENSITY, &m_bmAll, &m_bmAll);
231 else if (nDensity == 3)
232 m_ptoolbar->SetToolBitmaps(ID_DENSITY, &m_bmUStd, &m_bmUStd);
233}
234
235void iENCToolbar::SetRangeToolBitmap() {
236 wxMemoryDC dc;
237 dc.SelectObject(*m_pbmScratch);
238 dc.SetBackground(wxBrush(GetGlobalColor("DILG0")));
239 dc.Clear();
240 dc.DrawBitmap(m_bmRMinus, wxPoint(0, 0));
241
242 // Render the range as text onto the template
243 m_rangeFont = wxTheFontList->FindOrCreateFont(
244 12, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL);
245
246 wxString range_string;
247 range_string.Printf("%4.0fm", m_range);
248
249 dc.SetFont(*m_rangeFont);
250
251 // Select a font that will fit into the allow space.
252 bool good = false;
253 int target_points = 12;
254 while (!good && (target_points > 4)) {
255 int width, height;
256 dc.GetTextExtent(range_string, &width, &height);
257 if (width < 50) {
258 good = true;
259 break;
260 } else {
261 target_points--;
262 m_rangeFont = wxTheFontList->FindOrCreateFont(
263 target_points, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL,
264 wxFONTWEIGHT_NORMAL);
265 dc.SetFont(*m_rangeFont);
266 }
267 }
268
269 dc.SetTextForeground(*wxBLACK);
270 dc.SetBackgroundMode(wxTRANSPARENT);
271
272 dc.DrawText(range_string, 42, 8);
273
274 dc.SelectObject(wxNullBitmap);
275
276 m_ptoolbar->SetToolBitmaps(ID_RMINUS, m_pbmScratch, m_pbmScratch);
277}
278
279void iENCToolbar::StateTimerEvent(wxTimerEvent &event) {
280 ChartCanvas *cc = gFrame->GetPrimaryCanvas();
281 if (!cc) return;
282
283 bool bRefresh = false;
284 // Keep the Density tool in sync
285 if (ps52plib) {
286 int nset = 1;
287
288 switch (gFrame->GetPrimaryCanvas()->GetENCDisplayCategory()) {
289 case (DISPLAYBASE):
290 nset = 0;
291 break;
292 case (STANDARD):
293 nset = 1;
294 break;
295 case (OTHER):
296 nset = 2;
297 break;
298 case (MARINERS_STANDARD):
299 nset = 3;
300 break;
301 default:
302 nset = 1;
303 break;
304 }
305
306 if (nset != m_nDensity) {
307 if (nset < 3) {
308 m_nDensity = nset;
309 SetDensityToolBitmap(m_nDensity);
310
311 bRefresh = true;
312 }
313 }
314 }
315
316 // Keep the Range annunciator updated
317
318 if (cc) {
319 double range = cc->GetCanvasRangeMeters();
320
321 if (range != m_range) {
322 m_range = range;
323 SetRangeToolBitmap();
324 bRefresh = true;
325 }
326 }
327 if (bRefresh) {
328 RebuildToolbar();
329 m_ptoolbar->InvalidateBitmaps();
330 RefreshToolbar();
331 }
332
333 // Restore runtime timer frequency after startup
334 m_state_timer.Start(500, wxTIMER_CONTINUOUS);
335}
Generic Chart canvas base.
ChartCanvas - Main chart display and interaction component.
Definition chcanv.h:151
Floating toolbar for iENC (International Electronic Navigational Chart) functionality.
Floating toolbar dialog for OpenCPN.
Definition toolbar.h:386
iENCToolbar * g_iENCToolbar
Global instance.
iENC specific chart operations floating toolbar extension
PlugInManager and helper classes – Mostly gui parts (dialogs) and plugin API stuff.
SVG utilities.