bool CGUIWindow::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_INIT: { CLog::Log(LOGDEBUG, "------ Window Init (%s) ------", GetProperty("xmlfile").c_str()); if (m_dynamicResourceAlloc || !m_bAllocated) AllocResources(); OnInitWindow(); return true; } break; case GUI_MSG_WINDOW_DEINIT: { CLog::Log(LOGDEBUG, "------ Window Deinit (%s) ------", GetProperty("xmlfile").c_str()); OnDeinitWindow(message.GetParam1()); // now free the window if (m_dynamicResourceAlloc) FreeResources(); return true; } break; case GUI_MSG_CLICKED: { // a specific control was clicked CLICK_EVENT clickEvent = m_mapClickEvents[ message.GetSenderId() ]; // determine if there are any handlers for this event if (clickEvent.HasAHandler()) { // fire the message to all handlers clickEvent.Fire(message); } break; } case GUI_MSG_SELCHANGED: { // a selection within a specific control has changed SELECTED_EVENT selectedEvent = m_mapSelectedEvents[ message.GetSenderId() ]; // determine if there are any handlers for this event if (selectedEvent.HasAHandler()) { // fire the message to all handlers selectedEvent.Fire(message); } break; } case GUI_MSG_FOCUSED: { // a control has been focused if (HasID(message.GetSenderId())) { m_focusedControl = message.GetControlId(); return true; } break; } case GUI_MSG_LOSTFOCUS: { // nothing to do at the window level when we lose focus return true; } case GUI_MSG_MOVE: { if (HasID(message.GetSenderId())) return OnMove(message.GetControlId(), message.GetParam1()); break; } case GUI_MSG_SETFOCUS: { // CLog::Log(LOGDEBUG,"set focus to control:%i window:%i (%i)\n", message.GetControlId(),message.GetSenderId(), GetID()); if ( message.GetControlId() ) { // first unfocus the current control CGUIControl *control = GetFocusedControl(); if (control) { CGUIMessage msgLostFocus(GUI_MSG_LOSTFOCUS, GetID(), control->GetID(), message.GetControlId()); control->OnMessage(msgLostFocus); } // get the control to focus CGUIControl* pFocusedControl = GetFirstFocusableControl(message.GetControlId()); if (!pFocusedControl) pFocusedControl = (CGUIControl *)GetControl(message.GetControlId()); // and focus it if (pFocusedControl) return pFocusedControl->OnMessage(message); } return true; } break; case GUI_MSG_EXCLUSIVE_MOUSE: { m_exclusiveMouseControl = message.GetSenderId(); return true; } break; case GUI_MSG_GESTURE_NOTIFY: { CAction action(ACTION_GESTURE_NOTIFY, 0, (float)message.GetParam1(), (float)message.GetParam2(), 0, 0); EVENT_RESULT result = OnMouseAction(action); message.SetParam1(result); return result != EVENT_RESULT_UNHANDLED; } case GUI_MSG_NOTIFY_ALL: { // only process those notifications that come from this window, or those intended for every window if (HasID(message.GetSenderId()) || !message.GetSenderId()) { if (message.GetParam1() == GUI_MSG_PAGE_CHANGE || message.GetParam1() == GUI_MSG_REFRESH_THUMBS || message.GetParam1() == GUI_MSG_REFRESH_LIST || message.GetParam1() == GUI_MSG_WINDOW_RESIZE) { // alter the message accordingly, and send to all controls for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; CGUIMessage msg(message.GetParam1(), message.GetControlId(), control->GetID(), message.GetParam2()); control->OnMessage(msg); } } } } break; } return SendControlMessage(message); }
bool CGUIDialogMusicInfo::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { m_artTypeList.Clear(); // For albums update user rating if it has changed if(!m_bArtistInfo && m_startUserrating != m_item->GetMusicInfoTag()->GetUserrating()) { m_hasUpdatedUserrating = true; // Asynchronously update song userrating in library CSetUserratingJob *job = new CSetUserratingJob(m_item->GetMusicInfoTag()->GetAlbumId(), m_item->GetMusicInfoTag()->GetUserrating()); CJobManager::GetInstance().AddJob(job, NULL); } if (m_hasRefreshed || m_hasUpdatedUserrating) { // Send a message to all windows to tell them to update the item. // This communicates changes to the music lib window. // The music lib window item is updated to but changes to the rating when it is the sort // do not show on screen until refresh() that fetches the list from scratch, sorts etc. CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE_ITEM, 0, m_item); CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); } CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), CONTROL_LIST); OnMessage(msg); m_albumSongs->Clear(); } break; case GUI_MSG_WINDOW_INIT: { CGUIDialog::OnMessage(message); Update(); m_cancelled = false; return true; } break; case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_USERRATING) { OnSetUserrating(); } else if (iControl == CONTROL_BTN_REFRESH) { RefreshInfo(); return true; } else if (iControl == CONTROL_BTN_GET_THUMB) { OnGetArt(); return true; } else if (iControl == CONTROL_ARTISTINFO) { if (!m_bArtistInfo) OnArtistInfo(m_album.artistCredits[0].GetArtistId()); return true; } else if (iControl == CONTROL_LIST) { int iAction = message.GetParam1(); if (m_bArtistInfo && (ACTION_SELECT_ITEM == iAction || ACTION_MOUSE_LEFT_CLICK == iAction)) { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), iControl); CServiceBroker::GetGUI()->GetWindowManager().SendMessage(msg); int iItem = msg.GetParam1(); if (iItem < 0 || iItem >= static_cast<int>(m_albumSongs->Size())) break; OnAlbumInfo(m_albumSongs->Get(iItem)->GetMusicInfoTag()->GetDatabaseId()); return true; } } } break; } return CGUIDialog::OnMessage(message); }
/*! \brief Handle messages on window. \param message GUI Message that can be reacted on. \return if a message can't be processed, return \e false On these messages this class reacts.\n When retrieving... - #GUI_MSG_WINDOW_DEINIT\n ...the last focused control is saved to m_iLastControl. - #GUI_MSG_WINDOW_INIT\n ...the musicdatabase is opend and the music extensions and shares are set. The last focused control is set. - #GUI_MSG_CLICKED\n ... the base class reacts on the following controls:\n Buttons:\n - #CONTROL_BTNVIEWASICONS - switch between list, thumb and with large items - #CONTROL_BTNTYPE - switch between music windows - #CONTROL_BTNSEARCH - Search for items\n Other Controls: - The container controls\n Have the following actions in message them clicking on them. - #ACTION_QUEUE_ITEM - add selected item to playlist - #ACTION_SHOW_INFO - retrieve album info from the internet - #ACTION_SELECT_ITEM - Item has been selected. Overwrite OnClick() to react on it */ bool CGUIWindowMusicBase::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_DEINIT: { m_musicdatabase.Close(); } break; case GUI_MSG_WINDOW_INIT: { m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS); m_musicdatabase.Open(); if (!CGUIMediaWindow::OnMessage(message)) return false; // save current window, unless the current window is the music playlist window if (GetID() != WINDOW_MUSIC_PLAYLIST && g_settings.m_iMyMusicStartWindow != GetID()) { g_settings.m_iMyMusicStartWindow = GetID(); g_settings.Save(); } return true; } break; // update the display case GUI_MSG_SCAN_FINISHED: case GUI_MSG_REFRESH_THUMBS: Refresh(); break; case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_BTNTYPE) { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_BTNTYPE); g_windowManager.SendMessage(msg); int nWindow = WINDOW_MUSIC_FILES + msg.GetParam1(); if (nWindow == GetID()) return true; g_settings.m_iMyMusicStartWindow = nWindow; g_settings.Save(); g_windowManager.ChangeActiveWindow(nWindow); CGUIMessage msg2(GUI_MSG_SETFOCUS, g_settings.m_iMyMusicStartWindow, CONTROL_BTNTYPE); g_windowManager.SendMessage(msg2); return true; } else if (m_viewControl.HasControl(iControl)) // list/thumb control { int iItem = m_viewControl.GetSelectedItem(); int iAction = message.GetParam1(); // iItem is checked for validity inside these routines if (iAction == ACTION_QUEUE_ITEM || iAction == ACTION_MOUSE_MIDDLE_CLICK) { OnQueueItem(iItem); } else if (iAction == ACTION_SHOW_INFO) { OnInfo(iItem); } else if (iAction == ACTION_DELETE_ITEM) { // is delete allowed? // must be at the playlists directory if (m_vecItems->GetPath().Equals("special://musicplaylists/")) OnDeleteItem(iItem); // or be at the files window and have file deletion enabled else if (GetID() == WINDOW_MUSIC_FILES && g_guiSettings.GetBool("filelists.allowfiledeletion")) { OnDeleteItem(iItem); } else return false; } // use play button to add folders of items to temp playlist else if (iAction == ACTION_PLAYER_PLAY) { // if playback is paused or playback speed != 1, return if (g_application.IsPlayingAudio()) { if (g_application.m_pPlayer->IsPaused()) return false; if (g_application.GetPlaySpeed() != 1) return false; } // not playing audio, or playback speed == 1 PlayItem(iItem); return true; } } } } return CGUIMediaWindow::OnMessage(message); }