Hello community,

here is the log from the commit of package parley for openSUSE:Factory checked 
in at 2016-08-31 00:09:13
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/parley (Old)
 and      /work/SRC/openSUSE:Factory/.parley.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "parley"

Changes:
--------
--- /work/SRC/openSUSE:Factory/parley/parley.changes    2016-07-24 
19:49:37.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.parley.new/parley.changes       2016-08-31 
00:09:18.000000000 +0200
@@ -1,0 +2,16 @@
+Fri Aug 12 10:31:47 UTC 2016 - tittiatc...@gmail.com
+
+- Update to KDE Applications 16.08.0
+   * KDE Applications 16.08.0
+   * https://www.kde.org/announcements/announce-applications-16.08.0.php
+
+
+-------------------------------------------------------------------
+Mon Aug  8 15:53:30 UTC 2016 - tittiatc...@gmail.com
+
+- Update to KDE Applications 16.07.90
+   * KDE Applications 16.07.90 (16.08-RC)
+   * https://www.kde.org/announcements/announce-applications-16.07.90.php
+
+
+-------------------------------------------------------------------

Old:
----
  parley-16.04.3.tar.xz

New:
----
  parley-16.08.0.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ parley.spec ++++++
--- /var/tmp/diff_new_pack.0jTIJ4/_old  2016-08-31 00:09:19.000000000 +0200
+++ /var/tmp/diff_new_pack.0jTIJ4/_new  2016-08-31 00:09:19.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           parley
-Version:        16.04.3
+Version:        16.08.0
 Release:        0
 Summary:        Vocabulary Trainer
 License:        GPL-2.0+

++++++ parley-16.04.3.tar.xz -> parley-16.08.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/CMakeLists.txt 
new/parley-16.08.0/CMakeLists.txt
--- old/parley-16.04.3/CMakeLists.txt   2016-06-18 18:29:44.000000000 +0200
+++ new/parley-16.08.0/CMakeLists.txt   2016-07-28 15:11:23.000000000 +0200
@@ -13,6 +13,7 @@
 
 #Allows QString concatenation to use a single memory allocation per source 
line.
 add_definitions(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS)
+add_definitions(-DQT_NO_URL_CAST_FROM_STRING)
 
 set(REQUIRED_QT_VERSION "5.2")
 find_package(Qt5 ${REQUIRED_QT_VERSION} CONFIG REQUIRED
@@ -22,7 +23,7 @@
   Multimedia
 )
 
-find_package(KF5 5.15 MODULE REQUIRED COMPONENTS
+find_package(KF5 5.22 MODULE REQUIRED COMPONENTS
   DocTools  #to produce the docbook
   CoreAddons
   Config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/autotests/parleyunittestutilities.cpp 
new/parley-16.08.0/autotests/parleyunittestutilities.cpp
--- old/parley-16.04.3/autotests/parleyunittestutilities.cpp    2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/autotests/parleyunittestutilities.cpp    2016-07-28 
15:11:23.000000000 +0200
@@ -51,7 +51,7 @@
     doc->setAuthor( author );
     doc->appendIdentifier( lang0 );
     doc->setGenerator(generator);
-    doc->saveAs(this->fileName(), KEduVocDocument::Kvtml);
+    doc->saveAs(QUrl::fromLocalFile(fileName()), KEduVocDocument::Kvtml);
     delete doc;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/plugins/wiktionary/wiktionary_sound.py 
new/parley-16.08.0/plugins/wiktionary/wiktionary_sound.py
--- old/parley-16.04.3/plugins/wiktionary/wiktionary_sound.py   2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/plugins/wiktionary/wiktionary_sound.py   2016-07-28 
15:11:23.000000000 +0200
@@ -17,9 +17,19 @@
 from os import path
 import string
 import Kross
+import urllib
 
 T = Kross.module("kdetranslation")
 
+# fetch http_content
+def fetch_http_content(url, params, method):
+    params = urllib.urlencode(params)
+    if method=='POST':
+        f = urllib.urlopen(url, params)
+    else:
+        f = urllib.urlopen(url+'?'+params)
+    return (f.read(), f.code)
+
 # Connected to the action menu
 def fetchSound():
     print "fetching sound"
@@ -95,8 +105,16 @@
     filename = filesdir + wikiObject.name.encode('utf-8')
     print filename
     saveas = open(filename,'w')
-    remote = wikiObject.download()
-    saveas.write(remote.read())
+#   remote = wikiObject.download()
+#   workaround: because download method results with http response code 404
+    content, response_code = fetch_http_content(
+                              wikiObject.imageinfo['url'],
+                              {},
+                              'GET'
+                         )
+    print 'HTTP Response code: ', response_code
+    if(response_code == 200):
+           saveas.write(content)
     saveas.close()
     return filename
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/collection/collection.cpp 
new/parley-16.08.0/src/collection/collection.cpp
--- old/parley-16.04.3/src/collection/collection.cpp    2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/collection/collection.cpp    2016-07-28 
15:11:23.000000000 +0200
@@ -15,59 +15,19 @@
 
 #include "collection.h"
 
-#include <QTimer>
-#include <QLocale>
-
-// KDE
-#include <KEMailSettings>
-#include <klocalizedstring.h>
-//#include <KLocale>
-
 // KEduVocDocument library
 #include <keduvocdocument.h>
-#include <keduvoclesson.h>
-#include <keduvocleitnerbox.h>
-#include <keduvocexpression.h>
-#include <keduvocwordtype.h>
 
 // Parley
-#include "../config-parley.h"
 #include "../utils.h"
-#include "prefs.h"
 #include "entryfilter.h"
 
 
 // ----------------------------------------------------------------
 
-
-void fetchGrammar(KEduVocDocument* doc, int languageIndex)
-{
-    QString locale = doc->identifier(languageIndex).locale();
-
-    QUrl location(QStringLiteral("http://edu.kde.org/parley/locale/";) + 
locale.split('_').at(0).toLower() + QStringLiteral(".kvtml"));
-
-    KEduVocDocument grammarDoc;
-    if (grammarDoc.open(location) == KEduVocDocument::NoError) {
-        
doc->identifier(languageIndex).setArticle(grammarDoc.identifier(0).article());
-        
doc->identifier(languageIndex).setPersonalPronouns(grammarDoc.identifier(0).personalPronouns());
-        // @todo        
m_doc->identifier(index).setDeclension(grammarDoc.identifier(0).declension());
-        
doc->identifier(languageIndex).setTenseList(grammarDoc.identifier(0).tenseList());
-    } else {
-        qDebug() << "Download of " << location.url() << " failed.";
-    }
-}
-
-Collection::Collection(KEduVocDocument *doc, QObject* parent)
-    : QObject(parent)
-    , m_doc(doc)
-    , m_backupTimer(0)
-{
-}
-
 Collection::Collection(QUrl *url, QObject* parent)
     : QObject(parent)
     , m_doc(new KEduVocDocument(this))
-    , m_backupTimer(0)
 {
     // We ignore file locks here because we open the file for readonly
     // purposes only.
@@ -76,52 +36,13 @@
 
 Collection::~Collection()
 {
-    close();
-
-    // NOTE: No saving here because at this point the Collection class is a
-    //       read-only wrapper around KEduVocDocument.
-    if (m_doc) {
-        emit documentChanged(0);
-        m_doc->deleteLater();
-        m_doc = 0;
-    }
-
-    delete m_backupTimer;
 }
 
-
 KEduVocDocument *Collection::eduVocDocument()
 {
-    // If there is no present vocabulary document, create an empty one.
-    if (!m_doc) {
-        m_doc = new KEduVocDocument();
-    }
-
     return m_doc;
 }
 
-void Collection::setTitle(const QString& title)
-{
-    m_doc->setTitle(title);
-}
-
-
-
-void Collection::enableAutoBackup(bool enable)
-{
-    if (!enable) {
-        if (m_backupTimer) {
-            m_backupTimer->stop();
-        }
-    } else {
-        if (!m_backupTimer) {
-            m_backupTimer = new QTimer(this);
-            connect(m_backupTimer, SIGNAL(timeout()), this, SLOT(save()));
-        }
-        m_backupTimer->start(Prefs::backupTime() * 60 * 1000);
-    }
-}
-
 void Collection::numDueWords(WordCount &wc)
 {
     // Get the entries from the collection. Cache them for future use.
@@ -131,7 +52,6 @@
     }
 
     // Count the number of words due for each grade level.
-    // TODO: Also take into account pregrades.
     foreach (const TestEntry *entry, m_allTestEntries) {
        int languageTo = entry->languageTo();
        KEduVocExpression *exp = entry->entry();
@@ -155,81 +75,3 @@
     //kDebug() << m_doc->title() << wc.totalWords << "entries";
 }
 
-
-// Slots
-
-
-void Collection::close()
-{
-    enableAutoBackup(false);
-    m_doc->close();
-}
-
-
-// ----------------------------------------------------------------
-//                         private functions
-
-
-void Collection::setDefaultDocumentProperties(KEduVocDocument *doc)
-{
-    KEMailSettings emailSettings;
-    emailSettings.setProfile(emailSettings.defaultProfileName());
-    doc->setAuthor(emailSettings.getSetting(KEMailSettings::RealName));
-    
doc->setAuthorContact(emailSettings.getSetting(KEMailSettings::EmailAddress));
-
-    doc->setLicense(i18n("Public Domain"));
-    doc->setCategory(i18n("Languages"));
-    
-    QString locale = QLocale().name();
-
-    doc->appendIdentifier();
-    doc->appendIdentifier();
-    doc->identifier(0).setName(QLocale(locale).nativeLanguageName());
-    doc->identifier(0).setLocale(locale);
-    doc->identifier(1).setName(i18n("A Second Language"));
-    doc->identifier(1).setLocale(locale);
-
-    KEduVocLesson* lesson = new KEduVocLesson(i18n("Lesson 1"), doc->lesson());
-    doc->lesson()->appendChildContainer(lesson);
-
-    // add some entries
-    for (int i = 0; i < 15 ; i++) {
-        lesson->appendEntry(new KEduVocExpression());
-    }
-
-    doc->setModified(false);
-}
-
-void Collection::initializeDefaultGrammar(KEduVocDocument *doc)
-{
-    KEduVocWordType *root = doc->wordTypeContainer();
-    KEduVocWordType *noun = new KEduVocWordType(i18n("Noun"), root);
-    noun->setWordType(KEduVocWordFlag::Noun);
-    root->appendChildContainer(noun);
-
-    KEduVocWordType *nounChild = new KEduVocWordType(i18n("Masculine"), noun);
-    nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Masculine);
-    noun->appendChildContainer(nounChild);
-    nounChild = new KEduVocWordType(i18n("Feminine"), noun);
-    nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Feminine);
-    noun->appendChildContainer(nounChild);
-    nounChild = new KEduVocWordType(i18n("Neuter"), noun);
-    nounChild->setWordType(KEduVocWordFlag::Noun | KEduVocWordFlag::Neuter);
-    noun->appendChildContainer(nounChild);
-
-    KEduVocWordType *verb = new KEduVocWordType(i18n("Verb"), root);
-    verb->setWordType(KEduVocWordFlag::Verb);
-    root->appendChildContainer(verb);
-
-    KEduVocWordType *adjective = new KEduVocWordType(i18n("Adjective"), root);
-    adjective->setWordType(KEduVocWordFlag::Adjective);
-    root->appendChildContainer(adjective);
-
-    KEduVocWordType *adverb = new KEduVocWordType(i18n("Adverb"), root);
-    adverb->setWordType(KEduVocWordFlag::Adverb);
-    root->appendChildContainer(adverb);
-
-    KEduVocWordType *conjunction = new KEduVocWordType(i18n("Conjunction"), 
root);
-    conjunction->setWordType(KEduVocWordFlag::Conjunction);
-    root->appendChildContainer(conjunction);
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/collection/collection.h 
new/parley-16.08.0/src/collection/collection.h
--- old/parley-16.04.3/src/collection/collection.h      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/collection/collection.h      2016-07-28 
15:11:23.000000000 +0200
@@ -27,7 +27,6 @@
 #include "testentry.h"
 
 
-class QTimer;
 class WordCount;
 
 
@@ -36,43 +35,15 @@
     Q_OBJECT
 
 public:
-    Collection(KEduVocDocument *doc, QObject* parent = 0);
     Collection(QUrl *url, QObject* parent = 0);
     ~Collection();
 
-
     KEduVocDocument *eduVocDocument();
-
-    void setTitle(const QString& title);
-
     void numDueWords(WordCount &wc);
 
-
-    /** Enable/disable the timed auto backup
-     */
-    void enableAutoBackup(bool enable);
-
-public Q_SLOTS:
-
-    /** close the document*/
-    void close();
-
-Q_SIGNALS:
-    /** Emitted when the document pointer is changed.
-     @todo Stop using documentChanged(0) as a replacement for destoyed in 
editor classes.**/
-    void documentChanged(KEduVocDocument *newDocument);
-    void languagesChanged();
-    void statesNeedSaving();
-
-private:
-    void initializeDefaultGrammar(KEduVocDocument *doc);
-    void setDefaultDocumentProperties(KEduVocDocument *doc);
-
  private:
     // The contents of the document
     KEduVocDocument *m_doc;
-
-    QTimer           *m_backupTimer; // Timer for next autosave
     QList<TestEntry*> m_allTestEntries;
 
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/collection/entryfilter.cpp 
new/parley-16.08.0/src/collection/entryfilter.cpp
--- old/parley-16.04.3/src/collection/entryfilter.cpp   2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/collection/entryfilter.cpp   2016-07-28 
15:11:23.000000000 +0200
@@ -335,9 +335,9 @@
 {
     foreach(const QString & tense, translation->conjugationTenses()) {
         if (m_tenses.contains(tense)) {
-            QList<KEduVocWordFlags> pronouns = 
translation->conjugation(tense).keys();
+            QList<KEduVocWordFlags> pronouns = 
translation->getConjugation(tense).keys();
             foreach(const KEduVocWordFlags & pronoun, pronouns) {
-                KEduVocText grade = 
translation->conjugation(tense).conjugation(pronoun);
+                KEduVocText grade = 
translation->getConjugation(tense).conjugation(pronoun);
                 if (!isBlocked(&(grade))) {
                     // just need to find any form that is not blocked for 
generating test entries
                     // exact filtering is done later in conjugationTestEntries
@@ -523,7 +523,7 @@
             QSet<QString> practice_tenses = QSet<QString>::fromList(m_tenses);
             QSet<QString> existing_tenses;
             foreach(const QString & tense, translation->conjugationTenses()) {
-                if (!translation->conjugation(tense).isEmpty()) {
+                if (!translation->getConjugation(tense).isEmpty()) {
                     existing_tenses << tense;
                 }
             }
@@ -563,7 +563,7 @@
                 if (!m_tenses.contains(tense)) {
                     continue;
                 }
-                KEduVocConjugation& conjugation = 
entry->translation(m_toTranslation)->conjugation(tense);
+                KEduVocConjugation conjugation = 
entry->translation(m_toTranslation)->getConjugation(tense);
                 if (conjugation.isEmpty()) {
                     continue;
                 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/dashboard/barwidget.cpp 
new/parley-16.08.0/src/dashboard/barwidget.cpp
--- old/parley-16.04.3/src/dashboard/barwidget.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/dashboard/barwidget.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -70,7 +70,7 @@
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
     const int legendWidth = COLLWIDTH - 10;
-    const int legendHeight = 20;
+    const int legendHeight = 45;
     const int legendOffsetY = 0;
     const int legendOffsetX = 0;
     //const int alphaValueIncrement = 35;
@@ -133,10 +133,10 @@
     //QPen pen(QColor(0, 0, 0));
     painter.setPen(pen);
     if (m_percentageCompleted < 100) {
-        painter.drawText(0, 0, legendWidth, 20, Qt::AlignCenter,
+        painter.drawText(0, 0, legendWidth, legendHeight, Qt::AlignCenter | 
Qt::TextWordWrap,
                         i18np("%1 word due", "%1 words due", m_totalDueWords));
     }
     else {
-        painter.drawText(0, 0, legendWidth, 20, Qt::AlignCenter, i18n("Fully 
learned"));
+        painter.drawText(0, 0, legendWidth, legendHeight, Qt::AlignCenter | 
Qt::TextWordWrap, i18n("Fully learned"));
     }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/dashboard/collectionwidget.cpp 
new/parley-16.08.0/src/dashboard/collectionwidget.cpp
--- old/parley-16.04.3/src/dashboard/collectionwidget.cpp       2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/dashboard/collectionwidget.cpp       2016-07-28 
15:11:23.000000000 +0200
@@ -36,10 +36,10 @@
 
 
 // Size constants for the collection widgets
-int COLLWIDTH   = 140; // Width in pixels of a collection widget
+int COLLWIDTH   = 155; // Width in pixels of a collection widget
 //int COLLHEIGHT1 = 250; // Height in pixels of a collection widget not yet 
fully learned
-int COLLHEIGHT1 = 150; // Height in pixels of a collection widget not yet 
fully learned
-int COLLHEIGHT2 = 100; // Height in pixels of a collection widget fully learned
+int COLLHEIGHT1 = 175; // Height in pixels of a collection widget not yet 
fully learned
+int COLLHEIGHT2 = 125; // Height in pixels of a collection widget fully learned
 
 
 // ================================================================
@@ -81,20 +81,6 @@
     painter.drawText(2, 1, height() - 2, height() - 1, Qt::AlignCenter, 
QStringLiteral("x"));
 }
 
-
-// ----------------------------------------------------------------
-
-
-static int randInt(int low, int high)
-{
-    // Random number between low and high
-    return qrand() % ((high + 1) - low) + low;
-}
-
-
-// ----------------------------------------------------------------
-
-
 CollectionWidget::CollectionWidget(Collection *collection, WordCount 
*dueWords, QWidget *parent)
     : QWidget(parent)
     , m_collection(collection)
@@ -178,10 +164,13 @@
     }
 
     m_barWidget = new BarWidget(dueWords, this);
-    m_barWidget->setFixedSize(COLLWIDTH - 10, 20);
+    m_barWidget->setFixedSize(COLLWIDTH - 10, 45);
     mainLayout->addWidget(m_barWidget);
     m_practiceButton = new QPushButton(this);
-    m_practiceButton->setStyleSheet(QStringLiteral("QPushButton {border: none; 
margin: 0px; padding: 0px;}"));
+    QString buttonStyleSheet = "QPushButton { border: none; margin: 0px; 
padding: 0px; color: " +
+            palette.color(QPalette::Active, QPalette::ButtonText).name()+ "; 
background-color: " +
+            palette.color(QPalette::Active, QPalette::Button).name() + "; 
border-radius: 3px;}";
+    m_practiceButton->setStyleSheet(buttonStyleSheet);
 
     // buttonLayout is the horizontal layout for the bottom line in the
     // collection widget: delete button, practice button, etc
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/dashboard/dashboard.cpp 
new/parley-16.08.0/src/dashboard/dashboard.cpp
--- old/parley-16.04.3/src/dashboard/dashboard.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/dashboard/dashboard.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -38,14 +38,6 @@
 #include "gradereferencewidget.h"
 
 
-// ----------------------------------------------------------------
-
-static int randInt(int low, int high)
-{
-    // Random number between low and high
-    return qrand() % ((high + 1) - low) + low;
-}
-
 // ================================================================
 //                         class Dashboard
 
@@ -213,7 +205,6 @@
 
         QUrl  url(QUrl::fromLocalFile(urlString));
         Collection *collection = new Collection(&url, this);
-        collection->close(); // We just want to look at it, not own it, so 
release the lock.
 
         WordCount dueWords;
        int percentageCompleted = dueWords.percentageCompleted();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/editor/audiowidget.cpp 
new/parley-16.08.0/src/editor/audiowidget.cpp
--- old/parley-16.04.3/src/editor/audiowidget.cpp       2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/editor/audiowidget.cpp       2016-07-28 
15:11:23.000000000 +0200
@@ -48,7 +48,7 @@
     if (m_entry) {
         recordButton->setEnabled(true);
         audioUrlRequester->setEnabled(true);
-        
audioUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->soundUrl().toLocalFile());
+        
audioUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->soundUrl());
     } else {
         recordButton->setEnabled(false);
         audioUrlRequester->setEnabled(false);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/editor/conjugationwidget.cpp 
new/parley-16.08.0/src/editor/conjugationwidget.cpp
--- old/parley-16.04.3/src/editor/conjugationwidget.cpp 2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/editor/conjugationwidget.cpp 2016-07-28 
15:11:23.000000000 +0200
@@ -78,7 +78,10 @@
 {
     int valueIndex = 
m_conjugationLineEdits.values().indexOf(qobject_cast<QLineEdit*>(sender()));
     int key = m_conjugationLineEdits.keys().value(valueIndex);
-    
m_entry->translation(m_identifier)->conjugation(tenseComboBox->currentText()).setConjugation(text,
 (KEduVocWordFlag::Flags)key);
+    KEduVocTranslation *translation = m_entry->translation(m_identifier);
+    KEduVocConjugation conjugation = 
translation->getConjugation(tenseComboBox->currentText());
+    conjugation.setConjugation(text, (KEduVocWordFlag::Flags)key);
+    translation->setConjugation(tenseComboBox->currentText(), conjugation);
 }
 
 
@@ -92,7 +95,7 @@
 void ConjugationWidget::updateEntries()
 {
     m_lastTenseSelection = tenseComboBox->currentText();
-    KEduVocConjugation& conjugation = 
m_entry->translation(m_identifier)->conjugation(m_lastTenseSelection);
+    KEduVocConjugation conjugation = 
m_entry->translation(m_identifier)->getConjugation(m_lastTenseSelection);
     foreach(KEduVocWordFlags flags, m_conjugationLineEdits.keys()) {
         QString text;
         if (conjugation.keys().contains(flags)) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/editor/imagechooserwidget.cpp 
new/parley-16.08.0/src/editor/imagechooserwidget.cpp
--- old/parley-16.04.3/src/editor/imagechooserwidget.cpp        2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/editor/imagechooserwidget.cpp        2016-07-28 
15:11:23.000000000 +0200
@@ -42,7 +42,7 @@
 
     if (m_entry) {
         setEnabled(true);
-        
imageUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->imageUrl().toLocalFile());
+        
imageUrlRequester->setUrl(m_entry->translation(m_currentTranslation)->imageUrl());
 //         slotImageChanged( 
m_entry->translation(m_currentTranslation)->imageUrl().toLocalFile() );
     } else {
         setEnabled(false);
@@ -52,10 +52,11 @@
     }
 }
 
-void ImageChooserWidget::slotImageChanged(const QString & url)
+void ImageChooserWidget::slotImageChanged(const QString & urlStr)
 {
-    if (!url.isEmpty()) {
-        QPixmap pixmap(url);
+    QUrl url = QUrl::fromUserInput(urlStr);
+    if (!url.isEmpty() && url.isLocalFile()) {
+        QPixmap pixmap(url.toLocalFile());
         imageWidget->setPixmap(pixmap);
     } else {
 //         imageLabel->setText(i18nc("@label image preview is empty", "No 
Image"));
@@ -63,7 +64,7 @@
     }
 
     if (m_entry) {
-        m_entry->translation(m_currentTranslation)->setImageUrl( 
QUrl::fromLocalFile(url));
+        m_entry->translation(m_currentTranslation)->setImageUrl(url);
         foreach(int j, m_entry->translationIndices()) {
             if (m_entry->translation(j)->imageUrl().isEmpty()) {
                 m_entry->translation(j)->setImageUrl(imageUrlRequester->url());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/editor/multiplechoicewidget.cpp 
new/parley-16.08.0/src/editor/multiplechoicewidget.cpp
--- old/parley-16.04.3/src/editor/multiplechoicewidget.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/editor/multiplechoicewidget.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -28,14 +28,16 @@
 
 using namespace Editor;
 
-MultipleChoiceWidget::MultipleChoiceWidget(QWidget *parent) : QWidget(parent)
+MultipleChoiceWidget::MultipleChoiceWidget(QWidget *parent)
+    : QWidget(parent)
+    , m_translation(Q_NULLPTR)
+    , m_choicesModel(new QStringListModel(this))
 {
     setupUi(this);
 
     connect(addChoiceButton, &QPushButton::clicked, this, 
&MultipleChoiceWidget::slotAddChoiceButton);
     connect(removeChoiceButton, &QPushButton::clicked, this, 
&MultipleChoiceWidget::slotRemoveChoiceButton);
 
-    m_choicesModel = new QStringListModel(this);
     multipleChoiceListView->setModel(m_choicesModel);
 
     connect(m_choicesModel, &QStringListModel::dataChanged, this, 
&MultipleChoiceWidget::slotDataChanged);
@@ -47,16 +49,20 @@
 }
 
 
-void MultipleChoiceWidget::slotDataChanged(const QModelIndex & topLeft, const 
QModelIndex & bottomRight)
+void MultipleChoiceWidget::slotDataChanged(const QModelIndex &topLeft, const 
QModelIndex &bottomRight)
 {
     Q_UNUSED(topLeft)
     Q_UNUSED(bottomRight)
-    m_translation->multipleChoice() = m_choicesModel->stringList();
-    removeChoiceButton->setEnabled(m_translation && 
m_translation->multipleChoice().count() > 0);
+    if (m_translation) {
+        m_translation->setMultipleChoice(m_choicesModel->stringList());
+        
removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
+    } else {
+        removeChoiceButton->setEnabled(false);
+    }
 }
 
 
-void MultipleChoiceWidget::setTranslation(KEduVocExpression * entry, int 
translation)
+void MultipleChoiceWidget::setTranslation(KEduVocExpression *entry, int 
translation)
 {
     if (entry) {
         m_translation = entry->translation(translation);
@@ -66,12 +72,12 @@
 
     if (m_translation) {
         setEnabled(true);
-        m_choicesModel->setStringList(m_translation->multipleChoice());
-        removeChoiceButton->setEnabled(m_translation->multipleChoice().count() 
> 0);
+        m_choicesModel->setStringList(m_translation->getMultipleChoice());
+        
removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
     } else {
         setEnabled(false);
     }
-    removeChoiceButton->setEnabled(m_translation && 
m_translation->multipleChoice().count() > 0);
+    removeChoiceButton->setEnabled(m_translation && 
m_translation->getMultipleChoice().count() > 0);
 }
 
 
@@ -94,12 +100,16 @@
     } else {
         m_choicesModel->removeRows(m_choicesModel->rowCount(QModelIndex()) - 
1, 1, QModelIndex());
     }
-    m_translation->multipleChoice() = m_choicesModel->stringList();
-    removeChoiceButton->setEnabled(m_translation && 
m_translation->multipleChoice().count() > 0);
+    if (m_translation) {
+        m_translation->setMultipleChoice(m_choicesModel->stringList());
+        
removeChoiceButton->setEnabled(m_translation->getMultipleChoice().count() > 0);
+    } else {
+        removeChoiceButton->setEnabled(false);
+    }
 }
 
 
-bool MultipleChoiceWidget::eventFilter(QObject * obj, QEvent * event)
+bool MultipleChoiceWidget::eventFilter(QObject *obj, QEvent *event)
 {
     if (obj == multipleChoiceListView) {
         if (event->type() == QEvent::DragEnter) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/editor/multiplechoicewidget.h 
new/parley-16.08.0/src/editor/multiplechoicewidget.h
--- old/parley-16.04.3/src/editor/multiplechoicewidget.h        2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/editor/multiplechoicewidget.h        2016-07-28 
15:11:23.000000000 +0200
@@ -45,19 +45,19 @@
     explicit MultipleChoiceWidget(QWidget *parent = 0);
 
 public slots:
-    void setTranslation(KEduVocExpression* entry, int translation);
+    void setTranslation(KEduVocExpression *entry, int translation);
 
 protected:
     bool eventFilter(QObject *obj, QEvent *event);
 
 private slots:
-    void slotDataChanged(const QModelIndex & topLeft, const QModelIndex & 
bottomRight);
+    void slotDataChanged(const QModelIndex &topLeft, const QModelIndex 
&bottomRight);
     void slotAddChoiceButton();
     void slotRemoveChoiceButton();
 
 private:
-    KEduVocTranslation* m_translation;
-    QStringListModel * m_choicesModel;
+    KEduVocTranslation *m_translation;
+    QStringListModel *m_choicesModel;
 };
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/org.kde.parley.desktop 
new/parley-16.08.0/src/org.kde.parley.desktop
--- old/parley-16.04.3/src/org.kde.parley.desktop       2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/org.kde.parley.desktop       2016-07-28 
15:11:23.000000000 +0200
@@ -68,6 +68,7 @@
 Comment[el]=Πρόγραμμα που θα σας βοηθήσει στην απομνημόνευση πραγμάτων.
 Comment[en_GB]=A program to help you memorise things.
 Comment[es]=Un programa para ayudarle a memorizar cosas.
+Comment[et]=Rakendus meeldejätmise hõlbustamiseks ja harjutamiseks.
 Comment[fi]=Ohjelma asioiden ulkoa opettelemiseen.
 Comment[gl]=Un programa para axudalo a memorizar cousas.
 Comment[it]=Un programma per aiutarti a memorizzare le cose.
@@ -80,7 +81,6 @@
 Comment[sv]=Ett program som hjälper dig memorera saker.
 Comment[uk]=Програма, яка допоможе вам запам’ятовувати знання.
 Comment[x-test]=xxA program to help you memorize things.xx
-Comment[zh_TW]=訓練記憶力的程式。
 X-DBUS-ServiceName=org.kde.parley
 GenericName=Vocabulary Trainer
 GenericName[af]=Woordeskat-afrigter
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/parleydocument.cpp 
new/parley-16.08.0/src/parleydocument.cpp
--- old/parley-16.04.3/src/parleydocument.cpp   2016-06-18 18:29:44.000000000 
+0200
+++ new/parley-16.08.0/src/parleydocument.cpp   2016-07-28 15:11:23.000000000 
+0200
@@ -562,7 +562,7 @@
             QMimeType mimeType = db.mimeTypeForFile(file);
             qDebug() << "KNS2 file of mime type:" << 
db.mimeTypeForFile(file).name();
             if (mimeType.inherits(QStringLiteral("application/x-kvtml"))) {
-                ParleyMainWindow::instance()->addRecentFile(file, QString()); 
///@todo: title!
+                
ParleyMainWindow::instance()->addRecentFile(QUrl::fromLocalFile(file), 
QString()); ///@todo: title!
                 fileName = file;
             }
         }
@@ -574,7 +574,7 @@
     if (numberInstalled > 1) {
         openGHNS();
     } else if (numberInstalled == 1) {
-        if (open(QUrl::fromUserInput(fileName)))
+        if (open(QUrl::fromLocalFile(fileName)))
             m_parleyApp->showPracticeConfiguration();
         else
             KMessageBox::error(m_parleyApp, i18n("Could not open vocabulary 
collection \"%1\"", entries.first().name()));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/practice/configure/blockoptions.cpp 
new/parley-16.08.0/src/practice/configure/blockoptions.cpp
--- old/parley-16.04.3/src/practice/configure/blockoptions.cpp  2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/configure/blockoptions.cpp  2016-07-28 
15:11:23.000000000 +0200
@@ -206,6 +206,9 @@
     block5->setEnabled(state);
     block6->setEnabled(state);
     block7->setEnabled(state);
+    if (state) {
+        checkValidity();
+    }
 }
 
 void BlockOptions::slotExpireToggled(bool state)
@@ -217,6 +220,9 @@
     expire5->setEnabled(state);
     expire6->setEnabled(state);
     expire7->setEnabled(state);
+    if (state) {
+        checkValidity();
+    }
 }
 
 void BlockOptions::slotComboBoxActivated(int)
@@ -229,16 +235,12 @@
 void BlockOptions::checkValidity()
 {
     QString message;
-    bool found = false;
-    for (int i = 1; i <= 6; i++) {
-        if (kcfg_Block->isChecked()) {
-            /*if (Prefs::blockItem(i-1) != 0  &&
-              Prefs::blockItem(i) != 0 &&
-              Prefs::blockItem(i-1) >= Prefs::blockItem(i))*/
+    if (kcfg_Block->isChecked()) {
+        bool found = false;
+        for (int i = 1; i <= 6; i++) {
             if (date_itemlist[m_blockComboList[i - 1]->currentIndex()].num != 
0 &&
                     date_itemlist[m_blockComboList[i]->currentIndex()].num != 
0 &&
                     date_itemlist[m_blockComboList[i - 1]->currentIndex()].num 
>= date_itemlist[m_blockComboList[i]->currentIndex()].num) {
-                QString format;
                 if (!found)
                     message.append(i18n("Illogical blocking times.\n"));
                 found = true;
@@ -247,14 +249,13 @@
         }
     }
 
-    for (int i = 1; i <= 6; i++) {
-        found = false;
-        if (kcfg_Expire->isChecked()) {
+    if (kcfg_Expire->isChecked()) {
+        bool found = false;
+        for (int i = 1; i <= 6; i++) {
             if (date_itemlist[m_expireComboList[i - 1]->currentIndex()].num != 
0 &&
                     date_itemlist[m_expireComboList[i]->currentIndex()].num != 
0 &&
                     date_itemlist[m_expireComboList[i - 
1]->currentIndex()].num >=
                     date_itemlist[m_expireComboList[i]->currentIndex()].num) {
-                QString format;
                 if (!found)
                     message.append(i18n("\nIllogical expiration times.\n"));
                 found = true;
@@ -263,17 +264,14 @@
         }
     }
 
-    if (message.length() == 0) {
-        found = false;
+    if ((message.length() == 0) && kcfg_Block->isChecked() && 
kcfg_Expire->isChecked()) {
+        bool found = false;
         for (int i = 0; i <= 6; i++) {
-            if (kcfg_Block->isChecked() &&
-                    kcfg_Expire->isChecked() &&
-                    m_expireComboList[i]->currentIndex() >= 0 &&
+            if (m_expireComboList[i]->currentIndex() >= 0 &&
                     m_blockComboList[i]->currentIndex() >= 0 &&
                     date_itemlist[m_expireComboList[i]->currentIndex()].num != 
0 &&
                     date_itemlist[m_blockComboList[i]->currentIndex()].num != 
0 &&
                     date_itemlist[m_blockComboList[i]->currentIndex()].num >= 
date_itemlist[m_expireComboList[i]->currentIndex()].num) {
-                QString format;
                 if (!found)
                     message.append(i18n("\nIllogical blocking vs. expiration 
times.\n"));
                 found = true;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/practice/configure/generalpracticeoptions.cpp 
new/parley-16.08.0/src/practice/configure/generalpracticeoptions.cpp
--- old/parley-16.04.3/src/practice/configure/generalpracticeoptions.cpp        
2016-06-18 18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/configure/generalpracticeoptions.cpp        
2016-07-28 15:11:23.000000000 +0200
@@ -34,7 +34,4 @@
     setupUi(this);
 
     //connect(kcfg_ShowSolutionAfterAnswer, SIGNAL(toggled(bool)), 
kcfg_ShowSolutionAfterAnswerTime, SLOT(setEnabled(bool)));
-
-    I18N_NOOP("Limit the number of words in the initial phase");
-    I18N_NOOP("Max number of words in the initial phase");
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/practice/conjugationbackendmode.cpp 
new/parley-16.08.0/src/practice/conjugationbackendmode.cpp
--- old/parley-16.04.3/src/practice/conjugationbackendmode.cpp  2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/conjugationbackendmode.cpp  2016-07-28 
15:11:23.000000000 +0200
@@ -46,7 +46,7 @@
     }
 
     data.tense = m_currentTense;
-    m_conjugation = 
m_current->entry()->translation(m_current->languageTo())->conjugation(m_currentTense);
+    m_conjugation = 
m_current->entry()->translation(m_current->languageTo())->getConjugation(m_currentTense);
     m_pronounFlags = current->conjugationPronouns();
 
     data.questionInfinitive = 
m_current->entry()->translation(m_current->languageFrom())->text();
@@ -119,7 +119,7 @@
 {
     Q_ASSERT(m_current != 0);
     KEduVocTranslation* trans = 
m_current->entry()->translation(m_current->languageTo());
-    KEduVocConjugation& conj = 
trans->conjugation(m_current->conjugationTense());
+    KEduVocConjugation conj = 
trans->getConjugation(m_current->conjugationTense());
     QList<KEduVocWordFlags> keys = conj.keys();
 
     grade_t min_grade = KV_MAX_GRADE;
@@ -134,7 +134,7 @@
 {
     Q_ASSERT(m_current != 0);
     KEduVocTranslation* trans = 
m_current->entry()->translation(m_current->languageTo());
-    KEduVocConjugation& conj = 
trans->conjugation(m_current->conjugationTense());
+    KEduVocConjugation conj = 
trans->getConjugation(m_current->conjugationTense());
     QList<KEduVocWordFlags> keys = conj.keys();
 
     grade_t min_grade = KV_MAX_GRADE;
@@ -150,14 +150,18 @@
     qDebug() << "Grading conjugations";
 
     foreach(const KEduVocWordFlags & key, m_pronounFlags) {
-        KEduVocText& text = 
m_current->entry()->translation(m_current->languageTo())->
-                            conjugation(m_currentTense).conjugation(key);
+        KEduVocTranslation *translation = 
m_current->entry()->translation(m_current->languageTo());
+        if (translation) {
+            KEduVocConjugation conjugationToUpdate = 
translation->getConjugation(m_currentTense);
+            conjugationToUpdate.conjugation(key).incPracticeCount();
+            
conjugationToUpdate.conjugation(key).setPracticeDate(QDateTime::currentDateTime());
+
+            updateGrade(conjugationToUpdate.conjugation(key),
+                        m_frontend->resultState() == 
AbstractFrontend::AnswerCorrect,
+                        m_current->statisticBadCount() == 0);
 
-        text.incPracticeCount();
-        text.setPracticeDate(QDateTime::currentDateTime());
-
-        updateGrade(text, m_frontend->resultState() == 
AbstractFrontend::AnswerCorrect,
-                    m_current->statisticBadCount() == 0);
+            translation->setConjugation(m_currentTense, conjugationToUpdate);
+        }
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/guifrontend.cpp 
new/parley-16.08.0/src/practice/guifrontend.cpp
--- old/parley-16.04.3/src/practice/guifrontend.cpp     2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/guifrontend.cpp     2016-07-28 
15:11:23.000000000 +0200
@@ -32,20 +32,25 @@
 
 using namespace Practice;
 
-GuiFrontend::GuiFrontend(QWidget* parent)
-    : AbstractFrontend(parent), m_modeWidget(0), 
m_lastImage(QStringLiteral("invalid")), m_currentBox(0), m_newBoxIfCorrect(0), 
m_newBoxIfWrong(0)
+GuiFrontend::GuiFrontend(QWidget *parent)
+    : AbstractFrontend(parent)
+    , m_widget(new ImageWidget())
+    , m_ui(new Ui::PracticeMainWindow())
+    , m_modeWidget(nullptr)
+    , m_resultState(AbstractFrontend::AnswerWrong)
+    , m_feedbackState(AbstractFrontend::AnswerWrong)
+    , m_currentBox(0)
+    , m_newBoxIfCorrect(0)
+    , m_newBoxIfWrong(0)
+    , m_themedBackgroundRenderer(new ThemedBackgroundRenderer(this, 
QStringLiteral("practicethemecache.bin")))
 {
-    m_widget = new ImageWidget();
     m_widget->setScalingEnabled(false, false);
     m_widget->setKeepAspectRatio(Qt::IgnoreAspectRatio);
     m_widget->setFadingEnabled(false);
 
-    m_ui = new Ui::PracticeMainWindow();
     m_ui->setupUi(m_widget);
     m_ui->centralPracticeWidget->setLayout(new QHBoxLayout());
 
-    m_themedBackgroundRenderer = new ThemedBackgroundRenderer(this, 
QStringLiteral("practicethemecache.bin"));
-
     connect(Prefs::self(), &Prefs::configChanged, this, 
&GuiFrontend::setTheme);
     setTheme();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/guifrontend.h 
new/parley-16.08.0/src/practice/guifrontend.h
--- old/parley-16.04.3/src/practice/guifrontend.h       2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/guifrontend.h       2016-07-28 
15:11:23.000000000 +0200
@@ -39,7 +39,7 @@
     Q_OBJECT
 
 public:
-    GuiFrontend(QWidget* parent = 0);
+    GuiFrontend(QWidget *parent = 0);
     virtual ~GuiFrontend();
 
     virtual QVariant userInput();
@@ -103,9 +103,9 @@
 private:
     void setImage(const QUrl& image);
 
-    ImageWidget* m_widget;
-    Ui::PracticeMainWindow* m_ui;
-    AbstractModeWidget* m_modeWidget;
+    ImageWidget *m_widget;
+    Ui::PracticeMainWindow *m_ui;
+    AbstractModeWidget *m_modeWidget;
     ResultState m_resultState;
     ResultState m_feedbackState;
     QUrl m_lastImage;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/imagecache.cpp 
new/parley-16.08.0/src/practice/imagecache.cpp
--- old/parley-16.04.3/src/practice/imagecache.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/imagecache.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -14,6 +14,7 @@
 #include "imagecache.h"
 
 #include <QFileInfo>
+#include <QDir>
 #include <QDataStream>
 
 #include <QDebug>
@@ -57,10 +58,23 @@
     return m_images.value(id);
 }
 
+void ImageCache::setSaveFilename(const QString &filename)
+{
+    m_saveFilename = filename;
+    QDir fileDir = QFileInfo(filename).absoluteDir();
+    if (!fileDir.exists() && !fileDir.mkpath(QStringLiteral("."))) {
+        qWarning() << QStringLiteral("Couldn't create image cache path: ") << 
fileDir.absolutePath();
+    }
+}
+
 void ImageCache::openCache()
 {
     QFile file(m_saveFilename);
-    file.open(QIODevice::ReadOnly);
+    if (!file.open(QIODevice::ReadOnly)) {
+        // If cache is used for the first time it's normal to fail here,
+        // because cache file doesn't exist at this time.
+        return;
+    }
     QDataStream stream(&file);
     // check identifier
     QString temp;
@@ -112,3 +126,4 @@
     dbg.nospace() << "\n\ttotal pixel count: " << pixels << " (approx. " << 
double(pixels) * 4 / 1024 / 1024 << " MiB)";
     return dbg.space();
 }
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/imagecache.h 
new/parley-16.08.0/src/practice/imagecache.h
--- old/parley-16.04.3/src/practice/imagecache.h        2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/imagecache.h        2016-07-28 
15:11:23.000000000 +0200
@@ -39,9 +39,7 @@
         return m_images.isEmpty();
     }
 
-    void setSaveFilename(const QString& filename) {
-        m_saveFilename = filename;
-    }
+    void setSaveFilename(const QString &filename);
     void openCache();
     void saveCache();
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/practicemainwindow.cpp 
new/parley-16.08.0/src/practice/practicemainwindow.cpp
--- old/parley-16.04.3/src/practice/practicemainwindow.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/practicemainwindow.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -59,8 +59,6 @@
 
     KConfigGroup cfg(KSharedConfig::openConfig(QStringLiteral("parleyrc")), 
objectName());
     applyMainWindowSettings(cfg);
-
-    I18N_NOOP("I knew it well");
 }
 
 PracticeMainWindow::~PracticeMainWindow()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/practicestatemachine.cpp 
new/parley-16.08.0/src/practice/practicestatemachine.cpp
--- old/parley-16.04.3/src/practice/practicestatemachine.cpp    2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/practicestatemachine.cpp    2016-07-28 
15:11:23.000000000 +0200
@@ -221,8 +221,8 @@
 
     m_frontend->setBoxes(grade, goodGrade, KV_LEV1_GRADE);
 
-    QString imgFrom = 
m_current->entry()->translation(m_current->languageFrom())->imageUrl().url();
-    QString imgTo = 
m_current->entry()->translation(m_current->languageTo())->imageUrl().url();
+    QUrl imgFrom = 
m_current->entry()->translation(m_current->languageFrom())->imageUrl();
+    QUrl imgTo = 
m_current->entry()->translation(m_current->languageTo())->imageUrl();
     if (imgFrom.isEmpty()) {
         imgFrom = imgTo;
     }
@@ -232,12 +232,12 @@
     if (Prefs::flashcardsFrontImage()) {
         m_frontend->setQuestionImage(imgFrom);
     } else {
-        m_frontend->setQuestionImage(QString());
+        m_frontend->setQuestionImage(QUrl());
     }
     if (Prefs::flashcardsBackImage()) {
         m_frontend->setSolutionImage(imgTo);
     } else {
-        m_frontend->setSolutionImage(QString());
+        m_frontend->setSolutionImage(QUrl());
     }
     m_frontend->showQuestion();
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/practice/sessionmanagerbase.cpp 
new/parley-16.08.0/src/practice/sessionmanagerbase.cpp
--- old/parley-16.04.3/src/practice/sessionmanagerbase.cpp      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/sessionmanagerbase.cpp      2016-07-28 
15:11:23.000000000 +0200
@@ -251,7 +251,7 @@
 
     // if the current entry has predefined multiple choice entries definied, 
use them first
     TestEntry *currentEntry = m_currentEntries.at(m_currentEntry);
-    QStringList predefinedChoices = 
currentEntry->entry()->translation(currentEntry->languageTo())->multipleChoice();
+    QStringList predefinedChoices = 
currentEntry->entry()->translation(currentEntry->languageTo())->getMultipleChoice();
     while (!predefinedChoices.isEmpty() && count > 0) {
         choices.append(predefinedChoices.takeAt(KRandom::random() % 
predefinedChoices.count()));
         count--;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/practice/themedbackgroundrenderer.cpp 
new/parley-16.08.0/src/practice/themedbackgroundrenderer.cpp
--- old/parley-16.04.3/src/practice/themedbackgroundrenderer.cpp        
2016-06-18 18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/practice/themedbackgroundrenderer.cpp        
2016-07-28 15:11:23.000000000 +0200
@@ -29,7 +29,7 @@
     : QObject(parent), m_haveCache(true), m_queuedRequest(false), 
m_isFastScaledRender(true)
 {
     m_theme = new KGameTheme();
-    
m_cache.setSaveFilename(QStandardPaths::writableLocation(QStandardPaths::DataLocation)
 + '/' + cacheFilename);
+    
m_cache.setSaveFilename(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)
 + '/' + cacheFilename);
     m_timer.setSingleShot(true);
     m_timer.setInterval(1000);
     connect(&m_timer, &QTimer::timeout, this, 
&ThemedBackgroundRenderer::updateBackgroundTimeout);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/scripts/scripting/container.h 
new/parley-16.08.0/src/scripts/scripting/container.h
--- old/parley-16.04.3/src/scripts/scripting/container.h        2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/scripts/scripting/container.h        2016-07-28 
15:11:23.000000000 +0200
@@ -130,7 +130,7 @@
      * @param url               url of the image
      */
     void setImageUrl(const QString & url) {
-        m_container->setImageUrl(url);
+        m_container->setImageUrl(QUrl(url));
     }
 
     /* finds the container with the given name */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/scripts/scripting/document.h 
new/parley-16.08.0/src/scripts/scripting/document.h
--- old/parley-16.04.3/src/scripts/scripting/document.h 2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/scripts/scripting/document.h 2016-07-28 
15:11:23.000000000 +0200
@@ -261,12 +261,12 @@
      * Sets the URL of the XML file
      */
     void setUrl(const QString& url) {
-        m_doc->setUrl(url);
+        m_doc->setUrl(QUrl(url));
     }
 
     /* @returns the URL of the XML file */
     QString url() const {
-        return m_doc->url().path();
+        return m_doc->url().toString();
     }
 
 public slots:
@@ -390,7 +390,7 @@
      */
     int saveAs(const QString & url, KEduVocDocument::FileType ft = 
KEduVocDocument::Automatic, const QString & generator = 
QStringLiteral("Parley")) {
         m_doc->setGenerator(generator);
-        return m_doc->saveAs(url, ft);
+        return m_doc->saveAs(QUrl(url), ft);
     }
 
 //             QByteArray toByteArray ( const QString &generator );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/scripts/scripting/translation.cpp 
new/parley-16.08.0/src/scripts/scripting/translation.cpp
--- old/parley-16.04.3/src/scripts/scripting/translation.cpp    2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/scripts/scripting/translation.cpp    2016-07-28 
15:11:23.000000000 +0200
@@ -46,14 +46,14 @@
 
 void Translation::setConjugationText(const QString& conjugation, const 
QString& tense, const KEduVocWordFlags& flags)
 {
-    KEduVocConjugation & conjug = m_translation->conjugation(tense);
+    KEduVocConjugation conjug = m_translation->getConjugation(tense);
     conjug.setConjugation(conjugation, flags);
     m_translation->setConjugation(tense, conjug);
 }
 
 QObject * Translation::conjugation(const QString & tense, const 
KEduVocWordFlags& flags)
 {
-    KEduVocConjugation conjug = m_translation->conjugation(tense);
+    KEduVocConjugation conjug = m_translation->getConjugation(tense);
     return new Text(conjug.conjugation(flags));
 }
 
@@ -61,7 +61,7 @@
 {
     Text * txt = dynamic_cast<Text*>(conjugation);
     if (txt) {
-        KEduVocConjugation & conjug = m_translation->conjugation(tense);
+        KEduVocConjugation conjug = m_translation->getConjugation(tense);
         conjug.setConjugation(*(txt->kEduVocText()), flags);
         m_translation->setConjugation(tense, conjug);
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/scripts/scripting/translation.h 
new/parley-16.08.0/src/scripts/scripting/translation.h
--- old/parley-16.04.3/src/scripts/scripting/translation.h      2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/scripts/scripting/translation.h      2016-07-28 
15:11:23.000000000 +0200
@@ -206,25 +206,25 @@
 
     /* get the sound url for this translation if it exists */
     QString soundUrl() {
-        return m_translation->soundUrl().path();
+        return m_translation->soundUrl().toString();
     }
 
     /* set the sound url for this translation
      * @param url               url of the sound file */
     void setSoundUrl(const QString &url) {
-        m_translation->setSoundUrl(url);
+        m_translation->setSoundUrl(QUrl(url));
     }
 
     /* get the image url for this translation if it exists */
     QString imageUrl() {
-        return m_translation->soundUrl().path();
+        return m_translation->soundUrl().toString();
     }
 
     /* set the image url for this translation
      * @param url               url of the image
      */
     void setImageUrl(const QString &url) {
-        m_translation->setImageUrl(url);
+        m_translation->setImageUrl(QUrl(url));
     }
 
     /*
@@ -321,7 +321,7 @@
 
     /** returns multiple choice if available */
     QStringList multipleChoice() {
-        return m_translation->multipleChoice();
+        return m_translation->getMultipleChoice();
     }
 
     /** returns a string list with the available conjugation tenses */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/parley-16.04.3/src/scripts/translator.cpp 
new/parley-16.08.0/src/scripts/translator.cpp
--- old/parley-16.04.3/src/scripts/translator.cpp       2016-06-18 
18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/scripts/translator.cpp       2016-07-28 
15:11:23.000000000 +0200
@@ -18,6 +18,7 @@
 #include <QDebug>
 
 Translator::Translator()
+    : m_parent(nullptr)
 {
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/settings/kgametheme/kgamethemeselector.cpp 
new/parley-16.08.0/src/settings/kgametheme/kgamethemeselector.cpp
--- old/parley-16.04.3/src/settings/kgametheme/kgamethemeselector.cpp   
2016-06-18 18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/settings/kgametheme/kgamethemeselector.cpp   
2016-07-28 15:11:23.000000000 +0200
@@ -48,7 +48,7 @@
 
     // private slots
     void _k_updatePreview();
-    void _k_updateThemeList(const QString& strTheme);
+    void _k_updateThemeList(const QString &strTheme);
     void _k_openKNewStuffDialog();
 };
 
@@ -186,13 +186,23 @@
     ui.themePreview->setPixmap(pix.scaled(ui.themePreview->size(), 
Qt::KeepAspectRatio, Qt::SmoothTransformation));
 }
 
-void KGameThemeSelectorPrivate::_k_updateThemeList(const QString& strTheme)
+void KGameThemeSelectorPrivate::_k_updateThemeList(const QString &strTheme)
 {
     //find theme and set selection to the current theme; happens when pressing 
"Default"
-    QListWidgetItem * currentItem = ui.themeList->currentItem();
-    if (!currentItem || themeMap.value(currentItem->text())->fileName() != 
strTheme) {
+    QListWidgetItem *currentItem = ui.themeList->currentItem();
+
+    QString currentGameThemeFileName;
+    if (currentItem) {
+        KGameTheme *currentGameTheme = themeMap.value(currentItem->text());
+        if (currentGameTheme) {
+            currentGameThemeFileName = currentGameTheme->fileName();
+        }
+    }
+
+    if (!currentItem || (currentGameThemeFileName != strTheme)) {
         for (int i = 0; i < ui.themeList->count(); i++) {
-            if (themeMap.value(ui.themeList->item(i)->text())->fileName() == 
strTheme) {
+            KGameTheme *listItemGameTheme = 
themeMap.value(ui.themeList->item(i)->text());
+            if (listItemGameTheme && (listItemGameTheme->fileName() == 
strTheme)) {
                 ui.themeList->setCurrentItem(ui.themeList->item(i));
                 break;
             }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/parley-16.04.3/src/statistics/statisticslegendwidget.cpp 
new/parley-16.08.0/src/statistics/statisticslegendwidget.cpp
--- old/parley-16.04.3/src/statistics/statisticslegendwidget.cpp        
2016-06-18 18:29:44.000000000 +0200
+++ new/parley-16.08.0/src/statistics/statisticslegendwidget.cpp        
2016-07-28 15:11:23.000000000 +0200
@@ -67,11 +67,6 @@
     QString rightString = i18nc("adjective, The word has not even been 
practiced once by the user","Not practiced");
     QFontMetrics fontMetrics(painter.font());
 
-    I18N_NOOP("Initial phase");
-    I18N_NOOP("Long term phase");
-    I18N_NOOP("Invalid entry");
-    I18N_NOOP("Newly started");
-
     // Calculate the size and position of the rectangle that will contain the
     // string on the left side of the legend.
     QRect leftRect = fontMetrics.boundingRect(leftString);


Reply via email to