File indexing completed on 2024-04-21 05:30:55
0001 /* 0002 SPDX-FileCopyrightText: 2019 Michail Vourlakos <mvourlakos@gmail.com> 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 0006 #include "generictools.h" 0007 0008 // Qt 0009 #include <QApplication> 0010 #include <QDebug> 0011 #include <QStyle> 0012 #include <QTextDocument> 0013 0014 namespace Latte { 0015 0016 const int ICONMARGIN = 1; 0017 const int INDICATORCHANGESLENGTH = 6; 0018 const int INDICATORCHANGESMARGIN = 5; 0019 const int MARGIN = 2; 0020 0021 bool isEnabled(const QStyleOption &option) 0022 { 0023 if (option.state & QStyle::State_Enabled) { 0024 return true; 0025 } 0026 0027 return false; 0028 } 0029 0030 bool isActive(const QStyleOption &option) 0031 { 0032 if (option.state & QStyle::State_Active) { 0033 return true; 0034 } 0035 0036 return false; 0037 } 0038 0039 bool isSelected(const QStyleOption &option) 0040 { 0041 if (option.state & QStyle::State_Selected) { 0042 return true; 0043 } 0044 0045 return false; 0046 } 0047 0048 bool isHovered(const QStyleOption &option) 0049 { 0050 if (option.state & QStyle::State_MouseOver) { 0051 return true; 0052 } 0053 0054 return false; 0055 } 0056 0057 bool isFocused(const QStyleOption &option) 0058 { 0059 if (option.state & QStyle::State_HasFocus) { 0060 return true; 0061 } 0062 0063 return false; 0064 } 0065 0066 bool isTextCentered(const QStyleOptionViewItem &option) 0067 { 0068 if (option.displayAlignment & Qt::AlignHCenter) { 0069 return true; 0070 } 0071 0072 return false; 0073 } 0074 0075 Qt::AlignmentFlag horizontalAlignment(Qt::Alignment alignments) 0076 { 0077 if (alignments & Qt::AlignHCenter) { 0078 return Qt::AlignHCenter; 0079 } else if (alignments & Qt::AlignRight) { 0080 return Qt::AlignRight; 0081 } 0082 0083 return Qt::AlignLeft; 0084 } 0085 0086 QPalette::ColorGroup colorGroup(const QStyleOption &option) 0087 { 0088 if (!isEnabled(option)) { 0089 return QPalette::Disabled; 0090 } 0091 0092 if (isActive(option) || isFocused(option)) { 0093 return QPalette::Active; 0094 } 0095 0096 if (!isActive(option) && isSelected(option)) { 0097 return QPalette::Inactive; 0098 } 0099 0100 return QPalette::Normal; 0101 } 0102 0103 QStringList subtracted(const QStringList &original, const QStringList ¤t) 0104 { 0105 QStringList subtract; 0106 0107 for(int i=0; i<original.count(); ++i) { 0108 if (!current.contains(original[i])) { 0109 subtract << original[i]; 0110 } 0111 } 0112 0113 return subtract; 0114 } 0115 0116 void drawFormattedText(QPainter *painter, const QStyleOptionViewItem &option, const float textOpacity) 0117 { 0118 drawFormattedText(painter, option, option.text, horizontalAlignment(option.displayAlignment), textOpacity); 0119 } 0120 0121 void drawFormattedText(QPainter *painter, const QStyleOptionMenuItem &option, const float textOpacity) 0122 { 0123 drawFormattedText(painter, option, option.text, Qt::AlignLeft, textOpacity); 0124 } 0125 0126 QRect remainedFromFormattedText(const QStyleOption &option, const QString &text, Qt::AlignmentFlag alignment) 0127 { 0128 QString css = QString("body {}"); 0129 0130 QTextDocument doc; 0131 doc.setDefaultStyleSheet(css); 0132 doc.setHtml("<body>" + text + "</body>"); 0133 0134 //we need an offset to be in the same vertical center of TextEdit 0135 int textWidth = doc.size().width() + MARGIN; 0136 0137 Qt::AlignmentFlag curalign = alignment; 0138 0139 if (qApp->layoutDirection() == Qt::LeftToRight || (curalign == Qt::AlignHCenter)) { 0140 curalign = alignment; 0141 } else { 0142 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0143 } 0144 0145 if (alignment == Qt::AlignHCenter) { 0146 return option.rect; 0147 } else if (curalign == Qt::AlignRight) { 0148 return QRect(option.rect.x(), option.rect.y(), option.rect.width() - textWidth, option.rect.height()); 0149 } else { 0150 return QRect(option.rect.x() + textWidth, option.rect.y(), option.rect.width() - textWidth, option.rect.height()); 0151 } 0152 } 0153 0154 void drawFormattedText(QPainter *painter, const QStyleOption &option, const QString &text, Qt::AlignmentFlag alignment, const float textOpacity) 0155 { 0156 painter->save(); 0157 0158 QPalette::ColorRole applyColor = Latte::isSelected(option) ? QPalette::HighlightedText : QPalette::Text; 0159 QBrush nBrush = option.palette.brush(Latte::colorGroup(option), applyColor); 0160 0161 QColor brushColor = nBrush.color(); 0162 brushColor.setAlphaF(textOpacity); 0163 0164 QString css = QString("body { color : %1;}").arg(brushColor.name(QColor::HexArgb)); 0165 0166 QTextDocument doc; 0167 doc.setDefaultStyleSheet(css); 0168 doc.setHtml("<body>" + text + "</body>"); 0169 0170 //we need an offset to be in the same vertical center of TextEdit 0171 int offsetY = ((option.rect.height() - doc.size().height()) / 2); 0172 int textWidth = doc.size().width(); 0173 int textY = option.rect.top() + offsetY + 1; 0174 0175 Qt::AlignmentFlag curalign = alignment; 0176 0177 if (qApp->layoutDirection() == Qt::LeftToRight || (curalign == Qt::AlignHCenter)) { 0178 curalign = alignment; 0179 } else { 0180 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0181 } 0182 0183 if (alignment == Qt::AlignHCenter) { 0184 int textX = qMax(0, (option.rect.width() / 2) - (textWidth/2)); 0185 painter->translate(option.rect.left() + textX, textY); 0186 } else if (curalign == Qt::AlignRight) { 0187 painter->translate(qMax(option.rect.left(), option.rect.right() - textWidth), textY); 0188 } else { 0189 painter->translate(option.rect.left(), textY); 0190 } 0191 0192 QRect clip(0, 0, option.rect.width(), option.rect.height()); 0193 doc.drawContents(painter, clip); 0194 0195 painter->restore(); 0196 } 0197 0198 void drawBackground(QPainter *painter, const QStyleOptionViewItem &option) 0199 { 0200 QStyleOptionViewItem backOption = option; 0201 backOption.text = ""; 0202 0203 //! Remove the focus dotted lines 0204 backOption.state = (option.state & ~QStyle::State_HasFocus); 0205 0206 option.widget->style()->drawControl(QStyle::CE_ItemViewItem, &backOption, painter); 0207 } 0208 0209 void drawBackground(QPainter *painter, const QStyle *style, const QStyleOptionMenuItem &option) 0210 { 0211 QStyleOptionMenuItem backOption = option; 0212 backOption.text = ""; 0213 //! Remove the focus dotted lines 0214 // iconOption.state = (option.state & ~QStyle::State_HasFocus); 0215 0216 style->drawControl(QStyle::CE_MenuItem, &backOption, painter); 0217 } 0218 0219 QRect remainedFromLayoutIcon(const QStyleOption &option, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0220 { 0221 if (alignment == Qt::AlignHCenter) { 0222 return option.rect; 0223 } 0224 0225 return remainedFromIcon(option, alignment, lengthMargin, thickMargin); 0226 } 0227 0228 void drawLayoutIcon(QPainter *painter, const QStyleOption &option, const bool &isBackgroundFile, const QString &iconName, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0229 { 0230 bool active = Latte::isActive(option); 0231 bool selected = Latte::isSelected(option); 0232 bool focused = Latte::isFocused(option); 0233 0234 int lenmargin = (lengthMargin == -1 ? ICONMARGIN + MARGIN : lengthMargin); 0235 int thickmargin = (thickMargin == -1 ? ICONMARGIN : thickMargin); 0236 0237 int iconsize = option.rect.height() - 2*thickMargin; 0238 int total = iconsize + 2*lenmargin; 0239 0240 Qt::AlignmentFlag curalign = alignment; 0241 0242 if (qApp->layoutDirection() == Qt::LeftToRight || alignment == Qt::AlignHCenter) { 0243 curalign = alignment; 0244 } else { 0245 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0246 } 0247 0248 QRect target; 0249 0250 if (curalign == Qt::AlignLeft) { 0251 target = QRect(option.rect.x() + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0252 } else if (curalign == Qt::AlignRight) { 0253 target = QRect(option.rect.x() + option.rect.width() - total + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0254 } else { 0255 //! centered 0256 target = QRect(option.rect.x() + ((option.rect.width() - total)/2) + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0257 } 0258 0259 painter->save(); 0260 painter->setRenderHint(QPainter::Antialiasing, true); 0261 0262 if (isBackgroundFile) { 0263 int backImageMargin = 1; //most icon themes provide 1-2px. padding around icons //OLD CALCS: ICONMARGIN; //qMin(target.height()/4, ICONMARGIN+1); 0264 QRect backTarget(target.x() + backImageMargin, target.y() + backImageMargin, target.width() - 2*backImageMargin, target.height() - 2*backImageMargin); 0265 0266 QPixmap backImage(iconName); 0267 backImage = backImage.copy(backTarget); 0268 0269 QPalette::ColorRole textColorRole = selected ? QPalette::HighlightedText : QPalette::Text; 0270 0271 QBrush imageBrush(backImage); 0272 QPen pen; pen.setWidth(1); 0273 pen.setColor(option.palette.color(Latte::colorGroup(option), textColorRole)); 0274 0275 painter->setBrush(imageBrush); 0276 painter->setPen(pen); 0277 0278 painter->drawEllipse(backTarget); 0279 } else { 0280 QIcon::Mode mode = ((active && (selected || focused)) ? QIcon::Selected : QIcon::Normal); 0281 0282 painter->drawPixmap(target, QIcon::fromTheme(iconName).pixmap(target.height(), target.height(), mode)); 0283 } 0284 0285 painter->restore(); 0286 } 0287 0288 QRect remainedFromColorSchemeIcon(const QStyleOption &option, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0289 { 0290 if (alignment == Qt::AlignHCenter) { 0291 return option.rect; 0292 } 0293 0294 return remainedFromIcon(option, alignment, lengthMargin, thickMargin); 0295 } 0296 0297 void drawColorSchemeIcon(QPainter *painter, const QStyleOption &option, const QColor &textColor, const QColor &backgroundColor, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0298 { 0299 bool active = Latte::isActive(option); 0300 bool selected = Latte::isSelected(option); 0301 bool focused = Latte::isFocused(option); 0302 0303 int lenmargin = (lengthMargin == -1 ? ICONMARGIN + MARGIN : lengthMargin); 0304 int thickmargin = (thickMargin == -1 ? ICONMARGIN : thickMargin); 0305 0306 int iconsize = option.rect.height() - 2*thickMargin; 0307 int total = iconsize + 2*lenmargin; 0308 0309 Qt::AlignmentFlag curalign = alignment; 0310 0311 if (qApp->layoutDirection() == Qt::LeftToRight || alignment == Qt::AlignHCenter) { 0312 curalign = alignment; 0313 } else { 0314 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0315 } 0316 0317 QRect target; 0318 0319 if (curalign == Qt::AlignLeft) { 0320 target = QRect(option.rect.x() + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0321 } else if (curalign == Qt::AlignRight) { 0322 target = QRect(option.rect.x() + option.rect.width() - total + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0323 } else { 0324 //! centered 0325 target = QRect(option.rect.x() + ((option.rect.width() - total)/2) + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0326 } 0327 0328 painter->save(); 0329 painter->setRenderHint(QPainter::Antialiasing, false); 0330 0331 int backImageMargin = 0; //most icon themes provide 1-2px. padding around icons //OLD CALCS: ICONMARGIN; //qMin(target.height()/4, ICONMARGIN+1); 0332 QRect backTarget(target.x() + backImageMargin, target.y() + backImageMargin, target.width() - 2*backImageMargin, target.height() - 2*backImageMargin); 0333 0334 QPalette::ColorRole textColorRole = selected ? QPalette::HighlightedText : QPalette::Text; 0335 0336 QBrush colorbrush(backgroundColor); 0337 QPen pen; pen.setWidth(1); 0338 pen.setColor(option.palette.color(Latte::colorGroup(option), textColorRole)); 0339 0340 painter->setBrush(colorbrush); 0341 painter->setPen(pen); 0342 0343 int rectsize = 0.7 * backTarget.width(); 0344 int gap = backTarget.width() - rectsize; 0345 0346 painter->drawRect(backTarget.right() - rectsize, backTarget.bottom() - rectsize, rectsize, rectsize); 0347 0348 colorbrush.setColor(textColor); 0349 painter->setBrush(colorbrush); 0350 painter->drawRect(backTarget.x(), backTarget.y(), rectsize, rectsize); 0351 0352 painter->restore(); 0353 } 0354 0355 0356 QRect remainedFromIcon(const QStyleOption &option, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0357 { 0358 int lenmargin = (lengthMargin == -1 ? ICONMARGIN + MARGIN : lengthMargin); 0359 int thickmargin = (thickMargin == -1 ? ICONMARGIN : thickMargin); 0360 0361 int iconsize = option.rect.height() - 2*thickMargin; 0362 int total = iconsize + 2*lenmargin; 0363 0364 Qt::AlignmentFlag curalign = alignment; 0365 0366 if (qApp->layoutDirection() == Qt::LeftToRight) { 0367 curalign = alignment; 0368 } else { 0369 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0370 } 0371 0372 QRect optionRemainedRect = (curalign == Qt::AlignLeft) ? QRect(option.rect.x() + total, option.rect.y(), option.rect.width() - total, option.rect.height()) : 0373 QRect(option.rect.x(), option.rect.y(), option.rect.width() - total, option.rect.height()); 0374 0375 return optionRemainedRect; 0376 } 0377 0378 void drawIcon(QPainter *painter, const QStyleOption &option, const QString &icon, Qt::AlignmentFlag alignment, int lengthMargin, int thickMargin) 0379 { 0380 int lenmargin = (lengthMargin == -1 ? ICONMARGIN + MARGIN : lengthMargin); 0381 int thickmargin = (thickMargin == -1 ? ICONMARGIN : thickMargin); 0382 0383 int iconsize = option.rect.height() - 2*thickMargin; 0384 int total = iconsize + 2*lenmargin; 0385 0386 bool active = Latte::isActive(option); 0387 bool selected = Latte::isSelected(option); 0388 bool focused = Latte::isFocused(option); 0389 0390 QIcon::Mode mode = ((active && (selected || focused)) ? QIcon::Selected : QIcon::Normal); 0391 0392 Qt::AlignmentFlag curalign = alignment; 0393 0394 if (qApp->layoutDirection() == Qt::LeftToRight) { 0395 curalign = alignment; 0396 } else { 0397 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0398 } 0399 0400 QRect target; 0401 0402 if (curalign == Qt::AlignLeft) { 0403 target = QRect(option.rect.x() + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0404 } else { 0405 target = QRect(option.rect.x() + option.rect.width() - total + lenmargin, option.rect.y() + thickmargin, iconsize, iconsize); 0406 } 0407 0408 painter->drawPixmap(target, QIcon::fromTheme(icon).pixmap(target.height(), target.height(), mode)); 0409 } 0410 0411 int primitiveCheckBoxWidth(const QStyleOptionButton &option, const QWidget *widget) 0412 { 0413 QStyleOption copt; 0414 copt.rect = option.rect; 0415 int w = QApplication::style()->sizeFromContents(QStyle::CT_CheckBox, &copt, QSize(0, option.rect.height()), widget).width(); 0416 w = w > 0 ? w : option.rect.height() - 2*MARGIN; 0417 return w; 0418 } 0419 0420 QRect remainedFromCheckBox(const QStyleOptionButton &option, Qt::AlignmentFlag alignment, const QWidget *widget) 0421 { 0422 int length = primitiveCheckBoxWidth(option, widget) - MARGIN; 0423 Qt::AlignmentFlag curalign = alignment; 0424 0425 if (qApp->layoutDirection() == Qt::LeftToRight) { 0426 curalign = alignment; 0427 } else { 0428 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0429 } 0430 0431 QRect optionRemainedRect = (curalign == Qt::AlignLeft) ? QRect(option.rect.x() + length, option.rect.y(), option.rect.width() - length, option.rect.height()) : 0432 QRect(option.rect.x(), option.rect.y(), option.rect.width() - length, option.rect.height()); 0433 0434 return optionRemainedRect; 0435 } 0436 0437 void drawCheckBox(QPainter *painter, const QStyleOptionButton &option, Qt::AlignmentFlag alignment, const QWidget *widget) 0438 { 0439 int length = primitiveCheckBoxWidth(option, widget) - MARGIN; 0440 QStyleOptionButton optionbtn = option; 0441 0442 Qt::AlignmentFlag curalign = alignment; 0443 0444 if (qApp->layoutDirection() == Qt::LeftToRight) { 0445 curalign = alignment; 0446 } else { 0447 curalign = alignment == Qt::AlignLeft ? Qt::AlignRight : Qt::AlignLeft; 0448 } 0449 0450 QRect changesrect = (curalign == Qt::AlignLeft) ? QRect(option.rect.x() + MARGIN, option.rect.y(), length - MARGIN, option.rect.height()) : 0451 QRect(option.rect.x() + option.rect.width() - length, option.rect.y(), length - MARGIN, option.rect.height()); 0452 0453 optionbtn.rect = changesrect; 0454 0455 QApplication::style()->drawControl(QStyle::CE_CheckBox, &optionbtn, painter, widget); 0456 } 0457 0458 QRect remainedFromChangesIndicator(const QStyleOptionViewItem &option) 0459 { 0460 int tsize{INDICATORCHANGESLENGTH + INDICATORCHANGESMARGIN*2}; 0461 0462 QRect optionRemainedRect = (qApp->layoutDirection() == Qt::RightToLeft) ? QRect(option.rect.x() + tsize, option.rect.y(), option.rect.width() - tsize, option.rect.height()) : 0463 QRect(option.rect.x(), option.rect.y(), option.rect.width() - tsize, option.rect.height()); 0464 0465 return optionRemainedRect; 0466 } 0467 0468 void drawChangesIndicator(QPainter *painter, const QStyleOptionViewItem &option) 0469 { 0470 //! draw changes circle indicator 0471 int csize{INDICATORCHANGESLENGTH}; 0472 int tsize{INDICATORCHANGESLENGTH + INDICATORCHANGESMARGIN*2}; 0473 0474 painter->save(); 0475 0476 QRect changesRect = (qApp->layoutDirection() == Qt::RightToLeft) ? QRect(option.rect.x() + INDICATORCHANGESMARGIN, option.rect.y() + option.rect.height()/2 - csize/2, csize, csize) : 0477 QRect(option.rect.x() + option.rect.width() - csize - INDICATORCHANGESMARGIN, option.rect.y() + option.rect.height()/2 - csize/2, csize, csize); 0478 0479 QColor plasmaOrange(246, 116, 0); //orangish color used from plasma systemsettings #f67400 0480 QBrush backBrush(plasmaOrange); 0481 QPen pen; pen.setWidth(1); 0482 pen.setColor(plasmaOrange); 0483 0484 painter->setBrush(backBrush); 0485 painter->setPen(pen); 0486 painter->drawEllipse(changesRect); 0487 0488 painter->restore(); 0489 } 0490 0491 int screenMaxLength(const QStyleOption &option, const int &maxIconSize) 0492 { 0493 int icon_length = maxIconSize >= 0 ? qMin(option.rect.height(), maxIconSize) : option.rect.height(); 0494 0495 int scr_maxlength = icon_length * 1.7; 0496 0497 //! provide odd screen_maxlength 0498 if (scr_maxlength % 2 == 0) { 0499 scr_maxlength--; 0500 } 0501 0502 return scr_maxlength; 0503 } 0504 0505 QRect remainedFromScreenDrawing(const QStyleOption &option, bool drawMultipleScreens, const int &maxIconSize) 0506 { 0507 int total_length = screenMaxLength(option, maxIconSize) + MARGIN * 2 + 1; 0508 0509 QRect optionRemainedRect = (qApp->layoutDirection() == Qt::RightToLeft) ? QRect(option.rect.x(), option.rect.y(), option.rect.width() - total_length, option.rect.height()) : 0510 QRect(option.rect.x() + total_length, option.rect.y(), option.rect.width() - total_length, option.rect.height()); 0511 0512 return optionRemainedRect; 0513 } 0514 0515 QRect drawScreen(QPainter *painter, const QStyleOption &option, bool drawMultipleScreens, QRect screenGeometry, const int &maxIconSize, const float brushOpacity) 0516 { 0517 float scr_ratio = (float)screenGeometry.width() / (float)screenGeometry.height(); 0518 bool isVertical = (scr_ratio < 1.0); 0519 0520 int scr_maxlength = screenMaxLength(option, maxIconSize); 0521 int scr_maxthickness = maxIconSize >= 0 ? qMin(maxIconSize, option.rect.height() - MARGIN * 2) : option.rect.height() - MARGIN * 2; 0522 0523 int total_length = scr_maxlength + MARGIN * 2; 0524 int pen_width = 2; 0525 0526 painter->save(); 0527 painter->setRenderHint(QPainter::Antialiasing, true); 0528 0529 float scr_maxratio = ((float)scr_maxlength) / (float)(scr_maxthickness); 0530 scr_ratio = qMin(qMax((float)0.75, scr_ratio), (float)scr_maxratio); 0531 int scr_height = (!isVertical ? scr_maxthickness - MARGIN * 4 : scr_maxthickness - MARGIN * 2); 0532 int scr_width = scr_ratio * scr_height; 0533 0534 //! provide even screen width and height 0535 if (scr_width % 2 == 1) { 0536 scr_width++; 0537 } 0538 0539 //! provide even screen width and height 0540 if (scr_height % 2 == 0) { 0541 scr_height++; 0542 } 0543 0544 int topmargin = (option.rect.height() - scr_maxthickness) / 2; 0545 0546 QRect screenMaximumRect = (qApp->layoutDirection() == Qt::RightToLeft) ? 0547 QRect(option.rect.x() + option.rect.width() - scr_maxlength - MARGIN, option.rect.y() + topmargin, scr_maxlength, scr_maxthickness - 1) : 0548 QRect(option.rect.x() + MARGIN , option.rect.y() + topmargin, scr_maxlength, scr_maxthickness - 1); 0549 0550 int topScreenMargin = (screenMaximumRect.height() - scr_height) / 2; 0551 int leftScreenMargin = (screenMaximumRect.width() - scr_width) / 2; 0552 0553 QRect screenRect(screenMaximumRect.x() + leftScreenMargin + MARGIN/2, screenMaximumRect.y() + topScreenMargin, scr_width, scr_height); 0554 0555 QRect screenAvailableRect(screenRect.x() + pen_width - 1, screenRect.y() + pen_width - 1, screenRect.width() - pen_width - 1, screenRect.height() - pen_width - 1); 0556 0557 bool selected = Latte::isSelected(option); 0558 QPalette::ColorRole textColorRole = selected ? QPalette::HighlightedText : QPalette::Text; 0559 0560 QPen pen; pen.setWidth(pen_width); 0561 QColor pencolor = option.palette.color(Latte::colorGroup(option), textColorRole); 0562 pencolor.setAlphaF(brushOpacity); 0563 pen.setColor(pencolor); 0564 0565 painter->setPen(pen); 0566 painter->drawRect(screenRect); 0567 0568 //! draw screen base 0569 pen.setWidth(1); 0570 painter->setPen(pen); 0571 painter->setRenderHint(QPainter::Antialiasing, false); 0572 0573 //! draw multiple 0574 if (drawMultipleScreens) { 0575 int multiplemargin = 3; 0576 int curx = screenRect.x()-multiplemargin; 0577 painter->drawLine(screenRect.x() - multiplemargin, screenRect.y() - multiplemargin, 0578 screenRect.x() - multiplemargin, screenRect.y() - multiplemargin + screenRect.height()); 0579 painter->drawLine(screenRect.x() - multiplemargin, screenRect.y() - multiplemargin, 0580 screenRect.x() - multiplemargin + screenRect.width(), screenRect.y() - multiplemargin); 0581 } 0582 0583 int basex = screenRect.x() + (screenRect.width()/2) - 4; 0584 int basey = screenRect.y() + screenRect.height() + 2; 0585 0586 painter->drawLine(basex , basey, basex + 8, basey); 0587 0588 // debug screen maximum available rect 0589 //painter->drawRect(screenMaximumRect); 0590 0591 painter->restore(); 0592 0593 return screenAvailableRect; 0594 } 0595 0596 } 0597