Misc changes related to MediaPlayer. Nothing really significant

This commit is contained in:
Gregory Nutt 2014-07-16 19:20:44 -06:00
parent b1e7a4e4f8
commit f5626ea605
10 changed files with 119 additions and 79 deletions

@ -1147,6 +1147,12 @@ config NXWM_MEDIAPLAYER_YSPACING
forward, and reverse controls, and the volume slider in units of forward, and reverse controls, and the volume slider in units of
lines. lines.
config NXWM_MEDIAPLAYER_VOLUMESTEP
int "Media Player Volume Step"
default 5
---help---
This increment in volume, up or down, when the volume bar is clicked.
config NXWM_MEDIAPLAYER_BORDERS config NXWM_MEDIAPLAYER_BORDERS
bool "Media Player Button Borders" bool "Media Player Button Borders"
default n default n

@ -102,9 +102,16 @@ namespace NXWidgets
* NX mouse callback * NX mouse callback
*/ */
struct SMouse #ifdef CONFIG_NX_XYINPUT
struct SXYInput
{ {
// A touchscreen has no buttons. However, the convention is that
// touchscreen contacts are reported with the LEFT button pressed.
// The loss of contct is reported with no buttons pressed.
#if 0 // Center and right buttons are not used #if 0 // Center and right buttons are not used
// But only a mouse has center and right buttons
uint16_t leftPressed : 1; /**< Left button pressed (or uint16_t leftPressed : 1; /**< Left button pressed (or
touchscreen contact) */ touchscreen contact) */
uint16_t centerPressed : 1; /**< Center button pressed (not uint16_t centerPressed : 1; /**< Center button pressed (not
@ -143,6 +150,9 @@ namespace NXWidgets
uint8_t doubleClick : 1; /**< Left button double click */ uint8_t doubleClick : 1; /**< Left button double click */
uint8_t unused : 3; /**< Padding bits */ uint8_t unused : 3; /**< Padding bits */
#endif #endif
// These are attributes common to both touchscreen and mouse input devices
nxgl_coord_t x; /**< Current X coordinate of nxgl_coord_t x; /**< Current X coordinate of
the mouse/touch */ the mouse/touch */
nxgl_coord_t y; /**< Current Y coordinate of nxgl_coord_t y; /**< Current Y coordinate of
@ -156,6 +166,7 @@ namespace NXWidgets
struct timespec leftReleaseTime; /**< Time the left button was struct timespec leftReleaseTime; /**< Time the left button was
released */ released */
}; };
#endif
/** /**
* State data * State data
@ -181,8 +192,10 @@ namespace NXWidgets
* I/O * I/O
*/ */
struct SMouse m_mouse; /**< Current pointer #ifdef CONFIG_NX_XYINPUT
struct SXYInput m_xyinput; /**< Current XY input
device state */ device state */
#endif
CNxWidget *m_clickedWidget; /**< Pointer to the widget CNxWidget *m_clickedWidget; /**< Pointer to the widget
that is clicked. */ that is clicked. */
CNxWidget *m_focusedWidget; /**< Pointer to the widget CNxWidget *m_focusedWidget; /**< Pointer to the widget
@ -357,11 +370,13 @@ namespace NXWidgets
giveBoundsSem(); giveBoundsSem();
} }
#ifdef CONFIG_NX_XYINPUT
/** /**
* Clear all mouse events * Clear all mouse events
*/ */
void clearMouseEvents(void); void clearMouseEvents(void);
#endif
public: public:
@ -553,7 +568,7 @@ namespace NXWidgets
inline bool doubleClick(void) inline bool doubleClick(void)
{ {
return (bool)m_mouse.doubleClick; return (bool)m_xyinput.doubleClick;
} }
/** /**

@ -76,8 +76,8 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <stdint.h> #include <cstdint>
#include <stdbool.h> #include <cstdbool>
#include "cwidgetcontrol.hxx" #include "cwidgetcontrol.hxx"
#include "cglyphsliderhorizontal.hxx" #include "cglyphsliderhorizontal.hxx"
@ -112,25 +112,25 @@ CGlyphSliderHorizontal::CGlyphSliderHorizontal(CWidgetControl * pWidgetControl,
nxwidget_pixel_t fillColor, bool fill) nxwidget_pixel_t fillColor, bool fill)
:CNxWidget(pWidgetControl, x, y, width, height, WIDGET_DRAGGABLE) :CNxWidget(pWidgetControl, x, y, width, height, WIDGET_DRAGGABLE)
{ {
m_minimumValue = 0; m_minimumValue = 0;
m_maximumValue = 0; m_maximumValue = 0;
m_contentSize = 0; m_contentSize = 0;
m_value = 0; m_value = 0;
m_minimumGripWidth = 10; m_minimumGripWidth = 10;
m_pageSize = 1; m_pageSize = 1;
m_fillColor = fillColor; m_fillColor = fillColor;
m_fill = fill; m_fill = fill;
m_barThickness = 8; m_barThickness = 8;
m_flags.permeable = false; m_flags.permeable = false;
m_flags.borderless = false; m_flags.borderless = false;
m_flags.doubleClickable = false; m_flags.doubleClickable = false;
// Create grip // Create grip
CRect rect; CRect rect;
getClientRect(rect); getClientRect(rect);
m_gutterWidth = rect.getWidth(); m_gutterWidth = rect.getWidth();
// Create grip // Create grip
@ -214,7 +214,7 @@ void CGlyphSliderHorizontal::handleDragEvent(const CWidgetEventArgs & e)
{ {
// Handle grip events // Handle grip events
if ((e.getSource() == m_grip) && (e.getSource() != NULL)) if (e.getSource() == m_grip && e.getSource() != NULL)
{ {
int32_t newValue = getGripValue() >> 16; int32_t newValue = getGripValue() >> 16;

@ -167,7 +167,7 @@ void CGlyphSliderHorizontalGrip::onReleaseOutside(nxgl_coord_t x, nxgl_coord_t y
*/ */
void CGlyphSliderHorizontalGrip::onDrag(nxgl_coord_t x, nxgl_coord_t y, void CGlyphSliderHorizontalGrip::onDrag(nxgl_coord_t x, nxgl_coord_t y,
nxgl_coord_t vX, nxgl_coord_t vY) nxgl_coord_t vX, nxgl_coord_t vY)
{ {
// Work out where we're moving to // Work out where we're moving to

@ -100,7 +100,7 @@ using namespace NXWidgets;
/** /**
* Constructor. * Constructor.
* *
* @param pWidgetControl The controllwing widget for the display * @param pWidgetControl The controlling widget for the display
* @param x The x coordinate of the widget. * @param x The x coordinate of the widget.
* @param y The y coordinate of the widget. * @param y The y coordinate of the widget.
* @param width The width of the widget. * @param width The width of the widget.
@ -831,9 +831,9 @@ bool CNxWidget::release(nxgl_coord_t x, nxgl_coord_t y)
bool CNxWidget::drag(nxgl_coord_t x, nxgl_coord_t y, nxgl_coord_t vX, nxgl_coord_t vY) bool CNxWidget::drag(nxgl_coord_t x, nxgl_coord_t y, nxgl_coord_t vX, nxgl_coord_t vY)
{ {
if ((isEnabled()) && (m_flags.dragging)) if (isEnabled() && m_flags.dragging)
{ {
if ((vX != 0) || (vY != 0)) if (vX != 0 || vY != 0)
{ {
onDrag(x, y, vX, vY); onDrag(x, y, vX, vY);
m_widgetEventHandlers->raiseDragEvent(x, y, vX, vY); m_widgetEventHandlers->raiseDragEvent(x, y, vX, vY);

@ -39,10 +39,10 @@
#include <nuttx/config.h> #include <nuttx/config.h>
#include <stdint.h> #include <cstdint>
#include <stdbool.h> #include <cstdbool>
#include <cstring> #include <cstring>
#include <sched.h> #include <csched>
#include <cerrno> #include <cerrno>
#include "nxconfig.hxx" #include "nxconfig.hxx"
@ -101,7 +101,9 @@ CWidgetControl::CWidgetControl(FAR const CWidgetStyle *style)
// Initialize the mouse/touchscreen event and keyboard data structures // Initialize the mouse/touchscreen event and keyboard data structures
memset(&m_mouse, 0, sizeof(struct SMouse)); #ifdef CONFIG_NX_XYINPUT
memset(&m_xyinput, 0, sizeof(struct SXYInput));
#endif
m_nCh = 0; m_nCh = 0;
m_nCc = 0; m_nCc = 0;
@ -453,8 +455,8 @@ void CWidgetControl::newMouseEvent(FAR const struct nxgl_point_s *pos, uint8_t b
{ {
// Save the mouse X/Y position // Save the mouse X/Y position
m_mouse.x = pos->x; m_xyinput.x = pos->x;
m_mouse.y = pos->y; m_xyinput.y = pos->y;
// Update button press states // Update button press states
@ -465,41 +467,41 @@ void CWidgetControl::newMouseEvent(FAR const struct nxgl_point_s *pos, uint8_t b
// Handle left button press events. leftHeld means that the left mouse // Handle left button press events. leftHeld means that the left mouse
// button was pressed on the previous sample as well. // button was pressed on the previous sample as well.
if (m_mouse.leftHeld) if (m_xyinput.leftHeld)
{ {
m_mouse.leftDrag = 1; m_xyinput.leftDrag = 1;
} }
else else
{ {
// New left button press // New left button press
m_mouse.leftPressed = 1; m_xyinput.leftPressed = 1;
(void)clock_gettime(CLOCK_REALTIME, &m_mouse.leftPressTime); (void)clock_gettime(CLOCK_REALTIME, &m_xyinput.leftPressTime);
// Check for double click event // Check for double click event
if (elapsedTime(&m_mouse.leftReleaseTime) <= CONFIG_NXWIDGETS_DOUBLECLICK_TIME) if (elapsedTime(&m_xyinput.leftReleaseTime) <= CONFIG_NXWIDGETS_DOUBLECLICK_TIME)
{ {
m_mouse.doubleClick = 1; m_xyinput.doubleClick = 1;
} }
} }
m_mouse.leftHeld = 1; m_xyinput.leftHeld = 1;
} }
else else
{ {
// Handle left button release events // Handle left button release events
if (m_mouse.leftHeld) if (m_xyinput.leftHeld)
{ {
// New left button release // New left button release
m_mouse.leftReleased = 1; m_xyinput.leftReleased = 1;
(void)clock_gettime(CLOCK_REALTIME, &m_mouse.leftReleaseTime); (void)clock_gettime(CLOCK_REALTIME, &m_xyinput.leftReleaseTime);
} }
m_mouse.leftHeld = 0; m_xyinput.leftHeld = 0;
} }
#if 0 // Center and right buttons not used #if 0 // Center and right buttons not used
@ -508,31 +510,31 @@ void CWidgetControl::newMouseEvent(FAR const struct nxgl_point_s *pos, uint8_t b
// Handle center button press events. centerHeld means that the center mouse // Handle center button press events. centerHeld means that the center mouse
// button was pressed on the previous sample as well. // button was pressed on the previous sample as well.
if (m_mouse.centerHeld) if (m_xyinput.centerHeld)
{ {
m_mouse.centerDrag = 1; m_xyinput.centerDrag = 1;
} }
else else
{ {
// New center button press // New center button press
m_mouse.centerPressed = 1; m_xyinput.centerPressed = 1;
} }
m_mouse.centerHeld = 1; m_xyinput.centerHeld = 1;
} }
else else
{ {
// Handle center button release events // Handle center button release events
if (m_mouse.centerHeld) if (m_xyinput.centerHeld)
{ {
// New center button release // New center button release
m_mouse.centerReleased = 1; m_xyinput.centerReleased = 1;
} }
m_mouse.centerHeld = 0; m_xyinput.centerHeld = 0;
} }
if ((buttons & NX_MOUSE_RIGHTBUTTON) != 0) if ((buttons & NX_MOUSE_RIGHTBUTTON) != 0)
@ -540,31 +542,31 @@ void CWidgetControl::newMouseEvent(FAR const struct nxgl_point_s *pos, uint8_t b
// Handle right button press events. rightHeld means that the right mouse // Handle right button press events. rightHeld means that the right mouse
// button was pressed on the previous sample as well. // button was pressed on the previous sample as well.
if (m_mouse.rightHeld) if (m_xyinput.rightHeld)
{ {
m_mouse.rightDrag = 1; m_xyinput.rightDrag = 1;
} }
else else
{ {
// New right button press // New right button press
m_mouse.rightPressed = 1; m_xyinput.rightPressed = 1;
} }
m_mouse.rightHeld = 1; m_xyinput.rightHeld = 1;
} }
else else
{ {
// Handle right button release events // Handle right button release events
if (m_mouse.rightHeld) if (m_xyinput.rightHeld)
{ {
// New right button release // New right button release
m_mouse.rightReleased = 1; m_xyinput.rightReleased = 1;
} }
m_mouse.rightHeld = 0; m_xyinput.rightHeld = 0;
} }
#endif #endif
@ -646,7 +648,7 @@ void CWidgetControl::newCursorControlEvent(ECursorControl cursorControl)
* that inherits from INxWindow. * that inherits from INxWindow.
* 3) The call this method with the static_cast to INxWindow to, * 3) The call this method with the static_cast to INxWindow to,
* finally, create the CGraphicsPort for this window. * finally, create the CGraphicsPort for this window.
* 4) After that, the fully smartend CWidgetControl instance can * 4) After that, the fully smartened CWidgetControl instance can
* be used to generate additional widgets. * be used to generate additional widgets.
* *
* @param window The instance of INxWindow needed to construct the * @param window The instance of INxWindow needed to construct the
@ -684,7 +686,7 @@ void CWidgetControl::copyWidgetStyle(CWidgetStyle *dest, const CWidgetStyle *src
} }
/** /**
* Return the elapsed time in millisconds * Return the elapsed time in milliseconds
* *
* @param tp A time in the past from which to compute the elapsed time. * @param tp A time in the past from which to compute the elapsed time.
* @return The elapsed time since tp * @return The elapsed time since tp
@ -791,17 +793,18 @@ void CWidgetControl::processDeleteQueue(void)
bool CWidgetControl::pollMouseEvents(CNxWidget *widget) bool CWidgetControl::pollMouseEvents(CNxWidget *widget)
{ {
#ifdef CONFIG_NX_XYINPUT
bool mouseEvent = true; // Assume that an interesting mouse event occurred bool mouseEvent = true; // Assume that an interesting mouse event occurred
// All widgets // All widgets
if (m_mouse.leftPressed) if (m_xyinput.leftPressed)
{ {
// Handle a new left button press event // Handle a new left button press event
handleLeftClick(m_mouse.x, m_mouse.y, widget); handleLeftClick(m_xyinput.x, m_xyinput.y, widget);
} }
else if (m_mouse.leftDrag) else if (m_xyinput.leftDrag)
{ {
// The left button is still being held down // The left button is still being held down
@ -809,16 +812,16 @@ bool CWidgetControl::pollMouseEvents(CNxWidget *widget)
{ {
// Handle a mouse drag event // Handle a mouse drag event
m_clickedWidget->drag(m_mouse.x, m_mouse.y, m_clickedWidget->drag(m_xyinput.x, m_xyinput.y,
m_mouse.x - m_mouse.lastX, m_xyinput.x - m_xyinput.lastX,
m_mouse.y - m_mouse.lastY); m_xyinput.y - m_xyinput.lastY);
} }
} }
else if (m_clickedWidget != (CNxWidget *)NULL) else if (m_clickedWidget != (CNxWidget *)NULL)
{ {
// Mouse left button release event // Mouse left button release event
m_clickedWidget->release(m_mouse.x, m_mouse.y); m_clickedWidget->release(m_xyinput.x, m_xyinput.y);
} }
else else
{ {
@ -833,9 +836,12 @@ bool CWidgetControl::pollMouseEvents(CNxWidget *widget)
// Save the mouse position for the next poll // Save the mouse position for the next poll
m_mouse.lastX = m_mouse.x; m_xyinput.lastX = m_xyinput.x;
m_mouse.lastY = m_mouse.y; m_xyinput.lastY = m_xyinput.y;
return mouseEvent; return mouseEvent;
#else
return false;
#endif
} }
/** /**
@ -940,23 +946,25 @@ void CWidgetControl::takeBoundsSem(void)
* Clear all mouse events * Clear all mouse events
*/ */
#ifdef CONFIG_NX_XYINPUT
void CWidgetControl::clearMouseEvents(void) void CWidgetControl::clearMouseEvents(void)
{ {
// Clear all press and release events once they have been processed // Clear all press and release events once they have been processed
m_mouse.leftPressed = 0; m_xyinput.leftPressed = 0;
m_mouse.leftReleased = 0; m_xyinput.leftReleased = 0;
m_mouse.leftDrag = 0; m_xyinput.leftDrag = 0;
#if 0 // Center and right buttons are not used #if 0 // Center and right buttons are not used
m_mouse.centerPressed = 0; m_xyinput.centerPressed = 0;
m_mouse.centerReleased = 0; m_xyinput.centerReleased = 0;
m_mouse.centerDrag = 0; m_xyinput.centerDrag = 0;
m_mouse.rightPressed = 0; m_xyinput.rightPressed = 0;
m_mouse.rightReleased = 0; m_xyinput.rightReleased = 0;
m_mouse.rightDrag = 0; m_xyinput.rightDrag = 0;
#endif #endif
m_mouse.doubleClick = 0; m_xyinput.doubleClick = 0;
} }
#endif

@ -644,6 +644,10 @@
# define CONFIG_NXWM_MEDIAPLAYER_YSPACING 8 # define CONFIG_NXWM_MEDIAPLAYER_YSPACING 8
#endif #endif
#ifndef CONFIG_NXWM_MEDIAPLAYER_VOLUMESTEP
# define CONFIG_NXWM_MEDIAPLAYER_VOLUMESTEP 5
#endif
#ifndef CONFIG_NXWM_MEDIAPLAYER_ICON #ifndef CONFIG_NXWM_MEDIAPLAYER_ICON
# define CONFIG_NXWM_MEDIAPLAYER_ICON NxWM::g_mediaplayerBitmap # define CONFIG_NXWM_MEDIAPLAYER_ICON NxWM::g_mediaplayerBitmap
#endif #endif

@ -720,6 +720,7 @@ bool CMediaPlayer::createPlayer(void)
m_volume->setMinimumValue(0); m_volume->setMinimumValue(0);
m_volume->setMaximumValue(100); m_volume->setMaximumValue(100);
m_volume->setValue(15); m_volume->setValue(15);
m_volume->setPageSize(CONFIG_NXWM_MEDIAPLAYER_VOLUMESTEP);
// Register to get events from the value changes in the volume slider // Register to get events from the value changes in the volume slider
@ -1014,12 +1015,19 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
void CMediaPlayer::setVolumeLevel(void) void CMediaPlayer::setVolumeLevel(void)
{ {
// Current volume level values. This is already pre-scaled in the range 0-100 // Get the current volume level value. This is already pre-scaled in the
// range 0-100
m_level = m_volume->getValue(); int newLevel = m_volume->getValue();
// Now, provide the new volume setting to the NX Player // Has the volume level changed?
if (m_level != newLevel)
{
// Yes.. provide the new volume setting to the NX Player
#warning Missing logic #warning Missing logic
m_level = newLevel;
}
} }
/** /**

@ -447,7 +447,7 @@ void CTouchscreen::handleMouseInput(struct touch_sample_s *sample)
// Was the button up or down? // Was the button up or down?
uint8_t buttons; uint8_t buttons;
if ((sample->point[0].flags & (TOUCH_DOWN|TOUCH_MOVE)) != 0) if ((sample->point[0].flags & (TOUCH_DOWN | TOUCH_MOVE)) != 0)
{ {
buttons = NX_MOUSE_LEFTBUTTON; buttons = NX_MOUSE_LEFTBUTTON;
} }

@ -122,7 +122,6 @@ void CWindowMessenger::handleMouseEvent(void)
work_state_t *state = new work_state_t; work_state_t *state = new work_state_t;
state->windowMessenger = this; state->windowMessenger = this;
int ret = work_queue(USRWORK, &state->work, &inputWorkCallback, state, 0); int ret = work_queue(USRWORK, &state->work, &inputWorkCallback, state, 0);
if (ret < 0) if (ret < 0)
{ {