summaryrefslogtreecommitdiffstats
path: root/kxkb/pixmap.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kxkb/pixmap.cpp')
-rw-r--r--kxkb/pixmap.cpp228
1 files changed, 155 insertions, 73 deletions
diff --git a/kxkb/pixmap.cpp b/kxkb/pixmap.cpp
index 8752c258a..63fc4f1db 100644
--- a/kxkb/pixmap.cpp
+++ b/kxkb/pixmap.cpp
@@ -1,21 +1,20 @@
#include <tqimage.h>
-//#include <tqbitmap.h>
+#include <tqbitmap.h>
#include <tqfont.h>
#include <tqpainter.h>
#include <tqregexp.h>
#include <tqdict.h>
#include <kstandarddirs.h>
+#include <tdeglobalsettings.h>
#include <tdelocale.h>
#include <kdebug.h>
#include "pixmap.h"
#include "x11helper.h"
-#include "kxkbconfig.h"
-static const int FLAG_MAX_WIDTH = 21;
-static const int FLAG_MAX_HEIGHT = 14;
+static const int FLAG_MAX_DIM = 24;
const TQString LayoutIcon::flagTemplate("l10n/%1/flag.png");
const TQString& LayoutIcon::ERROR_CODE("error");
@@ -30,16 +29,53 @@ LayoutIcon& LayoutIcon::getInstance() {
}
LayoutIcon::LayoutIcon():
- m_pixmapCache(80),
- m_labelFont("sans")
+ m_pixmapCache(80)
{
- m_labelFont.setPixelSize(10);
- m_labelFont.setWeight(TQFont::Bold);
}
const TQPixmap&
-LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& displayName_)
+LayoutIcon::findPixmap(const TQString& code_, int pixmapStyle, const TQString& displayName_)
{
+ m_kxkbConfig.load(KxkbConfig::LOAD_ALL); // (re)load settings
+
+ 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;
+ }
+
+ m_labelFont = m_kxkbConfig.m_labelFont;
+ m_labelShadow = m_kxkbConfig.m_labelShadow;
+ m_shColor = m_kxkbConfig.m_colorShadow;
+ m_bgTransparent = m_kxkbConfig.m_bgTransparent;
+
+ // Decide on how to style the pixmap
+ switch(pixmapStyle) {
+ case PIXMAP_STYLE_NORMAL:
+ m_fitToBox = true;
+ m_showFlag = true;
+ m_showLabel = false;
+ break;
+
+ case PIXMAP_STYLE_INDICATOR:
+ m_fitToBox = true;
+ 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;
+ }
+
+ // Label only mode is always 'fit to box'
+ if( m_showLabel && !m_showFlag )
+ m_fitToBox = true;
+
TQPixmap* pm = NULL;
if( code_ == ERROR_CODE ) {
@@ -52,61 +88,89 @@ LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& dis
}
TQString displayName(displayName_);
-
+
if( displayName.isEmpty() ) {
displayName = KxkbConfig::getDefaultDisplayName(code_);
}
if( displayName.length() > 3 )
displayName = displayName.left(3);
- const TQString pixmapKey( showFlag ? code_ + "." + displayName : displayName );
-
- pm = m_pixmapCache[pixmapKey];
- if( pm )
- return *pm;
+ const TQString pixmapKey(
+ TQString( m_showFlag ? "f" : "" ) + TQString( m_showLabel ? "l" : "" ) + TQString( m_labelShadow ? "s" : "" ) + "." +
+ m_labelFont.key() + "." + ( m_bgTransparent ? "x" : m_bgColor.name() ) + "." + m_fgColor.name() + "." + m_shColor.name() + '.' + code_ + "." + displayName
+ );
- TQString flag;
- if( showFlag ) {
- TQString countryCode = getCountryFromLayoutName( code_ );
- flag = locate("locale", flagTemplate.arg(countryCode));
+ // 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);
- }
- 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;
+ // Need to create new pixmap
+ pm = new TQPixmap();
+
+ if( m_fitToBox ) // Resize to box size
+ pm->resize(FLAG_MAX_DIM, FLAG_MAX_DIM);
+
+ 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 {
+ if( m_fitToBox ) { // Resize flag
+ TQPainter p_(pm);
+ p_.drawPixmap(TQRect(0, 0, FLAG_MAX_DIM, FLAG_MAX_DIM), flag);
+ } else { // Show the flag as is
+ pm->load(flag);
+ }
+
+ if( m_showLabel ) // only dim for label
+ dimPixmap( *pm );
}
-#endif
+ } else {
+ pm->fill(m_bgColor);
}
- TQPainter p(pm);
- p.setFont(m_labelFont);
+ 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);
+ }
+ }
- 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;
}
@@ -117,21 +181,30 @@ LayoutIcon::findPixmap(const TQString& code_, bool showFlag, const TQString& dis
TQString LayoutIcon::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 +213,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 +260,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 +271,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,7 +281,7 @@ TQString LayoutIcon::getCountryFromLayoutName(const TQString& layoutName)
}
}
}
-
+
return flag;
}
@@ -210,8 +292,8 @@ void LayoutIcon::dimPixmap(TQPixmap& pm)
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));
+ 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);
}
pm.convertFromImage(image);
@@ -223,15 +305,15 @@ static const char* ERROR_LABEL = "err";
TQPixmap* LayoutIcon::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;