%% options copyright owner = Dirk Krause copyright year = 2019-xxxx SPDX-License-Identifier: BSD-3-Clause %% header /** @file WxdkdrawDlgLayerManager.h Header file for the WxdkdrawDlgLayerManager module. */ #ifndef WXDKDRAW_H_INCLUDED #include "wxdkdraw.h" #endif #ifndef WXDKDRAWFRAME_H_INCLUDED #include "WxdkdrawFrame.h" #endif /** Dialog to change layer visibility. */ class WxdkdrawDlgLayerManager : public wxDialog { private: /** Events to handle */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_EVENT_TABLE(); #else DECLARE_EVENT_TABLE() #endif protected: /** Applications main frame. */ WxdkdrawFrame *m_pParent; /** Drawing to modify. */ Wxd_drawing_t *m_pDrw; /** Localized text fragments. */ wxChar const * const *m_pTexts; /** Layer structures containing checkbox pointers and previous value. */ Wxd_layer_cb_t *m_pLayerCb; /** Number of layers in drawing. */ size_t m_sLayerCb; /** Flag: GUI ok. */ bool dkctGUILayoutOK; /** GUI element sizerHorizontal. */ wxBoxSizer *sizerHorizontal; /** GUI element sizerVertical. */ wxBoxSizer *sizerVertical; /** GUI element scwContents. */ wxScrolledWindow *scwContents; /** GUI element sizerButtons. */ wxStdDialogButtonSizer *sizerButtons; /** GUI element sizerScwContents. */ wxBoxSizer *sizerScwContents; /** GUI element panelContents. */ wxPanel *panelContents; /** GUI element sizerContents. */ wxBoxSizer *sizerContents; #if 0 /** GUI element b00. */ wxCheckBox *b00; #endif /** GUI element buttonOK. */ wxButton *buttonOK; /** GUI element buttonCancel. */ wxButton *buttonCancel; public: /** Window IDs for events. */ enum { /** Start ID for layer checkboxes. */ WXD_ID_LAYER_START = (wxID_HIGHEST + 1) }; /** Constructor. @param pParent Applications main frame. @param pDrw Drawing to modify. @param pTexts Localized text fragments. @param pLayerCb Layer information structures. @param sLayerCb Number of layers in drawing and in pLayerCb. */ WxdkdrawDlgLayerManager( WxdkdrawFrame *pParent, Wxd_drawing_t *pDrw, wxChar const * const *pTexts, Wxd_layer_cb_t *pLayerCb, size_t sLayerCb ); /** Handler for OK button. @param event Event to process. */ void OnOK(wxCommandEvent & event); /** Handler for Cancel button. @param event Event to process. */ void OnCancel(wxCommandEvent & event); /** Handler for checkbox state change. @param event Event to process. */ void OnCheckBox(wxCommandEvent & event); protected: /** Unconnect event handler from all checkboxes. */ void UnconnectCheckBoxEvents(void); }; /* vim: set ai sw=4 ts=4 : */ %% module /** @file WxdkdrawDlgLayerManager.cpp The WxdkdrawDlgLayerManager module. */ #ifndef WXDKDRAWDLGLAYERMANAGER_H_INCLUDED #include "WxdkdrawDlgLayerManager.h" #endif $!trace-include /** Assign methods to event IDs. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(WxdkdrawDlgLayerManager,wxDialog) #else BEGIN_EVENT_TABLE(WxdkdrawDlgLayerManager,wxDialog) #endif EVT_BUTTON(\ wxID_OK,\ WxdkdrawDlgLayerManager::OnOK\ ) EVT_BUTTON(\ wxID_CANCEL,\ WxdkdrawDlgLayerManager::OnCancel\ ) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif WxdkdrawDlgLayerManager::WxdkdrawDlgLayerManager( WxdkdrawFrame *pParent, Wxd_drawing_t *pDrw, wxChar const * const *pTexts, Wxd_layer_cb_t *pLayerCb, size_t sLayerCb ) : wxDialog( pParent, wxID_ANY, pTexts[334], wxDefaultPosition, wxDefaultSize, ( ((wxDEFAULT_DIALOG_STYLE) | (wxRESIZE_BORDER)) & (~(wxCLOSE_BOX)) & (~(wxSYSTEM_MENU)) ) ) { size_t i; $? "+ WxdkdrawDlgLayerManager" m_pParent = pParent; m_pDrw = pDrw; m_pTexts = pTexts; m_pLayerCb = pLayerCb; m_sLayerCb = sLayerCb; $? ". sLayerCb = %u", (unsigned)sLayerCb dkctGUILayoutOK = false; sizerHorizontal = NULL; sizerVertical = NULL; scwContents = NULL; sizerButtons = NULL; sizerScwContents = NULL; panelContents = NULL; sizerContents = NULL; #if 0 b00 = NULL; #endif buttonOK = NULL; buttonCancel = NULL; sizerHorizontal = new wxBoxSizer( wxHORIZONTAL ); if(!(sizerHorizontal)) { goto dkctGUILayoutFinished; } sizerHorizontal->Add(10, 10, 0); sizerVertical = new wxBoxSizer( wxVERTICAL ); if(!(sizerVertical)) { goto dkctGUILayoutFinished; } sizerVertical->Add(10, 10, 0); scwContents = new wxScrolledWindow( this, wxID_ANY, wxDefaultPosition, wxSize(150, 200) ); if(!(scwContents)) { goto dkctGUILayoutFinished; } sizerScwContents = new wxBoxSizer( wxVERTICAL ); if(!(sizerScwContents)) { goto dkctGUILayoutFinished; } panelContents = new wxPanel( scwContents, wxID_ANY ); if(!(panelContents)) { goto dkctGUILayoutFinished; } sizerContents = new wxBoxSizer( wxVERTICAL ); if(!(sizerContents)) { goto dkctGUILayoutFinished; } sizerContents->Add(10, 10, 0); $? ". have %u layers", (unsigned)m_sLayerCb for (i = 0; i < m_sLayerCb; i++) { $? ". loop start %u", (unsigned)i if ((size_t)0U != i) { sizerContents->Add(10, 10, 0); } if (NULL != m_pLayerCb[i].lay) { $? ". layer number %d", (int)((m_pLayerCb[i].lay)->lay) int idv = WXD_ID_LAYER_START + (int)i; wxString str; str.Printf(wxT("%6d"), (int)((m_pLayerCb[i].lay)->lay)); m_pLayerCb[i].cb = new wxCheckBox(panelContents, idv, str); if (NULL == m_pLayerCb[i].cb) { goto dkctGUILayoutFinished; } sizerContents->Add(m_pLayerCb[i].cb); Connect( idv, wxEVT_CHECKBOX, wxCommandEventHandler(WxdkdrawDlgLayerManager::OnCheckBox) ); } } #if 0 b00 = new wxCheckBox( panelContents, wxID_ANY, wxT("Button 0") ); if(!(b00)) { goto dkctGUILayoutFinished; } b00->SetToolTip(wxT("A button to click")); sizerContents->Add( b00 ); #endif sizerContents->Add(10, 10, 0); panelContents->SetSizer(sizerContents); sizerScwContents->Add( panelContents ); scwContents->SetSizer(sizerScwContents); sizerVertical->Add( scwContents, 1, wxALIGN_CENTER_HORIZONTAL ); sizerVertical->Add(10, 10, 0); sizerButtons = new wxStdDialogButtonSizer( ); if(!(sizerButtons)) { goto dkctGUILayoutFinished; } buttonOK = new wxButton( this, wxID_OK, pTexts[335] ); if(!(buttonOK)) { goto dkctGUILayoutFinished; } buttonOK->SetToolTip(pTexts[337]); sizerButtons->AddButton( buttonOK ); buttonCancel = new wxButton( this, wxID_CANCEL, pTexts[336] ); if(!(buttonCancel)) { goto dkctGUILayoutFinished; } buttonCancel->SetToolTip(pTexts[338]); sizerButtons->AddButton( buttonCancel ); sizerButtons->Realize(); sizerVertical->Add( sizerButtons, 0, wxALIGN_CENTER_HORIZONTAL ); sizerVertical->Add(10, 10, 0); sizerHorizontal->Add( sizerVertical, 1, wxGROW ); sizerHorizontal->Add(10, 10, 0); SetSizer(sizerHorizontal); dkctGUILayoutOK = true; dkctGUILayoutFinished: if (dkctGUILayoutOK) { for (i = 0; i < m_sLayerCb; i++) { if ((NULL != m_pLayerCb[i].lay) && (NULL != m_pLayerCb[i].cb)) { if (0x00 != (m_pLayerCb[i].lay)->active) { (m_pLayerCb[i].cb)->SetValue(true); } else { (m_pLayerCb[i].cb)->SetValue(false); } } } panelContents->Layout(); wxSize panelsize = panelContents->GetSize(); scwContents->SetScrollbars( 10, 10, (panelsize.GetWidth() / 10), (panelsize.GetHeight() / 10) ); sizerHorizontal->Fit(this); sizerHorizontal->SetSizeHints(this); } $? "- WxdkdrawDlgLayerManager" } void WxdkdrawDlgLayerManager::UnconnectCheckBoxEvents(void) { size_t i; /* Traverse all checkboxes */ for (i = 0; i < m_sLayerCb; i++) { Disconnect( (WXD_ID_LAYER_START + (int)i), wxEVT_CHECKBOX, wxCommandEventHandler(WxdkdrawDlgLayerManager::OnCheckBox) ); } } void WxdkdrawDlgLayerManager::OnOK(wxCommandEvent & WXUNUSED(event)) { UnconnectCheckBoxEvents(); if(IsModal()) { EndModal(wxID_OK); } else { SetReturnCode(wxID_OK); Show(false); } } void WxdkdrawDlgLayerManager::OnCancel(wxCommandEvent & WXUNUSED(event)) { UnconnectCheckBoxEvents(); if(IsModal()) { EndModal(wxID_CANCEL); } else { SetReturnCode(wxID_CANCEL); Show(false); } } void WxdkdrawDlgLayerManager::OnCheckBox(wxCommandEvent & event) { int idv; /* Window ID from checkbox, index in array */ bool b; /* Checkbox value */ $? "+ OnCheckBox" idv = event.GetId(); idv = idv - WXD_ID_LAYER_START; if (0 <= idv) { if ((size_t)idv < m_sLayerCb) { if ((NULL != m_pLayerCb[idv].lay) && (NULL != m_pLayerCb[idv].cb)) { b = (m_pLayerCb[idv].cb)->GetValue(); (m_pLayerCb[idv].lay)->active = ((b) ? (0x01) : (0x00)); m_pParent->RequireRedraw(WXD_REFRESH_DRAWING); } } } $? "- OnCheckBox" } /* vim: set ai sw=4 ts=4 : */