-rw-r--r-- | korganizer/ktimeedit.cpp | 106 |
1 files changed, 26 insertions, 80 deletions
diff --git a/korganizer/ktimeedit.cpp b/korganizer/ktimeedit.cpp index f5a1c50..5222ac9 100644 --- a/korganizer/ktimeedit.cpp +++ b/korganizer/ktimeedit.cpp | |||
@@ -25,6 +25,7 @@ | |||
25 | #include <qcombobox.h> | 25 | #include <qcombobox.h> |
26 | #include <qdatetime.h> | 26 | #include <qdatetime.h> |
27 | #include <qlineedit.h> | 27 | #include <qlineedit.h> |
28 | #include <qlistbox.h> | ||
28 | #include <qapplication.h> | 29 | #include <qapplication.h> |
29 | 30 | ||
30 | #include <kmessagebox.h> | 31 | #include <kmessagebox.h> |
@@ -39,44 +40,6 @@ | |||
39 | 40 | ||
40 | // Validator for a time value with only hours and minutes (no seconds) | 41 | // Validator for a time value with only hours and minutes (no seconds) |
41 | // Mostly locale aware. Author: David Faure <faure@kde.org> | 42 | // Mostly locale aware. Author: David Faure <faure@kde.org> |
42 | class KOTimeValidator : public QValidator | ||
43 | { | ||
44 | public: | ||
45 | KOTimeValidator(QWidget* parent, const char* name=0) : QValidator(parent, name) {} | ||
46 | |||
47 | virtual State validate(QString& str, int& /*cursorPos*/) const | ||
48 | { | ||
49 | return Acceptable; | ||
50 | bool ok = false; | ||
51 | // TODO use KLocale::WithoutSeconds in HEAD | ||
52 | /*QTime time =*/ KGlobal::locale()->readTime(str, &ok); | ||
53 | if ( ok ) | ||
54 | return Acceptable; | ||
55 | // readTime doesn't help knowing when the string is "Intermediate". | ||
56 | int length = str.length(); | ||
57 | if ( !str ) // empty string? | ||
58 | return Invalid; // there should always be a ':' in it, right? | ||
59 | // HACK. Not fully locale aware etc. (esp. the separator is '.' in sv_SE...) | ||
60 | QChar sep = ':'; | ||
61 | // I want to allow "HH:", ":MM" and ":" to make editing easier | ||
62 | if ( str[0] == sep ) | ||
63 | { | ||
64 | if ( length == 1 ) // just ":" | ||
65 | return Intermediate; | ||
66 | QString minutes = str.mid(1); | ||
67 | int m = minutes.toInt(&ok); | ||
68 | if ( ok && m >= 0 && m < 60 ) | ||
69 | return Intermediate; | ||
70 | } else if ( str.at(str.length()-1) == sep ) | ||
71 | { | ||
72 | QString hours = str.left(length-1); | ||
73 | int h = hours.toInt(&ok); | ||
74 | if ( ok && h >= 0 && h < 24 ) | ||
75 | return Intermediate; | ||
76 | } | ||
77 | return Invalid; | ||
78 | } | ||
79 | }; | ||
80 | 43 | ||
81 | // KTimeWidget/QTimeEdit provide nicer editing, but don't provide a combobox. | 44 | // KTimeWidget/QTimeEdit provide nicer editing, but don't provide a combobox. |
82 | // Difficult to get all in one... | 45 | // Difficult to get all in one... |
@@ -85,7 +48,6 @@ KOTimeEdit::KOTimeEdit(QWidget *parent, QTime qt, const char *name) | |||
85 | : QComboBox(TRUE, parent, name) | 48 | : QComboBox(TRUE, parent, name) |
86 | { | 49 | { |
87 | setInsertionPolicy(NoInsertion); | 50 | setInsertionPolicy(NoInsertion); |
88 | setValidator( new KOTimeValidator( this ) ); | ||
89 | mFlagKeyPressed = false; | 51 | mFlagKeyPressed = false; |
90 | 52 | ||
91 | if ( QApplication::desktop()->width() < 650 ) | 53 | if ( QApplication::desktop()->width() < 650 ) |
@@ -145,11 +107,7 @@ bool KOTimeEdit::hasTime() const | |||
145 | 107 | ||
146 | QTime KOTimeEdit::getTime() const | 108 | QTime KOTimeEdit::getTime() const |
147 | { | 109 | { |
148 | //kdDebug(5850) << "KOTimeEdit::getTime(), currentText() = " << currentText() << endl; | 110 | return KGlobal::locale()->readTime(currentText()); |
149 | // TODO use KLocale::WithoutSeconds in HEAD | ||
150 | QTime time = KGlobal::locale()->readTime(currentText()); | ||
151 | // kdDebug(5850) << "KOTimeEdit::getTime(): " << time.toString() << endl; | ||
152 | return time; | ||
153 | } | 111 | } |
154 | /* | 112 | /* |
155 | QSizePolicy KOTimeEdit::sizePolicy() const | 113 | QSizePolicy KOTimeEdit::sizePolicy() const |
@@ -165,8 +123,6 @@ void KOTimeEdit::setTime(QTime newTime) | |||
165 | { | 123 | { |
166 | if ( mTime != newTime ) | 124 | if ( mTime != newTime ) |
167 | { | 125 | { |
168 | kdDebug(5850) << "KOTimeEdit::setTime(): " << newTime.toString() << endl; | ||
169 | |||
170 | mTime = newTime; | 126 | mTime = newTime; |
171 | updateText(); | 127 | updateText(); |
172 | } | 128 | } |
@@ -379,6 +335,7 @@ void KOTimeEdit::keyPressEvent(QKeyEvent *e) | |||
379 | addTime(QTime(1,0,0)); | 335 | addTime(QTime(1,0,0)); |
380 | break; | 336 | break; |
381 | case Key_Backspace: | 337 | case Key_Backspace: |
338 | qDebug("+++++++++++back "); | ||
382 | if ( cpos > 0) { | 339 | if ( cpos > 0) { |
383 | if ( cpos == 3 ) | 340 | if ( cpos == 3 ) |
384 | --cpos; | 341 | --cpos; |
@@ -389,6 +346,7 @@ void KOTimeEdit::keyPressEvent(QKeyEvent *e) | |||
389 | lineEdit()->setCursorPosition(--cpos); | 346 | lineEdit()->setCursorPosition(--cpos); |
390 | setSelect ( cpos , 1 ); | 347 | setSelect ( cpos , 1 ); |
391 | changedText(); | 348 | changedText(); |
349 | qDebug("---------back "); | ||
392 | } | 350 | } |
393 | break; | 351 | break; |
394 | } // switch arrows | 352 | } // switch arrows |
@@ -485,44 +443,32 @@ void KOTimeEdit::keyPressEvent(QKeyEvent *e) | |||
485 | } | 443 | } |
486 | 444 | ||
487 | void KOTimeEdit::updateText() | 445 | void KOTimeEdit::updateText() |
488 | { | 446 | { |
489 | // kdDebug(5850) << "KOTimeEdit::updateText() " << endl | 447 | listBox()->blockSignals( true ); |
490 | QString s = KGlobal::locale()->formatTime(mTime); | 448 | blockSignals( true ); |
491 | // Set the text but without emitting signals, nor losing the cursor position | 449 | QString s = KGlobal::locale()->formatTime(mTime); |
492 | QLineEdit *line = lineEdit(); | 450 | // Set the text but without emitting signals, nor losing the cursor position |
493 | line->blockSignals(true); | 451 | QLineEdit *line = lineEdit(); |
494 | int pos = line->cursorPosition(); | 452 | line->blockSignals(true); |
495 | // qDebug(" settext *%s* ", s.latin1()); | 453 | int pos = line->cursorPosition(); |
496 | line->setText(s); | ||
497 | // line->setCursorPosition(pos); | ||
498 | // line->blockSignals(false); | ||
499 | |||
500 | // kdDebug(5850) << "KOTimeEdit::updateText(): " << s << endl; | ||
501 | |||
502 | if (!mTime.minute() % 15) { | ||
503 | setCurrentItem((mTime.hour()*4)+(mTime.minute()/15)); | 454 | setCurrentItem((mTime.hour()*4)+(mTime.minute()/15)); |
504 | } | 455 | line->setText(s); |
505 | line->setCursorPosition(pos); | 456 | line->setCursorPosition(pos); |
506 | line->blockSignals(false); | 457 | line->blockSignals(false); |
507 | 458 | blockSignals( false ); | |
508 | } | 459 | listBox()->blockSignals( false ); |
509 | 460 | ||
510 | bool KOTimeEdit::inputIsValid() const | ||
511 | { | ||
512 | int cursorPos = lineEdit()->cursorPosition(); | ||
513 | QString str = currentText(); | ||
514 | return validator()->validate( str, cursorPos ) == QValidator::Acceptable; | ||
515 | } | 461 | } |
516 | 462 | ||
517 | void KOTimeEdit::changedText() | 463 | void KOTimeEdit::changedText() |
518 | { | 464 | { |
519 | //kdDebug(5850) << "KOTimeEdit::changedText()" << endl; | 465 | int pos = lineEdit()->cursorPosition(); |
520 | if ( inputIsValid() ) | 466 | mTime = getTime(); |
521 | { | 467 | blockSignals( true ); |
522 | int pos = lineEdit()->cursorPosition(); | 468 | QString text = lineEdit()->text(); |
523 | mTime = getTime(); | 469 | setCurrentItem((mTime.hour()*4)+(mTime.minute()/15)); |
524 | // updateText(); | 470 | lineEdit()->setText(text); |
525 | emit timeChanged(mTime); | 471 | blockSignals( false ); |
526 | lineEdit()->setCursorPosition(pos); | 472 | emit timeChanged(mTime); |
527 | } | 473 | lineEdit()->setCursorPosition(pos); |
528 | } | 474 | } |