summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/QtUI/QtFormWidget.cpp')
-rw-r--r--Swift/QtUI/QtFormWidget.cpp199
1 files changed, 81 insertions, 118 deletions
diff --git a/Swift/QtUI/QtFormWidget.cpp b/Swift/QtUI/QtFormWidget.cpp
index 158bc9d..b4840e9 100644
--- a/Swift/QtUI/QtFormWidget.cpp
+++ b/Swift/QtUI/QtFormWidget.cpp
@@ -1,4 +1,4 @@
/*
- * Copyright (c) 2010-2011 Kevin Smith
+ * Copyright (c) 2010-2014 Kevin Smith
* Licensed under the GNU General Public License v3.
* See Documentation/Licenses/GPLv3.txt for more information.
@@ -18,4 +18,6 @@
#include <Swift/QtUI/QtSwiftUtil.h>
#include <Swiften/Base/foreach.h>
+#include <boost/algorithm/string/join.hpp>
+#include <boost/smart_ptr/make_shared.hpp>
namespace Swift {
@@ -36,6 +38,8 @@ QtFormWidget::QtFormWidget(Form::ref form, QWidget* parent) : QWidget(parent), f
QWidget* scroll = new QWidget(this);
QGridLayout* layout = new QGridLayout(scroll);
- foreach (boost::shared_ptr<FormField> field, form->getFields()) {
- QWidget* widget = createWidget(field);
+ const std::vector<Form::FormItem> items = form->getItems();
+ if (items.empty()) { /* single item forms */
+ foreach (FormField::ref field, form->getFields()) {
+ QWidget* widget = createWidget(field, field->getType(), 0);
if (widget) {
layout->addWidget(new QLabel(field->getLabel().c_str(), this), row, 0);
@@ -43,6 +47,21 @@ QtFormWidget::QtFormWidget(Form::ref form, QWidget* parent) : QWidget(parent), f
}
}
+ } else { /* multi-item forms */
+ const Form::FormItem& headers = form->getFields();
+ for (size_t i = 0; i < items.size(); ++i) {
+ const Form::FormItem& item = items[i];
+ assert(item.size() == headers.size());
+ for (size_t j = 0; j < item.size(); ++j) {
+ QWidget* widget = createWidget(item[j], headers[j]->getType(), i);
+ if (widget) {
+ layout->addWidget(new QLabel(item[j]->getLabel().c_str(), this), row, 0);
+ layout->addWidget(widget, row++, 1);
+ }
+ }
+ }
+ }
scrollArea->setWidget(scroll);
scrollArea->setWidgetResizable(true);
+ setEditable(form->getType() != Form::CancelType && form->getType() != Form::ResultType);
}
@@ -54,18 +73,23 @@ QListWidget* QtFormWidget::createList(FormField::ref field) {
QListWidget* listWidget = new QListWidget(this);
listWidget->setSortingEnabled(false);
- listWidget->setSelectionMode(boost::dynamic_pointer_cast<ListMultiFormField>(field) ? QAbstractItemView::MultiSelection : QAbstractItemView::SingleSelection);
- boost::shared_ptr<ListMultiFormField> listMultiField = boost::dynamic_pointer_cast<ListMultiFormField>(field);
- boost::shared_ptr<ListSingleFormField> listSingleField = boost::dynamic_pointer_cast<ListSingleFormField>(field);
+ listWidget->setSelectionMode(field->getType() == FormField::ListMultiType ? QAbstractItemView::MultiSelection : QAbstractItemView::SingleSelection);
std::vector<bool> selected;
+ /* if this is an editable form, use the 'options' list, otherwise use the 'values' list */
+ if (form_->getType() != Form::FormType) {
+ foreach (const std::string& value, field->getValues()) {
+ listWidget->addItem(P2QSTRING(value));
+ selected.push_back(false);
+ }
+ } else {
foreach (FormField::Option option, field->getOptions()) {
listWidget->addItem(option.label.c_str());
- if (listSingleField) {
- selected.push_back(option.value == listSingleField->getValue());
+ if (field->getType() == FormField::ListSingleType) {
+ selected.push_back(!field->getValues().empty() && option.value == field->getValues()[0]);
}
- else if (listMultiField) {
+ else if (field->getType() == FormField::ListMultiType) {
std::string text = option.value;
- selected.push_back(std::find(listMultiField->getValue().begin(), listMultiField->getValue().end(), text) != listMultiField->getValue().end());
+ selected.push_back(std::find(field->getValues().begin(), field->getValues().end(), text) != field->getValues().end());
+ }
}
-
}
for (int i = 0; i < listWidget->count(); i++) {
@@ -76,64 +100,53 @@ QListWidget* QtFormWidget::createList(FormField::ref field) {
}
-QWidget* QtFormWidget::createWidget(FormField::ref field) {
+QWidget* QtFormWidget::createWidget(FormField::ref field, const FormField::Type type, const size_t index) {
QWidget* widget = NULL;
- boost::shared_ptr<BooleanFormField> booleanField = boost::dynamic_pointer_cast<BooleanFormField>(field);
- if (booleanField) {
+ if (type == FormField::BooleanType) {
QCheckBox* checkWidget = new QCheckBox(this);
- checkWidget->setCheckState(booleanField->getValue() ? Qt::Checked : Qt::Unchecked);
+ checkWidget->setCheckState(field->getBoolValue() ? Qt::Checked : Qt::Unchecked);
widget = checkWidget;
}
- boost::shared_ptr<FixedFormField> fixedField = boost::dynamic_pointer_cast<FixedFormField>(field);
- if (fixedField) {
- QString value = fixedField->getValue().c_str();
+ if (type == FormField::FixedType) {
+ QString value = field->getFixedValue().c_str();
widget = new QLabel(value, this);
}
- boost::shared_ptr<ListSingleFormField> listSingleField = boost::dynamic_pointer_cast<ListSingleFormField>(field);
- if (listSingleField) {
+ if (type == FormField::ListSingleType) {
widget = createList(field);
}
- boost::shared_ptr<TextMultiFormField> textMultiField = boost::dynamic_pointer_cast<TextMultiFormField>(field);
- if (textMultiField) {
- QString value = textMultiField->getValue().c_str();
- widget = new QTextEdit(value, this);
+ if (type == FormField::TextMultiType) {
+ QString value = field->getTextMultiValue().c_str();
+ QTextEdit* textWidget = new QTextEdit(this);
+ textWidget->setPlainText(value);
+ widget = textWidget;
}
- boost::shared_ptr<TextPrivateFormField> textPrivateField = boost::dynamic_pointer_cast<TextPrivateFormField>(field);
- if (textPrivateField) {
- QString value = textPrivateField->getValue().c_str();
+ if (type == FormField::TextPrivateType) {
+ QString value = field->getTextPrivateValue().c_str();
QLineEdit* lineWidget = new QLineEdit(value, this);
lineWidget->setEchoMode(QLineEdit::Password);
widget = lineWidget;
}
- boost::shared_ptr<TextSingleFormField> textSingleField = boost::dynamic_pointer_cast<TextSingleFormField>(field);
- if (textSingleField) {
- QString value = textSingleField->getValue().c_str();
+ if (type == FormField::TextSingleType) {
+ QString value = field->getTextSingleValue().c_str();
widget = new QLineEdit(value, this);
}
- boost::shared_ptr<JIDSingleFormField> jidSingleField = boost::dynamic_pointer_cast<JIDSingleFormField>(field);
- if (jidSingleField) {
- QString value = jidSingleField->getValue().toString().c_str();
+ if (type == FormField::JIDSingleType) {
+ QString value = field->getJIDSingleValue().toString().c_str();
widget = new QLineEdit(value, this);
}
- boost::shared_ptr<JIDMultiFormField> jidMultiField = boost::dynamic_pointer_cast<JIDMultiFormField>(field);
- if (jidMultiField) {
- QString text;
- bool prev = false;
- foreach (JID line, jidMultiField->getValue()) {
- if (prev) {
- text += "\n";
- }
- prev = true;
- text += line.toString().c_str();
+ if (type == FormField::JIDMultiType) {
+ QString text = boost::join(field->getValues(), "\n").c_str();
+ QTextEdit* textWidget = new QTextEdit(this);
+ textWidget->setPlainText(text);
+ widget = textWidget;
}
- widget = new QTextEdit(text, this);
- }
- boost::shared_ptr<ListMultiFormField> listMultiField = boost::dynamic_pointer_cast<ListMultiFormField>(field);
- if (listMultiField) {
+ if (type == FormField::ListMultiType) {
widget = createList(field);
}
- boost::shared_ptr<HiddenFormField> hiddenField = boost::dynamic_pointer_cast<HiddenFormField>(field);
- if (hiddenField) {
+ std::string indexString;
+ if (index) {
+ /* for multi-item forms we need to distinguish between the different rows */
+ indexString = boost::lexical_cast<std::string>(index);
}
- fields_[field->getName()] = widget;
+ fields_[field->getName() + indexString] = widget;
return widget;
}
@@ -142,97 +155,47 @@ Form::ref QtFormWidget::getCompletedForm() {
Form::ref result(new Form(Form::SubmitType));
foreach (boost::shared_ptr<FormField> field, form_->getFields()) {
- boost::shared_ptr<FormField> resultField;
- boost::shared_ptr<BooleanFormField> booleanField = boost::dynamic_pointer_cast<BooleanFormField>(field);
- if (booleanField) {
- resultField = FormField::ref(BooleanFormField::create(qobject_cast<QCheckBox*>(fields_[field->getName()])->checkState() == Qt::Checked));
+ boost::shared_ptr<FormField> resultField = boost::make_shared<FormField>(field->getType());
+ if (field->getType() == FormField::BooleanType) {
+ resultField->setBoolValue(qobject_cast<QCheckBox*>(fields_[field->getName()])->checkState() == Qt::Checked);
}
- boost::shared_ptr<FixedFormField> fixedField = boost::dynamic_pointer_cast<FixedFormField>(field);
- if (fixedField) {
- resultField = FormField::ref(FixedFormField::create(fixedField->getValue()));
+ if (field->getType() == FormField::FixedType || field->getType() == FormField::HiddenType) {
+ resultField->addValue(field->getValues().empty() ? "" : field->getValues()[0]);
}
- boost::shared_ptr<ListSingleFormField> listSingleField = boost::dynamic_pointer_cast<ListSingleFormField>(field);
- if (listSingleField) {
+ if (field->getType() == FormField::ListSingleType) {
QListWidget* listWidget = qobject_cast<QListWidget*>(fields_[field->getName()]);
if (listWidget->selectedItems().size() > 0) {
int i = listWidget->row(listWidget->selectedItems()[0]);
- resultField = FormField::ref(ListSingleFormField::create(field->getOptions()[i].value));
- }
- else {
- resultField = FormField::ref(ListSingleFormField::create());
+ resultField->addValue(field->getOptions()[i].value);
}
}
- boost::shared_ptr<TextMultiFormField> textMultiField = boost::dynamic_pointer_cast<TextMultiFormField>(field);
- if (textMultiField) {
+ if (field->getType() == FormField::TextMultiType) {
QTextEdit* widget = qobject_cast<QTextEdit*>(fields_[field->getName()]);
QString string = widget->toPlainText();
- if (string.isEmpty()) {
- resultField = FormField::ref(TextMultiFormField::create());
- }
- else {
- resultField = FormField::ref(TextMultiFormField::create(Q2PSTRING(string)));
+ if (!string.isEmpty()) {
+ resultField->setTextMultiValue(Q2PSTRING(string));
}
}
- boost::shared_ptr<TextPrivateFormField> textPrivateField = boost::dynamic_pointer_cast<TextPrivateFormField>(field);
- if (textPrivateField) {
+ if (field->getType() == FormField::TextPrivateType || field->getType() == FormField::TextSingleType || field->getType() == FormField::JIDSingleType) {
QLineEdit* widget = qobject_cast<QLineEdit*>(fields_[field->getName()]);
QString string = widget->text();
- if (string.isEmpty()) {
- resultField = FormField::ref(TextPrivateFormField::create());
+ if (!string.isEmpty()) {
+ resultField->addValue(Q2PSTRING(string));
}
- else {
- resultField = FormField::ref(TextPrivateFormField::create(Q2PSTRING(string)));
}
- }
- boost::shared_ptr<TextSingleFormField> textSingleField = boost::dynamic_pointer_cast<TextSingleFormField>(field);
- if (textSingleField) {
- QLineEdit* widget = qobject_cast<QLineEdit*>(fields_[field->getName()]);
- QString string = widget->text();
- if (string.isEmpty()) {
- resultField = FormField::ref(TextSingleFormField::create());
- }
- else {
- resultField = FormField::ref(TextSingleFormField::create(Q2PSTRING(string)));
- }
- }
- boost::shared_ptr<JIDSingleFormField> jidSingleField = boost::dynamic_pointer_cast<JIDSingleFormField>(field);
- if (jidSingleField) {
- QLineEdit* widget = qobject_cast<QLineEdit*>(fields_[field->getName()]);
- QString string = widget->text();
- JID jid(Q2PSTRING(string));
- if (string.isEmpty()) {
- resultField = FormField::ref(JIDSingleFormField::create());
- }
- else {
- resultField = FormField::ref(JIDSingleFormField::create(jid));
- }
- }
- boost::shared_ptr<JIDMultiFormField> jidMultiField = boost::dynamic_pointer_cast<JIDMultiFormField>(field);
- if (jidMultiField) {
+ if (field->getType() == FormField::JIDMultiType) {
QTextEdit* widget = qobject_cast<QTextEdit*>(fields_[field->getName()]);
QString string = widget->toPlainText();
- if (string.isEmpty()) {
- resultField = FormField::ref(JIDMultiFormField::create());
- }
- else {
+ if (!string.isEmpty()) {
QStringList lines = string.split("\n");
- std::vector<JID> value;
foreach (QString line, lines) {
- value.push_back(JID(Q2PSTRING(line)));
+ resultField->addValue(Q2PSTRING(line));
}
- resultField = FormField::ref(JIDMultiFormField::create(value));
}
}
- boost::shared_ptr<ListMultiFormField> listMultiField = boost::dynamic_pointer_cast<ListMultiFormField>(field);
- if (listMultiField) {
+ if (field->getType() == FormField::ListMultiType) {
QListWidget* listWidget = qobject_cast<QListWidget*>(fields_[field->getName()]);
- std::vector<std::string> values;
foreach (QListWidgetItem* item, listWidget->selectedItems()) {
- values.push_back(field->getOptions()[listWidget->row(item)].value);
- }
- resultField = FormField::ref(ListMultiFormField::create(values));
+ resultField->addValue(field->getOptions()[listWidget->row(item)].value);
}
- boost::shared_ptr<HiddenFormField> hiddenField = boost::dynamic_pointer_cast<HiddenFormField>(field);
- if (hiddenField) {
- resultField = FormField::ref(HiddenFormField::create(hiddenField->getValue()));
}
resultField->setName(field->getName());