[Kwintv] Re: kdenonbeta/kwintv3/qtvision

Rizsanyi Zsolt kwintv@mail.kde.org
Wed, 16 Oct 2002 14:38:20 +0200


--------------Boundary-00=_W3R247BXKUWAKB9051J4
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

On Wednesday 16 October 2002 06:05, George Staikos wrote:
> On October 15, 2002 23:58, Dawit Alemayehu wrote:
> > CVS commit by adawit:
> >
> > - Change the channel intelligently.  Now the delayed change is activated
> > iff the entered numbers are ambigous.  It uses the highest configured
> > channel to handle this as discussed.

I think that the implementation has some inconsistencies/bugs.
My main problems are:
- you cant select a channel number less than 10 with one keypress even if you 
have only less 10 channels configured
- you could not select channels less than 10 without delay with even a leading 
zero entered if the max channel is *10 bigger than the channel you want to 
enter
- there is no way to select channels without delay, even if you enter leading 
zeros
- it does not work with channels > 1000 :)

Here is my implementation which should fix all those above issues. And the 
code is simpler too...
Should I commit it, or somebody wants to veto me :)

Basic description of usage:
- you enter the number, and if by entering any more digits the number would be 
larger than the largest channel number, then the channel is changed without 
delay (else there is the usual delay)
- if you enter leading zeroes then with every leading zero the max number to 
compare is divided by 10

Here is how it works for the different max channel number:
- max channel num < 20
you enter the number and the channel is changed without delay
there is no use to enter a leading zero (but you can)
- max channel num < 200
if you want to select channel > 20 you just enter the number
if you want to select channel < 20, then you enter the number, and wait the 
delay OR you enter a leading zero and the channel is changed without delay
- max channel num < 2000
if you want to select channel > 200 you just enter the number
if you want to select channel < 200 but > 20, then you enter the number, and 
wait the delay OR you enter a leading zero and the channel is changed without 
delay
if you want to select channel < 20, then you enter the number, and wait the 
delay OR you enter TWO (2) leading zeros and the channel is changed without 
delay


Huh. I took more to write this down than the code :)
But I hope this will convince everybody :)

Regards
Zsolt

--------------Boundary-00=_W3R247BXKUWAKB9051J4
Content-Type: text/x-diff;
  charset="iso-8859-1";
  name="numberpress.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="numberpress.patch"

Index: qtvision/qtvision.cpp
===================================================================
RCS file: /home/kde/kdenonbeta/kwintv3/qtvision/qtvision.cpp,v
retrieving revision 1.101
diff -u -p -r1.101 qtvision.cpp
--- qtvision/qtvision.cpp	2002/10/16 05:21:01	1.101
+++ qtvision/qtvision.cpp	2002/10/16 12:36:18
@@ -1,4 +1,4 @@
-/*
+/* vim: sw=4 et
  *
  * Copyright (C) 2002 George Staikos <staikos@kde.org>
  *
@@ -864,7 +864,7 @@ void QtVision::processNumberKeyEvent(int
 {
     if (_keypresstimer->isActive())
         _keypresstimer->stop();
-    
+
     // key == -1 means ENTER was pressed. Simply force a 
     // channel change and return...
     if (key == -1)
@@ -872,68 +872,42 @@ void QtVision::processNumberKeyEvent(int
         slotKeyPressTimeout ();
         return;
     }
-               
-    switch (_number.length()) 
-    {
-        case 0:
-        {
-            _number = QString::number(key);
 
-            kdDebug() << "channelText(" << "--" << _number << ")" << endl;
-            emit channelText("--" + _number);
-
-            _keypresstimer->start(2000, true);  // start the count-down timer
-            break;
-        }
-        case 1:
-        {
-            Q_ASSERT (_cs == 0);
-            
-            // Get the highest channel number...
-            Channel * ch = _cs->channelAt (_cs->count()-1);            
-            
-            Q_ASSERT (ch == 0);
-            
-            int chNumber = (_number.toInt()*100) + (key * 10);
-            
-            // If the numbers pressed so far equates to a value less than
-            // the highest channel number configured/detected, start a timer.
-            // Otherwise, simply tune to the channel.
-            if (chNumber < ch->number()) {
-                _number += QString::number(key);
-                 kdDebug() << "channelText(" << "-" << _number << ")" << endl;
-                 emit channelText("-" + _number);
-                _keypresstimer->start(2000, true);  // start the count-down timer
-            } else {
-                _number += QString::number(key);
-                if (_number != "0") {
-                    _keypresstimer->singleShot(0, this, SLOT(slotKeyPressTimeout()));
-                    break;
-                } // if
-            } // else
-            break;            
-        }
-        case 2:
-        {
-            _number = _number.append(QString::number(key));
+    Q_ASSERT (_cs);
 
-            kdDebug() << "channelText(" << _number << ")" << endl;
-            emit channelText(_number);
+    // Get the highest channel number...
+    Channel * ch = _cs->channelAt (_cs->count()-1);
+    Q_ASSERT (ch);
+    int maxChNum = ch->number();
+
+    // For every '0' entered before the number lower the max channel by
+    // 10 times
+    for (int i = 0; i < _number.length() && _number[i] == '0'; i++)
+        maxChNum /= 10;
+
+    _number += QString::number(key);
+
+    // If by entering another digit you can get a number lesser than
+    // the highest channel number configured/detected, start a timer
+    // (wait for that next keypress).
+    // Otherwise, simply tune to the channel.
+    if (_number.toInt() * 10 < maxChNum) {
+        kdDebug() << "channelText(" << _number.rightJustify(3,'-') << ")" << endl;
+        emit channelText(_number.rightJustify(3,'-'));
+        _keypresstimer->start(2000, true);  // start the count-down timer
+    } else {
+        if (_number != "0")
             _keypresstimer->singleShot(0, this, SLOT(slotKeyPressTimeout()));
-            break;
-        }
-        default:
-            break;
-    } // switch
+    } // else
 }// processNumberKeyEvent
 
 
 void QtVision::slotKeyPressTimeout()
 {
-    emit channelText(_number);
-
-    kdDebug() << "QtVision: calling setChannel(" << _number << ")" << endl;
-    setChannel(_number.toInt());
+    if (_number != "0") {
+        kdDebug() << "QtVision: calling setChannel(" << _number << ")" << endl;
+        setChannel(_number.toInt());
+    }
 
     _number = "";
     return;

--------------Boundary-00=_W3R247BXKUWAKB9051J4--