Vertical tabs orientation in gtk renderer of wxUniv.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@30544 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Włodzimierz Skiba 2004-11-15 17:33:59 +00:00
parent c988c5b21b
commit 7166a05d7e
2 changed files with 87 additions and 37 deletions

View File

@ -51,6 +51,7 @@
#include "wx/spinbutt.h" #include "wx/spinbutt.h"
#include "wx/toplevel.h" #include "wx/toplevel.h"
#include "wx/artprov.h" #include "wx/artprov.h"
#include "wx/image.h"
#include "wx/univ/renderer.h" #include "wx/univ/renderer.h"
#include "wx/univ/inphand.h" #include "wx/univ/inphand.h"
@ -1742,13 +1743,23 @@ void wxGTKRenderer::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( SELECT_FOR_VERTICAL( indent.x , 0),
SELECT_FOR_VERTICAL( 0, indent.y ));
switch ( dir ) switch ( dir )
{ {
default: default:
@ -1756,19 +1767,17 @@ void wxGTKRenderer::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;
} }
} }
@ -1786,87 +1795,129 @@ void wxGTKRenderer::DrawTab(wxDC& dc,
rectBorder.Deflate(4, 3); rectBorder.Deflate(4, 3);
if ( dir == wxBOTTOM ) if ( dir == wxBOTTOM )
rectBorder.Offset(0, -1); rectBorder.Offset(0, -1);
if ( dir == wxRIGHT )
rectBorder.Offset(-1, 0);
DrawRect(dc, &rectBorder, m_penBlack); DrawRect(dc, &rectBorder, m_penBlack);
} }
// 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);
dc.DrawLabel(label, bitmap, rectLabel, wxALIGN_CENTRE, indexAccel); 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) );
dcMem.DrawLabel(label, bitmapRotated, rectLabel, 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
{
dc.DrawLabel(label, bitmap, rectLabel, wxALIGN_CENTRE, indexAccel);
}
// now draw the tab itself // now draw the tab itself
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());
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); dc.DrawLine(REVERSE_FOR_VERTICAL(x, y2),
dc.DrawLine(x + 1, y, x2, y); REVERSE_FOR_VERTICAL(x, y));
dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y),
REVERSE_FOR_VERTICAL(x2, y));
dc.SetPen(m_penBlack); dc.SetPen(m_penBlack);
dc.DrawLine(x2, y2, x2, y); dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y2),
REVERSE_FOR_VERTICAL(x2, y));
dc.SetPen(m_penDarkGrey); dc.SetPen(m_penDarkGrey);
dc.DrawLine(x2 - 1, y2, x2 - 1, y + 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x2 - 1, y2),
REVERSE_FOR_VERTICAL(x2 - 1, y + 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 + 2, x + 1, y2 + 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y + 2),
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); REVERSE_FOR_VERTICAL(x, y2));
// it doesn't work like this (TODO: implement it properly) // it doesn't work like this (TODO: implement it properly)
#if 0 #if 0
// erase the corner of the tab to the right // erase the corner of the tab to the right
dc.SetPen(m_penLightGrey); dc.SetPen(m_penLightGrey);
dc.DrawPoint(x2 - 1, y - 2); dc.DrawPoint(REVERSE_FOR_VERTICAL(x2 - 1, y - 2));
dc.DrawPoint(x2 - 2, y - 2); dc.DrawPoint(REVERSE_FOR_VERTICAL(x2 - 2, y - 2));
dc.DrawPoint(x2 - 2, y - 1); dc.DrawPoint(REVERSE_FOR_VERTICAL(x2 - 2, y - 1));
#endif // 0 #endif // 0
dc.SetPen(m_penBlack); dc.SetPen(m_penBlack);
dc.DrawLine(x + 1, y2, x2, y2); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y2),
dc.DrawLine(x2, y, x2, y2); REVERSE_FOR_VERTICAL(x2, y2));
dc.DrawLine(REVERSE_FOR_VERTICAL(x2, y),
REVERSE_FOR_VERTICAL(x2, y2));
dc.SetPen(m_penDarkGrey); dc.SetPen(m_penDarkGrey);
dc.DrawLine(x + 2, y2 - 1, x2 - 1, y2 - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 2, y2 - 1),
dc.DrawLine(x2 - 1, y, x2 - 1, y2); REVERSE_FOR_VERTICAL(x2 - 1, y2 - 1));
dc.DrawLine(REVERSE_FOR_VERTICAL(x2 - 1, y),
REVERSE_FOR_VERTICAL(x2 - 1, y2));
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 - 1, x + 1, y - 1); dc.DrawLine(REVERSE_FOR_VERTICAL(x + 1, y2 - 1),
REVERSE_FOR_VERTICAL(x + 1, y - 1));
} }
break; break;
case wxLEFT:
case wxRIGHT:
wxFAIL_MSG(_T("TODO"));
} }
} }

View File

@ -2503,9 +2503,8 @@ void wxWin32Renderer::DrawTab(wxDC& dc,
const wxSize indent = GetTabIndent(); const wxSize indent = GetTabIndent();
if ( flags & wxCONTROL_SELECTED ) if ( flags & wxCONTROL_SELECTED )
{ {
rect.Inflate( isVertical ? 0 : indent.x, rect.Inflate( SELECT_FOR_VERTICAL( indent.x , 0),
isVertical ? indent.y : 0 SELECT_FOR_VERTICAL( 0, indent.y ));
);
switch ( dir ) switch ( dir )
{ {
default: default: