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(currentItemChanged(QListWidgetItem*, QListWidgetItem*)),
178 this, SLOT(bulletSelected(QListWidgetItem *, 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());
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, QListWidgetItem *)
255 // unselect previous item
256 selectItem(current_font_, current_char_, false);
258 int const level = levelLW->currentRow();
259 bullets_[level].setCharacter(item->type());
260 bullets_[level].setFont(bulletpaneCO->currentIndex());
261 current_font_ = bulletpaneCO->currentIndex();
262 current_char_ = item->type();
267 void BulletsModule::on_customCB_clicked(bool custom)
269 bulletsizeCO->setEnabled(!custom);
270 sizeL->setEnabled(!custom);
273 if (current_font_ < 0)
274 current_font_ = bulletpaneCO->currentIndex();
278 // unselect previous item
279 selectItem(current_font_, current_char_, false);
285 void BulletsModule::selectItem(int font, int character, bool select)
290 QListWidget * lw = static_cast<QListWidget *>(bulletpaneSW->widget(font));
291 if (lw->item(character))
292 lw->item(character)->setSelected(select);
296 void BulletsModule::on_customLE_textEdited(const QString & text)
298 if (customCB->checkState() == Qt::Unchecked)
301 bullets_[levelLW->currentRow()].setFont(current_font_);
302 bullets_[levelLW->currentRow()].setText(qstring_to_ucs4(text));
307 void BulletsModule::on_bulletsizeCO_activated(int size)
309 // -1 apparently means default...
310 bullets_[levelLW->currentRow()].setSize(size - 1);
315 void BulletsModule::setBullet(int level, Bullet const & bullet)
317 bullets_[level] = bullet;
321 Bullet const & BulletsModule::bullet(int level) const
323 return bullets_[level];
326 } // namespace frontend
331 #include "moc_BulletsModule.cpp"