diff --git a/components/components.pro b/components/components.pro index 98e732c..9fac05b 100644 --- a/components/components.pro +++ b/components/components.pro @@ -25,7 +25,9 @@ SOURCES = \ qtmaterialslider.cpp \ qtmaterialradiobutton.cpp \ qtmaterialtoggle_internal.cpp \ - qtmaterialtoggle.cpp + qtmaterialtoggle.cpp \ + qtmaterialtextfield_internal.cpp \ + qtmaterialtextfield.cpp HEADERS = \ qtmaterialavatar_p.h \ qtmaterialavatar.h \ @@ -67,6 +69,9 @@ HEADERS = \ qtmaterialradiobutton.h \ qtmaterialtoggle_internal.h \ qtmaterialtoggle_p.h \ - qtmaterialtoggle.h + qtmaterialtoggle.h \ + qtmaterialtextfield_internal.h \ + qtmaterialtextfield_p.h \ + qtmaterialtextfield.h RESOURCES += \ resources.qrc diff --git a/components/qtmaterialtextfield.cpp b/components/qtmaterialtextfield.cpp new file mode 100644 index 0000000..86643d6 --- /dev/null +++ b/components/qtmaterialtextfield.cpp @@ -0,0 +1,295 @@ +#include "qtmaterialtextfield.h" +#include "qtmaterialtextfield_p.h" +#include +#include +#include +#include "qtmaterialtextfield_internal.h" +#include "lib/qtmaterialstyle.h" +#include + +/*! + * \class QtMaterialTextFieldPrivate + * \internal + */ + +QtMaterialTextFieldPrivate::QtMaterialTextFieldPrivate(QtMaterialTextField *q) + : q_ptr(q) +{ +} + +QtMaterialTextFieldPrivate::~QtMaterialTextFieldPrivate() +{ +} + +void QtMaterialTextFieldPrivate::init() +{ + Q_Q(QtMaterialTextField); + + stateMachine = new QtMaterialTextFieldStateMachine(q); + label = 0; + labelFontSize = 9.5; + showLabel = false; + useThemeColors = true; + + q->setFrame(false); + q->setStyle(&QtMaterialStyle::instance()); + q->setAttribute(Qt::WA_Hover); + q->setMouseTracking(true); + q->setTextMargins(0, 2, 0, 4); + + QFontDatabase db; + QFont font(db.font("Roboto", "Regular", 11)); + q->setFont(font); + + stateMachine->start(); + QCoreApplication::processEvents(); +} + +/*! + * \class QtMaterialTextField + */ + +QtMaterialTextField::QtMaterialTextField(QWidget *parent) + : QLineEdit(parent), + d_ptr(new QtMaterialTextFieldPrivate(this)) +{ + d_func()->init(); +} + +QtMaterialTextField::~QtMaterialTextField() +{ +} + +void QtMaterialTextField::setUseThemeColors(bool value) +{ + Q_D(QtMaterialTextField); + + if (d->useThemeColors == value) { + return; + } + + d->useThemeColors = value; + d->stateMachine->setupProperties(); +} + +bool QtMaterialTextField::useThemeColors() const +{ + Q_D(const QtMaterialTextField); + + return d->useThemeColors; +} + +void QtMaterialTextField::setShowLabel(bool value) +{ + Q_D(QtMaterialTextField); + + if (d->showLabel == value) { + return; + } + + d->showLabel = value; + + if (!d->label && value) { + d->label = new QtMaterialTextFieldLabel(this); + d->stateMachine->setLabel(d->label); + } + + if (value) { + setContentsMargins(0, 23, 0, 0); + } else { + setContentsMargins(0, 0, 0, 0); + } +} + +bool QtMaterialTextField::hasLabel() const +{ + Q_D(const QtMaterialTextField); + + return d->showLabel; +} + +void QtMaterialTextField::setLabelFontSize(qreal size) +{ + Q_D(QtMaterialTextField); + + d->labelFontSize = size; + + if (d->label) + { + QFont font(d->label->font()); + font.setPointSizeF(size); + d->label->setFont(font); + d->label->update(); + } +} + +qreal QtMaterialTextField::labelFontSize() const +{ + Q_D(const QtMaterialTextField); + + return d->labelFontSize; +} + +void QtMaterialTextField::setLabel(const QString &label) +{ + Q_D(QtMaterialTextField); + + d->labelString = label; + setShowLabel(true); + d->label->update(); +} + +QString QtMaterialTextField::label() const +{ + Q_D(const QtMaterialTextField); + + return d->labelString; +} + +void QtMaterialTextField::setTextColor(const QColor &color) +{ + Q_D(QtMaterialTextField); + + d->textColor = color; + setStyleSheet(QString("QLineEdit { color: %1; }").arg(color.name())); + + MATERIAL_DISABLE_THEME_COLORS + d->stateMachine->setupProperties(); +} + +QColor QtMaterialTextField::textColor() const +{ + Q_D(const QtMaterialTextField); + + if (d->useThemeColors || !d->textColor.isValid()) { + return QtMaterialStyle::instance().themeColor("text"); + } else { + return d->textColor; + } +} + +void QtMaterialTextField::setLabelColor(const QColor &color) +{ + Q_D(QtMaterialTextField); + + d->labelColor = color; + + MATERIAL_DISABLE_THEME_COLORS + d->stateMachine->setupProperties(); +} + +QColor QtMaterialTextField::labelColor() const +{ + Q_D(const QtMaterialTextField); + + if (d->useThemeColors || !d->labelColor.isValid()) { + return QtMaterialStyle::instance().themeColor("accent3"); + } else { + return d->labelColor; + } +} + +void QtMaterialTextField::setInkColor(const QColor &color) +{ + Q_D(QtMaterialTextField); + + d->inkColor = color; + + MATERIAL_DISABLE_THEME_COLORS + d->stateMachine->setupProperties(); +} + +QColor QtMaterialTextField::inkColor() const +{ + Q_D(const QtMaterialTextField); + + if (d->useThemeColors || !d->inkColor.isValid()) { + return QtMaterialStyle::instance().themeColor("primary1"); + } else { + return d->inkColor; + } +} + +void QtMaterialTextField::setUnderlineColor(const QColor &color) +{ + Q_D(QtMaterialTextField); + + d->underlineColor = color; + + MATERIAL_DISABLE_THEME_COLORS + d->stateMachine->setupProperties(); +} + +QColor QtMaterialTextField::underlineColor() const +{ + Q_D(const QtMaterialTextField); + + if (d->useThemeColors || !d->underlineColor.isValid()) { + return QtMaterialStyle::instance().themeColor("border"); + } else { + return d->underlineColor; + } +} + +/*! + * \reimp + */ +bool QtMaterialTextField::event(QEvent *event) +{ + Q_D(QtMaterialTextField); + + switch (event->type()) + { + case QEvent::Resize: + case QEvent::Move: { + if (d->label) { + d->label->setGeometry(rect()); + } + } + default: + break; + } + return QLineEdit::event(event); +} + +/*! + * \reimp + */ +void QtMaterialTextField::paintEvent(QPaintEvent *event) +{ + Q_D(QtMaterialTextField); + + QLineEdit::paintEvent(event); + + QPainter painter(this); + + const qreal progress = d->stateMachine->progress(); + + if (text().isEmpty() && progress < 1) + { + painter.setOpacity(1-progress); + painter.fillRect(rect(), parentWidget()->palette().color(backgroundRole())); + } + + const int y = height()-1; + const int wd = width()-5; + + QPen pen; + pen.setWidth(1); + pen.setColor(underlineColor()); + painter.setPen(pen); + painter.setOpacity(1); + painter.drawLine(2.5, y, wd, y); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor(inkColor()); + + if (progress > 0) + { + painter.setPen(Qt::NoPen); + painter.setBrush(brush); + const int w = (1-progress)*static_cast(wd/2); + painter.drawRect(w+2.5, height()-2, wd-w*2, 2); + } +} diff --git a/components/qtmaterialtextfield.h b/components/qtmaterialtextfield.h new file mode 100644 index 0000000..81f740b --- /dev/null +++ b/components/qtmaterialtextfield.h @@ -0,0 +1,56 @@ +#ifndef QTMATERIALTEXTFIELD_H +#define QTMATERIALTEXTFIELD_H + +#include +#include + +class QtMaterialTextFieldPrivate; + +class QtMaterialTextField : public QLineEdit +{ + Q_OBJECT + + Q_PROPERTY(QColor textColor WRITE setTextColor READ textColor) + Q_PROPERTY(QColor inkColor WRITE setInkColor READ inkColor) + Q_PROPERTY(QColor underlineColor WRITE setUnderlineColor READ underlineColor) + +public: + explicit QtMaterialTextField(QWidget *parent = 0); + ~QtMaterialTextField(); + + void setUseThemeColors(bool value); + bool useThemeColors() const; + + void setShowLabel(bool value); + bool hasLabel() const; + + void setLabelFontSize(qreal size); + qreal labelFontSize() const; + + void setLabel(const QString &label); + QString label() const; + + void setTextColor(const QColor &color); + QColor textColor() const; + + void setLabelColor(const QColor &color); + QColor labelColor() const; + + void setInkColor(const QColor &color); + QColor inkColor() const; + + void setUnderlineColor(const QColor &color); + QColor underlineColor() const; + +protected: + bool event(QEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + + const QScopedPointer d_ptr; + +private: + Q_DISABLE_COPY(QtMaterialTextField) + Q_DECLARE_PRIVATE(QtMaterialTextField) +}; + +#endif // QTMATERIALTEXTFIELD_H diff --git a/components/qtmaterialtextfield_internal.cpp b/components/qtmaterialtextfield_internal.cpp new file mode 100644 index 0000000..156acc9 --- /dev/null +++ b/components/qtmaterialtextfield_internal.cpp @@ -0,0 +1,166 @@ +#include "qtmaterialtextfield_internal.h" +#include +#include +#include +#include +#include "qtmaterialtextfield.h" + +/*! + * \class QtMaterialTextFieldStateMachine + * \internal + */ + +QtMaterialTextFieldStateMachine::QtMaterialTextFieldStateMachine(QtMaterialTextField *parent) + : QStateMachine(parent), + m_textField(parent), + m_normalState(new QState), + m_focusedState(new QState), + m_label(0), + m_offsetAnimation(0), + m_colorAnimation(0), + m_progress(0.0) +{ + Q_ASSERT(parent); + + addState(m_normalState); + addState(m_focusedState); + + setInitialState(m_normalState); + + QEventTransition *transition; + QPropertyAnimation *animation; + + transition = new QEventTransition(parent, QEvent::FocusIn); + transition->setTargetState(m_focusedState); + m_normalState->addTransition(transition); + + animation = new QPropertyAnimation(this, "progress", this); + animation->setEasingCurve(QEasingCurve::InCubic); + animation->setDuration(310); + transition->addAnimation(animation); + + transition = new QEventTransition(parent, QEvent::FocusOut); + transition->setTargetState(m_normalState); + m_focusedState->addTransition(transition); + + animation = new QPropertyAnimation(this, "progress", this); + animation->setEasingCurve(QEasingCurve::OutCubic); + animation->setDuration(310); + transition->addAnimation(animation); + + m_normalState->assignProperty(this, "progress", 0); + m_focusedState->assignProperty(this, "progress", 1); + + setupProperties(); + + connect(m_textField, SIGNAL(textChanged(QString)), this, SLOT(setupProperties())); +} + +QtMaterialTextFieldStateMachine::~QtMaterialTextFieldStateMachine() +{ +} + +void QtMaterialTextFieldStateMachine::setLabel(QtMaterialTextFieldLabel *label) +{ + if (m_label) { + delete m_label; + } + + if (m_offsetAnimation) { + removeDefaultAnimation(m_offsetAnimation); + delete m_offsetAnimation; + } + + if (m_colorAnimation) { + removeDefaultAnimation(m_colorAnimation); + delete m_colorAnimation; + } + + m_label = label; + + if (m_label) + { + m_offsetAnimation = new QPropertyAnimation(m_label, "offset", this); + m_offsetAnimation->setDuration(210); + m_offsetAnimation->setEasingCurve(QEasingCurve::OutCubic); + addDefaultAnimation(m_offsetAnimation); + + m_colorAnimation = new QPropertyAnimation(m_label, "color", this); + m_colorAnimation->setDuration(210); + addDefaultAnimation(m_colorAnimation); + } + + setupProperties(); +} + +void QtMaterialTextFieldStateMachine::setupProperties() +{ + if (m_label) + { + const int m = m_textField->textMargins().top(); + + if (m_textField->text().isEmpty()) { + m_normalState->assignProperty(m_label, "offset", QPointF(0, 26)); + } else { + m_normalState->assignProperty(m_label, "offset", QPointF(0, 0-m)); + } + + m_focusedState->assignProperty(m_label, "offset", QPointF(0, 0-m)); + m_focusedState->assignProperty(m_label, "color", m_textField->inkColor()); + m_normalState->assignProperty(m_label, "color", m_textField->labelColor()); + + if (0 != m_label->offset().y() && !m_textField->text().isEmpty()) { + m_label->setOffset(QPointF(0, 0-m)); + } else if (!m_textField->hasFocus() && m_label->offset().y() <= 0 && m_textField->text().isEmpty()) { + m_label->setOffset(QPointF(0, 26)); + } + } + + m_textField->update(); +} + +/*! + * \class QtMaterialTextFieldLabel + * \internal + */ + +QtMaterialTextFieldLabel::QtMaterialTextFieldLabel(QtMaterialTextField *parent) + : QWidget(parent), + m_textField(parent), + m_scale(1), + m_posX(0), + m_posY(26), + m_color(parent->labelColor()) +{ + Q_ASSERT(parent); + + QFontDatabase db; + QFont font(db.font("Roboto", "Medium", parent->labelFontSize())); + font.setLetterSpacing(QFont::PercentageSpacing, 102); + setFont(font); +} + +QtMaterialTextFieldLabel::~QtMaterialTextFieldLabel() +{ +} + +/*! + * \reimp + */ +void QtMaterialTextFieldLabel::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event) + + if (!m_textField->hasLabel()) { + return; + } + + QPainter painter(this); + painter.setRenderHint(QPainter::Antialiasing); + painter.scale(m_scale, m_scale); + painter.setPen(m_color); + painter.setOpacity(1); + + QPointF pos(2+m_posX, height()-36+m_posY); + painter.drawText(pos.x(), pos.y(), m_textField->label()); +} diff --git a/components/qtmaterialtextfield_internal.h b/components/qtmaterialtextfield_internal.h new file mode 100644 index 0000000..e510287 --- /dev/null +++ b/components/qtmaterialtextfield_internal.h @@ -0,0 +1,120 @@ +#ifndef QTMATERIALTEXTFIELD_INTERNAL_H +#define QTMATERIALTEXTFIELD_INTERNAL_H + +#include +#include +#include "qtmaterialtextfield.h" + +class QPropertyAnimation; +class QtMaterialTextFieldLabel; + +class QtMaterialTextFieldStateMachine : public QStateMachine +{ + Q_OBJECT + + Q_PROPERTY(qreal progress WRITE setProgress READ progress) + +public: + QtMaterialTextFieldStateMachine(QtMaterialTextField *parent); + ~QtMaterialTextFieldStateMachine(); + + void setLabel(QtMaterialTextFieldLabel *label); + + inline void setProgress(qreal progress); + inline qreal progress() const; + +public slots: + void setupProperties(); + +private: + Q_DISABLE_COPY(QtMaterialTextFieldStateMachine) + + QtMaterialTextField *const m_textField; + QState *const m_normalState; + QState *const m_focusedState; + QtMaterialTextFieldLabel *m_label; + QPropertyAnimation *m_offsetAnimation; + QPropertyAnimation *m_colorAnimation; + qreal m_progress; +}; + +inline void QtMaterialTextFieldStateMachine::setProgress(qreal progress) +{ + m_progress = progress; + m_textField->update(); +} + +inline qreal QtMaterialTextFieldStateMachine::progress() const +{ + return m_progress; +} + +class QtMaterialTextFieldLabel : public QWidget +{ + Q_OBJECT + + Q_PROPERTY(qreal scale WRITE setScale READ scale) + Q_PROPERTY(QPointF offset WRITE setOffset READ offset) + Q_PROPERTY(QColor color WRITE setColor READ color) + +public: + QtMaterialTextFieldLabel(QtMaterialTextField *parent); + ~QtMaterialTextFieldLabel(); + + inline void setScale(qreal scale); + inline qreal scale() const; + + inline void setOffset(const QPointF &pos); + inline QPointF offset() const; + + inline void setColor(const QColor &color); + inline QColor color() const; + +protected: + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + +private: + Q_DISABLE_COPY(QtMaterialTextFieldLabel) + + QtMaterialTextField *const m_textField; + qreal m_scale; + qreal m_posX; + qreal m_posY; + QColor m_color; +}; + +inline void QtMaterialTextFieldLabel::setScale(qreal scale) +{ + m_scale = scale; + update(); +} + +inline qreal QtMaterialTextFieldLabel::scale() const +{ + return m_scale; +} + +inline void QtMaterialTextFieldLabel::setOffset(const QPointF &pos) +{ + m_posX = pos.x(); + m_posY = pos.y(); + update(); +} + +inline QPointF QtMaterialTextFieldLabel::offset() const +{ + return QPointF(m_posX, m_posY); +} + +inline void QtMaterialTextFieldLabel::setColor(const QColor &color) +{ + m_color = color; + update(); +} + +inline QColor QtMaterialTextFieldLabel::color() const +{ + return m_color; +} + +#endif // QTMATERIALTEXTFIELD_INTERNAL_H diff --git a/components/qtmaterialtextfield_p.h b/components/qtmaterialtextfield_p.h new file mode 100644 index 0000000..ad4db28 --- /dev/null +++ b/components/qtmaterialtextfield_p.h @@ -0,0 +1,35 @@ +#ifndef QTMATERIALTEXTFIELD_P_H +#define QTMATERIALTEXTFIELD_P_H + +#include +#include + +class QtMaterialTextField; +class QtMaterialTextFieldStateMachine; +class QtMaterialTextFieldLabel; + +class QtMaterialTextFieldPrivate +{ + Q_DISABLE_COPY(QtMaterialTextFieldPrivate) + Q_DECLARE_PUBLIC(QtMaterialTextField) + +public: + QtMaterialTextFieldPrivate(QtMaterialTextField *q); + ~QtMaterialTextFieldPrivate(); + + void init(); + + QtMaterialTextField *const q_ptr; + QtMaterialTextFieldStateMachine *stateMachine; + QtMaterialTextFieldLabel *label; + QColor textColor; + QColor labelColor; + QColor inkColor; + QColor underlineColor; + QString labelString; + qreal labelFontSize; + bool showLabel; + bool useThemeColors; +}; + +#endif // QTMATERIALTEXTFIELD_P_H diff --git a/examples/examples.pro b/examples/examples.pro index 00daeb7..4d01767 100644 --- a/examples/examples.pro +++ b/examples/examples.pro @@ -14,7 +14,8 @@ SOURCES = mainwindow.cpp \ slidersettingseditor.cpp \ ../components/qtmaterialradiobutton.cpp \ radiobuttonsettingseditor.cpp \ - togglesettingseditor.cpp + togglesettingseditor.cpp \ + textfieldsettingseditor.cpp HEADERS = mainwindow.h \ avatarsettingseditor.h \ badgesettingseditor.h \ @@ -29,7 +30,8 @@ HEADERS = mainwindow.h \ ../components/qtmaterialradiobutton_p.h \ ../components/qtmaterialradiobutton.h \ radiobuttonsettingseditor.h \ - togglesettingseditor.h + togglesettingseditor.h \ + textfieldsettingseditor.h LIBS += ../components/libcomponents.a INCLUDEPATH += ../components/ TARGET = ../examples-exe @@ -48,4 +50,5 @@ FORMS += \ circularprogresssettingsform.ui \ slidersettingsform.ui \ radiobuttonsettingsform.ui \ - togglesettingsform.ui + togglesettingsform.ui \ + textfieldsettingsform.ui diff --git a/examples/mainwindow.cpp b/examples/mainwindow.cpp index 78baccc..fd4208d 100644 --- a/examples/mainwindow.cpp +++ b/examples/mainwindow.cpp @@ -14,6 +14,7 @@ #include "slidersettingseditor.h" #include "radiobuttonsettingseditor.h" #include "togglesettingseditor.h" +#include "textfieldsettingseditor.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -45,6 +46,7 @@ MainWindow::MainWindow(QWidget *parent) SliderSettingsEditor *slider = new SliderSettingsEditor; RadioButtonSettingsEditor *radioButton = new RadioButtonSettingsEditor; ToggleSettingsEditor *toggle = new ToggleSettingsEditor; + TextFieldSettingsEditor *textField = new TextFieldSettingsEditor; stack->addWidget(avatar); stack->addWidget(badge); @@ -57,6 +59,7 @@ MainWindow::MainWindow(QWidget *parent) stack->addWidget(radioButton); stack->addWidget(raisedButton); stack->addWidget(slider); + stack->addWidget(textField); stack->addWidget(toggle); list->addItem("Avatar"); @@ -70,6 +73,7 @@ MainWindow::MainWindow(QWidget *parent) list->addItem("Radio Button"); list->addItem("Raised Button"); list->addItem("Slider"); + list->addItem("Text Field"); list->addItem("Toggle"); list->setCurrentRow(0); diff --git a/examples/textfieldsettingseditor.cpp b/examples/textfieldsettingseditor.cpp new file mode 100644 index 0000000..3f2fe5f --- /dev/null +++ b/examples/textfieldsettingseditor.cpp @@ -0,0 +1,94 @@ +#include "textfieldsettingseditor.h" +#include +#include +#include "qtmaterialtextfield.h" + +TextFieldSettingsEditor::TextFieldSettingsEditor(QWidget *parent) + : QWidget(parent), + ui(new Ui::TextFieldSettingsForm), + m_textField(new QtMaterialTextField) +{ + QVBoxLayout *layout = new QVBoxLayout; + setLayout(layout); + + QWidget *widget = new QWidget; + layout->addWidget(widget); + + QWidget *canvas = new QWidget; + canvas->setStyleSheet("QWidget { background: white; }"); + layout->addWidget(canvas); + + ui->setupUi(widget); + layout->setContentsMargins(20, 20, 20, 20); + + layout = new QVBoxLayout; + canvas->setLayout(layout); + layout->addWidget(m_textField); + layout->setAlignment(m_textField, Qt::AlignCenter); + + m_textField->setLabel("Wat is this"); + m_textField->setMinimumWidth(250); + + setupForm(); + + connect(ui->disabledCheckBox, SIGNAL(toggled(bool)), this, SLOT(updateWidget())); + connect(ui->textLineEdit, SIGNAL(textChanged(QString)), this, SLOT(updateWidget())); + connect(ui->placeholderLineEdit, SIGNAL(textChanged(QString)), this, SLOT(updateWidget())); + connect(ui->labelCheckBox, SIGNAL(toggled(bool)), this, SLOT(updateWidget())); + connect(ui->labelTextLineEdit, SIGNAL(textChanged(QString)), this, SLOT(updateWidget())); + connect(ui->useThemeColorsCheckBox, SIGNAL(toggled(bool)), this, SLOT(updateWidget())); + connect(ui->textColorToolButton, SIGNAL(pressed()), this, SLOT(selectColor())); + connect(ui->inkColorToolButton, SIGNAL(pressed()), this, SLOT(selectColor())); + connect(ui->underlineColorToolButton, SIGNAL(pressed()), this, SLOT(selectColor())); + connect(ui->labelColorToolButton, SIGNAL(pressed()), this, SLOT(selectColor())); + + connect(m_textField, SIGNAL(textChanged(QString)), this, SLOT(setupForm())); +} + +TextFieldSettingsEditor::~TextFieldSettingsEditor() +{ + delete ui; +} + +void TextFieldSettingsEditor::setupForm() +{ + ui->disabledCheckBox->setChecked(!m_textField->isEnabled()); + ui->textLineEdit->setText(m_textField->text()); + ui->placeholderLineEdit->setText(m_textField->placeholderText()); + ui->labelCheckBox->setChecked(m_textField->hasLabel()); + ui->labelTextLineEdit->setText(m_textField->label()); + ui->useThemeColorsCheckBox->setChecked(m_textField->useThemeColors()); +} + +void TextFieldSettingsEditor::updateWidget() +{ + m_textField->setDisabled(ui->disabledCheckBox->isChecked()); + m_textField->setText(ui->textLineEdit->text()); + m_textField->setPlaceholderText(ui->placeholderLineEdit->text()); + m_textField->setLabel(ui->labelTextLineEdit->text()); + m_textField->setShowLabel(ui->labelCheckBox->isChecked()); + m_textField->setUseThemeColors(ui->useThemeColorsCheckBox->isChecked()); +} + +void TextFieldSettingsEditor::selectColor() +{ + QColorDialog dialog; + if (dialog.exec()) { + QColor color = dialog.selectedColor(); + QString senderName = sender()->objectName(); + if ("textColorToolButton" == senderName) { + m_textField->setTextColor(color); + ui->textColorLineEdit->setText(color.name(QColor::HexRgb)); + } else if ("inkColorToolButton" == senderName) { + m_textField->setInkColor(color); + ui->inkColorLineEdit->setText(color.name(QColor::HexRgb)); + } else if ("underlineColorToolButton" == senderName) { + m_textField->setUnderlineColor(color); + ui->underlineColorLineEdit->setText(color.name(QColor::HexRgb)); + } else if ("labelColorToolButton" == senderName) { + m_textField->setLabelColor(color); + ui->labelColorLineEdit->setText(color.name(QColor::HexRgb)); + } + } + setupForm(); +} diff --git a/examples/textfieldsettingseditor.h b/examples/textfieldsettingseditor.h new file mode 100644 index 0000000..21c69f5 --- /dev/null +++ b/examples/textfieldsettingseditor.h @@ -0,0 +1,27 @@ +#ifndef TEXTFIELDSETTINGSEDITOR_H +#define TEXTFIELDSETTINGSEDITOR_H + +#include +#include "ui_textfieldsettingsform.h" + +class QtMaterialTextField; + +class TextFieldSettingsEditor : public QWidget +{ + Q_OBJECT + +public: + explicit TextFieldSettingsEditor(QWidget *parent = 0); + ~TextFieldSettingsEditor(); + +protected slots: + void setupForm(); + void updateWidget(); + void selectColor(); + +private: + Ui::TextFieldSettingsForm *const ui; + QtMaterialTextField *const m_textField; +}; + +#endif // TEXTFIELDSETTINGSEDITOR_H diff --git a/examples/textfieldsettingsform.ui b/examples/textfieldsettingsform.ui new file mode 100644 index 0000000..106c58c --- /dev/null +++ b/examples/textfieldsettingsform.ui @@ -0,0 +1,175 @@ + + + TextFieldSettingsForm + + + + 0 + 0 + 400 + 416 + + + + Form + + + + + 0 + 0 + 321 + 351 + + + + + + + Disabled + + + + + + + + + + Text + + + + + + + + + + Placeholder + + + + + + + + + + Label + + + + + + + + + + Label text + + + + + + + + + + Use theme colors + + + + + + + + + + Text color + + + + + + + + + + + + ... + + + + + + + + + Ink color + + + + + + + + + + + + ... + + + + + + + + + Underline color + + + + + + + + + + + + ... + + + + + + + + + Label color + + + + + + + + + + + + ... + + + + + + + + + + +