2 * \file BulletsModule.cpp
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.
15 #include "BulletsModule.h"
16 #include "GuiApplication.h"
17 #include "qt_helpers.h"
30 int const CHARMAX = 36;
31 int const FONTMAX = 6;
33 BulletsModule::BulletsModule(QWidget * parent)
38 for (int iter = 0; iter < 4; ++iter)
39 bullets_[iter] = ITEMIZE_DEFAULTS[iter];
45 levelLW->addItem("1");
46 levelLW->addItem("2");
47 levelLW->addItem("3");
48 levelLW->addItem("4");
51 setupPanel(new QListWidget(bulletpaneSW), qt_("Standard[[Bullets]]"), 0);
52 setupPanel(new QListWidget(bulletpaneSW), qt_("Maths"), 1, "math");
53 setupPanel(new QListWidget(bulletpaneSW), qt_("Dings 1"), 2);
54 setupPanel(new QListWidget(bulletpaneSW), qt_("Dings 2"), 3);
55 setupPanel(new QListWidget(bulletpaneSW), qt_("Dings 3"), 4);
56 setupPanel(new QListWidget(bulletpaneSW), qt_("Dings 4"), 5);
58 connect(levelLW, SIGNAL(currentRowChanged(int)),
59 this, SLOT(showLevel(int)));
60 connect(bulletpaneCO, SIGNAL(activated(int)), bulletpaneSW,
61 SLOT(setCurrentIndex(int)));
65 string const bulletIcon(int f, int c)
67 static char const * BulletPanelIcons0[CHARMAX] = {
69 "bfendash", "vdash", "dashv", "flat", "natural",
70 "sharp", "ast", "star", "bullet", "circ", "cdot",
71 "dagger", "bigtriangleup", "bigtriangledown", "triangleleft",
72 "triangleright", "lhd", "rhd", "oplus", "ominus", "otimes",
73 "oslash", "odot", "spadesuit", "diamond", "diamond2", "box",
74 "diamondsuit", "heartsuit", "clubsuit", "rightarrow", "leadsto",
75 "rightharpoonup", "rightharpoondown", "rightarrow2", "succ"
77 static char const * BulletPanelIcons1[CHARMAX] = {
79 "Rrightarrow", "rightarrowtail", "twoheadrightarrow", "rightsquigarrow",
80 "looparrowright", "multimap", "boxtimes", "boxplus", "boxminus",
81 "boxdot", "divideontimes", "Vvdash", "lessdot", "gtrdot", "maltese",
82 "bigstar", "checkmark", "vdash2", "backsim", "thicksim",
83 "centerdot", "circleddash", "circledast", "circledcirc",
84 "vartriangleleft", "vartriangleright", "vartriangle", "triangledown",
85 "lozenge", "square", "blacktriangleleft", "blacktriangleright", "blacktriangle",
86 "blacktriangledown", "blacklozenge", "blacksquare"
88 static char const * BulletPanelIcons2[CHARMAX] = {
90 "ding108", "ding109", "ding119", "pisymbol_psy197",
91 "pisymbol_psy196", "pisymbol_psy183", "ding71", "ding70",
92 "ding118", "ding117", "pisymbol_psy224", "pisymbol_psy215",
93 "ding111", "ding112", "ding113", "ding114",
94 "pisymbol_psy68", "pisymbol_psy209", "ding120", "ding121",
95 "ding122", "ding110", "ding115", "ding116",
96 "pisymbol_psy42", "ding67", "ding66", "ding82",
97 "ding81", "ding228", "ding162", "ding163",
98 "ding166", "ding167", "ding226", "ding227"
100 static char const * BulletPanelIcons3[CHARMAX] = {
102 "ding37", "ding38", "ding34", "ding36",
103 "ding39", "ding40", "ding41", "ding42",
104 "ding43", "ding44", "ding45", "ding47",
105 "ding53", "ding54", "ding59", "ding57",
106 "ding62", "ding61", "ding55", "ding56",
107 "ding58", "ding60", "ding63", "ding64",
108 "ding51", "ding52", "pisymbol_psy170", "pisymbol_psy167",
109 "pisymbol_psy168", "pisymbol_psy169", "ding164", "ding165",
110 "ding171", "ding168", "ding169", "ding170"
112 static char const * BulletPanelIcons4[CHARMAX] = {
114 "ding65", "ding76", "ding75", "ding72",
115 "ding80", "ding74", "ding78", "ding77",
116 "ding79", "ding85", "ding90", "ding98",
117 "ding83", "ding84", "ding86", "ding87",
118 "ding88", "ding89", "ding92", "ding91",
119 "ding93", "ding105", "ding94", "ding99",
120 "ding103", "ding104", "ding106", "ding107",
121 "ding68", "ding69", "ding100", "ding101",
122 "ding102", "ding96", "ding95", "ding97"
124 static char const * BulletPanelIcons5[CHARMAX] = {
126 "ding223", "ding224", "ding225", "ding232",
127 "ding229", "ding230", "ding238", "ding237",
128 "ding236", "ding235", "ding234", "ding233",
129 "ding239", "ding241", "ding250", "ding251",
130 "ding49", "ding50", "ding217", "ding245",
131 "ding243", "ding248", "ding252", "ding253",
132 "ding219", "ding213", "ding221", "ding222",
133 "ding220", "ding212", "pisymbol_psy174", "pisymbol_psy222",
134 "ding254", "ding242", "ding231", "pisymbol_psy45"
137 static char const ** BulletPanelIcons[FONTMAX] = {
138 BulletPanelIcons0, BulletPanelIcons1,
139 BulletPanelIcons2, BulletPanelIcons3,
140 BulletPanelIcons4, BulletPanelIcons5
143 return BulletPanelIcons[f][c];
147 QPixmap getSelectedPixmap(QPixmap pixmap, QSize const icon_size)
149 QPalette palette = QPalette();
150 QColor text_color = (guiApp->isInDarkMode())
151 ? palette.color(QPalette::Active, QPalette::WindowText)
153 QColor highlight_color = palette.color(QPalette::Active, QPalette::HighlightedText);
154 QColor highlight_bg = palette.color(QPalette::Active, QPalette::Highlight);
156 // create a layer with black text turned to QPalette::HighlightedText
157 QPixmap hl_overlay(pixmap.size());
158 hl_overlay.fill(highlight_color);
159 hl_overlay.setMask(pixmap.createMaskFromColor(text_color, Qt::MaskOutColor));
161 // Create highlighted background
162 QPixmap hl_background(icon_size);
163 hl_background.fill(highlight_bg);
165 // put layers on top of existing pixmap
166 QPainter painter(&pixmap);
167 painter.drawPixmap(pixmap.rect(), hl_background);
168 painter.drawPixmap(pixmap.rect(), hl_overlay);
174 void BulletsModule::setupPanel(QListWidget * lw, QString const & panelname,
175 int const font, string const folder)
177 connect(lw, SIGNAL(itemClicked(QListWidgetItem *)),
178 this, SLOT(bulletSelected(QListWidgetItem *)));
180 // add panelname to combox
181 bulletpaneCO->addItem(panelname);
183 lw->setViewMode(QListView::IconMode);
184 lw->setDragDropMode(QAbstractItemView::NoDragDrop);
185 lw->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
186 lw->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
187 lw->setFlow(QListView::LeftToRight);
189 lw->setUniformItemSizes(true);
191 QSize icon_size(26, 26);
192 lw->setIconSize(icon_size);
194 // we calculate the appropriate width to fit 6 icons in a row
195 lw->setFixedWidth((6 * (icon_size.width() + lw->spacing()))
196 + (lw->frameWidth() * 2)
197 + lw->verticalScrollBar()->height());
199 lw->setFixedHeight((6 * (icon_size.height() + lw->spacing()))
200 + (lw->frameWidth() * 2)
201 + lw->horizontalScrollBar()->height());
203 for (int i = 0; i < CHARMAX; ++i) {
204 string const iconname = bulletIcon(font, i);
205 // get pixmap with bullets
206 QPixmap pixmap = getPixmap("images/" + toqstr(folder) + "/", toqstr(iconname), "svgz");
208 icon.addPixmap(getSelectedPixmap(pixmap, icon_size), QIcon::Selected);
209 QListWidgetItem * lwi = new QListWidgetItem(icon, QString(), 0, i);
210 lwi->setToolTip(toqstr(Bullet::bulletEntry(font, i)));
211 lwi->setSizeHint(icon_size);
215 // add bulletpanel to stackedwidget
216 bulletpaneSW->addWidget(lw);
220 void BulletsModule::showLevel(int level)
222 // unselect previous item
223 selectItem(current_font_, current_char_, false);
225 current_font_ = bullets_[level].getFont();
227 if (bullets_[level].getFont() < 0) {
228 customCB->setCheckState(Qt::Checked);
229 customLE->setText(toqstr(bullets_[level].getText()));
230 bulletsizeCO->setEnabled(false);
231 sizeL->setEnabled(false);
233 customCB->setCheckState(Qt::Unchecked);
235 current_char_ = bullets_[level].getCharacter();
236 selectItem(current_font_, current_char_, true);
237 bulletpaneCO->setCurrentIndex(current_font_);
238 bulletpaneSW->setCurrentIndex(current_font_);
239 bulletsizeCO->setEnabled(true);
240 sizeL->setEnabled(true);
242 bulletsizeCO->setCurrentIndex(bullets_[level].getSize() + 1);
246 void BulletsModule::init()
248 levelLW->setCurrentRow(0);
253 void BulletsModule::bulletSelected(QListWidgetItem * item)
255 int const level = levelLW->currentRow();
258 if (bullets_[level].getFont() == bulletpaneCO->currentIndex()
259 && bullets_[level].getCharacter() == item->type())
262 // unselect previous item
263 selectItem(current_font_, current_char_, false);
265 bullets_[level].setCharacter(item->type());
266 bullets_[level].setFont(bulletpaneCO->currentIndex());
267 current_font_ = bulletpaneCO->currentIndex();
268 current_char_ = item->type();
273 void BulletsModule::on_customCB_clicked(bool custom)
275 bulletsizeCO->setEnabled(!custom);
276 sizeL->setEnabled(!custom);
279 if (current_font_ < 0)
280 current_font_ = bulletpaneCO->currentIndex();
284 // unselect previous item
285 selectItem(current_font_, current_char_, false);
291 void BulletsModule::selectItem(int font, int character, bool select)
296 QListWidget * lw = static_cast<QListWidget *>(bulletpaneSW->widget(font));
297 if (lw->item(character))
298 lw->item(character)->setSelected(select);
302 void BulletsModule::on_customLE_textEdited(const QString & text)
304 if (customCB->checkState() == Qt::Unchecked)
307 bullets_[levelLW->currentRow()].setFont(current_font_);
308 bullets_[levelLW->currentRow()].setText(qstring_to_ucs4(text));
313 void BulletsModule::on_bulletsizeCO_activated(int size)
315 // -1 apparently means default...
316 bullets_[levelLW->currentRow()].setSize(size - 1);
321 void BulletsModule::setBullet(int level, Bullet const & bullet)
323 bullets_[level] = bullet;
327 Bullet const & BulletsModule::bullet(int level) const
329 return bullets_[level];
332 } // namespace frontend
337 #include "moc_BulletsModule.cpp"