[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/work/soc-parley/parley/src/practice
From:       David Capel <wot.narg () gmail ! com>
Date:       2008-07-02 8:50:25
Message-ID: 1214988625.300663.9361.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 827077 by capel:

Made the mc theme more usable
Made shortcuts work in MC -- Alt+n and n both work (with n in [1,9]) This puts an \
upper limit of 9 answers for the number of MC answers. Return/Enter now functions \
similarly to how written works -- however, if you haven't selected an answer yet, it \
does nothing.

Some general code cleanup.

TODO: make MC prettier (maybe?); make Parley hide when parleypractice is shown.




 M  +29 -3     input.cpp  
 M  +2 -0      input.h  
 M  +33 -2     parleypracticemainwindow.cpp  
 M  +9 -0      parleypracticeui.rc  
 M             themes/default_theme_mc.svgz  


--- branches/work/soc-parley/parley/src/practice/input.cpp #827076:827077
@@ -96,10 +96,38 @@
 
      QRect bounds = m_renderer->boundsOnElement(elementId).toRect();
      setGeometry(view->mapToScene(bounds).boundingRect().toRect());
+
 }
 
+void MultipleChoiceInput::slotShortcutTriggered(int shortcutNumber)
+{
+    if (shortcutNumber > Prefs::numberMultipleChoiceAnswers())
+        return; // bogus false positive
 
+    // Shortcut number 0 is triggered by return/enter and is used for activating the \
currently selected option. +    // Therefore, we check if any buttons are checked, \
and if so, emit the signal +    // if none are checked, we ignore this shortcut
+    if (shortcutNumber == 0)
+        // we emit only if a button is checked
+        foreach(QRadioButton* b, findChildren<QRadioButton*>())
+            if (b->isChecked())
+            {
+                emit triggered();
+                return;
+            }
 
+    foreach(QRadioButton* b, findChildren<QRadioButton*>())
+    {
+        if (b->text().startsWith(QString("&%1 ").arg(shortcutNumber)))
+        {
+            b->setChecked(true);
+            emit triggered();
+            return;
+        }
+    }
+    // we didn't find anything.
+}
+
 void MultipleChoiceInput::slotSetAnswers(PracticeEntry* currentEntry, const \
QList<PracticeEntry*> source)  {
 
@@ -202,9 +230,7 @@
     foreach(QRadioButton* b, findChildren<QRadioButton*>())
         if (b->isChecked())
         {
-            kDebug() << "found it";
-            // screw regexps ;)
-            emit signalAnswer(b->text().replace("&1 ", "").replace("&2 ", \
"").replace("&3 ", "").replace("&4 ", "").replace("&5 ", "").replace("&6 ", \
"").replace("&7 ", "").replace("&8 ", "").replace("&9 ", "")); +            emit \
signalAnswer(b->text().remove(QRegExp("^&\\d ")));  }
     emit signalAnswer(""); // none were selected.
 }
--- branches/work/soc-parley/parley/src/practice/input.h #827076:827077
@@ -60,9 +60,11 @@
     public slots:
         void slotEmitAnswer();
         void slotSetAnswers(PracticeEntry*, QList<PracticeEntry*>);
+        void slotShortcutTriggered(int shortcutNumber);
 
     signals:
         void signalAnswer(const QString& answer);
+        void triggered();
 
     private:
         KSvgRenderer* m_renderer;
--- branches/work/soc-parley/parley/src/practice/parleypracticemainwindow.cpp \
#827076:827077 @@ -29,6 +29,8 @@
 #include <KLocalizedString>
 #include <KConfigDialog>
 #include <KApplication>
+#include <QShortcut>
+#include <QSignalMapper>
 
 #include "practiceview.h"
 #include "input.h"
@@ -201,6 +203,7 @@
     if (!Prefs::showHints())
         hintAction->setVisible(false);
 
+
     KStandardAction::preferences(this, SLOT(slotCreatePreferencesDialog()),
                                        actionCollection());
 
@@ -316,8 +319,7 @@
 
     StdButton * stdbutton = new StdButton(i18n("Check Answer"), m_renderer, m_view, \
"check_answer_and_continue_button");  m_scene->addWidget(stdbutton);
-    // TODO somehow get some form of keyboard input working.
- //   connect(input, SIGNAL(returnPressed()), stdbutton, SLOT(slotActivated()));
+    connect(input, SIGNAL(triggered()), stdbutton, SLOT(slotActivated()));
     connect(this, SIGNAL(signalCheckAnswerContinueActionsToggled(int)), stdbutton, \
                SLOT(slotToggleText(int)));
     connect(stdbutton, SIGNAL(signalCheckAnswer()), \
                actionCollection()->action("check answer"), SIGNAL(triggered()));
     connect(stdbutton, SIGNAL(signalContinue()), \
actionCollection()->action("continue"), SIGNAL(triggered())); @@ -342,4 +344,33 @@
         connect(input, SIGNAL(signalInput(const QString&)), timer, \
SLOT(slotStop()));  }
 
+    // setup shortcuts for multiple choice input
+    QSignalMapper * mapper = new QSignalMapper(this);
+    KAction * shortcut;
+     for(int n = 1; n < 10; ++n)
+     {
+        shortcut = new KAction(this);
+        shortcut->setText(i18n("Select Option %1", n));
+        actionCollection()->addAction(QString("select option %1").arg(n), shortcut);
+        shortcut->setShortcut(KShortcut(QString("%1; Alt+%1").arg(n)));
+        mapper->setMapping(shortcut, n);
+        connect(shortcut, SIGNAL(triggered()), mapper, SLOT(map()));
+        if (n > Prefs::numberMultipleChoiceAnswers())
+            shortcut->setVisible(false); // disable non-relevent shortcuts
+     }
+
+
+    // enter/return triggers shortcut 0, which means use the currently selected \
option +    // if no option is selected, this is ignored.
+    QShortcut* accelerator = new QShortcut(Qt::Key_Enter, this);
+    accelerator->setAutoRepeat(false);
+    mapper->setMapping(accelerator, 0);
+    connect(accelerator, SIGNAL(activated()), mapper, SLOT(map()));
+
+    accelerator = new QShortcut(Qt::Key_Return, this);
+    accelerator->setAutoRepeat(false);
+    mapper->setMapping(accelerator, 0);
+    connect(accelerator, SIGNAL(activated()), mapper, SLOT(map()));
+
+    connect(mapper, SIGNAL(mapped(int)), input, SLOT(slotShortcutTriggered(int)));
 }
--- branches/work/soc-parley/parley/src/practice/parleypracticeui.rc #827076:827077
@@ -8,6 +8,15 @@
       <Action name="continue" />
       <Action name="skip known" />
       <Action name="skip unknown" />
+      <Action name="select option 1" />
+      <Action name="select option 2" />
+      <Action name="select option 3" />
+      <Action name="select option 4" />
+      <Action name="select option 5" />
+      <Action name="select option 6" />
+      <Action name="select option 7" />
+      <Action name="select option 8" />
+      <Action name="select option 9" />
     </Menu>
       <Menu name="Hint" >
       <text>Hint</text>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic