summaryrefslogtreecommitdiff
path: root/quacker
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2015-09-28 13:00:57 -0500
committerJohn Fultz <jfultz@wolfram.com>2015-09-28 13:00:57 -0500
commit81554a201cc5e0748110add6eca05cc16c18850c (patch)
tree75fcfd2b3c32befec1ec31435b731f84c9b48646 /quacker
parent03b9132b3f540bfb3713400774a9bfb832b200b2 (diff)
Now able to load text and dawg files.
Words are loaded and hashed. Duplicates are discovered. Alphabets are dealt with. Merging of multiple word lists works. This is good stuff. Saving the resulting dictionaries has not been tried, yet, and the gui code for saving needs to be finished off, yet.
Diffstat (limited to 'quacker')
-rw-r--r--quacker/lexicondialog.cpp71
-rw-r--r--quacker/lexicondialog.h5
2 files changed, 70 insertions, 6 deletions
diff --git a/quacker/lexicondialog.cpp b/quacker/lexicondialog.cpp
index f9c6399..a7566c6 100644
--- a/quacker/lexicondialog.cpp
+++ b/quacker/lexicondialog.cpp
@@ -97,10 +97,12 @@ LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDi
connect(m_saveChanges, SIGNAL(clicked()), this, SLOT(accept()));
connect(m_cancel, SIGNAL(clicked()), this, SLOT(reject()));
connect(m_deleteLexicon, SIGNAL(clicked()), this, SLOT(deleteLexicon()));
-
+ connect(m_alphabetCombo, SIGNAL(activated(const QString &)), this, SLOT(alphabetChanged(const QString &)));
+
setWindowTitle(tr("Configure Lexicon - Quackle"));
Settings::populateComboFromFilenames(m_alphabetCombo, "alphabets", "");
+ alphabetChanged(m_alphabetCombo->currentText());
updateLexiconInformation();
// sync game board with control states and draw board
@@ -113,25 +115,49 @@ LexiconDialog::~LexiconDialog()
void LexiconDialog::deleteLexicon()
{
-
+ delete m_wordFactory;
+ m_wordFactory = NULL;
+ updateLexiconInformation();
}
void LexiconDialog::addWordsFromFile()
{
QFileDialog browser(this, tr("Choose a file containing words to be added to the lexicon..."));
+ QStringList filters;
+ filters << "Dictionary files (*.txt *.dawg *.raw)"
+ << "All files (*.*)";
+ browser.setNameFilters(filters);
+ browser.setFileMode(QFileDialog::ExistingFiles);
+ browser.exec();
+
+ QStringList files = browser.selectedFiles();
+ for (QList<QString>::const_iterator it = files.begin(); it != files.end(); it++)
+ {
+ if (it->endsWith(".dawg", Qt::CaseInsensitive))
+ addWordsFromDawgFile(*it, m_alphabetCombo->currentText());
+ else
+ addWordsFromTextFile(*it, m_alphabetCombo->currentText());
+ }
+ updateLexiconInformation();
}
-void LexiconDialog::addWordsFromDawg(const string &dawgfile, const string &alphabetfile)
+void LexiconDialog::alphabetChanged(const QString &alphabet)
{
delete m_wordFactory;
m_wordFactory = NULL;
+ updateLexiconInformation();
+ m_alphabetFileName = QString::fromStdString(AlphabetParameters::findAlphabetFile(QuackleIO::Util::qstringToStdString(alphabet)));
+}
+void LexiconDialog::addWordsFromDawgFile(const QString &dawgfile, const QString &alphabetfile)
+{
+ if (!m_wordFactory)
+ m_wordFactory = new DawgFactory(m_alphabetFileName);
LexiconParameters lexParams;
- lexParams.loadDawg(dawgfile);
+ lexParams.loadDawg(QuackleIO::Util::qstringToStdString(dawgfile));
if (!lexParams.hasDawg())
return;
- m_wordFactory = new DawgFactory(alphabetfile);
Quackle::LetterString word;
addWordsFromDawgRecursive(lexParams, word, 1);
@@ -159,6 +185,37 @@ void LexiconDialog::addWordsFromDawgRecursive(const LexiconParameters &lexParams
} while (!lastchild);
}
+void LexiconDialog::addWordsFromTextFile(const QString &textFile, const QString &alphabetfile)
+{
+ if (!m_wordFactory)
+ m_wordFactory = new DawgFactory(m_alphabetFileName);
+
+ QFile file(textFile);
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ return;
+
+ QTextStream stream(&file);
+ stream.setCodec("UTF-8");
+ QString word;
+ while (!stream.atEnd())
+ {
+ stream >> word;
+ word = word.trimmed().toUpper();
+ if (word.isEmpty())
+ continue;
+ QChar firstChar = word[0];
+ if (firstChar < 'A')
+ continue; // allows the usage of most punctuation characters as comments
+ int playability = 0;
+ for (int i = word.size() - 1; i > 0; i--)
+ {
+ if (word[i].isDigit())
+ playability = playability * 10 + word[i].digitValue();
+ }
+ m_wordFactory->pushWord(QuackleIO::Util::qstringToString(word), true, playability);
+ }
+}
+
void LexiconDialog::accept()
{
QDialog::accept();
@@ -166,11 +223,15 @@ void LexiconDialog::accept()
void LexiconDialog::updateLexiconInformation()
{
+ int wordCount = m_wordFactory ? m_wordFactory->wordCount() : 0;
+ QByteArray hash = m_wordFactory ? QByteArray(m_wordFactory->hashBytes(), 16).toHex() : "";
QString text;
text.append(tr("File name: "));
text.append(tr("\n\nFile size: "));
text.append(tr("\n\nWord count: "));
+ text.append(QString("%L1").arg(wordCount));
text.append(tr("\n\nLexicon hash: "));
+ text.append(hash);
m_lexiconInformation->setText(text);
}
diff --git a/quacker/lexicondialog.h b/quacker/lexicondialog.h
index 573d48b..4df6138 100644
--- a/quacker/lexicondialog.h
+++ b/quacker/lexicondialog.h
@@ -49,10 +49,12 @@ public:
protected slots:
void deleteLexicon();
void addWordsFromFile();
+ void alphabetChanged(const QString &);
protected:
- void addWordsFromDawg(const string &dawgfile, const string &alphabetfile);
+ void addWordsFromDawgFile(const QString &dawgfile, const QString &alphabetfile);
void addWordsFromDawgRecursive(const LexiconParameters &lexParams, Quackle::LetterString &word, int index);
+ void addWordsFromTextFile(const QString &textFile, const QString &alphabetfile);
private:
QLineEdit *m_lexiconName;
@@ -66,6 +68,7 @@ private:
QPushButton *m_deleteLexicon;
QString m_originalName;
+ QString m_alphabetFileName;
DawgFactory *m_wordFactory;
};