summaryrefslogtreecommitdiff
path: root/src/frontend/bookshelfmanager/installpage/btinstallmodulechooserdialog.cpp
blob: 8fd87ec060ab5afe517f6403c8ae6445fb6732e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2009 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/

#include "frontend/bookshelfmanager/installpage/btinstallmodulechooserdialog.h"

#include <QBrush>
#include <QDebug>
#include <QList>
#include <QPushButton>
#include <QString>
#include <QTreeWidgetItem>
#include <QWidget>
#include "backend/btmoduletreeitem.h"
#include "backend/drivers/cswordmoduleinfo.h"
#include "frontend/cmodulechooserdialog.h"


BtInstallModuleChooserDialog::BtInstallModuleChooserDialog(QWidget* parent, QString title, QString label, QList<CSwordModuleInfo*>* empty)
        : CModuleChooserDialog(parent, title, label, empty) {
    qDebug() << "BtInstallModuleChooserDialog::BtInstallModuleChooserDialog start";
    init();
    okButton()->setText(tr("Install"));
    m_nameList = QStringList();
}

// Do nothing, the tree is initialized outside this class.
void BtInstallModuleChooserDialog::initModuleItem(BTModuleTreeItem*, QTreeWidgetItem*) {}

void BtInstallModuleChooserDialog::initModuleItem(QString name, QTreeWidgetItem* sourceItem) {
    /// \todo Use new bookshelf model instead
    /// \bug Valgrind reports memory leak:
    QTreeWidgetItem* moduleItem = new QTreeWidgetItem(sourceItem);
    moduleItem->setText(0, name);
    moduleItem->setFlags(Qt::ItemIsUserCheckable | Qt::ItemIsEnabled);
    moduleItem->setCheckState(0, Qt::Checked);

    // prevent double items
    if (m_nameList.contains(name)) {
        qDebug() << "item already in list:" << name;
        //moduleItem->setCheckState(0, Qt::Unchecked);
        QBrush bg(Qt::red);
        moduleItem->setBackground(0, bg);
        //find and change the other offending items
        foreach (QTreeWidgetItem* doubleItem, treeWidget()->findItems(name, Qt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive, 0)) {
            //doubleItem->setCheckState(0, Qt::Unchecked);
            //qDebug() << "CInstallModuleChooserDialog::initModuleItem" << doubleItem;
            doubleItem->setBackground(0, bg);
        }
        m_doubleCheckedModules[name] = true;
        enableOk(false);
    }
    m_nameList << name;
}

void BtInstallModuleChooserDialog::slotItemChecked(QTreeWidgetItem* item, int column) {
    QString moduleName = item->text(0);
    qDebug() << "BtInstallModuleChooserDialog::slotItemChecked start";
    // handle only non-toplevel items which has duplicates and where the first column was changed
    if (item->parent() && column == 0 && (findModuleItemsByName(moduleName).count() > 1))  {
        //prevent handling when the color is changed
        if (item->data(1, Qt::UserRole).toBool() == false) {
            qDebug() << "was not updating";
            item->setData(1, Qt::UserRole, true);
        }
        else {
            qDebug() << "was updating";
            item->setData(1, Qt::UserRole, false);
            return;
        }

        QList<QTreeWidgetItem*> doubleNameItems = findModuleItemsByName(moduleName);
        QList<QTreeWidgetItem*> doubleCheckedItems;
        foreach (QTreeWidgetItem* nItem, doubleNameItems) {
            if (nItem->checkState(0) == Qt::Checked) {
                doubleCheckedItems << nItem;
            }
        }

        if (doubleCheckedItems.count() > 1) {
            enableOk(false);
            // color the items
            qDebug() << "there were more than 1 item of the name" << moduleName;
            foreach (QTreeWidgetItem* i, doubleNameItems) {
                QBrush bg(Qt::red);
                i->setBackground(0, bg);
            }
            m_doubleCheckedModules[moduleName] = true;
        }
        else if (doubleCheckedItems.count() == 1) {
            qDebug() << "there were 1 checked items of the name" << moduleName;
            // uncolor the items
            foreach (QTreeWidgetItem* i, doubleNameItems) {
                i->setBackground(0, i->parent()->background(0));
            }
            m_doubleCheckedModules.remove(moduleName);
            if (m_doubleCheckedModules.count() == 0) {
                enableOk(true);
            }
        }
    }
}

QList<QTreeWidgetItem*> BtInstallModuleChooserDialog::findModuleItemsByName(QString name) {
    qDebug() << "BtInstallModuleChooserDialog::findModuleItemsByName:" << name << treeWidget()->topLevelItemCount();
    QList<QTreeWidgetItem*> doubleNamedAllItems = treeWidget()->findItems(name, Qt::MatchFixedString | Qt::MatchCaseSensitive | Qt::MatchRecursive);
    //qDebug() << "doubleNamedAllItems: " << doubleNamedAllItems.count();
    QList<QTreeWidgetItem*> doubleNamedModuleItems;
    foreach (QTreeWidgetItem* item, doubleNamedAllItems) {
        //qDebug() << "item:" << item;
        if (item->parent()) {
            doubleNamedModuleItems << item;
        }
    }
    //qDebug() << "module items:" << doubleNamedModuleItems.count();
    return doubleNamedModuleItems;
}

void BtInstallModuleChooserDialog::enableOk(bool enabled) {
    qDebug() << "BtInstallModuleChooserDialog::enableOk" << enabled;
    okButton()->setEnabled(enabled);
}