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
|
/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2014 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "frontend/displaywindow/btmodulechooserbar.h"
#include "frontend/displaywindow/btmodulechooserbutton.h"
#include "creadwindow.h"
#include "util/btmodules.h"
#include <QAction>
#include <QDebug>
#include <QList>
#include <QToolBar>
BtModuleChooserBar::BtModuleChooserBar(QWidget *parent)
: QToolBar(parent),
BtWindowModuleChooser(CSwordModuleInfo::Unknown, 0),
m_idCounter(0),
m_window(0) {
setAllowedAreas(Qt::TopToolBarArea);
setFloatable(false);
}
void BtModuleChooserBar::slotBackendModulesChanged() {
m_modules = m_window->getModuleList();
adjustButtonCount();
//recreate all menus from scratch
for (int i = 0; i < m_buttonList.count(); i++) {
BtModuleChooserButton* button = m_buttonList.at(i);
QString moduleName = (i >= m_modules.count()) ? QString::null : m_modules.at(i);
qDebug() << "refresh button's menu:" << moduleName << i;
int leftLikeModules = leftLikeParallelModules(m_modules);
button->recreateMenu(m_modules, moduleName, i, leftLikeModules);
}
}
void BtModuleChooserBar::adjustButtonCount(bool adjustToZero) {
int buttonCountDifference = 0;
if (adjustToZero) {
buttonCountDifference = m_buttonList.count();
}
else {
buttonCountDifference = m_buttonList.count() - (m_modules.count() + 1);
}
if (m_moduleType == CSwordModuleInfo::GenericBook && !adjustToZero) {
buttonCountDifference = (1 - m_buttonList.count()) * -1;
}
//if there are more buttons than modules, delete buttons
if (buttonCountDifference > 0) {
for (int j = 0; j < buttonCountDifference; j++) {
delete m_buttonList.takeFirst();
}
}
// if there are more modules than buttons, add buttons
if (buttonCountDifference < 0) {
for (int i = (buttonCountDifference * (-1)); i > 0; i--) {
addButton();
}
}
}
void BtModuleChooserBar::slotWindowModulesChanged() {
m_modules = m_window->getModuleList();
adjustButtonCount();
updateButtonMenus();
}
BtModuleChooserButton* BtModuleChooserBar::addButton() {
BtModuleChooserButton* b = new BtModuleChooserButton(this, m_moduleType);
QAction* a = addWidget(b);
m_buttonList.append(b);
// the button sends signals directly to the window which then signals back when the module
// list has changed
connect(b, SIGNAL(sigModuleAdd(int, QString)), m_window, SLOT(slotAddModule(int, QString)));
connect(b, SIGNAL(sigModuleReplace(int, QString)), m_window, SLOT(slotReplaceModule(int, QString)));
connect(b, SIGNAL(sigModuleRemove(int)), m_window, SLOT(slotRemoveModule(int)));
a->setVisible(true);
return b;
}
/** Sets the modules which are chosen in this module chooser bar. */
void BtModuleChooserBar::setModules( QStringList useModules,CSwordModuleInfo::ModuleType type, CReadWindow* window) {
m_modules = useModules;
m_window = window;
m_moduleType = type;
clear();
adjustButtonCount(true);
//if (!useModules.count()) return;
for (int i = 0; i < useModules.count(); i++) {
addButton();
}
if (!(m_moduleType == CSwordModuleInfo::GenericBook)) {
addButton(); // for ADD button
}
updateButtonMenus();
connect(m_window, SIGNAL(sigModuleListSet(QStringList)), SLOT(slotBackendModulesChanged()));
connect(m_window, SIGNAL(sigModuleListChanged()), SLOT(slotWindowModulesChanged()));
}
void BtModuleChooserBar::updateButtonMenus() {
int leftLikeModules = leftLikeParallelModules(m_modules);
for (int i = 0; i < m_buttonList.count(); i++) {
BtModuleChooserButton* button = m_buttonList.at(i);
QString moduleName = (i >= m_modules.count()) ? QString::null : m_modules.at(i);
button->updateMenu(m_modules, moduleName, i, leftLikeModules);
}
}
|