New keyboard viewmodule, based on the one from Manjaro's minst.
This commit is contained in:
parent
ee485f9735
commit
7a99214ddb
17
src/modules/keyboard/CMakeLists.txt
Normal file
17
src/modules/keyboard/CMakeLists.txt
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
include_directories( ${PROJECT_BINARY_DIR}/src/libcalamaresui )
|
||||||
|
|
||||||
|
calamares_add_plugin( keyboard
|
||||||
|
TYPE viewmodule
|
||||||
|
EXPORT_MACRO PLUGINDLLEXPORT_PRO
|
||||||
|
CONFIG_FILE module.conf
|
||||||
|
SOURCES
|
||||||
|
KeyboardViewStep.cpp
|
||||||
|
KeyboardPage.cpp
|
||||||
|
keyboardwidget/keyboardglobal.cpp
|
||||||
|
keyboardwidget/keyboardpreview.cpp
|
||||||
|
UI
|
||||||
|
KeyboardPage.ui
|
||||||
|
LINK_LIBRARIES
|
||||||
|
calamaresui
|
||||||
|
SHARED_LIB
|
||||||
|
)
|
232
src/modules/keyboard/KeyboardPage.cpp
Normal file
232
src/modules/keyboard/KeyboardPage.cpp
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Portions from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "KeyboardPage.h"
|
||||||
|
|
||||||
|
#include "ui_KeyboardPage.h"
|
||||||
|
#include "keyboardwidget/keyboardpreview.h"
|
||||||
|
|
||||||
|
#include <QComboBox>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
|
||||||
|
KeyboardPage::KeyboardPage( QWidget* parent )
|
||||||
|
: QWidget()
|
||||||
|
, ui( new Ui::Page_Keyboard )
|
||||||
|
, m_keyboardPreview( new KeyBoardPreview( this ) )
|
||||||
|
{
|
||||||
|
ui->setupUi( this );
|
||||||
|
|
||||||
|
// Keyboard Preview
|
||||||
|
ui->KBPreviewLayout->addWidget( m_keyboardPreview );
|
||||||
|
|
||||||
|
// Connect signals and slots
|
||||||
|
connect( ui->listLayout, &QListWidget::currentItemChanged,
|
||||||
|
this, &KeyboardPage::onListLayoutCurrentItemChanged );
|
||||||
|
connect( ui->listVariant, &QListWidget::currentItemChanged,
|
||||||
|
this, &KeyboardPage::onListVariantCurrentItemChanged );
|
||||||
|
|
||||||
|
connect( ui->buttonRestore, &QPushButton::clicked,
|
||||||
|
[this]
|
||||||
|
{
|
||||||
|
ui->comboBoxModel->setCurrentIndex( m_defaultIndex );
|
||||||
|
});
|
||||||
|
|
||||||
|
connect( ui->comboBoxModel,
|
||||||
|
static_cast< void ( QComboBox::* )( const QString& ) >( &QComboBox::currentIndexChanged ),
|
||||||
|
[this]( const QString& text )
|
||||||
|
{
|
||||||
|
QString model = m_models.value( text, "pc105" );
|
||||||
|
|
||||||
|
// Set Xorg keyboard model
|
||||||
|
QProcess::execute( QString( "setxkbmap -model \"%1\"" )
|
||||||
|
.arg( model ).toUtf8() );
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
KeyboardPage::~KeyboardPage()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KeyboardPage::init()
|
||||||
|
{
|
||||||
|
//### Detect current keyboard layout and variant
|
||||||
|
QString currentLayout;
|
||||||
|
QProcess process;
|
||||||
|
process.start( "setxkbmap", QStringList() << "-print" );
|
||||||
|
|
||||||
|
if ( process.waitForFinished() )
|
||||||
|
{
|
||||||
|
QStringList list = QString( process.readAll() )
|
||||||
|
.split( "\n", QString::SkipEmptyParts );
|
||||||
|
|
||||||
|
foreach( QString line, list )
|
||||||
|
{
|
||||||
|
line = line.trimmed();
|
||||||
|
if ( !line.startsWith( "xkb_symbols" ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
line = line.remove( "}" )
|
||||||
|
.remove( "{" )
|
||||||
|
.remove( ";" );
|
||||||
|
line = line.mid( line.indexOf( "\"" ) + 1 );
|
||||||
|
|
||||||
|
QStringList split = line.split( "+", QString::SkipEmptyParts );
|
||||||
|
if ( split.size() >= 2 )
|
||||||
|
{
|
||||||
|
currentLayout = split.at( 1 );
|
||||||
|
|
||||||
|
if ( currentLayout.contains( "(" ) )
|
||||||
|
currentLayout = currentLayout
|
||||||
|
.mid( 0, currentLayout.indexOf( "(" ) )
|
||||||
|
.trimmed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//### Models
|
||||||
|
m_models = KeyboardGlobal::getKeyboardModels();
|
||||||
|
QMapIterator< QString, QString > mi( m_models );
|
||||||
|
|
||||||
|
ui->comboBoxModel->blockSignals( true );
|
||||||
|
|
||||||
|
while ( mi.hasNext() )
|
||||||
|
{
|
||||||
|
mi.next();
|
||||||
|
|
||||||
|
if ( mi.value() == "pc105" )
|
||||||
|
m_defaultIndex = ui->comboBoxModel->count();
|
||||||
|
|
||||||
|
ui->comboBoxModel->addItem( mi.key() );
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->comboBoxModel->blockSignals( false );
|
||||||
|
|
||||||
|
// Set to default value pc105
|
||||||
|
ui->comboBoxModel->setCurrentIndex( m_defaultIndex );
|
||||||
|
|
||||||
|
|
||||||
|
//### Layouts and Variants
|
||||||
|
|
||||||
|
// Block signals
|
||||||
|
ui->listLayout->blockSignals( true );
|
||||||
|
|
||||||
|
QMap< QString, KeyboardGlobal::KeyboardInfo > layouts =
|
||||||
|
KeyboardGlobal::getKeyboardLayouts();
|
||||||
|
QMapIterator< QString, KeyboardGlobal::KeyboardInfo > li( layouts );
|
||||||
|
LayoutItem* currentLayoutItem = nullptr;
|
||||||
|
|
||||||
|
while ( li.hasNext() )
|
||||||
|
{
|
||||||
|
li.next();
|
||||||
|
|
||||||
|
LayoutItem* item = new LayoutItem();
|
||||||
|
KeyboardGlobal::KeyboardInfo info = li.value();
|
||||||
|
|
||||||
|
item->setText( info.description );
|
||||||
|
item->data = li.key();
|
||||||
|
item->info = info;
|
||||||
|
ui->listLayout->addItem( item );
|
||||||
|
|
||||||
|
// Find current layout index
|
||||||
|
if ( li.key() == currentLayout )
|
||||||
|
currentLayoutItem = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->listLayout->sortItems();
|
||||||
|
|
||||||
|
// Unblock signals
|
||||||
|
ui->listLayout->blockSignals( false );
|
||||||
|
|
||||||
|
// Set current layout
|
||||||
|
if ( currentLayoutItem )
|
||||||
|
ui->listLayout->setCurrentItem( currentLayoutItem );
|
||||||
|
else if ( ui->listLayout->count() > 0 )
|
||||||
|
ui->listLayout->setCurrentRow( 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KeyboardPage::onListLayoutCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )
|
||||||
|
{
|
||||||
|
LayoutItem *item = dynamic_cast< LayoutItem* >( current );
|
||||||
|
if ( !item )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Block signals
|
||||||
|
ui->listVariant->blockSignals( true );
|
||||||
|
|
||||||
|
QMap< QString, QString > variants = item->info.variants;
|
||||||
|
QMapIterator< QString, QString > li( variants );
|
||||||
|
LayoutItem* defaultItem = nullptr;
|
||||||
|
|
||||||
|
ui->listVariant->clear();
|
||||||
|
|
||||||
|
while ( li.hasNext() )
|
||||||
|
{
|
||||||
|
li.next();
|
||||||
|
|
||||||
|
item = new LayoutItem();
|
||||||
|
item->setText( li.key() );
|
||||||
|
item->data = li.value();
|
||||||
|
ui->listVariant->addItem( item );
|
||||||
|
|
||||||
|
if ( li.value() == "" )
|
||||||
|
defaultItem = item;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unblock signals
|
||||||
|
ui->listVariant->blockSignals( false );
|
||||||
|
|
||||||
|
// Set to default value
|
||||||
|
if ( defaultItem )
|
||||||
|
ui->listVariant->setCurrentItem( defaultItem );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KeyboardPage::onListVariantCurrentItemChanged( QListWidgetItem* current, QListWidgetItem* previous )
|
||||||
|
{
|
||||||
|
LayoutItem* layoutItem = dynamic_cast< LayoutItem* >( ui->listLayout->currentItem() );
|
||||||
|
LayoutItem* variantItem = dynamic_cast< LayoutItem* >( current );
|
||||||
|
|
||||||
|
if ( !layoutItem || !variantItem )
|
||||||
|
return;
|
||||||
|
|
||||||
|
QString layout = layoutItem->data;
|
||||||
|
QString variant = variantItem->data;
|
||||||
|
|
||||||
|
m_keyboardPreview->setLayout( layout );
|
||||||
|
m_keyboardPreview->setVariant( variant );
|
||||||
|
|
||||||
|
//emit checkReady();
|
||||||
|
|
||||||
|
// Set Xorg keyboard layout
|
||||||
|
QProcess::execute( QString( "setxkbmap -layout \"%1\" -variant \"%2\"" )
|
||||||
|
.arg( layout, variant ).toUtf8() );
|
||||||
|
}
|
||||||
|
|
66
src/modules/keyboard/KeyboardPage.h
Normal file
66
src/modules/keyboard/KeyboardPage.h
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Portions from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KEYBOARDPAGE_H
|
||||||
|
#define KEYBOARDPAGE_H
|
||||||
|
|
||||||
|
#include "keyboardwidget/keyboardglobal.h"
|
||||||
|
|
||||||
|
#include <QListWidgetItem>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class Page_Keyboard;
|
||||||
|
}
|
||||||
|
|
||||||
|
class KeyBoardPreview;
|
||||||
|
|
||||||
|
class KeyboardPage : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit KeyboardPage( QWidget* parent = nullptr );
|
||||||
|
virtual ~KeyboardPage();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
protected slots:
|
||||||
|
void onListLayoutCurrentItemChanged( QListWidgetItem* current,
|
||||||
|
QListWidgetItem* previous );
|
||||||
|
void onListVariantCurrentItemChanged( QListWidgetItem* current,
|
||||||
|
QListWidgetItem* previous );
|
||||||
|
|
||||||
|
private:
|
||||||
|
class LayoutItem : public QListWidgetItem {
|
||||||
|
public:
|
||||||
|
QString data;
|
||||||
|
KeyboardGlobal::KeyboardInfo info;
|
||||||
|
};
|
||||||
|
|
||||||
|
Ui::Page_Keyboard *ui;
|
||||||
|
KeyBoardPreview* m_keyboardPreview;
|
||||||
|
int m_defaultIndex;
|
||||||
|
QMap< QString, QString > m_models;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KEYBOARDPAGE_H
|
146
src/modules/keyboard/KeyboardPage.ui
Normal file
146
src/modules/keyboard/KeyboardPage.ui
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Page_Keyboard</class>
|
||||||
|
<widget class="QWidget" name="Page_Keyboard">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>830</width>
|
||||||
|
<height>573</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>12</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer_2">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="KBPreviewLayout"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label">
|
||||||
|
<property name="text">
|
||||||
|
<string>Keyboard Model:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="comboBoxModel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonRestore">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normaloff>:/images/restore.png</normaloff>:/images/restore.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>18</width>
|
||||||
|
<height>18</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>9</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="listLayout"/>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QListWidget" name="listVariant"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLineEdit" name="LE_TestKeyboard">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>50</weight>
|
||||||
|
<bold>false</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="inputMask">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="placeholderText">
|
||||||
|
<string>Type here to test your keyboard</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<tabstops>
|
||||||
|
<tabstop>comboBoxModel</tabstop>
|
||||||
|
<tabstop>listLayout</tabstop>
|
||||||
|
<tabstop>listVariant</tabstop>
|
||||||
|
<tabstop>LE_TestKeyboard</tabstop>
|
||||||
|
<tabstop>buttonRestore</tabstop>
|
||||||
|
</tabstops>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
87
src/modules/keyboard/KeyboardViewStep.cpp
Normal file
87
src/modules/keyboard/KeyboardViewStep.cpp
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "KeyboardViewStep.h"
|
||||||
|
|
||||||
|
#include "KeyboardPage.h"
|
||||||
|
|
||||||
|
|
||||||
|
KeyboardViewStep::KeyboardViewStep( QObject* parent )
|
||||||
|
: Calamares::ViewStep( parent )
|
||||||
|
, m_widget( new KeyboardPage() )
|
||||||
|
, m_nextEnabled( false )
|
||||||
|
{
|
||||||
|
m_widget->init();
|
||||||
|
m_nextEnabled = true;
|
||||||
|
emit nextStatusChanged( m_nextEnabled );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
KeyboardViewStep::~KeyboardViewStep()
|
||||||
|
{
|
||||||
|
if ( m_widget && m_widget->parent() == nullptr )
|
||||||
|
m_widget->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QString
|
||||||
|
KeyboardViewStep::prettyName() const
|
||||||
|
{
|
||||||
|
return tr( "Keyboard" );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QWidget*
|
||||||
|
KeyboardViewStep::widget()
|
||||||
|
{
|
||||||
|
return m_widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KeyboardViewStep::next()
|
||||||
|
{
|
||||||
|
//TODO: actually save those settings somewhere
|
||||||
|
emit done();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KeyboardViewStep::back()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
KeyboardViewStep::isNextEnabled() const
|
||||||
|
{
|
||||||
|
return m_nextEnabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
KeyboardViewStep::isAtBeginning() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
KeyboardViewStep::isAtEnd() const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
57
src/modules/keyboard/KeyboardViewStep.h
Normal file
57
src/modules/keyboard/KeyboardViewStep.h
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KEYBOARDVIEWSTEP_H
|
||||||
|
#define KEYBOARDVIEWSTEP_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "viewpages/ViewStep.h"
|
||||||
|
#include "PluginDllMacro.h"
|
||||||
|
|
||||||
|
class KeyboardPage;
|
||||||
|
|
||||||
|
class PLUGINDLLEXPORT KeyboardViewStep : public Calamares::ViewStep
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_PLUGIN_METADATA( IID "calamares.ViewModule/1.0" )
|
||||||
|
|
||||||
|
Q_INTERFACES( Calamares::ViewStep )
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit KeyboardViewStep( QObject* parent = nullptr );
|
||||||
|
virtual ~KeyboardViewStep();
|
||||||
|
|
||||||
|
QString prettyName() const override;
|
||||||
|
|
||||||
|
QWidget* widget() override;
|
||||||
|
|
||||||
|
void next() override;
|
||||||
|
void back() override;
|
||||||
|
|
||||||
|
bool isNextEnabled() const override;
|
||||||
|
|
||||||
|
bool isAtBeginning() const override;
|
||||||
|
bool isAtEnd() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
KeyboardPage* m_widget;
|
||||||
|
bool m_nextEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KEYBOARDVIEWSTEP_H
|
5
src/modules/keyboard/README.md
Normal file
5
src/modules/keyboard/README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Keyboard layout configuration viewmodule
|
||||||
|
---
|
||||||
|
Requires ckbcomp script.
|
||||||
|
* Debian package console-setup or
|
||||||
|
* Manjaro package keyboardctl https://github.com/manjaro/packages-core/tree/master/keyboardctl
|
BIN
src/modules/keyboard/images/restore.png
Normal file
BIN
src/modules/keyboard/images/restore.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 876 B |
171
src/modules/keyboard/keyboardwidget/keyboardglobal.cpp
Normal file
171
src/modules/keyboard/keyboardwidget/keyboardglobal.cpp
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Originally from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "keyboardglobal.h"
|
||||||
|
|
||||||
|
//###
|
||||||
|
//### Public methods
|
||||||
|
//###
|
||||||
|
|
||||||
|
|
||||||
|
QMap<QString, KeyboardGlobal::KeyboardInfo> KeyboardGlobal::getKeyboardLayouts() {
|
||||||
|
return parseKeyboardLayouts(XKB_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QMap<QString, QString> KeyboardGlobal::getKeyboardModels() {
|
||||||
|
return parseKeyboardModels(XKB_FILE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//###
|
||||||
|
//### Private methods
|
||||||
|
//###
|
||||||
|
|
||||||
|
|
||||||
|
//### Source by Georg Grabler <ggrabler@gmail.com> ###//
|
||||||
|
QMap<QString, QString> KeyboardGlobal::parseKeyboardModels(QString filepath)
|
||||||
|
{
|
||||||
|
QMap<QString, QString> models;
|
||||||
|
|
||||||
|
QFile fh(filepath);
|
||||||
|
fh.open(QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
if (!fh.isOpen()) {
|
||||||
|
qDebug() << "X11 Keyboard model definitions not found!";
|
||||||
|
return models;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool modelsFound = false;
|
||||||
|
// read the file until the end or until we break the loop
|
||||||
|
while (!fh.atEnd()) {
|
||||||
|
QByteArray line = fh.readLine();
|
||||||
|
|
||||||
|
// check if we start with the model section in the file
|
||||||
|
if (!modelsFound && line.startsWith("! model"))
|
||||||
|
modelsFound = true;
|
||||||
|
else if (modelsFound && line.startsWith ("!"))
|
||||||
|
break;
|
||||||
|
else if (!modelsFound)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// here we are in the model section, otherwhise we would continue or break
|
||||||
|
QRegExp rx;
|
||||||
|
rx.setPattern("^\\s+(\\S+)\\s+(\\w.*)\n$");
|
||||||
|
|
||||||
|
// insert into the model map
|
||||||
|
if (rx.indexIn(line) != -1) {
|
||||||
|
QString modelDesc = rx.cap(2);
|
||||||
|
QString model = rx.cap(1);
|
||||||
|
|
||||||
|
if (model == "pc105")
|
||||||
|
modelDesc += " - " + QObject::tr("Default Keyboard Model");
|
||||||
|
|
||||||
|
models.insert(modelDesc, model);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return models;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QMap< QString, KeyboardGlobal::KeyboardInfo > KeyboardGlobal::parseKeyboardLayouts(QString filepath)
|
||||||
|
{
|
||||||
|
QMap< QString, KeyboardInfo > layouts;
|
||||||
|
|
||||||
|
//### Get Layouts ###//
|
||||||
|
|
||||||
|
QFile fh(filepath);
|
||||||
|
fh.open(QIODevice::ReadOnly);
|
||||||
|
|
||||||
|
if (!fh.isOpen()) {
|
||||||
|
qDebug() << "X11 Keyboard layout definitions not found!";
|
||||||
|
return layouts;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool layoutsFound = false;
|
||||||
|
// read the file until the end or we break the loop
|
||||||
|
while (!fh.atEnd()) {
|
||||||
|
QByteArray line = fh.readLine();
|
||||||
|
|
||||||
|
// find the layout section otherwhise continue. If the layout section is at it's end, break the loop
|
||||||
|
if (!layoutsFound && line.startsWith("! layout"))
|
||||||
|
layoutsFound = true;
|
||||||
|
else if (layoutsFound && line.startsWith ("!"))
|
||||||
|
break;
|
||||||
|
else if (!layoutsFound)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QRegExp rx;
|
||||||
|
rx.setPattern("^\\s+(\\S+)\\s+(\\w.*)\n$");
|
||||||
|
|
||||||
|
// insert into the layout map
|
||||||
|
if (rx.indexIn(line) != -1) {
|
||||||
|
KeyboardInfo info;
|
||||||
|
info.description = rx.cap(2);
|
||||||
|
info.variants.insert(QObject::tr("Default"), "");
|
||||||
|
layouts.insert(rx.cap(1), info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fh.reset();
|
||||||
|
|
||||||
|
|
||||||
|
//### Get Variants ###//
|
||||||
|
|
||||||
|
bool variantsFound = false;
|
||||||
|
// read the file until the end or until we break
|
||||||
|
while (!fh.atEnd()) {
|
||||||
|
QByteArray line = fh.readLine();
|
||||||
|
|
||||||
|
// continue until we found the variant section. If found, read until the next section is found
|
||||||
|
if (!variantsFound && line.startsWith("! variant")) {
|
||||||
|
variantsFound = true;
|
||||||
|
continue;
|
||||||
|
} else if (variantsFound && line.startsWith ("!"))
|
||||||
|
break;
|
||||||
|
else if (!variantsFound)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QRegExp rx;
|
||||||
|
rx.setPattern("^\\s+(\\S+)\\s+(\\S+): (\\w.*)\n$");
|
||||||
|
|
||||||
|
// insert into the variants multimap, if the pattern matches
|
||||||
|
if (rx.indexIn(line) != -1) {
|
||||||
|
if (layouts.find(rx.cap(2)) != layouts.end()) {
|
||||||
|
// in this case we found an entry in the multimap, and add the values to the multimap
|
||||||
|
layouts.find(rx.cap(2)).value().variants.insert(rx.cap(3), rx.cap(1));
|
||||||
|
} else {
|
||||||
|
// create a new map in the multimap - the value was not found.
|
||||||
|
KeyboardInfo info;
|
||||||
|
info.description = rx.cap(2);
|
||||||
|
info.variants.insert(QObject::tr("Default"), "");
|
||||||
|
info.variants.insert(rx.cap(3), rx.cap(1));
|
||||||
|
layouts.insert(rx.cap(2), info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return layouts;
|
||||||
|
}
|
55
src/modules/keyboard/keyboardwidget/keyboardglobal.h
Normal file
55
src/modules/keyboard/keyboardwidget/keyboardglobal.h
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Originally from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KEYBOARDGLOBAL_H
|
||||||
|
#define KEYBOARDGLOBAL_H
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QTextStream>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QList>
|
||||||
|
#include <QHash>
|
||||||
|
#include <QMap>
|
||||||
|
#include <QRegExp>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#define XKB_FILE "/usr/share/X11/xkb/rules/base.lst"
|
||||||
|
|
||||||
|
class KeyboardGlobal
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct KeyboardInfo {
|
||||||
|
QString description;
|
||||||
|
QMap< QString, QString > variants;
|
||||||
|
};
|
||||||
|
|
||||||
|
static QMap< QString, KeyboardInfo > getKeyboardLayouts();
|
||||||
|
static QMap< QString, QString > getKeyboardModels();
|
||||||
|
|
||||||
|
private:
|
||||||
|
static QMap< QString, QString > parseKeyboardModels(QString filepath);
|
||||||
|
static QMap< QString, KeyboardInfo > parseKeyboardLayouts(QString filepath);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KEYBOARDGLOBAL_H
|
327
src/modules/keyboard/keyboardwidget/keyboardpreview.cpp
Normal file
327
src/modules/keyboard/keyboardwidget/keyboardpreview.cpp
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Portions from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "keyboardpreview.h"
|
||||||
|
|
||||||
|
KeyBoardPreview::KeyBoardPreview(QWidget *parent) :
|
||||||
|
QWidget(parent)
|
||||||
|
{
|
||||||
|
setMinimumSize(700, 190);
|
||||||
|
|
||||||
|
layout = "us";
|
||||||
|
|
||||||
|
// We must set up the font size in pixels to fit the keys
|
||||||
|
lowerFont = QFont("Helvetica", 10, QFont::DemiBold);
|
||||||
|
lowerFont.setPixelSize(16);
|
||||||
|
upperFont = QFont("Helvetica", 8);
|
||||||
|
upperFont.setPixelSize(13);
|
||||||
|
|
||||||
|
// Setup keyboard types
|
||||||
|
kbList[KB_104].kb_extended_return = false;
|
||||||
|
kbList[KB_104].keys.append(QList<int>() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd);
|
||||||
|
kbList[KB_104].keys.append(QList<int>() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b << 0x2b);
|
||||||
|
kbList[KB_104].keys.append(QList<int>() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28);
|
||||||
|
kbList[KB_104].keys.append(QList<int>() << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35);
|
||||||
|
|
||||||
|
kbList[KB_105].kb_extended_return = true;
|
||||||
|
kbList[KB_105].keys.append(QList<int>() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd);
|
||||||
|
kbList[KB_105].keys.append(QList<int>() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b);
|
||||||
|
kbList[KB_105].keys.append(QList<int>() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28 << 0x2b);
|
||||||
|
kbList[KB_105].keys.append(QList<int>() << 0x54 << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35);
|
||||||
|
|
||||||
|
kbList[KB_106].kb_extended_return = true;
|
||||||
|
kbList[KB_106].keys.append(QList<int>() << 0x29 << 0x2 << 0x3 << 0x4 << 0x5 << 0x6 << 0x7 << 0x8 << 0x9 << 0xa << 0xb << 0xc << 0xd << 0xe);
|
||||||
|
kbList[KB_106].keys.append(QList<int>() << 0x10 << 0x11 << 0x12 << 0x13 << 0x14 << 0x15 << 0x16 << 0x17 << 0x18 << 0x19 << 0x1a << 0x1b);
|
||||||
|
kbList[KB_106].keys.append(QList<int>() << 0x1e << 0x1f << 0x20 << 0x21 << 0x22 << 0x23 << 0x24 << 0x25 << 0x26 << 0x27 << 0x28 << 0x29);
|
||||||
|
kbList[KB_106].keys.append(QList<int>() << 0x2c << 0x2d << 0x2e << 0x2f << 0x30 << 0x31 << 0x32 << 0x33 << 0x34 << 0x35 << 0x36);
|
||||||
|
|
||||||
|
kb = &kbList[KB_104];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KeyBoardPreview::setLayout(QString layout) {
|
||||||
|
this->layout = layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KeyBoardPreview::setVariant(QString variant) {
|
||||||
|
this->variant = variant;
|
||||||
|
|
||||||
|
if (!loadCodes())
|
||||||
|
return;
|
||||||
|
|
||||||
|
loadInfo();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//###
|
||||||
|
//### Private
|
||||||
|
//###
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KeyBoardPreview::loadInfo() {
|
||||||
|
// kb_104
|
||||||
|
if (layout == "us" || layout == "th")
|
||||||
|
kb = &kbList[KB_104];
|
||||||
|
// kb_106
|
||||||
|
else if (layout == "jp")
|
||||||
|
kb = &kbList[KB_106];
|
||||||
|
// most keyboards are 105 key so default to that
|
||||||
|
else
|
||||||
|
kb = &kbList[KB_105];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool KeyBoardPreview::loadCodes() {
|
||||||
|
if (layout.isEmpty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QStringList param;
|
||||||
|
param << "-model" << "pc106" << "-layout" << layout << "-compact";
|
||||||
|
if (!variant.isEmpty())
|
||||||
|
param << "-variant" << variant;
|
||||||
|
|
||||||
|
|
||||||
|
QProcess process;
|
||||||
|
process.setEnvironment(QStringList() << "LANG=C" << "LC_MESSAGES=C");
|
||||||
|
process.start("ckbcomp", param);
|
||||||
|
if (!process.waitForStarted())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!process.waitForFinished())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Clear codes
|
||||||
|
codes.clear();
|
||||||
|
|
||||||
|
QStringList list = QString(process.readAll()).split("\n", QString::SkipEmptyParts);
|
||||||
|
|
||||||
|
foreach(QString line, list) {
|
||||||
|
if (!line.startsWith("keycode") || !line.contains('='))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
QStringList split = line.split('=').at(1).trimmed().split(' ');
|
||||||
|
if (split.size() < 4)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Code code;
|
||||||
|
code.plain = fromUnicodeString(split.at(0));
|
||||||
|
code.shift = fromUnicodeString(split.at(1));
|
||||||
|
code.ctrl = fromUnicodeString(split.at(2));
|
||||||
|
code.alt = fromUnicodeString(split.at(3));
|
||||||
|
|
||||||
|
if (code.ctrl == code.plain)
|
||||||
|
code.ctrl = "";
|
||||||
|
|
||||||
|
if (code.alt == code.plain)
|
||||||
|
code.alt = "";
|
||||||
|
|
||||||
|
codes.append(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString KeyBoardPreview::fromUnicodeString(QString raw) {
|
||||||
|
if (raw.startsWith("U+"))
|
||||||
|
return QChar(raw.mid(2).toInt(0, 16));
|
||||||
|
else if (raw.startsWith("+U"))
|
||||||
|
return QChar(raw.mid(3).toInt(0, 16));
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString KeyBoardPreview::regular_text(int index) {
|
||||||
|
if (index < 0 || index >= codes.size())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return codes.at(index - 1).plain;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString KeyBoardPreview::shift_text(int index) {
|
||||||
|
if (index < 0 || index >= codes.size())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return codes.at(index - 1).shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString KeyBoardPreview::ctrl_text(int index) {
|
||||||
|
if (index < 0 || index >= codes.size())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return codes.at(index - 1).ctrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
QString KeyBoardPreview::alt_text(int index) {
|
||||||
|
if (index < 0 || index >= codes.size())
|
||||||
|
return "";
|
||||||
|
|
||||||
|
return codes.at(index - 1).alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KeyBoardPreview::resizeEvent(QResizeEvent *) {
|
||||||
|
space = 6;
|
||||||
|
usable_width = width()-6;
|
||||||
|
key_w = (usable_width - 14 * space)/15;
|
||||||
|
|
||||||
|
setMaximumHeight(key_w*4 + space*5);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void KeyBoardPreview::paintEvent(QPaintEvent * event) {
|
||||||
|
QPainter p(this);
|
||||||
|
p.setRenderHint(QPainter::Antialiasing);
|
||||||
|
|
||||||
|
p.setBrush(QColor(0xd6, 0xd6, 0xd6));
|
||||||
|
p.drawRect(rect());
|
||||||
|
|
||||||
|
QPen pen;
|
||||||
|
pen.setWidth(1);
|
||||||
|
pen.setColor(QColor(0x58, 0x58, 0x58));
|
||||||
|
p.setPen(pen);
|
||||||
|
|
||||||
|
p.setBrush(QColor(0x58, 0x58, 0x58));
|
||||||
|
|
||||||
|
p.setBackgroundMode(Qt::TransparentMode);
|
||||||
|
|
||||||
|
int rx = 3;
|
||||||
|
int x=6;
|
||||||
|
int y=6;
|
||||||
|
int first_key_w = 0;
|
||||||
|
int remaining_x[] = {0,0,0,0};
|
||||||
|
int remaining_widths[] = {0,0,0,0};
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
if (first_key_w > 0) {
|
||||||
|
first_key_w = first_key_w*1.375;
|
||||||
|
|
||||||
|
if (kb == &kbList[KB_105] && i == 3)
|
||||||
|
first_key_w = key_w * 1.275;
|
||||||
|
|
||||||
|
p.drawRoundedRect(QRectF(6, y, first_key_w, key_w), rx, rx);
|
||||||
|
x = 6 + first_key_w + space;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
first_key_w = key_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
bool last_end = (i==1 && ! kb->kb_extended_return);
|
||||||
|
int rw=usable_width-x;
|
||||||
|
int ii=0;
|
||||||
|
|
||||||
|
foreach (int k, kb->keys.at(i)) {
|
||||||
|
QRectF rect = QRectF(x, y, key_w, key_w);
|
||||||
|
|
||||||
|
if (ii == kb->keys.at(i).size()-1 && last_end)
|
||||||
|
rect.setWidth(rw);
|
||||||
|
|
||||||
|
p.drawRoundedRect(rect, rx, rx);
|
||||||
|
|
||||||
|
rect.adjust(5, 1, 0, 0);
|
||||||
|
|
||||||
|
p.setPen(QColor(0x9e, 0xde, 0x00));
|
||||||
|
p.setFont(upperFont);
|
||||||
|
p.drawText(rect, Qt::AlignLeft | Qt::AlignTop, shift_text(k));
|
||||||
|
|
||||||
|
rect.setBottom(rect.bottom() - 2.5);
|
||||||
|
|
||||||
|
p.setPen(QColor(0xff, 0xff, 0xff));
|
||||||
|
p.setFont(lowerFont);
|
||||||
|
p.drawText(rect, Qt::AlignLeft | Qt::AlignBottom, regular_text(k));
|
||||||
|
|
||||||
|
rw = rw - space - key_w;
|
||||||
|
x = x + space + key_w;
|
||||||
|
ii = ii+1;
|
||||||
|
|
||||||
|
p.setPen(pen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
remaining_x[i] = x;
|
||||||
|
remaining_widths[i] = rw;
|
||||||
|
|
||||||
|
if (i != 1 && i != 2)
|
||||||
|
p.drawRoundedRect(QRectF(x, y, rw, key_w), rx, rx);
|
||||||
|
|
||||||
|
x=.5;
|
||||||
|
y = y + space + key_w;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (kb->kb_extended_return) {
|
||||||
|
rx=rx*2;
|
||||||
|
int x1 = remaining_x[1];
|
||||||
|
int y1 = 6 + key_w*1 + space*1;
|
||||||
|
int w1 = remaining_widths[1];
|
||||||
|
int x2 = remaining_x[2];
|
||||||
|
int y2 = 6 + key_w*2 + space*2;
|
||||||
|
|
||||||
|
// this is some serious crap... but it has to be so
|
||||||
|
// maybe one day keyboards won't look like this...
|
||||||
|
// one can only hope
|
||||||
|
QPainterPath pp;
|
||||||
|
pp.moveTo(x1, y1+rx);
|
||||||
|
pp.arcTo(x1, y1, rx, rx, 180, -90);
|
||||||
|
pp.lineTo(x1+w1-rx, y1);
|
||||||
|
pp.arcTo(x1+w1-rx, y1, rx, rx, 90, -90);
|
||||||
|
pp.lineTo(x1+w1, y2+key_w-rx);
|
||||||
|
pp.arcTo(x1+w1-rx, y2+key_w-rx, rx, rx, 0, -90);
|
||||||
|
pp.lineTo(x2+rx, y2+key_w);
|
||||||
|
pp.arcTo(x2, y2+key_w-rx, rx, rx, -90, -90);
|
||||||
|
pp.lineTo(x2, y1+key_w);
|
||||||
|
pp.lineTo(x1+rx, y1+key_w);
|
||||||
|
pp.arcTo(x1, y1+key_w-rx, rx, rx, -90, -90);
|
||||||
|
pp.closeSubpath();
|
||||||
|
|
||||||
|
p.drawPath(pp);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x= remaining_x[2];
|
||||||
|
y = 6 + key_w*2 + space*2;
|
||||||
|
p.drawRoundedRect(QRectF(x, y, remaining_widths[2], key_w), rx, rx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QWidget::paintEvent(event);
|
||||||
|
}
|
80
src/modules/keyboard/keyboardwidget/keyboardpreview.h
Normal file
80
src/modules/keyboard/keyboardwidget/keyboardpreview.h
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Portions from the Manjaro Installation Framework
|
||||||
|
* by Roland Singer <roland@manjaro.org>
|
||||||
|
* Copyright (C) 2007 Free Software Foundation, Inc.
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef KEYBOARDPREVIEW_H
|
||||||
|
#define KEYBOARDPREVIEW_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QRectF>
|
||||||
|
#include <QFont>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QPen>
|
||||||
|
#include <QPainterPath>
|
||||||
|
#include <QColor>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
|
||||||
|
class KeyBoardPreview : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit KeyBoardPreview(QWidget *parent = 0);
|
||||||
|
|
||||||
|
void setLayout(QString layout);
|
||||||
|
void setVariant(QString variant);
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum KB_TYPE { KB_104, KB_105, KB_106 };
|
||||||
|
|
||||||
|
struct KB {
|
||||||
|
bool kb_extended_return;
|
||||||
|
QList<QList<int> > keys;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct Code {
|
||||||
|
QString plain, shift, ctrl, alt;
|
||||||
|
};
|
||||||
|
|
||||||
|
QString layout, variant;
|
||||||
|
QFont lowerFont, upperFont;
|
||||||
|
KB *kb, kbList[3];
|
||||||
|
QList<Code> codes;
|
||||||
|
int space, usable_width, key_w;
|
||||||
|
|
||||||
|
void loadInfo();
|
||||||
|
bool loadCodes();
|
||||||
|
QString regular_text(int index);
|
||||||
|
QString shift_text(int index);
|
||||||
|
QString ctrl_text(int index);
|
||||||
|
QString alt_text(int index);
|
||||||
|
QString fromUnicodeString(QString raw);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent * event);
|
||||||
|
void resizeEvent(QResizeEvent * event);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // KEYBOARDPREVIEW_H
|
8
src/modules/keyboard/module.conf
Normal file
8
src/modules/keyboard/module.conf
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# Module metadata file for keyboard viewmodule
|
||||||
|
# Syntax is YAML 1.2
|
||||||
|
---
|
||||||
|
type: "view"
|
||||||
|
name: "keyboard"
|
||||||
|
interface: "qtplugin"
|
||||||
|
requires: []
|
||||||
|
load: "libcalamares_viewmodule_keyboard.so"
|
5
src/modules/keyboard/resources.qrc
Normal file
5
src/modules/keyboard/resources.qrc
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>images/restore.png</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
Loading…
Reference in New Issue
Block a user