Commit 86ecc7d1 authored by Tobias Hunger's avatar Tobias Hunger

JsonWizard: Add a customizeable page

Add a way to define custom pages with checkboxes, lineedits, etc.
on it.

Change-Id: I012109eabf00a12abc67ae34514d139b7cd7cf0d
Reviewed-by: default avatarDaniel Teske <daniel.teske@digia.com>
parent 65ebdc7e
This diff is collapsed.
/****************************************************************************
**
** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal
**
** This file is part of Qt Creator.
**
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia. For licensing terms and
** conditions see http://qt.digia.com/licensing. For further information
** use the contact form at http://qt.digia.com/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 2.1 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 2.1 requirements
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
**
** In addition, as a special exception, Digia gives you certain additional
** rights. These rights are described in the Digia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
****************************************************************************/
#ifndef JSONFIELDPAGE_H
#define JSONFIELDPAGE_H
#include <utils/pathchooser.h>
#include <utils/wizardpage.h>
#include <QVariant>
QT_BEGIN_NAMESPACE
class QFormLayout;
class QLabel;
class QLineEdit;
class QTextEdit;
QT_END_NAMESPACE
namespace Utils {
class AbstractMacroExpander;
class TextFieldCheckBox;
class TextFieldComboBox;
} // namespace Utils
namespace ProjectExplorer {
// Documentation inside.
class JsonFieldPage : public Utils::WizardPage
{
Q_OBJECT
public:
class Field
{
public:
Field() : mandatory(false), span(false), m_visibleExpression(true), m_widget(0) { }
virtual ~Field() { delete m_widget; }
static Field *parse(const QVariant &input, QString *errorMessage);
void createWidget(JsonFieldPage *page);
void adjustState(Utils::AbstractMacroExpander *expander);
virtual void setEnabled(bool e) { m_widget->setEnabled(e); }
void setVisible(bool v) { m_widget->setVisible(v); }
virtual bool validate(Utils::AbstractMacroExpander *expander, QString *message)
{ Q_UNUSED(expander); Q_UNUSED(message); return true; }
void initialize(Utils::AbstractMacroExpander *expander);
virtual void cleanup(Utils::AbstractMacroExpander *expander) { Q_UNUSED(expander); }
virtual bool suppressName() const { return false; }
QString name;
QString displayName;
bool mandatory;
bool span;
protected:
QVariant m_visibleExpression;
QVariant m_enabledExpression;
virtual bool parseData(const QVariant &data, QString *errorMessage) = 0;
virtual void initializeData(Utils::AbstractMacroExpander *expander) { Q_UNUSED(expander); }
virtual QWidget *widget(const QString &displayName) = 0;
virtual void setup(JsonFieldPage *page, const QString &name)
{ Q_UNUSED(page); Q_UNUSED(name); }
QWidget *m_widget;
};
class LabelField : public Field
{
public:
LabelField();
private:
QWidget *widget(const QString &displayName);
bool parseData(const QVariant &data, QString *errorMessage);
bool m_wordWrap;
QString m_text;
};
class SpacerField : public Field
{
public:
SpacerField();
bool suppressName() const { return true; }
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
int m_factor;
};
class LineEditField : public Field
{
public:
LineEditField();
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::AbstractMacroExpander *expander, QString *message);
void initializeData(Utils::AbstractMacroExpander *expander);
QString m_placeholderText;
QString m_defaultText;
QString m_disabledText;
bool m_isModified;
mutable QString m_currentText;
};
class TextEditField : public Field
{
public:
TextEditField();
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::AbstractMacroExpander *expander, QString *message);
void initializeData(Utils::AbstractMacroExpander *expander);
QString m_defaultText;
bool m_acceptRichText;
QString m_disabledText;
mutable QString m_currentText;
};
class PathChooserField : public Field
{
public:
PathChooserField();
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
void setEnabled(bool e);
void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::AbstractMacroExpander *expander, QString *message);
void initializeData(Utils::AbstractMacroExpander *expander);
QString m_path;
QString m_basePath;
Utils::PathChooser::Kind m_kind;
QString m_currentPath;
};
class CheckBoxField : public Field
{
public:
CheckBoxField();
bool suppressName() const { return true; }
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::AbstractMacroExpander *expander, QString *message);
void initializeData(Utils::AbstractMacroExpander *expander);
QString m_checkedValue;
QString m_uncheckedValue;
QVariant m_checkedExpression;
bool m_isModified;
};
class ComboBoxField : public Field
{
public:
ComboBoxField();
private:
bool parseData(const QVariant &data, QString *errorMessage);
QWidget *widget(const QString &displayName);
void setup(JsonFieldPage *page, const QString &name);
bool validate(Utils::AbstractMacroExpander *expander, QString *message);
void initializeData(Utils::AbstractMacroExpander *expander);
QStringList m_itemList;
QStringList m_itemDataList;
int m_index;
int m_disabledIndex;
mutable int m_savedIndex;
int m_currentIndex;
};
JsonFieldPage(Utils::AbstractMacroExpander *expander, QWidget *parent = 0);
~JsonFieldPage();
bool setup(const QVariant &data);
bool isComplete() const;
void initializePage();
void cleanupPage();
QFormLayout *layout() const { return m_formLayout; }
void showError(const QString &m) const;
void clearError() const;
Utils::AbstractMacroExpander *expander();
private:
QFormLayout *m_formLayout;
QLabel *m_errorLabel;
QList<Field *> m_fields;
Utils::AbstractMacroExpander *m_expander;
};
} // namespace ProjectExplorer
#endif // JSONFIELDPAGE_H
HEADERS += $$PWD/jsonfilepage.h \
HEADERS += $$PWD/jsonfieldpage.h \
$$PWD/jsonfilepage.h \
$$PWD/jsonsummarypage.h \
$$PWD/jsonwizard.h \
$$PWD/jsonwizardexpander.h \
......@@ -8,7 +9,8 @@ HEADERS += $$PWD/jsonfilepage.h \
$$PWD/jsonwizardpagefactory.h \
$$PWD/jsonwizardpagefactory_p.h
SOURCES += $$PWD/jsonfilepage.cpp \
SOURCES += $$PWD/jsonfieldpage.cpp \
$$PWD/jsonfilepage.cpp \
$$PWD/jsonsummarypage.cpp \
$$PWD/jsonwizard.cpp \
$$PWD/jsonwizardexpander.cpp \
......
......@@ -29,8 +29,10 @@
#include "jsonwizardpagefactory_p.h"
#include "jsonfieldpage.h"
#include "jsonfilepage.h"
#include "jsonsummarypage.h"
#include "jsonwizardfactory.h"
#include <utils/qtcassert.h>
#include <utils/wizardpage.h>
......@@ -41,6 +43,53 @@
namespace ProjectExplorer {
namespace Internal {
// --------------------------------------------------------------------
// FieldPageFactory:
// --------------------------------------------------------------------
FieldPageFactory::FieldPageFactory()
{
setTypeIdsSuffix(QLatin1String("Fields"));
}
Utils::WizardPage *FieldPageFactory::create(JsonWizard *wizard, Core::Id typeId, const QVariant &data)
{
Q_UNUSED(wizard);
QTC_ASSERT(canCreate(typeId), return 0);
JsonFieldPage *page = new JsonFieldPage(wizard->expander());
if (!page->setup(data)) {
delete page;
return 0;
}
return page;
}
bool FieldPageFactory::validateData(Core::Id typeId, const QVariant &data, QString *errorMessage)
{
QTC_ASSERT(canCreate(typeId), return false);
QList<QVariant> list = JsonWizardFactory::objectOrList(data, errorMessage);
if (list.isEmpty()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::JsonWizard",
"When parsing fields of page '%1': %2")
.arg(typeId.toString()).arg(*errorMessage);
return false;
}
foreach (const QVariant &v, list) {
JsonFieldPage::Field *field = JsonFieldPage::Field::parse(v, errorMessage);
if (!field)
return false;
delete field;
}
return true;
}
// --------------------------------------------------------------------
// FilePageFactory:
// --------------------------------------------------------------------
......
......@@ -35,6 +35,15 @@
namespace ProjectExplorer {
namespace Internal {
class FieldPageFactory : public JsonWizardPageFactory
{
public:
FieldPageFactory();
Utils::WizardPage *create(JsonWizard *wizard, Core::Id typeId, const QVariant &data);
bool validateData(Core::Id typeId, const QVariant &data, QString *errorMessage);
};
class FilePageFactory : public JsonWizardPageFactory
{
public:
......
......@@ -460,6 +460,7 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
addAutoReleasedObject(new CustomWizardMetaFactory<CustomWizard>(Core::IWizardFactory::ClassWizard));
// For JsonWizard:
JsonWizardFactory::registerPageFactory(new FieldPageFactory);
JsonWizardFactory::registerPageFactory(new FilePageFactory);
JsonWizardFactory::registerPageFactory(new SummaryPageFactory);
......
......@@ -170,6 +170,7 @@ QtcPlugin {
name: "JsonWizard"
prefix: "jsonwizard/"
files: [
"jsonfieldpage.cpp", "jsonfieldpage.h",
"jsonfilepage.cpp", "jsonfilepage.h",
"jsonsummarypage.cpp", "jsonsummarypage.h",
"jsonwizard.cpp", "jsonwizard.h",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment