From: Vadim Zeitlin Date: Thu, 17 Feb 2005 18:29:22 +0000 (+0000) Subject: more tweaks to drop down arrow drawing (Andreas Pflug) X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/38511687af1f6f5500b66978b3c32d9d72ec4f88 more tweaks to drop down arrow drawing (Andreas Pflug) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@32120 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/datectlg.cpp b/src/generic/datectlg.cpp index 4c8e902b54..ce8fb71cf1 100644 --- a/src/generic/datectlg.cpp +++ b/src/generic/datectlg.cpp @@ -78,6 +78,104 @@ enum // local classes // ---------------------------------------------------------------------------- + +class wxDropdownButton : public wxBitmapButton +{ +public: + wxDropdownButton() { Init(); } + wxDropdownButton(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style=0, + const wxValidator& validator = wxDefaultValidator); + + void Init() + { + m_borderX = -1; + m_borderY = -1; + } + void Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = 0, + const wxValidator& validator = wxDefaultValidator); + + void DoMoveWindow(int x, int y, int w, int h); + +protected: + int m_borderX, m_borderY; +}; + + +wxDropdownButton::wxDropdownButton(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator) +{ + Init(); + Create(parent, id, pos, size, style, validator); +} + + +void wxDropdownButton::Create(wxWindow *parent, + wxWindowID id, + const wxPoint& pos, + const wxSize& size, + long style, + const wxValidator& validator) +{ + wxBitmap chkBmp(15,15); // arbitrary + wxBitmapButton::Create(parent, id, chkBmp, pos, wxDefaultSize, wxBU_AUTODRAW, validator); + + int w, h; + + w=chkBmp.GetWidth(); + h=chkBmp.GetHeight(); + m_borderX = GetSize().x - m_marginX - w; + m_borderY = GetSize().y - m_marginY - h; + + w = (size.x > 0 ? size.x : GetSize().x); + h = (size.y > 0 ? size.y : GetSize().y); + + DoMoveWindow(pos.x, pos.y, w, h); +} + + +void wxDropdownButton::DoMoveWindow(int x, int y, int w, int h) +{ + if (m_borderX >= 0 && m_borderY >= 0 && (w >= 0 || h >= 0)) + { + wxMemoryDC dc; + if (w < 0) + w = GetSize().x; +#ifdef __WXGTK__ + else + w = m_marginX + m_borderX + 15; // GTK magic size +#endif + if (h < 0) + h = GetSize().y; + + int bw = w - m_marginX - m_borderX; + int bh = h - m_marginY - m_borderY; + if (bh < 11) bh=11; + if (bw < 9) bw=9; + + wxBitmap bmp(bw, bh); + dc.SelectObject(bmp); + + wxRendererNative::Get().DrawComboBoxDropButton(this, dc, wxRect(0,0,bw, bh)); + + SetBitmapLabel(bmp); + } + + wxBitmapButton::DoMoveWindow(x, y, w, h); +} + + #if wxUSE_POPUPWIN #include "wx/popupwin.h" @@ -169,6 +267,7 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent, InheritAttributes(); m_txt = new wxTextCtrl(this, CTRLID_TXT); + m_txt->Connect(wxEVT_KEY_DOWN, wxKeyEventHandler(wxDatePickerCtrlGeneric::OnEditKey), NULL, this); @@ -176,23 +275,10 @@ bool wxDatePickerCtrlGeneric::Create(wxWindow *parent, wxFocusEventHandler(wxDatePickerCtrlGeneric::OnKillFocus), NULL, this); - const int height = m_txt->GetBestSize().y - 4; // FIXME: fudge - wxBitmap bmp(height, height); - { - wxMemoryDC dc; - dc.SelectObject(bmp); - wxRendererNative::Get().DrawComboBoxDropButton - ( - this, - dc, - wxRect(0, 0, height, height) - ); - } - - wxBitmapButton *btn = new wxBitmapButton(this, CTRLID_BTN, bmp); - btn->SetMargins(0, 0); - m_btn = btn; + const int height = m_txt->GetBestSize().y; + m_btn = new wxDropdownButton(this, CTRLID_BTN, wxDefaultPosition, wxSize(height, height)); + m_popup = new wxDatePopupInternal(this); m_popup->SetFont(GetFont()); diff --git a/src/gtk/renderer.cpp b/src/gtk/renderer.cpp index 61a6b73165..8b097e5c76 100644 --- a/src/gtk/renderer.cpp +++ b/src/gtk/renderer.cpp @@ -73,6 +73,11 @@ public: wxOrientation orient, int flags = 0); + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); }; @@ -104,19 +109,19 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, if (s_button == NULL) { s_window = gtk_window_new( GTK_WINDOW_POPUP ); - gtk_widget_realize( s_window ); - s_button = gtk_button_new(); - gtk_container_add( GTK_CONTAINER(s_window), s_button ); - gtk_widget_realize( s_button ); + gtk_widget_realize( s_window ); + s_button = gtk_button_new(); + gtk_container_add( GTK_CONTAINER(s_window), s_button ); + gtk_widget_realize( s_button ); } gtk_paint_box ( - s_button->style, + s_button->style, GTK_PIZZA(win->m_wxwindow)->bin_window, flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, + NULL, s_button, "button", dc.XLOG2DEV(rect.x) -1, rect.y -1, rect.width +2, rect.height +2 @@ -342,3 +347,31 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, #endif // GTK+ 2.x/1.x } +void wxRendererGTK::DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + dc.SetBrush(wxBrush(win->GetBackgroundColour())); + dc.SetPen(wxPen(win->GetBackgroundColour())); + dc.DrawRectangle(rect); + + int x = (rect.GetWidth()-9) / 2; + int y = (rect.GetHeight()-10) / 2; + + wxPoint pt[] = + { + wxPoint(x+2, y+3), + wxPoint(x+6, y+3), + wxPoint(x+6, y+6), + wxPoint(x+8, y+6), + wxPoint(x+4, y+10), + wxPoint(x+0, y+6), + wxPoint(x+2, y+6) + }; + dc.SetBrush(wxBrush(win->GetForegroundColour())); + dc.SetPen(wxPen(win->GetForegroundColour())); + dc.DrawLine(x, y, x+9, y); + dc.DrawPolygon(WXSIZEOF(pt), pt, rect.x, rect.y); +} + diff --git a/src/gtk1/renderer.cpp b/src/gtk1/renderer.cpp index 61a6b73165..8b097e5c76 100644 --- a/src/gtk1/renderer.cpp +++ b/src/gtk1/renderer.cpp @@ -73,6 +73,11 @@ public: wxOrientation orient, int flags = 0); + virtual void DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win); }; @@ -104,19 +109,19 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win, if (s_button == NULL) { s_window = gtk_window_new( GTK_WINDOW_POPUP ); - gtk_widget_realize( s_window ); - s_button = gtk_button_new(); - gtk_container_add( GTK_CONTAINER(s_window), s_button ); - gtk_widget_realize( s_button ); + gtk_widget_realize( s_window ); + s_button = gtk_button_new(); + gtk_container_add( GTK_CONTAINER(s_window), s_button ); + gtk_widget_realize( s_button ); } gtk_paint_box ( - s_button->style, + s_button->style, GTK_PIZZA(win->m_wxwindow)->bin_window, flags & wxCONTROL_DISABLED ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, + NULL, s_button, "button", dc.XLOG2DEV(rect.x) -1, rect.y -1, rect.width +2, rect.height +2 @@ -342,3 +347,31 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win, #endif // GTK+ 2.x/1.x } +void wxRendererGTK::DrawComboBoxDropButton(wxWindow *win, + wxDC& dc, + const wxRect& rect, + int flags) +{ + dc.SetBrush(wxBrush(win->GetBackgroundColour())); + dc.SetPen(wxPen(win->GetBackgroundColour())); + dc.DrawRectangle(rect); + + int x = (rect.GetWidth()-9) / 2; + int y = (rect.GetHeight()-10) / 2; + + wxPoint pt[] = + { + wxPoint(x+2, y+3), + wxPoint(x+6, y+3), + wxPoint(x+6, y+6), + wxPoint(x+8, y+6), + wxPoint(x+4, y+10), + wxPoint(x+0, y+6), + wxPoint(x+2, y+6) + }; + dc.SetBrush(wxBrush(win->GetForegroundColour())); + dc.SetPen(wxPen(win->GetForegroundColour())); + dc.DrawLine(x, y, x+9, y); + dc.DrawPolygon(WXSIZEOF(pt), pt, rect.x, rect.y); +} +