[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: Re: branches/work/soc-parley/parley/src/practice
From: "David Capel" <wot.narg () gmail ! com>
Date: 2008-06-30 23:07:57
Message-ID: 304556ab0806301607j47f911bejee3eb47c7a539cf2 () mail ! gmail ! com
[Download RAW message or body]
On Mon, Jun 30, 2008 at 5:04 PM, Frederik Gladhorn
<frederik.gladhorn@gmx.de> wrote:
> On Monday 30 June 2008 13:49:51 David Capel wrote:
>> SVN commit 826307 by capel:
>>
>> Creation of multiple choice mode. It was amazingly easy to write (it was
>> also amazingly similar to Q&A mode -- go figure).
>>
>> Todo on MC: make an option so that it only gives you possible answers of
>> the same word type? Todo in general: how should we handle the seperator
>> character (used for multiple translations)? Note: This MC mode avoids the
>> duplicate answer bug.
>
> Hey, sounds good!
Can you think of any other configurable parameters for Multiple Choice
that I should add while I'm doing those?
> Right now it only shows a white window to me :(
> Maybe I have something old lying around... seems like it can't find any theme.
> Let me know if you have any idea. Maybe you can make something out of this
> debug output:
> parley(13548)/kdecore (KConfigSkeleton) KCoreConfigSkeleton::readConfig:
> KCoreConfigSkeleton::readConfig()
> parley(13548)/libkdegames KGameTheme::load: Attempting to load .desktop at ""
> parley(13548) ParleyPracticeMainWindow::setupBase: kgametheme valid: false
> parley(13548)/libkdegames KGameTheme::graphics: No theme file has been loaded.
> KGameTheme::load() or KGameTheme::loadDefault() must be called.
> parley(13548) ParleyPracticeMainWindow::setupBase: graphics svg path ""
> parley(13548)/libkdegames KGameTheme::graphics: No theme file has been loaded.
> KGameTheme::load() or KGameTheme::loadDefault() must be called.
> QFSFileEngine::open: No file name specified
> parley(13548) KEduVocDocument::KEduVocDocument: constructor done
Ah, the problem is that I didn't add the mc files to cmake's install
list. I'll update that.
>
> I'm sorry, real life kept me busy. Can you poke me on irc? (If possible early
> in the morning ;)).
Next time I see you I'll be sure to do that.
> How are you doing?
> I've been working on getting something for my diploma thesis done, but it's
> not going as good as I hoped.
I've been doing pretty good; I'm enjoying the summer. Out of
curiousity, what topic is your thesis on?
> I think you can fix that the windows are open at the same time (practice and
> editor).
> Let the practice emit a signal (eg practiceFinished()) when it's done. Connect
> that to a ParleyApp slot and use ParleyApp::show in that slot (instead of the
> show in startPractice()).
> You get the idea.
I'll do that tonight.
> Let's simply set up a hotnewstuff repo on edu.kde.org since it seems that
> Jeremy is just to busy right now, moving that will be no problem later.
> There is a tutorial on techbase if you want to read up on it.
> Look at parley.knsrc to get started. There is a link to the xml file providing
> the link to the real lists of files.
> If you write the same for the theme files I'll put it online.
> edu.kde.org is kept in svn:
> http://websvn.kde.org/trunk/www/sites/edu
>
> The hotnewstuff for Parley is:
> http://websvn.kde.org/trunk/www/sites/edu/parley/newstuff/
> And also:
> http://websvn.kde.org/trunk/www/sites/edu/contrib/kvtml2/
>
> (see provider.xml and providers.xml)
>
> So you need to do a copy and paste job basically.
> I'd suggest simply bzip2-ing the .desktop and .svgz file together. They can be
> extracted automatically.
Jeremy set up a repository, but it seems buggy still. I'll check out this way.
Good luck,
David
> Greetings,
> Frederik
>
>>
>> M +91 -0 input.cpp
>> M +24 -1 input.h
>> M +10 -9 parleypracticemainwindow.cpp
>> M +2 -2 parleypracticemainwindow.h
>> M +1 -1 practiceentrymanager.cpp
>> M +2 -1 practiceentrymanager.h
>> M +1 -1 stdbuttons.cpp
>> AM themes/default_theme_mc.svgz
>> A themes/mc.desktop
>>
>>
>> --- branches/work/soc-parley/parley/src/practice/input.cpp #826306:826307
>> @@ -20,9 +20,15 @@
>>
>> ***************************************************************************
>>/ #include "input.h"
>> #include "statistics.h"
>> +#include "practiceentry.h"
>> +#include "prefs.h"
>>
>> #include <KDebug>
>> #include <KSvgRenderer>
>> +#include <KRandom>
>> +#include <QRadioButton>
>> +#include <QVBoxLayout>
>> +#include <KRandomSequence>
>>
>> TextualInput::TextualInput(KSvgRenderer * renderer, QGraphicsView * view,
>> const QString& elementId, QWidget* parent)
>>
>> : QLineEdit(parent),
>>
>> @@ -74,4 +80,89 @@
>> }
>>
>>
>> +MultipleChoiceInput::MultipleChoiceInput(KSvgRenderer * renderer,
>> QGraphicsView * view, const QString& elementId, QWidget* parent) + :
>> QGroupBox(parent),
>> + m_renderer(renderer)
>> +{
>> + if (!renderer->elementExists(elementId))
>> + {
>> + setVisible(false);
>> + kDebug() << "!! Element id doesn't exist:";
>> + kDebug() << elementId << ":" <<
>> renderer->elementExists(elementId); + }
>> +
>> + QRect bounds = m_renderer->boundsOnElement(elementId).toRect();
>> + setGeometry(view->mapToScene(bounds).boundingRect().toRect());
>> +}
>> +
>> +
>> +
>> +void MultipleChoiceInput::slotSetAnswers(PracticeEntry* currentEntry,
>> const QList<PracticeEntry*> source) +{
>> + if (source.size() < 4)
>> + {
>> + kDebug() << "source list too short with " << source.size() <<
>> "entries. Aborted."; + return;
>> + }
>> +
>> +
>> + // clean up from last time
>> + delete layout();
>> +
>> + foreach(QRadioButton* b, findChildren<QRadioButton*>())
>> + {
>> + delete b;
>> + }
>> +
>> +
>> + // start fresh and new!
>> + QVBoxLayout *vbox = new QVBoxLayout;
>> + QString s;
>> + QList<QString> list;
>> + // TODO should size of question set be configurable?
>> + int timeout = 0;
>> + long r;
>> +
>> +
>> list.append(currentEntry->expression()->translation(Prefs::solutionLanguage
>>())->text()); +
>> + while (list.size() < 4 && timeout < 50) // prevent infinite loop
>> + {
>> + ++timeout;
>> + r = KRandom::random() % source.size();
>> + s =
>> source[r]->expression()->translation(Prefs::solutionLanguage())->text(); +
>> if (!list.contains(s))
>> + list.append(s);
>> + }
>> +
>> + KRandomSequence(0).randomize(list);
>> +
>> + foreach(s, list)
>> + {
>> + vbox->addWidget(new QRadioButton(s));
>> + }
>> +
>> + vbox->addStretch(1);
>> + setLayout(vbox);
>> +
>> +}
>> +
>> +MultipleChoiceInput::~MultipleChoiceInput()
>> +{
>> + foreach(QRadioButton* b, findChildren<QRadioButton*>())
>> + {
>> + delete b;
>> + }
>> +}
>> +
>> +void MultipleChoiceInput::slotEmitAnswer()
>> +{
>> + foreach(QRadioButton* b, findChildren<QRadioButton*>())
>> + if (b->isChecked())
>> + {
>> + kDebug() << "found it";
>> + emit signalAnswer(b->text());
>> + }
>> + emit signalAnswer(""); // none were selected.
>> +}
>> +
>> #include "input.moc"
>> --- branches/work/soc-parley/parley/src/practice/input.h #826306:826307
>> @@ -21,10 +21,14 @@
>>
>> #include <QObject>
>> #include <QLineEdit>
>> +#include <QGroupBox>
>>
>> #include <KSvgRenderer>
>> #include <QGraphicsView>
>>
>> +class QString;
>> +class PracticeEntry;
>> +
>> class TextualInput : public QLineEdit
>> {
>> Q_OBJECT
>> @@ -39,10 +43,29 @@
>> void slotEmitAnswer();
>>
>> signals:
>> - void signalAnswer(const QString& input);
>> + void signalAnswer(const QString& answer);
>>
>> private:
>> KSvgRenderer* m_renderer;
>> };
>>
>> +
>> +class MultipleChoiceInput : public QGroupBox
>> +{
>> + Q_OBJECT;
>> + public:
>> + MultipleChoiceInput(KSvgRenderer * renderer, QGraphicsView * view,
>> const QString& elementId, QWidget * parent = 0); +
>> ~MultipleChoiceInput();
>> +
>> + public slots:
>> + void slotEmitAnswer();
>> + void slotSetAnswers(PracticeEntry*, QList<PracticeEntry*>);
>> +
>> + signals:
>> + void signalAnswer(const QString& answer);
>> +
>> + private:
>> + KSvgRenderer* m_renderer;
>> +};
>> +
>> #endif
>> ---
>> branches/work/soc-parley/parley/src/practice/parleypracticemainwindow.cpp
>> #826306:826307 @@ -51,7 +51,7 @@
>> ParleyPracticeMainWindow::ParleyPracticeMainWindow(QWidget *parent)
>>
>> : KXmlGuiWindow(parent)
>>
>> {
>> - setupBase();
>> + setupBase("mc.desktop");
>> setupActions();
>> setupModeSpecifics();
>>
>> @@ -106,7 +106,7 @@
>> emit signalCheckAnswerContinueActionsToggled(m_state);
>> }
>>
>> -void ParleyPracticeMainWindow::setupBase()
>> +void ParleyPracticeMainWindow::setupBase(const QString& desktopFileName)
>> {
>> m_state = CheckAnswer;
>> m_mode = Prefs::testType();
>> @@ -123,7 +123,7 @@
>> QGraphicsSvgItem * backgroundsvg = new QGraphicsSvgItem();
>> m_renderer = new KSvgRenderer();
>> KGameTheme kgtheme;
>> - kDebug() << "kgametheme valid:" <<
>> kgtheme.load("parley/themes/default.desktop"); + kDebug() <<
>> "kgametheme valid:" << kgtheme.load("parley/themes/" + desktopFileName);
>> kDebug() << "graphics svg path" << kgtheme.graphics();
>> m_renderer->load(kgtheme.graphics());
>> backgroundsvg->setSharedRenderer(m_renderer);
>> @@ -135,7 +135,7 @@
>> m_manager = new PracticeEntryManager(this);
>>
>> m_stats = new Statistics(m_manager, this);
>> - connect(m_manager, SIGNAL(signalEntryChanged(PracticeEntry*)),
>> m_stats, SLOT(slotSetEntry(PracticeEntry*))); + connect(m_manager,
>> SIGNAL(signalEntryChanged(PracticeEntry*, QList<PracticeEntry*>)), m_stats,
>> SLOT(slotSetEntry(PracticeEntry*))); connect(m_manager,
>> SIGNAL(signalSetFinished()), m_stats, SLOT(slotSetFinished())); ////
>> Loading the Document -- temporary ////
>> KEduVocDocument * doc = new KEduVocDocument(this);
>> @@ -213,6 +213,8 @@
>> {
>> if (m_mode == Prefs::EnumTestType::WrittenTest)
>> setupWritten();
>> + else if (m_mode == Prefs::EnumTestType::MultipleChoiceTest)
>> + setupMultipleChoice();
>> else
>> kDebug() << "unhandled practice mode " << m_mode << " selected.";
>> }
>> @@ -302,13 +304,11 @@
>> connect(m_manager, SIGNAL(signalNewSound(const KUrl&)), sprompt,
>> SLOT(slotSetSound(const KUrl&))); }
>>
>> - TextualInput * input = new TextualInput(m_renderer, m_view,
>> "practice_text_translation_background"); + MultipleChoiceInput * input =
>> new MultipleChoiceInput(m_renderer, m_view,
>> "practice_text_translation_background"); m_scene->addWidget(input);
>> connect(input, SIGNAL(signalAnswer(const QString&)), this,
>> SLOT(slotCheckAnswer(const QString&))); - connect(m_validator,
>> SIGNAL(signalCorrection(float, Statistics::ErrorType, const QString&)),
>> input, SLOT(slotChangeAnswerColor(float))); - connect(this,
>> SIGNAL(signalShowSolution(const QString&, int)), input,
>> SLOT(slotShowSolution(const QString&)));
>> connect(actionCollection()->action("check answer"), SIGNAL(triggered()),
>> input, SLOT(slotEmitAnswer())); -
>> connect(actionCollection()->action("continue"), SIGNAL(triggered()), input,
>> SLOT(slotClear())); + connect(m_manager,
>> SIGNAL(signalEntryChanged(PracticeEntry*, QList<PracticeEntry*>)), input,
>> SLOT(slotSetAnswers(PracticeEntry*, QList<PracticeEntry*>)));
>>
>> SvgBarStatistics * barstats = new SvgBarStatistics(m_renderer, "bar",
>> "bar_background"); m_scene->addItem(barstats);
>> @@ -316,7 +316,8 @@
>>
>> StdButton * stdbutton = new StdButton(i18n("Check Answer"),
>> m_renderer, m_view, "check_answer_and_continue_button");
>> m_scene->addWidget(stdbutton);
>> - connect(input, SIGNAL(returnPressed()), stdbutton,
>> SLOT(slotActivated())); + // TODO somehow get some form of keyboard
>> input working.
>> + // connect(input, SIGNAL(returnPressed()), 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())); ---
>> branches/work/soc-parley/parley/src/practice/parleypracticemainwindow.h
>> #826306:826307 @@ -50,13 +50,13 @@
>> int m_state;
>> Prefs::EnumTestType::type m_mode;
>>
>> - void setupBase();
>> + void setupBase(const QString& desktopFileFilename);
>> void setupActions();
>> void setupModeSpecifics();
>>
>> // Mode specific setup functions
>> void setupWritten();
>> - void setupMultipleChoice();
>> + void setupMultipleChoice();
>> public slots:
>> void slotCheckAnswer(const QString& input);
>> void slotShowSolution();
>> --- branches/work/soc-parley/parley/src/practice/practiceentrymanager.cpp
>> #826306:826307 @@ -122,7 +122,7 @@
>> emit signalNewImage(original->imageUrl());
>> emit signalNewSound(original->soundUrl());
>>
>> - emit signalEntryChanged(m_entry);
>> + emit signalEntryChanged(m_entry, m_entries);
>> emit signalNewEntry();
>> --m_numberEntriesRemaining;
>> }
>> --- branches/work/soc-parley/parley/src/practice/practiceentrymanager.h
>> #826306:826307 @@ -107,7 +107,8 @@
>> void signalNewSound(const KUrl&);
>> /// Emitted when the question is changed.
>> /// This is used so @class Statistics can update the grades and
>> related information. - void signalEntryChanged(PracticeEntry*);
>> + /// It is additionally used by some input widgets.
>> + void signalEntryChanged(PracticeEntry*, QList<PracticeEntry*>);
>> /// Used so various widgets will know to reset themselves.
>> void signalNewEntry();
>> /// Emitted when the set of questions is finished.
>> --- branches/work/soc-parley/parley/src/practice/stdbuttons.cpp
>> #826306:826307 @@ -80,4 +80,4 @@
>> {
>> setText(i18n("Continue"));
>> }
>> -}
>> \ No newline at end of file
>> +}
>> **
>> branches/work/soc-parley/parley/src/practice/themes/default_theme_mc.svgz
>> #property svn:mime-type + application/octet-stream
>
> --
> Frederik Gladhorn
>
> Parley - The Vocabulary Trainer
> http://edu.kde.org/parley
>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic