reservetimepopup.cpp 3.69 KB
#include "reservetimepopup.h"
#include "ui_reservetimepopup.h"

#include <QDateTime>
#include <QKeyEvent>
#include <QDebug>

#include "reservedtimepopup.h"
#include "formatterspinbox.h"

ReserveTimePopup::ReserveTimePopup(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::ReserveTimePopup)
{
    ui->setupUi(this);

    setAttribute(Qt::WA_DeleteOnClose);

    QDateTime dt = QDateTime::currentDateTime();
    ui->month->setValue(dt.date().month());
    ui->day->setValue(dt.date().day());
    ui->hour->setValue(dt.time().hour());
    ui->min->setValue(dt.time().minute());

    connect(ui->keyboard, SIGNAL(onOkKeyClicked()), ui->keyboard, SLOT(focusOutKeyboard()));
    connect(ui->keyboard, SIGNAL(onCancelKeyClicked()), ui->keyboard, SLOT(focusOutKeyboard()));
    connect(ui->keyboard, SIGNAL(onCancelKeyClicked()), SLOT(revert()));

    foreach (FormatterSpinBox *b, findChildren<FormatterSpinBox *>())
        b->installEventFilter(this);

    ui->min->setFocus();
    ui->min->selectAll();
}

ReserveTimePopup::~ReserveTimePopup()
{
    delete ui;
}

bool ReserveTimePopup::eventFilter(QObject *watched, QEvent *event)
{
    FormatterSpinBox *e = qobject_cast<FormatterSpinBox *>(watched);
    if (e)
    {
        switch (event->type())
        {
        case QEvent::FocusIn:
            lastValue = e->value();
            break;
        default:
            break;
        }
    }

    return false;
}

void ReserveTimePopup::keyPressEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case 0x01000032:    // Turn left
        onEncoderLeft();
        break;
    case 0x01000031:    // Push
        pushed = focusWidget();
        break;
    case 0x01000030:    // Turn right
        onEncoderRight();
        break;
    }
}

void ReserveTimePopup::keyReleaseEvent(QKeyEvent *event)
{
    switch (event->key())
    {
    case 0x01000032:    // Turn left
        onEncoderLeft();
        break;
    case 0x01000031:    // Push
        if (focusWidget() == pushed)
            onEncoderClicked(pushed);

        pushed = NULL;
        break;
    case 0x01000030:    // Turn right
        onEncoderRight();
        break;
    }
}

void ReserveTimePopup::revert()
{
    FormatterSpinBox *b = qobject_cast<FormatterSpinBox *>(focusWidget());
    if (b)
        b->setValue(lastValue);

    qDebug() << lastValue;
}

void ReserveTimePopup::on_okButton_clicked()
{
    QDateTime current = QDateTime::currentDateTime();
    QDateTime target;
    target.setDate(QDate(current.date().year(), ui->month->value(), ui->day->value()));
    target.setTime(QTime(ui->hour->value(), ui->min->value()));

    if (current >= target)
        target = target.addYears(1);

    ReservedTimePopup *p = new ReservedTimePopup(parentWidget(), target);
    connect(p, SIGNAL(timeout()), SIGNAL(timeout()));
    connect(p, SIGNAL(canceled()), SIGNAL(canceled()));
    connect(p, SIGNAL(destroyed(QObject*)), SLOT(deleteLater()));
    p->showFullScreen();

    hide();
}

void ReserveTimePopup::on_cancelButton_clicked()
{
    emit canceled();
    close();
}

void ReserveTimePopup::onEncoderLeft()
{
    if (focusWidget() == ui->month)
        ui->cancelButton->setFocus();
    else
        focusPreviousChild();
}

void ReserveTimePopup::onEncoderRight()
{
    if (focusWidget() == ui->cancelButton)
    {
        ui->month->setFocus();
        ui->month->selectAll();
    }
    else
        focusNextChild();
}

void ReserveTimePopup::onEncoderClicked(QWidget *clicked)
{
    QPushButton *b = qobject_cast<QPushButton *>(clicked);
    if (b)
        b->click();
    else
    {
        FormatterSpinBox *e = qobject_cast<FormatterSpinBox *>(clicked);
        if (e)
        {
            qDebug() << "focusinkeyboard";
            ui->keyboard->focusInKeyboard();
        }
    }
}