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();
if ( IsVertical() )
{
rect.x += indent.y;
rect.y += indent.x;
if ( dir == wxLEFT )
{
rect.x += indent.y;
rect.width -= indent.y;
}
else // wxRIGHT
{
rect.width -= indent.y;
}
}
else // horz
{

View File

@@ -1,3 +1,4 @@
///////////////////////////////////////////////////////////////////////////////
// Name: univ/themes/win32.cpp
// Purpose: wxUniversal theme implementing Win32-like LNF
// Author: Vadim Zeitlin
@@ -54,6 +55,7 @@
#include "wx/menu.h"
#include "wx/artprov.h"
#include "wx/toplevel.h"
#include "wx/image.h"
#include "wx/univ/scrtimer.h"
#include "wx/univ/renderer.h"
@@ -2486,13 +2488,24 @@ void wxWin32Renderer::DrawTab(wxDC& dc,
int flags,
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;
bool isVertical = ( dir == wxLEFT ) || ( dir == wxRIGHT );
// the current tab is drawn indented (to the top for default case) and
// bigger than the other ones
const wxSize indent = GetTabIndent();
if ( flags & wxCONTROL_SELECTED )
{
rect.Inflate( isVertical ? 0 : indent.x,
isVertical ? indent.y : 0
);
switch ( dir )
{
default:
@@ -2500,100 +2513,146 @@ void wxWin32Renderer::DrawTab(wxDC& dc,
// fall through
case wxTOP:
rect.Inflate(indent.x, 0);
rect.y -= indent.y;
rect.height += indent.y;
break;
// fall through
case wxBOTTOM:
rect.Inflate(indent.x, 0);
rect.height += indent.y;
break;
case wxLEFT:
rect.x -= indent.x;
// fall through
case wxRIGHT:
wxFAIL_MSG(_T("TODO"));
rect.width += indent.x;
break;
}
}
// 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);
if ( isVertical )
{
// 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()?)
static const wxCoord CUTOFF = 2; // radius of the rounded corner
wxCoord x = rect.x,
y = rect.y,
x2 = rect.GetRight(),
y2 = rect.GetBottom();
wxCoord x = SELECT_FOR_VERTICAL(rect.x,rect.y),
y = SELECT_FOR_VERTICAL(rect.y,rect.x),
x2 = SELECT_FOR_VERTICAL(rect.GetRight(),rect.GetBottom()),
y2 = SELECT_FOR_VERTICAL(rect.GetBottom(),rect.GetRight());
// 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
switch ( dir )
{
default:
// default is top
case wxLEFT:
// left orientation looks like top but IsVertical makes x and y reversed
case wxTOP:
// top is not vertical so use coordinates in written order
dc.SetPen(m_penHighlight);
dc.DrawLine(x, y2, x, y + CUTOFF);
dc.DrawLine(x, y + CUTOFF, x + CUTOFF, y);
dc.DrawLine(x + CUTOFF, y, x2 - CUTOFF + 1, y);
dc.DrawLine(REVERSE_FOR_VERTICAL(x, y2),
REVERSE_FOR_VERTICAL(x, y + CUTOFF));
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.DrawLine(x2, y2, x2, y + CUTOFF);
dc.DrawLine(x2, y + CUTOFF, x2 - CUTOFF, y);
dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y2),
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.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 )
{
dc.SetPen(m_penLightGrey);
// 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
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;
case wxRIGHT:
// right orientation looks like bottom but IsVertical makes x and y reversed
case wxBOTTOM:
// bottom is not vertical so use coordinates in written order
dc.SetPen(m_penHighlight);
// we need to continue one pixel further to overwrite the corner of
// the border for the selected tab
dc.DrawLine(x, y - (flags & wxCONTROL_SELECTED ? 1 : 0),
x, y2 - CUTOFF);
dc.DrawLine(x, y2 - CUTOFF, x + CUTOFF, y2);
dc.DrawLine(REVERSE_FOR_VERTICAL(x, y - (flags & wxCONTROL_SELECTED ? 1 : 0)),
REVERSE_FOR_VERTICAL(x, y2 - CUTOFF));
dc.DrawLine(REVERSE_FOR_VERTICAL(x, y2 - CUTOFF),
REVERSE_FOR_VERTICAL(x + CUTOFF, y2));
dc.SetPen(m_penBlack);
dc.DrawLine(x + CUTOFF, y2, x2 - CUTOFF + 1, y2);
dc.DrawLine(x2, y, x2, y2 - CUTOFF);
dc.DrawLine(x2, y2 - CUTOFF, x2 - CUTOFF, y2);
dc.DrawLine(REVERSE_FOR_VERTICAL(x + CUTOFF, y2),
REVERSE_FOR_VERTICAL(x2 - CUTOFF + 1, 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.DrawLine(x + CUTOFF, y2 - 1, x2 - CUTOFF + 1, y2 - 1);
dc.DrawLine(x2 - 1, y, x2 - 1, y2 - CUTOFF + 1);
dc.DrawLine(REVERSE_FOR_VERTICAL(x + CUTOFF, y2 - 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 )
{
dc.SetPen(m_penLightGrey);
// overwrite the part of the (double!) border above this tab
dc.DrawLine(x + 1, y - 1, x2 - 1, y - 1);
dc.DrawLine(x + 1, y - 2, x2 - 1, y - 2);
dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y - 1),
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
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;
case wxLEFT:
case wxRIGHT:
wxFAIL_MSG(_T("TODO"));
}
#undef SELECT_FOR_VERTICAL
#undef REVERSE_FOR_VERTICAL
}
// ----------------------------------------------------------------------------