summaryrefslogtreecommitdiff
path: root/NxWidgets
diff options
context:
space:
mode:
authorGregory Nutt <gnutt@nuttx.org>2014-07-16 14:11:02 -0600
committerGregory Nutt <gnutt@nuttx.org>2014-07-16 14:11:02 -0600
commitc5116b28c46d674541d14e1504e866c68e63bc7e (patch)
tree30a422ccab7f24ab7e05fe050fc270d5258c3c39 /NxWidgets
parent4bfc8992891da3a70f7b39924d6db7dec0ca32a0 (diff)
downloadnuttx-c5116b28c46d674541d14e1504e866c68e63bc7e.tar.gz
nuttx-c5116b28c46d674541d14e1504e866c68e63bc7e.tar.bz2
nuttx-c5116b28c46d674541d14e1504e866c68e63bc7e.zip
NxWM::CMediaPlayer: Convert CLabel to a CListBox
Diffstat (limited to 'NxWidgets')
-rw-r--r--NxWidgets/libnxwidgets/include/clistbox.hxx2
-rw-r--r--NxWidgets/libnxwidgets/include/cnxwidget.hxx12
-rw-r--r--NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx2
-rw-r--r--NxWidgets/libnxwidgets/src/clistbox.cxx4
-rw-r--r--NxWidgets/libnxwidgets/src/cnxwidget.cxx4
-rw-r--r--NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx4
-rw-r--r--NxWidgets/nxwm/include/cmediaplayer.hxx44
-rw-r--r--NxWidgets/nxwm/src/cmediaplayer.cxx189
8 files changed, 203 insertions, 58 deletions
diff --git a/NxWidgets/libnxwidgets/include/clistbox.hxx b/NxWidgets/libnxwidgets/include/clistbox.hxx
index d4861af8c..07a6296e8 100644
--- a/NxWidgets/libnxwidgets/include/clistbox.hxx
+++ b/NxWidgets/libnxwidgets/include/clistbox.hxx
@@ -259,7 +259,7 @@ namespace NXWidgets
virtual void selectOption(const int index);
/**
- * Select an option by its index.
+ * De-select an option by its index.
* Redraws the widget and raises a value changed event.
*
* @param index The index of the option to select.
diff --git a/NxWidgets/libnxwidgets/include/cnxwidget.hxx b/NxWidgets/libnxwidgets/include/cnxwidget.hxx
index dd1880cc2..543c0b24b 100644
--- a/NxWidgets/libnxwidgets/include/cnxwidget.hxx
+++ b/NxWidgets/libnxwidgets/include/cnxwidget.hxx
@@ -801,6 +801,7 @@ namespace NXWidgets
*
* @return Const pointer to CWidgetStyle stored inside this widget.
*/
+
inline const CWidgetStyle *getWidgetStyle() const { return &m_style; }
/**
@@ -867,6 +868,17 @@ namespace NXWidgets
m_widgetEventHandlers->removeWidgetEventHandler(eventHandler);
}
+ /**
+ * Return the number of registered event handlers
+ *
+ * @return The number of registered event handlers
+ */
+
+ inline int nWidgetEventHandlers(void) const
+ {
+ return m_widgetEventHandlers->size();
+ }
+
/**
* Enables or disables event firing for this widget.
*
diff --git a/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx b/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
index 7d5424365..66f5cd654 100644
--- a/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
+++ b/NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx
@@ -151,7 +151,7 @@ namespace NXWidgets
* @return The size of the array.
*/
- inline nxgl_coord_t size(void) const
+ inline int size(void) const
{
return m_widgetEventHandlers.size();
}
diff --git a/NxWidgets/libnxwidgets/src/clistbox.cxx b/NxWidgets/libnxwidgets/src/clistbox.cxx
index d37915e42..8d076f3d3 100644
--- a/NxWidgets/libnxwidgets/src/clistbox.cxx
+++ b/NxWidgets/libnxwidgets/src/clistbox.cxx
@@ -73,8 +73,8 @@
#include <nuttx/config.h>
-#include <stdint.h>
-#include <stdbool.h>
+#include <cstdint>
+#include <cstdbool>
#include "cwidgetcontrol.hxx"
#include "clistbox.hxx"
diff --git a/NxWidgets/libnxwidgets/src/cnxwidget.cxx b/NxWidgets/libnxwidgets/src/cnxwidget.cxx
index 7db9eee99..99f7014cc 100644
--- a/NxWidgets/libnxwidgets/src/cnxwidget.cxx
+++ b/NxWidgets/libnxwidgets/src/cnxwidget.cxx
@@ -73,8 +73,8 @@
#include <nuttx/config.h>
-#include <stdint.h>
-#include <stdbool.h>
+#include <cstdint>
+#include <cstdbool>
#include "cnxwidget.hxx"
#include "cgraphicsport.hxx"
diff --git a/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx b/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
index 840778bac..d3f0bfe9e 100644
--- a/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
+++ b/NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx
@@ -73,8 +73,8 @@
#include <nuttx/config.h>
-#include <stdint.h>
-#include <stdbool.h>
+#include <cstdint>
+#include <cstdbool>
#include "cnxwidget.hxx"
#include "cwidgeteventhandler.hxx"
diff --git a/NxWidgets/nxwm/include/cmediaplayer.hxx b/NxWidgets/nxwm/include/cmediaplayer.hxx
index bf4ff61f4..455792db5 100644
--- a/NxWidgets/nxwm/include/cmediaplayer.hxx
+++ b/NxWidgets/nxwm/include/cmediaplayer.hxx
@@ -46,10 +46,11 @@
#include <nuttx/nx/nxtk.h>
#include <nuttx/nx/nxconsole.h>
+#include "cnxfont.hxx"
#include "cimage.hxx"
#include "cstickyimage.hxx"
-#include "clabel.hxx"
-#include "cnxfont.hxx"
+#include "clistbox.hxx"
+#include "clistboxdataitem.hxx"
#include "cglyphsliderhorizontal.hxx"
#include "iapplication.hxx"
@@ -117,7 +118,14 @@ namespace NxWM
enum EMediaPlayerState m_state; /**< Media player current state */
enum EMediaPlayerState m_prevState; /**< Media player previous state */
enum EPendingRelease m_pending; /**< Pending image release event */
- unsigned int m_level; /**< Current volume level */
+ int m_level; /**< Current volume level */
+ int m_fileIndex; /**< Index to selected file in the list box */
+
+ /**
+ * Media player geometry.
+ */
+
+ struct nxgl_size_s m_windowSize; /**< The size of the media player window */
/**
* Cached constructor parameters.
@@ -130,7 +138,7 @@ namespace NxWM
* Widgets
*/
- NXWidgets::CLabel *m_text; /**< Some text in the app for now */
+ NXWidgets::CListBox *m_listbox; /**< List box containing media files selections */
NXWidgets::CNxFont *m_font; /**< The font used in the media player */
NXWidgets::CImage *m_play; /**< Play control */
NXWidgets::CImage *m_pause; /**< Pause control */
@@ -152,19 +160,31 @@ namespace NxWM
NXWidgets::CRlePaletteBitmap *m_volumeBitmap; /**< Volume control grip bitmap */
/**
- * Calculator geometry. This stuff does not really have to be retained
- * in memory. If you are pinched for memory, get rid of these.
+ * Open a media file for playing. Called after a file has been selected
+ * from the list box.
*/
- struct nxgl_size_s m_windowSize; /**< The size of the media player window */
- struct nxgl_size_s m_textSize; /**< The size of the media player textbox */
+ inline bool openMediaFile(const NXWidgets::CListBoxDataItem *item);
/**
- * Select the geometry of the media player given the current window size.
- * Only called as part of construction.
- */
+ * Close media file. Called when a new media file is selected, when a
+ * media file is de-selected, or when destroying the media player instance.
+ */
+
+ inline void closeMediaFile(void);
+
+ /**
+ * Select the geometry of the media player given the current window size.
+ * Only called as part of construction.
+ */
+
+ inline void setGeometry(void);
+
+ /**
+ * Load media files into the list box.
+ */
- inline void setGeometry(void);
+ inline bool showMediaFiles(const char *mediaPath);
/**
* Create the Media Player controls. Only start as part of the application
diff --git a/NxWidgets/nxwm/src/cmediaplayer.cxx b/NxWidgets/nxwm/src/cmediaplayer.cxx
index cf44e6f7b..b13f76609 100644
--- a/NxWidgets/nxwm/src/cmediaplayer.cxx
+++ b/NxWidgets/nxwm/src/cmediaplayer.cxx
@@ -88,7 +88,7 @@ CMediaPlayer::CMediaPlayer(CTaskbar *taskbar, CApplicationWindow *window)
// Nullify widgets that will be instantiated when the window is started
- m_text = (NXWidgets::CLabel *)0;
+ m_listbox = (NXWidgets::CListBox *)0;
m_font = (NXWidgets::CNxFont *)0;
m_play = (NXWidgets::CImage *)0;
m_pause = (NXWidgets::CImage *)0;
@@ -109,6 +109,7 @@ CMediaPlayer::CMediaPlayer(CTaskbar *taskbar, CApplicationWindow *window)
m_state = MPLAYER_STOPPED;
m_prevState = MPLAYER_STOPPED;
m_pending = PENDING_NONE;
+ m_fileIndex = -1;
// Add our personalized window label
@@ -134,9 +135,9 @@ CMediaPlayer::~CMediaPlayer(void)
{
// Destroy widgets
- if (m_text)
+ if (m_listbox)
{
- delete m_text;
+ delete m_listbox;
}
if (m_font)
@@ -249,7 +250,7 @@ bool CMediaPlayer::run(void)
{
// Create the widgets (if we have not already done so)
- if (!m_text)
+ if (!m_listbox)
{
// Create the widgets
@@ -271,7 +272,7 @@ void CMediaPlayer::stop(void)
{
// Just disable further drawing on all widgets
- m_text->disableDrawing();
+ m_listbox->disableDrawing();
m_play->disableDrawing();
m_pause->disableDrawing();
m_rewind->disableDrawing();
@@ -351,6 +352,26 @@ bool CMediaPlayer::isFullScreen(void) const
}
/**
+ * Open a media file for playing. Called after a file has been selected
+ * from the list box.
+ */
+
+bool CMediaPlayer::openMediaFile(const NXWidgets::CListBoxDataItem *item)
+{
+#warning Missing logic
+ return true;
+}
+
+/**
+ * Close media file. Called when a new media file is selected, when a media file is de-selected, or when destroying the media player instance.
+ */
+
+void CMediaPlayer::closeMediaFile(void)
+{
+#warning Missing logic
+}
+
+/**
* Select the geometry of the media player given the current window size.
*/
@@ -366,6 +387,44 @@ void CMediaPlayer::setGeometry(void)
}
/**
+ * Load media files into the list box.
+ */
+
+inline bool CMediaPlayer::showMediaFiles(const char *mediaPath)
+{
+ // Remove any filenames already in the list box
+
+ m_listbox->removeAllOptions();
+
+#if 0
+ // Open the media path directory
+ // Read each directory entry
+ // Add the directory entry to the list box
+ // Close the directory
+#else
+# warning "Missing Logic"
+
+ // Just add a couple of dummy files for testing
+
+ m_listbox->addOption("File 1", 0,
+ CONFIG_NXWIDGETS_DEFAULT_ENABLEDTEXTCOLOR,
+ CONFIG_NXWIDGETS_DEFAULT_BACKGROUNDCOLOR,
+ CONFIG_NXWIDGETS_DEFAULT_SELECTEDTEXTCOLOR,
+ CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR);
+ m_listbox->addOption("File 2", 1,
+ CONFIG_NXWIDGETS_DEFAULT_ENABLEDTEXTCOLOR,
+ CONFIG_NXWIDGETS_DEFAULT_BACKGROUNDCOLOR,
+ CONFIG_NXWIDGETS_DEFAULT_SELECTEDTEXTCOLOR,
+ CONFIG_NXWM_DEFAULT_SELECTEDBACKGROUNDCOLOR);
+#endif
+
+ // Sort the file names in alphabetical order
+
+ m_listbox->sort();
+ return true;
+}
+
+/**
* Create the media player widgets. Only start as part of the application
* start method.
*/
@@ -440,37 +499,34 @@ bool CMediaPlayer::createPlayer(void)
// 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 textHeight = controlTop - CONFIG_NXWM_MEDIAPLAYER_YSPACING;
+ nxgl_coord_t listHeight = controlTop - CONFIG_NXWM_MEDIAPLAYER_YSPACING;
- // Create a label to show some text.
+ // 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_text = new NXWidgets::
- CLabel(control, 0, 0, m_windowSize.w, textHeight, "0");
-
- if (!m_text)
+ m_listbox = new NXWidgets::CListBox(control, 0, 0, m_windowSize.w, listHeight);
+ if (!m_listbox)
{
- gdbg("ERROR: Failed to create CLabel\n");
+ gdbg("ERROR: Failed to create CListBox\n");
return false;
}
- // Align text on the left
-
- m_text->setTextAlignmentHoriz(NXWidgets::CLabel::TEXT_ALIGNMENT_HORIZ_RIGHT);
-
- // Disable drawing and events until we are asked to redraw the window
+ // Configure the list box
- m_text->disableDrawing();
- m_text->setRaisesEvents(false);
+ m_listbox->disableDrawing();
+ m_listbox->setAllowMultipleSelections(false);
+ m_listbox->setFont(m_font);
+ m_listbox->setBorderless(false);
- // Select the font
+ // Register to get events when a new file is selected from the list box
- m_text->setFont(m_font);
+ m_listbox->addWidgetEventHandler(this);
- // Add some dummy text for now
+ // Show the media files that are available for playing
- m_text->setText("Coming soon...");
+ showMediaFiles(CONFIG_NXWM_MEDIAPLAYER_MEDIAPATH);
// Control image widths.
// Image widths will depend on if the images will be bordered or not
@@ -678,9 +734,9 @@ bool CMediaPlayer::createPlayer(void)
setVolumeLevel();
- // Enable drawing in the text, rewind, fast-forward and drawing widgets.
+ // Enable drawing in the list box, rewind, fast-forward and drawing widgets.
- m_text->enableDrawing();
+ m_listbox->enableDrawing();
m_rewind->enableDrawing();
m_fforward->enableDrawing();
m_volume->enableDrawing();
@@ -721,8 +777,8 @@ void CMediaPlayer::redrawWidgets(void)
// Redraw widgets. We have to re-enable drawing all all widgets since
// drawing was disabled by the hide() method.
- m_text->enableDrawing();
- m_text->redraw();
+ m_listbox->enableDrawing();
+ m_listbox->redraw();
// Only one of the Play and Pause images should have drawing enabled.
@@ -777,9 +833,9 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
m_state = MPLAYER_STOPPED;
m_prevState = MPLAYER_PLAYING;
- // Text box is enabled and ready for text entry
+ // List box is enabled and ready for file selection
- m_text->enable();
+ m_listbox->enable();
// Play image enabled and ready to start playing
// REVISIT: Really only available if there is a selected file in the list box
@@ -809,9 +865,9 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
m_state = MPLAYER_PLAYING;
m_prevState = MPLAYER_PLAYING;
- // Text box is not available while playing
+ // List box is not available while playing
- m_text->disable();
+ m_listbox->disable();
// Play image hidden and disabled
@@ -838,9 +894,9 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
m_state = MPLAYER_PAUSED;
m_prevState = MPLAYER_PAUSED;
- // Text box is enabled a ready for text entry
+ // List box is enabled a ready for file selection
- m_text->enable();
+ m_listbox->enable();
// Play image enabled and ready to resume playing
@@ -864,9 +920,9 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
case MPLAYER_FFORWARD: // Fast forwarding through a media file */
m_state = MPLAYER_FFORWARD;
- // Text box is not available while fast forwarding
+ // List box is not available while fast forwarding
- m_text->disable();
+ m_listbox->disable();
if (m_prevState == MPLAYER_PLAYING)
{
@@ -905,9 +961,9 @@ void CMediaPlayer::setMediaPlayerState(enum EMediaPlayerState state)
case MPLAYER_FREWIND: // Rewinding a media file
m_state = MPLAYER_FREWIND;
- // Text box is not available while rewinding
+ // List box is not available while rewinding
- m_text->disable();
+ m_listbox->disable();
if (m_prevState == MPLAYER_PLAYING)
{
@@ -1049,6 +1105,63 @@ void CMediaPlayer::handleActionEvent(const NXWidgets::CWidgetEventArgs &e)
}
}
}
+
+ // Check for new file selections from the list box
+
+ int newFileIndex = m_listbox->getSelectedIndex();
+
+ // Check if anything is selected
+
+ if (newFileIndex < 0)
+ {
+ // Nothing is selected.. If we are not stopped, then stop now
+
+ if (m_state != MPLAYER_STOPPED)
+ {
+ closeMediaFile();
+ setMediaPlayerState(MPLAYER_STOPPED);
+ }
+ }
+
+ // A media file is selected. Were stopped before?
+
+ else if (m_state == MPLAYER_STOPPED)
+ {
+ // Yes.. open the new media file and go to the PAUSE state
+
+ if (!openMediaFile(m_listbox->getSelectedOption()))
+ {
+ m_fileIndex = -1;
+ gdbg("openMediaFile failed\m");
+ }
+ else
+ {
+ m_fileIndex = newFileIndex;
+ setMediaPlayerState(MPLAYER_PAUSED);
+ }
+ }
+
+ // We already have a media file loaded. Is it the same file?
+
+ else if (m_fileIndex != newFileIndex)
+ {
+ // No.. It is a new file. Close that media file, load the newly
+ // selected file, and make sure that we are in the paused state
+ // (that should already be the case)
+
+ closeMediaFile();
+ if (!openMediaFile(m_listbox->getSelectedOption()))
+ {
+ gdbg("openMediaFile failed\m");
+ m_fileIndex = -1;
+ setMediaPlayerState(MPLAYER_STOPPED);
+ }
+ else
+ {
+ m_fileIndex = newFileIndex;
+ setMediaPlayerState(MPLAYER_PAUSED);
+ }
+ }
}
/**
@@ -1098,7 +1211,7 @@ void CMediaPlayer::handleValueChangeEvent(const NXWidgets::CWidgetEventArgs &e)
{
setVolumeLevel();
}
-
+
/**
* CMediaPlayerFactory Constructor
*