1 /*********
2 *
3 * This file is part of BibleTime's source code, http://www.bibletime.info/.
4 *
5 * Copyright 1999-2016 by the BibleTime developers.
6 * The BibleTime source code is licensed under the GNU General Public License version 2.0.
7 *
8 **********/
9 
10 #include "frontend/bookshelfwizard/btbookshelflanguagespage.h"
11 
12 #include <QApplication>
13 #include <QHBoxLayout>
14 #include <QListView>
15 #include <QPushButton>
16 #include <QVBoxLayout>
17 #include <set>
18 #include "backend/btinstallbackend.h"
19 #include "backend/config/btconfig.h"
20 #include "backend/managers/clanguagemgr.h"
21 #include "backend/models/btlistmodel.h"
22 #include "frontend/bookshelfwizard/btbookshelfwizard.h"
23 #include "frontend/bookshelfwizard/btbookshelfwizardenums.h"
24 #include "util/btconnect.h"
25 
26 
27 namespace {
28 QString const LanguagesKey = "GUI/BookshelfWizard/languages";
29 } // anonymous namespace
30 
BtBookshelfLanguagesPage(QWidget * parent)31 BtBookshelfLanguagesPage::BtBookshelfLanguagesPage(QWidget * parent)
32     : BtBookshelfWizardPage(parent)
33 {
34     // Setup UI:
35     m_verticalLayout = new QVBoxLayout(this);
36     m_verticalLayout->setObjectName(QStringLiteral("verticalLayout"));
37     m_languagesListView = new QListView(this);
38     m_languagesListView->setObjectName(QStringLiteral("languagesListView"));
39     m_verticalLayout->addWidget(m_languagesListView);
40 
41     // Create languages Model:
42     m_model = new BtListModel(true, this);
43     m_languagesListView->setModel(m_model);
44     BT_CONNECT(m_model, &QStandardItemModel::dataChanged,
45                this,    &BtBookshelfLanguagesPage::slotDataChanged);
46 }
47 
retranslateUi()48 void BtBookshelfLanguagesPage::retranslateUi() {
49     setTitle(QApplication::translate("BookshelfWizard", "Choose Languages"));
50     setSubTitle(QApplication::translate("BookshelfWizard",
51                                         "Choose one or more languages to "
52                                         "install works from."));
53 }
54 
nextId() const55 int BtBookshelfLanguagesPage::nextId() const
56 { return WizardPage::installWorksPage; }
57 
initializePage()58 void BtBookshelfLanguagesPage::initializePage() {
59 
60     { // Select languages:
61         QStringList languages;
62         if (m_firstTimeInit) {
63             languages << btConfig().value<QStringList>(LanguagesKey,
64                                                        QStringList{});
65             if (languages.isEmpty())
66                 languages << tr("English");
67             m_firstTimeInit = false;
68         } else {
69             languages << selectedLanguages();
70         }
71 
72         bool scrolledToFirstSelected = false;
73         for (int row = 0; row < m_model->rowCount(); ++row) {
74             QStandardItem * const item = m_model->item(row, 0);
75             if (languages.contains(item->text())) {
76                 item->setCheckState(Qt::Checked);
77                 // Scroll to first selected item:
78                 if (!scrolledToFirstSelected) {
79                     m_languagesListView->scrollTo(m_model->indexFromItem(item));
80                     scrolledToFirstSelected = true;
81                 }
82             }
83         }
84     }
85 
86     retranslateUi();
87 }
88 
initializeLanguages()89 void BtBookshelfLanguagesPage::initializeLanguages() {
90     // Get languages from sources:
91     std::set<QString> languages;
92     for (auto const & sourceName : btWizard().selectedSources())
93         for (auto const * module :
94              BtInstallBackend::backend(
95                  BtInstallBackend::source(sourceName))->moduleList())
96             languages.insert(module->language()->translatedName());
97 
98     // Update languages model:
99     m_model->clear();
100     for (auto const & lang : languages)
101         m_model->appendItem(lang);
102     if (languages.size() == 1u)
103         m_model->item(0, 0)->setCheckState(Qt::Checked);
104 }
105 
skipPage() const106 bool BtBookshelfLanguagesPage::skipPage() const noexcept
107 { return m_model->rowCount() == 1; }
108 
slotDataChanged()109 void BtBookshelfLanguagesPage::slotDataChanged() { emit completeChanged(); }
110 
isComplete() const111 bool BtBookshelfLanguagesPage::isComplete() const
112 { return selectedLanguages().count() > 0; }
113 
selectedLanguages() const114 QStringList BtBookshelfLanguagesPage::selectedLanguages() const {
115     QStringList languages;
116     for (int row = 0; row < m_model->rowCount(); ++row) {
117         QStandardItem * const item = m_model->item(row,0);
118         if (item->checkState() == Qt::Checked)
119             languages << item->text();
120     }
121     return languages;
122 }
123