[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kde-workspace/kbpreview] kcontrol/keyboard: added geometry and tool tip feature
From:       shivam makkar <amourphious1992 () gmail ! com>
Date:       2013-02-03 18:46:51
Message-ID: 20130203184651.7E7E3A6091 () git ! kde ! org
[Download RAW message or body]

Git commit 5f1c270c357c814cae1553325af129291a914c13 by shivam makkar.
Committed on 03/02/2013 at 19:46.
Pushed by makkar into branch 'kbpreview'.

added geometry and tool tip feature

M  +2    -1    kcontrol/keyboard/CMakeLists.txt
A  +499  -0    kcontrol/keyboard/preview/kbgeometry.cpp     [License: UNKNOWN]  *
A  +56   -0    kcontrol/keyboard/preview/kbgeometry.h     [License: UNKNOWN]  *
M  +126  -274  kcontrol/keyboard/preview/kbpreviewframe.cpp
M  +21   -18   kcontrol/keyboard/preview/kbpreviewframe.h
M  +33   -15   kcontrol/keyboard/preview/keyboardpainter.cpp
M  +9    -5    kcontrol/keyboard/preview/keyboardpainter.h

The files marked with a * at the end have a non valid license. Please read: \
http://techbase.kde.org/Policies/Licensing_Policy and use the headers which are listed at that page.


http://commits.kde.org/kde-workspace/5f1c270c357c814cae1553325af129291a914c13

diff --git a/kcontrol/keyboard/CMakeLists.txt b/kcontrol/keyboard/CMakeLists.txt
index 973a39d..4ccbbca 100644
--- a/kcontrol/keyboard/CMakeLists.txt
+++ b/kcontrol/keyboard/CMakeLists.txt
@@ -116,10 +116,11 @@ set(kcm_keyboard_PART_SRCS
   preview/keyaliases.cpp
   preview/keyboardlayout.cpp
   preview/keyboardpainter.cpp
-  preview/keysymbols.cpp
+  preview/keys.cpp
   preview/keysymhelper.cpp
   preview/kbpreviewframe.cpp
   preview/keysym2ucs.cpp
+  preview/kbgeometry.cpp
 )
 
 
diff --git a/kcontrol/keyboard/preview/kbgeometry.cpp b/kcontrol/keyboard/preview/kbgeometry.cpp
new file mode 100644
index 0000000..8509985
--- /dev/null
+++ b/kcontrol/keyboard/preview/kbgeometry.cpp
@@ -0,0 +1,499 @@
+#include "kbgeometry.h"
+#include <QtGui>
+
+#include <QtGui/QX11Info>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/XKBlib.h>
+#include <X11/extensions/XKBrules.h>
+#include <fixx11h.h>
+#include <config-workspace.h>
+#include <KApplication>
+#include <KLocale>
+#include <QtCore/QFile>
+
+
+KbGeometry::KbGeometry()
+{
+    defSectionLeft=0;
+    defSectionTop=0;
+
+    pcModel="pc101 pc102 pc104 pc105";
+    pcgeometries = "latitude";
+    macbooks = "macbook78 macbook79";
+    applealu = "applealu_ansi applealu_iso applealu_jis";
+    macs = "macintosh macintosh_old ibook powerbook macbook78 macbook79";
+    dell = "dell101 dellm65";
+
+}
+int KbGeometry::setIntProp(QString a,QString b){
+    int val;
+    float f;
+    if(b.contains(a)){
+        QString dvl=b.mid(b.indexOf(a));
+        dvl=dvl.left(dvl.indexOf(";"));
+        dvl=dvl.mid(dvl.indexOf("=")+1);
+        val=dvl.toFloat();
+    }
+    else
+        val=0;
+    return val;
+}
+
+QString KbGeometry::setStrProp(QString a,QString b){
+    QString val;
+    if(b.contains(a)){
+        QString dvl=b.mid(b.indexOf(a));
+        dvl=dvl.left(dvl.indexOf(";"));
+        dvl=dvl.mid(dvl.indexOf("=")+1);
+        val=dvl;
+    }
+    else
+        val="";
+    return val;
+}
+
+void KbGeometry::extractShape(QString desc){
+    desc.remove(" ");
+    desc.remove("\t");
+    desc.remove("\n");
+    QList<QString>shapes;
+    shapes=desc.split("shape\"");
+    for(int i=1;i<shapes.size();i++){
+        Shape temp;
+        QString sh=shapes.at(i);
+        QString th=shapes.at(i);
+        QMessageBox q;
+
+        int idx=sh.indexOf("\"",1);
+        QString shname=sh.left(idx);
+        temp.name=shname;
+        idx=sh.indexOf("[");
+        sh=sh.mid(idx+1);
+
+
+        idx=sh.indexOf("]");
+        sh=sh.left(idx);
+
+        QList<QString>sz=sh.split(",");
+        temp.sizex=sz.at(0).toFloat();
+        temp.sizey=sz.at(1).toFloat();
+        if(temp.sizex==0||temp.sizey==0){
+
+            idx=th.indexOf("[");
+            int tdx=th.indexOf("[",idx+1);
+            th=th.mid(tdx+1);
+            idx=th.indexOf("]");
+            th=th.left(idx);
+            QList<QString>sd=th.split(",");
+            temp.sizex=sd.at(0).toInt();
+            temp.sizey=sd.at(1).toInt();
+        }
+        shapeList<<temp;
+        sz.clear();
+        QString f;
+        sh=temp.name;
+        sh.append(" : ");
+        sh.append(f.setNum(temp.sizex));
+        sh.append(" : ");
+        sh.append(f.setNum(temp.sizey));
+        //q.setText(sh);
+        //q.exec();
+    }
+}
+
+void KbGeometry::setDefaultValues(QString desc){
+    desc.remove(" ");
+    desc.remove("\t");
+    QString g,l;
+    defSectionLeft=setIntProp("section.left=",desc);
+    l.setNum(defSectionLeft);
+    g.append(l);
+    g.append(" : ");
+    defSectionTop=setIntProp("section.top=",desc);
+    l.setNum(defSectionTop);
+    g.append(l);
+    g.append(" : ");
+
+    defShape=setStrProp("key.shape=",desc);
+
+    g.append(defShape);
+    g.append(" : ");
+
+    kbWidth=setIntProp("width=",desc);
+    l.setNum(kbWidth);
+    g.append(l);
+    g.append(" : ");
+    kbHieght=setIntProp("height=",desc);
+    l.setNum(kbHieght);
+    g.append(l);
+    g.append(" : ");
+    keygap=setIntProp("key.gap=",desc);
+    l.setNum(keygap);
+    g.append(l);
+    g.append(" : ");
+    //QMessageBox a;
+    //a.setText(g);
+    //a.exec();
+}
+
+void KbGeometry::extractSections(QString desc){
+    QMessageBox q;
+    desc.append("\n");
+    QString sec=desc;
+    QString ma;
+    while(sec.contains("//")){
+        int k=sec.indexOf("//");
+        QString first=sec.left(k);
+        ma.append(first);
+        //q.setText(ma);
+        //q.exec();
+        int l=sec.indexOf("\n",k+1);
+        sec=sec.mid(l);
+        //q.setText(sec);
+        //q.exec();
+        //q.setText(first.setNum(k));
+        //q.exec();
+
+    }
+    ma.append(sec);
+    desc=ma;
+    desc.remove(" ");
+    desc.remove("\t");
+    QString dm,m;
+    QList<QString>seclist=desc.split("section\"");
+    setDefaultValues(seclist.at(0));
+    extractShape(desc);
+    for(int i=1;i<seclist.size();i++){
+        Section temp;
+        QList<QString>rlst=seclist.at(i).split("row{");
+        QString inp=rlst.at(0);
+        int top=setIntProp("top=",inp);
+        temp.ycordi=top+defSectionTop;
+        dm.setNum(temp.ycordi);
+        dm.append("=");
+        m.setNum(top);
+        dm.append(m);
+        dm.append("+");
+        m.setNum(defSectionTop);
+        dm.append(m);
+        dm.append("\n");
+        temp.secShape=setStrProp("key.shape=",inp);
+        if(temp.secShape=="")
+            temp.secShape=defShape;
+        temp.gap=setIntProp("key.gap=",inp);
+        if(temp.gap==0)
+            temp.gap=keygap;
+        int left=setIntProp("left=",inp);
+        temp.xcordi=left+defSectionLeft;
+        m.setNum(temp.xcordi);
+        dm.append(m);
+        dm.append("=");
+        m.setNum(left);
+        dm.append(m);
+        dm.append("+");
+        m.setNum(defSectionLeft);
+        dm.append(m);
+        dm.append("\n");
+        for(int j=1;j<rlst.size();j++){
+            temp.rowlist<<rlst.at(j);
+            dm.append(rlst.at(j));
+            dm.append("\n");
+        }
+        sections<<temp;
+        //q.setText(dm);
+        //q.exec();
+    }
+}
+
+QStringList KbGeometry :: splitKeys(QString desc){
+    desc.remove(" ");
+    desc.remove("\t");
+    desc.remove("\n");
+    QList <QString> lst=desc.split(",");
+    QList <QString> klst;
+    while(!lst.empty()){
+        QString temp=lst.first();
+        if(temp=="};")
+            break;
+        lst.pop_front();
+        if(temp.contains("{")){
+            temp.remove("{");
+            while(!lst.at(0).contains("}")){
+                temp.append(";");
+                temp.append(lst.first());
+                lst.pop_front();
+            }
+            temp.append(";");
+            temp.append(lst.first());
+            lst.pop_front();
+            if(temp.contains("};"))
+                temp=temp.left(temp.indexOf("};"));
+            temp.remove("}");
+        }
+        else{
+            if(temp.contains("};"))
+                temp=temp.left(temp.indexOf("};"));
+        }
+        klst << temp;
+
+
+    }
+    return klst;
+}
+
+void KbGeometry::extractRows(QString des){
+    extractSections(des);
+    for(int j=0;j<sections.size();j++){
+        Section current=sections.at(j);
+        for(int k=0;k<current.rowlist.size();k++){
+
+            QString desc=current.rowlist.at(k);
+            desc=desc.left(desc.indexOf("};"));
+            desc.remove(" ");
+            desc.remove("\t");
+            Row temp;
+            temp.cx=setIntProp("left=",desc)+current.xcordi;
+            temp.cy=setIntProp("top=",desc)+current.ycordi;
+            QString tshape=setStrProp("key.shape=",desc);
+            if (tshape==""){
+                tshape=current.secShape.remove("\"");
+            }
+            temp.shapeRow=tshape.remove("\"");
+            desc=desc.mid(desc.indexOf("keys{")+5);
+            temp.gap=setIntProp("key.gap=",desc);
+            if(temp.gap==0)
+                temp.gap=current.gap;
+            QMessageBox q;
+            //QString tst;
+            //tst.setNum(setIntProp("left=",desc));
+            //q.setText(tst);
+            //q.exec();
+            temp.keylist=splitKeys(desc);
+            rows<<temp;
+
+       }
+
+    }
+    QMessageBox q;
+    for(int i=0;i<rows.size();i++){
+        QString a,b;
+        a.append(rows.at(i).shapeRow);
+        a.append(" : ");
+        a.append(b.setNum(rows.at(i).cx));
+        a.append(" : ");
+        a.append(b.setNum(rows.at(i).cy));
+        for(int n=0;n<rows.at(i).keylist.size();n++){
+            a.append("\n");
+            a.append(rows.at(i).keylist.at(n));
+        }
+      //q.setText(a);
+       //q.exec();
+    }
+}
+
+Shape KbGeometry :: getShape(QString shape){
+    for(int i=0;i<shapeList.size();i++){
+        Shape tmp=shapeList.at(i);
+        if(tmp.name==shape)
+            return tmp;
+    }
+    Shape k=getShape("NORM");
+    return k;
+}
+
+void KbGeometry :: extractKeys(QString model){
+
+    QString desc=getGeometryDescription(getGeometryfromModel(model));
+    extractRows(desc);
+    for(int i=0;i<rows.size();i++){
+        int totksz=0;
+        int gap=rows.at(i).gap;
+        for(int j=0;j<rows.at(i).keylist.size();j++){
+            KeyGm temp;
+            int addx=0;
+            QString dummy=rows.at(i).keylist.at(j);
+            QMessageBox g;
+            //g.setText(dummy);
+            //g.exec();
+            dummy.remove(" ");
+            int check=0;
+            if(dummy.contains(";")){
+                QList <QString>dummylst=dummy.split(";");
+                int z=0;
+                for(int k=0;k<dummylst.size();k++){
+                    QString d=dummylst.at(k);
+                    if(d.startsWith("<")){
+                        d.remove("<");
+                        d.remove(">");
+                        temp.name=d;
+                    }
+                    if(d.startsWith("\"")){
+                        d.remove("\"");
+                        check=1;
+                        //g.setText(d);
+                        //g.exec();
+                        temp.shape=getShape(d);
+                    }
+                    if(d.startsWith("shape=")){
+                        d=setStrProp("shape=",d);
+                        d.remove("\"");
+                        temp.shape=getShape(d);
+                        check=1;
+                    }
+                    bool ok;
+                    if(z==0){
+                        addx=d.toInt(&ok,10);
+                        if(ok)
+                            z=1;
+                    }
+                }
+            }
+            else{
+                dummy.remove("<");
+                dummy.remove(">");
+                temp.name=dummy;
+                //g.setText(rows.at(i).shapeRow);
+                //g.exec();
+
+            }
+            if(check==0)
+                temp.shape=getShape(rows.at(i).shapeRow);
+            if(temp.shape.name=="")
+                temp.shape=getShape("NORM");
+            temp.cordx=rows.at(i).cx+totksz+addx+gap;
+            totksz+=temp.shape.sizex+addx+gap;
+            temp.cordy=rows.at(i).cy;
+            keys<<temp;
+        }
+    }
+    //QMessageBox q;
+    QString a,b;
+    int ptop=0;
+    for(int i=0;i<keys.size();i++){
+
+        KeyGm s=keys.at(i);
+        if(ptop!=s.cordy){
+            ptop=s.cordy;
+            a.append("\n");
+        }
+        a.append(s.name);
+        a.append(" : ");
+        a.append(b.setNum(s.cordx));
+        a.append(" : ");
+        a.append(b.setNum(s.cordy));
+        a.append(" : ");
+        a.append(s.shape.name);
+        a.append("  ");
+
+
+    }
+    QMessageBox q;
+    //q.setText(a);
+    //q.exec();
+}
+
+QString KbGeometry::makeGeometryStr(QString file,QString model){
+    QString geometry;
+    geometry.append(file);
+    geometry.append("/");
+    geometry.append(model);
+    return geometry;
+}
+
+QString KbGeometry::getGeometryfromModel(QString model){
+
+    QString geometry;
+
+    if(pcModel.contains(model))
+        return geometry=makeGeometryStr("pc",model);
+
+    if(pcgeometries.contains(model))
+        return geometry=makeGeometryStr("pc",model);
+
+    if(model=="apple")
+        return geometry=makeGeometryStr("macintosh","macintosh");
+    if(macbooks.contains(model)||macs.contains(model))
+        return geometry=makeGeometryStr("macintosh","macintosh");
+
+    if(applealu.contains(model))
+        return geometry=makeGeometryStr("macintosh",model);
+
+    if(dell.contains(model))
+        return geometry=makeGeometryStr("dell",model);
+
+    if(model=="hpmini110")
+        return geometry=makeGeometryStr("hp","mini110");
+
+    if(model=="hpdv5")
+        return geometry=makeGeometryStr("hp","dv5");
+
+    if(model=="pc98")
+        return geometry=makeGeometryStr("nec",model);
+
+    QMessageBox q;
+    q.setText(i18n("Showing in Default Geometry"));
+    q.exec();
+
+    return geometry="pc/pc104";
+
+}
+
+
+QString KbGeometry::getGeometryDescription(QString geometry){
+
+    QStringList temp=geometry.split("/");
+    QString description;
+    QString filename=findGeometryBasedir();
+    filename.append(temp.at(0));
+
+    QFile file(filename);
+    file.open(QIODevice::ReadOnly | QIODevice::Text);
+    QString content = file.readAll();
+    file.close();
+
+    QString geometryName=temp.at(1);
+    temp=content.split("xkb_geometry");
+    for(int i=1;i<temp.size();i++){
+        QString tempstr=temp.at(i);
+        int k=tempstr.indexOf("\"");
+        tempstr=tempstr.mid(k);
+        k=tempstr.indexOf("{");
+        tempstr=tempstr.left(k);
+        tempstr.remove(" ");
+        tempstr.remove("\"");
+        if(tempstr==geometryName){
+            description=temp.at(i);
+            break;
+        }
+    }
+    return description;
+}
+
+QString KbGeometry::findGeometryBasedir()
+{
+    QString symBasedir;
+    QString xkbParentDir;
+
+    QString base(XLIBDIR);
+    if( base.count('/') >= 3 ) {
+        // .../usr/lib/X11 -> /usr/share/X11/xkb vs .../usr/X11/lib -> /usr/X11/share/X11/xkb
+        QString delta = base.endsWith("X11") ? "/../../share/X11" : "/../share/X11";
+        QDir baseDir(base + delta);
+        if( baseDir.exists() ) {
+            xkbParentDir = baseDir.absolutePath();
+        }
+        else {
+            QDir baseDir(base + "/X11");	// .../usr/X11/lib/X11/xkb (old XFree)
+            if( baseDir.exists() ) {
+                xkbParentDir = baseDir.absolutePath();
+            }
+        }
+    }
+
+    if( xkbParentDir.isEmpty() ) {
+        xkbParentDir = "/usr/share/X11";
+    }
+    symBasedir=QString("%1/xkb/geometry/").arg(xkbParentDir);
+    return(symBasedir);
+}
diff --git a/kcontrol/keyboard/preview/kbgeometry.h b/kcontrol/keyboard/preview/kbgeometry.h
new file mode 100644
index 0000000..f53761d
--- /dev/null
+++ b/kcontrol/keyboard/preview/kbgeometry.h
@@ -0,0 +1,56 @@
+#ifndef KBGEOMETRY_H
+#define KBGEOMETRY_H
+#include<QtCore>
+
+struct Shape{
+    QString name;
+    int sizex,sizey;
+};
+
+struct KeyGm {
+    QString name;
+    int cordx,cordy;
+    Shape shape;
+};
+
+struct Row{
+    int cx,cy,gap;
+    QString shapeRow;
+    QList<QString> keylist;
+};
+
+struct Section{
+    int xcordi,ycordi;
+    QList<QString> rowlist;
+    int gap;
+    QString secShape;
+};
+
+class KbGeometry
+{
+    QList <Shape> shapeList;
+    QList <Section> sections;
+    QList <Row> rows;
+    QString defShape;
+    int defSectionLeft,defSectionTop;
+    int setIntProp(QString a, QString b);
+    QString setStrProp(QString a,QString b);
+    Shape getShape(QString shape);
+    QString pcModel,pcgeometries,macbooks,applealu,macs,dell;
+    void extractShape(QString desc);
+    void setDefaultValues(QString desc);
+    void extractSections(QString desc);
+    void extractRows(QString desc);
+    QString makeGeometryStr(QString file,QString model);
+    QString getGeometryfromModel(QString model);
+    QString getGeometryDescription(QString geometry);
+    QString findGeometryBasedir();
+public:
+    QList <KeyGm> keys;
+    KbGeometry();
+    int kbWidth,kbHieght,keygap;
+    void extractKeys(QString desc);
+    QStringList splitKeys(QString desc);
+};
+
+#endif // KBGEOMETRY_H
diff --git a/kcontrol/keyboard/preview/kbpreviewframe.cpp b/kcontrol/keyboard/preview/kbpreviewframe.cpp
index 8ecc4f2..20e9363 100644
--- a/kcontrol/keyboard/preview/kbpreviewframe.cpp
+++ b/kcontrol/keyboard/preview/kbpreviewframe.cpp
@@ -21,331 +21,183 @@
 
 #include <QtCore/QFile>
 #include <QtGui/QFont>
+#include <QHelpEvent>
+#include <QToolTip>
 
 #include <KApplication>
 #include <KLocale>
 
 
-static const QColor keyBorderColor("#d4d4d4");
+static const QColor keyBorderColor("#E6E6E6");
 static const QColor lev12color("#d4d4d4");
 static const QColor lev34color("#FF3300");
-static const int sz=20, kszx=70, kszy=70;
-
-static const int xOffset[] = {15, 15, 40, 40 };
-static const int yOffset[] = {10, 40, 10, 40 };
 static const QColor color[] = { lev12color, lev12color, lev34color, lev34color };
 
 
-// TODO: parse geometry files and display keyboard according to current keyboard model
+
 
 KbPreviewFrame::KbPreviewFrame(QWidget *parent) :
     QFrame(parent)
 {
      setFrameStyle( QFrame::Box );
      setFrameShadow(QFrame::Sunken);
+     setMouseTracking(true);
 }
 
-void KbPreviewFrame::paintTLDE(QPainter &painter,int &x,int &y)
-{
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, kszx, kszy);
-
-    const QList <QString> symbols = keyboardLayout.TLDE.symbols;
-
-    for(int level=0; level<symbols.size(); level++) {
-    	painter.setPen(color[level]);
-    	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
                symbol.getKeySymbol(symbols.at(level)));
-    }
-
-}
+int KbPreviewFrame::keyAt(QPoint pos){
+    const int tooltip_range = 10;
+    for(int i=0;i<toolTipList.size();i++){
+        ToolTipText temp=toolTipList.at(i);
+        if(temp.ttPoint.x()<=pos.x()&&temp.ttPoint.x()+tooltip_range>=pos.x()&&temp.ttPoint.y()<=pos.y()&&temp.ttPoint.y()+tooltip_range>=pos.y()){
  
-void KbPreviewFrame::paintAERow(QPainter &painter,int &x,int &y)
-{
-    paintTLDE(painter, x, y);
-
-    const int noAEk=12;
-    for(int i=0; i<noAEk; i++){
-        x+=kszx;
-
-        painter.setPen(keyBorderColor);
-        painter.drawRect(x, y, kszx, kszy);
-
-        QList<QString> symbols = keyboardLayout.AE[i].symbols;
-
-        for(int level=0; level<symbols.size(); level++) {
-        	painter.setPen(color[level]);
-        	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
symbol.getKeySymbol(symbols.at(level))); +            return i;
         }
     }
-
-    x += kszx;
-
-    const int bkspszx=100,bk1x=10;//,bk1y=20,
-    const int bk2y=60;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,bkspszx,kszy);
-
-    painter.setPen(lev12color);
-//    painter.drawText(x+bk1x, y+bk1y,i18n("<--"));
-    painter.drawText(x+bk1x, y+bk2y,i18n("Backspace"));
+    return -1;
 }
 
-void KbPreviewFrame::paintADRow(QPainter &painter,int &x,int&y)
-{
-    const int noADk=12;
-    const int tabszx=100;
-    const int tab3y=45;
+bool KbPreviewFrame::event(QEvent *event){
+    if (event->type() == QEvent::ToolTip) {
+         QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
+         int index = keyAt(helpEvent->pos());
+         if (index != -1) {
+             QToolTip::showText(helpEvent->globalPos(), toolTipList[index].ttString);
+         } else {
+             QToolTip::hideText();
+             event->ignore();
+         }
+
+         return true;
+     }
+     return QWidget::event(event);
+}
 
+void KbPreviewFrame::paintEvent(QPaintEvent *){
+    //getkeyboardlayout("ua","Ukrainian");
+    //setWindowTitle(kblayout.Layoutname);
+    QPainter painter(this);
+    QFont kbfont("Ubuntu",9);
+    //alias.getAlias("qwerty","AD01");
+    painter.setFont(kbfont);
+    painter.setBrush(QBrush(Qt::darkGray));
+    //painter.setPen(Qt::black);
+    //painter.drawText(450,10,kblayout.Layoutname);
+    painter.drawRect(0,0,2*geometry.kbWidth+10,2*geometry.kbHieght);
     painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, tabszx,kszy);
-
-    painter.setPen(lev12color);
-//    painter.drawText(x+tab1x, y+tab1y,i18n("<--"));
-    painter.drawText(x+xOffset[0], y+tab3y, i18nc("Tab key", "Tab"));
-//    painter.drawText(x+tab2x, y+tab2y,i18n("-->"));
-    x+=tabszx;
-
-
-    for(int i=0; i<noADk; i++){
-        QList<QString> symbols = keyboardLayout.AD[i].symbols;
-
+    painter.setBrush(QBrush(Qt::black,Qt::SolidPattern));
+    setScaleFactor(geometry.kbWidth,geometry.kbHieght);
+    for(int i=0;i<geometry.keys.size();i++){
+        KeyGm dummy = geometry.keys.at(i);
         painter.setPen(keyBorderColor);
-        painter.drawRect(x, y,kszx,kszy);
-
-        for(int level=0; level<symbols.size(); level++) {
-        	painter.setPen(color[level]);
-        	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
                symbol.getKeySymbol(symbols.at(level)));
-        }
-
-        x+=kszx;
-    }
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,kszx,kszy);
-
-    QList<QString> symbols = keyboardLayout.BKSL.symbols;
-
-    for(int level=0; level<symbols.size(); level++) {
-    	painter.setPen(color[level]);
-    	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
symbol.getKeySymbol(symbols.at(level))); +        \
painter.drawRect(scalex*dummy.cordx,scaley*dummy.cordy,scalex*dummy.shape.sizex,scaley*dummy.shape.sizey);
 +        writeKeySym(painter,dummy);
     }
 }
 
-void KbPreviewFrame::paintACRow(QPainter &painter,int &x,int &y)
-{
-    const int sz = 20, kszx = 70, kszy = 70, capszx = 100;
-    const int noACk = 11;
-    const int lvl2x = 40, shifx = 10, shify = 60, retsz = 140;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,capszx,kszy);
-
-    painter.setPen(lev12color);
-//    painter.drawText(x+shifx, y+sz,i18n("^"));
-    painter.drawText(x+shifx, y+shify,i18n("Caps Lock"));
-    x+=capszx;
-
-    for(int i=0; i<noACk; i++){
-        painter.setPen(keyBorderColor);
-        painter.drawRect(x, y,kszx,kszy);
-
-        QList<QString> symbols = keyboardLayout.AC[i].symbols;
-
-        for(int level=0; level<symbols.size(); level++) {
-        	painter.setPen(color[level]);
-        	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
                symbol.getKeySymbol(symbols.at(level)));
-        }
-
-        x+=kszx;
+void KbPreviewFrame :: plotSym(QPainter &painter, KeyGm key, QString sym){
+    const int x= key.cordx,y= key.cordy;
+    int symx = key.shape.sizex/3-sym.length(),symy=key.shape.sizey/2+3;
+    if(key.shape.sizex==0){
+        symx=6-sym.length();
     }
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,retsz,kszy);
-
+    if(key.shape.sizey==0)
+        symy=12;
     painter.setPen(lev12color);
-//    painter.drawText(x+ret1x, y+ret1y,i18n("|"));
-//    painter.drawText(x+ret2x, y+ret2y,i18n("<--"));
-    painter.drawText(x+shify,y+lvl2x,i18n("Enter"));
+    QFont kbfont;
+    kbfont.setPointSize(7);
+    painter.setFont(kbfont);
+    painter.drawText(scalex*(x+symx),scaley*(y+symy),sym);
+    kbfont.setPointSize(9);
+    painter.setFont(kbfont);
 }
 
-void KbPreviewFrame::paintABRow(QPainter &painter,int &x,int &y)
-{
-    const int noABk=10;
-    for(int i=0; i<noABk; i++) {
-        painter.setPen(keyBorderColor);
-        painter.drawRect(x, y,kszx,kszy);
-
-        QList<QString> symbols = keyboardLayout.AB[i].symbols;
-
-        for(int level=0; level<symbols.size(); level++) {
-        	painter.setPen(color[level]);
-        	painter.drawText(x+xOffset[level], y+yOffset[level], sz, sz, Qt::AlignTop, \
                symbol.getKeySymbol(symbols.at(level)));
-        }
-
-        x+=kszx;
+void KbPreviewFrame :: plotSym(QPainter &painter,KeyGm key,Keys sym){
+    const int x=key.cordx,y=key.cordy;
+    const int lvl1x = key.shape.sizex/5+1,lvl1y=key.shape.sizey/2+5;
+    const int lvl2x =key.shape.sizex/5+1,lvl2y=key.shape.sizey/5+5;
+    const int lvl3x=key.shape.sizex/2+1,lvl3y=key.shape.sizey/2+5;
+    const int lvl4x=key.shape.sizex/2+1,lvl4y=key.shape.sizey/5+5;
+    const int levelx_Pos[] = { lvl1x , lvl2x , lvl3x , lvl4x };
+    const int levely_Pos[] = { lvl1y , lvl2y , lvl3y ,lvl4y };
+
+    QPoint tp;
+    tp.setX(scalex*x);
+    tp.setY(scaley*y);
+    QString ts=sym.keyVal;
+    ToolTipText temp;
+    temp.ttPoint=tp;
+    temp.ttString=ts;
+    toolTipList<<temp;
+    for(int level = 0; level < sym.klst.size(); level++){
+        painter.setPen(color[level]);
+        painter.drawText(scalex*(x+levelx_Pos[level]),scaley*(y+levely_Pos[level]),symbol.getKeySymbol(sym.klst.at(level)));
  }
 }
 
-void KbPreviewFrame::paintBottomRow(QPainter &painter,int &x,int &y)
-{
-    const int txtx=30, txty=35, ctrlsz=100, altsz=100, spsz=400, kszy=70;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, ctrlsz, kszy);
-    painter.setPen(lev12color);
-    painter.drawText(x+txtx, y+txty,i18n("Ctrl"));
-
-    x+=ctrlsz;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, altsz, kszy);
-    painter.setPen(lev12color);
-    painter.drawText(x+txtx, y+txty,i18n("Alt"));
-
-    x+=altsz;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, spsz, kszy);
-
-    x+=spsz;
-
-    painter.drawRect(x, y, altsz, kszy);
-
-    painter.setPen(lev34color);
-    painter.drawText(x+txtx, y+txty,i18n("AltGr"));
-
-    x+=ctrlsz;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, ctrlsz, kszy);
-
-    painter.setPen(lev12color);
-    painter.drawText(x+txtx, y+txty, i18n("Ctrl"));
-}
-
-void KbPreviewFrame::paintFnKeys(QPainter &painter,int &x,int &y)
-{
-    const int escsz=50, escx=20, escy=55;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y, escsz, escsz);
-
-    painter.setPen(lev12color);
-    painter.drawText(escx, escy, i18n("Esc"));
-
-    const int spacex=50;
-    x+=spacex;
-
-    const int fnkeyspace=60, fnkeysizex=50, fnkeysizey=50, fkc=15, fky=30, fnkig=4, fng=3;
-    int f=1;
+void KbPreviewFrame :: writeKeySym(QPainter &painter, KeyGm key){
+
+    int plotted=0;
+
+    const QString key_group[] = { "AE" , "AD" , "AC" , "AB" , "TLDE" , "BKSL" };
+
+    for(int group_no = 0 ; group_no < 6 ; group_no++){
+        if(key.name.startsWith(key_group[group_no])){
+            QString ind=key.name.right(2);
+            int index=ind.toInt();
+            Keys sym;
+            if (group_no == 0)
+                sym=kblayout.AE[index-1];
+            if (group_no == 1)
+                sym=kblayout.AD[index-1];
+            if (group_no == 2)
+                sym=kblayout.AC[index-1];
+            if (group_no == 3)
+                sym=kblayout.AB[index-1];
+            if (group_no == 4)
+                sym=kblayout.TLDE;
+            if (group_no == 5)
+                sym=kblayout.BKSL;
+            plotSym(painter,key,sym);
+            plotted=1;
 
-    for(int i=0;i<fng;i++){
-        x+=spacex;
-
-        for(int j=0;j<fnkig;j++){
-            x += fnkeyspace;
-            painter.setPen(keyBorderColor);
-            painter.drawRect(x, y, fnkeysizex, fnkeysizey);
-
-            painter.setPen(lev12color);
-            painter.drawText(x+fkc, y+fky, i18nc("Function key", "F%1", f));
-            f++;
         }
     }
+    if(plotted==0){
+        QString sym=key.name;
+        plotSym(painter,key,sym);
+    }
 }
 
-void KbPreviewFrame::paintEvent(QPaintEvent *)
-{
-    QPainter painter(this);
-
-    QFont kbfont;
-    kbfont.setPointSize(12);
-
-    painter.setFont(kbfont);
-    painter.setBrush(QBrush(Qt::darkGray));
-
-    const int strtx=0,strty=0,endx=1390,endy=490,kszy=70;
-    const int row1x=10,row1y=30,row2x=10,row2y=90,row5x=10,row5y=330,row3x=10,row3y=170,shifx=10,shify=60,row4x=10,row4y=250,row6x=110,row6y=410;
                
-    const int shiftsz=155;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(strtx, strty, endx, endy);
-
-    painter.setPen(lev12color);
-    painter.setBrush(QBrush(Qt::black));
-
-    int x, y;
-    x=row1x;
-    y=row1y;
-
-    paintFnKeys(painter,x, y);
-
-    x=row2x;
-    y=row2y;
-
-    paintAERow(painter,x, y);
-
-    x=row3x;
-    y=row3y;
-
-    paintADRow(painter,x, y);
-
-    x=row4x;
-    y=row4y;
-
-    paintACRow(painter,x, y);
-
-    x=row5x;
-    y=row5y;
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,shiftsz,kszy);
-    painter.setPen(lev12color);
-    painter.drawText(x+shifx, y+shify,i18n("Shift"));
-    x+=shiftsz;
-
-    paintABRow(painter,x, y);
-
-    painter.setPen(keyBorderColor);
-    painter.drawRect(x, y,shiftsz,kszy);
-    painter.setPen(lev12color);
-    painter.drawText(x+shifx, y+shify,i18n("Shift"));
-
-    x=row6x;
-    y=row6y;
-
-    paintBottomRow(painter,x, y);
-
-    if( symbol.isFailed() ) {
-        painter.setPen(keyBorderColor);
-        painter.drawRect(strtx, strty, endx, endy);
-
-        const int midx=470, midy=240;
-        painter.setPen(lev12color);
-        painter.drawText(midx, midy, i18n("No preview found"));
-    }
 
+void KbPreviewFrame :: setScaleFactor(int width,int height){
+    scalex=1030/width;
+    scaley=490/height;
+    scalex=2;
+    scaley=2;
 }
 
 
-void KbPreviewFrame::generateKeyboardLayout(const QString& layout, const QString& layoutVariant)
+void KbPreviewFrame::generateKeyboardLayout(const QString& country, const QString& layoutvariant,const \
QString& model)  {
-    QString filename = keyboardLayout.findSymbolBaseDir();
-    filename.append(layout);
+    QString filename=kblayout.findSymbolbasedir();
+    filename.append(country);
 
     QFile file(filename);
     file.open(QIODevice::ReadOnly | QIODevice::Text);
     QString content = file.readAll();
     file.close();
 
-    QList<QString> symstr = content.split("xkb_symbols ");
+    QList<QString> symstr;
+    symstr=content.split("xkb_symbols ");
 
-    if( layoutVariant.isEmpty() ) {
-        keyboardLayout.generateLayout(symstr.at(1), layout);
-    }
-    else {
-        for(int i=1;i<symstr.size();i++) {
+    geometry.extractKeys(model);
+
+    if(layoutvariant=="")
+        kblayout.generateLayout(symstr.at(1),country);
+
+    else
+    {
+        for(int i=1;i<symstr.size();i++){
             QString h=symstr.at(i);
             int k=h.indexOf("\"");
             h=h.mid(k);
@@ -353,12 +205,12 @@ void KbPreviewFrame::generateKeyboardLayout(const QString& layout, const QString
             h=h.left(k);
             h=h.remove(" ");
             QString f="\"";
-            f.append(layoutVariant);
+            f.append(layoutvariant);
             f.append("\"");
             f=f.remove(" ");
 
             if(h==f){
-                keyboardLayout.generateLayout(symstr.at(i), layout);
+                kblayout.generateLayout(symstr.at(i),country);
                 break;
             }
         }
diff --git a/kcontrol/keyboard/preview/kbpreviewframe.h b/kcontrol/keyboard/preview/kbpreviewframe.h
index 23c8704..79913d3 100644
--- a/kcontrol/keyboard/preview/kbpreviewframe.h
+++ b/kcontrol/keyboard/preview/kbpreviewframe.h
@@ -21,35 +21,38 @@
 #include "keyboardlayout.h"
 #include "keysymhelper.h"
 #include "keyaliases.h"
-
-#include <QtGui/QPainter>
+#include "kbgeometry.h"
+#include <QPainter>
 #include <QtGui/QFrame>
 
+struct ToolTipText{
+	QPoint ttPoint;
+	QString ttString;
+};
+
 class KbPreviewFrame : public QFrame
 {
     Q_OBJECT
-    
 private:
-	void paintTLDE(QPainter &painter, int &x, int &y);
-	void paintAERow(QPainter &painter, int &x, int &y);
-	void paintADRow(QPainter &painter, int &x, int &y);
-	void paintACRow(QPainter &painter, int &x, int &y);
-	void paintABRow(QPainter &painter, int &x, int &y);
-	void paintBottomRow(QPainter &painter, int &x, int &y);
-	void paintFnKeys(QPainter &painter, int &x, int &y);
-
+	int scalex,scaley;
+    void setScaleFactor(int width,int hieght);
+    void writeKeySym(QPainter &painter,KeyGm key);
+    void plotSym(QPainter &painter,KeyGm key,Keys sym);
+    void plotSym(QPainter &painter,KeyGm key,QString sym);
+    void getkeyboardlayout(QString country, QString layoutvariant);
 	KeySymHelper symbol;
 	Aliases alias;
-    KeyboardLayout keyboardLayout;
-	
 public:
+	QList<ToolTipText> toolTipList;
     explicit KbPreviewFrame(QWidget *parent = 0);
+    void paintEvent(QPaintEvent *);
+    bool event(QEvent *event);
+    int keyAt(QPoint pos);
+    KbGeometry geometry;
+    KeyboardLayout kblayout;
+    void generateKeyboardLayout(const QString &country, const QString &layoutvariant, const QString \
&model);  
-    void paintEvent(QPaintEvent * event);
-    void generateKeyboardLayout(const QString &country, const QString &layoutVariant);
-    QString getLayoutName() const {
-    	return keyboardLayout.getLayoutName();
-    }
+    
 };
 
 #endif // KBPREVIEWFRAME_H 
diff --git a/kcontrol/keyboard/preview/keyboardpainter.cpp \
b/kcontrol/keyboard/preview/keyboardpainter.cpp index b9fbf24..e03226e 100644
--- a/kcontrol/keyboard/preview/keyboardpainter.cpp
+++ b/kcontrol/keyboard/preview/keyboardpainter.cpp
@@ -17,37 +17,55 @@
  */
 
 #include "keyboardpainter.h"
+#include "ui_KeyboardPainter.h"
 
 #include <QtGui/QHBoxLayout>
 #include <QtGui/QVBoxLayout>
-#include <QtGui/QPushButton>
+#include <QToolTip>
+#include <QHelpEvent>
 
-#include <KLocale>
-
-
-KeyboardPainter::KeyboardPainter():
+KeyboardPainter::KeyboardPainter() :
+    previewDialog(new QDialog(this)),
     kbframe(new KbPreviewFrame(this)),
-    exitButton(new QPushButton(i18n("Close"),this))
+    exitButton(new QPushButton(tr("Close"),this))
 {
+    previewDialog->setFixedSize(1030,520);
     kbframe->setFixedSize( 1030, 490 );
-    exitButton->setFixedSize(120, 30);
-
-    QVBoxLayout* vLayout = new QVBoxLayout( this );
+    exitButton->setFixedSize(120,30);
+    connect(exitButton,SIGNAL(clicked()),this,SLOT(close()));
+    QVBoxLayout*const vLayout = new QVBoxLayout( this );
     vLayout->addWidget(kbframe);
     vLayout->addWidget(exitButton);
-
-    connect(exitButton, SIGNAL(clicked()), this, SLOT(close()));
-
-    setWindowTitle(kbframe->getLayoutName());
+    setWindowTitle(kbframe->kblayout.getLayoutName());
+    setMouseTracking(true);
 }
 
-void KeyboardPainter::generateKeyboardLayout(const QString& layout, const QString& variant)
+void KeyboardPainter::generateKeyboardLayout(QString country, QString variant,QString model)
 {
-    kbframe->generateKeyboardLayout(layout, variant);
+    kbframe->generateKeyboardLayout(country,variant,model);
+    previewDialog->setFixedSize((2*kbframe->geometry.kbWidth+20),(2*kbframe->geometry.kbHieght+50));
+    kbframe->setFixedSize((2*kbframe->geometry.kbWidth+20),(2*kbframe->geometry.kbHieght));
+}
+
+bool KeyboardPainter::event(QEvent *event){
+    if (event->type() == QEvent::ToolTip) {
+         QHelpEvent *helpEvent = static_cast<QHelpEvent *>(event);
+         int index = kbframe->keyAt(helpEvent->pos());
+         if (index != -1) {
+             QToolTip::showText(helpEvent->globalPos(), kbframe->toolTipList[index].ttString);
+         } else {
+             QToolTip::hideText();
+             event->ignore();
+         }
+
+         return true;
+     }
+     return QWidget::event(event);
 }
 
 KeyboardPainter::~KeyboardPainter()
 {
+    delete previewDialog;
     delete kbframe;
     delete exitButton;
 }
diff --git a/kcontrol/keyboard/preview/keyboardpainter.h b/kcontrol/keyboard/preview/keyboardpainter.h
index 39382be..e624464 100644
--- a/kcontrol/keyboard/preview/keyboardpainter.h
+++ b/kcontrol/keyboard/preview/keyboardpainter.h
@@ -20,11 +20,14 @@
 #ifndef KEYBOARDPAINTER_H
 #define KEYBOARDPAINTER_H
 
-#include "kbpreviewframe.h"
-
 #include <QtGui/QDialog>
+#include <QtGui/QPushButton>
+
+#include"kbpreviewframe.h"
 
-class QPushButton;
+namespace Ui {
+class keyboardpainter;
+}
 
 class KeyboardPainter : public QDialog
 {
@@ -33,10 +36,11 @@ class KeyboardPainter : public QDialog
 public:
     explicit KeyboardPainter();
     ~KeyboardPainter();
-
-    void generateKeyboardLayout(const QString& layout, const QString& variant);
+    void generateKeyboardLayout(QString country, QString layoutvariant, QString model);
     
 private:
+	bool event(QEvent *event);
+    QDialog *previewDialog;
     KbPreviewFrame *kbframe;
     QPushButton *exitButton;
 };


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic