libqutim
0.3.2.0
|
00001 /**************************************************************************** 00002 ** 00003 ** qutIM - instant messenger 00004 ** 00005 ** Copyright © 2011 Ruslan Nigmatullin <euroelessar@yandex.ru> 00006 ** 00007 ***************************************************************************** 00008 ** 00009 ** $QUTIM_BEGIN_LICENSE$ 00010 ** This program is free software: you can redistribute it and/or modify 00011 ** it under the terms of the GNU General Public License as published by 00012 ** the Free Software Foundation, either version 3 of the License, or 00013 ** (at your option) any later version. 00014 ** 00015 ** This program is distributed in the hope that it will be useful, 00016 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00018 ** See the GNU General Public License for more details. 00019 ** 00020 ** You should have received a copy of the GNU General Public License 00021 ** along with this program. If not, see http://www.gnu.org/licenses/. 00022 ** $QUTIM_END_LICENSE$ 00023 ** 00024 ****************************************************************************/ 00025 #ifndef DATAFORMS_H 00026 #define DATAFORMS_H 00027 00028 #include "localizedstring.h" 00029 #include <QSharedPointer> 00030 #include <QVariant> 00031 #include <QFrame> 00032 #include <QDateTime> 00033 #include <QDate> 00034 #include <QPixmap> 00035 #include <QImage> 00036 #include <QIcon> 00037 00038 class QValidator; 00039 00040 namespace qutim_sdk_0_3 00041 { 00042 00043 class DataItemPrivate; 00044 00216 class LIBQUTIM_EXPORT DataItem 00217 { 00218 public: 00223 DataItem(); 00227 DataItem(const QString &name, const LocalizedString &title, const QVariant &data); 00231 DataItem(const LocalizedString &title, const QVariant &data = QVariant()); 00239 DataItem(const DataItem &other); 00243 ~DataItem(); 00247 DataItem &operator=(const DataItem &other); 00252 QString name() const; 00257 void setName(const QString &itemName); 00262 LocalizedString title() const; 00267 void setTitle(const LocalizedString &itemTitle); 00271 QVariant data() const; 00276 template<typename T> 00277 T data(const T &def = T()) const; 00281 void setData(const QVariant &itemData); 00285 bool isNull() const; 00290 QList<DataItem> subitems() const; 00294 void setSubitems(const QList<DataItem> &newSubitems); 00298 DataItem subitem(const QString &name, bool recursive = false) const; 00299 00300 int removeSubitems(const QString &name, bool recursive = false); 00301 bool removeSubitem(const QString &name, bool recursive = false); 00302 DataItem takeSubitem(const QString &name, bool recursive = false); 00307 void addSubitem(const DataItem &subitem); 00311 bool hasSubitems() const; 00318 void allowModifySubitems(const DataItem &defaultSubitem, int maxSubitemsCount = -1); 00323 bool isAllowedModifySubitems() const; 00329 int maxSubitemsCount() const; 00334 DataItem defaultSubitem() const; 00339 bool isReadOnly() const; 00344 void setReadOnly(bool readOnly = true); 00353 void setDataChangedHandler(QObject *receiver, const char *method); 00357 QObject *dataChangedReceiver() const; 00361 const char *dataChangedMethod() const; 00366 DataItem &operator<<(const DataItem &subitem); 00372 QVariant property(const char *name, const QVariant &def = QVariant()) const; 00378 template<typename T> 00379 T property(const char *name, const T &def = T()) const; 00384 void setProperty(const char *name, const QVariant &value); 00385 QList<QByteArray> dynamicPropertyNames() const; 00386 protected: 00387 #ifndef Q_QDOC 00388 friend class DataItemPrivate; 00389 QSharedDataPointer<DataItemPrivate> d; 00390 #endif 00391 }; 00392 00393 template<typename T> 00394 T DataItem::property(const char *name, const T &def) const 00395 { 00396 QVariant var = property(name, QVariant::fromValue<T>(def)); 00397 return var.value<T>(); 00398 } 00399 00400 class LIBQUTIM_EXPORT ReadOnlyDataItem : public DataItem 00401 { 00402 public: 00403 ReadOnlyDataItem(const LocalizedString &title, const QStringList &data); 00404 ReadOnlyDataItem(const LocalizedString &title, const LocalizedStringList &data); 00405 ReadOnlyDataItem(const LocalizedString &title, bool data); 00406 ReadOnlyDataItem(const LocalizedString &title, const QDate &data); 00407 ReadOnlyDataItem(const LocalizedString &title, const QDateTime &data); 00408 ReadOnlyDataItem(const LocalizedString &title, int data); 00409 ReadOnlyDataItem(const LocalizedString &title, uint data); 00410 ReadOnlyDataItem(const LocalizedString &title, double data); 00411 ReadOnlyDataItem(const LocalizedString &title, const QIcon &data); 00412 ReadOnlyDataItem(const LocalizedString &title, const QImage &data); 00413 ReadOnlyDataItem(const LocalizedString &title, const QPixmap &data); 00414 ReadOnlyDataItem(const LocalizedString &title, const QString &data); 00415 ReadOnlyDataItem(const LocalizedString &title, const LocalizedString &data); 00416 }; 00417 00418 class LIBQUTIM_EXPORT StringListDataItem : public DataItem 00419 { 00420 public: 00421 StringListDataItem(const QString &name, const LocalizedString &title, 00422 const QStringList &data = QStringList(), 00423 int maxStringsCount = -1); 00424 StringListDataItem(const QString &name, const LocalizedString &title, 00425 const LocalizedStringList &data = LocalizedStringList(), 00426 int maxStringsCount = -1); 00427 }; 00428 00429 class LIBQUTIM_EXPORT IntDataItem : public DataItem 00430 { 00431 public: 00432 IntDataItem(const QString &name, const LocalizedString &title, int data, 00433 int minValue = 0, int maxValue = 100); 00434 }; 00435 00436 class LIBQUTIM_EXPORT DoubleDataItem : public DataItem 00437 { 00438 public: 00439 DoubleDataItem(const QString &name, const LocalizedString &title, double data, 00440 double minValue = 0, double maxValue = 100); 00441 }; 00442 00443 class LIBQUTIM_EXPORT IconDataItem : public DataItem 00444 { 00445 public: 00446 IconDataItem(const QString &name, const LocalizedString &title, 00447 const QIcon &data = QIcon(), 00448 const QSize &imageSize = QSize(32, 32), 00449 const QList<QIcon> &alternatives = QList<QIcon>()); 00450 }; 00451 00452 class LIBQUTIM_EXPORT ImageDataItem : public DataItem 00453 { 00454 public: 00455 ImageDataItem(const QString &name, const LocalizedString &title, 00456 const QImage &data = QImage(), 00457 const QSize &imageSize = QSize(32, 32), 00458 const QList<QImage> &alternatives = QList<QImage>()); 00459 }; 00460 00461 class LIBQUTIM_EXPORT PixmapDataItem : public DataItem 00462 { 00463 public: 00464 PixmapDataItem(const QString &name, const LocalizedString &title, 00465 const QPixmap &data = QPixmap(), 00466 const QSize &imageSize = QSize(128, 128), 00467 const QList<QPixmap> &alternatives = QList<QPixmap>()); 00468 }; 00469 00470 class LIBQUTIM_EXPORT StringChooserDataItem : public DataItem 00471 { 00472 public: 00473 StringChooserDataItem(const QString &name, const LocalizedString &title, 00474 const QStringList &alternatives, const QString &data = QString(), 00475 bool editable = false, QValidator *validator = 0); 00476 StringChooserDataItem(const QString &name, const LocalizedString &title, 00477 const QStringList &alternatives, const QString &data, 00478 bool editable, QRegExp validator); 00479 StringChooserDataItem(const QString &name, const LocalizedString &title, 00480 const LocalizedStringList &alternatives, 00481 const LocalizedString &data, 00482 bool editable = false, QValidator *validator = 0); 00483 StringChooserDataItem(const QString &name, const LocalizedString &title, 00484 const LocalizedStringList &alternatives, 00485 const LocalizedString &data, 00486 bool editable, QRegExp validator); 00487 }; 00488 00489 class LIBQUTIM_EXPORT MultiLineStringDataItem : public DataItem 00490 { 00491 public: 00492 MultiLineStringDataItem(const QString &name, const LocalizedString &title, 00493 const QString &data = QString()); 00494 MultiLineStringDataItem(const QString &name, const LocalizedString &title, 00495 const LocalizedString &data); 00496 }; 00497 00498 class LIBQUTIM_EXPORT StringDataItem : public DataItem 00499 { 00500 public: 00501 StringDataItem(const QString &name, const LocalizedString &title, 00502 const QString &data = QString(), 00503 QValidator *validator = 0, bool password = false); 00504 StringDataItem(const QString &name, const LocalizedString &title, 00505 const QString &data, QRegExp validator, 00506 bool password = false); 00507 StringDataItem(const QString &name, const LocalizedString &title, 00508 const LocalizedString &data, QValidator *validator = 0, 00509 bool password = false); 00510 StringDataItem(const QString &name, const LocalizedString &title, 00511 const LocalizedString &data, QRegExp validator, 00512 bool password = false); 00513 }; 00514 00515 class LIBQUTIM_EXPORT AbstractDataForm : public QWidget 00516 { 00517 Q_OBJECT 00518 public: 00519 enum ButtonRole { 00520 InvalidRole = -1, 00521 AcceptRole, 00522 RejectRole, 00523 DestructiveRole, 00524 ActionRole, 00525 HelpRole, 00526 YesRole, 00527 NoRole, 00528 ResetRole, 00529 ApplyRole, 00530 00531 NRoles 00532 }; 00533 Q_DECLARE_FLAGS(ButtonRoles, ButtonRole) 00534 enum StandardButton { 00535 NoButton = 0x00000000, 00536 Ok = 0x00000400, 00537 Save = 0x00000800, 00538 SaveAll = 0x00001000, 00539 Open = 0x00002000, 00540 Yes = 0x00004000, 00541 YesToAll = 0x00008000, 00542 No = 0x00010000, 00543 NoToAll = 0x00020000, 00544 Abort = 0x00040000, 00545 Retry = 0x00080000, 00546 Ignore = 0x00100000, 00547 Close = 0x00200000, 00548 Cancel = 0x00400000, 00549 Discard = 0x00800000, 00550 Help = 0x01000000, 00551 Apply = 0x02000000, 00552 Reset = 0x04000000, 00553 RestoreDefaults = 0x08000000 00554 }; 00555 Q_DECLARE_FLAGS(StandardButtons, StandardButton) 00556 struct Button 00557 { 00558 LocalizedString name; 00559 ButtonRole role; 00560 }; 00561 typedef QList<Button> Buttons; 00562 public: 00563 virtual DataItem item() const = 0; 00570 virtual bool isChanged() const = 0; 00578 virtual bool isComplete() const = 0; 00582 virtual void clearState() = 0; 00589 virtual void setData(const QString &fieldName, const QVariant &data) = 0; 00590 static AbstractDataForm *get(const DataItem &item, 00591 StandardButtons standartButtons = NoButton, 00592 const Buttons &buttons = Buttons()); 00593 public slots: 00594 void accept(); 00595 void reject(); 00596 signals: 00597 void accepted(); 00598 void rejected(); 00599 void helpRequested(); 00600 void clicked(int buttonIndex); 00601 void clicked(qutim_sdk_0_3::AbstractDataForm::StandardButton standartButton); 00606 void changed(); 00613 void completeChanged(bool complete); 00614 protected: 00615 virtual void virtual_hook(int id, void *data); 00616 }; 00617 00618 class LIBQUTIM_EXPORT DataFormsBackend : public QObject 00619 { 00620 Q_OBJECT 00621 public: 00622 virtual AbstractDataForm *get(const DataItem &item, 00623 AbstractDataForm::StandardButtons standartButtons = AbstractDataForm::NoButton, 00624 const AbstractDataForm::Buttons &buttons = AbstractDataForm::Buttons()) = 0; 00625 static DataFormsBackend *instance(); 00626 }; 00627 00628 template<typename T> 00629 T DataItem::data(const T &def) const 00630 { 00631 QVariant d = data(); 00632 return d.canConvert<T>() ? d.value<T>() : def; 00633 } 00634 00635 #ifndef Q_QDOC 00636 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDataForm::ButtonRoles) 00637 Q_DECLARE_OPERATORS_FOR_FLAGS(AbstractDataForm::StandardButtons) 00638 #endif 00639 } 00640 00641 #ifndef Q_QDOC 00642 Q_DECLARE_METATYPE(qutim_sdk_0_3::DataItem) 00643 Q_DECLARE_METATYPE(QList<qutim_sdk_0_3::DataItem>) 00644 #endif 00645 00646 #endif // DATAFORMS_H 00647