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;

Reply via email to