From kde-commits Sun Feb 03 18:46:51 2013 From: shivam makkar Date: Sun, 03 Feb 2013 18:46:51 +0000 To: kde-commits Subject: [kde-workspace/kbpreview] kcontrol/keyboard: added geometry and tool tip feature Message-Id: <20130203184651.7E7E3A6091 () git ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=135991722312432 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: UNKNO= WN] * 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 whic= h are listed at that page. http://commits.kde.org/kde-workspace/5f1c270c357c814cae1553325af129291a914c= 13 diff --git a/kcontrol/keyboard/CMakeLists.txt b/kcontrol/keyboard/CMakeList= s.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/p= review/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 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +KbGeometry::KbGeometry() +{ + defSectionLeft=3D0; + defSectionTop=3D0; + + pcModel=3D"pc101 pc102 pc104 pc105"; + pcgeometries =3D "latitude"; + macbooks =3D "macbook78 macbook79"; + applealu =3D "applealu_ansi applealu_iso applealu_jis"; + macs =3D "macintosh macintosh_old ibook powerbook macbook78 macbook79"; + dell =3D "dell101 dellm65"; + +} +int KbGeometry::setIntProp(QString a,QString b){ + int val; + float f; + if(b.contains(a)){ + QString dvl=3Db.mid(b.indexOf(a)); + dvl=3Ddvl.left(dvl.indexOf(";")); + dvl=3Ddvl.mid(dvl.indexOf("=3D")+1); + val=3Ddvl.toFloat(); + } + else + val=3D0; + return val; +} + +QString KbGeometry::setStrProp(QString a,QString b){ + QString val; + if(b.contains(a)){ + QString dvl=3Db.mid(b.indexOf(a)); + dvl=3Ddvl.left(dvl.indexOf(";")); + dvl=3Ddvl.mid(dvl.indexOf("=3D")+1); + val=3Ddvl; + } + else + val=3D""; + return val; +} + +void KbGeometry::extractShape(QString desc){ + desc.remove(" "); + desc.remove("\t"); + desc.remove("\n"); + QListshapes; + shapes=3Ddesc.split("shape\""); + for(int i=3D1;isz=3Dsh.split(","); + temp.sizex=3Dsz.at(0).toFloat(); + temp.sizey=3Dsz.at(1).toFloat(); + if(temp.sizex=3D=3D0||temp.sizey=3D=3D0){ + + idx=3Dth.indexOf("["); + int tdx=3Dth.indexOf("[",idx+1); + th=3Dth.mid(tdx+1); + idx=3Dth.indexOf("]"); + th=3Dth.left(idx); + QListsd=3Dth.split(","); + temp.sizex=3Dsd.at(0).toInt(); + temp.sizey=3Dsd.at(1).toInt(); + } + shapeList<seclist=3Ddesc.split("section\""); + setDefaultValues(seclist.at(0)); + extractShape(desc); + for(int i=3D1;irlst=3Dseclist.at(i).split("row{"); + QString inp=3Drlst.at(0); + int top=3DsetIntProp("top=3D",inp); + temp.ycordi=3Dtop+defSectionTop; + dm.setNum(temp.ycordi); + dm.append("=3D"); + m.setNum(top); + dm.append(m); + dm.append("+"); + m.setNum(defSectionTop); + dm.append(m); + dm.append("\n"); + temp.secShape=3DsetStrProp("key.shape=3D",inp); + if(temp.secShape=3D=3D"") + temp.secShape=3DdefShape; + temp.gap=3DsetIntProp("key.gap=3D",inp); + if(temp.gap=3D=3D0) + temp.gap=3Dkeygap; + int left=3DsetIntProp("left=3D",inp); + temp.xcordi=3Dleft+defSectionLeft; + m.setNum(temp.xcordi); + dm.append(m); + dm.append("=3D"); + m.setNum(left); + dm.append(m); + dm.append("+"); + m.setNum(defSectionLeft); + dm.append(m); + dm.append("\n"); + for(int j=3D1;j lst=3Ddesc.split(","); + QList klst; + while(!lst.empty()){ + QString temp=3Dlst.first(); + if(temp=3D=3D"};") + 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=3Dtemp.left(temp.indexOf("};")); + temp.remove("}"); + } + else{ + if(temp.contains("};")) + temp=3Dtemp.left(temp.indexOf("};")); + } + klst << temp; + + + } + return klst; +} + +void KbGeometry::extractRows(QString des){ + extractSections(des); + for(int j=3D0;jdummylst=3Ddummy.split(";"); + int z=3D0; + for(int k=3D0;k"); + temp.name=3Dd; + } + if(d.startsWith("\"")){ + d.remove("\""); + check=3D1; + //g.setText(d); + //g.exec(); + temp.shape=3DgetShape(d); + } + if(d.startsWith("shape=3D")){ + d=3DsetStrProp("shape=3D",d); + d.remove("\""); + temp.shape=3DgetShape(d); + check=3D1; + } + bool ok; + if(z=3D=3D0){ + addx=3Dd.toInt(&ok,10); + if(ok) + z=3D1; + } + } + } + else{ + dummy.remove("<"); + dummy.remove(">"); + temp.name=3Ddummy; + //g.setText(rows.at(i).shapeRow); + //g.exec(); + + } + if(check=3D=3D0) + temp.shape=3DgetShape(rows.at(i).shapeRow); + if(temp.shape.name=3D=3D"") + temp.shape=3DgetShape("NORM"); + temp.cordx=3Drows.at(i).cx+totksz+addx+gap; + totksz+=3Dtemp.shape.sizex+addx+gap; + temp.cordy=3Drows.at(i).cy; + keys<=3D 3 ) { + // .../usr/lib/X11 -> /usr/share/X11/xkb vs .../usr/X11/lib -> /us= r/X11/share/X11/xkb + QString delta =3D base.endsWith("X11") ? "/../../share/X11" : "/..= /share/X11"; + QDir baseDir(base + delta); + if( baseDir.exists() ) { + xkbParentDir =3D baseDir.absolutePath(); + } + else { + QDir baseDir(base + "/X11"); // .../usr/X11/lib/X11/xkb (old X= Free) + if( baseDir.exists() ) { + xkbParentDir =3D baseDir.absolutePath(); + } + } + } + + if( xkbParentDir.isEmpty() ) { + xkbParentDir =3D "/usr/share/X11"; + } + symBasedir=3DQString("%1/xkb/geometry/").arg(xkbParentDir); + return(symBasedir); +} diff --git a/kcontrol/keyboard/preview/kbgeometry.h b/kcontrol/keyboard/pre= view/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 + +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 keylist; +}; + +struct Section{ + int xcordi,ycordi; + QList rowlist; + int gap; + QString secShape; +}; + +class KbGeometry +{ + QList shapeList; + QList
sections; + QList 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 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/keyboa= rd/preview/kbpreviewframe.cpp index 8ecc4f2..20e9363 100644 --- a/kcontrol/keyboard/preview/kbpreviewframe.cpp +++ b/kcontrol/keyboard/preview/kbpreviewframe.cpp @@ -21,331 +21,183 @@ = #include #include +#include +#include = #include #include = = -static const QColor keyBorderColor("#d4d4d4"); +static const QColor keyBorderColor("#E6E6E6"); static const QColor lev12color("#d4d4d4"); static const QColor lev34color("#FF3300"); -static const int sz=3D20, kszx=3D70, kszy=3D70; - -static const int xOffset[] =3D {15, 15, 40, 40 }; -static const int yOffset[] =3D {10, 40, 10, 40 }; static const QColor color[] =3D { lev12color, lev12color, lev34color, lev3= 4color }; = = -// TODO: parse geometry files and display keyboard according to current ke= yboard 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 symbols =3D keyboardLayout.TLDE.symbols; - - for(int level=3D0; level=3D= pos.x()&&temp.ttPoint.y()<=3Dpos.y()&&temp.ttPoint.y()+tooltip_range>=3Dpos= .y()){ = -void KbPreviewFrame::paintAERow(QPainter &painter,int &x,int &y) -{ - paintTLDE(painter, x, y); - - const int noAEk=3D12; - for(int i=3D0; i symbols =3D keyboardLayout.AE[i].symbols; - - for(int level=3D0; leveltype() =3D=3D QEvent::ToolTip) { + QHelpEvent *helpEvent =3D static_cast(event); + int index =3D keyAt(helpEvent->pos()); + if (index !=3D -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+=3Dtabszx; - - - for(int i=3D0; i symbols =3D keyboardLayout.AD[i].symbols; - + painter.setBrush(QBrush(Qt::black,Qt::SolidPattern)); + setScaleFactor(geometry.kbWidth,geometry.kbHieght); + for(int i=3D0;i symbols =3D keyboardLayout.BKSL.symbols; - - for(int level=3D0; level symbols =3D keyboardLayout.AC[i].symbols; - - for(int level=3D0; level symbols =3D keyboardLayout.AB[i].symbols; - - for(int level=3D0; level symstr =3D content.split("xkb_symbols "); + QList symstr; + symstr=3Dcontent.split("xkb_symbols "); = - if( layoutVariant.isEmpty() ) { - keyboardLayout.generateLayout(symstr.at(1), layout); - } - else { - for(int i=3D1;i +#include "kbgeometry.h" +#include #include = +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 toolTipList; explicit KbPreviewFrame(QWidget *parent =3D 0); + void paintEvent(QPaintEvent *); + bool event(QEvent *event); + int keyAt(QPoint pos); + KbGeometry geometry; + KeyboardLayout kblayout; + void generateKeyboardLayout(const QString &country, const QString &lay= outvariant, const QString &model); = - void paintEvent(QPaintEvent * event); - void generateKeyboardLayout(const QString &country, const QString &lay= outVariant); - QString getLayoutName() const { - return keyboardLayout.getLayoutName(); - } + = }; = #endif // KBPREVIEWFRAME_H = diff --git a/kcontrol/keyboard/preview/keyboardpainter.cpp b/kcontrol/keybo= ard/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 #include -#include +#include +#include = -#include - - -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 =3D new QVBoxLayout( this ); + exitButton->setFixedSize(120,30); + connect(exitButton,SIGNAL(clicked()),this,SLOT(close())); + QVBoxLayout*const vLayout =3D 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 vari= ant,QString model) { - kbframe->generateKeyboardLayout(layout, variant); + kbframe->generateKeyboardLayout(country,variant,model); + previewDialog->setFixedSize((2*kbframe->geometry.kbWidth+20),(2*kbfram= e->geometry.kbHieght+50)); + kbframe->setFixedSize((2*kbframe->geometry.kbWidth+20),(2*kbframe->geo= metry.kbHieght)); +} + +bool KeyboardPainter::event(QEvent *event){ + if (event->type() =3D=3D QEvent::ToolTip) { + QHelpEvent *helpEvent =3D static_cast(event); + int index =3D kbframe->keyAt(helpEvent->pos()); + if (index !=3D -1) { + QToolTip::showText(helpEvent->globalPos(), kbframe->toolTipLi= st[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/keyboar= d/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 +#include + +#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& vari= ant); + void generateKeyboardLayout(QString country, QString layoutvariant, QS= tring model); = private: + bool event(QEvent *event); + QDialog *previewDialog; KbPreviewFrame *kbframe; QPushButton *exitButton; };