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
|
/*********
*
* 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.
*
**********/
#ifndef BT_MODULECHOOSERBUTTON
#define BT_MODULECHOOSERBUTTON
#include <QToolButton>
#include "backend/btmoduletreeitem.h"
#include "backend/drivers/cswordmoduleinfo.h"
class BtModuleChooserBar;
class QMenu;
class QAction;
/**
* A toolbar button for choosing a module in a window. When user selects a module,
* button sends a signal. This button needs to get a signal back after a window
* module list has been changed. Only then the button will be updated.
* See BtModuleChooserBar.
*/
class BtModuleChooserButton : public QToolButton {
Q_OBJECT
public:
/** Filter out modules of wrong type from buttons module list.
* See populateMenu() and BTModuleTreeItem. */
struct TypeFilter : public BTModuleTreeItem::Filter {
TypeFilter(CSwordModuleInfo::ModuleType t) {
m_mType = t;
}
bool filter(CSwordModuleInfo* mi) {
return ((mi->type() == m_mType) && !mi->isLocked());
}
CSwordModuleInfo::ModuleType m_mType;
};
/**
* A new empty button. updateMenu() is needed to update the icon, menu items etc.
*/
BtModuleChooserButton(BtModuleChooserBar *parent, CSwordModuleInfo::ModuleType mtype);
/** Does nothing. All resources are freed and children deleted automatically.*/
~BtModuleChooserButton();
// /** Returns the module name this button represents. Not needed?*/
//QString module();
// /** Returns the index used for this button.*/
//int getIndex() const;
// /** Updates existing menu items, setting their states.*/
//void updateMenuItems();
public:
/**
* Called after the window module list has changed. Updates the existing menu items
* but doesn't add or remove them if the menu exists.
* If the menu doesn't exist, creates it first and then updates it.
* Updates also the icon.
*/
void updateMenu(QStringList newModulesToUse, QString thisModule, int newIndex);
/** Creates the menu from scratch and updates the items using updateMenu().*/
void recreateMenu(QStringList newModulesToUse, QString thisModule, int newIndex);
signals:
/** User selected a module from menu to replace another module*/
void sigModuleReplace ( int index, QString newModule );
/** User selected a module from menu to add */
void sigModuleAdd ( int index, QString module );
/** User selected a module from menu to be removed */
void sigModuleRemove ( int index );
private slots:
/** Handle the action signal from the menu.*/
void moduleChosen(QAction* action );
private:
/** Returns the icon used for the current status.*/
const QString iconName();
/**
* Populates the menu with language submenus and module items without setting
* their states.
*/
void populateMenu();
/** Adds items to the menu recursively. */
void addItemToMenu(BTModuleTreeItem* item, QMenu* menu);
private:
bool m_hasModule;
int m_id;
QAction* m_noneAction;
CSwordModuleInfo::ModuleType m_moduleType;
QString m_module;
QMenu* m_popup;
QList<QMenu*> m_submenus;
};
#endif
|