/*************************************************************************** * Copyright (C) 2005 by Max Howell * * * * 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; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Steet, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #ifndef KDE_STATUSBAR_H #define KDE_STATUSBAR_H #include "progressBar.h" //convenience #include "amarok_export.h" #include //baseclass #include //stack allocated #include //stack allocated class TQLabel; class TQTimer; namespace KIO { class Job; } //TODO // * concept of a temporary message that is removed when a qobject parent is deleted namespace KDE { class OverlayWidget; typedef TQMap ProgressMap; /** * @class KDE::StatusBar * @short advanced statusBar * @author Max Howell * * Like a normal TQStatusBar, but add widgets directly: * * new TQLabel( text, statusbar ); * * The statusbar has some handy progress monitoring behaviour, use like so: * * statusbar->newProgressOperation( myObject ) * .setDescription( i18n("MyProgressOperation") ) * .setStatus( i18n("Stage1") ) * .setAbortSlot( myObject, TQT_SLOT(abort()) ) * .setTotalSteps( 100 ); * * The newProgressOperation function returns a KDE::ProgressBar, which is * a TQProgressBar with some additional functions that return ProgressBar&, * so you can chain the mutators like above. @see KDE::ProgressBar * * After this point you can use setProgress( TQObject*, int steps ) to update * the progress for this progress operation. Only one progress operation per * TQObject! * * You can also follow KIO::Jobs, with built in error handling, and * ThreadManager::Jobs have built in thread-safe progress handling. * * You can show long status/error messages using longMessage(), these are * meant to be instead of showing an irritating, interuptory KMessageBox. * * Caveats: * This only looks sensible if the statusbar is at the bottom of the screen * * @see KDE::ProgressBar */ class StatusBar : public TQWidget { Q_OBJECT TQ_OBJECT public: StatusBar( TQWidget *parent, const char *name = "mainStatusBar" ); enum MessageType { Information, Question, Sorry, Warning, Error, ShowAgainCheckBox, None }; /** * Start a progress operation, if owner is 0, the return value is * undefined - the application will probably crash. * @param owner controls progress for this operation * @return the progressBar so you can configure its parameters * @see setProgress( TQObject*, int ) * @see incrementProgress( TQObject* ) * @see setProgressStatus( const TQObject*, const TQString& ) */ ProgressBar &newProgressOperation( TQObject *owner ); /** * Monitor progress for a KIO::Job, very handy. */ ProgressBar &newProgressOperation( KIO::Job* ); void incrementProgressTotalSteps( const TQObject *owner, int inc = 1 ); void incrementProgress( const TQObject *owner ); void setProgressStatus( const TQObject *owner, const TQString &text ); public slots: /** * The statusbar has a region where you can display a mainMessage. * It persists after all other message-types are displayed */ void setMainText( const TQString &text ); /// resets mainText if you've done a shortMessage void resetMainText(); /** * Shows a non-invasive messgeBox style message that the user has to dismiss * but it doesn't interupt whatever he is doing at the current time. * Generally you should use these, as it is very easy for a user to not notice * statusBar messages. */ void longMessage( const TQString &text, int type = Information ) LIBAMAROK_EXPORT ; void longMessageThreadSafe( const TQString &text, int type = Information ); /** * Shows a short message, with a button that can be pushed to show a long * message */ void shortLongMessage( const TQString &_short, const TQString &_long, int type = Information ); /** * Set a temporary message over the mainText label, for 5 seconds. * ONLY USE FOR STATUS MESSAGES! ie "Buffering...", "Connecting to source..." */ void shortMessage( const TQString &text, bool longShort = false ); /** Stop anticipating progress from sender() */ void endProgressOperation(); /** Stop anticipating progress from @param owner */ void endProgressOperation( TQObject *owner ); /** * Convenience function works like setProgress( TQObject*, int ) * Uses the return value from sender() to determine the owner of * the progress bar in question */ void setProgress( int steps ); void setProgress( const TQObject *owner, int steps ); /** * Convenience function works like setTotalSteps( TQObject*, int ) * Uses the return value from sender() to determine the owner of * the progress bar in question */ //void setTotalSteps( int totalSteps ); /** * Convenience function works like incrementProgress( TQObject* ) * Uses the return value from sender() to determine the owner of * the progress bar in question */ void incrementProgress(); public slots: void toggleProgressWindow( bool show ); void abortAllProgressOperations(); private slots: /** For internal use against KIO::Jobs */ void setProgress( KIO::Job*, unsigned long percent ); void showMainProgressBar(); void hideMainProgressBar(); void updateProgressAppearance(); void showShortLongDetails(); void popupDeleted( TQObject* ); protected: virtual void polish(); virtual void customEvent( TQCustomEvent* ); virtual void paintEvent( TQPaintEvent* ); virtual bool event( TQEvent* ); /** * You must parent the widget to the statusbar, we won't do that * for you! The widget will be added to the right of the tqlayout. * Currently you must add widgets before the statusbar gets shown * for the first time, because we are not currently very flexible. */ void addWidget( TQWidget *widget ); TQLabel *m_mainTextLabel; private: struct Message { Message() : type( KDE::StatusBar::None ), offset( 0 ) {} Message( const TQString &_text, const MessageType _type ) : text( _text ), type( _type ), offset( 0 ) {} TQString text; MessageType type; int offset; }; void updateTotalProgress(); bool allDone(); ///@return true if all progress operations are complete void pruneProgressBars(); /// deletes old progress bars void writeLogFile( const TQString &text ); int m_logCounter; TQWidget *cancelButton() { return TQT_TQWIDGET( child( "cancelButton" ) ); } TQWidget *toggleProgressWindowButton() { return TQT_TQWIDGET( child( "showAllProgressDetails" ) ); } TQWidget *progressBox() { return TQT_TQWIDGET( child( "progressBox" ) ); } TQWidget *shortLongButton() { return TQT_TQWIDGET( child( "shortLongButton" ) ); } OverlayWidget *m_popupProgress; TQProgressBar *m_mainProgressBar; ProgressMap m_progressMap; TQValueList m_messageQueue; TQString m_mainText; TQString m_shortLongText; int m_shortLongType; TQLayout *m_otherWidgetLayout; }; } #endif