diff options
Diffstat (limited to 'kftpgrabber/src/widgets/multitabbar.h')
-rw-r--r-- | kftpgrabber/src/widgets/multitabbar.h | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/kftpgrabber/src/widgets/multitabbar.h b/kftpgrabber/src/widgets/multitabbar.h new file mode 100644 index 0000000..ece61bf --- /dev/null +++ b/kftpgrabber/src/widgets/multitabbar.h @@ -0,0 +1,281 @@ +/* + * This file is part of the KFTPGrabber project + * + * Copyright (C) 2003-2005 by the KFTPGrabber developers + * Copyright (C) 2003-2005 Jernej Kos <kostko@jweb-network.net> + * Copyright (C) 2001-2003 by Joseph Wenninger <jowenn@kde.org> + * Copyright (C) 2005 by Mark Kretschmann <markey@web.de> + * + * 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 + * is provided AS IS, WITHOUT ANY WARRANTY; without even the implied + * warranty of MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, and + * NON-INFRINGEMENT. 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; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, + * MA 02110-1301, USA. + * + * In addition, as a special exception, the copyright holders give + * permission to link the code of portions of this program with the + * OpenSSL library under certain conditions as described in each + * individual source file, and distribute linked combinations + * including the two. + * You must obey the GNU General Public License in all respects + * for all of the code used other than OpenSSL. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you + * do not wish to do so, delete this exception statement from your + * version. If you delete this exception statement from all source + * files in the program, then also delete it here. + */ + +#ifndef KFTPWIDGETSMULTITABBAR_H +#define KFTPWIDGETSMULTITABBAR_H + +#include <qscrollview.h> +#include <qvbox.h> +#include <qhbox.h> +#include <qlayout.h> +#include <qstring.h> +#include <qptrlist.h> +#include <qpushbutton.h> + +class QPixmap; +class QPainter; +class QFrame; + +namespace KFTPWidgets { + +class MultiTabBarPrivate; +class MultiTabBarTabPrivate; +class MultiTabBarButtonPrivate; +class MultiTabBarInternal; + +/** + * A Widget for horizontal and vertical tabs. + * It is possible to add normal buttons to the top/left + * The handling if only one tab at a time or multiple tabs + * should be raisable is left to the "user". + * + * @author Joseph Wenninger + */ +class MultiTabBar: public QWidget +{ +Q_OBJECT +friend class MultiTabBarButton; +public: + enum MultiTabBarMode { Horizontal, Vertical }; + enum MultiTabBarPosition { Left, Right, Top, Bottom }; + + /** + * VSNET == Visual Studio .Net like (only show the text of active tabs + * KDEV3 == Kdevelop 3 like (always show the text) + * KONQSBC == konqy's classic sidebar style (unthemed), this one is disabled + * at the moment, but will be renabled soon too + * AMAROK == A nice clean style by the amaroK team + */ + enum MultiTabBarStyle { VSNET = 0, KDEV3 = 1, KONQSBC = 2, KDEV3ICON = 3, AMAROK = 4, STYLELAST = 0xffff }; + + MultiTabBar(MultiTabBarMode bm, QWidget *parent = 0, const char *name = 0); + virtual ~MultiTabBar(); + + /** + * append a new button to the button area. The button can later on be accessed with button(ID) + * eg for connecting signals to it + * + * @param pic a pixmap for the button + * @param id an arbitraty ID value. It will be emitted in the clicked signal for identifying the button + * if more than one button is connected to a signals. + * @param popup A popup menu which should be displayed if the button is clicked + * @param not_used_yet will be used for a popup text in the future + */ + int appendButton(const QPixmap &pic, int id = -1, QPopupMenu* popup = 0, const QString& not_used_yet = QString::null); + + /** + * remove a button with the given ID + */ + void removeButton(int id); + + /** + * append a new tab to the tab area. It can be accessed lateron with tabb(id); + * @param pic a bitmap for the tab + * @param id an arbitrary ID which can be used later on to identify the tab + * @param text if a mode with text is used it will be the tab text, otherwise a mouse over hint + */ + int appendTab( const QPixmap &pic, int id = -1, const QString& text = QString::null ); + + /** + * remove a tab with a given ID + */ + void removeTab( int id ); + /** + * set a tab to "raised" + * @param id The ID of the tab to manipulate + * @param state true == activated/raised, false == not active + */ + void setTab( int id , bool state ); + /** + * return the state of a tab, identified by it's ID + */ + bool isTabRaised( int id ) const; + /** + * get a pointer to a button within the button area identified by its ID + */ + class MultiTabBarButton *button( int id ) const; + + /** + * get a pointer to a tab within the tab area, identiifed by its ID + */ + class MultiTabBarTab *tab( int id ) const; + /** + * set the real position of the widget. + * @param pos if the mode is horizontal, only use top, bottom, if it is vertical use left or right + */ + void setPosition( MultiTabBarPosition pos ); + /** + * set the display style of the tabs + */ + void setStyle( MultiTabBarStyle style ); + /** + * be carefull, don't delete tabs yourself and don't delete the list itself + */ + QPtrList<MultiTabBarTab>* tabs(); + /** + * be carefull, don't delete buttons yourself and don't delete the list itself + */ + QPtrList<MultiTabBarButton>* buttons(); + + /** + * might vanish, not sure yet + */ + void showActiveTabTexts( bool show = true ); +protected: + virtual void fontChange( const QFont& ); + void updateSeparator(); +private: + class MultiTabBarInternal *m_internal; + QBoxLayout *m_l; + QFrame *m_btnTabSep; + QPtrList<MultiTabBarButton> m_buttons; + MultiTabBarPosition m_position; + MultiTabBarPrivate *d; +}; + +/** + * This class should never be created except with the appendButton call of MultiTabBar + */ +class MultiTabBarButton: public QPushButton +{ +Q_OBJECT +public: + MultiTabBarButton(MultiTabBarInternal *tb, const QPixmap& pic, const QString&, QPopupMenu *popup, + int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style); + MultiTabBarButton(MultiTabBarInternal *tb, const QString&, QPopupMenu *popup, + int id, QWidget *parent, MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style); + virtual ~MultiTabBarButton(); + + int id() const; +public slots: + /** + * this is used internaly, but can be used by the user, if (s)he wants to + * It the according call of MultiTabBar is invoked though this modifications will be overwritten + */ + void setPosition( MultiTabBar::MultiTabBarPosition ); + /** + * this is used internaly, but can be used by the user, if (s)he wants to + * It the according call of MultiTabBar is invoked though this modifications will be overwritten + */ + void setStyle( MultiTabBar::MultiTabBarStyle ); + + /** + * modify the text of the button + */ + void setText( const QString & ); + + QSize sizeHint() const; +protected: + static const int ANIM_INTERVAL = 18; + static const int ANIM_MAX = 20; + + MultiTabBarInternal *m_tb; + + MultiTabBar::MultiTabBarPosition m_position; + MultiTabBar::MultiTabBarStyle m_style; + + QString m_text; + int m_id; + bool m_animEnter; + int m_animCount; + class QTimer *m_animTimer; + + virtual void hideEvent(class QHideEvent*); + virtual void showEvent(class QShowEvent*); + virtual void enterEvent(class QEvent*); + virtual void leaveEvent(class QEvent*); +private: + MultiTabBarButtonPrivate *d; +signals: + /** + * this is emitted if the button is clicked + * @param id the ID identifying the button + */ + void clicked(int id); +protected slots: + virtual void slotClicked(); + virtual void slotAnimTimer(); +}; + +/** + * This class should never be created except with the appendTab call of MultiTabBar + */ +class MultiTabBarTab: public MultiTabBarButton +{ +Q_OBJECT +friend class MultiTabBarInternal; +public: + MultiTabBarTab(MultiTabBarInternal *tb, const QPixmap &pic, const QString&, int id, QWidget *parent, + MultiTabBar::MultiTabBarPosition pos, MultiTabBar::MultiTabBarStyle style); + virtual ~MultiTabBarTab(); + /** + * set the active state of the tab + * @param state true==active false==not active + */ + void setState( bool state ); + /** + * choose if the text should always be displayed + * this is only used in classic mode if at all + */ + void showActiveTabText( bool show ); + void resize() { setSize( neededSize() ); } +private: + bool m_showActiveTabText; + int m_expandedSize; + + MultiTabBarTabPrivate *d; +protected: + void setSize( int ); + int neededSize(); + void updateState(); + virtual void drawButton( QPainter * ); + virtual void drawButtonLabel( QPainter * ); + void drawButtonStyled( QPainter * ); + void drawButtonClassic( QPainter * ); + void drawButtonAmarok( QPainter * ); + QColor blendColors( const QColor& color1, const QColor& color2, int percent ); +protected slots: + virtual void slotClicked(); + void setTabsPosition( MultiTabBar::MultiTabBarPosition ); +public slots: + virtual void setIcon( const QString& ); + virtual void setIcon( const QPixmap& ); +}; + +} + +#endif |