/** * @RDE_HEADER@ * AvsMenus * $Id$ * $HeadURL$ * $Author$ * Created by Christian Fröbel, NLSE, 2018-03-19 */ #pragma once #include "avm_export.h" #include #include #include #include enum class DataModification; namespace AudioVideoManagement { namespace Interface { class Dtc; } class AvaSession; class MenuStruct; class RtState; /** * This class is responsible for the Announcement- and VideoMenu in AVS_Workstation. * Initially the default menus will be set. When the user changes the menu, * we keep track of it. When the connection to AVS_Workstation breaks down, * the last active menus will be set on reconnect. * Also, when the active menu changes (on DDS), the change is published * to AVS_Workstation. * * @author Christian Fröbel */ class AVM_COMMON_EXPORT AvsMenus : public QObject { Q_OBJECT public: AvsMenus(AvaSession *session, Interface::Dtc *dtc, InfrastructureManagement::Interface::Dtc *ismDtc, RtState *rtState); void setAnnouncementMenu(int menuId); void setVideoMenu(int menuId); void setAnnouncementUnit(int mountingPointId); /** @return -1 if there is no current menu (yet). */ int currentAnnouncementMenu() const { return m_announcementMenu.currentMenu(); } int currentVideoMenu() const { return m_videoMenu.currentMenu(); } private slots: void onSessionEstablished(); void onMenuStructChanged(const MenuStruct &menu, DataModification modType); private: /** * @name Callbacks * Will be called by Menu in order to send the Menu to AVS_Workstation. */ ///@{ void sendAnnouncementMenu(const MenuStruct &menu, const boost::optional &mountingPointIdOfSelectedStream); void sendVideoMenu(const MenuStruct &menu, const boost::optional &dummy); ///@} /** * Internal helper class to represent the Announcement- and VideoMenu. */ class Menu { public: using SendMenuCallback = std::function &)>; Menu(Interface::Dtc *dtc, InfrastructureManagement::Interface::Dtc *ismDtc, SendMenuCallback cb, bool isAudio); void setMenu(int menuId); void replaceMvsEntries(MenuStruct &menu) const; /** * Special method which is only meaningful for the AnnoucementMenu. * Selects the default menu and makes sure that the AnnouncementUnit on the MountingPoint * with the given mountingPointId is the first selected Stream. */ void setAnnouncementUnit(int mountingPointId); /** @return -1 if there is no current menu (yet). */ int currentMenu() const { return m_currentMenu.get_value_or(-1); } void onChanged(const MenuStruct &menu, DataModification modType); void onSessionEstablished(); private: void onMenuAdded(MenuStruct menu); void onMenuChanged(MenuStruct menu); void onMenuRemoved(const MenuStruct &menu); void setMenu(const MenuStruct &menu, const boost::optional &mountingPointIdOfSelectedStream = boost::none); Interface::Dtc *m_dtc; InfrastructureManagement::Interface::Dtc *m_ismDtc; SendMenuCallback m_sendMenu; const bool m_isAudio; boost::optional m_defaultMenu; boost::optional m_currentMenu; }; AvaSession *m_session; Interface::Dtc *m_dtc; InfrastructureManagement::Interface::Dtc *m_ismDtc; RtState *m_rtState; Menu m_announcementMenu; Menu m_videoMenu; }; } // namespace AudioVideoManagement