]> git.lyx.org Git - lyx.git/blob - src/frontends/qt4/QMathDialog.C
enable Font cache only for MacOSX and inline width() for other platform.
[lyx.git] / src / frontends / qt4 / QMathDialog.C
1 /**
2  * \file QMathDialog.C
3  * This file is part of LyX, the document processor.
4  * Licence details can be found in the file COPYING.
5  *
6  * \author John Levon
7  *
8  * Full author contact details are available in file CREDITS.
9  */
10
11 #include <config.h>
12
13 #include "QMathDialog.h"
14 #include "QMath.h"
15
16 #include <QPixmap>
17 #include <QResizeEvent>
18 #include <QScrollArea>
19 #include <QMenu>
20 #include <QPushButton>
21 #include <QListWidget>
22 #include <QListWidgetItem>
23 #include <QIcon>
24
25 #include "iconpalette.h"
26 #include "qt_helpers.h"
27 #include "controllers/ControlMath.h"
28 #include "frontends/lyx_gui.h"
29 #include "support/filetools.h"
30
31 using std::string;
32
33 using lyx::support::libFileSearch;
34
35 namespace lyx {
36 namespace frontend {
37
38
39 namespace {
40
41 char const ** panels[] = {
42         latex_bop, latex_varsz, latex_brel, latex_greek, latex_arrow,
43         latex_dots, latex_deco, latex_misc, latex_ams_ops,
44         latex_ams_rel, latex_ams_nrel, latex_ams_arrows,
45         latex_ams_misc
46 };
47
48 int const nr_panels = sizeof(panels)/sizeof(panels[0]);
49
50 int  panel_index[nr_panels];
51
52 } // namespace anon
53
54
55 QMathDialog::QMathDialog(QMath * form)
56         : form_(form)
57 {
58         setupUi(this);
59
60         // enlarge the symbols ComboBox (no scrollbar)
61         //symbolsCO->setSizeLimit(13);
62
63         connect( tearoffPB, SIGNAL( clicked() ), this, SLOT( expandClicked() ) );
64         connect( closePB, SIGNAL( clicked() ), this, SLOT( accept() ) );
65         connect( fracPB, SIGNAL( clicked() ), this, SLOT( fracClicked() ) );
66         connect( superscriptPB, SIGNAL( clicked() ), this, SLOT( superscriptClicked() ) );
67         connect( subscriptPB, SIGNAL( clicked() ), this, SLOT( subscriptClicked() ) );
68         connect( delimitersPB, SIGNAL( clicked() ), this, SLOT( delimiterClicked() ) );
69         connect( matrixPB, SIGNAL( clicked() ), this, SLOT( matrixClicked() ) );
70         connect( functionsLW, SIGNAL( itemActivated(QListWidgetItem *)  ), this, SLOT( functionSelected(QListWidgetItem *) ) );
71         connect( equationPB, SIGNAL( clicked() ), this, SLOT( equationClicked() ) );
72         connect( symbolsCO, SIGNAL(activated(int)), this, SLOT(showingPanel(int)));
73
74         string icon_path = libFileSearch("images/math", "sqrt-square", "xpm");
75         sqrtPB->setIcon(QIcon(toqstr(icon_path)));
76         icon_path = libFileSearch("images/math", "space", "xpm");
77         spacePB->setIcon(QIcon(toqstr(icon_path)));
78         icon_path = libFileSearch("images/math", "style", "xpm");
79         stylePB->setIcon(QIcon(toqstr(icon_path)));
80         icon_path = libFileSearch("images/math", "font", "xpm");
81         fontPB->setIcon(QIcon(toqstr(icon_path)));
82         icon_path = libFileSearch("images/math", "equation", "xpm");
83         equationPB->setIcon(QIcon(toqstr(icon_path)));
84         icon_path = libFileSearch("images/math", "frac-square", "xpm");
85         fracPB->setIcon(QIcon(toqstr(icon_path)));
86         icon_path = libFileSearch("images/math", "sub", "xpm");
87         subscriptPB->setIcon(QIcon(toqstr(icon_path)));
88         icon_path = libFileSearch("images/math", "super", "xpm");
89         superscriptPB->setIcon(QIcon(toqstr(icon_path)));
90         icon_path = libFileSearch("images/math", "matrix", "xpm");
91         matrixPB->setIcon(QIcon(toqstr(icon_path)));
92         icon_path = libFileSearch("images/math", "delim", "xpm");
93         delimitersPB->setIcon(QIcon(toqstr(icon_path)));
94
95         // function list
96         for (int i = 0; *function_names[i]; ++i) {
97                 functionsLW->addItem(function_names[i]);
98         }
99         //functionsLW->setFixedWidth(functionsLW->sizeHint().width());
100
101         // add first symbol panel
102         addPanel(0);
103         showingPanel(0);
104         // 5 buttons + 2 margins + 1 scrollbar
105         symbolWS->setFixedWidth(5*40 + 2*10 + 15 );
106
107         // add menu's to the buttons
108         QMenu * m = new QMenu(spacePB);
109         m->setTitle(qt_("LyX: Math Spacing"));
110         m->setTearOffEnabled(true);
111         addMenuItem(m, qt_("Thin space  \\,"), ",");
112         addMenuItem(m, qt_("Medium space        \\:"), ":");
113         addMenuItem(m, qt_("Thick space \\;"), ";");
114         addMenuItem(m, qt_("Quadratin space     \\quad"), "quad");
115         addMenuItem(m, qt_("Double quadratin space      \\qquad"), "qquad");
116         addMenuItem(m, qt_("Negative space      \\!"), "!");
117         spacePB->setMenu(m);
118
119         m = new QMenu(sqrtPB);
120         m->setTitle(qt_("LyX: Math Roots"));
121         m->setTearOffEnabled(true);
122         addMenuItem(m, qt_("Square root \\sqrt"), "sqrt");
123         QAction * ma = new QAction(qt_("Cube root       \\root"), this);
124         connect(ma, SIGNAL(triggered()), this, SLOT(insertCubeRoot()));
125         m->addAction(ma);
126         addMenuItem(m, qt_("Other root  \\root"), "root");
127         sqrtPB->setMenu(m);
128
129         m = new QMenu(stylePB);
130         m->setTitle(qt_("LyX: Math Styles"));
131         m->setTearOffEnabled(true);
132         addMenuItem(m, qt_("Display style       \\displaystyle"), "displaystyle");
133         addMenuItem(m, qt_("Normal text style   \\textstyle"), "textstyle");
134         addMenuItem(m, qt_("Script (small) style        \\scriptstyle"), "scriptstyle");
135         addMenuItem(m, qt_("Scriptscript (smaller) style        \\scriptscriptstyle"), "scriptscriptstyle");
136         stylePB->setMenu(m);
137
138         m = new QMenu(fracPB);
139         m->setTitle(qt_("LyX: Fractions"));
140         m->setTearOffEnabled(true);
141         addMenuItem(m, qt_("Standard    \\frac"), "frac");
142         addMenuItem(m, qt_("No hor. line        \\atop"), "atop");
143         addMenuItem(m, qt_("Nice        \\nicefrac"), "nicefrac");
144         addMenuItem(m, qt_("Text frac (amsmath) \\tfrac"), "tfrac");
145         addMenuItem(m, qt_("Display frac (amsmath)      \\dfrac"), "dfrac");
146         addMenuItem(m, qt_("Binomial    \\choose"),  "choose");
147         fracPB->setMenu(m);
148
149         m = new QMenu(fontPB);
150         m->setTitle(qt_("LyX: Math Fonts"));
151         m->setTearOffEnabled(true);
152         addMenuItem(m, qt_("Roman       \\mathrm"), "mathrm");
153         addMenuItem(m, qt_("Bold        \\mathbf"), "mathbf");
154         addMenuItem(m, qt_("Bold symbol \\boldsymbol"), "boldsymbol");
155         addMenuItem(m, qt_("Sans serif  \\mathsf"), "mathsf");
156         addMenuItem(m, qt_("Italic      \\mathit"), "mathit");
157         addMenuItem(m, qt_("Typewriter  \\mathtt"), "mathtt");
158         addMenuItem(m, qt_("Blackboard  \\mathbb"), "mathbb");
159         addMenuItem(m, qt_("Fraktur     \\mathfrak"), "mathfrak");
160         addMenuItem(m, qt_("Calligraphic        \\mathcal"), "mathcal");
161         addMenuItem(m, qt_("Normal text mode    \\textrm"), "textrm");
162         fontPB->setMenu(m);
163 }
164
165 void QMathDialog::addMenuItem(QMenu * menu, const QString & label, const std::string & action)
166 {
167         QMAction * ma = new QMAction(label,action, this);
168         connect(ma, SIGNAL(action(const std::string &)), this, SLOT(symbol_clicked(const std::string &)));
169         menu->addAction(ma);
170 }
171
172 void QMathDialog::showingPanel(int num)
173 {
174         if (!panel_index[num])
175                 addPanel(num);
176
177         symbolWS->setCurrentIndex(panel_index[num]);
178 }
179
180
181 IconPalette * QMathDialog::makePanel(QWidget * parent, char const ** entries)
182 {
183         IconPalette * p = new IconPalette(parent);
184         for (int i = 0; *entries[i]; ++i) {
185                 p->add(QPixmap(toqstr(find_xpm(entries[i]))), entries[i], string("\\") + entries[i]);
186         }
187         // Leave these std:: qualifications alone !
188         connect(p, SIGNAL(button_clicked(const std::string &)),
189                 this, SLOT(symbol_clicked(const std::string &)));
190
191         return p;
192 }
193
194
195 void QMathDialog::addPanel(int num)
196 {
197         QScrollArea * sc = new QScrollArea(symbolWS);
198         IconPalette * p = makePanel(this, panels[num]);
199         p->resize(40 * 5, p->height());
200         sc->setWidget(p);
201         panel_index[num] = symbolWS->addWidget(sc);
202 }
203
204
205 void QMathDialog::symbol_clicked(const string & str)
206 {
207         form_->controller().dispatchInsert(str);
208 }
209
210
211 void QMathDialog::fracClicked()
212 {
213         form_->controller().dispatchInsert("frac");
214 }
215
216
217 void QMathDialog::delimiterClicked()
218 {
219         form_->controller().showDialog("mathdelimiter");
220 }
221
222
223 void QMathDialog::expandClicked()
224 {
225         int const id = symbolsCO->currentIndex();
226         IconPalette * p = makePanel(0, panels[id]);
227         string s = "LyX: ";
228         s += fromqstr(symbolsCO->currentText());
229         p->setWindowTitle(toqstr(s));
230         p->resize(40 * 5, p->height());
231         p->show();
232         p->setMaximumSize(p->width(), p->height());
233 }
234
235
236 void QMathDialog::functionSelected(QListWidgetItem * item)
237 {
238         form_->controller().dispatchInsert(fromqstr(item->text()));
239 }
240
241
242 void QMathDialog::matrixClicked()
243 {
244         form_->controller().showDialog("mathmatrix");
245 }
246
247
248 void QMathDialog::equationClicked()
249 {
250         form_->controller().dispatchToggleDisplay();
251 }
252
253
254 void QMathDialog::subscriptClicked()
255 {
256         form_->controller().dispatchSubscript();
257 }
258
259
260 void QMathDialog::superscriptClicked()
261 {
262         form_->controller().dispatchSuperscript();
263 }
264
265
266 void QMathDialog::insertCubeRoot()
267 {
268         form_->controller().dispatchCubeRoot();
269 }
270
271
272 } // namespace frontend
273 } // namespace lyx
274
275 #include "QMathDialog_moc.cpp"