summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/QtUI')
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardGeneralField.cpp43
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardGeneralField.h13
-rw-r--r--Swift/QtUI/QtVCardWidget/QtVCardWidget.cpp33
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);
}
}