Various improvements to NxWM hex calculator display

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4767 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2012-05-23 12:53:57 +00:00
parent f6f6b80f16
commit 70c2bc8810
4 changed files with 69 additions and 5 deletions

View File

@ -153,3 +153,5 @@
in the font is wrong. Fixed in CButtonArrary, but the problem
probably exists in other places as well.
* NxWM: Increase default spacing of icons on the Start Window.
* NxWM::CHexCalculator: Fix some non-standard calculator behavior
after = is pressed. Use upper case hex. Increase font size.

View File

@ -48,6 +48,7 @@
#include "cbuttonarray.hxx"
#include "clabel.hxx"
#include "cnxfont.hxx"
#include "iapplication.hxx"
#include "capplicationwindow.hxx"
@ -104,6 +105,7 @@ namespace NxWM
NXWidgets::CButtonArray *m_keypad; /**< The calculator keyboard */
NXWidgets::CLabel *m_text; /**< The accumulator text display */
NXWidgets::CNxFont *m_font; /**< The font used in the calculator */
/**
* Calculator geometry. This stuff does not really have to be retained
@ -132,6 +134,7 @@ namespace NxWM
struct SPendingOperation m_low; /**< Low precedence pending operation */
struct SPendingOperation m_high; /**< Hight precedence pending operation */
bool m_hexMode; /**< True if in hex mode */
bool m_result ; /**< True if the accumulator holds a previoius result */
/**
* Select the geometry of the calculator given the current window size.

View File

@ -517,6 +517,8 @@
* calculator display. Default: Same as CONFIG_NXWM_DEFAULT_BACKGROUNDCOLOR
* CONFIG_NXWM_HEXCALCULATOR_ICON - The ICON to use for the hex calculator
* application. Default: NxWM::g_calculatorBitmap
* CONFIG_NXWM_HEXCALCULATOR_FONTID - The font used with the calculator.
* Default: CONFIG_NXWM_DEFAULT_FONTID
*/
#ifndef CONFIG_NXWM_HEXCALCULATOR_BACKGROUNDCOLOR
@ -527,6 +529,10 @@
# define CONFIG_NXWM_HEXCALCULATOR_ICON NxWM::g_calculatorBitmap
#endif
#ifndef CONFIG_NXWM_HEXCALCULATOR_FONTID
# define CONFIG_NXWM_HEXCALCULATOR_FONTID CONFIG_NXWM_DEFAULT_FONTID
#endif
/****************************************************************************
* Global Function Prototypes
****************************************************************************/

View File

@ -210,6 +210,7 @@ CHexCalculator::CHexCalculator(CTaskbar *taskbar, CApplicationWindow *window)
m_keypad = (NXWidgets::CButtonArray *)0;
m_text = (NXWidgets::CLabel *)0;
m_font = (NXWidgets::CNxFont *)0;
// Reset other values
@ -219,7 +220,8 @@ CHexCalculator::CHexCalculator(CTaskbar *taskbar, CApplicationWindow *window)
m_high.value = 0;
m_low.operation = (uint8_t)KEY_NONE; // No pending high precedence operation
m_low.value = 0;
m_hexMode = 0; // Decimal mode
m_hexMode = false; // Decimal mode
m_result = false; // Accumulator does not hot a result
// Add our personalized window label
@ -255,6 +257,11 @@ CHexCalculator::~CHexCalculator(void)
delete m_keypad;
}
if (m_font)
{
delete m_font;
}
// Although we didn't create it, we are responsible for deleting the
// application window
@ -489,6 +496,17 @@ void CHexCalculator::setGeometry(void)
bool CHexCalculator::createCalculator(void)
{
// Select a font for the calculator
m_font = new NXWidgets::CNxFont((nx_fontid_e)CONFIG_NXWM_HEXCALCULATOR_FONTID,
CONFIG_NXWM_DEFAULT_FONTCOLOR,
CONFIG_NXWM_TRANSPARENT_COLOR);
if (!m_font)
{
gdbg("ERROR failed to create font\n");
return false;
}
// Get the widget control associated with the application window
NXWidgets::CWidgetControl *control = m_window->getWidgetControl();
@ -511,6 +529,10 @@ bool CHexCalculator::createCalculator(void)
m_keypad->disableDrawing();
m_keypad->setRaisesEvents(false);
// Select the font
m_keypad->setFont(m_font);
// Register to receive events from the keypad
m_keypad->addWidgetEventHandler(this);
@ -536,6 +558,10 @@ bool CHexCalculator::createCalculator(void)
m_text->disableDrawing();
m_text->setRaisesEvents(false);
// Select the font
m_text->setFont(m_font);
return true;
}
@ -645,7 +671,7 @@ void CHexCalculator::updateText(void)
if (m_hexMode)
{
std::snprintf(buffer, 24, "%16llx", m_accum);
std::snprintf(buffer, 24, "%16llX", m_accum);
}
else
{
@ -707,13 +733,25 @@ void CHexCalculator::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
// Process the keypress
bool result = false;
switch (g_keyDesc[index].keyType)
{
// Values: {0-9, A-F}
case KEY_VALUE: // Key is a value
{
if (m_hexMode)
// If the accumulator current holds the result of a previous
// operation, then start fresh
if (m_result)
{
m_accum = (uint64_t)g_keyDesc[index].value;
}
// Otherwise, add the new value to the accumulator. The way
// in which it is added depends on the mode
else if (m_hexMode)
{
m_accum <<= 4;
m_accum |= (uint64_t)g_keyDesc[index].value;
@ -770,9 +808,12 @@ void CHexCalculator::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
m_low.operation = (uint8_t) g_keyDesc[index].keyType;
m_low.value = m_accum;
m_accum = 0;
// Update the display with the value in the accumulator, but
// then clear the accumulator in preparation for the next input
updateText();
m_accum = 0;
}
break;
@ -795,9 +836,12 @@ void CHexCalculator::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
m_high.operation = (uint8_t) g_keyDesc[index].keyType;
m_high.value = m_accum;
m_accum = 0;
// Update the display with the value in the accumulator, but
// then clear the accumulator in preparation for the next input
updateText();
m_accum = 0;
}
break;
@ -823,7 +867,12 @@ void CHexCalculator::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
m_low.value = 0;
}
// Update the display with the value in the accumulator. Flag that
// this is a result meaning that (1) it can be used as an accumulator
// for the next operation, but new input values cannot be appended to it.
updateText();
result = true;
}
break;
@ -897,6 +946,10 @@ void CHexCalculator::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
gdbg("ERROR: Invalid key type %d\n", g_keyDesc[index].keyType);
break;
}
// Remember if the accumulator contains a special reault
m_result = result;
}
}