%% options copyright owner = Dirk Krause copyright year = 2011-xxxx SPDX-License-Identifier: BSD-3-Clause %% header #ifndef DK4CONF_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4conf.h" #else #include #endif #endif #ifndef DK4TYPES_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "dk4types.h" #else #include #endif #endif #include #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include #endif #ifndef DK4WXAPPLICATIONHELPER_H_INCLUDED #if DK4_BUILDING_DKTOOLS4 #include "Dk4WxApplicationHelper.h" #else #include #endif #endif #if wxCHECK_VERSION(3,0,0) /** Event generated if the colour was changed. */ wxDECLARE_EVENT(wxEVT_DK4_COLOUR_VIEW_EVENT, wxCommandEvent); #else /** Event generated if the colour was changed. */ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_DK4_COLOUR_VIEW_EVENT, -1) END_DECLARE_EVENT_TYPES() #endif /** Show color setting, show colour chooser on mouse click. */ class Dk4WxColourView : public wxControl { /** Declare class as dynamic. */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_DYNAMIC_CLASS(Dk4WxColourView); #else DECLARE_DYNAMIC_CLASS(Dk4WxColourView) #endif /** Event table for control. */ #if wxCHECK_VERSION(3,0,0) wxDECLARE_EVENT_TABLE(); #else DECLARE_EVENT_TABLE() #endif protected: /** Parent window. */ wxWindow *pParentWindow; /** Application helper, used to position color chooser dialog. */ Dk4WxApplicationHelper *pHelper; /** Class name, used in constructor and Create(). */ static wxChar const Dk4WxColourViewName[]; /** ID to use in generated events. */ wxWindowID m_wxid; /** Height. */ int w; /** Width. */ int h; /** Red component of color to show. */ int r; /** Green component of color to show. */ int g; /** Blue component of color to show. */ int b; /** Previous x position of color chooser dialog. */ int ccdx; /** Previous y position of color chooser dialog. */ int ccdy; /** Previous x position of color palette dialog. */ int cpdx; /** Previous x position of color palette dialog. */ int cpdy; /** Activity flag, allow to choose a color. */ bool bActive; /** Flag: Prefer platte over normal view. */ bool bPalettePreferred; /** Flag: Set position for colour chooser. */ bool bPlaceColourChooser; /** Flag: Show active/inactive state. */ bool bMarkActiveInactive; /** Flag: Show colour chooser with a border. */ bool bWithBorder; protected: /** Send event for changed colour. */ void SendColourViewEvent(void); /** Place colour chooser dialog. @param dlg Dialog to place. @param x Saved x coordinate or -1. @param y Saved y coordinate or -1. */ void PlaceColourChooser(wxWindow & dlg, int x, int y); /** Run the system colour chooser. */ void RunSystemColourChooser(void); /** Run the palette based colour chooser. */ void RunPaletteColourChooser(void); public: /** Default constructor. */ Dk4WxColourView(); /** Constructor. @param pParent Parent window. @param wxid Window ID. @param appHelper Application helper. @param red Red component of color to show. @param green Green component of color to show. @param blue Blue component of color to show. @param pos Object position. @param size Object minimum size. @param style Style for control. @param name Class name. */ Dk4WxColourView( wxWindow *pParent, wxWindowID wxid, Dk4WxApplicationHelper *appHelper, int red, int green, int blue, wxPoint const & pos = wxDefaultPosition, wxSize const & size = wxDefaultSize, long style = wxBORDER_NONE, wxChar const *name = Dk4WxColourViewName ); /** Create object after using default constructor. @param pParent Parent window. @param wxid Window ID. @param appHelper Application helper. @param red Red component of color to show. @param green Green component of color to show. @param blue Blue component of color to show. @param pos Object position. @param size Object minimum size. @param style Style for control. @param name Class name. @return true on success, false on error. */ bool Create( wxWindow *pParent, wxWindowID wxid, Dk4WxApplicationHelper *appHelper, int red = 255, int green = 255, int blue = 255, wxPoint const & pos = wxDefaultPosition, wxSize const & size = wxDefaultSize, long style = wxBORDER_NONE, wxChar const *name = Dk4WxColourViewName ); /** Find minimum size. */ wxSize DoGetBestSize() const; /** Get red component of current color. @return Red. */ int Red() const; /** Get green component of current color. @return Green. */ int Green() const; /** Get blue component of current color. @return Blue. */ int Blue() const; /** Set new current color. @param red Red. @param green Green. @param blue Blue. */ void SetRGB(int red, int green, int blue); /** Set activity flag. */ void SetActive(bool b); /** Set palette as preferred method to choose a color. */ void SetPalettePreferred(bool b = true); /** Set whether to place the colour chooser near the colour view. @param b New flag value. */ void SetPlaceColourChooser(bool b = true); /** Set whether to indicate active/inactive state. @param b new flag value. */ void SetMarkActiveInactive(bool b = true); /** Set up border for colour chooser. @param b Flag for border. */ void SetColourChooserWithBorder(bool b = true); /** Handler for erase event. @param event Event to process. */ void OnErase(wxEraseEvent & event); /** Handler for paint event. @param event Event to process. */ void OnPaint(wxPaintEvent & event); /** Handler for mouse click event. @param event Event to process. */ void OnLeftMouseButtonDown(wxMouseEvent & event); /** Handler for right mouse click event. @param event Event to process. */ void OnRightMouseButtonDown(wxMouseEvent & event); }; /* vim: set ai sw=4 ts=4 : */ %% module #include "dk4conf.h" #include "Dk4WxColourView.h" #include #include #include "Dk4WxColourPalette.h" $!trace-include /** Handlers for events. */ #if wxCHECK_VERSION(3,0,0) wxBEGIN_EVENT_TABLE(Dk4WxColourView,wxControl) #else BEGIN_EVENT_TABLE(Dk4WxColourView,wxControl) #endif EVT_ERASE_BACKGROUND(Dk4WxColourView::OnErase) EVT_PAINT(Dk4WxColourView::OnPaint) EVT_LEFT_DOWN(Dk4WxColourView::OnLeftMouseButtonDown) EVT_RIGHT_DOWN(Dk4WxColourView::OnRightMouseButtonDown) #if wxCHECK_VERSION(3,0,0) wxEND_EVENT_TABLE() #else END_EVENT_TABLE() #endif /** Implementation of dynamic class. */ #if wxCHECK_VERSION(3,0,0) wxIMPLEMENT_DYNAMIC_CLASS(Dk4WxColourView, wxControl); #else IMPLEMENT_DYNAMIC_CLASS(Dk4WxColourView, wxControl) #endif #if wxCHECK_VERSION(3,0,0) /** Event generated if the colour was changed. */ wxDEFINE_EVENT(wxEVT_DK4_COLOUR_VIEW_EVENT, wxCommandEvent); #else /** Event generated if the colour was changed. */ DEFINE_EVENT_TYPE(wxEVT_DK4_COLOUR_VIEW_EVENT) #endif /** Name of the control. */ wxChar const Dk4WxColourView::Dk4WxColourViewName[] = { wxT("Dk4WxColourView") } ; static int const default_palette_components[] = { 0, 0, 0, 0, 0, 255, 0, 255, 0, 0, 255, 255, 255, 0, 0, 255, 0, 255, 255, 255, 0, 255, 255, 255, 192, 192, 192, 54, 78, 109, 0, 143, 0, 0, 209, 209, 209, 0, 0, 255, 224, 224, 255, 214, 0, 127, 48, 0, }; Dk4WxColourView::Dk4WxColourView() { pParentWindow = NULL; pHelper = NULL; w = -1; h = -1; r = 255; g = 255; b = 255; ccdx = -1; ccdy = -1; cpdx = -1; cpdy = -1; bActive = true; bPalettePreferred = false; bPlaceColourChooser = false; bMarkActiveInactive = true; $? ". bMarkActiveInactive = true" bWithBorder = true; m_wxid = wxID_ANY; } Dk4WxColourView::Dk4WxColourView( wxWindow *pParent, wxWindowID wxid, Dk4WxApplicationHelper *appHelper, int red, int green, int blue, wxPoint const & pos, wxSize const & size, long style, wxChar const *name ) : wxControl( pParent, wxid, pos, size, style, wxDefaultValidator, wxString(name) ) { pParentWindow = pParent; pHelper = appHelper; w = size.x; h = size.y; r = red; g = green; b = blue; ccdx = -1; ccdy = -1; cpdx = -1; cpdy = -1; bActive = true; bPalettePreferred = false; bPlaceColourChooser = false; bMarkActiveInactive = true; $? ". bMarkActiveInactive = true" bWithBorder = true; m_wxid = wxid; } bool Dk4WxColourView::Create( wxWindow *pParent, wxWindowID wxid, Dk4WxApplicationHelper *appHelper, int red, int green, int blue, wxPoint const & pos, wxSize const & size, long style, wxChar const *name ) { bool back; back = wxControl::Create( pParent, wxid, pos, size, style, wxDefaultValidator, wxString(name) ); pParentWindow = pParent; pHelper = appHelper; w = size.x; h = size.y; r = red; g = green; b = blue; ccdx = -1; ccdy = -1; cpdx = -1; cpdy = -1; bActive = true; bPalettePreferred = false; bPlaceColourChooser = false; bMarkActiveInactive = true; $? ". bMarkActiveInactive = true" bWithBorder = true; m_wxid = wxid; return back; } wxSize Dk4WxColourView::DoGetBestSize() const { wxSize back(((-1 < w) ? w : 20), ((-1 < h) ? h : 20)); return back; } void Dk4WxColourView::OnErase(wxEraseEvent & WXUNUSED(event)) { } void Dk4WxColourView::OnPaint(wxPaintEvent & WXUNUSED(event)) { wxBufferedPaintDC useDC(this); wxSize sz = GetClientSize(); wxColour mycolor(r, g, b); #if wxCHECK_VERSION(3,0,0) wxBrush myBrush(mycolor, wxBRUSHSTYLE_SOLID); #else wxBrush myBrush(mycolor, wxSOLID); #endif wxPen myPen(mycolor); int b = 2; $? "+ OnPaint" if (bActive || (!(bMarkActiveInactive))) { useDC.SetBrush(myBrush); useDC.SetPen(myPen); useDC.DrawRectangle(0, 0, sz.GetWidth(), sz.GetHeight()); } else { wxColour iac = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWFRAME); int w = sz.GetWidth(); int h = sz.GetHeight(); if (w < h) { b = w / 4; } else { b = h / 4; } wxPen blackPen(wxColour(127, 0, 0)); #if wxCHECK_VERSION(3,0,0) wxBrush grayBrush(iac, wxBRUSHSTYLE_SOLID); #else wxBrush grayBrush(iac, wxSOLID); #endif useDC.SetBrush(grayBrush); useDC.SetPen(blackPen); useDC.DrawRectangle(0, 0, sz.GetWidth(), sz.GetHeight()); useDC.SetBrush(myBrush); useDC.SetPen(myPen); useDC.DrawRectangle(b, b, (sz.GetWidth() - 2*b), (sz.GetHeight() - 2*b)); useDC.SetPen(blackPen); useDC.DrawLine(0, sz.GetHeight(), sz.GetWidth(), 0); } useDC.SetBrush(wxNullBrush); useDC.SetPen(wxNullPen); $? "- OnPaint" } void Dk4WxColourView::PlaceColourChooser(wxWindow & dlg, int x, int y) { if (bPlaceColourChooser) { Dk4WxApplicationHelper::ChooseChildPosition(*this, dlg); } else { if ((-1 < x) && (-1 < y)) { dlg.SetPosition( wxPoint(x,y) ); } else { if (NULL != pParentWindow) { Dk4WxApplicationHelper::ChooseChildPosition(*pParentWindow, dlg); } } } } void Dk4WxColourView::RunSystemColourChooser(void) { wxColour curcol(r, g, b); wxColourData wxcd; for (int i = 0; i < 16; i++) { wxColour col( default_palette_components[3*i], default_palette_components[3*i+1], default_palette_components[3*i+2] ); wxcd.SetCustomColour(i, col); } wxcd.SetColour(curcol); wxColourDialog dlg(this, &wxcd); PlaceColourChooser(dlg, ccdx, ccdy); if(dlg.ShowModal() == wxID_OK) { wxColour col = dlg.GetColourData().GetColour(); r = col.Red(); g = col.Green(); b = col.Blue(); dlg.GetPosition(&ccdx, &ccdy); Refresh(); Update(); SendColourViewEvent(); } else { dlg.GetPosition(&ccdx, &ccdy); } } void Dk4WxColourView::RunPaletteColourChooser(void) { Dk4WxColourPalette dlg( ((pParentWindow) ? (pParentWindow) : (this)), pHelper, r, g, b, bWithBorder ); PlaceColourChooser(dlg, cpdx, cpdy); if(dlg.ShowModal() == wxID_OK) { r = dlg.Red(); g = dlg.Green(); b = dlg.Blue(); dlg.GetPosition(&cpdx, &cpdy); Refresh(); Update(); SendColourViewEvent(); } else { dlg.GetPosition(&cpdx, &cpdy); } } void Dk4WxColourView::OnLeftMouseButtonDown(wxMouseEvent & WXUNUSED(event)) { $? "+ Dk4WxColourView::OnLeftMouseButtonDown" if (bActive) { if (bPalettePreferred) { RunPaletteColourChooser(); } else { RunSystemColourChooser(); } } $? "- Dk4WxColourView::OnLeftMouseButtonDown" } void Dk4WxColourView::OnRightMouseButtonDown(wxMouseEvent & WXUNUSED(event)) { $? "+ Dk4WxColourView::OnRightMouseButtonDown" if (bActive) { if (bPalettePreferred) { RunSystemColourChooser(); } else { RunPaletteColourChooser(); } } $? "- Dk4WxColourView::OnRightMouseButtonDown" } int Dk4WxColourView::Red() const { return r; } int Dk4WxColourView::Green() const { return g; } int Dk4WxColourView::Blue() const { return b; } void Dk4WxColourView::SetRGB(int red, int green, int blue) { r = red; g = green; b = blue; if(r < 0) r = 0; if(g < 0) g = 0; if(b < 0) b = 0; if(r > 255) r = 255; if(g > 255) g = 255; if(b > 255) b = 255; } void Dk4WxColourView::SetActive(bool b) { bool bMustUpdate; bMustUpdate = (bActive == b); bActive = b; if (bMustUpdate) { Refresh(); } #if 0 wxControl::Enable(b); #endif } void Dk4WxColourView::SetPalettePreferred(bool b) { bPalettePreferred = b; } void Dk4WxColourView::SetPlaceColourChooser(bool b) { bPlaceColourChooser = b; } void Dk4WxColourView::SetMarkActiveInactive(bool b) { bMarkActiveInactive = b; $? ". bMarkActiveInactive = %d", ((b) ? 1 : 0) } void Dk4WxColourView::SetColourChooserWithBorder(bool b) { bWithBorder = b; } void Dk4WxColourView::SendColourViewEvent(void) { if ((NULL != pParentWindow) && (wxID_ANY != m_wxid)) { wxCommandEvent ev(wxEVT_DK4_COLOUR_VIEW_EVENT, m_wxid); wxPostEvent(pParentWindow, ev); } } /* vim: set ai sw=4 ts=4 : */