diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-07-16 14:11:02 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-07-16 14:11:02 -0600 |
commit | c5116b28c46d674541d14e1504e866c68e63bc7e (patch) | |
tree | 30a422ccab7f24ab7e05fe050fc270d5258c3c39 /NxWidgets | |
parent | 4bfc8992891da3a70f7b39924d6db7dec0ca32a0 (diff) | |
download | nuttx-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.hxx | 2 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/include/cnxwidget.hxx | 12 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/include/cwidgeteventhandlerlist.hxx | 2 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/clistbox.cxx | 4 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cnxwidget.cxx | 4 | ||||
-rw-r--r-- | NxWidgets/libnxwidgets/src/cwidgeteventhandlerlist.cxx | 4 | ||||
-rw-r--r-- | NxWidgets/nxwm/include/cmediaplayer.hxx | 44 | ||||
-rw-r--r-- | NxWidgets/nxwm/src/cmediaplayer.cxx | 189 |
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 * |