%% options copyright owner = Dirk Krause copyright year = 2020-xxxx SPDX-License-Identifier: BSD-3-Clause %% wx-gui type = dialog contents = sizerHorizontal [wxBoxSizer sizerHorizontal] direction = horizontal contents = $space(10) contents = sizerVertical contents = $space(10) [wxBoxSizer sizerVertical] direction = vertical contents = $space(10) contents = sizerContents centered-x contents = $space(10) contents = sizerButtons centered-x contents = $space(10) [wxGridBagSizer sizerContents] grid = 5 5 grow = yes contents = lRadius 0 0 1 1 left centered-y contents = tRadius . +1 1 1 left centered-y contents = tUnit . +1 1 1 left centered-y contents = slRadius +1 0 1 3 centered-x growable column = 1 [wxStaticText lRadius] text = pTexts[502] [wxStaticText tRadius] text = sNlWx[7] [wxStaticText tUnit] text = pTexts[szUnitIndex] [wxSlider slRadius] id = WXD_ID_RADIUS range = 0 10 value = 0 direction = horizontal grow = yes [wxStdDialogButtonSizer sizerButtons] grow = yes contents = buttonOK contents = buttonCancel [wxButton buttonOK] id = wxID_OK text = pTexts[476] tip = pTexts[478] [wxButton buttonCancel] id = wxID_CANCEL text = pTexts[477] tip = pTexts[479] %% header start #ifndef WXDKDRAW_H_INCLUDED #include "wxdkdraw.h" #endif #ifndef WXDKDRAWFRAME_H_INCLUDED #include "WxdkdrawFrame.h" #endif %% class start /** The box radius dialog lets the user choose the box radius using a slider. */ class WxdkdrawDlgBoxRadius : public wxDialog { private: /** Events to process. */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_EVENT_TABLE(); #else DECLARE_EVENT_TABLE() #endif %% class end protected: /** Parent frame. */ WxdkdrawFrame *m_pParent; /** Drawing control to refresh on changes. */ wxControl *m_pControl; /** Entire drawing. */ Wxd_drawing_t *m_pDrw; /** Object to modify. */ Wxd_object_t *m_pObject; /** Localized text fragments. */ wxChar const * const *m_sTexts; /** Not localized text fragments. */ wxChar const * const *m_sNlWx; /** Divisor to calculate inches or cm. */ double m_dDivisor; /** Original diameter. */ uint32_t m_uOriginalRadius; /** Step length. */ uint32_t m_uStepLength; /** Maximum number of steps. */ int m_iRangeMax; public: /** Slider control events. */ enum { WXD_ID_RADIUS = (wxID_HIGHEST + 1) /**< Diameter changed. */ }; /** Constructor. @param pParent Parent frame (programs main window). @param pControl Drawing control to refresh on changes. @param pDrw Drawing. @param pObject Box object to change radius for. @param pTexts Localized text fragments. @param sNlWx Non-localized text fragments. @param uStepLength Slider step size. @param iRangeMax Range maximum for slider (minimum is 0). @param szUnitIndex Unit name index in pTexts. */ WxdkdrawDlgBoxRadius( WxdkdrawFrame *pParent, wxControl *pControl, Wxd_drawing_t *pDrw, Wxd_object_t *pObject, wxChar const * const *pTexts, wxChar const * const *sNlWx, uint32_t uStepLength, int iRangeMax, size_t szUnitIndex ); /** OK button handler. @param event Event to process. */ void OnOK(wxCommandEvent & event); /** Cancel button handler. @param event Event to process. */ void OnCancel(wxCommandEvent & event); /** Slider event handler. @param event Event to process. */ void OnRadius(wxCommandEvent & event); }; %% header end %% module start #ifndef WXDKDRAWDLGDOTFILLED_H_INCLUDED #include "WxdkdrawDlgBoxRadius.h" #endif $!trace-include /** Events to process in this dialog. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WxdkdrawDlgBoxRadius,wxDialog) #else BEGIN_EVENT_TABLE(WxdkdrawDlgBoxRadius,wxDialog) #endif EVT_BUTTON(\ wxID_OK,\ WxdkdrawDlgBoxRadius::OnOK\ ) EVT_BUTTON(\ wxID_CANCEL,\ WxdkdrawDlgBoxRadius::OnCancel\ ) EVT_SLIDER(\ WxdkdrawDlgBoxRadius::WXD_ID_RADIUS,\ WxdkdrawDlgBoxRadius::OnRadius\ ) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif %% constructor start WxdkdrawDlgBoxRadius::WxdkdrawDlgBoxRadius( WxdkdrawFrame *pParent, wxControl *pControl, Wxd_drawing_t *pDrw, Wxd_object_t *pObject, wxChar const * const *pTexts, wxChar const * const *sNlWx, uint32_t uStepLength, int iRangeMax, size_t szUnitIndex ) : wxDialog( pParent, wxID_ANY, pTexts[574], wxDefaultPosition, wxDefaultSize, ( (wxDEFAULT_DIALOG_STYLE) & (~(wxRESIZE_BORDER)) & (~(wxCLOSE_BOX)) & (~(wxSYSTEM_MENU)) ) ) { $? "+ WxdkdrawDlgBoxRadius" $? ". uStepLength = %lu", (unsigned long)uStepLength $? ". iRangeMax = %d", iRangeMax $? ". szUnitIndex = %u", (unsigned)szUnitIndex m_pParent = pParent; m_pControl = pControl; m_pDrw = pDrw; m_pObject = pObject; m_sTexts = pTexts; m_sNlWx = sNlWx; m_uStepLength = uStepLength; m_iRangeMax = iRangeMax; m_uOriginalRadius = (pObject->det).b.r; m_dDivisor = ((((size_t)501U) == szUnitIndex) ? (CMWXD) : (RESWXD)); %% constructor end if (dkctGUILayoutOK) { /* Fix dialog size */ wxSize minsize = GetMinSize(); SetMaxSize(minsize); /* Retrieve object attributes */ slRadius->SetRange(0, iRangeMax); { wxString s; s.Printf(wxT("%g"), ((double)m_uOriginalRadius / m_dDivisor)); tRadius->SetLabel(s); } { int v; v = (int)(m_uOriginalRadius / uStepLength); if ( (m_uOriginalRadius % uStepLength) >= (uStepLength / (uint32_t)2UL) ) { v++; } slRadius->SetValue(v); } } $? "- WxdkdrawDlgBoxRadius" } %% module end void WxdkdrawDlgBoxRadius::OnOK(wxCommandEvent & WXUNUSED(event)) { if(IsModal()) { EndModal(wxID_OK); } else { SetReturnCode(wxID_OK); Show(false); } } void WxdkdrawDlgBoxRadius::OnCancel(wxCommandEvent & WXUNUSED(event)) { (m_pObject->det).b.r = m_uOriginalRadius; if(IsModal()) { EndModal(wxID_CANCEL); } else { SetReturnCode(wxID_CANCEL); Show(false); } } void WxdkdrawDlgBoxRadius::OnRadius(wxCommandEvent & WXUNUSED(event)) { dk4_er_t er; uint32_t r; int v; $? "+ OnRadius" v = slRadius->GetValue(); $? ". v = %d", v dk4error_init(&er); r = dk4ma_uint32_t_mul(m_uStepLength, (uint32_t)v, &er); $? ". r = %lu", (unsigned long)r if (DK4_E_NONE == er.ec) { (m_pObject->det).b.r = r; wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); m_pControl->Refresh(); m_pParent->Update(); { wxString s; s.Printf(wxT("%g"), ((double)r / m_dDivisor)); tRadius->SetLabel(s); } Refresh(); Update(); } else { /* ERROR: Overflow */ wxMessageBox( m_sTexts[504], m_sTexts[503], (wxOK | wxCENTRE | wxICON_ERROR) ); } $? "- OnRadius" } /* vim: set ai sw=4 ts=4 : */