MythTV  0.26-pre
uitypes.cpp
Go to the documentation of this file.
00001 // ANSI C headers
00002 #include <cmath> // for ceilf
00003 
00004 // C++ headers
00005 #include <algorithm>
00006 using namespace std;
00007 
00008 // Qt headers
00009 #include <QCoreApplication>
00010 #include <QPainter>
00011 #include <QLabel>
00012 
00013 using namespace std;
00014 
00015 #include "uitypes.h"
00016 #include "mythdialogs.h"
00017 #include "mythcontext.h"
00018 #include "lcddevice.h"
00019 #include "mythmiscutil.h"
00020 
00021 #include "mythfontproperties.h"
00022 #include "mythuihelper.h"
00023 #include "x11colors.h"
00024 
00025 #include "mythlogging.h"
00026 
00027 #ifdef USING_MINGW
00028 #undef LoadImage
00029 #endif
00030 
00031 LayerSet::LayerSet(const QString &name) :
00032     m_debug(false),
00033     m_context(-1),
00034     m_order(-1),
00035     m_name(name),
00036     numb_layers(-1),
00037     allTypes(new vector<UIType *>)
00038 {
00039 }
00040 
00041 LayerSet::~LayerSet()
00042 {
00043     vector<UIType *>::iterator i = allTypes->begin();
00044     for (; i != allTypes->end(); ++i)
00045     {
00046         UIType *type = (*i);
00047         if (type)
00048             delete type;
00049     }
00050     delete allTypes;
00051 }
00052 
00053 void LayerSet::AddType(UIType *type)
00054 {
00055     type->SetDebug(m_debug);
00056     typeList[type->Name()] = type;
00057     allTypes->push_back(type);
00058     type->SetParent(this);
00059     bumpUpLayers(type->getOrder());
00060 }
00061 
00062 UIType *LayerSet::GetType(const QString &name)
00063 {
00064     UIType *ret = NULL;
00065     if (typeList.contains(name))
00066         ret = typeList[name];
00067 
00068     return ret;
00069 }
00070 
00071 void LayerSet::bumpUpLayers(int a_number)
00072 {
00073     if (a_number > numb_layers)
00074     {
00075         numb_layers = a_number;
00076     }
00077 }
00078 
00079 void LayerSet::Draw(QPainter *dr, int drawlayer, int context)
00080 {
00081   if (m_context == context || m_context == -1)
00082   {
00083     vector<UIType *>::iterator i = allTypes->begin();
00084     for (; i != allTypes->end(); ++i)
00085     {
00086         if (m_debug)
00087             LOG(VB_GENERAL, LOG_DEBUG, "-LayerSet::Draw");
00088         UIType *type = (*i);
00089         type->Draw(dr, drawlayer, context);
00090     }
00091   }
00092 }
00093 
00094 void LayerSet::DrawRegion(QPainter *dr, QRect &area, int drawlayer, int context)
00095 {
00096   if (m_context == context || m_context == -1)
00097   {
00098     vector<UIType *>::iterator i = allTypes->begin();
00099     for (; i != allTypes->end(); ++i)
00100     {
00101         if (m_debug)
00102             LOG(VB_GENERAL, LOG_DEBUG, "-LayerSet::DrawRegion");
00103         UIType *type = (*i);
00104         type->DrawRegion(dr, area, drawlayer, context);
00105     }
00106   }
00107 }
00108 
00109 void LayerSet::SetDrawFontShadow(bool state)
00110 {
00111     vector<UIType *>::iterator i = allTypes->begin();
00112     for (; i != allTypes->end(); ++i)
00113     {
00114         UIType *type = (*i);
00115         type->SetDrawFontShadow(state);
00116     }
00117 }
00118 
00119 // **************************************************************
00120 
00121 UIType::UIType(const QString &name)
00122        : QObject(NULL)
00123 {
00124     setObjectName(name);
00125     m_parent = NULL;
00126     m_name = name;
00127     m_debug = false;
00128     m_context = -1;
00129     m_order = -1;
00130     has_focus = false;
00131     takes_focus = false;
00132     screen_area = QRect(0,0,0,0);
00133     drawFontShadow = true;
00134     hidden = false;
00135 }
00136 
00137 void UIType::SetOrder(int order)
00138 {
00139     m_order = order;
00140     if (m_parent)
00141     {
00142         m_parent->bumpUpLayers(order);
00143     }
00144 }
00145 
00146 UIType::~UIType()
00147 {
00148 }
00149 
00150 void UIType::Draw(QPainter *dr, int drawlayer, int context)
00151 {
00152     dr->end();
00153     (void)drawlayer;
00154     (void)context;
00155 }
00156 
00157 void UIType::DrawRegion(QPainter *dr, QRect &area, int drawlayer, int context)
00158 {
00159     (void)dr;
00160     (void)area;
00161     (void)drawlayer;
00162     (void)context;
00163 }
00164 
00165 void UIType::SetParent(LayerSet *parent)
00166 {
00167     m_parent = parent;
00168 }
00169 
00170 QString UIType::Name()
00171 {
00172     return m_name;
00173 }
00174 
00175 bool UIType::takeFocus()
00176 {
00177     if (takes_focus)
00178     {
00179         has_focus = true;
00180         refresh();
00181         emit takingFocus();
00182         return true;
00183     }
00184     has_focus = false;
00185     return false;
00186 }
00187 
00188 void UIType::looseFocus()
00189 {
00190     emit loosingFocus();
00191     has_focus = false;
00192     refresh();
00193 }
00194 
00195 void UIType::calculateScreenArea()
00196 {
00197     screen_area = QRect(0,0,0,0);
00198 }
00199 
00200 void UIType::refresh()
00201 {
00202     emit requestUpdate(screen_area);
00203 }
00204 
00205 void UIType::show()
00206 {
00207     //
00208     //  In this base class, this is pretty simple. The method is virtual
00209     //  though, and inherited fancy classes like UIListBttn can/will/should
00210     //  set a timer and fade things on a show()
00211     //
00212 
00213     hidden = false;
00214     refresh();
00215 }
00216 
00217 void UIType::hide()
00218 {
00219     hidden = true;
00220     refresh();
00221 }
00222 
00223 bool UIType::toggleShow()
00224 {
00225     if (hidden)
00226     {
00227         show();
00228     }
00229     else
00230     {
00231         hide();
00232     }
00233 
00234     return !hidden;
00235 }
00236 
00237 QString UIType::cutDown(const QString &data, QFont *testFont, bool multiline,
00238                         int overload_width, int overload_height)
00239 {
00240     int length = data.length();
00241     if (length == 0)
00242         return data;
00243 
00244     int maxwidth = screen_area.width();
00245     if (overload_width != -1)
00246         maxwidth = overload_width;
00247     int maxheight = screen_area.height();
00248     if (overload_height != -1)
00249         maxheight = overload_height;
00250 
00251     int justification = Qt::AlignLeft | Qt::TextWordWrap;
00252     QFontMetrics fm(*testFont);
00253 
00254     int margin = length - 1;
00255     int index = 0;
00256     int diff = 0;
00257 
00258     while (margin > 0)
00259     {
00260         if (multiline)
00261             diff = maxheight - fm.boundingRect(0, 0, maxwidth, maxheight,
00262                                                justification,
00263                                                data.left(index + margin)
00264                                                ).height();
00265         else
00266             diff = maxwidth - fm.width(data, index + margin);
00267         if (diff >= 0)
00268             index += margin;
00269 
00270         margin /= 2;
00271 
00272         if (index + margin >= length - 1)
00273             margin = (length - 1) - index;
00274     }
00275 
00276     if (index < length - 1)
00277     {
00278         QString tmpStr(data);
00279         tmpStr.truncate(index);
00280         if (index >= 3)
00281             tmpStr.replace(index - 3, 3, "...");
00282         return tmpStr;
00283     }
00284 
00285     return data;
00286 }
00287 
00288 
00289 // ********************************************************************
00290 
00291 UIKeyType::UIKeyType(const QString &name)
00292          : UIType(name)
00293 {
00294     m_normalImg = m_focusedImg = m_downImg = m_downFocusedImg = NULL;
00295     m_normalFont = m_focusedFont = m_downFont = m_downFocusedFont = NULL;
00296 
00297     m_pos = QPoint(0, 0);
00298 
00299     m_bDown = false;
00300     m_bShift = false;
00301     m_bAlt = false;
00302     m_bToggle = false;
00303 
00304     takes_focus = true;
00305     connect(&m_pushTimer, SIGNAL(timeout()), this, SLOT(unPush()));
00306 }
00307 
00308 UIKeyType::~UIKeyType()
00309 {
00310 }
00311 
00312 void UIKeyType::Draw(QPainter *dr, int drawlayer, int context)
00313 {
00314     if (m_context == context || m_context == -1)
00315     {
00316         if (drawlayer == m_order)
00317         {
00318             fontProp *tempFont;
00319 
00320             // draw the button image
00321             if (!m_bDown)
00322             {
00323                 if (!has_focus)
00324                 {
00325                     dr->drawPixmap(m_pos.x(), m_pos.y(), *m_normalImg);
00326                     tempFont = m_normalFont;
00327                 }
00328                 else
00329                 {
00330                     dr->drawPixmap(m_pos.x(), m_pos.y(), *m_focusedImg);
00331                     tempFont = m_focusedFont;
00332                 }
00333             }
00334             else
00335             {
00336                 if (!has_focus)
00337                 {
00338                     dr->drawPixmap(m_pos.x(), m_pos.y(), *m_downImg);
00339                     tempFont = m_downFont;
00340                 }
00341                 else
00342                 {
00343                     dr->drawPixmap(m_pos.x(), m_pos.y(), *m_downFocusedImg);
00344                     tempFont = m_downFocusedFont;
00345                 }
00346             }
00347 
00348             dr->setFont(tempFont->face);
00349 
00350             // draw the button text
00351             QString text;
00352 
00353             if (!m_bShift)
00354             {
00355                 if (!m_bAlt)
00356                     text = m_normalChar;
00357                 else
00358                     text = m_altChar;
00359             }
00360             else
00361             {
00362                 if (!m_bAlt)
00363                     text = m_shiftChar;
00364                 else
00365                     text = m_shiftAltChar;
00366             }
00367 
00368             if (drawFontShadow &&
00369                 (tempFont->shadowOffset.x() != 0 ||
00370                  tempFont->shadowOffset.y() != 0))
00371             {
00372                 dr->setBrush(tempFont->dropColor);
00373                 dr->setPen(QPen(tempFont->dropColor, (int)(2 * m_wmult)));
00374                 dr->drawText(m_pos.x() + tempFont->shadowOffset.x(),
00375                              m_pos.y() + tempFont->shadowOffset.y(),
00376                              m_area.width(), m_area.height(),
00377                              Qt::AlignCenter, text);
00378             }
00379 
00380             dr->setBrush(tempFont->color);
00381             dr->setPen(QPen(tempFont->color, (int)(2 * m_wmult)));
00382             dr->drawText(m_pos.x(), m_pos.y(), m_area.width(), m_area.height(),
00383                          Qt::AlignCenter, text);
00384         }
00385     }
00386 }
00387 
00388 void UIKeyType::SetImages(QPixmap *normal, QPixmap *focused,
00389                           QPixmap *down, QPixmap *downFocused)
00390 {
00391     m_normalImg = normal;
00392     m_focusedImg = focused;
00393     m_downImg = down;
00394     m_downFocusedImg = downFocused;
00395 }
00396 
00397 void UIKeyType::SetDefaultImages(QPixmap *normal, QPixmap *focused,
00398                                  QPixmap *down, QPixmap *downFocused)
00399 {
00400     if (!m_normalImg) m_normalImg = normal;
00401     if (!m_focusedImg) m_focusedImg = focused;
00402     if (!m_downImg) m_downImg = down;
00403     if (!m_downFocusedImg) m_downFocusedImg = downFocused;
00404 }
00405 
00406 void UIKeyType::SetFonts(fontProp *normal, fontProp *focused,
00407                          fontProp *down, fontProp *downFocused)
00408 {
00409     m_normalFont = normal;
00410     m_focusedFont = focused;
00411     m_downFont = down;
00412     m_downFocusedFont = downFocused;
00413 }
00414 
00415 void UIKeyType::SetDefaultFonts(fontProp *normal, fontProp *focused,
00416                                 fontProp *down, fontProp *downFocused)
00417 {
00418     if (!m_normalFont) m_normalFont = normal;
00419     if (!m_focusedFont) m_focusedFont = focused;
00420     if (!m_downFont) m_downFont = down;
00421     if (!m_downFocusedFont) m_downFocusedFont = downFocused;
00422 }
00423 
00424 void UIKeyType::SetChars(QString normal, QString shift, QString alt,
00425                          QString shiftAlt)
00426 {
00427     m_normalChar = decodeChar(normal);
00428     m_shiftChar = decodeChar(shift);
00429     m_altChar = decodeChar(alt);
00430     m_shiftAltChar = decodeChar(shiftAlt);
00431 }
00432 
00433 QString UIKeyType::GetChar()
00434 {
00435     if (!m_bShift && !m_bAlt)
00436         return m_normalChar;
00437     else if (m_bShift && !m_bAlt)
00438         return m_shiftChar;
00439     else if (!m_bShift && m_bAlt)
00440         return m_altChar;
00441     else if (m_bShift && m_bAlt)
00442         return m_shiftAltChar;
00443 
00444     return m_normalChar;
00445 }
00446 
00447 QString UIKeyType::decodeChar(QString c)
00448 {
00449     QString res = "";
00450 
00451     while (c.length() > 0)
00452     {
00453         if (c.startsWith("0x"))
00454         {
00455             QString sCode = c.left(6);
00456             bool bOK;
00457             short nCode = sCode.toShort(&bOK, 16);
00458 
00459             c = c.mid(6);
00460 
00461             if (bOK)
00462             {
00463                 QChar uc(nCode);
00464                 res += QString(uc);
00465             }
00466             else
00467                 LOG(VB_GENERAL, LOG_ERR,
00468                          QString("UIKeyType::decodeChar - bad char code (%1)")
00469                              .arg(sCode));
00470         }
00471         else
00472         {
00473             res += c.left(1);
00474             c = c.mid(1);
00475         }
00476     }
00477 
00478     return res;
00479 }
00480 
00481 void UIKeyType::SetMoves(QString moveLeft, QString moveRight, QString moveUp,
00482                          QString moveDown)
00483 {
00484     m_moveLeft = moveLeft;
00485     m_moveRight = moveRight;
00486     m_moveUp = moveUp;
00487     m_moveDown = moveDown;
00488 }
00489 
00490 QString UIKeyType::GetMove(QString direction)
00491 {
00492     QString res = m_moveLeft;
00493 
00494     if (direction == "Up")
00495         res = m_moveUp;
00496     else if (direction == "Down")
00497         res = m_moveDown;
00498     else if (direction == "Right")
00499         res = m_moveRight;
00500 
00501     return res;
00502 }
00503 
00504 void UIKeyType::calculateScreenArea()
00505 {
00506     if (!m_normalImg)
00507         return;
00508 
00509     int width = m_normalImg->width();
00510     int height = m_normalImg->height();
00511 
00512     QRect r = QRect(m_pos.x(), m_pos.y(), width, height);
00513     r.translate(m_parent->GetAreaRect().left(), m_parent->GetAreaRect().top());
00514     screen_area = r;
00515     m_area = r;
00516 }
00517 
00518 void UIKeyType::SetShiftState(bool sh, bool ag)
00519 {
00520     m_bShift = sh;
00521     m_bAlt = ag;
00522     refresh();
00523 }
00524 
00525 void UIKeyType::push()
00526 {
00527     if (m_bToggle)
00528     {
00529         m_bDown = !m_bDown;
00530         refresh();
00531         emit pushed();
00532 
00533         return;
00534     }
00535 
00536     if (m_bDown)
00537         return;
00538 
00539     m_bDown = true;
00540     m_pushTimer.setSingleShot(true);
00541     m_pushTimer.start(300);
00542     refresh();
00543     emit pushed();
00544 }
00545 
00546 void UIKeyType::unPush()
00547 {
00548     if (!m_bToggle)
00549     {
00550         m_bDown = false;
00551         refresh();
00552     }
00553 }
00554 
00555 // ********************************************************************
00556 
00557 const int numcomps = 95;
00558 
00559 const QString comps[numcomps][3] = {
00560         {"!", "!", (QChar)0xa1},    {"c", "/", (QChar)0xa2},
00561         {"l", "-", (QChar)0xa3},    {"o", "x", (QChar)0xa4},
00562         {"y", "-", (QChar)0xa5},    {"|", "|", (QChar)0xa6},
00563         {"s", "o", (QChar)0xa7},    {"\"", "\"", (QChar)0xa8},
00564         {"c", "o", (QChar)0xa9},    {"-", "a", (QChar)0xaa},
00565         {"<", "<", (QChar)0xab},    {"-", "|", (QChar)0xac},
00566         {"-", "-", (QChar)0xad},    {"r", "o", (QChar)0xae},
00567         {"^", "-", (QChar)0xaf},    {"^", "0", (QChar)0xb0},
00568         {"+", "-", (QChar)0xb1},    {"^", "2", (QChar)0xb2},
00569         {"^", "3", (QChar)0xb3},    {"/", "/", (QChar)0xb4},
00570         {"/", "u", (QChar)0xb5},    {"P", "!", (QChar)0xb6},
00571         {"^", ".", (QChar)0xb7},    {",", ",", (QChar)0xb8},
00572         {"^", "1", (QChar)0xb9},    {"_", "o", (QChar)0xba},
00573         {">", ">", (QChar)0xbb},    {"1", "4", (QChar)0xbc},
00574         {"1", "2", (QChar)0xbd},    {"3", "4", (QChar)0xbe},
00575         {"?", "?", (QChar)0xbf},    {"A", "`", (QChar)0xc0},
00576         {"A", "'", (QChar)0xc1},    {"A", "^", (QChar)0xc2},
00577         {"A", "~", (QChar)0xc3},    {"A", "\"", (QChar)0xc4},
00578         {"A", "*", (QChar)0xc5},    {"A", "E", (QChar)0xc6},
00579         {"C", ",", (QChar)0xc7},    {"E", "`", (QChar)0xc8},
00580         {"E", "'", (QChar)0xc9},    {"E", "^", (QChar)0xca},
00581         {"E", "\"", (QChar)0xcb},   {"I", "`", (QChar)0xcc},
00582         {"I", "'", (QChar)0xcd},    {"I", "^", (QChar)0xce},
00583         {"I", "\"", (QChar)0xcf},   {"D", "-", (QChar)0xd0},
00584         {"N", "~", (QChar)0xd1},    {"O", "`", (QChar)0xd2},
00585         {"O", "'", (QChar)0xd3},    {"O", "^", (QChar)0xd4},
00586         {"O", "~", (QChar)0xd5},    {"O", "\"", (QChar)0xd6},
00587         {"x", "x", (QChar)0xd7},    {"O", "/", (QChar)0xd8},
00588         {"U", "`", (QChar)0xd9},    {"U", "'", (QChar)0xda},
00589         {"U", "^", (QChar)0xdb},    {"U", "\"", (QChar)0xdc},
00590         {"Y", "'", (QChar)0xdd},    {"T", "H", (QChar)0xde},
00591         {"s", "s", (QChar)0xdf},    {"a", "`", (QChar)0xe0},
00592         {"a", "'", (QChar)0xe1},    {"a", "^", (QChar)0xe2},
00593         {"a", "~", (QChar)0xe3},    {"a", "\"", (QChar)0xe4},
00594         {"a", "*", (QChar)0xe5},    {"a", "e", (QChar)0xe6},
00595         {"c", ",", (QChar)0xe7},    {"e", "`", (QChar)0xe8},
00596         {"e", "'", (QChar)0xe9},    {"e", "^", (QChar)0xea},
00597         {"e", "\"", (QChar)0xeb},   {"i", "`", (QChar)0xec},
00598         {"i", "'", (QChar)0xed},    {"i", "^", (QChar)0xee},
00599         {"i", "\"", (QChar)0xef},   {"d", "-", (QChar)0xf0},
00600         {"n", "~", (QChar)0xf1},    {"o", "`", (QChar)0xf2},
00601         {"o", "'", (QChar)0xf3},    {"o", "^", (QChar)0xf4},
00602         {"o", "~", (QChar)0xf5},    {"o", "\"", (QChar)0xf6},
00603         {"-", ":", (QChar)0xf7},    {"o", "/", (QChar)0xf8},
00604         {"u", "`", (QChar)0xf9},    {"u", "'", (QChar)0xfa},
00605         {"u", "^", (QChar)0xfb},    {"u", "\"", (QChar)0xfc},
00606         {"y", "'", (QChar)0xfd},    {"t", "h", (QChar)0xfe},
00607         {"y", "\"", (QChar)0xff}
00608 };
00609 
00610 UIKeyboardType::UIKeyboardType(const QString &name, int order)
00611                     : UIType(name)
00612 {
00613     m_order = order;
00614     m_container = NULL;
00615     m_parentEdit = NULL;
00616     m_parentDialog = NULL;
00617     m_bInitalized = false;
00618     m_focusedKey = m_doneKey = m_altKey = m_lockKey = NULL;
00619     m_shiftRKey = m_shiftLKey = NULL;
00620 
00621     m_bCompTrap = false;
00622     m_comp1 = "";
00623 }
00624 
00625 
00626 UIKeyboardType::~UIKeyboardType()
00627 {
00628     if (m_container)
00629         delete m_container;
00630 }
00631 
00632 void UIKeyboardType::init()
00633 {
00634     m_bInitalized = true;
00635 
00636     KeyList::iterator it = m_keyList.begin();
00637     for (; it != m_keyList.end(); ++it)
00638     {
00639         UIKeyType *key = *it;
00640         if (key->GetType() == "char")
00641         {
00642             connect(key, SIGNAL( pushed() ), this, SLOT( charKey() ) );
00643         }
00644         else if (key->GetType() == "shift")
00645         {
00646             if (!m_shiftLKey)
00647             {
00648                 connect(key, SIGNAL( pushed() ), this, SLOT( shiftLOnOff() ) );
00649                 m_shiftLKey = key;
00650                 m_shiftLKey->SetToggleKey(true);
00651             }
00652             else
00653             {
00654                 connect(key, SIGNAL( pushed() ), this, SLOT( shiftROnOff() ) );
00655                 m_shiftRKey = key;
00656                 m_shiftRKey->SetToggleKey(true);
00657             }
00658         }
00659         else if (key->GetType() == "del")
00660         {
00661             connect(key, SIGNAL( pushed() ), this, SLOT( delKey() ) );
00662         }
00663         else if (key->GetType() == "back")
00664         {
00665             connect(key, SIGNAL( pushed() ), this, SLOT( backspaceKey() ) );
00666         }
00667         else if (key->GetType() == "lock")
00668         {
00669             connect(key, SIGNAL( pushed() ), this, SLOT( lockOnOff() ) );
00670             m_lockKey = key;
00671             m_lockKey->SetToggleKey(true);
00672         }
00673         else if (key->GetType() == "done")
00674         {
00675             connect(key, SIGNAL( pushed() ), this, SLOT( close() ) );
00676             m_doneKey = key;
00677         }
00678         else if (key->GetType() == "moveleft")
00679         {
00680             connect(key, SIGNAL( pushed() ), this, SLOT( leftCursor() ) );
00681         }
00682         else if (key->GetType() == "moveright")
00683         {
00684             connect(key, SIGNAL( pushed() ), this, SLOT( rightCursor() ) );
00685         }
00686         else if (key->GetType() == "comp")
00687         {
00688             connect(key, SIGNAL( pushed() ), this, SLOT( compOnOff() ) );
00689         }
00690         else if (key->GetType() == "alt")
00691         {
00692             connect(key, SIGNAL( pushed() ), this, SLOT( altGrOnOff() ) );
00693             m_altKey = key;
00694             m_altKey->SetToggleKey(true);
00695         }
00696     }
00697 }
00698 
00699 void UIKeyboardType::Draw(QPainter *dr, int drawlayer, int context)
00700 {
00701     if (!m_bInitalized)
00702         init();
00703 
00704     if (hidden)
00705         return;
00706 
00707     if (m_context == context || m_context == -1)
00708     {
00709         if (drawlayer == m_order)
00710         {
00711             dr = dr;
00712         }
00713     }
00714 }
00715 
00716 void UIKeyboardType::calculateScreenArea()
00717 {
00718     QRect r = m_area;
00719     r.translate(m_parent->GetAreaRect().left(),
00720                 m_parent->GetAreaRect().top());
00721     screen_area = r;
00722 }
00723 
00724 void UIKeyboardType::leftCursor()
00725 {
00726     if (!m_parentEdit)
00727         return;
00728 
00729     if (m_parentEdit->inherits("QLineEdit"))
00730     {
00731         QLineEdit *par = (QLineEdit *)m_parentEdit;
00732         par->cursorBackward(m_shiftLKey->IsOn());
00733     }
00734     else if (m_parentEdit->inherits("QTextEdit"))
00735     {
00736         QTextEdit *par = (QTextEdit *)m_parentEdit;
00737         par->textCursor().movePosition(
00738             QTextCursor::PreviousCharacter, QTextCursor::MoveAnchor);
00739     }
00740     else
00741     {
00742         QKeyEvent *key = new QKeyEvent(
00743             QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
00744         QCoreApplication::postEvent(m_parentEdit, key);
00745     }
00746 }
00747 
00748 void UIKeyboardType::rightCursor()
00749 {
00750     if (!m_parentEdit)
00751         return;
00752 
00753     if (m_parentEdit->inherits("QLineEdit"))
00754     {
00755         QLineEdit *par = (QLineEdit *)m_parentEdit;
00756         par->cursorForward(m_shiftLKey->IsOn());
00757     }
00758     else if (m_parentEdit->inherits("QTextEdit"))
00759     {
00760         QTextEdit *par = (QTextEdit *)m_parentEdit;
00761         par->textCursor().movePosition(
00762             QTextCursor::NextCharacter, QTextCursor::MoveAnchor);
00763     }
00764     else
00765     {
00766         QKeyEvent *key = new QKeyEvent(
00767             QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
00768         QCoreApplication::postEvent(m_parentEdit, key);
00769     }
00770 }
00771 
00772 void UIKeyboardType::backspaceKey()
00773 {
00774     if (!m_parentEdit)
00775         return;
00776 
00777     if (m_parentEdit->inherits("QLineEdit"))
00778     {
00779         QLineEdit *par = (QLineEdit *)m_parentEdit;
00780         par->backspace();
00781     }
00782     else if (m_parentEdit->inherits("MythRemoteLineEdit"))
00783     {
00784         MythRemoteLineEdit *par = (MythRemoteLineEdit *)m_parentEdit;
00785         par->backspace();
00786     }
00787     else
00788     {
00789         QKeyEvent *key = new QKeyEvent(
00790             QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier, "", false, 1);
00791         QCoreApplication::postEvent(m_parentEdit, key);
00792     }
00793 }
00794 
00795 void UIKeyboardType::delKey()
00796 {
00797     if (!m_parentEdit)
00798         return;
00799 
00800     if (m_parentEdit->inherits("QLineEdit"))
00801     {
00802         QLineEdit *par = (QLineEdit *)m_parentEdit;
00803         par->del();
00804     }
00805     else if (m_parentEdit->inherits("MythRemoteLineEdit"))
00806     {
00807         MythRemoteLineEdit *par = (MythRemoteLineEdit *)m_parentEdit;
00808         par->del();
00809     }
00810     else
00811     {
00812         QKeyEvent *key = new QKeyEvent(
00813             QEvent::KeyPress, Qt::Key_Delete, Qt::NoModifier, "", false, 1);
00814         QCoreApplication::postEvent(m_parentEdit, key);
00815     }
00816 }
00817 
00818 void UIKeyboardType::altGrOnOff()
00819 {
00820     if (m_lockKey->IsOn())
00821     {
00822         m_shiftLKey->SetOn(false);
00823         if (m_shiftRKey) m_shiftRKey->SetOn(false);
00824         if (m_altKey) m_altKey->SetOn(false);
00825         m_lockKey->SetOn(false);
00826     }
00827     updateButtons();
00828 }
00829 
00830 void UIKeyboardType::compOnOff()
00831 {
00832     m_bCompTrap = !m_bCompTrap;
00833     m_comp1 = "";
00834 }
00835 
00836 void UIKeyboardType::charKey()
00837 {
00838     if (m_focusedKey && m_focusedKey->GetType() == "char")
00839     {
00840         insertChar(m_focusedKey->GetChar());
00841         shiftOff();
00842     }
00843 }
00844 
00845 void UIKeyboardType::insertChar(QString c)
00846 {
00847     if (!m_bCompTrap)
00848     {
00849         if (m_parentEdit->inherits("QLineEdit"))
00850         {
00851             QLineEdit *par = (QLineEdit *)m_parentEdit;
00852             par->insert(c);
00853         }
00854         else if (m_parentEdit->inherits("MythRemoteLineEdit"))
00855         {
00856             MythRemoteLineEdit *par = (MythRemoteLineEdit *)m_parentEdit;
00857             par->insert(c);
00858         }
00859         else
00860         {
00861             QKeyEvent *key = new QKeyEvent(QEvent::KeyPress, 0, Qt::NoModifier,
00862                                            c, false, c.length());
00863             QCoreApplication::postEvent(m_parentEdit, key);
00864         }
00865     }
00866     else
00867     {
00868         if (m_comp1.isEmpty()) m_comp1 = c;
00869         else
00870         {
00871             // Produce the composed key.
00872             for (int i=0; i<numcomps; i++)
00873             {
00874                 if ((m_comp1 == comps[i][0]) && (c == comps[i][1]))
00875                 {
00876                     if (m_parentEdit->inherits("QLineEdit"))
00877                     {
00878                         QLineEdit *par = (QLineEdit *)m_parentEdit;
00879                         par->insert(comps[i][2]);
00880                     }
00881                     else if (m_parentEdit->inherits("MythRemoteLineEdit"))
00882                     {
00883                         MythRemoteLineEdit *par =
00884                             (MythRemoteLineEdit *)m_parentEdit;
00885                         par->insert(comps[i][2]);
00886                     }
00887                     else
00888                     {
00889                         QKeyEvent *key = new QKeyEvent(QEvent::KeyPress, 0,
00890                                                        Qt::NoModifier,
00891                                                        comps[i][2], false,
00892                                                        comps[i][2].length());
00893                         QCoreApplication::postEvent(m_parentEdit, key);
00894                     }
00895 
00896                     break;
00897                 }
00898             }
00899             // Reset compTrap.
00900             m_comp1 = "";
00901             m_bCompTrap = false;
00902         }
00903     }
00904 }
00905 
00906 void UIKeyboardType::lockOnOff()
00907 {
00908     if (m_lockKey->IsOn())
00909     {
00910         if (!(m_altKey && m_altKey->IsOn()))
00911         {
00912             m_shiftLKey->SetOn(true);
00913             if (m_shiftRKey) m_shiftRKey->SetOn(true);
00914         }
00915     }
00916     else
00917     {
00918         m_shiftLKey->SetOn(false);
00919         if (m_shiftRKey) m_shiftRKey->SetOn(false);
00920         if (m_altKey) m_altKey->SetOn(false);
00921     }
00922     updateButtons();
00923 }
00924 
00925 void UIKeyboardType::shiftOff()
00926 {
00927     if (!m_lockKey->IsOn())
00928     {
00929         m_shiftLKey->SetOn(false);
00930         if (m_shiftRKey) m_shiftRKey->SetOn(false);
00931         if (m_altKey) m_altKey->SetOn(false);
00932     }
00933     updateButtons();
00934 }
00935 
00936 void UIKeyboardType::close(void)
00937 {
00938     if (!m_parentDialog)
00939         return;
00940 
00941     m_parentDialog->done(kDialogCodeAccepted);
00942 }
00943 
00944 void UIKeyboardType::updateButtons()
00945 {
00946     bool bShift = m_shiftLKey->IsOn();
00947     bool bAlt = (m_altKey ? m_altKey->IsOn() : false);
00948 
00949     KeyList::iterator it = m_keyList.begin();
00950     for (; it != m_keyList.end(); ++it)
00951         (*it)->SetShiftState(bShift, bAlt);
00952 }
00953 
00954 void UIKeyboardType::shiftLOnOff()
00955 {
00956     if (m_lockKey->IsOn())
00957     {
00958         m_shiftLKey->SetOn(false);
00959         if (m_shiftRKey) m_shiftRKey->SetOn(false);
00960         if (m_altKey) m_altKey->SetOn(false);
00961         m_lockKey->SetOn(false);
00962     }
00963     else if (m_shiftRKey) m_shiftRKey->SetOn(m_shiftLKey->IsOn());
00964 
00965     updateButtons();
00966 }
00967 
00968 void UIKeyboardType::shiftROnOff()
00969 {
00970     if (!m_shiftRKey) return;
00971 
00972     if (m_lockKey->IsOn())
00973     {
00974         m_shiftLKey->SetOn(false);
00975         m_shiftRKey->SetOn(false);
00976         if (m_altKey) m_altKey->SetOn(false);
00977         m_lockKey->SetOn(false);
00978     }
00979     else m_shiftLKey->SetOn(m_shiftRKey->IsOn());
00980 
00981     updateButtons();
00982 }
00983 
00984 void UIKeyboardType::keyPressEvent(QKeyEvent *e)
00985 {
00986     bool handled = false;
00987     QStringList actions;
00988     handled = GetMythMainWindow()->TranslateKeyPress("qt", e, actions, false);
00989 
00990     for (int i = 0; i < actions.size() && !handled; i++)
00991     {
00992         QString action = actions[i];
00993         handled = true;
00994 
00995         if (action == "UP")
00996         {
00997             moveUp();
00998         }
00999         else if (action == "DOWN")
01000         {
01001             moveDown();
01002         }
01003         else if (action == "LEFT")
01004         {
01005             moveLeft();
01006         }
01007         else if (action == "RIGHT")
01008         {
01009             moveRight();
01010         }
01011         else if (action == "SELECT")
01012             m_focusedKey->activate();
01013         else
01014             handled = false;
01015     }
01016 
01017     if (!handled)
01018     {
01019         QKeyEvent *key = new QKeyEvent(e->type(), e->key(), e->modifiers(),
01020                                        e->text(), e->isAutoRepeat(),
01021                                        e->count());
01022         QCoreApplication::postEvent(m_parentEdit, key);
01023         m_parentEdit->setFocus();
01024     }
01025 }
01026 
01027 void UIKeyboardType::moveUp()
01028 {
01029     if (!m_focusedKey)
01030     {
01031         m_focusedKey = m_doneKey;
01032         return;
01033     }
01034 
01035     UIKeyType *newKey = findKey(m_focusedKey->GetMove("Up"));
01036 
01037     if (newKey)
01038     {
01039         m_focusedKey->looseFocus();
01040         m_focusedKey = newKey;
01041         m_focusedKey->takeFocus();
01042     }
01043 }
01044 
01045 void UIKeyboardType::moveDown()
01046 {
01047     if (!m_focusedKey)
01048     {
01049         m_focusedKey = m_doneKey;
01050         return;
01051     }
01052 
01053     UIKeyType *newKey = findKey(m_focusedKey->GetMove("Down"));
01054 
01055     if (newKey)
01056     {
01057         m_focusedKey->looseFocus();
01058         m_focusedKey = newKey;
01059         m_focusedKey->takeFocus();
01060     }
01061 }
01062 
01063 void UIKeyboardType::moveLeft()
01064 {
01065     if (!m_focusedKey)
01066     {
01067         m_focusedKey = m_doneKey;
01068         return;
01069     }
01070 
01071     UIKeyType *newKey = findKey(m_focusedKey->GetMove("Left"));
01072 
01073     if (newKey)
01074     {
01075         m_focusedKey->looseFocus();
01076         m_focusedKey = newKey;
01077         m_focusedKey->takeFocus();
01078     }
01079 }
01080 
01081 void UIKeyboardType::moveRight()
01082 {
01083     if (!m_focusedKey)
01084     {
01085         m_focusedKey = m_doneKey;
01086         return;
01087     }
01088 
01089     UIKeyType *newKey = findKey(m_focusedKey->GetMove("Right"));
01090 
01091     if (newKey)
01092     {
01093         m_focusedKey->looseFocus();
01094         m_focusedKey = newKey;
01095         m_focusedKey->takeFocus();
01096     }
01097 }
01098 
01099 UIKeyType *UIKeyboardType::findKey(QString keyName)
01100 {
01101     KeyList::const_iterator it = m_keyList.begin();
01102     for (; it != m_keyList.end(); ++it)
01103     {
01104         if ((*it)->getName() == keyName)
01105             return (*it);
01106     }
01107     return NULL;
01108 }
01109 
01110 void UIKeyboardType::AddKey(UIKeyType *key)
01111 {
01112     m_keyList.append(key);
01113 
01114     if (key->GetType().toLower() == "done")
01115     {
01116         key->takeFocus();
01117         m_focusedKey = key;
01118     }
01119 }
01120 
01121 // vim:set sw=4 expandtab:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends