Rework adding time by wheel
Also add ability to change time by arrow keys.
This commit is contained in:
parent
004648c1d1
commit
4077187b03
1 changed files with 30 additions and 7 deletions
|
|
@ -82,7 +82,7 @@ public:
|
||||||
using MaskedInputField::MaskedInputField;
|
using MaskedInputField::MaskedInputField;
|
||||||
|
|
||||||
void setMaxValue(int value);
|
void setMaxValue(int value);
|
||||||
void setWheelStep(int value);
|
void setWheelStep(int value, int ctrlValue, int shiftValue);
|
||||||
|
|
||||||
rpl::producer<> erasePrevious() const;
|
rpl::producer<> erasePrevious() const;
|
||||||
rpl::producer<QChar> putNext() const;
|
rpl::producer<QChar> putNext() const;
|
||||||
|
|
@ -106,6 +106,8 @@ private:
|
||||||
int _maxValue = 0;
|
int _maxValue = 0;
|
||||||
int _maxDigits = 0;
|
int _maxDigits = 0;
|
||||||
int _wheelStep = 0;
|
int _wheelStep = 0;
|
||||||
|
int _wheelStepCtrl = 0;
|
||||||
|
int _wheelStepShift = 0;
|
||||||
rpl::event_stream<> _erasePrevious;
|
rpl::event_stream<> _erasePrevious;
|
||||||
rpl::event_stream<QChar> _putNext;
|
rpl::event_stream<QChar> _putNext;
|
||||||
|
|
||||||
|
|
@ -214,8 +216,10 @@ void TimePart::setMaxValue(int value) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimePart::setWheelStep(int value) {
|
void TimePart::setWheelStep(int value, int ctrlValue, int shiftValue) {
|
||||||
_wheelStep = value;
|
_wheelStep = value;
|
||||||
|
_wheelStepCtrl = ctrlValue;
|
||||||
|
_wheelStepShift = shiftValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
rpl::producer<> TimePart::erasePrevious() const {
|
rpl::producer<> TimePart::erasePrevious() const {
|
||||||
|
|
@ -263,7 +267,16 @@ bool TimePart::remove(int value) {
|
||||||
void TimePart::keyPressEvent(QKeyEvent *e) {
|
void TimePart::keyPressEvent(QKeyEvent *e) {
|
||||||
const auto isBackspace = (e->key() == Qt::Key_Backspace);
|
const auto isBackspace = (e->key() == Qt::Key_Backspace);
|
||||||
const auto isBeginning = (cursorPosition() == 0);
|
const auto isBeginning = (cursorPosition() == 0);
|
||||||
if (isBackspace && isBeginning && !hasSelectedText()) {
|
const auto step = (e->modifiers().testFlag(Qt::ShiftModifier))
|
||||||
|
? _wheelStepShift
|
||||||
|
: (e->modifiers().testFlag(Qt::ControlModifier))
|
||||||
|
? _wheelStepCtrl
|
||||||
|
: _wheelStep;
|
||||||
|
if (e->key() == Qt::Key_Up) {
|
||||||
|
add(step);
|
||||||
|
} else if (e->key() == Qt::Key_Down) {
|
||||||
|
remove(step);
|
||||||
|
} else if (isBackspace && isBeginning && !hasSelectedText()) {
|
||||||
_erasePrevious.fire({});
|
_erasePrevious.fire({});
|
||||||
} else {
|
} else {
|
||||||
MaskedInputField::keyPressEvent(e);
|
MaskedInputField::keyPressEvent(e);
|
||||||
|
|
@ -272,7 +285,12 @@ void TimePart::keyPressEvent(QKeyEvent *e) {
|
||||||
|
|
||||||
void TimePart::wheelEvent(QWheelEvent *e) {
|
void TimePart::wheelEvent(QWheelEvent *e) {
|
||||||
const auto direction = ProcessWheelEvent(e);
|
const auto direction = ProcessWheelEvent(e);
|
||||||
add(direction * _wheelStep);
|
const auto step = (e->modifiers().testFlag(Qt::ShiftModifier))
|
||||||
|
? _wheelStepShift
|
||||||
|
: (e->modifiers().testFlag(Qt::ControlModifier))
|
||||||
|
? _wheelStepCtrl
|
||||||
|
: _wheelStep;
|
||||||
|
add(direction * step);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TimePart::correctValue(
|
void TimePart::correctValue(
|
||||||
|
|
@ -366,7 +384,7 @@ TimeInput::TimeInput(QWidget *parent, const QString &value)
|
||||||
connect(_hour, &Ui::MaskedInputField::changed, changed);
|
connect(_hour, &Ui::MaskedInputField::changed, changed);
|
||||||
connect(_minute, &Ui::MaskedInputField::changed, changed);
|
connect(_minute, &Ui::MaskedInputField::changed, changed);
|
||||||
_hour->setMaxValue(23);
|
_hour->setMaxValue(23);
|
||||||
_hour->setWheelStep(1);
|
_hour->setWheelStep(1, 5, 12);
|
||||||
_hour->putNext() | rpl::start_with_next([=](QChar ch) {
|
_hour->putNext() | rpl::start_with_next([=](QChar ch) {
|
||||||
putNext(_minute, ch);
|
putNext(_minute, ch);
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
@ -378,7 +396,7 @@ TimeInput::TimeInput(QWidget *parent, const QString &value)
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
_minute->setMaxValue(59);
|
_minute->setMaxValue(59);
|
||||||
_minute->setWheelStep(10);
|
_minute->setWheelStep(1, 10, 30);
|
||||||
_minute->erasePrevious() | rpl::start_with_next([=] {
|
_minute->erasePrevious() | rpl::start_with_next([=] {
|
||||||
erasePrevious(_hour);
|
erasePrevious(_hour);
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
@ -699,11 +717,16 @@ void ScheduleBox(
|
||||||
base::install_event_filter(dayViewport, [=](not_null<QEvent*> event) {
|
base::install_event_filter(dayViewport, [=](not_null<QEvent*> event) {
|
||||||
if (event->type() == QEvent::Wheel) {
|
if (event->type() == QEvent::Wheel) {
|
||||||
const auto e = static_cast<QWheelEvent*>(event.get());
|
const auto e = static_cast<QWheelEvent*>(event.get());
|
||||||
|
const auto step = (e->modifiers().testFlag(Qt::ShiftModifier))
|
||||||
|
? 14
|
||||||
|
: (e->modifiers().testFlag(Qt::ControlModifier))
|
||||||
|
? 7
|
||||||
|
: 1;
|
||||||
const auto direction = ProcessWheelEvent(e);
|
const auto direction = ProcessWheelEvent(e);
|
||||||
if (!direction) {
|
if (!direction) {
|
||||||
return base::EventFilterResult::Continue;
|
return base::EventFilterResult::Continue;
|
||||||
}
|
}
|
||||||
const auto d = date->current().addDays(direction);
|
const auto d = date->current().addDays(direction * step);
|
||||||
*date = std::clamp(d, minDate, maxDate);
|
*date = std::clamp(d, minDate, maxDate);
|
||||||
return base::EventFilterResult::Cancel;
|
return base::EventFilterResult::Cancel;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue