qskinny/src/controls/QskVirtualKeyboard.h

167 lines
3.9 KiB
C
Raw Normal View History

2017-07-21 18:21:34 +02:00
/******************************************************************************
2018-02-06 14:55:35 +01:00
* QSkinny - Copyright (C) 2016 Uwe Rathmann
* This file may be used under the terms of the QSkinny License, Version 1.0
2017-07-21 18:21:34 +02:00
*****************************************************************************/
#ifndef QSK_VIRTUAL_KEYBOARD_H
#define QSK_VIRTUAL_KEYBOARD_H
2017-07-21 18:21:34 +02:00
2018-03-28 15:31:44 +02:00
#include "QskBox.h"
2018-03-14 17:30:37 +01:00
#include "QskPushButton.h"
2017-07-21 18:21:34 +02:00
#include <QRectF>
2018-03-14 17:30:37 +01:00
class QskInputCompositionModel;
class QskVirtualKeyboard;
2018-03-14 17:30:37 +01:00
class QSK_EXPORT QskVirtualKeyboardCandidateButton : public QskPushButton
{
Q_OBJECT
using Inherited = QskPushButton;
public:
QSK_SUBCONTROLS( Panel, Text )
QskVirtualKeyboardCandidateButton( QskVirtualKeyboard* inputPanel, QQuickItem* parent = nullptr );
void setIndexAndText( int index, const QString& text );
virtual QskAspect::Subcontrol effectiveSubcontrol( QskAspect::Subcontrol subControl ) const override;
static int maxCandidates();
// add a setter here as well if needed
private:
QskVirtualKeyboard* m_inputPanel;
int m_index;
QString m_text;
};
class QSK_EXPORT QskVirtualKeyboardButton : public QskPushButton
2018-03-14 17:30:37 +01:00
{
2018-04-01 12:47:44 +02:00
Q_OBJECT
2018-03-14 17:30:37 +01:00
2018-04-01 12:47:44 +02:00
using Inherited = QskPushButton;
2018-03-14 17:30:37 +01:00
2018-04-01 12:47:44 +02:00
public:
2018-04-02 17:01:04 +02:00
QSK_SUBCONTROLS( Panel, Text )
2018-04-02 17:01:04 +02:00
QskVirtualKeyboardButton( int keyIndex,
QskVirtualKeyboard*, QQuickItem* parent = nullptr );
2018-03-14 17:30:37 +01:00
2018-04-02 17:01:04 +02:00
virtual QskAspect::Subcontrol effectiveSubcontrol(
QskAspect::Subcontrol ) const override;
2018-03-14 17:30:37 +01:00
2018-04-01 12:47:44 +02:00
int keyIndex() const;
2018-03-21 13:00:24 +01:00
2018-04-01 12:47:44 +02:00
public Q_SLOTS:
void updateText();
2018-03-14 17:30:37 +01:00
2018-04-01 12:47:44 +02:00
private:
const int m_keyIndex;
QskVirtualKeyboard* m_inputPanel;
2018-03-14 17:30:37 +01:00
};
class QSK_EXPORT QskVirtualKeyboard : public QskBox
2017-07-21 18:21:34 +02:00
{
Q_OBJECT
Q_PROPERTY( QString displayLanguageName READ displayLanguageName
2018-04-01 12:47:44 +02:00
NOTIFY displayLanguageNameChanged )
2017-07-21 18:21:34 +02:00
2018-03-28 15:31:44 +02:00
using Inherited = QskBox;
2017-07-21 18:21:34 +02:00
public:
2018-03-15 10:31:50 +01:00
QSK_SUBCONTROLS( Panel )
2017-07-21 18:21:34 +02:00
struct KeyData
{
int key = 0;
2018-03-14 17:30:37 +01:00
bool isSuggestionKey = false;
2017-07-21 18:21:34 +02:00
QRectF rect;
};
enum Action
{
Compose = 0x10,
SelectGroup = 0x11,
SelectCandidate = 0x12,
};
Q_ENUM( Action )
enum Mode
{
CurrentMode = -1,
LowercaseMode,
UppercaseMode,
SpecialCharacterMode,
ModeCount
};
Q_ENUM( Mode )
enum
{
RowCount = 5,
KeyCount = 12
};
using KeyRow = Qt::Key[KeyCount];
using KeyDataRow = KeyData[KeyCount];
using KeyDataSet = KeyDataRow[RowCount];
QskVirtualKeyboard( QQuickItem* parent = nullptr );
virtual ~QskVirtualKeyboard() override;
2017-07-21 18:21:34 +02:00
2018-04-02 17:01:04 +02:00
virtual QskAspect::Subcontrol effectiveSubcontrol(
QskAspect::Subcontrol ) const override;
2018-03-22 15:48:29 +01:00
2018-04-02 17:01:04 +02:00
void updateLocale( const QLocale& );
2017-07-21 18:21:34 +02:00
2018-04-02 17:01:04 +02:00
void setMode( QskVirtualKeyboard::Mode );
2017-07-21 18:21:34 +02:00
Mode mode() const;
const KeyDataSet& keyData( QskVirtualKeyboard::Mode = CurrentMode ) const;
2017-07-21 18:21:34 +02:00
QString textForKey( int ) const;
2017-07-21 18:21:34 +02:00
QString displayLanguageName() const;
2018-03-14 17:30:37 +01:00
void handleKey( int keyIndex );
KeyData& keyDataAt( int ) const;
QString currentTextForKeyIndex( int keyIndex ) const;
2018-04-01 12:47:44 +02:00
void handleCandidateKey( int index, const QString& text );
void setCandidateBarVisible( bool visible );
public Q_SLOTS:
void setPreeditGroups( const QVector< Qt::Key >& );
2018-04-02 17:01:04 +02:00
void setPreeditCandidates( const QVector< QString >& );
2017-07-21 18:21:34 +02:00
protected:
virtual void geometryChanged( const QRectF&, const QRectF& ) override;
2018-03-21 13:00:24 +01:00
virtual void updateLayout() override;
2017-07-21 18:21:34 +02:00
private:
2018-03-14 17:30:37 +01:00
void createUI();
void updateUI(); // e.g. called when updating Pinyin suggestions
2017-07-21 18:21:34 +02:00
void compose( int );
2017-07-21 18:21:34 +02:00
void selectGroup( int );
void selectCandidate( int );
void setCandidateOffset( int );
void updateKeyData();
Q_SIGNALS:
void keyboardRectChanged();
void displayLanguageNameChanged();
2018-04-02 17:01:04 +02:00
void modeChanged( QskVirtualKeyboard::Mode );
2017-07-21 18:21:34 +02:00
private:
2017-07-21 18:21:34 +02:00
class PrivateData;
std::unique_ptr< PrivateData > m_data;
};
Q_DECLARE_TYPEINFO( QskVirtualKeyboard::KeyData, Q_PRIMITIVE_TYPE );
2017-07-21 18:21:34 +02:00
#endif