You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kicker/kicker/ui/kickoff_bar.cpp

238 lines
7.2 KiB

/*****************************************************************
Copyright (c) 1996-2000 the kicker authors. See file AUTHORS.
Copyright (c) 2006 Dirk Mueller <mueller@kde.org>
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 the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
******************************************************************/
#include "kickoff_bar.h"
#include "itemview.h"
#include <tqiconset.h>
#include <tqpainter.h>
#include <tqcursor.h>
#include <tqstyle.h>
#include <tqapplication.h>
#include <kdebug.h>
#include "kickerSettings.h"
KickoffTabBar::KickoffTabBar(TQWidget* parent, const char* name)
: TQTabBar(parent, name), m_tabsActivated(true)
{
setAcceptDrops(true);
}
void KickoffTabBar::deactivateTabs(bool b)
{
m_tabsActivated = !b;
update();
}
void KickoffTabBar::paint(TQPainter* p, TQTab* t, bool selected) const
{
TQStyle::SFlags flags = TQStyle::Style_Default;
if (isEnabled() && t->isEnabled())
flags |= TQStyle::Style_Enabled;
if ( m_tabsActivated && selected )
flags |= TQStyle::Style_Selected;
// else if(t == d->pressed)
// flags |= TQStyle::Style_Sunken;
//selection flags
if(t->rect().contains(mapFromGlobal(TQCursor::pos())))
flags |= TQStyle::Style_MouseOver;
style().drawControl( TQStyle::CE_TabBarTab, p, this, t->rect(),
colorGroup(), flags, TQStyleOption(t) );
paintLabel( p, t->rect(), t, t->identifier() == keyboardFocusTab() );
}
void KickoffTabBar::paintLabel(TQPainter* p, const TQRect& br, TQTab* t, bool has_focus) const
{
TQRect r = br;
bool selected = m_tabsActivated && (currentTab() == t->identifier());
int vframe = style().pixelMetric( TQStyle::PM_TabBarTabVSpace, this );
p->setFont( font() );
TQFontMetrics fm = p->fontMetrics();
int fw = fm.size( TQt::SingleLine|TQt::ShowPrefix, t->text() ).width();
TQRect rt(r);
rt.setWidth(fw);
if ( t->iconSet())
{
// the tab has an iconset, draw it in the right mode
TQIconSet::Mode mode = (t->isEnabled() && isEnabled())
? TQIconSet::Normal : TQIconSet::Disabled;
if ( mode == TQIconSet::Normal && has_focus )
mode = TQIconSet::Active;
TQPixmap pixmap = t->iconSet()->pixmap( TQIconSet::Large, mode );
int pixw = pixmap.width();
int pixh = pixmap.height();
int xoff = br.x() + (br.width() - pixw)/2;
int yoff = br.y() + (br.height() - 4 - pixh - ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) - vframe)/2;
p->drawPixmap( xoff, 4 + yoff, pixmap );
r.setTop(vframe/2 + yoff + pixh - 8);
rt.setTop(vframe/2 + yoff + pixh - 8);
rt.setHeight(((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + vframe/2);
}
else
rt.setHeight(vframe/2 + fm.height());
rt.setWidth(fw+8);
rt.moveCenter(r.center());
TQStyle::SFlags flags = TQStyle::Style_Default;
if (isEnabled() && t->isEnabled())
flags |= TQStyle::Style_Enabled;
if (has_focus)
flags |= TQStyle::Style_HasFocus;
if ( selected )
flags |= TQStyle::Style_Selected;
// else if(t == d->pressed)
// flags |= TQStyle::Style_Sunken;
if(t->rect().contains(mapFromGlobal(TQCursor::pos())))
flags |= TQStyle::Style_MouseOver;
style().drawControl( TQStyle::CE_TabBarLabel, p, this, rt,
t->isEnabled() ? colorGroup(): palette().disabled(),
flags, TQStyleOption(t) );
}
TQSize KickoffTabBar::sizeHint() const
{
TQSize s = TQTabBar::sizeHint();
return s;
}
TQSize KickoffTabBar::minimumSizeHint() const
{
TQSize s;
TQFontMetrics fm = fontMetrics();
int fh = ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + 4;
int hframe = style().pixelMetric( TQStyle::PM_TabBarTabHSpace, this );
int vframe = style().pixelMetric( TQStyle::PM_TabBarTabVSpace, this );
for (int t = 0; t < count(); ++t) {
TQTab* tab = tabAt(t);
if (tab->iconSet()) {
s = s.expandedTo(tab->iconSet()->pixmap(TQIconSet::Large, TQIconSet::Normal).size());
}
}
// Every tab must have identical height and width.
// We check every tab minimum height and width and we keep the
// biggest one as reference. Smaller tabs will be expanded to match
// the same size.
int mw = 0;
int mh = 0;
for (int t = 0; t < count(); ++t) {
TQTab* tab = tabAt(TQApplication::reverseLayout() ? count() - t - 1 : t);
// Checks tab minimum height
int h = fh;
if (tab->iconSet()) {
h += 4 + s.height() + 4;
}
h += ((KickerSettings::kickoffTabBarFormat() != KickerSettings::IconOnly) ? fm.height() : 0) + vframe;
// Checks tab minimum width (font)
int fw = fm.size( TQt::SingleLine|TQt::ShowPrefix, tab->text() ).width();
// Checks tab minimum width (icon)
int iw = 0;
if ( tab->iconSet()) {
iw = tab->iconSet()->pixmap( TQIconSet::Large, TQIconSet::Normal ).width();
}
// Final width for this tab
int w = TQMAX(iw, fw) + hframe;
mw = TQMAX(mw, w);
mh = TQMAX(mh, h);
}
s.setWidth(mw * count());
s.setHeight(mh);
return (s);
}
void KickoffTabBar::layoutTabs()
{
TQSize s;
TQSize st = minimumSizeHint();
TQTabBar::layoutTabs();
int overlap = style().pixelMetric( TQStyle::PM_TabBarTabOverlap, this );
int x = 0;
int h = st.height();
for (int t = 0; t < count(); ++t) {
TQTab* tab = tabAt(TQApplication::reverseLayout() ? count() - t - 1 : t);
int w = TQMAX(st.width() / count(), parentWidget()->width() / count());
TQRect r = tab->rect();
tab->setRect(TQRect(TQPoint(x, 0), style().sizeFromContents(TQStyle::CT_TabBarTab, this,
TQSize(w, h), TQStyleOption(tab))));
x += tab->rect().width() - overlap;
}
}
void KickoffTabBar::dragEnterEvent(TQDragEnterEvent* event)
{
event->accept(KMenuItemDrag::canDecode(event));
}
void KickoffTabBar::dragMoveEvent(TQDragMoveEvent* event)
{
TQTab* t = selectTab(event->pos());
// ### uhhh, look away
if (t && t->identifier() == 0)
{
setCurrentTab(t);
}
}
void KickoffTabBar::mousePressEvent( TQMouseEvent * e )
{
if ( e->button() != TQt::LeftButton ) {
e->ignore();
return;
}
TQTab *t = selectTab( e->pos() );
if ( t && t->isEnabled() ) {
emit tabClicked(t);
}
TQTabBar::mousePressEvent(e);
}
#include "kickoff_bar.moc"