diff options
Diffstat (limited to 'kxkb/pixmap.cpp')
-rw-r--r-- | kxkb/pixmap.cpp | 307 |
1 files changed, 201 insertions, 106 deletions
diff --git a/kxkb/pixmap.cpp b/kxkb/pixmap.cpp index 8752c258a..01866e71e 100644 --- a/kxkb/pixmap.cpp +++ b/kxkb/pixmap.cpp @@ -1,45 +1,69 @@ +#include <tqapplication.h> #include <tqimage.h> -//#include <tqbitmap.h> +#include <tqbitmap.h> #include <tqfont.h> #include <tqpainter.h> #include <tqregexp.h> #include <tqdict.h> +#include <tqdrawutil.h> -#include <kstandarddirs.h> +#include <tdestandarddirs.h> +#include <tdeglobalsettings.h> #include <tdelocale.h> #include <kdebug.h> #include "pixmap.h" #include "x11helper.h" -#include "kxkbconfig.h" +const TQString LayoutIconManager::flagTemplate("l10n/%1/flag.png"); -static const int FLAG_MAX_WIDTH = 21; -static const int FLAG_MAX_HEIGHT = 14; - -const TQString LayoutIcon::flagTemplate("l10n/%1/flag.png"); -const TQString& LayoutIcon::ERROR_CODE("error"); -LayoutIcon* LayoutIcon::instance; +LayoutIconManager::LayoutIconManager(KxkbConfig *kxkbConfig) + : m_pixmapCache(80), + m_kxkbConfig(kxkbConfig) +{ +} +const TQPixmap& LayoutIconManager::find(const TQString& code_, int pixmapStyle, const TQString& displayName_) +{ + if (m_kxkbConfig->m_useThemeColors) { // use colors from color scheme + m_bgColor = TDEGlobalSettings::highlightColor(); + m_fgColor = TDEGlobalSettings::highlightedTextColor(); + } else { + m_bgColor = m_kxkbConfig->m_colorBackground; + m_fgColor = m_kxkbConfig->m_colorLabel; + } -LayoutIcon& LayoutIcon::getInstance() { - if( instance == NULL ) { - instance = new LayoutIcon(); + m_labelFont = m_kxkbConfig->m_labelFont; + m_labelShadow = m_kxkbConfig->m_labelShadow; + m_shColor = m_kxkbConfig->m_colorShadow; + m_bgTransparent = m_kxkbConfig->m_bgTransparent; + m_fitToBox = m_kxkbConfig->m_fitToBox; + m_dimFlag = m_kxkbConfig->m_dimFlag; + m_bevel = m_kxkbConfig->m_bevel && !m_bgTransparent && pixmapStyle == PIXMAP_STYLE_INDICATOR; + + // Decide on how to style the pixmap + switch(pixmapStyle) { + case PIXMAP_STYLE_NORMAL: + m_showFlag = true; + m_showLabel = false; + break; + + case PIXMAP_STYLE_INDICATOR: + m_showFlag = m_kxkbConfig->m_showFlag; + m_showLabel = m_kxkbConfig->m_showLabel; + break; + + case PIXMAP_STYLE_CONTEXTMENU: + m_fitToBox = false; // causes white color loss + m_showFlag = true; + m_showLabel = false; + break; } - return *instance; -} -LayoutIcon::LayoutIcon(): - m_pixmapCache(80), - m_labelFont("sans") -{ - m_labelFont.setPixelSize(10); - m_labelFont.setWeight(TQFont::Bold); -} + // Label only mode is always 'fit to box' + if (m_showLabel && !m_showFlag) + m_fitToBox = true; -const TQPixmap& -LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& displayName_) -{ TQPixmap* pm = NULL; if( code_ == ERROR_CODE ) { @@ -52,61 +76,130 @@ LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& dis } TQString displayName(displayName_); - - if( displayName.isEmpty() ) { + + if (displayName.isEmpty()) { displayName = KxkbConfig::getDefaultDisplayName(code_); } - if( displayName.length() > 3 ) + if (displayName.length() > 3) displayName = displayName.left(3); - const TQString pixmapKey( showFlag ? code_ + "." + displayName : displayName ); - - pm = m_pixmapCache[pixmapKey]; - if( pm ) - return *pm; - - TQString flag; - if( showFlag ) { - TQString countryCode = getCountryFromLayoutName( code_ ); - flag = locate("locale", flagTemplate.arg(countryCode)); + const TQString pixmapKey( + TQString(m_showFlag ? "f" : "") + TQString(m_showLabel ? "l" : "") + TQString(m_labelShadow ? "s" : "") + "." + + TQString(m_fitToBox ? "F" : "") + TQString(m_dimFlag ? "D" : "") + TQString(m_bevel ? "B" : "") + "." + + m_labelFont.key() + "." + ( m_bgTransparent ? "x" : m_bgColor.name() ) + "." + m_fgColor.name() + "." + m_shColor.name() + '.' + code_ + "." + displayName + ); + + // Only use cache for indicator + if (pixmapStyle == PIXMAP_STYLE_INDICATOR) { + pm = m_pixmapCache[pixmapKey]; + if (pm) + return *pm; } - if( flag.isEmpty() ) { - pm = new TQPixmap(FLAG_MAX_WIDTH, FLAG_MAX_HEIGHT); - pm->fill(Qt::gray); + pm = new TQPixmap(FLAG_MAX_DIM, FLAG_MAX_DIM); + + TQRect r = pm->rect(); + TQPainter p_(pm); + + if (m_showFlag) { + TQString countryCode = getCountryFromLayoutName(code_); + TQString flag = locate("locale", flagTemplate.arg(countryCode)); + + if (flag.isEmpty()) { + pm->fill(m_bgColor); + m_showLabel = true; + } else { + TQPixmap fp(flag); + + if (m_dimFlag && m_showLabel) + { + TQImage image = fp.convertToImage(); + for (int y = 0; y < image.height(); y++) + { + for(int x = 0; x < image.width(); x++) + { + TQRgb rgb = image.pixel(x,y); + TQRgb dimRgb(tqRgb(tqRed(rgb) * 3/4, tqGreen(rgb) * 3/4, tqBlue(rgb) * 3/4)); + image.setPixel(x, y, dimRgb); + } + } + fp.convertFromImage(image); + } + + if (!m_fitToBox) + { + r = TQRect((FLAG_MAX_DIM - fp.width()) / 2, (FLAG_MAX_DIM - fp.height()) / 2, fp.width(), fp.height()); + } + + TQRect fr(r); // flag rect might be smaller to accomodate the bevel + if (m_bevel) + { + fr.setX(fr.x() + 1); + fr.setY(fr.y() + 1); + fr.setWidth(fr.width() - 1); + fr.setHeight(fr.height() - 1); + } + + p_.drawPixmap(fr, fp); + + // If we don't stretch the flag, we need to apply a mask to it + if (!m_fitToBox) + { + TQPixmap fpmask(FLAG_MAX_DIM, FLAG_MAX_DIM); + TQPainter fpmaskp(&fpmask); + fpmask.fill(TQt::white); + fpmaskp.fillRect(r, TQt::black); + TQBitmap fpmask_; + fpmask_ = fpmask; + pm->setMask((TQBitmap)fpmask_); + } + } + } else { + pm->fill(m_bgColor); } - else { - pm = new TQPixmap(flag); - dimPixmap( *pm ); - -#if 0 - if( pm->height() < FLAG_MAX_HEIGHT ) { - TQPixmap* pix = new TQPixmap(FLAG_MAX_WIDTH, FLAG_MAX_HEIGHT); - pix->fill( Qt::lightGray ); -// pix->fill( TQColor(tqRgba(127,127,127,255)) ); -// TQBitmap mask; -// mask.fill(1); -// pix->setMask(mask); - - int dy = (pix->height() - pm->height()) / 2; - copyBlt( pix, 0, dy, pm, 0, 0, -1, -1 ); -// TQPixmap* px = new TQPixmap(21, 14); -// px->convertFromImage(img);*/ - delete pm; - pm = pix; + + if (m_showLabel) { + TQPainter p(pm); + p.setFont(m_labelFont); + + if (m_labelShadow) { + p.setPen(m_shColor); + p.drawText(1, 1, pm->width(), pm->height(), TQt::AlignCenter, displayName); + } + + p.setPen(m_fgColor); + p.drawText(0, 0, pm->width(), pm->height(), TQt::AlignCenter, displayName); + + if( m_bgTransparent && !m_showFlag ) + { + TQPixmap maskpix(pm->width(), pm->height()); + TQPainter maskp(&maskpix); + + maskpix.fill(TQt::white); + maskp.setPen(TQt::black); + maskp.setFont(m_labelFont); + + maskp.drawText(0, 0, maskpix.width(), maskpix.height(), TQt::AlignCenter, displayName); + if( m_labelShadow ) + { + maskp.drawText(1, 1, maskpix.width(), maskpix.height(), TQt::AlignCenter, displayName); + } + + TQBitmap mask; + mask = maskpix; + pm->setMask(mask); } -#endif } - TQPainter p(pm); - p.setFont(m_labelFont); + if (m_bevel) + { + TQPainter p_(pm); + qDrawShadePanel(&p_, r.x(), r.y(), r.width(), r.height(), tqApp->palette().active(), false, 1, nullptr); + } - p.setPen(Qt::black); - p.drawText(1, 1, pm->width(), pm->height()-2, Qt::AlignCenter, displayName); - p.setPen(Qt::white); - p.drawText(0, 0, pm->width(), pm->height()-2, Qt::AlignCenter, displayName); - m_pixmapCache.insert(pixmapKey, pm); + if (pixmapStyle == PIXMAP_STYLE_INDICATOR) + m_pixmapCache.insert(pixmapKey, pm); return *pm; } @@ -114,24 +207,33 @@ LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& dis /** @brief Try to get country code from layout name in xkb before xorg 6.9.0 */ -TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName) +TQString LayoutIconManager::getCountryFromLayoutName(const TQString& layoutName) { TQString flag; - + if( X11Helper::areLayoutsClean() ) { // >= Xorg 6.9.0 if( layoutName == "mkd" ) flag = "mk"; else - if( layoutName == "srp" ) { - TQString csFlagFile = locate("locale", flagTemplate.arg("cs")); - flag = csFlagFile.isEmpty() ? "yu" : "cs"; + if( layoutName == "srp" ) { + TQString csFlagFile = locate("locale", flagTemplate.arg("cs")); + flag = csFlagFile.isEmpty() ? "yu" : "cs"; } else if( layoutName.endsWith("/jp") ) flag = "jp"; - else - if( layoutName == "trq" || layoutName == "trf" || layoutName == "tralt" ) - flag = "tr"; + else + if( layoutName == "trq" || layoutName == "trf" || layoutName == "tralt" ) + flag = "tr"; + else + if( layoutName == "epo" ) // Esperanto + flag = "eo"; + else + if( layoutName == "mao" ) // Maori + flag = "mi"; + else + if( layoutName == "brai" ) // Braille + flag = "braille"; else if( layoutName.length() > 2 ) flag = ""; @@ -140,10 +242,19 @@ TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName) } else { if( layoutName == "ar" ) // Arabic - not argentina - ; - else - if( layoutName == "sr" || layoutName == "cs") // Serbian language - Yugoslavia - flag = "yu"; + ; + else + if( layoutName == "epo" ) // Esperanto + flag = "eo"; + else + if( layoutName == "mao" ) // Maori + flag = "mi"; + else + if( layoutName == "brai" ) // Braille + flag = "braille"; + else + if( layoutName == "sr" || layoutName == "cs") // Serbian language - Yugoslavia + flag = "yu"; else if( layoutName == "bs" ) // Bosnian language - Bosnia flag = "ba"; @@ -178,8 +289,8 @@ TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName) if( layoutName.endsWith("/jp") ) flag = "jp"; else - if( layoutName == "ml" || layoutName == "dev" || layoutName == "gur" - || layoutName == "guj" || layoutName == "kan" || layoutName == "ori" + if( layoutName == "ml" || layoutName == "dev" || layoutName == "gur" + || layoutName == "guj" || layoutName == "kan" || layoutName == "ori" || layoutName == "tel" || layoutName == "tml" || layoutName == "ben" ) // some Indian languages flag = "in"; else { @@ -189,8 +300,8 @@ TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName) if( sepPos != -1 ) rightCode = layoutName.mid(sepPos+1); // kdDebug() << "layout name breakup: " << leftCode << ":" << rightCode << endl; - - if( rightCode.length() == 2 + + if( rightCode.length() == 2 && TQRegExp("[A-Z][A-Z]").exactMatch(rightCode) ) { flag = rightCode.lower(); } @@ -199,39 +310,23 @@ TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName) } } } - - return flag; -} - -void LayoutIcon::dimPixmap(TQPixmap& pm) -{ - TQImage image = pm.convertToImage(); - for (int y=0; y<image.height(); y++) - for(int x=0; x<image.width(); x++) - { - QRgb rgb = image.pixel(x,y); - QRgb dimRgb(tqRgb(tqRed(rgb)*3/4, tqGreen(rgb)*3/4, tqBlue(rgb)*3/4)); - image.setPixel(x, y, dimRgb); - } - pm.convertFromImage(image); + return flag; } -static const char* ERROR_LABEL = "err"; - //private -TQPixmap* LayoutIcon::createErrorPixmap() +TQPixmap* LayoutIconManager::createErrorPixmap() { TQPixmap* pm = new TQPixmap(21, 14); - pm->fill(Qt::white); + pm->fill(TQt::white); TQPainter p(pm); p.setFont(m_labelFont); - p.setPen(Qt::red); - p.drawText(1, 1, pm->width(), pm->height()-2, Qt::AlignCenter, ERROR_LABEL); - p.setPen(Qt::blue); - p.drawText(0, 0, pm->width(), pm->height()-2, Qt::AlignCenter, ERROR_LABEL); + p.setPen(TQt::red); + p.drawText(1, 1, pm->width(), pm->height()-2, TQt::AlignCenter, ERROR_LABEL); + p.setPen(TQt::blue); + p.drawText(0, 0, pm->width(), pm->height()-2, TQt::AlignCenter, ERROR_LABEL); m_pixmapCache.insert(ERROR_CODE, pm); return pm; |