X-Git-Url: http://git.maemo.org/git/?p=mverbiste;a=blobdiff_plain;f=mainwindow.cpp;h=2496c75e1372d4c1d1be428fa1b64cc6b3dc4f5f;hp=31fed0cd617dd7993790e26f7ec1868635d1d4b8;hb=5193e53ba89b72f9760af7c8a02aab2f645d9c08;hpb=3363c69bdbc38494b966567f4dbf8384402e5877 diff --git a/mainwindow.cpp b/mainwindow.cpp index 31fed0c..2496c75 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -1,5 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" +#include "gui/conjugation.h" #include @@ -12,27 +13,22 @@ MainWindow::MainWindow(QWidget *parent) #endif ui->setupUi(this); setupcodedUI(); - initverbiste(); } void MainWindow::setupcodedUI() { cent = centralWidget(); - //mlayout = qobject_cast(cent->layout()); mlayout = new QVBoxLayout; btlayout = new QHBoxLayout; - QScrollArea *scrollArea = new QScrollArea; - scrollArea->setBackgroundRole(QPalette::Dark); - mlayout->addWidget(scrollArea); + resultPages = new QTabWidget; + resultPages->setTabPosition(QTabWidget::West); + mlayout->addWidget(resultPages); 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")); @@ -42,16 +38,32 @@ void MainWindow::setupcodedUI() cent->setLayout(mlayout); // Clear the word input when Clear button is tapped - QObject::connect(btnClear, SIGNAL(clicked()), wordinput, SLOT(clear())); - QObject::connect(btnClear, SIGNAL(clicked()), labVerb, SLOT(clear())); + connect(btnClear, SIGNAL(clicked()), this, SLOT(startAgain())); + + connect(wordinput, SIGNAL(returnPressed()), this, SLOT(startLookup())); + connect(btnLookup, SIGNAL(clicked()), this, SLOT(startLookup())); + + /* Icon */ + QIcon *icon = new QIcon(); + icon->addFile(ICONFILE); + setWindowIcon(*icon); + + /* About Dialog */ + aboutDialog = new AboutDialog(ICONFILE, QString("MVerbiste v%1").arg(VERSTR)); + aboutDialog->setIntro(trUtf8("A French conjugation utility for Maemo and MeeGo")); + aboutDialog->addAuthor(QString::fromUtf8("Nguyễn Hồng Quân \nPierre Sarrazin ")); - QObject::connect(wordinput, SIGNAL(returnPressed()), this, SLOT(startLookup())); - QObject::connect(btnLookup, SIGNAL(clicked()), this, SLOT(startLookup())); + /* Menu */ + QMenu *menu = ui->menuBar->addMenu(tr("Top menu")); + QAction *act_about = menu->addAction(tr("About")); + connect(act_about, SIGNAL(triggered()), aboutDialog, SLOT(show())); } MainWindow::~MainWindow() { delete ui; + delete freVerbDic; + delete aboutDialog; } void MainWindow::setOrientation(ScreenOrientation orientation) @@ -106,35 +118,202 @@ void MainWindow::showExpanded() #else show(); #endif + initverbiste(); + wordinput->setFocus(); } -void MainWindow::startLookup() +void MainWindow::initverbiste() { - const std::set *templateSet = NULL; - QString input = wordinput->text(); - labVerb->setText(input); + langCode = "fr"; + FrenchVerbDictionary::Language lang = FrenchVerbDictionary::parseLanguageCode(langCode); if (lang != FrenchVerbDictionary::FRENCH) { - //wordinput->setText(QString("Fr")); + // TODO: If lang code is not supported? + } + + /* 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(); + /* - std::string conjFileName, verbsFileName; - FrenchVerbDictionary::getXMLFilenames(conjFileName, verbsFileName, lang); - */ - freVerbDic = new FrenchVerbDictionary(false); - const std::string word = input.toUtf8().constData(); - templateSet = &freVerbDic->getVerbTemplateSet(word); - for (std::set::const_iterator it = templateSet->begin(); - it != templateSet->end(); ++it) - { - const std::string &tname = *it; - - FrenchVerbDictionary::getRadical(word, tname); - } + * For each possible deconjugation, take the infinitive form and + * obtain its complete conjugation. + */ + std::vector infles; + bool includePronouns = FALSE; // TODO: Will get this value from external + bool isItalian = FALSE; // TODO: Will get this value from external + +#ifndef QT_NO_DEBUG + timer.start(); + qDebug() << "Start " << timer.elapsed(); +#endif + freVerbDic->deconjugate(word, infles); + + resultPages->setUpdatesEnabled(false); + std::string prevUTF8Infinitive, prevTemplateName; /* Remember found word + to avoid conjugating again */ + + for (std::vector::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; +#ifndef QT_NO_DEBUG + qDebug() << " START getConjugation " << timer.elapsed(); +#endif + getConjugation(freVerbDic, d.infinitive, d.templateName, conjug, + #ifndef QT_NO_DEBUG + timer, + #endif + includePronouns); + +#ifndef QT_NO_DEBUG + qDebug() << " getConjugation() returns: " << timer.elapsed(); +#endif + + if (conjug.size() == 0 // if no tenses + || conjug[0].size() == 0 // if no infinitive tense + || conjug[0][0].size() == 0 // if no person in inf. tense + || conjug[0][0][0].empty()) // if infinitive string empty + { + continue; + } + + std::string utf8Infinitive = conjug[0][0][0]; +#ifndef QT_NO_DEBUG + qDebug() << " Infinitive " << utf8Infinitive.c_str(); + qDebug() << " Template " << d.templateName.c_str(); +#endif + + /* Add result to GUI (not show yet) */ + ResultPage *rsp = addResultPage(utf8Infinitive); + + /* Get modes and tenses of the verb */ + int i = 0; + for (VVVS::const_iterator t = conjug.begin(); + t != conjug.end(); t++, i++) { + if (i == 1) + i = 4; + else if (i == 11) + i = 12; + assert(i >= 0 && i < 16); + + int row = i / 4; + int col = i % 4; + + std::string utf8TenseName = getTenseNameForTableCell(row, col, isItalian); + if (utf8TenseName.empty()) + continue; + + 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); } -void MainWindow::initverbiste() +ResultPage* MainWindow::addResultPage(const std::string &labelText) +{ + ResultPage *rp = new ResultPage(); + QString label = QString::fromUtf8(labelText.c_str()); + resultPages->addTab(rp->page, label); + return rp; +} + +void MainWindow::clearResults() +{ + 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 persons = qgetConjugates(*verbDict, tenseIterator,inputWord, + "", ""); + 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), + grid(new QGridLayout) { - langCode = "fr"; } + +void ResultPage::packContent() +{ + QWidget *immediate = new QWidget(); + immediate->setLayout(grid); + page->setWidget(immediate); +} +