[Libreoffice-commits] core.git: 2 commits - vcl/qt5

Jan-Marek Glogowski glogow at fbihome.de
Tue Nov 7 12:41:42 UTC 2017


 vcl/qt5/Qt5Data.cxx   |    2 
 vcl/qt5/Qt5Widget.cxx |  113 ++++++++++++++++++++++++++++++++++++++++++++++++--
 vcl/qt5/Qt5Widget.hxx |   25 +++++++----
 3 files changed, 127 insertions(+), 13 deletions(-)

New commits:
commit 9858edd6576b03292bccfebb142fc92588df0c42
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Tue Nov 7 13:18:05 2017 +0100

    QT5 initial keyboard support
    
    No idea, if we can / should map those vendor specific keys, like
    Gtk+ does.
    
    This also prefixes the non-virtual functions with "handle".
    
    Change-Id: Id8c42651e07d33728ff6deced06a82de29aa3fad

diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx
index e17cd7da1a10..8d55aaa6832b 100644
--- a/vcl/qt5/Qt5Widget.cxx
+++ b/vcl/qt5/Qt5Widget.cxx
@@ -24,7 +24,9 @@
 #include "Qt5Graphics.hxx"
 #include "Qt5Tools.hxx"
 
+#include <QtGui/QFocusEvent>
 #include <QtGui/QImage>
+#include <QtGui/QKeyEvent>
 #include <QtGui/QMouseEvent>
 #include <QtGui/QPainter>
 #include <QtGui/QPaintEvent>
@@ -40,6 +42,7 @@ Qt5Widget::Qt5Widget( Qt5Frame &rFrame, QWidget *parent, Qt::WindowFlags f )
 {
     create();
     setMouseTracking( true );
+    setFocusPolicy( Qt::StrongFocus );
 }
 
 Qt5Widget::~Qt5Widget()
@@ -85,7 +88,7 @@ void Qt5Widget::resizeEvent( QResizeEvent* )
     m_pFrame->CallCallback( SalEvent::Resize, nullptr );
 }
 
-void Qt5Widget::mouseButtonEvent( QMouseEvent *pEvent, bool bReleased )
+void Qt5Widget::handleMouseButtonEvent( QMouseEvent *pEvent, bool bReleased )
 {
     SalMouseEvent aEvent;
     switch( pEvent->button() )
@@ -112,12 +115,12 @@ void Qt5Widget::mouseButtonEvent( QMouseEvent *pEvent, bool bReleased )
 
 void Qt5Widget::mousePressEvent( QMouseEvent *pEvent )
 {
-    mouseButtonEvent( pEvent, false );
+    handleMouseButtonEvent( pEvent, false );
 }
 
 void Qt5Widget::mouseReleaseEvent( QMouseEvent *pEvent )
 {
-    mouseButtonEvent( pEvent, true );
+    handleMouseButtonEvent( pEvent, true );
 }
 
 void Qt5Widget::mouseMoveEvent( QMouseEvent *pEvent )
@@ -175,4 +178,101 @@ void Qt5Widget::showEvent( QShowEvent* )
     m_pFrame->CallCallback( SalEvent::Paint, &aPaintEvt );
 }
 
+static sal_uInt16 GetKeyCode( int keyval )
+{
+    sal_uInt16 nCode = 0;
+    if( keyval >= Qt::Key_0 && keyval <= Qt::Key_9 )
+        nCode = KEY_0 + ( keyval - Qt::Key_0 );
+    else if( keyval >= Qt::Key_A && keyval <= Qt::Key_Z )
+        nCode = KEY_A + ( keyval - Qt::Key_A );
+    else if( keyval >= Qt::Key_F1 && keyval <= Qt::Key_F26 )
+        nCode = KEY_F1 + (keyval - Qt::Key_F1);
+    else
+    {
+        switch( keyval )
+        {
+            case Qt::Key_Down:          nCode = KEY_DOWN;         break;
+            case Qt::Key_Up:            nCode = KEY_UP;           break;
+            case Qt::Key_Left:          nCode = KEY_LEFT;         break;
+            case Qt::Key_Right:         nCode = KEY_RIGHT;        break;
+            case Qt::Key_Home:          nCode = KEY_HOME;         break;
+            case Qt::Key_End:           nCode = KEY_END;          break;
+            case Qt::Key_PageUp:        nCode = KEY_PAGEUP;       break;
+            case Qt::Key_PageDown:      nCode = KEY_PAGEDOWN;     break;
+            case Qt::Key_Return:        nCode = KEY_RETURN;       break;
+            case Qt::Key_Escape:        nCode = KEY_ESCAPE;       break;
+            case Qt::Key_Tab:           nCode = KEY_TAB;          break;
+            case Qt::Key_Backspace:     nCode = KEY_BACKSPACE;    break;
+            case Qt::Key_Space:         nCode = KEY_SPACE;        break;
+            case Qt::Key_Insert:        nCode = KEY_INSERT;       break;
+            case Qt::Key_Delete:        nCode = KEY_DELETE;       break;
+            case Qt::Key_Plus:          nCode = KEY_ADD;          break;
+            case Qt::Key_Minus:         nCode = KEY_SUBTRACT;     break;
+            case Qt::Key_Asterisk:      nCode = KEY_MULTIPLY;     break;
+            case Qt::Key_Slash:         nCode = KEY_DIVIDE;       break;
+            case Qt::Key_Period:        nCode = KEY_POINT;        break;
+            case Qt::Key_Comma:         nCode = KEY_COMMA;        break;
+            case Qt::Key_Less:          nCode = KEY_LESS;         break;
+            case Qt::Key_Greater:       nCode = KEY_GREATER;      break;
+            case Qt::Key_Equal:         nCode = KEY_EQUAL;        break;
+            case Qt::Key_Find:          nCode = KEY_FIND;         break;
+            case Qt::Key_Menu:          nCode = KEY_CONTEXTMENU;  break;
+            case Qt::Key_Help:          nCode = KEY_HELP;         break;
+            case Qt::Key_Undo:          nCode = KEY_UNDO;         break;
+            case Qt::Key_Redo:          nCode = KEY_REPEAT;       break;
+            case Qt::Key_Cancel:        nCode = KEY_F11;          break;
+            case Qt::Key_AsciiTilde:    nCode = KEY_TILDE;        break;
+            case Qt::Key_QuoteLeft:     nCode = KEY_QUOTELEFT;    break;
+            case Qt::Key_BracketLeft:   nCode = KEY_BRACKETLEFT;  break;
+            case Qt::Key_BracketRight:  nCode = KEY_BRACKETRIGHT; break;
+            case Qt::Key_Semicolon:     nCode = KEY_SEMICOLON;    break;
+            case Qt::Key_Copy:          nCode = KEY_COPY;         break;
+            case Qt::Key_Cut:           nCode = KEY_CUT;          break;
+            case Qt::Key_Open:          nCode = KEY_OPEN;         break;
+            case Qt::Key_Paste:         nCode = KEY_PASTE;        break;
+        }
+    }
+
+    return nCode;
+}
+
+bool Qt5Widget::handleKeyEvent( QKeyEvent *pEvent, bool bDown )
+{
+    SalKeyEvent aEvent;
+
+    aEvent.mnCharCode   = (pEvent->text().isEmpty() ? 0 : pEvent->text().at( 0 ).unicode());
+    aEvent.mnRepeat     = 0;
+    aEvent.mnCode       = GetKeyCode( pEvent->key() );
+    aEvent.mnCode      |= GetKeyModCode( pEvent->modifiers() );
+
+    bool bStopProcessingKey;
+    if ( bDown )
+        bStopProcessingKey = m_pFrame->CallCallback( SalEvent::KeyInput, &aEvent );
+    else
+        bStopProcessingKey = m_pFrame->CallCallback( SalEvent::KeyUp, &aEvent );
+    return bStopProcessingKey;
+}
+
+void Qt5Widget::keyPressEvent( QKeyEvent *pEvent )
+{
+    if ( handleKeyEvent( pEvent, true ) )
+        pEvent->accept();
+}
+
+void Qt5Widget::keyReleaseEvent( QKeyEvent *pEvent )
+{
+    if ( handleKeyEvent( pEvent, false ) )
+        pEvent->accept();
+}
+
+void Qt5Widget::focusInEvent( QFocusEvent* )
+{
+     m_pFrame->CallCallback( SalEvent::GetFocus, nullptr );
+}
+
+void Qt5Widget::focusOutEvent( QFocusEvent* )
+{
+     m_pFrame->CallCallback( SalEvent::LoseFocus, nullptr );
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5Widget.hxx b/vcl/qt5/Qt5Widget.hxx
index bacd6ab403d0..8ba955e8cf69 100644
--- a/vcl/qt5/Qt5Widget.hxx
+++ b/vcl/qt5/Qt5Widget.hxx
@@ -23,6 +23,8 @@
 
 class Qt5Frame;
 class Qt5Object;
+class QFocusEvent;
+class QKeyEvent;
 class QMouseEvent;
 class QMoveEvent;
 class QPaintEvent;
@@ -37,8 +39,13 @@ class Qt5Widget
 
     Qt5Frame  *m_pFrame;
 
-    void mouseButtonEvent( QMouseEvent*, bool );
+    bool handleKeyEvent( QKeyEvent*, bool );
+    void handleMouseButtonEvent( QMouseEvent*, bool );
 
+    virtual void focusInEvent( QFocusEvent* ) override;
+    virtual void focusOutEvent( QFocusEvent* ) override;
+    virtual void keyPressEvent( QKeyEvent* ) override;
+    virtual void keyReleaseEvent( QKeyEvent* ) override;
     virtual void mouseMoveEvent( QMouseEvent*) override;
     virtual void mousePressEvent( QMouseEvent*) override;
     virtual void mouseReleaseEvent( QMouseEvent*) override;
commit e379f7ff4229a3c011e3a38ae06ed812c49ab0f8
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Tue Nov 7 13:13:10 2017 +0100

    QT5 queue paint update on show
    
    Something like gtk_widget_set_redraw_on_allocate. On resize
    of dialogs, we still get artefacts, but at least you see
    something without forcing an event.
    
    And since there isn't any Qt5 theming yet, we let VCL paint the
    menus with a border.
    
    Change-Id: Ia2ff6b199ee25e481e3fb29a921b0d3d490f1535

diff --git a/vcl/qt5/Qt5Data.cxx b/vcl/qt5/Qt5Data.cxx
index f05e30ce662f..3d524bd11c71 100644
--- a/vcl/qt5/Qt5Data.cxx
+++ b/vcl/qt5/Qt5Data.cxx
@@ -34,8 +34,6 @@ Qt5Data::Qt5Data( SalInstance *pInstance )
 
     // draw toolbars on separate lines
     pSVData->maNWFData.mbDockingAreaSeparateTB = true;
-    // no borders for menu, theming does that
-    pSVData->maNWFData.mbFlatMenu = true;
 }
 
 Qt5Data::~Qt5Data()
diff --git a/vcl/qt5/Qt5Widget.cxx b/vcl/qt5/Qt5Widget.cxx
index 195b5f2b341e..e17cd7da1a10 100644
--- a/vcl/qt5/Qt5Widget.cxx
+++ b/vcl/qt5/Qt5Widget.cxx
@@ -28,6 +28,7 @@
 #include <QtGui/QMouseEvent>
 #include <QtGui/QPainter>
 #include <QtGui/QPaintEvent>
+#include <QtGui/QShowEvent>
 #include <QtGui/QWheelEvent>
 
 #include <cairo.h>
@@ -167,5 +168,11 @@ void Qt5Widget::moveEvent( QMoveEvent* )
     m_pFrame->CallCallback( SalEvent::Move, nullptr );
 }
 
+void Qt5Widget::showEvent( QShowEvent* )
+{
+    QSize aSize( m_pFrame->m_pQWidget->size() );
+    SalPaintEvent aPaintEvt( 0, 0, aSize.width(), aSize.height(), true );
+    m_pFrame->CallCallback( SalEvent::Paint, &aPaintEvt );
+}
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/qt5/Qt5Widget.hxx b/vcl/qt5/Qt5Widget.hxx
index 83375278c738..bacd6ab403d0 100644
--- a/vcl/qt5/Qt5Widget.hxx
+++ b/vcl/qt5/Qt5Widget.hxx
@@ -27,6 +27,7 @@ class QMouseEvent;
 class QMoveEvent;
 class QPaintEvent;
 class QResizeEvent;
+class QShowEvent;
 class QWheelEvent;
 
 class Qt5Widget
@@ -38,13 +39,14 @@ class Qt5Widget
 
     void mouseButtonEvent( QMouseEvent*, bool );
 
-    void paintEvent( QPaintEvent* ) override;
-    void resizeEvent( QResizeEvent* ) override;
-    void moveEvent( QMoveEvent* ) override;
-    void mouseMoveEvent( QMouseEvent*) override;
-    void mousePressEvent( QMouseEvent*) override;
-    void mouseReleaseEvent( QMouseEvent*) override;
-    void wheelEvent( QWheelEvent* ) override;
+    virtual void mouseMoveEvent( QMouseEvent*) override;
+    virtual void mousePressEvent( QMouseEvent*) override;
+    virtual void mouseReleaseEvent( QMouseEvent*) override;
+    virtual void moveEvent( QMoveEvent* ) override;
+    virtual void paintEvent( QPaintEvent* ) override;
+    virtual void resizeEvent( QResizeEvent* ) override;
+    virtual void showEvent( QShowEvent* ) override;
+    virtual void wheelEvent( QWheelEvent* ) override;
 
 public:
     Qt5Widget( Qt5Frame &rFrame,


More information about the Libreoffice-commits mailing list