#include "gui/conjugation.h"
#include <QtCore/QCoreApplication>
-#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
btnClear = new QPushButton;
btnClear->setIcon(QIcon("/usr/share/icons/hicolor/64x64/hildon/general_delete.png"));
wordinput = new QLineEdit;
- labVerb = new QLabel();
- labVerb->setMinimumWidth(250);
btlayout->addWidget(btnClear);
- btlayout->addWidget(labVerb);
btlayout->addWidget(wordinput);
btnLookup = new QPushButton; // Lookup button
btnLookup->setIcon(QIcon("/usr/share/icons/hicolor/64x64/hildon/general_search.png"));
cent->setLayout(mlayout);
// Clear the word input when Clear button is tapped
- connect(btnClear, SIGNAL(clicked()), this, SLOT(clearResults()));
+ connect(btnClear, SIGNAL(clicked()), this, SLOT(startAgain()));
connect(wordinput, SIGNAL(returnPressed()), this, SLOT(startLookup()));
connect(btnLookup, SIGNAL(clicked()), this, SLOT(startLookup()));
MainWindow::~MainWindow()
{
delete ui;
+ delete freVerbDic;
}
void MainWindow::setOrientation(ScreenOrientation orientation)
void MainWindow::initverbiste()
{
langCode = "fr";
-}
-
-void MainWindow::startLookup()
-{
- QString input = wordinput->text();
FrenchVerbDictionary::Language lang = FrenchVerbDictionary::parseLanguageCode(langCode);
if (lang != FrenchVerbDictionary::FRENCH)
/* Create verb dictionary, accept non-accent input */
freVerbDic = new FrenchVerbDictionary(true);
+}
+
+void MainWindow::startLookup()
+{
+ QString input = wordinput->text().trimmed();
+ if (input.isEmpty()) {
+ return;
+ }
+
+ btnLookup->setText(tr("Please wait..."));
+ btnLookup->setEnabled(false);
+ clearResults();
+ /* Pending the lookup job to the next event loop (redraw the button right now) */
+ QApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
/* Get input word to look up */
const std::string word = input.toLower().toUtf8().constData();
* For each possible deconjugation, take the infinitive form and
* obtain its complete conjugation.
*/
- std::vector<InflectionDesc> v;
+ std::vector<InflectionDesc> infles;
bool includePronouns = FALSE; // TODO: Will get this value from external
bool isItalian = FALSE; // TODO: Will get this value from external
- freVerbDic->deconjugate(word, v);
+ freVerbDic->deconjugate(word, infles);
- std::string prevUTF8Infinitive, prevTemplateName;
- for (std::vector<InflectionDesc>::const_iterator it = v.begin();
- it != v.end(); it++)
+ resultPages->setUpdatesEnabled(false);
+ std::string prevUTF8Infinitive, prevTemplateName; /* Remember found word
+ to avoid conjugating again */
+
+ for (std::vector<InflectionDesc>::const_iterator it = infles.begin();
+ it != infles.end(); it++)
{
const InflectionDesc &d = *it;
+
+#ifndef QT_NO_DEBUG
+ qDebug() << ">> Infinitive " << d.infinitive.c_str();
+ qDebug() << " Template " << d.templateName.c_str();
+#endif
+ /* If this infinitive has been conjugated, we skip to the next infinitive */
+ if (d.infinitive == prevUTF8Infinitive && d.templateName == prevTemplateName) {
+ continue;
+ }
+ /* FIXME:
+ * In original source (Verbiste), this checking is done later,
+ * after getConjugation(). I place it here to avoid calling again
+ * multitimes getConjugation(), which is very slow.
+ * We need to test more to see which place is more correct.
+ */
+
VVVS conjug;
getConjugation(freVerbDic, d.infinitive, d.templateName, conjug, includePronouns);
}
std::string utf8Infinitive = conjug[0][0][0];
- if (utf8Infinitive == prevUTF8Infinitive && d.templateName == prevTemplateName)
- // This result is duplicated
- continue;
+#ifndef QT_NO_DEBUG
+ qDebug() << " getConjugation() returns:";
+ qDebug() << " Infinitive " << utf8Infinitive.c_str() << " at " << timer.elapsed();
+ qDebug() << " Template " << d.templateName.c_str();
+#endif
- /* Show on GUI */
+ /* Add result to GUI (not show yet) */
ResultPage *rsp = addResultPage(utf8Infinitive);
- //QString infVerb = QString::fromUtf8(utf8Infinitive.c_str());
- //labVerb->setText(infVerb);
/* Get modes and tenses of the verb */
int i = 0;
for (VVVS::const_iterator t = conjug.begin();
- t != conjug.end(); t++, i++)
- {
+ t != conjug.end(); t++, i++) {
if (i == 1)
i = 4;
else if (i == 11)
int row = i / 4;
int col = i % 4;
- qDebug() << row << col;
std::string utf8TenseName = getTenseNameForTableCell(row, col, isItalian);
if (utf8TenseName.empty())
continue;
- qDebug() << utf8TenseName.c_str();
+ QVBoxLayout *cell = makeResultCell(*t, utf8TenseName, word, freVerbDic);
+ rsp->grid->addLayout(cell, row, col);
}
-
+ /* Show the result on GUI */
+ rsp->packContent();
prevUTF8Infinitive = utf8Infinitive;
prevTemplateName = d.templateName;
}
+ /* Enable the button again */
+ btnLookup->setEnabled(true);
+ btnLookup->setText("");
+ resultPages->setUpdatesEnabled(true);
}
ResultPage* MainWindow::addResultPage(const std::string &labelText)
void MainWindow::clearResults()
{
- wordinput->clear();
- labVerb->clear();
-
while (resultPages->count()) {
int lastIndex = resultPages->count() - 1;
resultPages->widget(lastIndex)->deleteLater();
resultPages->removeTab(lastIndex);
}
+}
+
+void MainWindow::startAgain()
+{
+ wordinput->clear();
+ clearResults();
wordinput->setFocus();
+ btnLookup->setEnabled(true);
+}
+
+QVBoxLayout* MainWindow::makeResultCell(const VVS &tenseIterator,
+ const std::string &tenseName,
+ const std::string &inputWord,
+ FrenchVerbDictionary *verbDict)
+{
+ /* Mode & Tense name */
+ QLabel *tenseLabel = new QLabel();
+ tenseLabel->setText(QString::fromUtf8(tenseName.c_str()));
+ tenseLabel->setStyleSheet("QLabel {background-color: #44A51C; "
+ "padding-left: 10px; padding-right: 10px}");
+
+ /* Conjugaison */
+ QVBoxLayout *vbox = new QVBoxLayout();
+ vbox->addWidget(tenseLabel);
+ QVector<QString> persons = qgetConjugates(*verbDict, tenseIterator,inputWord,
+ "<font color='#D20020'>", "</font>");
+ for (int i = 0; i < persons.size(); ++i) {
+ QLabel *lb = new QLabel(persons.at(i));
+ lb->setMargin(4);
+ vbox->addWidget(lb, 1);
+ }
+ return vbox;
}
/**** For ResultPage class ****/
ResultPage::ResultPage()
: page(new QScrollArea),
- table(new QTableWidget)
+ grid(new QGridLayout)
{
}
+void ResultPage::packContent()
+{
+ QWidget *immediate = new QWidget();
+ immediate->setLayout(grid);
+ page->setWidget(immediate);
+}