diff options
Diffstat (limited to 'Swift')
-rw-r--r-- | Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp | 43 | ||||
-rw-r--r-- | Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h | 13 | ||||
-rw-r--r-- | Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp | 33 |
3 files changed, 83 insertions, 6 deletions
diff --git a/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp b/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp index afe5d88..21e794e 100644 --- a/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp +++ b/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp @@ -1,114 +1,145 @@ /* * Copyright (c) 2012-2014 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ +/* + * Copyright (c) 2014 Kevin Smith and Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + #include <Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h> #include <cassert> #include <QHBoxLayout> namespace Swift { QtVCardGeneralField::QtVCardGeneralField(QWidget* parent, QGridLayout* layout, bool editable, int row, QString label, bool preferrable, bool taggable) : - QWidget(parent), editable(editable), preferrable(preferrable), taggable(taggable), layout(layout), row(row), preferredCheckBox(0), label(0), labelText(label), + QWidget(parent), editable(editable), preferrable(preferrable), taggable(taggable), starVisible(false), layout(layout), row(row), preferredCheckBox(0), label(0), labelText(label), tagComboBox(0), tagLabel(NULL), closeButton(0) { } QtVCardGeneralField::~QtVCardGeneralField() { } void QtVCardGeneralField::initialize() { if (preferrable) { preferredCheckBox = new QCheckBox(this); preferredCheckBox->setStyleSheet( "QCheckBox::indicator { width: 18px; height: 18px; }" "QCheckBox::indicator:checked { image: url(:/icons/star-checked.png); }" "QCheckBox::indicator:unchecked { image: url(:/icons/star-unchecked); }" ); layout->addWidget(preferredCheckBox, row, 0, Qt::AlignVCenter); childWidgets << preferredCheckBox; } label = new QLabel(this); label->setText(labelText); layout->addWidget(label, row, 1, Qt::AlignVCenter | Qt::AlignRight); tagLabel = new QLabel(this); tagLabel->setTextInteractionFlags(Qt::TextSelectableByMouse | Qt::TextSelectableByKeyboard); tagComboBox = new QtTagComboBox(this); closeButton = new QtCloseButton(this); connect(closeButton, SIGNAL(clicked()), SLOT(handleCloseButtonClicked())); QHBoxLayout* tagLayout = new QHBoxLayout(); tagLayout->addWidget(tagLabel); tagLayout->addWidget(tagComboBox); setupContentWidgets(); layout->addLayout(tagLayout, row, 4, Qt::AlignTop); layout->addWidget(closeButton, row, 5, Qt::AlignCenter); closeButton->resize(12, 12); tagLabel->hide(); childWidgets << label << tagComboBox << tagLabel << closeButton; setEditable(editable); } bool QtVCardGeneralField::isEditable() const { return editable; } void QtVCardGeneralField::setEditable(bool editable) { assert(tagComboBox); assert(closeButton); this->editable = editable; if (taggable) { tagLabel->setText(tagComboBox->itemText(0)); tagComboBox->setVisible(editable); tagLabel->setVisible(!editable); } else { tagLabel->hide(); tagComboBox->hide(); } closeButton->setVisible(editable); - if (preferrable) { - assert(preferredCheckBox); - preferredCheckBox->setVisible(editable ? true : preferredCheckBox->isChecked()); - preferredCheckBox->setEnabled(editable); - } + updatePreferredStarVisibility(); editableChanged(this->editable); } +void QtVCardGeneralField::setStarVisible(const bool isVisible) { + starVisible = isVisible; + updatePreferredStarVisibility(); +} + +bool QtVCardGeneralField::getStarVisible() const { + return starVisible; +} + void QtVCardGeneralField::setPreferred(const bool preferred) { if (preferredCheckBox) preferredCheckBox->setChecked(preferred); + updatePreferredStarVisibility(); } bool QtVCardGeneralField::getPreferred() const { return preferredCheckBox ? preferredCheckBox->isChecked() : false; } void QtVCardGeneralField::customCleanup() { } QtTagComboBox* QtVCardGeneralField::getTagComboBox() const { return tagComboBox; } QGridLayout* QtVCardGeneralField::getGridLayout() const { return layout; } void QtVCardGeneralField::handleCloseButtonClicked() { customCleanup(); foreach(QWidget* widget, childWidgets) { widget->hide(); layout->removeWidget(widget); } deleteField(this); } +void QtVCardGeneralField::updatePreferredStarVisibility() { + if (preferredCheckBox) { + bool showStar = false; + if (editable) { + if (starVisible) { + showStar = true; + } + else { + showStar = preferredCheckBox->isChecked(); + } + } + else { + showStar = preferredCheckBox->isChecked(); + } + preferredCheckBox->setVisible(showStar); + preferredCheckBox->setEnabled(editable); + } +} + } diff --git a/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h b/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h index 4afe692..93d326b 100644 --- a/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h +++ b/Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h @@ -1,77 +1,90 @@ /* * Copyright (c) 2012 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ +/* + * Copyright (c) 2014 Kevin Smith and Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + #pragma once #include <QCheckBox> #include <QGridLayout> #include <QLabel> #include <QWidget> #include "QtCloseButton.h" #include "QtTagComboBox.h" namespace Swift { /* * covers features like: * - preffered (star ceckbox) * - combo check boxh * - label * - remove button */ class QtVCardGeneralField : public QWidget { Q_OBJECT Q_PROPERTY(bool editable READ isEditable WRITE setEditable NOTIFY editableChanged) Q_PROPERTY(bool empty READ isEmpty) public: explicit QtVCardGeneralField(QWidget* parent = 0, QGridLayout* layout = 0, bool editable = false, int row = 0, QString label = QString(), bool preferrable = true, bool taggable = true); virtual ~QtVCardGeneralField(); void initialize(); virtual bool isEditable() const; virtual void setEditable(bool); virtual bool isEmpty() const = 0; + void setStarVisible(const bool isVisible); + bool getStarVisible() const; + void setPreferred(const bool preferred); bool getPreferred() const; protected: virtual void setupContentWidgets() = 0; virtual void customCleanup(); QtTagComboBox* getTagComboBox() const; QGridLayout* getGridLayout() const; signals: void editableChanged(bool); void deleteField(QtVCardGeneralField*); public slots: void handleCloseButtonClicked(); protected: QList<QWidget*> childWidgets; private: + void updatePreferredStarVisibility(); + + private: bool editable; bool preferrable; + bool starVisible; bool taggable; QGridLayout* layout; int row; QCheckBox* preferredCheckBox; QLabel* label; QString labelText; QtTagComboBox* tagComboBox; QLabel* tagLabel; QtCloseButton* closeButton; }; } diff --git a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp index d681fe9..7dfc06a 100644 --- a/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp +++ b/Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp @@ -1,41 +1,47 @@ /* * Copyright (c) 2012 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ +/* + * Copyright (c) 2014 Kevin Smith and Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + #include <Swift/QtUI/QtVCardWidget/QtVCardWidget.h> #include <QDebug> #include <QLineEdit> #include <QMenu> #include <Swift/QtUI/QtVCardWidget/ui_QtVCardWidget.h> #include <Swift/QtUI/QtVCardWidget/QtVCardAddressField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardAddressLabelField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardBirthdayField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardDescriptionField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardInternetEMailField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardJIDField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardOrganizationField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardRoleField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardTelephoneField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardTitleField.h> #include <Swift/QtUI/QtVCardWidget/QtVCardURLField.h> #include <Swift/QtUI/QtSwiftUtil.h> namespace Swift { QtVCardWidget::QtVCardWidget(QWidget* parent) : QWidget(parent), ui(new ::Ui::QtVCardWidget) { ui->setupUi(this); ui->cardFields->setColumnStretch(0,0); ui->cardFields->setColumnStretch(1,0); ui->cardFields->setColumnStretch(2,2); ui->cardFields->setColumnStretch(3,1); ui->cardFields->setColumnStretch(4,2); menu = new QMenu(this); @@ -267,108 +273,135 @@ VCard::ref QtVCardWidget::getVCard() { vcard->addURL(urlField->getURL()); continue; } } if (bdayField) { vcard->setBirthday(bdayField->getBirthday()); } else { vcard->setBirthday(boost::posix_time::ptime()); } if (descriptionField) { vcard->setDescription(descriptionField->getDescription()); } else { vcard->setDescription(""); } return vcard; } void QtVCardWidget::addField() { QAction* action = NULL; if ((action = dynamic_cast<QAction*>(sender()))) { boost::shared_ptr<QtVCardFieldInfo> fieldInfo = actionFieldInfo[action]; QWidget* newField = fieldInfo->createFieldInstance(this, ui->cardFields, true); QtVCardGeneralField* newGeneralField = dynamic_cast<QtVCardGeneralField*>(newField); if (newGeneralField) { newGeneralField->initialize(); } appendField(newGeneralField); relayoutToolButton(); } } void QtVCardWidget::removeField(QtVCardGeneralField *field) { + int sameFields = 0; + QtVCardGeneralField* fieldToChange = NULL; + foreach (QtVCardGeneralField* vcardField, fields) { + if ((vcardField != field) && (typeid(*vcardField) == typeid(*field))) { + sameFields++; + fieldToChange = vcardField; + } + } + + if ((sameFields == 1) && fieldToChange) { + fieldToChange->setStarVisible(false); + } + fields.remove(field); delete field; } void QtVCardWidget::addFieldType(QMenu* menu, boost::shared_ptr<QtVCardFieldInfo> fieldType) { if (!fieldType->getMenuName().isEmpty()) { QAction* action = new QAction(tr("Add ") + fieldType->getMenuName(), this); actionFieldInfo[action] = fieldType; connect(action, SIGNAL(triggered()), this, SLOT(addField())); menu->addAction(action); } } int QtVCardWidget::fieldTypeInstances(boost::shared_ptr<QtVCardFieldInfo> fieldType) { int instances = 0; for (int n = 0; n < ui->cardFields->count(); n++) { if (fieldType->testInstance(ui->cardFields->itemAt(n)->widget())) instances++; } return instances; } void layoutDeleteChildren(QLayout *layout) { while(layout->count() > 0) { QLayoutItem* child; if ((child = layout->takeAt(0)) != 0) { if (child->layout()) { layoutDeleteChildren(child->layout()); } if (dynamic_cast<QToolButton*>(child->widget())) { delete child; break; } delete child->widget(); delete child; } } } void QtVCardWidget::clearFields() { foreach(QtVCardGeneralField* field, fields) { delete field; } fields.clear(); assert(ui->cardFields->count() >= 0); layoutDeleteChildren(ui->cardFields); } void QtVCardWidget::clearEmptyFields() { std::vector<QtVCardGeneralField*> items_to_remove; foreach (QtVCardGeneralField* field, fields) { if (field->property("empty").isValid() && field->property("empty").toBool()) { ui->cardFields->removeWidget(field); items_to_remove.push_back(field); delete field; } } foreach(QtVCardGeneralField* field, items_to_remove) { fields.remove(field); } } void QtVCardWidget::appendField(QtVCardGeneralField *field) { connect(field, SIGNAL(deleteField(QtVCardGeneralField*)), SLOT(removeField(QtVCardGeneralField*))); + + QtVCardGeneralField* fieldToChange = NULL; + foreach (QtVCardGeneralField* vcardField, fields) { + if (typeid(*vcardField) == typeid(*field)) { + fieldToChange = vcardField; + break; + } + } + + if (fieldToChange) { + fieldToChange->setStarVisible(true); + field->setStarVisible(true); + } + fields.push_back(field); } void QtVCardWidget::relayoutToolButton() { ui->cardFields->addWidget(toolButton, ui->cardFields->rowCount(), ui->cardFields->columnCount()-2, 1, 1, Qt::AlignRight); } } |