# HG changeset patch # User KUDr # Date 1173494391 0 # Node ID 59b7305f9a8b06b26c51658ef93b0a825df10ee7 # Parent 272c690043e35e1ed290abefe9df5e5a939897fe (svn r9087) [cpp_gui] -Codechange: Window is now clipping its widgets in OnPaint() -Add: ClipDrawContext class to simplify draw clipping -Fix: ResizeBox now can't resize window to negative width/height diff -r 272c690043e3 -r 59b7305f9a8b src/gfx.h --- a/src/gfx.h Tue Mar 06 20:18:17 2007 +0000 +++ b/src/gfx.h Sat Mar 10 02:39:51 2007 +0000 @@ -205,6 +205,8 @@ int DrawStringTruncated(int x, int y, StringID str, uint16 color, uint maxw); int DoDrawString(const char *string, int x, int y, uint16 color); +typedef uint32 WChar; +int DoDrawStringW(const WChar *string, int x, int y, uint16 color); int DoDrawStringTruncated(const char *str, int x, int y, uint16 color, uint maxw); void DrawStringCenterUnderline(int x, int y, StringID str, uint16 color); @@ -295,6 +297,34 @@ IS_PALETTE_COLOR = 0x100, ///< color value is already a real palette color index, not an index of a StringColor } StringColorFlags; +/** + * Create instance of this class on the stack (as local var) to set new clipping + * context. The original clipping context gets restored automatically when this + * variable is destroyed (comes out of scope). + */ +struct ClipDrawContext { + DrawPixelInfo m_dpi; + DrawPixelInfo *m_old_dpi; + + ClipDrawContext(int left, int top, int width, int height) + { + if (FillDrawPixelInfo(&m_dpi, left, top, width, height)) { + m_old_dpi = _cur_dpi; + _cur_dpi = &m_dpi; + } else { + m_old_dpi = NULL; + } + } + ~ClipDrawContext() + { + if (m_old_dpi != NULL) _cur_dpi = m_old_dpi; + } + bool IsEmpty() + { + return m_old_dpi == NULL; + } +}; + #ifdef _DEBUG extern bool _dbg_screen_rect; diff -r 272c690043e3 -r 59b7305f9a8b src/widget/widget_resizebox.cpp --- a/src/widget/widget_resizebox.cpp Tue Mar 06 20:18:17 2007 +0000 +++ b/src/widget/widget_resizebox.cpp Sat Mar 10 02:39:51 2007 +0000 @@ -38,7 +38,10 @@ } BaseWindow *w = GetWindow(); w->SetDirty(); - w->SetSize(e.m_pt - w->TopLeft() + m_sizing_offset); + Point16 size = e.m_pt - w->TopLeft() + m_sizing_offset; + size.x = max(size.x, DEFAULT_WIDTH); + size.y = max(size.y, DEFAULT_HEIGHT); + w->SetSize(size); e.SetHandled(); w->SetDirty(); } diff -r 272c690043e3 -r 59b7305f9a8b src/window.cpp --- a/src/window.cpp Tue Mar 06 20:18:17 2007 +0000 +++ b/src/window.cpp Sat Mar 10 02:39:51 2007 +0000 @@ -292,6 +292,12 @@ assert(widget != NULL); } +/*virtual*/ void BaseWindow::OnPaint(gui::EvtPaint &ev) +{ + ClipDrawContext ctx(0, 0, Width(), Height()); + super::OnPaint(ev); +} + /** * Open a new window. If there is no space for a new window, close an open * window. Try to avoid stickied windows, but if there is no else, close one of diff -r 272c690043e3 -r 59b7305f9a8b src/window.h --- a/src/window.h Tue Mar 06 20:18:17 2007 +0000 +++ b/src/window.h Sat Mar 10 02:39:51 2007 +0000 @@ -456,6 +456,9 @@ /*virtual*/ void CreateNcWidgets(); /*virtual*/ void CreateWidgets(); ///< @TODO remove it when old gui infrastructure will no longer be used + /*virtual*/ void OnPaint(gui::EvtPaint &ev); + + static BaseWindow* Allocate(int x, int y, int width, int height, WindowProc *proc, WindowClass cls, const OldWidget *widget); static BaseWindow* Allocate(const WindowDesc *desc, int window_number = 0); static BaseWindow* AllocateFront(const WindowDesc *desc, int window_number = 0);