Partial fix to bug #1040607: support for vertical orientation in win32 renderer of wxUniv notebook.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30539 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba
2004-11-15 11:25:13 +00:00
parent 5d7457f9ca
commit 00e086a7f0
2 changed files with 130 additions and 63 deletions

View File

@@ -745,8 +745,16 @@ wxRect wxNotebook::GetTabsPart() const
const wxSize indent = GetRenderer()->GetTabIndent(); const wxSize indent = GetRenderer()->GetTabIndent();
if ( IsVertical() ) if ( IsVertical() )
{ {
rect.x += indent.y;
rect.y += indent.x; rect.y += indent.x;
if ( dir == wxLEFT )
{
rect.x += indent.y;
rect.width -= indent.y;
}
else // wxRIGHT
{
rect.width -= indent.y;
}
} }
else // horz else // horz
{ {

View File

@@ -1,3 +1,4 @@
///////////////////////////////////////////////////////////////////////////////
// Name: univ/themes/win32.cpp // Name: univ/themes/win32.cpp
// Purpose: wxUniversal theme implementing Win32-like LNF // Purpose: wxUniversal theme implementing Win32-like LNF
// Author: Vadim Zeitlin // Author: Vadim Zeitlin
@@ -54,6 +55,7 @@
#include "wx/menu.h" #include "wx/menu.h"
#include "wx/artprov.h" #include "wx/artprov.h"
#include "wx/toplevel.h" #include "wx/toplevel.h"
#include "wx/image.h"
#include "wx/univ/scrtimer.h" #include "wx/univ/scrtimer.h"
#include "wx/univ/renderer.h" #include "wx/univ/renderer.h"
@@ -2486,13 +2488,24 @@ void wxWin32Renderer::DrawTab(wxDC& dc,
int flags, int flags,
int indexAccel) int indexAccel)
{ {
#define SELECT_FOR_VERTICAL(X,Y) ( isVertical ? Y : X )
#define REVERSE_FOR_VERTICAL(X,Y) \
SELECT_FOR_VERTICAL(X,Y) \
, \
SELECT_FOR_VERTICAL(Y,X)
wxRect rect = rectOrig; wxRect rect = rectOrig;
bool isVertical = ( dir == wxLEFT ) || ( dir == wxRIGHT );
// the current tab is drawn indented (to the top for default case) and // the current tab is drawn indented (to the top for default case) and
// bigger than the other ones // bigger than the other ones
const wxSize indent = GetTabIndent(); const wxSize indent = GetTabIndent();
if ( flags & wxCONTROL_SELECTED ) if ( flags & wxCONTROL_SELECTED )
{ {
rect.Inflate( isVertical ? 0 : indent.x,
isVertical ? indent.y : 0
);
switch ( dir ) switch ( dir )
{ {
default: default:
@@ -2500,100 +2513,146 @@ void wxWin32Renderer::DrawTab(wxDC& dc,
// fall through // fall through
case wxTOP: case wxTOP:
rect.Inflate(indent.x, 0);
rect.y -= indent.y; rect.y -= indent.y;
rect.height += indent.y; // fall through
break;
case wxBOTTOM: case wxBOTTOM:
rect.Inflate(indent.x, 0);
rect.height += indent.y; rect.height += indent.y;
break; break;
case wxLEFT: case wxLEFT:
rect.x -= indent.x;
// fall through
case wxRIGHT: case wxRIGHT:
wxFAIL_MSG(_T("TODO")); rect.width += indent.x;
break; break;
} }
} }
// draw the text, image and the focus around them (if necessary) // draw the text, image and the focus around them (if necessary)
wxRect rectLabel = rect; wxRect rectLabel( REVERSE_FOR_VERTICAL(rect.x,rect.y),
REVERSE_FOR_VERTICAL(rect.width,rect.height)
);
rectLabel.Deflate(1, 1); rectLabel.Deflate(1, 1);
DrawButtonLabel(dc, label, bitmap, rectLabel, if ( isVertical )
flags, wxALIGN_CENTRE, indexAccel); {
// draw it horizontally into memory and rotate for screen
wxMemoryDC dcMem;
wxBitmap bitmapRotated,
bitmapMem( rectLabel.x + rectLabel.width,
rectLabel.y + rectLabel.height );
dcMem.SelectObject(bitmapMem);
dcMem.SetBackground(dc.GetBackground());
dcMem.SetFont(dc.GetFont());
dcMem.SetTextForeground(dc.GetTextForeground());
dcMem.Clear();
bitmapRotated = wxBitmap( wxImage( bitmap.ConvertToImage() ).Rotate90(dir==wxLEFT) );
DrawButtonLabel(dcMem, label, bitmapRotated, rectLabel,
flags, wxALIGN_CENTRE, indexAccel);
dcMem.SelectObject(wxNullBitmap);
bitmapMem = bitmapMem.GetSubBitmap(rectLabel);
bitmapMem = wxBitmap(wxImage(bitmapMem.ConvertToImage()).Rotate90(dir==wxRIGHT));
dc.DrawBitmap(bitmapMem, rectLabel.y, rectLabel.x, false);
}
else
{
DrawButtonLabel(dc, label, bitmap, rectLabel,
flags, wxALIGN_CENTRE, indexAccel);
}
// now draw the tab border itself (maybe use DrawRoundedRectangle()?) // now draw the tab border itself (maybe use DrawRoundedRectangle()?)
static const wxCoord CUTOFF = 2; // radius of the rounded corner static const wxCoord CUTOFF = 2; // radius of the rounded corner
wxCoord x = rect.x, wxCoord x = SELECT_FOR_VERTICAL(rect.x,rect.y),
y = rect.y, y = SELECT_FOR_VERTICAL(rect.y,rect.x),
x2 = rect.GetRight(), x2 = SELECT_FOR_VERTICAL(rect.GetRight(),rect.GetBottom()),
y2 = rect.GetBottom(); y2 = SELECT_FOR_VERTICAL(rect.GetBottom(),rect.GetRight());
// FIXME: all this code will break if the tab indent or the border width, // FIXME: all this code will break if the tab indent or the border width,
// it is tied to the fact that both of them are equal to 2 // it is tied to the fact that both of them are equal to 2
switch ( dir ) switch ( dir )
{ {
default: default:
// default is top
case wxLEFT:
// left orientation looks like top but IsVertical makes x and y reversed
case wxTOP: case wxTOP:
// top is not vertical so use coordinates in written order
dc.SetPen(m_penHighlight); dc.SetPen(m_penHighlight);
dc.DrawLine(x, y2, x, y + CUTOFF); dc.DrawLine(REVERSE_FOR_VERTICAL(x, y2),
dc.DrawLine(x, y + CUTOFF, x + CUTOFF, y); REVERSE_FOR_VERTICAL(x, y + CUTOFF));
dc.DrawLine(x + CUTOFF, y, x2 - CUTOFF + 1, y); dc.DrawLine(REVERSE_FOR_VERTICAL(x, y + CUTOFF),
REVERSE_FOR_VERTICAL(x + CUTOFF, y));
dc.DrawLine(REVERSE_FOR_VERTICAL(x + CUTOFF, y),
REVERSE_FOR_VERTICAL(x2 - CUTOFF + 1, y));
dc.SetPen(m_penBlack); dc.SetPen(m_penBlack);
dc.DrawLine(x2, y2, x2, y + CUTOFF); dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y2),
dc.DrawLine(x2, y + CUTOFF, x2 - CUTOFF, y); REVERSE_FOR_VERTICAL(x2, y + CUTOFF));
dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y + CUTOFF),
REVERSE_FOR_VERTICAL(x2 - CUTOFF, y));
dc.SetPen(m_penDarkGrey); dc.SetPen(m_penDarkGrey);
dc.DrawLine(x2 - 1, y2, x2 - 1, y + CUTOFF - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x2 - 1, y2),
REVERSE_FOR_VERTICAL(x2 - 1, y + CUTOFF - 1));
if ( flags & wxCONTROL_SELECTED ) if ( flags & wxCONTROL_SELECTED )
{ {
dc.SetPen(m_penLightGrey); dc.SetPen(m_penLightGrey);
// overwrite the part of the border below this tab // overwrite the part of the border below this tab
dc.DrawLine(x + 1, y2 + 1, x2 - 1, y2 + 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y2 + 1),
REVERSE_FOR_VERTICAL(x2 - 1, y2 + 1));
// and the shadow of the tab to the left of us // and the shadow of the tab to the left of us
dc.DrawLine(x + 1, y + CUTOFF + 1, x + 1, y2 + 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y + CUTOFF + 1),
REVERSE_FOR_VERTICAL(x + 1, y2 + 1));
} }
break; break;
case wxRIGHT:
// right orientation looks like bottom but IsVertical makes x and y reversed
case wxBOTTOM: case wxBOTTOM:
// bottom is not vertical so use coordinates in written order
dc.SetPen(m_penHighlight); dc.SetPen(m_penHighlight);
// we need to continue one pixel further to overwrite the corner of // we need to continue one pixel further to overwrite the corner of
// the border for the selected tab // the border for the selected tab
dc.DrawLine(x, y - (flags & wxCONTROL_SELECTED ? 1 : 0), dc.DrawLine(REVERSE_FOR_VERTICAL(x, y - (flags & wxCONTROL_SELECTED ? 1 : 0)),
x, y2 - CUTOFF); REVERSE_FOR_VERTICAL(x, y2 - CUTOFF));
dc.DrawLine(x, y2 - CUTOFF, x + CUTOFF, y2); dc.DrawLine(REVERSE_FOR_VERTICAL(x, y2 - CUTOFF),
REVERSE_FOR_VERTICAL(x + CUTOFF, y2));
dc.SetPen(m_penBlack); dc.SetPen(m_penBlack);
dc.DrawLine(x + CUTOFF, y2, x2 - CUTOFF + 1, y2); dc.DrawLine(REVERSE_FOR_VERTICAL(x + CUTOFF, y2),
dc.DrawLine(x2, y, x2, y2 - CUTOFF); REVERSE_FOR_VERTICAL(x2 - CUTOFF + 1, y2));
dc.DrawLine(x2, y2 - CUTOFF, x2 - CUTOFF, y2); dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y),
REVERSE_FOR_VERTICAL(x2, y2 - CUTOFF));
dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y2 - CUTOFF),
REVERSE_FOR_VERTICAL(x2 - CUTOFF, y2));
dc.SetPen(m_penDarkGrey); dc.SetPen(m_penDarkGrey);
dc.DrawLine(x + CUTOFF, y2 - 1, x2 - CUTOFF + 1, y2 - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + CUTOFF, y2 - 1),
dc.DrawLine(x2 - 1, y, x2 - 1, y2 - CUTOFF + 1); REVERSE_FOR_VERTICAL(x2 - CUTOFF + 1, y2 - 1));
dc.DrawLine(REVERSE_FOR_VERTICAL(x2 - 1, y),
REVERSE_FOR_VERTICAL(x2 - 1, y2 - CUTOFF + 1));
if ( flags & wxCONTROL_SELECTED ) if ( flags & wxCONTROL_SELECTED )
{ {
dc.SetPen(m_penLightGrey); dc.SetPen(m_penLightGrey);
// overwrite the part of the (double!) border above this tab // overwrite the part of the (double!) border above this tab
dc.DrawLine(x + 1, y - 1, x2 - 1, y - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y - 1),
dc.DrawLine(x + 1, y - 2, x2 - 1, y - 2); REVERSE_FOR_VERTICAL(x2 - 1, y - 1));
dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y - 2),
REVERSE_FOR_VERTICAL(x2 - 1, y - 2));
// and the shadow of the tab to the left of us // and the shadow of the tab to the left of us
dc.DrawLine(x + 1, y2 - CUTOFF, x + 1, y - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y2 - CUTOFF),
REVERSE_FOR_VERTICAL(x + 1, y - 1));
} }
break; break;
case wxLEFT:
case wxRIGHT:
wxFAIL_MSG(_T("TODO"));
} }
#undef SELECT_FOR_VERTICAL
#undef REVERSE_FOR_VERTICAL
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------