-rw-r--r-- | libopie/big-screen/omodalhelper.h | 91 |
1 files changed, 79 insertions, 12 deletions
diff --git a/libopie/big-screen/omodalhelper.h b/libopie/big-screen/omodalhelper.h index 643458f..32d921d 100644 --- a/libopie/big-screen/omodalhelper.h +++ b/libopie/big-screen/omodalhelper.h @@ -25,26 +25,29 @@ Boston, MA 02111-1307, USA. */ #ifndef HAZE_OMODAL_HELPER_H #define HAZE_OMODAL_HELPER_H #include <qwidget.h> +#include <qvaluelist.h> +#include <qmap.h> -class OModalHelperSignal : public QObject { - Q_OBJECT -public: - OModalHelperSignal(); +typedef int TransactionID; -signals: - done( int status, int transaction ); - accpeted( int transaction ); - rejected( int transaction ); +class OModalHelperControler; +class OModalHelperSignal; +class QDialog; + +struct OModalHelperBase { + virtual void done( TransactionID id, QWidget* ) = 0; + virtual void next( TransactionID, OModalHelperControler * ); + virtual void prev( TransactionID, OModalHelperControler * ); }; /** * Modality sucks! ;) But it is easy to work with * do exec() on a dialog and you know everything is funky. * You only need to have one Dialog loaded and so on. * This class helps you to work like with modality and help * you to keep things in sync @@ -53,20 +56,84 @@ signals: * can fetch it. * Also if you edit an record external you can tell this class and it'll * call the merge() function of your widget to maybe merge in these changes. * It also supports multiple modes. Either it can create new dialogs * for each item or it can queue them depending on your usage. But it is * so smart that if only one item is shown that the queue bar is not shown * See the example for simple usage. * - * @short helps to live without modaility + * @short helps to life without modaility * @author hOlgAr * @version 0.01 */ -template<class Dialog, class Record> -class OModalHelper{ +template<class Dialog, class Record, typename Id = QString> +class OModalHelper : private OModalHelperBase{ + friend class OModalHelperSignal; + friend class OModalHelperControler; public: - OModalHelper(QObject* parnet ); + typedef QValueList<Record> RecordList; + typedef QMap<Id, Record> IdMap; + typedef QMap<TransactionID, Id> TransactionMap; + typedef QMap<QDialog*, TransactionID> DialogMap + enum Mode { Queue, New }; + OModalHelper(enum Mode mode, QObject* parnet ); + + bool handles( Id id)const; + + void cancel(); + void cancel( TransactionID ); + void connect( QObject* rec, const char* slot ); + + TransactionID handle( const Record& rec = Record() ); + + void edited( TransactionID, int what, const QString& data ); + + Record record( TransactionID )const; + RecordList done()const; +private: }; + + +/* ### FIXME use namespace with Qt3 */ + +/* + * A note on flow. The Signal is used for QT Signals when + * a record is done. + * There is either one controler and this controler slot will + * be connected to a dialog signal. + * In Queue we get the next and prev signals and call the Helper. + * this then changes the Record of the dialog and sets the transactionId + * of the controler. + * For the new mode + * + */ + +class OModalHelperSignal : public QObject { + Q_OBJECT +public: + OModalHelperSignal(); + +signals: + done( int status, TransactionID transaction ); + accpeted( TransactionID transaction ); + rejected( TransactionID transaction ); +}; + + +class OModalHelperControler : public QObject { + Q_OBJECT +public: + OModalHelperControler( TransactionID id ); + virtual TransactionID transactionID()const; + void setTransactionID( TransactionID id ); + QDialog* dialog()const; + +public slots: + virtual done(int result ); +private: + QDialog *m_dia; + TransactionID m_id; +} + #endif |