%% 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 = lDiameter 0 0 1 1 right centered-y contents = spDiameter . +1 1 1 left centered-y contents = lLinewidth +1 0 1 1 right centered-y contents = spLinewidth . +1 1 1 left centered-y [wxStaticText lDiameter] text = pTexts[495] [wxSpinCtrl spDiameter] id = WXD_ID_DIAMETER range = 1 65535 value = 8 tip = pTexts[496] [wxStaticText lLinewidth] text = pTexts[497] [wxSpinCtrl spLinewidth] id = WXD_ID_LINEWIDTH range = 1 65535 value = 2 tip = pTexts[498] [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 /** Dialog to change dot details. */ class WxdkdrawDlgDotFilled : 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; /** Original diameter. */ uint16_t m_uOriginalDiameter; /** Original line width. */ uint16_t m_uOriginalLinewidth; public: /** Spin contrl events. */ enum { WXD_ID_DIAMETER = (wxID_HIGHEST + 1), /**< Diameter changed. */ WXD_ID_LINEWIDTH /**< Line width changed. */ }; /** Constructor. @param pParent Parent frame (programs main window). @param pControl Control to refresh on changes. @param pDrw Drawing. @param pObject Dot object to modify. @param pTexts Localized text fragments. */ WxdkdrawDlgDotFilled( WxdkdrawFrame *pParent, wxControl *pControl, Wxd_drawing_t *pDrw, Wxd_object_t *pObject, wxChar const * const *pTexts ); /** OK button handler. @param event Event to process. */ void OnOK(wxCommandEvent & event); /** Cancel button handler. @param event Event to process. */ void OnCancel(wxCommandEvent & event); /** Diameter spin control handler. @param event Event to process. */ void OnDiameter(wxSpinEvent & event); /** Line width spin control handler. @param event Event to process. */ void OnLinewidth(wxSpinEvent & event); }; %% header end %% module start #ifndef WXDKDRAWDLGDOTFILLED_H_INCLUDED #include "WxdkdrawDlgDotFilled.h" #endif $!trace-include /** Events to process in this dialog. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WxdkdrawDlgDotFilled,wxDialog) #else BEGIN_EVENT_TABLE(WxdkdrawDlgDotFilled,wxDialog) #endif EVT_BUTTON(\ wxID_OK,\ WxdkdrawDlgDotFilled::OnOK\ ) EVT_BUTTON(\ wxID_CANCEL,\ WxdkdrawDlgDotFilled::OnCancel\ ) EVT_SPINCTRL(\ WxdkdrawDlgDotFilled::WXD_ID_DIAMETER,\ WxdkdrawDlgDotFilled::OnDiameter\ ) EVT_SPINCTRL(\ WxdkdrawDlgDotFilled::WXD_ID_LINEWIDTH,\ WxdkdrawDlgDotFilled::OnLinewidth\ ) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif %% constructor start WxdkdrawDlgDotFilled::WxdkdrawDlgDotFilled( WxdkdrawFrame *pParent, wxControl *pControl, Wxd_drawing_t *pDrw, Wxd_object_t *pObject, wxChar const * const *pTexts ) : wxDialog( pParent, wxID_ANY, pTexts[494], wxDefaultPosition, wxDefaultSize, ( (wxDEFAULT_DIALOG_STYLE) & (~(wxRESIZE_BORDER)) & (~(wxCLOSE_BOX)) & (~(wxSYSTEM_MENU)) ) ) { m_pParent = pParent; m_pControl = pControl; m_pDrw = pDrw; m_pObject = pObject; m_sTexts = pTexts; m_uOriginalDiameter = (pObject->det).d.d; m_uOriginalLinewidth = pObject->lw; %% constructor end if (dkctGUILayoutOK) { /* Fix dialog size */ wxSize minsize = GetMinSize(); SetMaxSize(minsize); /* Retrieve object attributes */ spDiameter->SetValue( (int)((pObject->det).d.d) ); if (WXD_OT_DOT_WHITE == m_pObject->ot) { if ((uint16_t)1U < (pObject->det).d.d) { spLinewidth->SetRange(1, ((int)((pObject->det).d.d) - 1)); } else { spLinewidth->SetRange(1, (int)((pObject->det).d.d) ); } spLinewidth->SetValue(pObject->lw); } else { spLinewidth->Enable(false); } } } %% module end void WxdkdrawDlgDotFilled::OnOK(wxCommandEvent & WXUNUSED(event)) { (m_pObject->det).d.d = (uint16_t)(spDiameter->GetValue()); if (WXD_OT_DOT_WHITE == m_pObject->ot) { m_pObject->lw = (uint16_t)(spLinewidth->GetValue()); } if(IsModal()) { EndModal(wxID_OK); } else { SetReturnCode(wxID_OK); Show(false); } } void WxdkdrawDlgDotFilled::OnCancel(wxCommandEvent & WXUNUSED(event)) { (m_pObject->det).d.d = m_uOriginalDiameter; if (WXD_OT_DOT_WHITE == m_pObject->ot) { m_pObject->lw = m_uOriginalLinewidth; } if(IsModal()) { EndModal(wxID_CANCEL); } else { SetReturnCode(wxID_CANCEL); Show(false); } } void WxdkdrawDlgDotFilled::OnDiameter(wxSpinEvent & WXUNUSED(event)) { int diameter; int lw; int maxlw; bool bUpdateDrawing = false; bool bUpdateDialog = false; diameter = spDiameter->GetValue(); if ((uint16_t)diameter != (m_pObject->det).d.d) { (m_pObject->det).d.d = diameter; bUpdateDrawing = true; } if (WXD_OT_DOT_WHITE == m_pObject->ot) { maxlw = ((1 < diameter) ? (diameter - 1) : (diameter)); spLinewidth->SetRange(1, maxlw); bUpdateDialog = true; lw = spLinewidth->GetValue(); if (lw > maxlw) { spLinewidth->SetValue(maxlw); m_pObject->lw = (uint16_t)maxlw; } } if (bUpdateDrawing) { wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); m_pControl->Refresh(); m_pParent->Update(); } if (bUpdateDialog) { spLinewidth->Refresh(); Update(); } } void WxdkdrawDlgDotFilled::OnLinewidth(wxSpinEvent & WXUNUSED(event)) { if (WXD_OT_DOT_WHITE == m_pObject->ot) { m_pObject->lw = spLinewidth->GetValue(); wxdobj_drw_require_redraw(m_pDrw, WXD_REFRESH_MARKUP); m_pControl->Refresh(); m_pParent->Update(); } } /* vim: set ai sw=4 ts=4 : */