Please undo the previous patch, it solved only half the problem. This one is better.
-- Wolfgang
--- ksudokuview.cpp 2006-02-27 01:18:03.000000000 +0100 +++ /home/wr/knew/ksudokuview.cpp 2006-02-27 00:28:28.000000000 +0100 @@ -57,6 +57,7 @@ update(); resizeEvent(0); + current_btn = 0; } ksudokuView::~ksudokuView() @@ -174,17 +175,18 @@ return 0; } -void ksudokuView::btn_enter(int y, int x) // oops +void ksudokuView::btn_enter(int x, int y) { isWaitingForNumber = -1; + current_btn = btns[x*puzzle->order+y]; for(int i=0; i<puzzle->size ; i++) for(int j=0; j<3 ; j++) btns[i]->highlighted[j] = false; for(int i=0; i<puzzle->order; i++) { - btns[i+y*puzzle->order]->highlighted[0] = true; - btns[i*puzzle->order+x]->highlighted[1] = true; + btns[i+x*puzzle->order]->highlighted[0] = true; + btns[i*puzzle->order+y]->highlighted[1] = true; int sx = (x/puzzle->base) * puzzle->base; int sy = (y/puzzle->base) * puzzle->base; - btns[sx+(i%puzzle->base) + (sy + (i/puzzle->base))*puzzle->order]->highlighted[2] = true; + btns[sy+(i%puzzle->base) + (sx + (i/puzzle->base))*puzzle->order]->highlighted[2] = true; } for(int i=0; i<puzzle->size ; i++) btns[i]->update(); } @@ -195,7 +197,7 @@ } -void ksudokuView::btn_leave(int x, int y){} +void ksudokuView::btn_leave(int , int ){} void ksudokuView::createbuttons() { --- qsudokubutton.cpp 2006-02-27 01:06:51.000000000 +0100 +++ /home/wr/knew/qsudokubutton.cpp 2006-02-27 01:12:48.000000000 +0100 @@ -12,7 +12,6 @@ x = xx; value = 0; y = yy; - mousein =false; justmarked = false; given = false; @@ -48,52 +47,106 @@ { emit enter(x,y); setFocus(); - mousein = true; } void QSudokuButton::leaveEvent (QEvent *) { emit leave(x,y); - mousein = false; -} - -void QSudokuButton::exitEvent (QEvent *) -{ - mousein = false; - emit enter(x,y); } void QSudokuButton::keyPressEvent ( QKeyEvent * e ) { + assert(p->current_btn); if(e->stateAfter() & Qt::ShiftButton || e->state() & Qt::ShiftButton) - emit beginHighlight(this->value); + emit beginHighlight(p->current_btn->value); } void QSudokuButton::keyReleaseEvent ( QKeyEvent * e ) { + assert(p->current_btn); + p->current_btn->keyRelease(e); +} + +void QSudokuButton::keyRelease ( QKeyEvent * e ) +{ + int order = p->puzzle->order; if(e->stateAfter() & Qt::ShiftButton || e->state() & Qt::ShiftButton ) emit finishHighlight(); - if(given) return; //it is given by puzzle so skip - - char c = e->ascii(); - if(c >= 'A' && c <= 'Z') c = c+32; - int n = e->ascii()-p->puzzle->zerochar; - if(n > 0 && n <= (p->puzzle->order)) - { - if(p->isWaitingForNumber == -1) + if (e->key()==Key_Right || e->key()==Key_Down || e->key()==Key_Up || +e->key()==Key_Left) + { + int nx=x; + int ny=y; + switch (e->key()) { + case Key_Right: + if (nx<order-1) + nx++; + else if (ny<order-1) + { + ny++; + nx=0; + } + else + nx=ny=0; + break; + case Key_Down: + if (ny<order-1) + ny++; + else if (nx<order-1) + { + nx++; + ny=0; + } + else + nx=ny=0; + break; + case Key_Up: + if (ny>0) + ny--; + else if (nx>0) + { + nx--; + ny=order-1; + } + else + nx=ny=order-1; + break; + case Key_Left: + if (nx>0) + nx--; + else if (ny>0) + { + ny--; + nx=order-1; + } + else + nx=ny=order-1; + break; + } + p->current_btn=p->btns[nx*order+ny]; + emit enter(nx,ny); + } + else if (!given) // skip if preset by puzzle + { + char c = e->ascii(); + if(c >= 'A' && c <= 'Z') c = c+32; + int n = e->ascii()-p->puzzle->zerochar; + if(n > 0 && n <= (p->puzzle->order)) { - if(e->state() & Qt::AltButton) + if(p->isWaitingForNumber == -1) + { + if(e->state() & Qt::AltButton) + justmark(n); + else + setValue(n); + + } + else if(p->isWaitingForNumber == x*p->puzzle->order+y) + { justmark(n); - else - setValue(n); - - } - else if(p->isWaitingForNumber == x*p->puzzle->order+y) - { - justmark(n); + } } } - } void QSudokuButton::justmark(int n) --- ksudokuview.h 2006-02-27 01:06:51.000000000 +0100 +++ /home/wr/knew/ksudokuview.h 2006-02-26 21:53:14.000000000 +0100 @@ -131,6 +131,7 @@ btnData stack[256]; //2FIX int stack_d; + QSudokuButton *current_btn; }; #endif // _KSUDOKUVIEW_H_ --- qsudokubutton.h 2006-02-27 01:06:39.000000000 +0100 +++ /home/wr/knew/qsudokubutton.h 2006-02-27 01:07:11.000000000 +0100 @@ -30,10 +30,10 @@ void paintEvent (QPaintEvent *); //2FIX void mousePressEvent (QMouseEvent *); void enterEvent (QEvent *); - void exitEvent (QEvent *) ; void leaveEvent (QEvent *) ; void keyReleaseEvent ( QKeyEvent * e ) ; void keyPressEvent ( QKeyEvent * e ) ; + void keyRelease ( QKeyEvent * e ) ; signals: void clicked2 (int , int ); @@ -49,7 +49,6 @@ public slots: void animate(); public: - bool mousein; bool highlighted[4]; ksudokuView* p;