Tabbox uses Plasma theme. That is the background is painted using the dialog background and selected item uses the focus background of task applet. Additional a smaller font is used and text is aligned to bottom instead of center. Thanks to Nuno for going through the design steps.
svn path=/trunk/KDE/kdebase/workspace/; revision=934532
This commit is contained in:
parent
0c166b6ecb
commit
d8f8cca5c8
3 changed files with 397 additions and 205 deletions
|
@ -98,7 +98,7 @@ qt4_add_dbus_adaptor( kwin_KDEINIT_SRCS org.kde.KWin.xml workspace.h KWin::Works
|
|||
|
||||
kde4_add_kdeinit_executable( kwin ${kwin_KDEINIT_SRCS})
|
||||
|
||||
target_link_libraries(kdeinit_kwin ${KDE4_KDEUI_LIBS} kephal kdecorations kwineffects ${X11_LIBRARIES})
|
||||
target_link_libraries(kdeinit_kwin ${KDE4_KDEUI_LIBS} ${KDE4_PLASMA_LIBS} kephal kdecorations kwineffects ${X11_LIBRARIES})
|
||||
|
||||
if(OPENGL_FOUND)
|
||||
target_link_libraries(kdeinit_kwin ${OPENGL_gl_LIBRARY})
|
||||
|
|
536
tabbox.cpp
536
tabbox.cpp
|
@ -4,6 +4,7 @@
|
|||
|
||||
Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
|
||||
Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
|
||||
Copyright (C) 2009 Martin Gräßlin <kde@martin-graesslin.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,15 +27,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "effects.h"
|
||||
#include "client.h"
|
||||
#include <QPainter>
|
||||
#include <QLabel>
|
||||
#include <qdrawutil.h>
|
||||
#include <QStyle>
|
||||
#include <kglobal.h>
|
||||
#include <fixx11h.h>
|
||||
#include <kconfig.h>
|
||||
#include <klocale.h>
|
||||
#include <QApplication>
|
||||
#include <QDesktopWidget>
|
||||
#include <QAction>
|
||||
#include <stdarg.h>
|
||||
#include <kdebug.h>
|
||||
|
@ -46,6 +42,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include <kactioncollection.h>
|
||||
#include <kkeyserver.h>
|
||||
#include <kconfiggroup.h>
|
||||
#include <KDE/Plasma/Theme>
|
||||
#include <KGlobalSettings>
|
||||
|
||||
// specify externals before namespace
|
||||
|
||||
|
@ -55,17 +53,25 @@ namespace KWin
|
|||
extern QPixmap* kwin_get_menu_pix_hack();
|
||||
|
||||
TabBox::TabBox( Workspace *ws )
|
||||
: QFrame( 0, Qt::X11BypassWindowManagerHint )
|
||||
: QGraphicsView()
|
||||
, wspace(ws)
|
||||
, client(0)
|
||||
, display_refcount( 0 )
|
||||
{
|
||||
setFrameStyle(QFrame::StyledPanel);
|
||||
setFrameShadow(QFrame::Raised);
|
||||
setBackgroundRole(QPalette::Base);
|
||||
setLineWidth(3);
|
||||
setMidLineWidth(3);
|
||||
setContentsMargins( 3, 3, 3, 3 );
|
||||
scene = new QGraphicsScene( this );
|
||||
setWindowFlags( Qt::X11BypassWindowManagerHint );
|
||||
setScene( scene );
|
||||
setFrameStyle( QFrame::NoFrame );
|
||||
viewport()->setAutoFillBackground( false );
|
||||
setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
|
||||
setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
|
||||
setAttribute( Qt::WA_TranslucentBackground );
|
||||
frame.setImagePath( "dialogs/background" );
|
||||
frame.setCacheAllRenderedFrames( true );
|
||||
frame.setEnabledBorders( Plasma::FrameSvg::AllBorders );
|
||||
item_frame.setImagePath( "widgets/tasks" );
|
||||
item_frame.setCacheAllRenderedFrames( true );
|
||||
item_frame.setEnabledBorders( Plasma::FrameSvg::AllBorders );
|
||||
|
||||
showMiniIcon = false;
|
||||
|
||||
|
@ -188,12 +194,14 @@ void TabBox::createDesktopList(QList< int > &list, int start, SortOrder order)
|
|||
void TabBox::reset( bool partial_reset )
|
||||
{
|
||||
int w, h, cw = 0, wmax = 0;
|
||||
qreal left, top, right, bottom;
|
||||
frame.getMargins( left, top, right, bottom );
|
||||
|
||||
QRect r = workspace()->screenGeometry( workspace()->activeScreen());
|
||||
|
||||
// calculate height of 1 line
|
||||
// fontheight + 1 pixel above + 1 pixel below, or 32x32 icon + 2 pixel above + below
|
||||
lineHeight = qMax(fontMetrics().height() + 2, 32 + 4);
|
||||
// fontheight + 2 pixel above + 2 pixel below, or 32x32 icon + 4 pixel above + below
|
||||
lineHeight = qMax(QFontMetrics( KGlobalSettings::smallestReadableFont() ).height() + 2, 32 + 8);
|
||||
|
||||
if ( mode() == TabBoxWindowsMode )
|
||||
{
|
||||
|
@ -207,10 +215,15 @@ void TabBox::reset( bool partial_reset )
|
|||
createClientList(clients, options_traverse_all ? -1 : workspace()->currentDesktop(), starting_client, true);
|
||||
|
||||
// calculate maximum caption width
|
||||
cw = fontMetrics().width(no_tasks)+20;
|
||||
cw = fontMetrics().width(no_tasks) + 20;
|
||||
QFont f = font();
|
||||
f.setPointSize( KGlobalSettings::smallestReadableFont().pointSize() );
|
||||
QFontMetrics fm = QFontMetrics( f );
|
||||
for (ClientList::ConstIterator it = clients.constBegin(); it != clients.constEnd(); ++it)
|
||||
{
|
||||
cw = fontMetrics().width( (*it)->caption() );
|
||||
cw = fm.width( (*it)->caption() );
|
||||
if( (*it)->desktop() != wspace->currentDesktop() )
|
||||
cw += fm.width( QString( wspace->desktopName((*it)->desktop()) + ": " ) );
|
||||
if ( cw > wmax ) wmax = cw;
|
||||
}
|
||||
|
||||
|
@ -228,18 +241,18 @@ void TabBox::reset( bool partial_reset )
|
|||
showMiniIcon = false;
|
||||
h = clients.count() * lineHeight;
|
||||
|
||||
if ( h > (r.height()-(2*frameWidth())) ) // if too high, use mini icons
|
||||
if ( h > (r.height()-(top + bottom)) ) // if too high, use mini icons
|
||||
{
|
||||
showMiniIcon = true;
|
||||
// fontheight + 1 pixel above + 1 pixel below, or 16x16 icon + 1 pixel above + below
|
||||
lineHeight = qMax(fontMetrics().height() + 2, 16 + 2);
|
||||
// fontheight + 1 pixel above + 1 pixel below, or 16x16 icon + 2 pixel above + below
|
||||
lineHeight = qMax(QFontMetrics( KGlobalSettings::smallestReadableFont() ).height() + 2, 16 + 4);
|
||||
|
||||
h = clients.count() * lineHeight;
|
||||
|
||||
if ( h > (r.height()-(2*frameWidth())) ) // if still too high, remove some clients
|
||||
if ( h > (r.height()-(top + bottom)) ) // if still too high, remove some clients
|
||||
{
|
||||
// how many clients to remove
|
||||
int howMany = (h - (r.height()-(2*frameWidth())))/lineHeight;
|
||||
int howMany = (h - (r.height()-(top + bottom)))/lineHeight + 1;
|
||||
for (; howMany; howMany--)
|
||||
clients.removeAll(clients.last());
|
||||
|
||||
|
@ -278,18 +291,85 @@ void TabBox::reset( bool partial_reset )
|
|||
}
|
||||
|
||||
// height, width for the popup
|
||||
h += 2 * frameWidth();
|
||||
w = 2*frameWidth() + 5*2 + ( showMiniIcon ? 16 : 32 ) + 8 + wmax; // 5*2=margins, ()=icon, 8=space between icon+text
|
||||
w = qBound( r.width()/3 , w, r.width() * 4 / 5 );
|
||||
h += top + bottom;
|
||||
h = qMin( h, r.height() );
|
||||
w = left + right + 5*2 + ( showMiniIcon ? 16 : 32 ) + 8 + wmax; // 5*2=margins, ()=icon, 8=space between icon+text
|
||||
w = qBound( r.width()/5 , w, r.width() * 4 / 5 );
|
||||
|
||||
setGeometry( (r.width()-w)/2 + r.x(),
|
||||
setGeometry((r.width()-w)/2 + r.x(),
|
||||
(r.height()-h)/2+ r.y(),
|
||||
w, h );
|
||||
scene->setSceneRect( 0, 0, w, h );
|
||||
frame.resizeFrame( QSize( w , h ) );
|
||||
// resizing the item frame
|
||||
item_frame.setElementPrefix( "focus" );
|
||||
item_frame.resizeFrame( QSize( w-left-right, lineHeight ) );
|
||||
|
||||
setMask( frame.mask() );
|
||||
|
||||
if( partial_reset )
|
||||
initScene();
|
||||
|
||||
if( effects )
|
||||
static_cast<EffectsHandlerImpl*>(effects)->tabBoxUpdated();
|
||||
}
|
||||
|
||||
void TabBox::initScene()
|
||||
{
|
||||
scene->clear();
|
||||
qreal left, top, right, bottom;
|
||||
frame.getMargins( left, top, right, bottom );
|
||||
|
||||
if( mode() == TabBoxWindowsMode )
|
||||
{
|
||||
if( clients.count() == 0 )
|
||||
{
|
||||
QFont f = font();
|
||||
f.setBold( true );
|
||||
f.setPointSize( 14 );
|
||||
|
||||
QGraphicsTextItem* item = scene->addText( no_tasks, f );
|
||||
item->setDefaultTextColor( Plasma::Theme::defaultTheme()->color( Plasma::Theme::TextColor ) );
|
||||
item->adjustSize();
|
||||
item->setPos( width()*0.5 - QFontMetrics(f).width( item->toPlainText() )*0.5,
|
||||
height()*0.5 - QFontMetrics(f).height()*0.5 );
|
||||
}
|
||||
else
|
||||
{
|
||||
// add clients to scene
|
||||
int index = 0;
|
||||
foreach( Client* client, clients )
|
||||
{
|
||||
TabBoxWindowItem* item = new TabBoxWindowItem( client, this );
|
||||
item->setHeight( lineHeight );
|
||||
item->setWidth( width() - left - right );
|
||||
item->setShowMiniIcons( showMiniIcon );
|
||||
item->setPos( left, top + lineHeight * index );
|
||||
scene->addItem( item );
|
||||
index++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // TabBoxDesktopMode || TabBoxDesktopListMode
|
||||
int y = top;
|
||||
|
||||
QRect r = workspace()->screenGeometry( workspace()->activeScreen());
|
||||
foreach (int it, desktops)
|
||||
{
|
||||
TabBoxDesktopItem* item = new TabBoxDesktopItem( it, this );
|
||||
item->setHeight( lineHeight );
|
||||
item->setWidth( width() - left - right );
|
||||
item->setPos( left, top + lineHeight * (it-1) );
|
||||
scene->addItem( item );
|
||||
// next desktop
|
||||
y += lineHeight;
|
||||
if ( y >= r.height() )
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*!
|
||||
Shows the next or previous item, depending on \a next
|
||||
|
@ -431,181 +511,14 @@ void TabBox::hideEvent( QHideEvent* )
|
|||
{
|
||||
}
|
||||
|
||||
/*!
|
||||
Paints the tab box
|
||||
*/
|
||||
void TabBox::paintEvent( QPaintEvent* e )
|
||||
void TabBox::drawBackground( QPainter* painter, const QRectF& rect )
|
||||
{
|
||||
QFrame::paintEvent( e );
|
||||
|
||||
QPainter p( this );
|
||||
QRect r( contentsRect());
|
||||
|
||||
QPixmap* menu_pix = kwin_get_menu_pix_hack();
|
||||
|
||||
int iconWidth = showMiniIcon ? 16 : 32;
|
||||
int x = r.x();
|
||||
int y = r.y();
|
||||
|
||||
if ( mode () == TabBoxWindowsMode )
|
||||
{
|
||||
if ( !currentClient() )
|
||||
{
|
||||
QFont f = font();
|
||||
f.setBold( true );
|
||||
f.setPointSize( 14 );
|
||||
|
||||
p.setFont(f);
|
||||
p.drawText( r, Qt::AlignCenter, no_tasks);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (ClientList::ConstIterator it = clients.constBegin(); it != clients.constEnd(); ++it)
|
||||
{
|
||||
if ( workspace()->hasClient( *it ) ) // safety
|
||||
{
|
||||
// draw highlight background
|
||||
if ( (*it) == currentClient() )
|
||||
p.fillRect(x, y, r.width(), lineHeight, palette().brush( QPalette::Active, QPalette::Highlight ));
|
||||
|
||||
// draw icon
|
||||
QPixmap icon;
|
||||
if ( showMiniIcon )
|
||||
{
|
||||
if ( !(*it)->miniIcon().isNull() )
|
||||
icon = (*it)->miniIcon();
|
||||
}
|
||||
else
|
||||
if ( !(*it)->icon().isNull() )
|
||||
icon = (*it)->icon();
|
||||
else if ( menu_pix )
|
||||
icon = *menu_pix;
|
||||
|
||||
if( !icon.isNull())
|
||||
{
|
||||
if( (*it)->isMinimized())
|
||||
KIconEffect::semiTransparent( icon );
|
||||
p.drawPixmap( x+5, y + (lineHeight - iconWidth)/2, icon );
|
||||
}
|
||||
|
||||
// generate text to display
|
||||
QString s;
|
||||
|
||||
if ( !(*it)->isOnDesktop(workspace()->currentDesktop()) )
|
||||
s = workspace()->desktopName((*it)->desktop()) + ": ";
|
||||
|
||||
if ( (*it)->isMinimized() )
|
||||
s += '(' + (*it)->caption() + ')';
|
||||
else
|
||||
s += (*it)->caption();
|
||||
|
||||
s = fontMetrics().elidedText( s, Qt::ElideMiddle, r.width() - 5 - iconWidth - 8 );
|
||||
|
||||
// draw text
|
||||
if ( (*it) == currentClient() )
|
||||
p.setPen(palette().color( QPalette::Active, QPalette::HighlightedText ));
|
||||
else if( (*it)->isMinimized())
|
||||
{
|
||||
QColor c1 = palette().color( QPalette::Active, QPalette::Text );
|
||||
QColor c2 = palette().color( QPalette::Active, QPalette::Background );
|
||||
// from kicker's TaskContainer::blendColors()
|
||||
int r1, g1, b1;
|
||||
int r2, g2, b2;
|
||||
|
||||
c1.getRgb( &r1, &g1, &b1 );
|
||||
c2.getRgb( &r2, &g2, &b2 );
|
||||
|
||||
r1 += (int) ( .5 * ( r2 - r1 ) );
|
||||
g1 += (int) ( .5 * ( g2 - g1 ) );
|
||||
b1 += (int) ( .5 * ( b2 - b1 ) );
|
||||
|
||||
p.setPen(QColor( r1, g1, b1 ));
|
||||
}
|
||||
else
|
||||
p.setPen(palette().color( QPalette::Active, QPalette::Text ));
|
||||
|
||||
p.drawText(x+5 + iconWidth + 8, y, r.width() - 5 - iconWidth - 8, lineHeight,
|
||||
Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine, s);
|
||||
|
||||
y += lineHeight;
|
||||
}
|
||||
if ( y >= r.height() ) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{ // TabBoxDesktopMode || TabBoxDesktopListMode
|
||||
int iconHeight = iconWidth;
|
||||
|
||||
// get widest desktop name/number
|
||||
QFont f(font());
|
||||
f.setBold(true);
|
||||
f.setPixelSize(iconHeight - 4); // pixel, not point because I need to know the pixels
|
||||
QFontMetrics fm(f);
|
||||
|
||||
int wmax = 0;
|
||||
foreach (int it, desktops)
|
||||
{
|
||||
wmax = qMax(wmax, fontMetrics().width(workspace()->desktopName(it)));
|
||||
|
||||
// calculate max width of desktop-number text
|
||||
QString num = QString::number(it);
|
||||
iconWidth = qMax(iconWidth - 4, fm.boundingRect(num).width()) + 4;
|
||||
}
|
||||
|
||||
foreach (int it, desktops)
|
||||
{
|
||||
// draw highlight background
|
||||
if ( it == desk ) // current desktop
|
||||
p.fillRect(x, y, r.width(), lineHeight, palette().brush( QPalette::Active, QPalette::Highlight ));
|
||||
|
||||
p.save();
|
||||
|
||||
// draw "icon" (here: number of desktop)
|
||||
p.fillRect(x+5, y+2, iconWidth, iconHeight, palette().brush( QPalette::Active, QPalette::Base ));
|
||||
p.setPen(palette().color( QPalette::Active, QPalette::Text ));
|
||||
p.drawRect(x+5, y+2, iconWidth, iconHeight);
|
||||
|
||||
// draw desktop-number
|
||||
p.setFont(f);
|
||||
QString num = QString::number(it);
|
||||
p.drawText(x+5, y+2, iconWidth, iconHeight, Qt::AlignCenter, num);
|
||||
|
||||
p.restore();
|
||||
|
||||
// draw desktop name text
|
||||
if ( it == desk )
|
||||
p.setPen(palette().color( QPalette::Active, QPalette::HighlightedText ));
|
||||
else
|
||||
p.setPen(palette().color( QPalette::Active, QPalette::Text ));
|
||||
|
||||
p.drawText(x+5 + iconWidth + 8, y, r.width() - 5 - iconWidth - 8, lineHeight,
|
||||
Qt::AlignLeft | Qt::AlignVCenter | Qt::TextSingleLine,
|
||||
workspace()->desktopName(it));
|
||||
|
||||
// show mini icons from that desktop aligned to each other
|
||||
int x1 = x + 5 + iconWidth + 8 + wmax + 5;
|
||||
|
||||
ClientList list;
|
||||
createClientList(list, it, 0, false);
|
||||
// clients are in reversed stacking order
|
||||
for ( int i = list.size() - 1; i>=0; i-- )
|
||||
{
|
||||
if ( !list.at( i )->miniIcon().isNull() )
|
||||
{
|
||||
if ( x1+18 >= x+r.width() ) // only show full icons
|
||||
break;
|
||||
|
||||
p.drawPixmap( x1, y + (lineHeight - 16)/2, list.at( i )->miniIcon() );
|
||||
x1 += 18;
|
||||
}
|
||||
}
|
||||
|
||||
// next desktop
|
||||
y += lineHeight;
|
||||
if ( y >= r.height() ) break;
|
||||
}
|
||||
}
|
||||
painter->save();
|
||||
painter->setCompositionMode( QPainter::CompositionMode_Source );
|
||||
qreal left, top, right, bottom;
|
||||
frame.getMargins( left, top, right, bottom );
|
||||
frame.paintFrame( painter, rect.adjusted( -left, -top, right, bottom ) );
|
||||
painter->restore();
|
||||
}
|
||||
|
||||
|
||||
|
@ -715,7 +628,9 @@ void TabBox::handleMouseEvent( XEvent* e )
|
|||
return;
|
||||
}
|
||||
|
||||
int num = (widgetPos.y()-frameWidth()) / lineHeight;
|
||||
qreal left, top, right, bottom;
|
||||
frame.getMargins( left, top, right, bottom );
|
||||
int num = (widgetPos.y()-top) / lineHeight;
|
||||
|
||||
if( mode() == TabBoxWindowsMode )
|
||||
{
|
||||
|
@ -746,6 +661,225 @@ void TabBox::handleMouseEvent( XEvent* e )
|
|||
update();
|
||||
}
|
||||
|
||||
//*******************************
|
||||
// TabBoxWindowItem
|
||||
//*******************************
|
||||
|
||||
TabBoxWindowItem::TabBoxWindowItem( Client* client, TabBox* parent )
|
||||
: QGraphicsItem()
|
||||
, m_client( client )
|
||||
, m_parent( parent )
|
||||
, m_width( 0 )
|
||||
, m_height( 0 )
|
||||
, m_showMiniIcons( false )
|
||||
{
|
||||
}
|
||||
|
||||
TabBoxWindowItem::~TabBoxWindowItem()
|
||||
{
|
||||
}
|
||||
|
||||
QRectF TabBoxWindowItem::boundingRect() const
|
||||
{
|
||||
return QRectF( 0, 0, m_width, m_height );
|
||||
}
|
||||
|
||||
void TabBoxWindowItem::setHeight( int height )
|
||||
{
|
||||
m_height = height;
|
||||
}
|
||||
|
||||
void TabBoxWindowItem::setWidth( int width )
|
||||
{
|
||||
m_width = width;
|
||||
}
|
||||
|
||||
void TabBoxWindowItem::setShowMiniIcons( bool showMiniIcons )
|
||||
{
|
||||
m_showMiniIcons = showMiniIcons;
|
||||
}
|
||||
|
||||
void TabBoxWindowItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget )
|
||||
{
|
||||
painter->setRenderHint( QPainter::Antialiasing );
|
||||
|
||||
drawBackground( painter, option, widget );
|
||||
|
||||
// draw icon
|
||||
int iconWidth = m_showMiniIcons ? 16 : 32;
|
||||
int x = 0;
|
||||
QPixmap* menu_pix = kwin_get_menu_pix_hack();
|
||||
QPixmap icon;
|
||||
if ( m_showMiniIcons )
|
||||
{
|
||||
if ( !m_client->miniIcon().isNull() )
|
||||
icon = m_client->miniIcon();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !m_client->icon().isNull() )
|
||||
icon = m_client->icon();
|
||||
else if ( menu_pix )
|
||||
icon = *menu_pix;
|
||||
}
|
||||
|
||||
if( !icon.isNull())
|
||||
{
|
||||
if( m_client->isMinimized())
|
||||
KIconEffect::semiTransparent( icon );
|
||||
if( m_client == m_parent->currentClient() )
|
||||
{
|
||||
KIconEffect *effect = KIconLoader::global()->iconEffect();
|
||||
icon = effect->apply( icon, KIconLoader::Desktop, KIconLoader::ActiveState );
|
||||
}
|
||||
painter->drawPixmap( x+5, (m_height - iconWidth)/2, icon );
|
||||
}
|
||||
|
||||
// generate text to display
|
||||
QString s;
|
||||
|
||||
if ( !m_client->isOnDesktop(m_parent->workspace()->currentDesktop()) )
|
||||
s = m_parent->workspace()->desktopName(m_client->desktop()) + ": ";
|
||||
|
||||
if ( m_client->isMinimized() )
|
||||
s += '(' + m_client->caption() + ')';
|
||||
else
|
||||
s += m_client->caption();
|
||||
|
||||
QFont font = painter->font();
|
||||
font.setPointSize( KGlobalSettings::smallestReadableFont().pointSize() );
|
||||
QFontMetrics fm = QFontMetrics( font );
|
||||
s = fm.elidedText( s, Qt::ElideMiddle, m_width - 5 - iconWidth - 8 );
|
||||
painter->setPen( Plasma::Theme::defaultTheme()->color( Plasma::Theme::TextColor ) );
|
||||
if( m_client->isMinimized() )
|
||||
{
|
||||
font.setItalic( true );
|
||||
}
|
||||
painter->setFont( font );
|
||||
painter->drawText( x+5 + iconWidth + 8, 0, m_width - 5 - iconWidth - 8, m_height - (m_showMiniIcons ? 2 : 4),
|
||||
Qt::AlignLeft | Qt::AlignBottom | Qt::TextSingleLine, s );
|
||||
}
|
||||
|
||||
void TabBoxWindowItem::drawBackground( QPainter* painter, const QStyleOptionGraphicsItem* , QWidget* )
|
||||
{
|
||||
if( m_client == m_parent->currentClient() )
|
||||
{
|
||||
m_parent->itemFrame()->setElementPrefix( "focus" );
|
||||
m_parent->itemFrame()->paintFrame( painter, boundingRect() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*******************************
|
||||
// TabBoxDesktopItem
|
||||
//*******************************
|
||||
|
||||
TabBoxDesktopItem::TabBoxDesktopItem( int desktop, TabBox* parent )
|
||||
: QGraphicsItem()
|
||||
, m_desktop( desktop )
|
||||
, m_parent( parent )
|
||||
, m_width( 0 )
|
||||
, m_height( 0 )
|
||||
{
|
||||
}
|
||||
|
||||
TabBoxDesktopItem::~TabBoxDesktopItem()
|
||||
{
|
||||
}
|
||||
|
||||
QRectF TabBoxDesktopItem::boundingRect() const
|
||||
{
|
||||
return QRectF( 0, 0, m_width, m_height );
|
||||
}
|
||||
|
||||
void TabBoxDesktopItem::setHeight( int height )
|
||||
{
|
||||
m_height = height;
|
||||
}
|
||||
|
||||
void TabBoxDesktopItem::setWidth( int width )
|
||||
{
|
||||
m_width = width;
|
||||
}
|
||||
|
||||
void TabBoxDesktopItem::paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget )
|
||||
{
|
||||
painter->setRenderHint( QPainter::Antialiasing );
|
||||
|
||||
drawBackground( painter, option, widget );
|
||||
|
||||
int iconWidth = 32;
|
||||
int iconHeight = iconWidth;
|
||||
int x = 0;
|
||||
int y = 0;
|
||||
|
||||
// get widest desktop name/number
|
||||
QFont f = painter->font();
|
||||
f.setBold(true);
|
||||
f.setPixelSize(iconHeight - 4); // pixel, not point because I need to know the pixels
|
||||
QFontMetrics fm = QFontMetrics( f );
|
||||
|
||||
QString num = QString::number( m_desktop );
|
||||
iconWidth = qMax(iconWidth - 4, fm.boundingRect(num).width()) + 4;
|
||||
|
||||
// draw "icon" (here: number of desktop)
|
||||
painter->save();
|
||||
QBrush brush;
|
||||
if( m_desktop == m_parent->currentDesktop() )
|
||||
brush = m_parent->palette().brush( QPalette::Active, QPalette::Highlight );
|
||||
else
|
||||
brush = m_parent->palette().brush( QPalette::Active, QPalette::Base );
|
||||
painter->fillRect(x+5, y+4, iconWidth, iconHeight, brush );
|
||||
painter->setPen(m_parent->palette().color( QPalette::Active, QPalette::Text ));
|
||||
painter->drawRect(x+5, y+4, iconWidth, iconHeight);
|
||||
|
||||
// draw desktop-number
|
||||
painter->setFont(f);
|
||||
painter->drawText(x+5, y+4, iconWidth, iconHeight, Qt::AlignCenter | Qt::AlignVCenter, num);
|
||||
|
||||
painter->restore();
|
||||
|
||||
// draw desktop name text
|
||||
QFont font = painter->font();
|
||||
font.setPointSize( KGlobalSettings::smallestReadableFont().pointSize() );
|
||||
painter->setFont( font );
|
||||
fm = QFontMetrics( font );
|
||||
int wmax = fm.width( m_parent->workspace()->desktopName( m_desktop ));
|
||||
|
||||
painter->setPen( Plasma::Theme::defaultTheme()->color( Plasma::Theme::TextColor ) );
|
||||
painter->drawText(x+5 + iconWidth + 8, y, m_width - 5 - iconWidth - 8, m_height - 4,
|
||||
Qt::AlignLeft | Qt::AlignBottom | Qt::TextSingleLine,
|
||||
m_parent->workspace()->desktopName( m_desktop ));
|
||||
|
||||
// show mini icons from that desktop aligned to each other
|
||||
int x1 = x + 5 + iconWidth + 8 + wmax + 5;
|
||||
|
||||
ClientList list;
|
||||
m_parent->createClientList(list, m_desktop, 0, false);
|
||||
// clients are in reversed stacking order
|
||||
for ( int i = list.size() - 1; i>=0; i-- )
|
||||
{
|
||||
if ( !list.at( i )->miniIcon().isNull() )
|
||||
{
|
||||
if ( x1+18 >= m_width ) // only show full icons
|
||||
break;
|
||||
|
||||
painter->drawPixmap( x1, y + (m_height - 16)/2, list.at( i )->miniIcon() );
|
||||
x1 += 18;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void TabBoxDesktopItem::drawBackground( QPainter* painter, const QStyleOptionGraphicsItem*, QWidget* )
|
||||
{
|
||||
if( m_desktop == m_parent->currentDesktop() )
|
||||
{
|
||||
m_parent->itemFrame()->setElementPrefix( "focus" );
|
||||
m_parent->itemFrame()->paintFrame( painter, boundingRect() );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//*******************************
|
||||
// Workspace
|
||||
//*******************************
|
||||
|
@ -969,6 +1103,7 @@ bool Workspace::startKDEWalkThroughWindows()
|
|||
modalActionsSwitch( false );
|
||||
tab_box->setMode( TabBoxWindowsMode );
|
||||
tab_box->reset();
|
||||
tab_box->initScene();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -980,6 +1115,7 @@ bool Workspace::startWalkThroughDesktops( TabBoxMode mode )
|
|||
modalActionsSwitch( false );
|
||||
tab_box->setMode( mode );
|
||||
tab_box->reset();
|
||||
tab_box->initScene();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
64
tabbox.h
64
tabbox.h
|
@ -4,6 +4,7 @@
|
|||
|
||||
Copyright (C) 1999, 2000 Matthias Ettrich <ettrich@kde.org>
|
||||
Copyright (C) 2003 Lubos Lunak <l.lunak@kde.org>
|
||||
Copyright (C) 2009 Martin Gräßlin <kde@martin-graesslin.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -22,8 +23,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#ifndef KWIN_TABBOX_H
|
||||
#define KWIN_TABBOX_H
|
||||
|
||||
#include <QFrame>
|
||||
#include <QTimer>
|
||||
#include <QGraphicsView>
|
||||
#include <QGraphicsScene>
|
||||
#include <QGraphicsItem>
|
||||
#include <KDE/Plasma/FrameSvg>
|
||||
#include "utils.h"
|
||||
|
||||
|
||||
|
@ -33,7 +37,7 @@ namespace KWin
|
|||
class Workspace;
|
||||
class Client;
|
||||
|
||||
class TabBox : public QFrame
|
||||
class TabBox : public QGraphicsView
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
|
@ -53,6 +57,7 @@ class TabBox : public QFrame
|
|||
TabBoxMode mode() const;
|
||||
|
||||
void reset( bool partial_reset = false );
|
||||
void initScene();
|
||||
void nextPrev( bool next = true);
|
||||
|
||||
void delayedShow();
|
||||
|
@ -67,6 +72,9 @@ class TabBox : public QFrame
|
|||
Workspace* workspace() const;
|
||||
|
||||
void reconfigure();
|
||||
void createClientList(ClientList &list, int desktop /*-1 = all*/, Client *start, bool chain);
|
||||
|
||||
Plasma::FrameSvg* itemFrame();
|
||||
|
||||
public slots:
|
||||
void show();
|
||||
|
@ -74,10 +82,9 @@ class TabBox : public QFrame
|
|||
protected:
|
||||
void showEvent( QShowEvent* );
|
||||
void hideEvent( QHideEvent* );
|
||||
void paintEvent( QPaintEvent* );
|
||||
virtual void drawBackground( QPainter * painter, const QRectF & rect );
|
||||
|
||||
private:
|
||||
void createClientList(ClientList &list, int desktop /*-1 = all*/, Client *start, bool chain);
|
||||
void createDesktopList(QList< int > &list, int start, SortOrder order);
|
||||
|
||||
private:
|
||||
|
@ -94,6 +101,49 @@ class TabBox : public QFrame
|
|||
int lineHeight;
|
||||
bool showMiniIcon;
|
||||
bool options_traverse_all;
|
||||
|
||||
QGraphicsScene* scene;
|
||||
Plasma::FrameSvg frame;
|
||||
Plasma::FrameSvg item_frame;
|
||||
};
|
||||
|
||||
class TabBoxWindowItem : public QGraphicsItem
|
||||
{
|
||||
public:
|
||||
TabBoxWindowItem( Client* client, TabBox* parent );
|
||||
~TabBoxWindowItem();
|
||||
virtual QRectF boundingRect() const;
|
||||
virtual void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget );
|
||||
void setWidth( int width );
|
||||
void setHeight( int height );
|
||||
void setShowMiniIcons( bool showMiniIcons );
|
||||
protected:
|
||||
virtual void drawBackground( QPainter* painter, const QStyleOptionGraphicsItem*, QWidget* );
|
||||
|
||||
private:
|
||||
Client* m_client;
|
||||
TabBox* m_parent;
|
||||
int m_width;
|
||||
int m_height;
|
||||
bool m_showMiniIcons;
|
||||
};
|
||||
|
||||
class TabBoxDesktopItem : public QGraphicsItem
|
||||
{
|
||||
public:
|
||||
TabBoxDesktopItem( int desktop, TabBox* parent );
|
||||
~TabBoxDesktopItem();
|
||||
virtual QRectF boundingRect() const;
|
||||
virtual void paint( QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget );
|
||||
void setWidth( int width );
|
||||
void setHeight( int height );
|
||||
protected:
|
||||
virtual void drawBackground( QPainter* painter, const QStyleOptionGraphicsItem*, QWidget* );
|
||||
private:
|
||||
int m_desktop;
|
||||
TabBox* m_parent;
|
||||
int m_width;
|
||||
int m_height;
|
||||
};
|
||||
|
||||
|
||||
|
@ -136,6 +186,12 @@ inline bool TabBox::isDisplayed() const
|
|||
return display_refcount > 0;
|
||||
}
|
||||
|
||||
inline Plasma::FrameSvg* TabBox::itemFrame()
|
||||
{
|
||||
return &item_frame;
|
||||
}
|
||||
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue