summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2015-10-11 18:19:20 -0500
committerJohn Fultz <jfultz@wolfram.com>2015-10-11 18:19:20 -0500
commit6339dec22e2190fd341500206c80425593324bdc (patch)
tree56edb08f484d4c917289bb51e3e4765f524b3400
parent69e3dcefb882c743b136df8e5c81b4182b135f6b (diff)
Fix up lexicon dialog box checks.
Get enables and disables right, efficient computation of word counts, etc.
-rw-r--r--data/lexica/csw12.gaddagbin25846356 -> 0 bytes
-rw-r--r--data/lexica/twl06.gaddagbin16811716 -> 0 bytes
-rw-r--r--quacker/lexicondialog.cpp46
-rw-r--r--quacker/lexicondialog.h7
-rw-r--r--quackleio/dawgfactory.cpp5
-rw-r--r--quackleio/dawgfactory.h4
6 files changed, 52 insertions, 10 deletions
diff --git a/data/lexica/csw12.gaddag b/data/lexica/csw12.gaddag
deleted file mode 100644
index 511c99f..0000000
--- a/data/lexica/csw12.gaddag
+++ /dev/null
Binary files differ
diff --git a/data/lexica/twl06.gaddag b/data/lexica/twl06.gaddag
deleted file mode 100644
index db93e2e..0000000
--- a/data/lexica/twl06.gaddag
+++ /dev/null
Binary files differ
diff --git a/quacker/lexicondialog.cpp b/quacker/lexicondialog.cpp
index e11ae41..f92efb1 100644
--- a/quacker/lexicondialog.cpp
+++ b/quacker/lexicondialog.cpp
@@ -27,6 +27,18 @@
#include "geometry.h"
#include "quackleio/dawgfactory.h"
+class FileNameValidator : public QValidator
+{
+public:
+ virtual State validate(QString &input, int &pos) const
+ {
+ for (QString::ConstIterator i = input.begin(); i != input.end(); ++i)
+ if (*i == '/' || *i == '?' || *i == '\\' || *i == '*')
+ return Invalid;
+ return Acceptable;
+ }
+};
+
LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDialog(parent),
m_wordFactory(NULL)
{
@@ -37,6 +49,7 @@ LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDi
// construct the UI elements
m_lexiconName = new QLineEdit();
m_alphabetCombo = new QComboBox();
+ m_fileNameValidator = new FileNameValidator();
m_addWordsFromFile = new QPushButton(tr("Add words from &file..."));
m_clearAllWords = new QPushButton(tr("Clear &words and start again"));
@@ -92,7 +105,7 @@ LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDi
m_saveChanges->setDefault(true);
// hook up signals and slots
- // connect(m_lexiconName, SIGNAL(textEdited(const QString &)), this, SLOT(parametersChanged(const QString &)));
+ connect(m_lexiconName, SIGNAL(textEdited(const QString &)), this, SLOT(parametersChanged(const QString &)));
connect(m_addWordsFromFile, SIGNAL(clicked()), this, SLOT(addWordsFromFile()));
connect(m_saveChanges, SIGNAL(clicked()), this, SLOT(accept()));
connect(m_cancel, SIGNAL(clicked()), this, SLOT(reject()));
@@ -109,6 +122,9 @@ LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDi
if (!originalName.isEmpty())
dawgFullFileName = QString::fromStdString(Quackle::LexiconParameters::findDictionaryFile(dawgFileName));
+ m_lexiconName->setValidator(m_fileNameValidator);
+ m_lexiconName->setText(m_originalName);
+
if (!dawgFullFileName.isEmpty())
{
m_deleteLexicon->setEnabled(Quackle::LexiconParameters::hasUserDictionaryFile(dawgFileName));
@@ -117,12 +133,13 @@ LexiconDialog::LexiconDialog(QWidget *parent, const QString &originalName) : QDi
else
m_deleteLexicon->setEnabled(false);
- updateLexiconInformation();
+ updateLexiconInformation(true);
}
LexiconDialog::~LexiconDialog()
{
-
+ delete m_fileNameValidator;
+ delete m_wordFactory;
}
void LexiconDialog::deleteLexicon()
@@ -233,15 +250,30 @@ void LexiconDialog::accept()
QDialog::accept();
}
-void LexiconDialog::updateLexiconInformation()
+void LexiconDialog::updateLexiconInformation(bool firstTime)
{
- int wordCount = m_wordFactory ? m_wordFactory->wordCount() : 0;
- QByteArray hash = (m_wordFactory && wordCount) ? QByteArray(m_wordFactory->hashBytes(), 16).toHex() : "";
+ QByteArray hash = m_wordFactory ? QByteArray(m_wordFactory->hashBytes(), 16).toHex() : "";
QString text;
QString lengthText;
+
+ // only recompute word count when the dictionary changes
+ if (m_wordFactory && hash != m_previousHash)
+ {
+ m_wordFactory->computeWordCount();
+ m_previousHash = hash;
+ }
+ int wordCount = m_wordFactory ? m_wordFactory->wordCount() : 0;
+ if (wordCount == 0)
+ {
+ delete m_wordFactory;
+ m_wordFactory = NULL;
+ }
if (m_wordFactory)
lengthText = QString::fromStdString(m_wordFactory->letterCountString());
+ if (firstTime)
+ m_originalHash = hash;
+
text.append(tr("File name: "));
text.append(tr("\n\nFile size: "));
text.append(tr("\n\nWord count: "));
@@ -252,4 +284,6 @@ void LexiconDialog::updateLexiconInformation()
text.append(hash.left(8));
m_lexiconInformation->setText(text);
+
+ m_saveChanges->setEnabled(hash != m_originalHash && !m_lexiconName->text().isEmpty());
}
diff --git a/quacker/lexicondialog.h b/quacker/lexicondialog.h
index 39cd546..fa80ec1 100644
--- a/quacker/lexicondialog.h
+++ b/quacker/lexicondialog.h
@@ -34,6 +34,7 @@ class QLabel;
class QLineEdit;
class QPushButton;
class DawgFactory;
+class FileNameValidator;
class LexiconDialog : public QDialog
{
@@ -44,9 +45,10 @@ public:
~LexiconDialog();
virtual void accept();
- void updateLexiconInformation();
+ void updateLexiconInformation(bool firstTime = false);
protected slots:
+ void parametersChanged(const QString &) { updateLexiconInformation(); };
void deleteLexicon();
void addWordsFromFile();
void alphabetChanged(const QString &);
@@ -62,6 +64,7 @@ private:
QPushButton *m_addWordsFromFile;
QPushButton *m_clearAllWords;
QLabel *m_lexiconInformation;
+ FileNameValidator * m_fileNameValidator;
QPushButton *m_saveChanges;
QPushButton *m_cancel;
@@ -69,6 +72,8 @@ private:
QString m_originalName;
QString m_alphabetFileName;
+ QByteArray m_originalHash;
+ QByteArray m_previousHash;
DawgFactory *m_wordFactory;
};
diff --git a/quackleio/dawgfactory.cpp b/quackleio/dawgfactory.cpp
index 362dfdc..869ef8e 100644
--- a/quackleio/dawgfactory.cpp
+++ b/quackleio/dawgfactory.cpp
@@ -40,6 +40,7 @@ DawgFactory::DawgFactory(const QString &alphabetFile)
m_root.lastchild = true;
m_hash.int32ptr[0] = m_hash.int32ptr[1] = m_hash.int32ptr[2] = m_hash.int32ptr[3] = 0;
+ m_encodableWords = m_unencodableWords = m_duplicateWords = m_wordCount = 0;
}
DawgFactory::~DawgFactory()
@@ -186,10 +187,10 @@ void DawgFactory::writeIndex(const UVString& filename)
}
}
-int DawgFactory::wordCount() const
+void DawgFactory::computeWordCount() const
{
m_countsByLength.resize(0);
- return m_root.wordCount(0, m_countsByLength);
+ m_wordCount = m_root.wordCount(0, m_countsByLength);
}
string DawgFactory::letterCountString() const
diff --git a/quackleio/dawgfactory.h b/quackleio/dawgfactory.h
index 8dd6e03..5872dc3 100644
--- a/quackleio/dawgfactory.h
+++ b/quackleio/dawgfactory.h
@@ -30,7 +30,8 @@ public:
DawgFactory(const QString &alphabetFile);
~DawgFactory();
- int wordCount() const;
+ void computeWordCount() const;
+ int wordCount() const { return m_wordCount; };
string letterCountString() const;
int nodeCount() const { return m_nodelist.size(); };
int encodableWords() const { return m_encodableWords; };
@@ -78,6 +79,7 @@ private:
int m_unencodableWords;
int m_duplicateWords;
vector< Node* > m_nodelist;
+ mutable int m_wordCount;
mutable vector<unsigned int> m_countsByLength;
Quackle::AlphabetParameters *m_alphas;
Node m_root;