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