3 * This file is part of LyX, the document processor.
4 * Licence details can be found in the file COPYING.
8 * Full author contact details are available in file CREDITS.
13 #include "QMathDialog.h"
17 #include <QResizeEvent>
18 #include <QScrollArea>
20 #include <QPushButton>
21 #include <QListWidget>
22 #include <QListWidgetItem>
25 #include "iconpalette.h"
26 #include "qt_helpers.h"
27 #include "controllers/ControlMath.h"
28 #include "frontends/lyx_gui.h"
38 char const ** panels[] = {
39 latex_bop, latex_varsz, latex_brel, latex_greek, latex_arrow,
40 latex_dots, latex_deco, latex_misc, latex_ams_ops,
41 latex_ams_rel, latex_ams_nrel, latex_ams_arrows,
45 int const nr_panels = sizeof(panels)/sizeof(panels[0]);
47 bool panel_initialised[nr_panels];
52 QMathDialog::QMathDialog(QMath * form)
57 // enlarge the symbols ComboBox (no scrollbar)
58 //symbolsCO->setSizeLimit(13);
60 connect( tearoffPB, SIGNAL( clicked() ), this, SLOT( expandClicked() ) );
61 connect( closePB, SIGNAL( clicked() ), this, SLOT( accept() ) );
62 connect( fracPB, SIGNAL( clicked() ), this, SLOT( fracClicked() ) );
63 connect( superscriptPB, SIGNAL( clicked() ), this, SLOT( superscriptClicked() ) );
64 connect( subscriptPB, SIGNAL( clicked() ), this, SLOT( subscriptClicked() ) );
65 connect( delimitersPB, SIGNAL( clicked() ), this, SLOT( delimiterClicked() ) );
66 connect( matrixPB, SIGNAL( clicked() ), this, SLOT( matrixClicked() ) );
67 connect( functionsLW, SIGNAL( itemActivated(QListWidgetItem *) ), this, SLOT( functionSelected(QListWidgetItem *) ) );
68 connect( equationPB, SIGNAL( clicked() ), this, SLOT( equationClicked() ) );
69 connect( symbolsCO, SIGNAL(activated(int)), this, SLOT(showingPanel(int)));
72 for (int i = 0; *function_names[i]; ++i) {
73 functionsLW->addItem(function_names[i]);
75 //functionsLW->setFixedWidth(functionsLW->sizeHint().width());
77 // add first symbol panel
80 // 5 buttons + 2 margins + 1 scrollbar
81 symbolWS->setFixedWidth(5*40 + 2*10 + 15 );
83 // add menu's to the buttons
84 QMenu * m = new QMenu(spacePB);
85 m->setTitle(qt_("LyX: Math Spacing"));
86 m->setTearOffEnabled(true);
87 addMenuItem(m, qt_("Thin space \\,"), ",");
88 addMenuItem(m, qt_("Medium space \\:"), ":");
89 addMenuItem(m, qt_("Thick space \\;"), ";");
90 addMenuItem(m, qt_("Quadratin space \\quad"), "quad");
91 addMenuItem(m, qt_("Double quadratin space \\qquad"), "qquad");
92 addMenuItem(m, qt_("Negative space \\!"), "!");
95 m = new QMenu(sqrtPB);
96 m->setTitle(qt_("LyX: Math Roots"));
97 m->setTearOffEnabled(true);
98 addMenuItem(m, qt_("Square root \\sqrt"), "sqrt");
99 QAction * ma = new QAction(qt_("Cube root \\root"), this);
100 connect(ma, SIGNAL(triggered()), this, SLOT(insertCubeRoot()));
102 addMenuItem(m, qt_("Other root \\root"), "root");
105 m = new QMenu(stylePB);
106 m->setTitle(qt_("LyX: Math Styles"));
107 m->setTearOffEnabled(true);
108 addMenuItem(m, qt_("Display style \\displaystyle"), "displaystyle");
109 addMenuItem(m, qt_("Normal text style \\textstyle"), "textstyle");
110 addMenuItem(m, qt_("Script (small) style \\scriptstyle"), "scriptstyle");
111 addMenuItem(m, qt_("Scriptscript (smaller) style \\scriptscriptstyle"), "scriptscriptstyle");
112 stylePB->setPopup(m);
114 m = new QMenu(fontPB);
115 m->setTitle(qt_("LyX: Math Fonts"));
116 m->setTearOffEnabled(true);
117 addMenuItem(m, qt_("Roman \\mathrm"), "mathrm");
118 addMenuItem(m, qt_("Bold \\mathbf"), "mathbf");
119 addMenuItem(m, qt_("Bold symbol \\boldsymbol"), "boldsymbol");
120 addMenuItem(m, qt_("Sans serif \\mathsf"), "mathsf");
121 addMenuItem(m, qt_("Italic \\mathit"), "mathit");
122 addMenuItem(m, qt_("Typewriter \\mathtt"), "mathtt");
123 addMenuItem(m, qt_("Blackboard \\mathbb"), "mathbb");
124 addMenuItem(m, qt_("Fraktur \\mathfrak"), "mathfrak");
125 addMenuItem(m, qt_("Calligraphic \\mathcal"), "mathcal");
126 addMenuItem(m, qt_("Normal text mode \\textrm"), "textrm");
130 void QMathDialog::addMenuItem(QMenu * menu, const QString & label, const std::string & action)
132 QMAction * ma = new QMAction(label,action, this);
133 connect(ma, SIGNAL(action(const std::string &)), this, SLOT(symbol_clicked(const std::string &)));
137 void QMathDialog::showingPanel(int num)
139 if (!panel_initialised[num])
142 symbolWS->setCurrentIndex(num);
146 IconPalette * QMathDialog::makePanel(QWidget * parent, char const ** entries)
148 IconPalette * p = new IconPalette(parent);
149 for (int i = 0; *entries[i]; ++i) {
150 p->add(QPixmap(toqstr(find_xpm(entries[i]))), entries[i], string("\\") + entries[i]);
152 // Leave these std:: qualifications alone !
153 connect(p, SIGNAL(button_clicked(const std::string &)),
154 this, SLOT(symbol_clicked(const std::string &)));
160 void QMathDialog::addPanel(int num)
162 QScrollArea * sc = new QScrollArea(symbolWS);
163 IconPalette * p = makePanel(this, panels[num]);
164 p->resize(40 * 5, p->height());
166 symbolWS->insertWidget(num,sc);
167 panel_initialised[num] = true;
171 void QMathDialog::symbol_clicked(const string & str)
173 form_->controller().dispatchInsert(str);
177 void QMathDialog::fracClicked()
179 form_->controller().dispatchInsert("frac");
183 void QMathDialog::delimiterClicked()
185 form_->controller().showDialog("mathdelimiter");
189 void QMathDialog::expandClicked()
191 int const id = symbolsCO->currentIndex();
192 IconPalette * p = makePanel(0, panels[id]);
194 s += fromqstr(symbolsCO->currentText());
195 p->setCaption(toqstr(s));
196 p->resize(40 * 5, p->height());
198 p->setMaximumSize(p->width(), p->height());
202 void QMathDialog::functionSelected(QListWidgetItem * item)
204 form_->controller().dispatchInsert(fromqstr(item->text()));
208 void QMathDialog::matrixClicked()
210 form_->controller().showDialog("mathmatrix");
214 void QMathDialog::equationClicked()
216 form_->controller().dispatchToggleDisplay();
220 void QMathDialog::subscriptClicked()
222 form_->controller().dispatchSubscript();
226 void QMathDialog::superscriptClicked()
228 form_->controller().dispatchSuperscript();
232 void QMathDialog::insertCubeRoot()
234 form_->controller().dispatchCubeRoot();
238 } // namespace frontend