mirror of
https://github.com/apache/nuttx-apps.git
synced 2025-07-17 11:44:15 +08:00

Gregory Nutt is the copyright holder for those files and he has submitted the SGA as a result we can migrate the licenses to Apache. Signed-off-by: Alin Jerpelea <alin.jerpelea@sony.com>
199 lines
5.8 KiB
C++
199 lines
5.8 KiB
C++
/****************************************************************************
|
|
* apps/graphics/nxwidgets/src/ckeypad.cxx
|
|
*
|
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
* contributor license agreements. See the NOTICE file distributed with
|
|
* this work for additional information regarding copyright ownership. The
|
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
|
* "License"); you may not use this file except in compliance with the
|
|
* License. You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
* License for the specific language governing permissions and limitations
|
|
* under the License.
|
|
*
|
|
****************************************************************************/
|
|
|
|
/****************************************************************************
|
|
* Included Files
|
|
****************************************************************************/
|
|
|
|
#include <nuttx/config.h>
|
|
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include <nuttx/nx/nx.h>
|
|
#include <nuttx/nx/nxglib.h>
|
|
|
|
#include "graphics/nxwidgets/cwidgetcontrol.hxx"
|
|
#include "graphics/nxwidgets/cwidgetstyle.hxx"
|
|
#include "graphics/nxwidgets/ckeypad.hxx"
|
|
|
|
/****************************************************************************
|
|
* Pre-Processor Definitions
|
|
****************************************************************************/
|
|
|
|
// The geometry of the button array
|
|
|
|
#define BUTTONARRAY_NCOLUMNS 4
|
|
#define BUTTONARRAY_NROWS 7
|
|
|
|
/****************************************************************************
|
|
* Private Data
|
|
****************************************************************************/
|
|
|
|
using namespace NXWidgets;
|
|
|
|
static FAR const char *g_alphaLabels[BUTTONARRAY_NCOLUMNS*BUTTONARRAY_NROWS] = {
|
|
"=>", "A", "B", "<DEL",
|
|
"C", "D", "E", "F",
|
|
"G", "H", "I", "J",
|
|
"K", "L", "M", "N",
|
|
"O", "P", "Q", "R",
|
|
"S", "T", "U", "V",
|
|
"W", "X", "Y", "Z"
|
|
};
|
|
|
|
static FAR const char *g_numLabels[BUTTONARRAY_NCOLUMNS*BUTTONARRAY_NROWS] = {
|
|
"=>", "0", "1", "<DEL",
|
|
"2", "3", "4", "5",
|
|
"6", "7", "8", "9",
|
|
"-", "#", "*", "&",
|
|
"?", "!", "@", "%",
|
|
":", ",", ".", "/",
|
|
"\"", "'", "(", ")"
|
|
};
|
|
|
|
/****************************************************************************
|
|
* Method Implementations
|
|
****************************************************************************/
|
|
|
|
/**
|
|
* Constructor for buttons that display a string.
|
|
*
|
|
* @param pWidgetControl The widget control for the display.
|
|
* @param hNxServer The NX server that will receive the keyboard input
|
|
* @param x The x coordinate of the keypad, relative to its parent.
|
|
* @param y The y coordinate of the keypad, relative to its parent.
|
|
* @param width The width of the keypad
|
|
* @param height The height of the keypad
|
|
* @param style The style that the button should use. If this is not
|
|
* specified, the button will use the global default widget
|
|
* style.
|
|
*/
|
|
|
|
CKeypad::CKeypad(CWidgetControl *pWidgetControl, NXHANDLE hNxServer,
|
|
nxgl_coord_t x, nxgl_coord_t y,
|
|
nxgl_coord_t width, nxgl_coord_t height,
|
|
CWidgetStyle *style)
|
|
: CButtonArray(pWidgetControl, x, y, 4, 7, width / BUTTONARRAY_NCOLUMNS,
|
|
height / BUTTONARRAY_NROWS, style)
|
|
{
|
|
m_hNxServer = hNxServer;
|
|
|
|
// Force the height and width to be an exact multiple of the button height and width
|
|
|
|
resize(m_buttonWidth * m_buttonColumns, m_buttonHeight * m_buttonRows);
|
|
|
|
// Start in alphabetic mode
|
|
|
|
setKeypadMode(false);
|
|
}
|
|
|
|
/**
|
|
* Catch button clicks.
|
|
*
|
|
* @param x The x coordinate of the click.
|
|
* @param y The y coordinate of the click.
|
|
*/
|
|
|
|
void CKeypad::onClick(nxgl_coord_t x, nxgl_coord_t y)
|
|
{
|
|
// Perform the redraw
|
|
|
|
CButtonArray::onClick(x, y);
|
|
|
|
// The button should now be clicked
|
|
|
|
int column;
|
|
int row;
|
|
|
|
if (isButtonClicked(column, row))
|
|
{
|
|
// The left arrow at (0,0) is a special case
|
|
|
|
char ch;
|
|
if (column == 0 && row == 0)
|
|
{
|
|
m_widgetControl->newCursorControlEvent(CURSOR_RIGHT);
|
|
return;
|
|
}
|
|
|
|
// The backspace at (3,0) is a special case
|
|
|
|
else if (column == 3 && row == 0)
|
|
{
|
|
ch = KEY_CODE_BACKSPACE;
|
|
}
|
|
|
|
// Otherwise, just grab the character for the arrays
|
|
|
|
else
|
|
{
|
|
int index = row * BUTTONARRAY_NCOLUMNS + column;
|
|
FAR const char *ptr;
|
|
if (m_numeric)
|
|
{
|
|
ptr = g_numLabels[index];
|
|
}
|
|
else
|
|
{
|
|
ptr = g_alphaLabels[index];
|
|
}
|
|
|
|
ch = ptr[0];
|
|
}
|
|
|
|
// Then inject the keyboard input into the NX server. The NX
|
|
// server will determine which window receives the input.
|
|
// The ultimate recipient will be the widget in the top window
|
|
// that has focus.
|
|
|
|
nx_kbdchin(m_hNxServer, (uint8_t)ch);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Configure the keypad for the currently selected display mode.
|
|
*/
|
|
|
|
void CKeypad::configureKeypadMode(void)
|
|
{
|
|
// Add the labels to each button. Each call to setText would
|
|
// cause a text change event and, hence, redrawing of the
|
|
|
|
FAR const char **ptr = m_numeric ? g_numLabels : g_alphaLabels;
|
|
for (int j = 0; j < BUTTONARRAY_NROWS; j++)
|
|
{
|
|
for (int i = 0; i < BUTTONARRAY_NCOLUMNS; i++)
|
|
{
|
|
// setText does this. But each call to setText would
|
|
// cause a text change even and, hence, redrawing of
|
|
// the whole keypad. So we access the protected data
|
|
// directly and redraw only once.
|
|
|
|
CNxString string = *ptr++;
|
|
m_buttonText[j * m_buttonColumns + i] = string;
|
|
}
|
|
}
|
|
|
|
// Then redraw the display
|
|
|
|
onTextChange();
|
|
}
|