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
|
/*********
*
* This file is part of BibleTime's source code, http://www.bibletime.info/.
*
* Copyright 1999-2008 by the BibleTime developers.
* The BibleTime source code is licensed under the GNU General Public License version 2.0.
*
**********/
#include "cmodulechooserbar.h"
#include "cmodulechooserbutton.h"
#include <QList>
#include <QDebug>
#include <QAction>
#include <QToolBar>
CModuleChooserBar::CModuleChooserBar(QList<CSwordModuleInfo*> useModules, CSwordModuleInfo::ModuleType type, QWidget *parent)
: QToolBar(parent),
m_moduleType(type),
m_idCounter(0),
m_buttonLimit(-1) { //-1 means no limit
setAllowedAreas(Qt::TopToolBarArea);
setFloatable(false);
//insert buttons if useModules != 0
QList<CSwordModuleInfo*>::iterator end_it = useModules.end();
for (QList<CSwordModuleInfo*>::iterator it(useModules.begin()); it != end_it; ++it) {
if ((m_buttonLimit != -1) && ( m_buttonLimit <= (int)m_buttonList.count()) ) { //we reached the button limit
break;
}
addButton( *it );
}
// We can add a button to choose an additional module
if ( (m_buttonLimit == -1) || (m_buttonLimit > (int)m_buttonList.count()) ) {
addButton(0); //add a button without module set
}
}
CModuleChooserButton* CModuleChooserBar::addButton( CSwordModuleInfo* const module ) {
CModuleChooserButton* b = new CModuleChooserButton(module, m_moduleType, ++m_idCounter, this);
QAction* a = addWidget(b);
m_buttonList.append(b);
connect( b, SIGNAL(sigAddButton()), this, SLOT(addButton()) );
connect( b, SIGNAL(sigRemoveButton(const int)), this, SLOT(removeButton(const int)) );
connect( b, SIGNAL(sigChanged()), SIGNAL(sigChanged()) );
connect( b, SIGNAL(sigChanged()), SLOT(updateMenuItems()) );
a->setVisible(true);
updateMenuItems(); //make sure the items are up to date with the newest module list
return b;
}
void CModuleChooserBar::addButton( ) {
addButton(0);
}
//change current with next and remove
/** Removes a button from the toolbar */
void CModuleChooserBar::removeButton( const int ID ) {
QMutableListIterator<CModuleChooserButton*> it(m_buttonList);
while (it.hasNext()) {
CModuleChooserButton* b = it.next();
if (b->getId() == ID) { //found the right button to remove
it.remove();
b->deleteLater();
break;
}
}
emit sigChanged();
updateMenuItems(); //make sure the items are up to date with the newest module list
}
/** Returns a list of selected modules. */
QList<CSwordModuleInfo*> CModuleChooserBar::getModuleList() {
QList<CSwordModuleInfo*> list;
foreach (CModuleChooserButton* b, m_buttonList) {
if (b->module()) list.append( b->module() );
}
return list;
}
//change current with remove
/** Sets the number of the maximum count of buttons. */
void CModuleChooserBar::setButtonLimit(const int limit) {
m_buttonLimit = limit;
if (limit == -1) //no need to delete buttons
return;
const int tooMuch = m_buttonList.size() - limit;
for (int i = 0; i < tooMuch; ++i) {
CModuleChooserButton* b = m_buttonList.takeLast();
b->deleteLater();
}
updateMenuItems();
}
/** Sets the modules which are chosen in this module chooser bar. */
void CModuleChooserBar::setModules( QList<CSwordModuleInfo*> useModules ) {
setButtonLimit(0);
setButtonLimit(-1); //these two lines clear the bar
if (!useModules.count()) return;
QList<CSwordModuleInfo*>::iterator end_it = useModules.end();
for (QList<CSwordModuleInfo*>::iterator it(useModules.begin()); it != end_it; ++it) {
if ( (m_buttonLimit != -1) && (m_buttonLimit <= (int)m_buttonList.count()) ) {
break;
}
addButton( *it );
}
if ( (m_buttonLimit == -1) || (m_buttonLimit > (int)m_buttonList.count()) ) {
addButton(0);//add button without module set
}
updateMenuItems();
}
void CModuleChooserBar::updateMenuItems() {
resize(sizeHint());
update(); //seems to be neccessary to enforce display of the layout changes when a button was removed or added
foreach (CModuleChooserButton* b, m_buttonList)
b->updateMenuItems();
}
|