diff options
Diffstat (limited to 'kstyles/highcontrast')
-rw-r--r-- | kstyles/highcontrast/Makefile.am | 41 | ||||
-rw-r--r-- | kstyles/highcontrast/TODO | 5 | ||||
-rw-r--r-- | kstyles/highcontrast/config/Makefile.am | 12 | ||||
-rw-r--r-- | kstyles/highcontrast/config/highcontrastconfig.cpp | 94 | ||||
-rw-r--r-- | kstyles/highcontrast/config/highcontrastconfig.h | 61 | ||||
-rw-r--r-- | kstyles/highcontrast/highcontrast.cpp | 1843 | ||||
-rw-r--r-- | kstyles/highcontrast/highcontrast.h | 162 | ||||
-rw-r--r-- | kstyles/highcontrast/highcontrast.themerc | 127 |
8 files changed, 2345 insertions, 0 deletions
diff --git a/kstyles/highcontrast/Makefile.am b/kstyles/highcontrast/Makefile.am new file mode 100644 index 000000000..9157e3488 --- /dev/null +++ b/kstyles/highcontrast/Makefile.am @@ -0,0 +1,41 @@ + +# This file is part of the KDE libraries +# Copyright (C) 2005 Olaf Schmidt (ojschmidt@kde.org) + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Library General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Library General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this library; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301, USA. + +AUTOMAKE_OPTIONS = foreign + +SUBDIRS = config + +KDE_CXXFLAGS = -DQT_PLUGIN + +INCLUDES = $(all_includes) + +stylercdir = $(kde_datadir)/kstyle/themes +stylerc_DATA = highcontrast.themerc + +EXTRA_DIST = $(stylerc_DATA) + +noinst_HEADERS = highcontrast.h + +kde_style_LTLIBRARIES = highcontrast.la +highcontrast_la_SOURCES = highcontrast.cpp +highcontrast_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module +highcontrast_la_LIBADD = ../../kdefx/libkdefx.la +highcontrast_la_METASOURCES = AUTO + +DISTCLEANFILES = $(highcontrast_la_METASOURCES) diff --git a/kstyles/highcontrast/TODO b/kstyles/highcontrast/TODO new file mode 100644 index 000000000..a7795bab8 --- /dev/null +++ b/kstyles/highcontrast/TODO @@ -0,0 +1,5 @@ +- QLineEdit are much taller than the other widgets. Check why. +- The QLineEdits background seem to bleed on the outside. +- Use a thicker dotted line (or a solid line?) for the TreView 'branches' + +- ListViewExpanders should get their size from the item text height. (done) diff --git a/kstyles/highcontrast/config/Makefile.am b/kstyles/highcontrast/config/Makefile.am new file mode 100644 index 000000000..23f9c6a81 --- /dev/null +++ b/kstyles/highcontrast/config/Makefile.am @@ -0,0 +1,12 @@ +INCLUDES = $(all_includes) + +noinst_HEADERS = highcontrastconfig.h +kde_module_LTLIBRARIES = kstyle_highcontrast_config.la +kstyle_highcontrast_config_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) -module +kstyle_highcontrast_config_la_LIBADD = $(LIB_KDEUI) +kstyle_highcontrast_config_la_SOURCES = highcontrastconfig.cpp +kstyle_highcontrast_config_la_METASOURCES = AUTO + + +messages: + $(XGETTEXT) *.cpp *.h -o $(podir)/kstyle_highcontrast_config.pot diff --git a/kstyles/highcontrast/config/highcontrastconfig.cpp b/kstyles/highcontrast/config/highcontrastconfig.cpp new file mode 100644 index 000000000..33771f76c --- /dev/null +++ b/kstyles/highcontrast/config/highcontrastconfig.cpp @@ -0,0 +1,94 @@ +/* +Copyright (c) 2005 Luciano Montanaro <mikelima@cirulla.net> + +based on the Keramick configuration dialog +Copyright (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net> + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#include <qcheckbox.h> +#include <qlayout.h> +#include <qsettings.h> +#include <kdialog.h> +#include <kglobal.h> +#include <klocale.h> + +#include "highcontrastconfig.h" + +extern "C" KDE_EXPORT QWidget* +allocate_kstyle_config(QWidget* parent) +{ + return new HighContrastStyleConfig(parent); +} + +HighContrastStyleConfig::HighContrastStyleConfig( + QWidget* parent): QWidget(parent) +{ + // Should have no margins here, the dialog provides them + QVBoxLayout* layout = new QVBoxLayout(this, 0, 0); + KGlobal::locale()->insertCatalogue("kstyle_highcontrast_config"); + + wideLinesBox = new QCheckBox(i18n("Use wider lines"), this); + + layout->add(wideLinesBox); + layout->addStretch(1); + + QSettings s; + + originalWideLinesState = s.readBoolEntry( + "/highcontraststyle/Settings/wideLines", false); + wideLinesBox->setChecked(originalWideLinesState); + + connect(wideLinesBox, SIGNAL(toggled(bool)), SLOT(updateChanged())); +} + +HighContrastStyleConfig::~HighContrastStyleConfig() +{ + KGlobal::locale()->removeCatalogue("kstyle_keramik_config"); +} + + +void +HighContrastStyleConfig::save() +{ + QSettings s; + s.writeEntry("/highcontraststyle/Settings/wideLines", + wideLinesBox->isChecked()); +} + +void +HighContrastStyleConfig::defaults() +{ + wideLinesBox->setChecked(false); + // updateChanged would be done by setChecked already +} + +void +HighContrastStyleConfig::updateChanged() +{ + if ((wideLinesBox->isChecked() == originalWideLinesState)) { + emit changed(false); + } else { + emit changed(true); + } +} + +#include "highcontrastconfig.moc" diff --git a/kstyles/highcontrast/config/highcontrastconfig.h b/kstyles/highcontrast/config/highcontrastconfig.h new file mode 100644 index 000000000..26d8a0593 --- /dev/null +++ b/kstyles/highcontrast/config/highcontrastconfig.h @@ -0,0 +1,61 @@ +/* +Copyright (c) 2005 Luciano Montanaro <mikelima@cirulla.net> + +based on the Keramick configuration dialog +Copyright (c) 2003 Maksim Orlovich <maksim.orlovich@kdemail.net> + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. + +*/ + +#ifndef HIGHCONTRAST_CONF_H +#define HIGHCONTRAST_CONF_H + +class QCheckBox; + +class HighContrastStyleConfig: public QWidget +{ + Q_OBJECT +public: + HighContrastStyleConfig(QWidget* parent); + ~HighContrastStyleConfig(); + + // This signal and the next two slots are the plugin + // page interface +signals: + void changed(bool); + +public slots: + void save(); + void defaults(); + + // Everything below this is internal. +protected slots: + void updateChanged(); + +protected: + // We store settings directly in widgets to + // avoid the hassle of sync'ing things + QCheckBox* wideLinesBox; + + // Original settings, for accurate dirtiness tracking + bool originalWideLinesState; +}; + +#endif // HIGHCONTRAST_CONF_H diff --git a/kstyles/highcontrast/highcontrast.cpp b/kstyles/highcontrast/highcontrast.cpp new file mode 100644 index 000000000..d7669ff9d --- /dev/null +++ b/kstyles/highcontrast/highcontrast.cpp @@ -0,0 +1,1843 @@ +/* + * High Contrast Style (version 1.0) + * Copyright (C) 2004 Olaf Schmidt <ojschmidt@kde.org> + * + * Derived from Axes Style + * Copyright (C) 2003 Maksim Orlovich <orlovich@cs.rochester.edu> + * + * Axes Style based on KDE 3 HighColor Style, + * Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> + * (C) 2001-2002 Fredrik Höglund <fredrik@kde.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#include <qdrawutil.h> +#include <qpainter.h> +#include <qpointarray.h> +#include <qstyleplugin.h> + +#include <qfont.h> +#include <qcombobox.h> +#include <qheader.h> +#include <qmenubar.h> +#include <qpushbutton.h> +#include <qscrollbar.h> +#include <qslider.h> +#include <qtabbar.h> +#include <qtoolbutton.h> +#include <qtoolbar.h> +#include <qpopupmenu.h> +#include <qprogressbar.h> +#include <qlistview.h> +#include <qsettings.h> + +#include <kdrawutil.h> +#include <kpixmapeffect.h> + +#include "highcontrast.h" +#include "highcontrast.moc" + +// -- Style Plugin Interface ------------------------- +class HighContrastStylePlugin : public QStylePlugin +{ + public: + HighContrastStylePlugin() {} + ~HighContrastStylePlugin() {} + + QStringList keys() const + { + return QStringList() << "HighContrast"; + } + + QStyle* create( const QString& key ) + { + if ( key == "highcontrast" ) + return new HighContrastStyle(); + return 0; + } +}; + +KDE_Q_EXPORT_PLUGIN (HighContrastStylePlugin) +// --------------------------------------------------- + + + +static const int itemFrame = 1; +static const int itemHMargin = 3; +static const int itemVMargin = 0; +static const int arrowHMargin = 6; +static const int rightBorder = 12; + + +void addOffset (QRect* r, int offset, int lineWidth = 0) +{ + int offset1 = offset; + int offset2 = offset; + + *r = r->normalize(); + + if (lineWidth > 0) + { + offset1 += lineWidth/2; + offset2 += lineWidth - lineWidth/2 - 1; + } + + if (offset1 + offset2 > r->width()) + r->addCoords (r->width()/2, 0, - (r->width() - r->width()/2), 0); + else + r->addCoords (offset1, 0, -offset2, 0); + + if (offset1 + offset2 > r->height()) + r->addCoords (0, r->height()/2, 0, - (r->height() - r->height()/2)); + else + r->addCoords (0, offset1, 0, -offset2); +} + + +// --------------------------------------------------------------------------- + +HighContrastStyle::HighContrastStyle() + : KStyle( 0, ThreeButtonScrollBar ) +{ + QSettings settings; + settings.beginGroup("/highcontraststyle/Settings/"); + bool useWideLines = settings.readBoolEntry("wideLines", false); + hoverWidget = 0L; + basicLineWidth = useWideLines ? 4 : 2; +} + + +HighContrastStyle::~HighContrastStyle() +{ +} + + +void HighContrastStyle::polish( QPalette& pal ) +{ + //We do not want the disabled widgets to be greyed out, + //as that may be hard indeed (and since we use crossed-out text instead), + //so we make disabled colors be the same as active foreground and + //background colour + for (int c = 0; c < QColorGroup::NColorRoles; ++c) + switch (c) + { + case QColorGroup::Button: + case QColorGroup::Base: + case QColorGroup::Highlight: + pal.setColor(QPalette::Disabled, QColorGroup::ColorRole(c), pal.color(QPalette::Active, QColorGroup::Background)); + break; + case QColorGroup::ButtonText: + case QColorGroup::Text: + case QColorGroup::HighlightedText: + pal.setColor(QPalette::Disabled, QColorGroup::ColorRole(c), pal.color(QPalette::Active, QColorGroup::Foreground)); + break; + default: + pal.setColor(QPalette::Disabled, QColorGroup::ColorRole(c), pal.color(QPalette::Active, QColorGroup::ColorRole(c))); + } +} + + +void HighContrastStyle::polish (QWidget* widget) +{ + if (widget->inherits ("QButton") + || widget->inherits ("QComboBox") + || widget->inherits ("QSpinWidget") + || widget->inherits ("QLineEdit") + || widget->inherits ("QTextEdit")) + { + widget->installEventFilter (this); + + QSpinWidget* spinwidget = dynamic_cast<QSpinWidget*>(widget); + if (spinwidget && spinwidget->editWidget()) + spinwidget->editWidget()->installEventFilter (this); + } + + KStyle::polish (widget); +} + + +void HighContrastStyle::unPolish (QWidget* widget) +{ + if (widget->inherits ("QWidget") || widget->inherits ("QComboBox") || widget->inherits ("QSpinWidget") || widget->inherits ("QLineEdit") || widget->inherits ("QTextEdit")) + widget->removeEventFilter (this); + KStyle::unPolish (widget); +} + +void HighContrastStyle::setColorsNormal (QPainter* p, const QColorGroup& cg, int flags, int highlight) const +{ + setColorsByState (p, cg, cg.foreground(), cg.background(), flags, highlight); +} + +void HighContrastStyle::setColorsButton (QPainter* p, const QColorGroup& cg, int flags, int highlight) const +{ + setColorsByState (p, cg, cg.buttonText(), cg.button(), flags, highlight); +} + +void HighContrastStyle::setColorsText (QPainter* p, const QColorGroup& cg, int flags, int highlight) const +{ + setColorsByState (p, cg, cg.text(), cg.base(), flags, highlight); +} + +void HighContrastStyle::setColorsHighlight (QPainter* p, const QColorGroup& cg, int flags) const +{ + setColorsByState (p, cg, cg.highlightedText(), cg.highlight(), flags, 0); +} + +void HighContrastStyle::setColorsByState (QPainter* p, const QColorGroup& cg, const QColor& fg, const QColor& bg, int flags, int highlight) const +{ + QFont font = p->font(); + font.setStrikeOut (! (flags & Style_Enabled)); + p->setFont (font); + + if ((flags & Style_Enabled) && (flags & highlight)) + { + p->setPen (QPen (cg.highlightedText(), basicLineWidth, flags & Style_Enabled ? Qt::SolidLine : Qt::DotLine)); + p->setBackgroundColor (cg.highlight()); + } + else + { + p->setPen (QPen (fg, basicLineWidth, flags & Style_Enabled ? Qt::SolidLine : Qt::DotLine)); + p->setBackgroundColor (bg); + } + + p->setBrush (QBrush ()); +} + +void HighContrastStyle::drawRect (QPainter* p, QRect r, int offset, bool filled) const +{ + addOffset (&r, offset, p->pen().width()); + if (filled) + p->fillRect (r, p->backgroundColor()); + + p->drawRect (r); +} + +void HighContrastStyle::drawRoundRect (QPainter* p, QRect r, int offset, bool filled) const +{ + int lineWidth = p->pen().width(); + if ((r.width() >= 5*lineWidth + 2*offset) && (r.height() >= 5*lineWidth + 2*offset)) + { + QRect r2 (r); + addOffset (&r2, offset, lineWidth); + + addOffset (&r, offset); + QRect r3 (r); + addOffset (&r3, lineWidth); + + p->save(); + p->setPen (Qt::NoPen); + if (filled) + p->fillRect (r3, p->backgroundColor()); + p->drawRect (r3); + p->restore(); + + p->drawLine (r.left()+lineWidth, r2.top(), r.right()+1-lineWidth, r2.top()); + p->fillRect (r.left()+1, r.top()+1, lineWidth, lineWidth, p->pen().color()); + p->drawLine (r2.left(), r.top()+lineWidth, r2.left(), r.bottom()+1-lineWidth); + p->fillRect (r.left()+1, r.bottom()-lineWidth, lineWidth, lineWidth, p->pen().color()); + p->drawLine (r.left()+lineWidth, r2.bottom(), r.right()+1-lineWidth, r2.bottom()); + p->fillRect (r.right()-lineWidth, r.bottom()-lineWidth, lineWidth, lineWidth, p->pen().color()); + p->drawLine (r2.right(), r.top()+lineWidth, r2.right(), r.bottom()+1-lineWidth); + p->fillRect (r.right()-lineWidth, r.top()+1, lineWidth, lineWidth, p->pen().color()); + } + else + drawRect (p, r, offset, filled); +} + +void HighContrastStyle::drawEllipse (QPainter* p, QRect r, int offset, bool filled) const +{ + addOffset (&r, offset, p->pen().width()); + + if (filled) { + p->save(); + p->setBrush (p->backgroundColor()); + p->drawRoundRect (r, 99, 99); + p->restore(); + } + + p->drawRoundRect (r, 99, 99); +} + +void HighContrastStyle::drawArrow (QPainter* p, QRect r, PrimitiveElement arrow, int offset) const +{ + p->save(); + addOffset (&r, offset); + + QPoint center = r.center(); + if (r.height() < r.width()) + r.setWidth (r.height()); + if (r.width() % 2 != 0) + r.setWidth (r.width() - 1); + r.setHeight (r.width()); + r.moveCenter (center); + + QPointArray points (3); + switch (arrow) { + case PE_ArrowUp: + case PE_SpinWidgetUp: + case PE_SpinWidgetPlus: { + points.setPoint (0, r.bottomLeft()); + points.setPoint (1, r.bottomRight()); + points.setPoint (2, r.center().x(), r.top() + r.height()/7); + break; + } + case PE_ArrowDown: + case PE_SpinWidgetDown: + case PE_SpinWidgetMinus: { + points.setPoint (0, r.topLeft()); + points.setPoint (1, r.topRight()); + points.setPoint (2, r.center().x(), r.bottom() - r.height()/7); + break; + } + case PE_ArrowLeft: { + points.setPoint (0, r.topRight()); + points.setPoint (1, r.bottomRight()); + points.setPoint (2, r.left() + r.width()/7, r.center().y()); + break; + } + default: { + points.setPoint (0, r.topLeft()); + points.setPoint (1, r.bottomLeft()); + points.setPoint (2, r.right() - r.width()/7, r.center().y()); + } + } + + p->setPen (p->pen().color()); + p->setBrush (p->pen().color()); + p->drawPolygon (points); + p->restore(); +} + +// This function draws primitive elements +void HighContrastStyle::drawPrimitive (PrimitiveElement pe, + QPainter *p, + const QRect &r, + const QColorGroup &cg, + SFlags flags, + const QStyleOption& opt ) const +{ + switch(pe) + { + case PE_StatusBarSection: { + //### TODO: Not everything uses this! + setColorsNormal (p, cg, Style_Enabled); + drawRect (p, r); + break; + } + // BUTTONS + // ------------------------------------------------------------------- + case PE_ButtonDefault: + case PE_ButtonDropDown: + case PE_ButtonCommand: + case PE_ButtonTool: + case PE_ButtonBevel: { + setColorsButton (p, cg, flags, Style_On|Style_MouseOver|Style_Down); + drawRoundRect (p, r, 0, false); + break; + } + + // FOCUS RECT + // ------------------------------------------------------------------- + case PE_FocusRect: { + p->save(); + p->setBrush (QBrush ()); + p->setPen (QPen (cg.highlight(), basicLineWidth, Qt::SolidLine)); + drawRoundRect (p, r, basicLineWidth, false); + p->setPen (QPen (cg.highlightedText(), basicLineWidth, Qt::DashLine)); + drawRoundRect (p, r, basicLineWidth, false); + p->restore(); + break; + } + + case PE_HeaderArrow: { + setColorsButton (p, cg, flags, 0); + drawArrow (p, r, flags & Style_Down ? PE_ArrowDown : PE_ArrowUp, 2*basicLineWidth); + break; + } + // HEADER SECTION + // ------------------------------------------------------------------- + case PE_HeaderSection: { + setColorsButton (p, cg, flags, 0); + drawRect (p, r); + break; + } + + + // SCROLLBAR + // ------------------------------------------------------------------- + case PE_ScrollBarSlider: { + setColorsNormal (p, cg); + p->fillRect (r, p->backgroundColor()); + + if (flags & Style_Enabled) { + setColorsHighlight (p, cg, flags); + drawRoundRect (p, r); + + if (r.width() >= 7*basicLineWidth && r.height() >= 7*basicLineWidth) { + QRect r2 (r); + r2.setWidth (4*basicLineWidth); + r2.setHeight (4*basicLineWidth); + r2.moveCenter (r.center()); + drawRect (p, r2, 0, false); + } + } + break; + } + + case PE_ScrollBarAddPage: + case PE_ScrollBarSubPage: { + setColorsNormal (p, cg); + p->fillRect (r, p->backgroundColor()); + + QRect r2 (r); + if (flags & Style_Horizontal) + { + if (r2.height() > 5*basicLineWidth) + { + r2.setHeight (5*basicLineWidth); + r2.moveCenter (r.center()); + } + } + else + { + if (r2.width() > 5*basicLineWidth) + { + r2.setWidth (5*basicLineWidth); + r2.moveCenter (r.center()); + } + } + setColorsText (p, cg, flags); + drawRect (p, r2); + + if (flags & Style_Horizontal) + r2.addCoords (0, basicLineWidth, 0, -basicLineWidth); + else + r2.addCoords (basicLineWidth, 0, -basicLineWidth, 0); + QPen pen = p->pen(); + pen.setColor (p->backgroundColor()); + p->setPen (pen); + drawRect (p, r2); + + break; + } + + case PE_ScrollBarAddLine: + case PE_ScrollBarSubLine: + case PE_ScrollBarFirst: + case PE_ScrollBarLast: { + setColorsNormal (p, cg); + p->fillRect (r, p->backgroundColor()); + + if (flags & Style_Enabled) { + setColorsButton (p, cg, flags); + drawRoundRect (p, r); + if (pe == PE_ScrollBarAddLine) + drawArrow (p, r, flags & Style_Horizontal ? PE_ArrowRight : PE_ArrowDown, r.height()/3); + else if (pe == PE_ScrollBarSubLine) + drawArrow (p, r, flags & Style_Horizontal ? PE_ArrowLeft : PE_ArrowUp, r.height()/3); + } + break; + } + + + case PE_ProgressBarChunk: { + p->fillRect (r, Qt::color1); + break; + } + + + // CHECKBOX + // ------------------------------------------------------------------- + case PE_Indicator: { + setColorsText (p, cg, flags); + + //Draw the outer rect + drawRect (p, r); + + if (!(flags & Style_Off)) + { + QRect r2 (r); + addOffset (&r2, basicLineWidth); + if (flags & Style_On) + { + p->drawLine (r2.topLeft(), r2.bottomRight()); + p->drawLine (r2.bottomLeft(), r2.topRight()); + } + else + { // Tristate + p->drawLine (r2.left(), r2.top()+r2.width()/2, r2.right(), r2.top()+r2.width()/2); + } + QPen pen = p->pen(); + pen.setColor (p->backgroundColor()); + p->setPen (pen); + drawRect (p, r2, 0, false); + } + break; + } + case PE_IndicatorMask: { + p->fillRect (r, Qt::color1); + break; + } + case PE_CheckMark: { + setColorsText (p, cg, flags); + + if (flags & Style_On) + { + p->drawLine (r.topLeft(), r.bottomRight()); + p->drawLine (r.bottomLeft(), r.topRight()); + } + break; + } + + // RADIOBUTTON (exclusive indicator) + // ------------------------------------------------------------------- + case PE_ExclusiveIndicator: { + setColorsText (p, cg, flags); + drawEllipse (p, r); + + // Indicator "dot" + if (flags & Style_On) { + p->setBackgroundColor (p->pen().color()); + drawEllipse (p, r, 2*p->pen().width()); + } + + break; + } + case PE_ExclusiveIndicatorMask: { + p->fillRect (r, Qt::color0); + p->setBackgroundColor (Qt::color1); + p->setPen (Qt::NoPen); + p->setBrush (Qt::color1); + p->drawEllipse (r); + break; + } + + + // SPLITTER/DOCKWINDOW HANDLES + // ------------------------------------------------------------------- + case PE_DockWindowResizeHandle: + case PE_Splitter: { + setColorsButton (p, cg, flags); + p->fillRect (r, p->backgroundColor()); + + p->setPen (QPen (p->pen().color(), 1, Qt::DashLine)); + if (flags & Style_Horizontal) + p->drawLine (r.center().x(), r.top(), r.center().x(), r.bottom()); + else + p->drawLine (r.left(), r.center().y(), r.right(), r.center().y()); + break; + } + + + // GENERAL PANELS + // ------------------------------------------------------------------- + case PE_Panel: + case PE_GroupBoxFrame: + case PE_PanelPopup: { + setColorsNormal (p, cg, flags, 0); + if (!opt.isDefault()) + { + QPen pen = p->pen(); + pen.setWidth (opt.lineWidth()); + p->setPen (pen); + } + if (pe == PE_PanelPopup) + drawRect (p, r, 0, false); + else + drawRoundRect (p, r, 0, false); + break; + } + case PE_WindowFrame: + case PE_TabBarBase: { + setColorsNormal (p, cg, flags, 0); + drawRect (p, r, 0, false); + break; + } + case PE_PanelLineEdit: { + setColorsText (p, cg, flags, 0); + drawRoundRect (p, r); + if (flags & (Style_HasFocus | Style_Active)) + drawPrimitive (PE_FocusRect, p, r, cg, flags, QStyleOption (p->backgroundColor())); + break; + } + case PE_PanelTabWidget: + case PE_PanelGroupBox: { + setColorsNormal (p, cg, flags, 0); + drawRoundRect (p, r); + break; + } + case PE_PanelMenuBar: { // Menu + p->fillRect (r, cg.background()); + break; + } + case PE_PanelDockWindow: { // Toolbar + p->fillRect (r, cg.button()); + break; + } + + + + // SEPARATORS + // ------------------------------------------------------------------- + case PE_Separator: { + setColorsNormal (p, cg); + p->fillRect (r, p->backgroundColor()); + p->setPen (p->pen().color()); + if (flags & Style_Horizontal) + p->drawLine (r.center().x(), r.top()+basicLineWidth, r.center().x(), r.bottom()-basicLineWidth + 1); + else + p->drawLine (r.left()+basicLineWidth, r.center().y(), r.right()-basicLineWidth + 1, r.center().y()); + break; + } + case PE_DockWindowSeparator: { + setColorsButton (p, cg); + p->fillRect (r, p->backgroundColor()); + p->setPen (p->pen().color()); + if (flags & Style_Horizontal) + p->drawLine (r.center().x(), r.top()+basicLineWidth, r.center().x(), r.bottom()-basicLineWidth); + else + p->drawLine (r.left()+basicLineWidth, r.center().y(), r.right()-basicLineWidth, r.center().y()); + break; + } + + + // ARROWS + // ------------------------------------------------------------------- + case PE_ArrowUp: + case PE_ArrowDown: + case PE_ArrowRight: + case PE_ArrowLeft: + case PE_SpinWidgetPlus: + case PE_SpinWidgetUp: + case PE_SpinWidgetMinus: + case PE_SpinWidgetDown: { + setColorsNormal (p, cg, flags); + drawArrow (p, r, pe); + break; + } + + default: { + KStyle::drawPrimitive( pe, p, r, cg, flags, opt ); + } + } +} + + +void HighContrastStyle::drawKStylePrimitive (KStylePrimitive kpe, + QPainter* p, + const QWidget* widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags, + const QStyleOption &opt ) const +{ + if ( widget == hoverWidget ) + flags |= Style_MouseOver; + + switch ( kpe ) + { + // TOOLBAR HANDLE + // ------------------------------------------------------------------- + case KPE_ToolBarHandle: + case KPE_DockWindowHandle: + case KPE_GeneralHandle: + { + setColorsButton (p, cg); + p->fillRect (r, p->backgroundColor()); + p->setBrush (QBrush (p->pen().color(), Qt::BDiagPattern)); + drawRoundRect (p, r); + break; + } + + + // SLIDER GROOVE + // ------------------------------------------------------------------- + case KPE_SliderGroove: { + setColorsText (p, cg, flags); + QRect r2 (r); + const QSlider *slider = dynamic_cast<const QSlider*>(widget); + if (slider != 0) + { + if (slider->orientation() == Qt::Horizontal) + { + if (r2.height() > 5*basicLineWidth) + { + r2.setHeight (5*basicLineWidth); + r2.moveCenter (r.center()); + } + } + else + { + if (r2.width() > 5*basicLineWidth) + { + r2.setWidth (5*basicLineWidth); + r2.moveCenter (r.center()); + } + } + } + + drawRoundRect (p, r2); + break; + } + + // SLIDER HANDLE + // ------------------------------------------------------------------- + case KPE_SliderHandle: { + setColorsHighlight (p, cg, flags); + drawRoundRect (p, r); + break; + } + + case KPE_ListViewExpander: { + // TODO There is no pixelMetric associated with the + // ListViewExpander in KStyle. + // To have a properly large expander, the CC_ListView case of + // drawComplexControl should be handled. + // Probably it would be better to add a KPM_ListViewExpander metric + // to the KStyle KStylePixelMetric enum, and have the KStyle + // drawComplexControl handle it. + PrimitiveElement direction; + if (flags & Style_On) { // Collapsed = On + direction = PE_ArrowRight; + + } else { + direction = PE_ArrowDown; + } + setColorsText (p, cg, flags); + drawArrow (p, r, direction); + break; + } + case KPE_ListViewBranch: + // TODO Draw (thick) dotted line. Check kstyle.cpp + // Fall down for now + default: + KStyle::drawKStylePrimitive( kpe, p, widget, r, cg, flags, opt); + } +} + + +void HighContrastStyle::drawControl (ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags, + const QStyleOption& opt ) const +{ + if ( widget == hoverWidget ) + flags |= Style_MouseOver; + + switch (element) + { + // TABS + // ------------------------------------------------------------------- + case CE_ToolBoxTab: { + setColorsNormal (p, cg, flags, Style_Selected); + drawRoundRect (p, r); + break; + } + + case CE_TabBarTab: { + setColorsNormal (p, cg, flags, Style_Selected); + drawRoundRect (p, r); + + const QTabBar *tb = static_cast< const QTabBar * >(widget); + QTabBar::Shape shape = tb->shape(); + if (shape == QTabBar::TriangularBelow || + shape == QTabBar::RoundedBelow) { + p->fillRect (r.left(), r.top(), + r.width(), 2*basicLineWidth, + p->pen().color()); + p->fillRect (r.left()+basicLineWidth, + flags & Style_Selected ? basicLineWidth : 2*basicLineWidth, + r.width()-2*basicLineWidth, + basicLineWidth, + p->backgroundColor()); + } else { + p->fillRect (r.left(), r.bottom()-2*basicLineWidth+1, + r.width(), 2*basicLineWidth, + p->pen().color()); + p->fillRect (r.left()+basicLineWidth, + r.bottom()-2*basicLineWidth+1, + r.width()-2*basicLineWidth, + flags & Style_Selected ? 2*basicLineWidth : basicLineWidth, + p->backgroundColor()); + } + break; + } + + + // PUSHBUTTON + // ------------------------------------------------------------------- + case CE_PushButton: { + QPushButton *button = (QPushButton*) widget; + QRect br = r; + bool btnDefault = button->isDefault(); + + if (( btnDefault || button->autoDefault() ) && (button->isEnabled())) { + // Compensate for default indicator + static int di = pixelMetric( PM_ButtonDefaultIndicator ); + addOffset (&br, di); + } + + if ( btnDefault && (button->isEnabled())) + drawPrimitive( PE_ButtonDefault, p, r, cg, flags ); + + drawPrimitive( PE_ButtonCommand, p, br, cg, flags ); + + break; + } + + + // LABEL + // ------------------------------------------------------------------- + case CE_ProgressBarLabel: + case CE_TabBarLabel: + case CE_RadioButtonLabel: + case CE_CheckBoxLabel: + case CE_ToolButtonLabel: + case CE_PushButtonLabel: { + const QPixmap* pixmap = 0; + QPixmap icon; + QString text; + bool popup = false; + + QIconSet::Mode mode = flags & Style_Enabled ? ((flags & Style_HasFocus) ? QIconSet::Active : QIconSet::Normal) : QIconSet::Disabled; + QIconSet::State state = flags & Style_On ? QIconSet::On : QIconSet::Off; + + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + if (element == CE_ProgressBarLabel) { + QProgressBar* progressbar = (QProgressBar*) widget; + text = progressbar->progressString(); + setColorsNormal (p, cg, flags); + } + else if (element == CE_TabBarLabel) { + if (!opt.isDefault()) { + QTab* tab = opt.tab(); + text = tab->text(); + } + setColorsNormal (p, cg, flags, Style_Selected); + } + else if (element == CE_ToolButtonLabel) { + QToolButton* toolbutton = (QToolButton*) widget; + text = toolbutton->text(); + pixmap = toolbutton->pixmap(); + if (!toolbutton->iconSet().isNull()) + icon = toolbutton->iconSet().pixmap (QIconSet::Small, mode, state); + popup = toolbutton->popup(); + setColorsButton (p, cg, flags); + } + else if (element == CE_PushButtonLabel) { + QPushButton* pushbutton = (QPushButton*) widget; + text = pushbutton->text(); + pixmap = pushbutton->pixmap(); + if (pushbutton->iconSet() && !pushbutton->iconSet()->isNull()) + icon = pushbutton->iconSet()->pixmap (QIconSet::Small, mode, state); + popup = pushbutton->popup(); + setColorsButton (p, cg, flags); + } + else { + const QButton* button = (const QButton*)widget; + pixmap = button->pixmap(); + text = button->text(); + setColorsNormal (p, cg); + } + + // Does the button have a popup menu? + if (popup) { + int dx = pixelMetric (PM_MenuButtonIndicator, widget); + drawArrow (p, QRect(x + w - dx - 2, y + 2, dx, h - 4), PE_ArrowDown); + w -= dx; + } + + // Draw the icon if there is one + if (!icon.isNull()) + { + // Center the iconset if there's no text or pixmap + if (text.isEmpty() && ((pixmap == 0) || pixmap->isNull())) + p->drawPixmap (x + (w - icon.width()) / 2, + y + (h - icon.height()) / 2, icon); + else + p->drawPixmap (x + 4, y + (h - icon.height()) / 2, icon); + + int pw = icon.width(); + x += pw + 4; + w -= pw + 4; + } + + // Draw a focus rect if the button has focus + if (flags & Style_HasFocus) + drawPrimitive (PE_FocusRect, p, r, cg, flags, QStyleOption (p->backgroundColor())); + + // Draw the label itself + QColor color = p->pen().color(); + drawItem (p, QRect(x, y, w, h), + (element == CE_RadioButtonLabel || element == CE_CheckBoxLabel || element == CE_ProgressBarLabel) ? AlignVCenter|AlignLeft|ShowPrefix : AlignCenter|ShowPrefix, + cg, flags & Style_Enabled, pixmap, text, -1, &color); + break; + } + + // MENUBAR BACKGROUND + // ------------------------------------------------------------------- + case CE_MenuBarEmptyArea: + { + p->fillRect (r, cg.background()); + break; + } + + // DOCKWINDOW BACKGROUND + // ------------------------------------------------------------------- + case CE_DockWindowEmptyArea: + { + p->fillRect (r, cg.button()); + break; + } + + // MENUBAR ITEM + // ------------------------------------------------------------------- + case CE_MenuBarItem: { + setColorsNormal (p, cg, flags, Style_Active|Style_MouseOver); + p->fillRect (r, p->backgroundColor ()); + if (!opt.isDefault()) { + QMenuItem *mi = opt.menuItem(); + + QColor color = p->pen().color(); + drawItem (p, r, AlignCenter | AlignVCenter | ShowPrefix + | DontClip | SingleLine, cg, flags, + mi->pixmap(), mi->text(), -1, &color); + } + break; + } + + // CHECKBOX + // ------------------------------------------------------------------- + case CE_CheckBox: { + drawPrimitive (PE_Indicator, p, r, cg, flags); + break; + } + + // RADIOBUTTON + // ------------------------------------------------------------------- + case CE_RadioButton: { + drawPrimitive (PE_ExclusiveIndicator, p, r, cg, flags); + break; + } + + // PROGRESSBAR + // ------------------------------------------------------------------- + case CE_ProgressBarGroove: { + setColorsText (p, cg, flags); + const QProgressBar *progressbar = dynamic_cast<const QProgressBar*>(widget); + if (progressbar) { + QRect r2 (r); + r2.setLeft (p->boundingRect (r, AlignVCenter|AlignLeft|ShowPrefix, progressbar->progressString()).right() + + 4*basicLineWidth); + drawRoundRect (p, r2); + } + break; + } + case CE_ProgressBarContents: { + const QProgressBar *progressbar = dynamic_cast<const QProgressBar*>(widget); + if (progressbar) + { + QRect r2 (r); + r2.setLeft (p->boundingRect (r, AlignVCenter|AlignLeft|ShowPrefix, progressbar->progressString()).right() + + 4*basicLineWidth); + long progress = r2.width() * progressbar->progress(); + if (progressbar->totalSteps() > 0) + { + r2.setWidth (progress / progressbar->totalSteps()); + } + else + { + int width = r2.width() / 5; + int left = progressbar->progress() % (2*(r2.width() - width)); + if (left > r2.width() - width) + left = 2*(r2.width() - width) - left; + r2.setLeft (r2.left() + left); + r2.setWidth (width); + } + setColorsHighlight (p, cg, flags); + if (r2.width() > 0) + drawRoundRect (p, r2); + } + break; + } + + // POPUPMENU ITEM + // ------------------------------------------------------------------- + case CE_PopupMenuItem: { + setColorsNormal (p, cg, flags, Style_Active|Style_MouseOver); + p->fillRect (r, p->backgroundColor ()); + + const QPopupMenu *popupmenu = (const QPopupMenu *) widget; + QMenuItem *mi = opt.menuItem(); + if (!mi) + break; + + int tab = opt.tabWidth(); + int checkcol = opt.maxIconWidth(); + bool checkable = popupmenu->isCheckable(); + bool reverse = QApplication::reverseLayout(); + int x, y, w, h; + r.rect( &x, &y, &w, &h ); + + if ( checkable ) + checkcol = QMAX( checkcol, 20 ); + + // Are we a menu item separator? + if ( mi->isSeparator() ) { + p->drawLine (r.left() + 1, r.center().y(), r.right(), r.center().y()); + break; + } + + // Do we have an icon? + if ( mi->iconSet() && !mi->iconSet()->isNull() ) { + QIconSet::Mode mode; + QRect cr = visualRect( QRect(x, y, checkcol, h), r ); + + // Select the correct icon from the iconset + if (!(flags & Style_Enabled)) + mode = QIconSet::Disabled; + else if (flags & Style_Active) + mode = QIconSet::Active; + else + mode = QIconSet::Normal; + + // Draw the icon + QPixmap pixmap = mi->iconSet()->pixmap( QIconSet::Small, mode ); + QRect pmr( 0, 0, pixmap.width(), pixmap.height() ); + pmr.moveCenter( cr.center() ); + p->drawPixmap( pmr.topLeft(), pixmap ); + + // Do we have an icon and are checked at the same time? + // Then draw a square border around the icon + if ( checkable && mi->isChecked() ) + { + drawRect (p, cr, 0, false); + } + } + + // Are we checked? (This time without an icon) + else if ( checkable && mi->isChecked() ) { + int cx = reverse ? x+w - checkcol : x; + + QRect rc (cx, y, checkcol, h); + addOffset (&rc, 2*basicLineWidth); + QPoint center = rc.center(); + if (rc.width() > rc.height()) + rc.setWidth (rc.height()); + else + rc.setHeight (rc.width()); + rc.moveCenter (center); + + p->drawLine (rc.topLeft(), rc.bottomRight()); + p->drawLine (rc.topRight(), rc.bottomLeft()); + } + + // Time to draw the menu item label... + int xm = itemFrame + checkcol + itemHMargin; // X position margin + + int xp = reverse ? // X position + x + tab + rightBorder + itemHMargin + itemFrame - 1 : + x + xm; + + // Label width (minus the width of the accelerator portion) + int tw = w - xm - tab - arrowHMargin - itemHMargin * 3 - itemFrame + 1; + + // Does the menu item draw it's own label? + if ( mi->custom() ) { + int m = itemVMargin; + // Save the painter state in case the custom + // paint method changes it in some way + p->save(); + mi->custom()->paint( p, cg, flags & Style_Active, flags & Style_Enabled, xp, y+m, tw, h-2*m ); + p->restore(); + } + else { + // The menu item doesn't draw it's own label + QString s = mi->text(); + + // Does the menu item have a text label? + if ( !s.isNull() ) { + int t = s.find( '\t' ); + int m = itemVMargin; + int text_flags = AlignVCenter | ShowPrefix | DontClip | SingleLine; + text_flags |= reverse ? AlignRight : AlignLeft; + + // Does the menu item have a tabstop? (for the accelerator text) + if ( t >= 0 ) { + int tabx = reverse ? x + rightBorder + itemHMargin + itemFrame : + x + w - tab - rightBorder - itemHMargin - itemFrame; + + // Draw the right part of the label (accelerator text) + p->drawText( tabx, y+m, tab, h-2*m, text_flags, s.mid( t+1 ) ); + s = s.left( t ); + } + + // Draw the left part of the label (or the whole label + // if there's no accelerator) + + p->drawText( xp, y+m, tw, h-2*m, text_flags, s, t ); + + } + + // The menu item doesn't have a text label + // Check if it has a pixmap instead + else if ( mi->pixmap() ) { + QPixmap *pixmap = mi->pixmap(); + + // Draw the pixmap + if ( pixmap->depth() == 1 ) + p->setBackgroundMode( OpaqueMode ); + + int diffw = ( ( w - pixmap->width() ) / 2 ) + + ( ( w - pixmap->width() ) % 2 ); + p->drawPixmap( x+diffw, y+itemFrame, *pixmap ); + + if ( pixmap->depth() == 1 ) + p->setBackgroundMode( TransparentMode ); + } + } + + // Does the menu item have a submenu? + if ( mi->popup() ) { + PrimitiveElement arrow = reverse ? PE_ArrowLeft : PE_ArrowRight; + int dim = pixelMetric(PM_MenuButtonIndicator); + QRect vr = visualRect( QRect( x + w - arrowHMargin - 2*itemFrame - dim, + y + h / 2 - dim / 2, dim, dim), r ); + + // Draw an arrow at the far end of the menu item + drawArrow (p, vr, arrow); + } + break; + } + + default: + KStyle::drawControl(element, p, widget, r, cg, flags, opt); + } +} + +void HighContrastStyle::drawControlMask (ControlElement element, + QPainter *p, + const QWidget *w, + const QRect &r, + const QStyleOption &opt) const +{ + switch (element) { + case CE_PushButton: + case CE_ToolBoxTab: + case CE_TabBarTab: + case CE_ProgressBarLabel: + case CE_TabBarLabel: + case CE_RadioButtonLabel: + case CE_CheckBoxLabel: + case CE_ToolButtonLabel: + case CE_PushButtonLabel: + case CE_MenuBarEmptyArea: + case CE_MenuBarItem: + case CE_PopupMenuItem: { + p->fillRect (r, color0); + break; + } + + default: { + KStyle::drawControlMask (element, p, w, r, opt); + } + } +} + +// Helper to find the next sibling that's not hidden +// Lifted from kstyle.cpp +static QListViewItem* nextVisibleSibling(QListViewItem* item) +{ + QListViewItem* sibling = item; + do + { + sibling = sibling->nextSibling(); + } + while (sibling && !sibling->isVisible()); + + return sibling; +} + +void HighContrastStyle::drawComplexControl (ComplexControl control, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags, + SCFlags controls, + SCFlags active, + const QStyleOption& opt ) const +{ + if ( widget == hoverWidget ) + flags |= Style_MouseOver; + + switch(control) + { + // COMBOBOX + // ------------------------------------------------------------------- + case CC_ComboBox: { + setColorsText (p, cg, flags); + drawRoundRect (p, r); + + QRect r2 = QStyle::visualRect (querySubControlMetrics (CC_ComboBox, widget, SC_ComboBoxArrow), widget); + if (flags & Style_HasFocus) { + QRect r3 (r); + if (r2.left() > 0) + r3.setRight (r2.left()+basicLineWidth-1); + else + r3.setLeft (r2.right()-basicLineWidth+1); + + drawPrimitive (PE_FocusRect, p, r3, cg, flags, QStyleOption (p->backgroundColor())); + } + + setColorsButton (p, cg, flags); + // Draw arrow if required + if (controls & SC_ComboBoxArrow) { + drawRoundRect (p, r2); + drawArrow (p, r2, PE_ArrowDown, 2*basicLineWidth); + } + + setColorsText (p, cg, flags); + break; + } + + // SPINWIDGET + // ------------------------------------------------------------------- + case CC_SpinWidget: { + if (controls & SC_SpinWidgetFrame) { + setColorsText (p, cg, flags); + drawRoundRect (p, r); + if (flags & Style_HasFocus) + drawPrimitive(PE_FocusRect, p, r, cg, flags, QStyleOption (p->backgroundColor())); + } + + setColorsButton (p, cg, flags); + // Draw arrows if required + if (controls & SC_SpinWidgetDown) { + QRect r2 = QStyle::visualRect (querySubControlMetrics (CC_SpinWidget, widget, SC_SpinWidgetDown), widget); + drawRoundRect (p, r2); + drawArrow (p, r2, PE_SpinWidgetDown, 2*basicLineWidth); + } + if (controls & SC_SpinWidgetUp) { + QRect r2 = QStyle::visualRect (querySubControlMetrics (CC_SpinWidget, widget, SC_SpinWidgetUp), widget); + drawRoundRect (p, r2); + drawArrow (p, r2, PE_SpinWidgetUp, 2*basicLineWidth); + } + + setColorsText (p, cg, flags); + break; + } + + // TOOLBUTTON + // ------------------------------------------------------------------- + case CC_ToolButton: { + const QToolButton *toolbutton = (const QToolButton *) widget; + + setColorsButton (p, cg, flags); + p->fillRect (r, p->backgroundColor ()); + + QRect button, menuarea; + button = querySubControlMetrics(control, widget, SC_ToolButton, opt); + menuarea = querySubControlMetrics(control, widget, SC_ToolButtonMenu, opt); + + SFlags bflags = flags, + mflags = flags; + + if (active & SC_ToolButton) + bflags |= Style_Down; + if (active & SC_ToolButtonMenu) + mflags |= Style_Down; + + if (controls & SC_ToolButton) + { + // If we're pressed, on, or raised... + if (bflags & (Style_Down | Style_On | Style_Raised)) + drawPrimitive(PE_ButtonTool, p, button, cg, bflags, opt); + + // Check whether to draw a background pixmap + else if ( toolbutton->parentWidget() && + toolbutton->parentWidget()->backgroundPixmap() && + !toolbutton->parentWidget()->backgroundPixmap()->isNull() ) + { + QPixmap pixmap = *(toolbutton->parentWidget()->backgroundPixmap()); + p->drawTiledPixmap( r, pixmap, toolbutton->pos() ); + } + } + + // Draw a toolbutton menu indicator if required + if (controls & SC_ToolButtonMenu) + { + if (mflags & (Style_Down | Style_On | Style_Raised)) + drawPrimitive(PE_ButtonDropDown, p, menuarea, cg, mflags, opt); + drawArrow (p, menuarea, PE_ArrowDown); + } + + if (toolbutton->hasFocus() && !toolbutton->focusProxy()) { + QRect fr = toolbutton->rect(); + addOffset (&fr, 3); + drawPrimitive(PE_FocusRect, p, fr, cg, flags, QStyleOption (p->backgroundColor())); + } + + break; + } + + // LISTVIEW + // ------------------------------------------------------------------- + case CC_ListView: { + /* + * Sigh... Lifted and modified from kstyle.cpp + */ + /* + * Many thanks to TrollTech AS for donating CC_ListView from QWindowsStyle. + * CC_ListView code is Copyright (C) 1998-2000 TrollTech AS. + */ + + // Paint the icon and text. + if ( controls & SC_ListView ) + QCommonStyle::drawComplexControl( control, p, widget, r, cg, flags, controls, active, opt ); + + // If we're have a branch or are expanded... + if ( controls & (SC_ListViewBranch | SC_ListViewExpand) ) + { + // If no list view item was supplied, break + if (opt.isDefault()) + break; + + QListViewItem *item = opt.listViewItem(); + QListViewItem *child = item->firstChild(); + + int y = r.y(); + int c; // dotline vertice count + int dotoffset = 0; + QPointArray dotlines; + + if ( active == SC_All && controls == SC_ListViewExpand ) { + // We only need to draw a vertical line + c = 2; + dotlines.resize(2); + dotlines[0] = QPoint( r.right(), r.top() ); + dotlines[1] = QPoint( r.right(), r.bottom() ); + + } else { + + int linetop = 0, linebot = 0; + // each branch needs at most two lines, ie. four end points + dotoffset = (item->itemPos() + item->height() - y) % 2; + dotlines.resize( item->childCount() * 4 ); + c = 0; + + // skip the stuff above the exposed rectangle + while ( child && y + child->height() <= 0 ) + { + y += child->totalHeight(); + child = nextVisibleSibling(child); + } + + int bx = r.width() / 2; + + // paint stuff in the magical area + QListView* v = item->listView(); + int lh = QMAX( p->fontMetrics().height() + 2 * v->itemMargin(), + QApplication::globalStrut().height() ); + if ( lh % 2 > 0 ) + lh++; + + // Draw all the expand/close boxes... + QRect boxrect; + QStyle::StyleFlags boxflags; + while ( child && y < r.height() ) + { + linebot = y + lh/2; + if ( (child->isExpandable() || child->childCount()) && + (child->height() > 0) ) + { + int h = QMIN(lh, 24) - 4*basicLineWidth; + if (h < 10) + h = 10; + else + h &= ~1; // Force an even number of pixels + + // The primitive requires a rect. + boxrect = QRect( bx-h/2, linebot-h/2, h, h ); + boxflags = child->isOpen() ? QStyle::Style_Off : QStyle::Style_On; + + // KStyle extension: Draw the box and expand/collapse indicator + drawKStylePrimitive( KPE_ListViewExpander, p, NULL, boxrect, cg, boxflags, opt ); + + // dotlinery + p->setPen( cg.mid() ); + dotlines[c++] = QPoint( bx, linetop ); + dotlines[c++] = QPoint( bx, linebot - 5 ); + dotlines[c++] = QPoint( bx + 5, linebot ); + dotlines[c++] = QPoint( r.width(), linebot ); + linetop = linebot + 5; + } else { + // just dotlinery + dotlines[c++] = QPoint( bx+1, linebot ); + dotlines[c++] = QPoint( r.width(), linebot ); + } + + y += child->totalHeight(); + child = nextVisibleSibling(child); + } + + if ( child ) // there's a child to draw, so move linebot to edge of rectangle + linebot = r.height(); + + if ( linetop < linebot ) + { + dotlines[c++] = QPoint( bx, linetop ); + dotlines[c++] = QPoint( bx, linebot ); + } + } + + // Draw all the branches... + static int thickness = kPixelMetric( KPM_ListViewBranchThickness ); + int line; // index into dotlines + QRect branchrect; + QStyle::StyleFlags branchflags; + for( line = 0; line < c; line += 2 ) + { + // assumptions here: lines are horizontal or vertical. + // lines always start with the numerically lowest + // coordinate. + + // point ... relevant coordinate of current point + // end ..... same coordinate of the end of the current line + // other ... the other coordinate of the current point/line + if ( dotlines[line].y() == dotlines[line+1].y() ) + { + // Horizontal branch + int end = dotlines[line+1].x(); + int point = dotlines[line].x(); + int other = dotlines[line].y(); + + branchrect = QRect( point, other-(thickness/2), end-point, thickness ); + branchflags = QStyle::Style_Horizontal; + + // KStyle extension: Draw the horizontal branch + drawKStylePrimitive( KPE_ListViewBranch, p, NULL, branchrect, cg, branchflags, opt ); + + } else { + // Vertical branch + int end = dotlines[line+1].y(); + int point = dotlines[line].y(); + int other = dotlines[line].x(); + int pixmapoffset = ((point & 1) != dotoffset ) ? 1 : 0; + + branchrect = QRect( other-(thickness/2), point, thickness, end-point ); + if (!pixmapoffset) // ### Hackish - used to hint the offset + branchflags = QStyle::Style_NoChange; + else + branchflags = QStyle::Style_Default; + + // KStyle extension: Draw the vertical branch + drawKStylePrimitive( KPE_ListViewBranch, p, NULL, branchrect, cg, branchflags, opt ); + } + } + } + break; + } + + default: + KStyle::drawComplexControl(control, p, widget, + r, cg, flags, controls, active, opt); + break; + } +} + +void HighContrastStyle::drawComplexControlMask(ComplexControl c, + QPainter *p, + const QWidget *w, + const QRect &r, + const QStyleOption &o) const +{ + switch (c) { + case CC_SpinWidget: + case CC_ToolButton: + case CC_ComboBox: { + p->fillRect (r, color0); + break; + } + default: { + KStyle::drawComplexControlMask (c, p, w, r, o); + } + } +} + +void HighContrastStyle::drawItem( QPainter *p, + const QRect &r, + int flags, + const QColorGroup &cg, + bool enabled, + const QPixmap *pixmap, + const QString &text, + int len, + const QColor *penColor ) const +{ + p->save(); + + // make the disabled things use the cross-line + QFont font = p->font(); + font.setStrikeOut (!enabled); + p->setFont (font); + + enabled = true; //do not ghost it in Qt + + KStyle::drawItem (p, r, flags, cg, enabled, pixmap, text, len, penColor); + + p->restore(); +} + +QRect HighContrastStyle::querySubControlMetrics( ComplexControl control, + const QWidget* widget, + SubControl subcontrol, + const QStyleOption& opt ) const +{ + switch (control) + { + case CC_ComboBox : { + int arrow = pixelMetric (PM_ScrollBarExtent, widget); + switch (subcontrol) + { + case SC_ComboBoxFrame: + return QRect (0, 0, widget->width(), widget->height()); + case SC_ComboBoxArrow: + return QRect (widget->width() - arrow, 0, arrow, widget->height()); + case SC_ComboBoxEditField: + return QRect (2*basicLineWidth, 2*basicLineWidth, + widget->width() - arrow - 3*basicLineWidth, widget->height() - 4*basicLineWidth); + + default: break; + } + break; + } + case CC_SpinWidget : { + int arrow = pixelMetric (PM_ScrollBarExtent, 0); + switch (subcontrol) + { + case SC_SpinWidgetFrame: + return QRect (0, 0, widget->width(), widget->height()); + case SC_SpinWidgetButtonField: + return QRect (widget->width() - arrow, 0, arrow, widget->height()); + case SC_SpinWidgetUp: + return QRect (widget->width() - arrow, 0, arrow, widget->height()/2); + case SC_SpinWidgetDown: + return QRect (widget->width() - arrow, widget->height()/2, + arrow, widget->height()-widget->height()/2); + case SC_SpinWidgetEditField: + return QRect (2*basicLineWidth, 2*basicLineWidth, + widget->width() - arrow - 3*basicLineWidth, widget->height() - 4*basicLineWidth); + + default: break; + } + break; + } + + default: break; + } + + return KStyle::querySubControlMetrics (control, widget, subcontrol, opt); +} + + +int HighContrastStyle::pixelMetric(PixelMetric m, const QWidget *widget) const +{ + //### TODO: Use the tab metrics changes from Ker. + switch(m) + { + // BUTTONS + // ------------------------------------------------------------------- + case PM_ButtonMargin: // Space btw. frame and label + return 2*basicLineWidth; + + case PM_ButtonDefaultIndicator: { + if ((widget != 0) && !widget->isEnabled()) + return 0; + else + return 2*basicLineWidth; + } + + case PM_ButtonShiftHorizontal: + case PM_ButtonShiftVertical: + return 0; + + case PM_ScrollBarExtent: { + int h = 0; + if (widget != 0) + h = (2*widget->fontMetrics().lineSpacing())/3; + + if (h > 9*basicLineWidth+4) + return h; + else + return 9*basicLineWidth+4; + } + + case PM_DefaultFrameWidth: { + if (widget && (widget->inherits ("QLineEdit") || widget->inherits ("QTextEdit"))) + return 2*basicLineWidth; + else + return basicLineWidth; + } + + case PM_SpinBoxFrameWidth: { + return 2*basicLineWidth; + } + + case PM_MenuButtonIndicator: { // Arrow width + int h = 0; + if (widget != 0) + h = widget->fontMetrics().lineSpacing()/2; + + if (h > 3*basicLineWidth) + return h; + else + return 3*basicLineWidth; + } + + // CHECKBOXES / RADIO BUTTONS + // ------------------------------------------------------------------- + case PM_ExclusiveIndicatorWidth: // Radiobutton size + case PM_ExclusiveIndicatorHeight: + case PM_IndicatorWidth: // Checkbox size + case PM_IndicatorHeight: { + int h = 0; + if (widget != 0) + h = widget->fontMetrics().lineSpacing()-2*basicLineWidth; + + if (h > 6*basicLineWidth) + return h; + else + return 6*basicLineWidth; + } + + case PM_DockWindowSeparatorExtent: { + return 2*basicLineWidth + 1; + } + case PM_DockWindowHandleExtent: { + int w = 0; + if (widget != 0) + w = widget->fontMetrics().lineSpacing()/4; + if (w > 5*basicLineWidth) + return w; + else + return 5*basicLineWidth; + } + + default: + return KStyle::pixelMetric(m, widget); + } +} + +int HighContrastStyle::kPixelMetric( KStylePixelMetric kpm, const QWidget *widget ) const +{ + switch (kpm) { + case KPM_ListViewBranchThickness: + // XXX Proper support of thick branches requires reimplementation of + // the drawKStylePrimitive KPE_ListViewBranch case. + return basicLineWidth; + default: + return KStyle::kPixelMetric(kpm, widget); + } +} + +QSize HighContrastStyle::sizeFromContents( ContentsType contents, + const QWidget* widget, + const QSize &contentSize, + const QStyleOption& opt ) const +{ + switch (contents) + { + // PUSHBUTTON SIZE + // ------------------------------------------------------------------ + case CT_PushButton: { + const QPushButton* button = (const QPushButton*) widget; + int w = contentSize.width(); + int h = contentSize.height(); + int bm = pixelMetric( PM_ButtonMargin, widget ); + int fw = pixelMetric( PM_DefaultFrameWidth, widget ) * 2; + + w += bm + fw + 6; // ### Add 6 to make way for bold font. + h += bm + fw; + + // Ensure we stick to standard width and heights. + if (( button->isDefault() || button->autoDefault() ) && (button->isEnabled())) { + if ( w < 80 && !button->text().isEmpty() ) + w = 80; + + // Compensate for default indicator + int di = pixelMetric( PM_ButtonDefaultIndicator ); + w += di * 2; + h += di * 2; + } + + if ( h < 22 ) + h = 22; + + return QSize( w + basicLineWidth*2, h + basicLineWidth*2 ); + } + + // TOOLBUTTON SIZE + // ----------------------------------------------------------------- + case CT_ToolButton: { + int w = contentSize.width(); + int h = contentSize.height(); + return QSize(w + basicLineWidth*2 + 6, h + basicLineWidth*2 + 5); + break; + } + + // COMBOBOX SIZE + // ----------------------------------------------------------------- + case CT_ComboBox: { + const QComboBox *cb = static_cast< const QComboBox* > (widget); + int borderSize = (cb->editable() ? 4 : 2) * basicLineWidth; + int arrowSize = pixelMetric (PM_ScrollBarExtent, cb); + return QSize(borderSize + basicLineWidth + arrowSize, borderSize) + contentSize; + } + + // POPUPMENU ITEM SIZE + // ----------------------------------------------------------------- + case CT_PopupMenuItem: { + if ( ! widget || opt.isDefault() ) + return contentSize; + + const QPopupMenu *popup = (const QPopupMenu *) widget; + bool checkable = popup->isCheckable(); + QMenuItem *mi = opt.menuItem(); + int maxpmw = opt.maxIconWidth(); + int w = contentSize.width(), h = contentSize.height(); + + if ( mi->custom() ) { + w = mi->custom()->sizeHint().width(); + h = mi->custom()->sizeHint().height(); + if ( ! mi->custom()->fullSpan() ) + h += 2*itemVMargin + 2*itemFrame; + } + else if ( mi->widget() ) { + } else if ( mi->isSeparator() ) { + w = 10; // Arbitrary + h = 4; + } + else { + if ( mi->pixmap() ) + h = QMAX( h, mi->pixmap()->height() + 2*itemFrame ); + else { + // Ensure that the minimum height for text-only menu items + // is the same as the icon size used by KDE. + h = QMAX( h, 16 + 2*itemFrame ); + h = QMAX( h, popup->fontMetrics().height() + + 2*itemVMargin + 2*itemFrame ); + } + + if ( mi->iconSet() && ! mi->iconSet()->isNull() ) + h = QMAX( h, mi->iconSet()->pixmap( + QIconSet::Small, QIconSet::Normal).height() + + 2 * itemFrame ); + } + + if ( ! mi->text().isNull() && mi->text().find('\t') >= 0 ) + w += 12; + else if ( mi->popup() ) + w += 2 * arrowHMargin; + + if ( maxpmw ) + w += maxpmw + 6; + if ( checkable && maxpmw < 20 ) + w += 20 - maxpmw; + if ( checkable || maxpmw > 0 ) + w += 12; + + w += rightBorder; + + return QSize( w, h ); + } + + + // LINEDIT SIZE + // ----------------------------------------------------------------- + case CT_LineEdit: { + return contentSize + QSize (4*basicLineWidth, 4*basicLineWidth); + } + + + default: + return KStyle::sizeFromContents( contents, widget, contentSize, opt ); + } +} + +QRect HighContrastStyle::subRect (SubRect subrect, const QWidget * widget) const +{ + switch (subrect) { + case SR_ProgressBarGroove: + case SR_ProgressBarContents: + case SR_ProgressBarLabel: + return widget->rect(); + default: + return KStyle::subRect (subrect, widget); + } +} + +bool HighContrastStyle::eventFilter (QObject *object, QEvent *event) +{ + QWidget* widget = dynamic_cast<QWidget*>(object); + if (widget) + { + // Handle hover effects. + if (event->type() == QEvent::Enter + && (widget->inherits ("QButton") + || widget->inherits ("QComboBox") + || widget->inherits ("QSpinWidget"))) + { + hoverWidget = widget; + widget->repaint (false); + } + else if (event->type() == QEvent::Leave + && (widget->inherits ("QButton") + || widget->inherits ("QComboBox") + || widget->inherits ("QSpinWidget"))) + { + if (object == hoverWidget) + hoverWidget = 0L; + widget->repaint (false); + } + // Make sure the focus rectangle is shown correctly. + else if (event->type() == QEvent::FocusIn || event->type() == QEvent::FocusOut) + { + QWidget* widgetparent = dynamic_cast<QWidget*>(widget->parent()); + while (widgetparent + && ! widgetparent->inherits ("QComboBox") + && ! widgetparent->inherits ("QSpinWidget")) + { + widgetparent = dynamic_cast<QWidget*>(widgetparent->parent()); + } + + if (widgetparent) + widgetparent->repaint (false); + else + widget->repaint (false); + } + } + + return KStyle::eventFilter (object, event); +} + +// vim: set noet ts=4 sw=4: +// kate: indent-width 4; replace-tabs off; smart-indent on; tab-width 4; diff --git a/kstyles/highcontrast/highcontrast.h b/kstyles/highcontrast/highcontrast.h new file mode 100644 index 000000000..0758b806c --- /dev/null +++ b/kstyles/highcontrast/highcontrast.h @@ -0,0 +1,162 @@ +/* + * High Contrast Style (version 1.0) + * Copyright (C) 2004 Olaf Schmidt <ojschmidt@kde.org> + * + * Derived from Axes Style + * Copyright (C) 2003 Maksim Orlovich <orlovich@cs.rochester.edu> + * + * Axes Style based on KDE 3 HighColor Style, + * Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> + * (C) 2001-2002 Fredrik Höglund <fredrik@kde.org> + * + * KDE 3 HighColor Style drawing routines adapted from the KDE2 HCStyle, + * Copyright (C) 2000 Daniel M. Duley <mosfet@kde.org> + * (C) 2000 Dirk Mueller <mueller@kde.org> + * (C) 2001 Martijn Klingens <klingens@kde.org> + * + * Includes portions from KStyle, + * Copyright (C) 2001-2002 Karol Szwed <gallium@kde.org> + * + * Many thanks to Bradley T. Hughes for the 3 button scrollbar code. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License version 2 as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __HIGHCONTRAST_H +#define __HIGHCONTRAST_H + +#include <qbitmap.h> +#include <qintdict.h> +#include <kdrawutil.h> +#include <kpixmap.h> +#include <kstyle.h> + + +class QPopupMenu; + +class HighContrastStyle : public KStyle +{ + Q_OBJECT + + public: + HighContrastStyle(); + virtual ~HighContrastStyle(); + + void polish( QPalette& pal ); + + void polish( QWidget* widget ); + void unPolish( QWidget* widget ); + + void drawKStylePrimitive( KStylePrimitive kpe, + QPainter* p, + const QWidget* widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawPrimitive( PrimitiveElement pe, + QPainter* p, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawControl( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + const QStyleOption& = QStyleOption::Default ) const; + + void drawControlMask( ControlElement element, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& = QStyleOption::Default ) const; + + void drawComplexControl( ComplexControl control, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QColorGroup &cg, + SFlags flags = Style_Default, + SCFlags controls = SC_All, + SCFlags active = SC_None, + const QStyleOption& = QStyleOption::Default ) const; + + void drawComplexControlMask( ComplexControl control, + QPainter *p, + const QWidget *widget, + const QRect &r, + const QStyleOption& = QStyleOption::Default ) const; + + QRect querySubControlMetrics( ComplexControl control, + const QWidget* widget, + SubControl subcontrol, + const QStyleOption& opt = QStyleOption::Default ) const; + + + void drawItem( QPainter *p, + const QRect &r, + int flags, + const QColorGroup &cg, + bool enabled, + const QPixmap *pixmap, + const QString &text, + int len = -1, + const QColor *penColor = 0 ) const; + + int pixelMetric( PixelMetric m, + const QWidget *widget = 0 ) const; + + int kPixelMetric( KStylePixelMetric m, + const QWidget *widget = 0 ) const; + + QSize sizeFromContents( ContentsType contents, + const QWidget *widget, + const QSize &contentSize, + const QStyleOption& opt ) const; + + QRect subRect (SubRect subrect, const QWidget * widget) const; + + protected: + bool eventFilter( QObject *object, QEvent *event ); + + QWidget *hoverWidget; + + private: + void setColorsNormal (QPainter* p, const QColorGroup& cg, int flags = Style_Enabled, int highlight = Style_Down|Style_MouseOver) const; + void setColorsButton (QPainter* p, const QColorGroup& cg, int flags = Style_Enabled, int highlight = Style_Down|Style_MouseOver) const; + void setColorsText (QPainter* p, const QColorGroup& cg, int flags = Style_Enabled, int highlight = Style_Down|Style_MouseOver) const; + void setColorsHighlight (QPainter* p, const QColorGroup& cg, int flags = Style_Enabled) const; + void setColorsByState (QPainter* p, const QColorGroup& cg, const QColor& fg, const QColor& bg, int flags, int highlight) const; + + void drawRect (QPainter* p, QRect r, int offset = 0, bool filled = true) const; + void drawRoundRect (QPainter* p, QRect r, int offset = 0, bool filled = true) const; + void drawEllipse (QPainter* p, QRect r, int offset = 0, bool filled = true) const; + void drawArrow (QPainter* p, QRect r, PrimitiveElement arrow, int offset = 0) const; + + int basicLineWidth; + // Disable copy constructor and = operator + HighContrastStyle( const HighContrastStyle & ); + HighContrastStyle& operator=( const HighContrastStyle & ); +}; + +// vim: set noet ts=4 sw=4: +// kate: indent-width 4; replace-tabs off; smart-indent on; tab-width 4; + +#endif diff --git a/kstyles/highcontrast/highcontrast.themerc b/kstyles/highcontrast/highcontrast.themerc new file mode 100644 index 000000000..f7f30809c --- /dev/null +++ b/kstyles/highcontrast/highcontrast.themerc @@ -0,0 +1,127 @@ +[Misc] +Name=HighContrast +Name[af]=Hoë kontras +Name[be]=Высокі кантраст +Name[bn]=হাই কনট্রাস্ট +Name[br]=Dargemm uhel +Name[ca]=Contrast alt +Name[cs]=Vysoký kontrast +Name[csb]=Wësoczi kòntrast +Name[da]=Høj kontrast +Name[de]=Hoher Kontrast +Name[el]=Υψηλή φωτεινότητα +Name[eo]=Granda kontrasto +Name[es]=ContrasteAlto +Name[et]=Tugev kontrast +Name[eu]=Kontraste handia +Name[fa]=سایه روشن بالا +Name[fi]=KorkeaKontrasti +Name[fr]=Contraste fort +Name[fy]=Heechkontrast +Name[he]=ניגודיות גבוהה +Name[hr]=Visoki kontrast +Name[hu]=Erősen kontrasztos +Name[is]=Há birtuskil +Name[it]=Contrasto elevato +Name[ja]=高コントラスト +Name[ka]=კონტრასტი +Name[kk]=Жоғары контрасты +Name[km]=កម្រិតពណ៌ខ្ពស់ +Name[lb]=HéichKontrast +Name[lt]=Didelis kontrastas +Name[lv]=Augsts kontrasts +Name[mk]=Висок контраст +Name[ms]=Kontras Tinggi +Name[nb]=HøyKontrast +Name[nds]=HoochKontrast +Name[ne]=उच्च व्यतिरेक +Name[nl]=Hoogcontrast +Name[nn]=Høg kontrast +Name[pa]=ਗੂੜਾ +Name[pl]=Wysoki kontrast +Name[pt]=Alto Contraste +Name[pt_BR]=Alto Contraste +Name[ro]=Contrast mare +Name[ru]=Контраст +Name[rw]=InyuranyamigaragarireRihebuje +Name[se]=AllaVuostálasvuohta +Name[sl]=VisokKontrast +Name[sr]=Високи контраст +Name[sr@Latn]=Visoki kontrast +Name[sv]=Hög kontrast +Name[ta]=அதிக மாறுபாடு +Name[te]=ఎక్కువ వ్యత్యాసం +Name[tg]=БаландАкс +Name[th]=คอนทราสต์สูง +Name[tr]=Yüksek Kontrast +Name[tt]=KiskenTösle +Name[uk]=Висока контрастність +Name[vi]=Độ tương phản cao +Name[zh_CN]=高对比度 +Name[zh_HK]=高反差 +ConfigPage=kstyle_highcontrast_config +Comment=A style that works well with high contrast color schemes +Comment[af]=´n Styl wat goed werk met hoë kontras kleur skemas +Comment[be]=Стыль, які створаны для працы з высокакантрастнымі колернымі схемамі +Comment[bg]=Стил за схеми с висок контраст +Comment[bs]=Stil koji izgleda dobro sa šemama boja visokog kontrasta +Comment[ca]=Un estil que funciona bé amb esquemes de color de contrast alt +Comment[cs]=Styl vhodný pro barevná schémata s vysokým kontrastem +Comment[csb]=Sztél, jaczi dzejô pòprôwno z témama farwów ò wësoczim kòntrasce +Comment[da]=En stil der virker godt med farvesammensætninger med høj kontrast +Comment[de]=Ein Stil, der gut zu kontrastreichen Farbschemas passt +Comment[el]=Ένα στυλ που δουλεύει καλά με σχήματα υψηλής φωτεινότητας +Comment[en_GB]=A style that works well with high contrast colour schemes +Comment[eo]=Stilo kiu konvenas al kolor-etosoj kiuj havas grandajn kontrastojn +Comment[es]=Un estilo que funciona con esquemas de color de contraste alto +Comment[et]=Stiil, mis sobib hästi tugeva kontrastiga värviskeemidele +Comment[eu]=Kontraste handiko gaiekin ongi moldatzen den estiloa +Comment[fa]=سبکی که به خوبی با طرحهای رنگ، با سایه روشن بالا کار میکند +Comment[fi]=Tyyli joka toimii hyvin korkeakontrastisien väriteemojen kanssa +Comment[fr]=Un style se combinant bien avec les modèles de couleurs à fort contraste +Comment[fy]=In styl dy goed wurket mei hege kontrast kleureskema’s +Comment[gl]=Un estilo que traballa ben con esquemas de cor de alto contraste +Comment[hr]=Stil koji dobro fukcionira s shemama bojanja u visokom kontrastu +Comment[hu]=Erősen kontrasztos színsémákhoz jól illeszkedő stílus +Comment[id]=Gaya yang sesuai untuk skema warna kontras tinggi +Comment[is]=Stíll sem passar vel við litaskemu sem nota há birtuskil +Comment[it]=Uno stile che funziona bene con combinazioni di colori ad alto contrasto +Comment[ja]=高コントラストの色スキームにふさわしいスタイル +Comment[ka]=ფერების მაღალ კონტრასტული სქემების სტილი +Comment[kk]=Контрастығы жоғары түстер сұлбалы стиль +Comment[km]=រចនាប័ទ្មដែលធ្វើការយ៉ាងល្អជាមួយគ្រោងពណ៌កម្រិតខ្ពស់ +Comment[lb]=E Stil, dee gutt bei Faarfschemaë mat engem héiche Kontrast passt +Comment[lt]=Stilius, kuris labai tinka didelio kontrasto spalvų schemoms +Comment[mk]=Стил што добро работи со шеми на бои со висок контраст +Comment[ms]=Gaya yang berfungsi baik dengan skema warna kontras tinggi +Comment[nb]=En stil som passer bra sammen med temaer med høy kontrast +Comment[nds]=En Stil, de goot för Klöörschemas mit hogen Kontrast passt. +Comment[ne]=उच्च व्यतिरेक रङ स्कीमासँग राम्रो कार्य गर्ने शैली +Comment[nl]=Een stijl die goed werkt met hoog contrast kleurenschema's +Comment[nn]=Ein stil som fungerer bra når fargeoppsettet har høg kontrast +Comment[pa]= ਇੱਕ ਸ਼ੈਲੀ, ਜੋ ਕਿ ਗੂੜੀ ਰੰਗ ਸਕੀਮ ਨਾਲ ਵਧੀਆ ਕੰਮ ਕਰਦੀ ਹੈ +Comment[pl]=Styl, który działa dobrze z motywami kolorów o wysokim kontraście +Comment[pt]=Um estilo que funciona bem com esquemas de cores de alto contraste +Comment[pt_BR]=Um estilo que funciona bem com esquemas de cor de alto contraste +Comment[ro]=Un stil care se potriveşte cu schemele de culori cu contrast mare +Comment[ru]=Стиль с контрастными цветовыми схемами +Comment[rw]=Imisusire ikorana neza n'ibishushanyombonera by'ibara inyuranyamigaragarire yo hejuru +Comment[se]=Stiila mii doaibmá bures ovttas ivdnečoahkádusaiguin mas leat alla vuostálasvuohta +Comment[sk]=Štýl, ktorý funguje dobre pri schémach s vysokým kontrastom +Comment[sl]=Slog, ki se dobro obnese z visokokontrastnimi shemami +Comment[sr]=Стил који ради са високо контрастним шемама боја +Comment[sr@Latn]=Stil koji radi sa visoko kontrastnim šemama boja +Comment[sv]=En stil som fungerar bra med färgscheman för hög kontrast +Comment[ta]=அதிக மாறுபாட்டு வண்ண அமைப்புகளில் சரியாக இயங்கும் ஒரு பாணி +Comment[te]=ఎక్కువ వ్యత్యాసాల రంగుల పద్దతులతొ బాగా పనిచేయు ఒక శైలి +Comment[tg]=Услуб, ки бо истифодаи нақшаҳо бо рангҳои баландакс соз кор мекунад +Comment[th]=รูปแบบที่ทำงานได้ดีกับชุดสีคอนทราสต์สูง +Comment[tr]=Yüksek kontrast renk şemalarına uygun bir stil +Comment[tt]=Bu tışlaw bik kisken tösle köyläwlärgä yaxşı kileşä +Comment[uk]=Стиль, який підходить до схем кольорів з високою контрастністю +Comment[vi]=Kiểu dáng thích hợp với lược đồ màu có độ tương phản cao. +Comment[zh_CN]=在高对比度配色方案中适用的样式 +Comment[zh_HK]=適用於高反差色彩的佈景 +Comment[zh_TW]=在高彩度下可以使用的風格 +[KDE] +WidgetStyle=HighContrast |