diff --git a/.gitignore b/.gitignore index c1b62a8..4b6e591 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pro.user *.pro.user.* +*.svg diff --git a/components/avatar.cpp b/components/avatar.cpp new file mode 100644 index 0000000..495bcf4 --- /dev/null +++ b/components/avatar.cpp @@ -0,0 +1,42 @@ +#include +#include +#include "avatar.h" + +Avatar::Avatar(QWidget *parent) + : QWidget(parent) +{ +} + +Avatar::~Avatar() +{ +} + +void Avatar::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); +} + +void Avatar::mouseReleaseEvent(QMouseEvent *event) +{ + QWidget::mouseReleaseEvent(event); +} + +void Avatar::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + + painter.drawRect(rect().adjusted(0, 0, -1, -1)); + + painter.setRenderHint(QPainter::Antialiasing); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + + painter.setPen(Qt::NoPen); + painter.setBrush(brush); + + QRect r = rect(); + painter.drawEllipse(r.center(), 20, 20); + + QWidget::paintEvent(event); +} diff --git a/components/avatar.h b/components/avatar.h new file mode 100644 index 0000000..1ce6fbb --- /dev/null +++ b/components/avatar.h @@ -0,0 +1,20 @@ +#ifndef AVATAR_H +#define AVATAR_H + +#include + +class Avatar : public QWidget +{ + Q_OBJECT + +public: + explicit Avatar(QWidget *parent = 0); + ~Avatar(); + +protected: + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; +}; + +#endif // AVATAR_H diff --git a/components/checkbox.cpp b/components/checkbox.cpp index a66497e..e53f870 100644 --- a/components/checkbox.cpp +++ b/components/checkbox.cpp @@ -1 +1,31 @@ +#include +#include #include "checkbox.h" + +Checkbox::Checkbox(QWidget *parent) + : QWidget(parent) +{ +} + +Checkbox::~Checkbox() +{ +} + +void Checkbox::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); +} + +void Checkbox::mouseReleaseEvent(QMouseEvent *event) +{ + QWidget::mouseReleaseEvent(event); +} + +void Checkbox::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + + painter.drawRect(0, 0, 50, 50); + + QWidget::paintEvent(event); +} diff --git a/components/checkbox.h b/components/checkbox.h index e69de29..540910b 100644 --- a/components/checkbox.h +++ b/components/checkbox.h @@ -0,0 +1,20 @@ +#ifndef CHECKBOX_H +#define CHECKBOX_H + +#include + +class Checkbox : public QWidget +{ + Q_OBJECT + +public: + explicit Checkbox(QWidget *parent = 0); + ~Checkbox(); + +protected: + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; +}; + +#endif // CHECKBOX_H diff --git a/components/list.cpp b/components/list.cpp index 471c2a1..1356242 100644 --- a/components/list.cpp +++ b/components/list.cpp @@ -1 +1,31 @@ +#include +#include #include "list.h" + +List::List(QWidget *parent) + : QWidget(parent) +{ +} + +List::~List() +{ +} + +void List::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); +} + +void List::mouseReleaseEvent(QMouseEvent *event) +{ + QWidget::mouseReleaseEvent(event); +} + +void List::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + + painter.drawRect(50, 250, 50, 50); + + QWidget::paintEvent(event); +} diff --git a/components/list.h b/components/list.h index e69de29..25101b2 100644 --- a/components/list.h +++ b/components/list.h @@ -0,0 +1,20 @@ +#ifndef LIST_H +#define LIST_H + +#include + +class List : public QWidget +{ + Q_OBJECT + +public: + explicit List(QWidget *parent = 0); + ~List(); + +protected: + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; +}; + +#endif // LIST_H diff --git a/components/radiobutton.cpp b/components/radiobutton.cpp index 9ac4161..df5ec8c 100644 --- a/components/radiobutton.cpp +++ b/components/radiobutton.cpp @@ -1 +1,31 @@ +#include +#include #include "radiobutton.h" + +RadioButton::RadioButton(QWidget *parent) + : QWidget(parent) +{ +} + +RadioButton::~RadioButton() +{ +} + +void RadioButton::mousePressEvent(QMouseEvent *event) +{ + QWidget::mousePressEvent(event); +} + +void RadioButton::mouseReleaseEvent(QMouseEvent *event) +{ + QWidget::mouseReleaseEvent(event); +} + +void RadioButton::paintEvent(QPaintEvent *event) +{ + QPainter painter(this); + + painter.drawRect(0, 50, 50, 50); + + QWidget::paintEvent(event); +} diff --git a/components/radiobutton.h b/components/radiobutton.h index e69de29..c5d6d42 100644 --- a/components/radiobutton.h +++ b/components/radiobutton.h @@ -0,0 +1,20 @@ +#ifndef RADIOBUTTON_H +#define RADIOBUTTON_H + +#include + +class RadioButton : public QWidget +{ + Q_OBJECT + +public: + explicit RadioButton(QWidget *parent = 0); + ~RadioButton(); + +protected: + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; +}; + +#endif // RADIOBUTTON_H diff --git a/components/tabs.cpp b/components/tabs.cpp index a5073d8..c2be51e 100644 --- a/components/tabs.cpp +++ b/components/tabs.cpp @@ -75,11 +75,11 @@ void Tabs::updateInkBar() const QRect &r = item->geometry(); const qreal s = 1-_tween; if (QAbstractAnimation::Running != _animation->state()) { - _inkBarGeometry = QRect(r.left(), r.bottom()-3, r.width(), 4); + _inkBarGeometry = QRect(r.left(), r.bottom()-1, r.width(), 2); } else { const qreal left = _previousGeometry.left()*s + r.left()*_tween; const qreal width = _previousGeometry.width()*s + r.width()*_tween; - _inkBarGeometry = QRect(left, r.bottom()-3, width, 4); + _inkBarGeometry = QRect(left, r.bottom()-1, width, 2); } update(); } diff --git a/components/textfield.cpp b/components/textfield.cpp index 5d5bbea..07e59e9 100644 --- a/components/textfield.cpp +++ b/components/textfield.cpp @@ -1 +1,81 @@ +#include +#include +#include +#include #include "textfield.h" +#include "style.h" + +TextField::TextField(QWidget *parent) + : QLineEdit(parent), + _animation(new QPropertyAnimation(this)), + _progress(1) +{ + setStyle(&Style::instance()); + + _animation->setPropertyName("progress"); + _animation->setTargetObject(this); + _animation->setEasingCurve(QEasingCurve::InCubic); + _animation->setDuration(350); + _animation->setStartValue(1); + _animation->setEndValue(0); +} + +TextField::~TextField() +{ +} + +void TextField::setProgress(qreal progress) +{ + if (_progress == progress) + return; + _progress = progress; + + emit progressChanged(progress); + update(); +} + +void TextField::focusInEvent(QFocusEvent *event) +{ + _animation->setDirection(QAbstractAnimation::Forward); + _animation->start(); + + QLineEdit::focusInEvent(event); +} + +void TextField::focusOutEvent(QFocusEvent *event) +{ + _animation->setDirection(QAbstractAnimation::Backward); + _animation->start(); + + QLineEdit::focusOutEvent(event); +} + +void TextField::mousePressEvent(QMouseEvent *event) +{ + QLineEdit::mousePressEvent(event); +} + +void TextField::mouseReleaseEvent(QMouseEvent *event) +{ + QLineEdit::mouseReleaseEvent(event); +} + +void TextField::paintEvent(QPaintEvent *event) +{ + QLineEdit::paintEvent(event); + + QPainter painter(this); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + + if (!qFuzzyCompare(1, _progress)) { + + painter.setPen(Qt::NoPen); + painter.setBrush(brush); + + int w = _progress*static_cast(width()/2); + + painter.drawRect(w, height()-2, width()-w*2, 2); + } +} diff --git a/components/textfield.h b/components/textfield.h index e69de29..72a38f0 100644 --- a/components/textfield.h +++ b/components/textfield.h @@ -0,0 +1,36 @@ +#ifndef TEXTFIELD_H +#define TEXTFIELD_H + +#include + +class QPropertyAnimation; + +class TextField : public QLineEdit +{ + Q_OBJECT + + Q_PROPERTY(qreal progress WRITE setProgress READ progress NOTIFY progressChanged) + +public: + explicit TextField(QWidget *parent = 0); + ~TextField(); + + void setProgress(qreal progress); + inline qreal progress() const { return _progress; } + +signals: + void progressChanged(qreal); + +protected: + void focusInEvent(QFocusEvent *event) Q_DECL_OVERRIDE; + void focusOutEvent(QFocusEvent *event) Q_DECL_OVERRIDE; + void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; + void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; + +private: + QPropertyAnimation *const _animation; + qreal _progress; +}; + +#endif // TEXTFIELD_H diff --git a/examples/avatarexamples.cpp b/examples/avatarexamples.cpp new file mode 100644 index 0000000..91a2c69 --- /dev/null +++ b/examples/avatarexamples.cpp @@ -0,0 +1,30 @@ +#include +#include +#include "avatarexamples.h" +#include "components/avatar.h" +#include "exampleview.h" +#include "frame.h" + +AvatarExamples::AvatarExamples(QWidget *parent) + : ExampleList(parent) +{ + QLayout *layout = widget()->layout(); + + { + Avatar *avatar = new Avatar; + + ExampleView *view = new ExampleView; + view->setWidget(avatar); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } } + +AvatarExamples::~AvatarExamples() +{ +} diff --git a/examples/avatarexamples.h b/examples/avatarexamples.h new file mode 100644 index 0000000..63dfecd --- /dev/null +++ b/examples/avatarexamples.h @@ -0,0 +1,15 @@ +#ifndef AVATAREXAMPLES_H +#define AVATAREXAMPLES_H + +#include "examplelist.h" + +class AvatarExamples : public ExampleList +{ + Q_OBJECT + +public: + explicit AvatarExamples(QWidget *parent = 0); + ~AvatarExamples(); +}; + +#endif // AVATAREXAMPLES_H diff --git a/examples/checkboxexamples.cpp b/examples/checkboxexamples.cpp new file mode 100644 index 0000000..bb7c51a --- /dev/null +++ b/examples/checkboxexamples.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "checkboxexamples.h" +#include "components/checkbox.h" +#include "exampleview.h" +#include "frame.h" + +CheckboxExamples::CheckboxExamples(QWidget *parent) + : ExampleList(parent) +{ + QLayout *layout = widget()->layout(); + + { + Checkbox *checkbox = new Checkbox; + + ExampleView *view = new ExampleView; + view->setWidget(checkbox); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } +} + +CheckboxExamples::~CheckboxExamples() +{ +} diff --git a/examples/checkboxexamples.h b/examples/checkboxexamples.h new file mode 100644 index 0000000..367771d --- /dev/null +++ b/examples/checkboxexamples.h @@ -0,0 +1,15 @@ +#ifndef CHECKBOXEXAMPLES_H +#define CHECKBOXEXAMPLES_H + +#include "examplelist.h" + +class CheckboxExamples : public ExampleList +{ + Q_OBJECT + +public: + explicit CheckboxExamples(QWidget *parent = 0); + ~CheckboxExamples(); +}; + +#endif // CHECKBOXEXAMPLES_H diff --git a/examples/listexamples.cpp b/examples/listexamples.cpp new file mode 100644 index 0000000..58ff66b --- /dev/null +++ b/examples/listexamples.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "listexamples.h" +#include "components/list.h" +#include "exampleview.h" +#include "frame.h" + +ListExamples::ListExamples(QWidget *parent) + : ExampleList(parent) +{ + QLayout *layout = widget()->layout(); + + { + List *list = new List; + + ExampleView *view = new ExampleView; + view->setWidget(list); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } +} + +ListExamples::~ListExamples() +{ +} diff --git a/examples/listexamples.h b/examples/listexamples.h new file mode 100644 index 0000000..7872afa --- /dev/null +++ b/examples/listexamples.h @@ -0,0 +1,15 @@ +#ifndef LISTEXAMPLES_H +#define LISTEXAMPLES_H + +#include "examplelist.h" + +class ListExamples : public ExampleList +{ + Q_OBJECT + +public: + explicit ListExamples(QWidget *parent = 0); + ~ListExamples(); +}; + +#endif // LISTEXAMPLES_H diff --git a/examples/radiobuttonexamples.cpp b/examples/radiobuttonexamples.cpp new file mode 100644 index 0000000..81c5d60 --- /dev/null +++ b/examples/radiobuttonexamples.cpp @@ -0,0 +1,31 @@ +#include +#include +#include "radiobuttonexamples.h" +#include "components/radiobutton.h" +#include "exampleview.h" +#include "frame.h" + +RadioButtonExamples::RadioButtonExamples(QWidget *parent) + : ExampleList(parent) +{ + QLayout *layout = widget()->layout(); + + { + RadioButton *radioButton = new RadioButton; + + ExampleView *view = new ExampleView; + view->setWidget(radioButton); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } +} + +RadioButtonExamples::~RadioButtonExamples() +{ +} diff --git a/examples/radiobuttonexamples.h b/examples/radiobuttonexamples.h new file mode 100644 index 0000000..3991c4c --- /dev/null +++ b/examples/radiobuttonexamples.h @@ -0,0 +1,15 @@ +#ifndef RADIOBUTTONEXAMPLES_H +#define RADIOBUTTONEXAMPLES_H + +#include "examplelist.h" + +class RadioButtonExamples : public ExampleList +{ + Q_OBJECT + +public: + explicit RadioButtonExamples(QWidget *parent = 0); + ~RadioButtonExamples(); +}; + +#endif // RADIOBUTTONEXAMPLES_H diff --git a/examples/textfieldexamples.cpp b/examples/textfieldexamples.cpp new file mode 100644 index 0000000..35c0b08 --- /dev/null +++ b/examples/textfieldexamples.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include "textfieldexamples.h" +#include "components/textfield.h" +#include "exampleview.h" +#include "frame.h" + +TextFieldExamples::TextFieldExamples(QWidget *parent) + : ExampleList(parent) +{ + QLayout *layout = widget()->layout(); + + { + TextField *textField = new TextField; + + ExampleView *view = new ExampleView; + view->setWidget(textField); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } + { + QLineEdit *edit = new QLineEdit; + + ExampleView *view = new ExampleView; + view->setWidget(edit); + + Frame *frame = new Frame; + frame->setCodeSnippet( + "hello" + ); + frame->setWidget(view); + + layout->addWidget(frame); + } +} + +TextFieldExamples::~TextFieldExamples() +{ +} diff --git a/examples/textfieldexamples.h b/examples/textfieldexamples.h new file mode 100644 index 0000000..30eae45 --- /dev/null +++ b/examples/textfieldexamples.h @@ -0,0 +1,15 @@ +#ifndef TEXTFIELDEXAMPLES_H +#define TEXTFIELDEXAMPLES_H + +#include "examplelist.h" + +class TextFieldExamples : public ExampleList +{ + Q_OBJECT + +public: + explicit TextFieldExamples(QWidget *parent = 0); + ~TextFieldExamples(); +}; + +#endif // TEXTFIELDEXAMPLES_H diff --git a/mainwindow.cpp b/mainwindow.cpp index 12e2b67..0d1d2e6 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -12,6 +13,11 @@ #include "examples/tableexamples.h" #include "examples/sliderexamples.h" #include "examples/toggleexamples.h" +#include "examples/radiobuttonexamples.h" +#include "examples/checkboxexamples.h" +#include "examples/textfieldexamples.h" +#include "examples/listexamples.h" +#include "examples/avatarexamples.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -24,6 +30,11 @@ MainWindow::MainWindow(QWidget *parent) _tableExamples(new TableExamples), _sliderExamples(new SliderExamples), _toggleExamples(new ToggleExamples), + _radioButtonExamples(new RadioButtonExamples), + _checkboxExamples(new CheckboxExamples), + _textFieldExamples(new TextFieldExamples), + _listExamples(new ListExamples), + _avatarExamples(new AvatarExamples), _about(new About) { _initWidget(); @@ -53,6 +64,16 @@ void MainWindow::showWidget(QAction *action) _layout->setCurrentWidget(_sliderExamples); } else if ("Toggle" == text) { _layout->setCurrentWidget(_toggleExamples); + } else if ("Radio Button" == text) { + _layout->setCurrentWidget(_radioButtonExamples); + } else if ("Checkbox" == text) { + _layout->setCurrentWidget(_checkboxExamples); + } else if ("Text Field" == text) { + _layout->setCurrentWidget(_textFieldExamples); + } else if ("List" == text) { + _layout->setCurrentWidget(_listExamples); + } else if ("Avatar" == text) { + _layout->setCurrentWidget(_avatarExamples); } else { _layout->setCurrentWidget(_about); } @@ -72,6 +93,11 @@ void MainWindow::_initWidget() _layout->addWidget(_tableExamples); _layout->addWidget(_sliderExamples); _layout->addWidget(_toggleExamples); + _layout->addWidget(_radioButtonExamples); + _layout->addWidget(_checkboxExamples); + _layout->addWidget(_textFieldExamples); + _layout->addWidget(_listExamples); + _layout->addWidget(_avatarExamples); setCentralWidget(widget); } @@ -79,12 +105,16 @@ void MainWindow::_initWidget() void MainWindow::_initMenu() const { QMenu *file = new QMenu("&File"); + + QAction *exitAction = file->addAction("E&xit"); + QMenu *components = new QMenu("&Components"); QMenu *settings = new QMenu("&Settings"); QMenu *examples = new QMenu("&Examples"); QMenu *help = new QMenu("&Help"); components->addAction("App Bar"); + components->addAction("Avatar"); QMenu *buttons = new QMenu("Buttons"); components->addMenu(buttons); @@ -116,4 +146,5 @@ void MainWindow::_initMenu() const menuBar()->addMenu(help); connect(components, SIGNAL(triggered(QAction *)), this, SLOT(showWidget(QAction *))); + connect(exitAction, SIGNAL(triggered(bool)), qApp, SLOT(quit())); } diff --git a/mainwindow.h b/mainwindow.h index db6afc6..e7eab28 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -12,6 +12,11 @@ class TabsExamples; class TableExamples; class SliderExamples; class ToggleExamples; +class RadioButtonExamples; +class CheckboxExamples; +class TextFieldExamples; +class ListExamples; +class AvatarExamples; class QStackedLayout; class MainWindow : public QMainWindow @@ -38,6 +43,11 @@ private: TableExamples *const _tableExamples; SliderExamples *const _sliderExamples; ToggleExamples *const _toggleExamples; + RadioButtonExamples *const _radioButtonExamples; + CheckboxExamples *const _checkboxExamples; + TextFieldExamples *const _textFieldExamples; + ListExamples *const _listExamples; + AvatarExamples *const _avatarExamples; About *const _about; }; diff --git a/qt-material-widgets.pro b/qt-material-widgets.pro index b23e922..fca4fff 100644 --- a/qt-material-widgets.pro +++ b/qt-material-widgets.pro @@ -39,7 +39,13 @@ SOURCES += main.cpp\ examples/raisedbuttonexamples.cpp \ examples/sliderexamples.cpp \ components/toggle.cpp \ - examples/toggleexamples.cpp + examples/toggleexamples.cpp \ + examples/radiobuttonexamples.cpp \ + examples/checkboxexamples.cpp \ + examples/textfieldexamples.cpp \ + examples/listexamples.cpp \ + components/avatar.cpp \ + examples/avatarexamples.cpp HEADERS += mainwindow.h \ style.h \ @@ -72,4 +78,10 @@ HEADERS += mainwindow.h \ examples/raisedbuttonexamples.h \ examples/sliderexamples.h \ components/toggle.h \ - examples/toggleexamples.h + examples/toggleexamples.h \ + examples/radiobuttonexamples.h \ + examples/checkboxexamples.h \ + examples/textfieldexamples.h \ + examples/listexamples.h \ + components/avatar.h \ + examples/avatarexamples.h