in graphics/nxwm/src/cmediaplayer.cxx [689:1046]
bool CMediaPlayer::createPlayer(void)
{
// Select a font for the media player
m_font = new NXWidgets::CNxFont((nx_fontid_e)CONFIG_NXWM_MEDIAPLAYER_FONTID,
CONFIG_NXWM_DEFAULT_FONTCOLOR,
CONFIG_NXWM_TRANSPARENT_COLOR);
if (!m_font)
{
gerr("ERROR: Failed to create font\n");
return false;
}
// Get the widget control associated with the application window
NXWidgets::CWidgetControl *control = m_window->getWidgetControl();
// Work out all of the vertical placement first. In order to do that, we
// will need create all of the bitmaps first so that we an use the bitmap
// height in the calculation.
m_playBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MPLAYER_PLAY_ICON);
m_pauseBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MPLAYER_PAUSE_ICON);
m_rewindBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MPLAYER_REW_ICON);
m_fforwardBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MPLAYER_FWD_ICON);
m_volumeBitmap = new NXWidgets::CRlePaletteBitmap(&CONFIG_NXWM_MPLAYER_VOL_ICON);
if (!m_playBitmap || !m_pauseBitmap || !m_rewindBitmap ||
!m_fforwardBitmap || !m_volumeBitmap)
{
gerr("ERROR: Failed to one or more bitmaps\n");
return false;
}
// Control image height. Use the same height for all images
nxgl_coord_t controlH = m_playBitmap->getHeight();
if (controlH < m_pauseBitmap->getHeight())
{
controlH = m_pauseBitmap->getHeight();
}
if (controlH < m_rewindBitmap->getHeight())
{
controlH = m_rewindBitmap->getHeight();
}
if (controlH < m_fforwardBitmap->getHeight())
{
controlH = m_fforwardBitmap->getHeight();
}
controlH += 8;
// Place the volume slider at a comfortable distance from the bottom of
// the display
nxgl_coord_t volumeTop = m_windowSize.h - m_volumeBitmap->getHeight() -
CONFIG_NXWM_MEDIAPLAYER_YSPACING;
// Place the player controls just above that. The list box will then end
// just above the controls.
nxgl_coord_t controlTop = volumeTop - controlH -
CONFIG_NXWM_MEDIAPLAYER_YSPACING;
// The list box will then end just above the controls. The end of the
// list box is the same as its height because the origin is zero.
nxgl_coord_t listHeight = controlTop - CONFIG_NXWM_MEDIAPLAYER_YSPACING;
// Create a list box to show media file selections.
// Note that the list box will extend all of the way to the edges of the
// display and is only limited at the bottom by the player controls.
// REVISIT: This should be a scrollable list box
m_listbox = new NXWidgets::CListBox(control, 0, 0, m_windowSize.w, listHeight);
if (!m_listbox)
{
gerr("ERROR: Failed to create CListBox\n");
return false;
}
// Configure the list box
m_listbox->disableDrawing();
m_listbox->setAllowMultipleSelections(false);
m_listbox->setFont(m_font);
m_listbox->setBorderless(false);
// Register to get events when a new file is selected from the list box
m_listbox->addWidgetEventHandler(this);
// Show the media files that are available for playing
showMediaFiles(CONFIG_NXWM_MEDIAPLAYER_MEDIAPATH);
// Control image widths.
// Image widths will depend on if the images will be bordered or not
nxgl_coord_t playControlW;
nxgl_coord_t rewindControlW;
nxgl_coord_t fforwardControlW;
#ifdef CONFIG_NXWM_MEDIAPLAYER_BORDERS
// Use the same width for all control images. Set the width to the width
// of the widest image
nxgl_coord_t imageW = m_playBitmap->getWidth();
if (imageW < m_pauseBitmap->getWidth())
{
imageW = m_pauseBitmap->getWidth();
}
if (imageW < m_rewindBitmap->getWidth())
{
imageW = m_rewindBitmap->getWidth();
}
if (imageW < m_fforwardBitmap->getWidth())
{
imageW = m_fforwardBitmap->getWidth();
}
// Add little space around the bitmap and use this width for all images
imageW += 8;
playControlW = imageW;
rewindControlW = imageW;
fforwardControlW = imageW;
#else
// Use the bitmap image widths for the image widths (plus a bit)
playControlW = m_playBitmap->getWidth() + 8;
rewindControlW = m_rewindBitmap->getWidth() + 8;
fforwardControlW = m_fforwardBitmap->getWidth() + 8;
// The Play and Pause images should be the same width. But just
// in case, pick the larger width.
nxgl_coord_t pauseControlW = m_pauseBitmap->getWidth() + 8;
if (playControlW < pauseControlW)
{
playControlW = pauseControlW;
}
#endif
// Create the Play image
nxgl_coord_t playControlX = (m_windowSize.w >> 1) - (playControlW >> 1);
m_play = new NXWidgets::
CImage(control, playControlX, controlTop, playControlW, controlH,
m_playBitmap);
if (!m_play)
{
gerr("ERROR: Failed to create play control\n");
return false;
}
// Configure the Play image
m_play->disableDrawing();
m_play->alignHorizontalCenter();
m_play->alignVerticalCenter();
#ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS
m_play->setBorderless(true);
#else
m_play->setBorderless(false);
#endif
// Register to get events from the mouse clicks on the Play image
m_play->addWidgetEventHandler(this);
// Create the Pause image (at the same position and size as the Play image)
m_pause = new NXWidgets::
CImage(control, playControlX, controlTop, playControlW, controlH,
m_pauseBitmap);
if (!m_pause)
{
gerr("ERROR: Failed to create pause control\n");
return false;
}
// Configure the Pause image (hidden and disabled initially)
m_pause->disableDrawing();
m_pause->alignHorizontalCenter();
m_pause->alignVerticalCenter();
#ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS
m_pause->setBorderless(true);
#else
m_pause->setBorderless(false);
#endif
// Register to get events from the mouse clicks on the Pause image
m_pause->addWidgetEventHandler(this);
// Create the Rewind image
nxgl_coord_t rewControlX = playControlX - rewindControlW -
CONFIG_NXWM_MEDIAPLAYER_XSPACING;
m_rewind = new NXWidgets::
CStickyImage(control, rewControlX, controlTop, rewindControlW,
controlH, m_rewindBitmap);
if (!m_rewind)
{
gerr("ERROR: Failed to create rewind control\n");
return false;
}
// Configure the Rewind image
m_rewind->disableDrawing();
m_rewind->alignHorizontalCenter();
m_rewind->alignVerticalCenter();
#ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS
m_rewind->setBorderless(true);
#else
m_rewind->setBorderless(false);
#endif
#ifndef CONFIG_AUDIO_EXCLUDE_REWIND
// Register to get events from the mouse clicks on the Rewind image
m_rewind->addWidgetEventHandler(this);
#endif
// Create the Forward Image
nxgl_coord_t fwdControlX = playControlX + playControlW +
CONFIG_NXWM_MEDIAPLAYER_XSPACING;
m_fforward = new NXWidgets::
CStickyImage(control, fwdControlX, controlTop, fforwardControlW,
controlH, m_fforwardBitmap);
if (!m_fforward)
{
gerr("ERROR: Failed to create fast forward control\n");
return false;
}
// Configure the Forward image
m_fforward->disableDrawing();
m_fforward->alignHorizontalCenter();
m_fforward->alignVerticalCenter();
#ifndef CONFIG_NXWM_MEDIAPLAYER_BORDERS
m_fforward->setBorderless(true);
#else
m_fforward->setBorderless(false);
#endif
#ifndef CONFIG_AUDIO_EXCLUDE_FFORWARD
// Register to get events from the mouse clicks on the Forward image
m_fforward->addWidgetEventHandler(this);
#endif
// Create the Volume control
uint32_t volumeControlX = (9 * (uint32_t)m_windowSize.w) >> 8;
nxgl_coord_t volumeControlW = (nxgl_coord_t)(m_windowSize.w - 2 * volumeControlX);
nxgl_coord_t volumeControlH = m_volumeBitmap->getHeight() - 4;
// Don't let the height of the volume control get too small
if (volumeControlH < CONFIG_NXWM_MEDIAPLAYER_MINVOLUMEHEIGHT)
{
volumeControlH = CONFIG_NXWM_MEDIAPLAYER_MINVOLUMEHEIGHT;
}
m_volume = new NXWidgets::
CGlyphSliderHorizontal(control, (nxgl_coord_t)volumeControlX, volumeTop,
volumeControlW, volumeControlH, m_volumeBitmap,
CONFIG_NXWM_MEDIAPLAYER_VOLUMECOLOR);
if (!m_volume)
{
gerr("ERROR: Failed to create volume control\n");
return false;
}
// Configure the volume control
m_volume->disableDrawing();
m_volume->setMinimumValue(0);
m_volume->setMaximumValue(100);
m_volume->setValue(15);
m_volume->setPageSize(CONFIG_NXWM_MEDIAPLAYER_VOLUMESTEP);
#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME
// Register to get events from the value changes in the volume slider
m_volume->addWidgetEventHandler(this);
#endif
#if !defined(CONFIG_AUDIO_EXCLUDE_FFORWARD) || !defined(CONFIG_AUDIO_EXCLUDE_REWIND)
// Create the speed of motion indicator
// The bounding box is determined by the font size
nxgl_coord_t motionW = (nxgl_coord_t)(3 * m_font->getMaxWidth());
nxgl_coord_t motionH = (nxgl_coord_t)(m_font->getHeight());
// Horizontal position: aligned with the right size of volume slider
// Vertical position: same as the motion controls
m_speed = new NXWidgets::CLabel(control,
volumeControlX + volumeControlW - motionW,
controlTop + (controlH - motionH) / 2,
motionW, motionH, "");
// Configure the speed indicator
m_speed->disableDrawing();
m_speed->setBorderless(true);
m_speed->setRaisesEvents(false);
m_speed->setFont(m_font);
m_speed->setTextAlignmentHoriz(NXWidgets::CLabel::TEXT_ALIGNMENT_HORIZ_RIGHT);
m_speed->setTextAlignmentVert(NXWidgets::CLabel::TEXT_ALIGNMENT_VERT_CENTER);
m_speed->hide();
#endif
// Make sure that all widgets are setup for the STOPPED state. Among other this,
// this will enable drawing in the play widget (only)
setMediaPlayerState(MPLAYER_STOPPED);
#ifndef CONFIG_AUDIO_EXCLUDE_VOLUME
// Set the volume level
setVolumeLevel();
#endif
// Enable drawing in the list box, rewind, fast-forward and drawing widgets.
m_listbox->enableDrawing();
m_rewind->enableDrawing();
m_fforward->enableDrawing();
m_volume->enableDrawing();
// And redraw all of the widgets that are enabled
redraw();
return true;
}