void CGUIMediaWindow::LoadAdditionalTags(TiXmlElement *root) { CGUIWindow::LoadAdditionalTags(root); // configure our view control m_viewControl.Reset(); m_viewControl.SetParentWindow(GetID()); TiXmlElement *element = root->FirstChildElement("views"); if (element && element->FirstChild()) { // format is <views>50,29,51,95</views> CStdString allViews = element->FirstChild()->Value(); CStdStringArray views; StringUtils::SplitString(allViews, ",", views); for (unsigned int i = 0; i < views.size(); i++) { int controlID = atol(views[i].c_str()); CGUIControl *control = (CGUIControl *)GetControl(controlID); if (control && control->IsContainer()) m_viewControl.AddView(control); } } else { // backward compatibility vector<CGUIControl *> controls; GetContainers(controls); for (ciControls it = controls.begin(); it != controls.end(); it++) { CGUIControl *control = *it; if (control->GetID() >= CONTROL_VIEW_START && control->GetID() <= CONTROL_VIEW_END) m_viewControl.AddView(control); } } m_viewControl.SetViewControlID(CONTROL_BTNVIEWASICONS); }
void CGUIControlGroupList::AddControl(CGUIControl *control) { // NOTE: We override control navigation here, but we don't override the <onleft> etc. builtins // if specified. if (control) { // set the navigation of items so that they form a list if (m_orientation == VERTICAL) { DWORD upID = GetControlIdUp(); DWORD downID = GetControlIdDown(); if (m_children.size()) { CGUIControl *top = m_children[0]; if (downID == GetID()) downID = top->GetID(); if (upID == GetID()) top->SetNavigation(control->GetID(), top->GetControlIdDown(), GetControlIdLeft(), GetControlIdRight()); CGUIControl *prev = m_children[m_children.size() - 1]; upID = prev->GetID(); prev->SetNavigation(prev->GetControlIdUp(), control->GetID(), GetControlIdLeft(), GetControlIdRight()); } control->SetNavigation(upID, downID, GetControlIdLeft(), GetControlIdRight()); } else { DWORD leftID = GetControlIdLeft(); DWORD rightID = GetControlIdRight(); if (m_children.size()) { CGUIControl *left = m_children[0]; if (rightID == GetID()) rightID = left->GetID(); if (leftID == GetID()) left->SetNavigation(GetControlIdUp(), GetControlIdDown(), control->GetID(), left->GetControlIdRight()); CGUIControl *prev = m_children[m_children.size() - 1]; leftID = prev->GetID(); prev->SetNavigation(GetControlIdUp(), GetControlIdDown(), prev->GetControlIdLeft(), control->GetID()); } control->SetNavigation(GetControlIdUp(), GetControlIdDown(), leftID, rightID); } // old versions of the grouplist used to set the positions of all controls // directly. The new version (with <usecontrolcoords>true</usecontrolcoords>) // allows offsets to be set via the posx, posy coordinates. if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control); } }
void CGUIMediaWindow::OnWindowLoaded() { CGUIWindow::OnWindowLoaded(); m_viewControl.Reset(); m_viewControl.SetParentWindow(GetID()); vector<CGUIControl *> controls; GetContainers(controls); for (ciControls it = controls.begin(); it != controls.end(); it++) { CGUIControl *control = *it; if (control->GetID() >= CONTROL_VIEW_START && control->GetID() <= CONTROL_VIEW_END) m_viewControl.AddView(control); } m_viewControl.SetViewControlID(CONTROL_BTNVIEWASICONS); SetupShares(); }
bool CGUIDialogKeyboardGeneric::OnAction(const CAction &action) { bool handled = true; if (action.GetID() == (KEY_VKEY | XBMCVK_BACK)) Backspace(); else if (action.GetID() == ACTION_ENTER || (m_isKeyboardNavigationMode && action.GetID() == ACTION_SELECT_ITEM)) OnOK(); else if (action.GetID() == ACTION_SHIFT) OnShift(); else if (action.GetID() == ACTION_SYMBOLS) OnSymbols(); // don't handle move left/right and select in the edit control else if (!m_isKeyboardNavigationMode && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT || action.GetID() == ACTION_SELECT_ITEM)) handled = false; else { handled = false; wchar_t unicode = action.GetUnicode(); if (unicode) { std::wstring wch = L""; wch.insert(wch.begin(), unicode); std::string ch; g_charsetConverter.wToUTF8(wch, ch); handled = CodingCharacter(ch); if (!handled) { // send action to edit control CGUIControl *edit = GetControl(CTL_EDIT); if (edit) handled = edit->OnAction(action); if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII) { BYTE b = action.GetID() & 0xFF; if (b == XBMCVK_TAB) { // Toggle left/right key mode m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode; if (m_isKeyboardNavigationMode) { m_previouslyFocusedButton = GetFocusedControlID(); SET_CONTROL_FOCUS(edit->GetID(), 0); } else SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0); handled = true; } } } } } if (!handled) // unhandled by us - let's see if the baseclass wants it handled = CGUIDialog::OnAction(action); return handled; }
bool CGUIWindowSettings::OnAction(const CAction &action) { if (action.id == ACTION_PREVIOUS_MENU) { g_windowManager.PreviousWindow(); return true; } else if (action.id == ACTION_PARENT_DIR) { g_windowManager.PreviousWindow(); return true; } else if (action.id == ACTION_SELECT_ITEM) { CGUIControl *focusedControl = GetFocusedControl(); if (focusedControl && focusedControl->IsContainer()) { m_iSelectedControl = focusedControl->GetID(); CGUIBaseContainer* container = (CGUIBaseContainer*)focusedControl; m_iSelectedItem = container->GetSelectedItem(); } } return CGUIWindow::OnAction(action); }
int CGUIControlGroup::GetFocusedControlID() const { if (m_focusedControl) return m_focusedControl; CGUIControl *control = GetFocusedControl(); if (control) return control->GetID(); return 0; }
bool CGUIDialogAddonSettings::OnAction(const CAction& action) { if (action.GetID() == ACTION_DELETE_ITEM) { CGUIControl* pControl = GetFocusedControl(); if (pControl) { int iControl = pControl->GetID(); int controlId = CONTROL_START_SETTING; const TiXmlElement* setting = GetFirstSetting(); UpdateFromControls(); while (setting) { if (controlId == iControl) { const char* id = setting->Attribute("id"); const char* value = setting->Attribute("default"); if (id && value) m_settings[id] = value; CreateControls(); CGUIMessage msg(GUI_MSG_SETFOCUS,GetID(),iControl); OnMessage(msg); return true; } setting = setting->NextSiblingElement("setting"); controlId++; } } } return CGUIDialogBoxBase::OnAction(action); }
void CGUIListGroup::EnlargeHeight(float difference) { // Alters the width of the controls that have an ID of 1 for (iControls it = m_children.begin(); it != m_children.end(); it++) { CGUIControl *child = *it; if (child->GetID() >= 1 && child->GetID() <= 14) { if (child->GetID() == 1) // label { child->SetHeight(child->GetHeight() + difference); child->SetVisible(child->GetHeight() > 10); /// } else { child->SetHeight(child->GetHeight() + difference); } } } SetInvalid(); }
bool CGUIDialogKeyboardGeneric::OnAction(const CAction &action) { bool handled = true; if (action.GetID() == ACTION_ENTER || (m_isKeyboardNavigationMode && action.GetID() == ACTION_SELECT_ITEM)) OnOK(); else if (action.GetID() == ACTION_SHIFT) OnShift(); else if (action.GetID() == ACTION_SYMBOLS) OnSymbols(); // don't handle move left/right and select in the edit control else if (!m_isKeyboardNavigationMode && (action.GetID() == ACTION_MOVE_LEFT || action.GetID() == ACTION_MOVE_RIGHT || action.GetID() == ACTION_SELECT_ITEM)) handled = false; else { handled = false; // send action to edit control CGUIControl *edit = GetControl(CTL_EDIT); if (edit) handled = edit->OnAction(action); if (!handled && action.GetID() >= KEY_VKEY && action.GetID() < KEY_ASCII) { BYTE b = action.GetID() & 0xFF; if (b == XBMCVK_TAB) { // Toggle left/right key mode m_isKeyboardNavigationMode = !m_isKeyboardNavigationMode; if (m_isKeyboardNavigationMode) { m_previouslyFocusedButton = GetFocusedControlID(); SET_CONTROL_FOCUS(edit->GetID(), 0); } else SET_CONTROL_FOCUS(m_previouslyFocusedButton, 0); handled = true; } } } if (!handled) // unhandled by us - let's see if the baseclass wants it handled = CGUIDialog::OnAction(action); return handled; }
// in the case of id == 0, we don't match id CGUIControl *CGUIControlGroup::GetFirstFocusableControl(int id) { if (!CanFocus()) return NULL; if (id && id == (int) GetID()) return this; // we're focusable and they want us for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl* pControl = *it; if (pControl->IsGroup()) { CGUIControlGroup *group = (CGUIControlGroup *)pControl; CGUIControl *control = group->GetFirstFocusableControl(id); if (control) return control; } if ((!id || (int) pControl->GetID() == id) && pControl->CanFocus()) return pControl; } return NULL; }
// Note: This routine doesn't delete the control. It just removes it from the control list bool CGUIControlGroup::RemoveControl(int id) { for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; if (control->IsGroup()) { CGUIControlGroup *group = (CGUIControlGroup *)control; if (group->RemoveControl(id)) return true; } if ((int) control->GetID() == id) { m_children.erase(it); return true; } } return false; }
// returns true if the control group with id groupID has controlID as // its focused control bool CGUIWindow::ControlGroupHasFocus(int groupID, int controlID) { // 1. Run through and get control with groupID (assume unique) // 2. Get it's selected item. CGUIControl *group = GetFirstFocusableControl(groupID); if (!group) group = (CGUIControl *)GetControl(groupID); if (group && group->IsGroup()) { if (controlID == 0) { // just want to know if the group is focused return group->HasFocus(); } else { CGUIMessage message(GUI_MSG_ITEM_SELECTED, GetID(), group->GetID()); group->OnMessage(message); return (controlID == (int) message.GetParam1()); } } return false; }
void CGUIViewControl::SelectVisibleView(int iViewIndex, CGUIControl *previousView, bool focusToVisibleView) { m_currentView = iViewIndex; CGUIControl *pNewView = m_visibleViews[m_currentView]; // make only current control visible... for (ciViews view = m_allViews.begin(); view != m_allViews.end(); view++) (*view)->SetVisible(false); pNewView->SetVisible(true); if (focusToVisibleView) { // if requested -> set focus to the new view CGUIMessage msg(GUI_MSG_SETFOCUS, m_parentWindow, pNewView->GetID(), 0); g_windowManager.SendMessage(msg); } if (pNewView == previousView) return; // no need to actually update anything (other than visibility above) // CLog::Log(LOGDEBUG,"SetCurrentView: Oldview: %i, Newview :%i", m_currentView, viewMode); int item = -1; if (previousView) { // have an old view - let's clear it out and hide it. item = GetSelectedItem(previousView); CGUIMessage msg(GUI_MSG_LABEL_RESET, m_parentWindow, previousView->GetID()); previousView->OnMessage(msg); } // Update it with the contents UpdateContents(pNewView, item, false); // Update our view control UpdateViewAsControl(((CGUIBaseContainer *)pNewView)->GetLabel()); }
void CGUIViewControl::SetCurrentView(int viewMode, bool bRefresh /* = false */) { // grab the previous control CGUIControl *previousView = NULL; if (m_currentView >= 0 && m_currentView < (int)m_visibleViews.size()) previousView = m_visibleViews[m_currentView]; UpdateViewVisibility(); // viewMode is of the form TYPE << 16 | ID VIEW_TYPE type = (VIEW_TYPE)(viewMode >> 16); int id = viewMode & 0xffff; // first find a view that matches this view, if possible... int newView = GetView(type, id); if (newView < 0) // no suitable view that matches both id and type, so try just type newView = GetView(type, 0); if (newView < 0 && type == VIEW_TYPE_BIG_ICON) // try icon view if they want big icon newView = GetView(VIEW_TYPE_ICON, 0); if (newView < 0 && type == VIEW_TYPE_BIG_INFO) newView = GetView(VIEW_TYPE_INFO, 0); if (newView < 0) // try a list view newView = GetView(VIEW_TYPE_LIST, 0); if (newView < 0) // try anything! newView = GetView(VIEW_TYPE_NONE, 0); if (newView < 0) return; m_currentView = newView; CGUIControl *pNewView = m_visibleViews[m_currentView]; // make only current control visible... for (ciViews view = m_allViews.begin(); view != m_allViews.end(); ++view) (*view)->SetVisible(false); pNewView->SetVisible(true); if (!bRefresh && pNewView == previousView) return; // no need to actually update anything (other than visibility above) // CLog::Log(LOGDEBUG,"SetCurrentView: Oldview: %i, Newview :%i", m_currentView, viewMode); bool hasFocus(false); int item = -1; if (previousView) { // have an old view - let's clear it out and hide it. hasFocus = previousView->HasFocus(); item = GetSelectedItem(previousView); CGUIMessage msg(GUI_MSG_LABEL_RESET, m_parentWindow, previousView->GetID()); previousView->OnMessage(msg); } // Update it with the contents UpdateContents(pNewView, item); // and focus if necessary if (hasFocus) { CGUIMessage msg(GUI_MSG_SETFOCUS, m_parentWindow, pNewView->GetID(), 0); g_windowManager.SendMessage(msg, m_parentWindow); } UpdateViewAsControl(((IGUIContainer *)pNewView)->GetLabel()); }
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_ADD_CONTROL: { if (message.GetPointer()) { CGUIControl *control = (CGUIControl *)message.GetPointer(); control->AllocResources(); AddControl(control); } return true; } case GUI_MSG_REMOVE_CONTROL: { if (message.GetPointer()) { CGUIControl *control = (CGUIControl *)message.GetPointer(); RemoveControl(control); control->FreeResources(true); delete control; } return true; } 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); }
void CGUIWindowDebugInfo::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); g_cpuInfo.getUsedPercentage(); // must call it to recalculate pct values static int yShift = 20; static int xShift = 40; static unsigned int lastShift = time(NULL); time_t now = time(NULL); if (now - lastShift > 10) { yShift *= -1; if (now % 5 == 0) xShift *= -1; lastShift = now; MarkDirtyRegion(); } if (!m_layout) { CGUIFont *font13 = g_fontManager.GetDefaultFont(); CGUIFont *font13border = g_fontManager.GetDefaultFont(true); if (font13) m_layout = new CGUITextLayout(font13, true, 0, font13border); } if (!m_layout) return; CStdString info; if (LOG_LEVEL_DEBUG_FREEMEM <= g_advancedSettings.m_logLevel) { MEMORYSTATUS stat; GlobalMemoryStatus(&stat); CStdString profiling = CGUIControlProfiler::IsRunning() ? " (profiling)" : ""; CStdString strCores = g_cpuInfo.GetCoresUsageString(); #if !defined(_LINUX) info.Format("LOG: %sxbmc.log\nMEM: %d/%d KB - FPS: %2.1f fps\nCPU: %s%s", g_settings.m_logFolder.c_str(), stat.dwAvailPhys/1024, stat.dwTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), profiling.c_str()); #else double dCPU = m_resourceCounter.GetCPUUsage(); info.Format("LOG: %sxbmc.log\nMEM: %"PRIu64"/%"PRIu64" KB - FPS: %2.1f fps\nCPU: %s (CPU-XBMC %4.2f%%%s)", g_settings.m_logFolder.c_str(), stat.dwAvailPhys/1024, stat.dwTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), dCPU, profiling.c_str()); #endif } // render the skin debug info if (g_SkinInfo->IsDebugging()) { if (!info.IsEmpty()) info += "\n"; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); CGUIWindow *pointer = g_windowManager.GetWindow(WINDOW_DIALOG_POINTER); CPoint point; if (pointer) point = CPoint(pointer->GetXPosition(), pointer->GetYPosition()); if (window) { CStdString windowName = CButtonTranslator::TranslateWindow(window->GetID()); if (!windowName.IsEmpty()) windowName += " (" + window->GetProperty("xmlfile") + ")"; else windowName = window->GetProperty("xmlfile"); info += "Window: " + windowName + " "; // transform the mouse coordinates to this window's coordinates g_graphicsContext.SetScalingResolution(window->GetCoordsRes(), true); point.x *= g_graphicsContext.GetGUIScaleX(); point.y *= g_graphicsContext.GetGUIScaleY(); g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); } info.AppendFormat("Mouse: (%d,%d) ", (int)point.x, (int)point.y); if (window) { CGUIControl *control = window->GetFocusedControl(); if (control) info.AppendFormat("Focused: %i (%s)", control->GetID(), CGUIControlFactory::TranslateControlType(control->GetControlType()).c_str()); } } float w, h; if (m_layout->Update(info)) MarkDirtyRegion(); m_layout->GetTextExtent(w, h); float x = xShift + 0.04f * g_graphicsContext.GetWidth(); float y = yShift + 0.04f * g_graphicsContext.GetHeight(); m_renderRegion.SetRect(x, y, x+w, y+h); }
/* Searches for a control in Window->vecControls * If we can't find any but the window has the controlId (in case of a not python window) * we create a new control with basic functionality */ Control* Window::GetControlById(int iControlId) throw (WindowException) { TRACE; // find in window vector first!!! // this saves us from creating a complete new control std::vector<AddonClass::Ref<Control> >::iterator it = vecControls.begin(); while (it != vecControls.end()) { AddonClass::Ref<Control> control = (*it); if (control->iControlId == iControlId) { return control.get(); } else ++it; } // lock xbmc GUI before accessing data from it CSingleLock lock(g_graphicsContext); // check if control exists CGUIControl* pGUIControl = (CGUIControl*)ref(window)->GetControl(iControlId); if (!pGUIControl) { // control does not exist. throw WindowException("Non-Existent Control %d",iControlId); } // allocate a new control with a new reference CLabelInfo li; Control* pControl = NULL; // TODO: Yuck! Should probably be done with a Factory pattern switch(pGUIControl->GetControlType()) { case CGUIControl::GUICONTROL_BUTTON: pControl = new ControlButton(); li = ((CGUIButtonControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlButton*)pControl)->disabledColor = li.disabledColor; ((ControlButton*)pControl)->focusedColor = li.focusedColor; ((ControlButton*)pControl)->textColor = li.textColor; ((ControlButton*)pControl)->shadowColor = li.shadowColor; if (li.font) ((ControlButton*)pControl)->strFont = li.font->GetFontName(); ((ControlButton*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_CHECKMARK: pControl = new ControlCheckMark(); li = ((CGUICheckMarkControl *)pGUIControl)->GetLabelInfo(); // note: conversion to plain colors from infocolors. ((ControlCheckMark*)pControl)->disabledColor = li.disabledColor; //((ControlCheckMark*)pControl)->shadowColor = li.shadowColor; ((ControlCheckMark*)pControl)->textColor = li.textColor; if (li.font) ((ControlCheckMark*)pControl)->strFont = li.font->GetFontName(); ((ControlCheckMark*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_LABEL: pControl = new ControlLabel(); break; case CGUIControl::GUICONTROL_SPIN: pControl = new ControlSpin(); break; case CGUIControl::GUICONTROL_FADELABEL: pControl = new ControlFadeLabel(); break; case CGUIControl::GUICONTROL_TEXTBOX: pControl = new ControlTextBox(); break; case CGUIControl::GUICONTROL_IMAGE: pControl = new ControlImage(); break; case CGUIControl::GUICONTROL_PROGRESS: pControl = new ControlProgress(); break; case CGUIControl::GUICONTROL_SLIDER: pControl = new ControlSlider(); break; case CGUIControl::GUICONTAINER_LIST: case CGUIControl::GUICONTAINER_WRAPLIST: case CGUIControl::GUICONTAINER_FIXEDLIST: case CGUIControl::GUICONTAINER_PANEL: pControl = new ControlList(); // create a python spin control ((ControlList*)pControl)->pControlSpin = new ControlSpin(); break; case CGUIControl::GUICONTROL_GROUP: pControl = new ControlGroup(); break; case CGUIControl::GUICONTROL_RADIO: pControl = new ControlRadioButton(); li = ((CGUIRadioButtonControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlRadioButton*)pControl)->disabledColor = li.disabledColor; ((ControlRadioButton*)pControl)->focusedColor = li.focusedColor; ((ControlRadioButton*)pControl)->textColor = li.textColor; ((ControlRadioButton*)pControl)->shadowColor = li.shadowColor; if (li.font) ((ControlRadioButton*)pControl)->strFont = li.font->GetFontName(); ((ControlRadioButton*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_EDIT: pControl = new ControlEdit(); li = ((CGUIEditControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlEdit*)pControl)->disabledColor = li.disabledColor; ((ControlEdit*)pControl)->textColor = li.textColor; if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); ((ControlButton*)pControl)->align = li.align; break; default: break; } if (!pControl) // throw an exeption throw WindowException("Unknown control type for python"); // we have a valid control here, fill in all the 'Control' data pControl->pGUIControl = pGUIControl; pControl->iControlId = pGUIControl->GetID(); pControl->iParentId = iWindowId; pControl->dwHeight = (int)pGUIControl->GetHeight(); pControl->dwWidth = (int)pGUIControl->GetWidth(); pControl->dwPosX = (int)pGUIControl->GetXPosition(); pControl->dwPosY = (int)pGUIControl->GetYPosition(); pControl->iControlUp = pGUIControl->GetControlIdUp(); pControl->iControlDown = pGUIControl->GetControlIdDown(); pControl->iControlLeft = pGUIControl->GetControlIdLeft(); pControl->iControlRight = pGUIControl->GetControlIdRight(); // It got this far so means the control isn't actually in the vector of controls // so lets add it to save doing all that next time vecControls.push_back(AddonClass::Ref<Control>(pControl)); // return the control with increased reference (+1) return pControl; }
bool CGUIControlGroup::OnMessage(CGUIMessage& message) { switch (message.GetMessage() ) { case GUI_MSG_ITEM_SELECT: { if (message.GetControlId() == GetID()) { m_focusedControl = message.GetParam1(); return true; } break; } case GUI_MSG_ITEM_SELECTED: { if (message.GetControlId() == GetID()) { message.SetParam1(m_focusedControl); return true; } break; } case GUI_MSG_FOCUSED: { // a control has been focused m_focusedControl = message.GetControlId(); SetFocus(true); // tell our parent thatwe have focus if (m_parentControl) m_parentControl->OnMessage(message); return true; } case GUI_MSG_SETFOCUS: { // first try our last focused control... if (!m_defaultAlways && m_focusedControl) { CGUIControl *control = GetFirstFocusableControl(m_focusedControl); if (control) { CGUIMessage msg(GUI_MSG_SETFOCUS, GetParentID(), control->GetID()); return control->OnMessage(msg); } } // ok, no previously focused control, try the default control first if (m_defaultControl) { CGUIControl *control = GetFirstFocusableControl(m_defaultControl); if (control) { CGUIMessage msg(GUI_MSG_SETFOCUS, GetParentID(), control->GetID()); return control->OnMessage(msg); } } // no success with the default control, so just find one to focus CGUIControl *control = GetFirstFocusableControl(0); if (control) { CGUIMessage msg(GUI_MSG_SETFOCUS, GetParentID(), control->GetID()); return control->OnMessage(msg); } // unsuccessful return false; break; } case GUI_MSG_LOSTFOCUS: { // set all subcontrols unfocused for (iControls it = m_children.begin(); it != m_children.end(); ++it) (*it)->SetFocus(false); if (!HasID(message.GetParam1())) { // we don't have the new id, so unfocus SetFocus(false); if (m_parentControl) m_parentControl->OnMessage(message); } return true; } break; case GUI_MSG_PAGE_CHANGE: case GUI_MSG_REFRESH_THUMBS: case GUI_MSG_REFRESH_LIST: case GUI_MSG_WINDOW_RESIZE: { // send to all child controls (make sure the target is the control id) for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIMessage msg(message.GetMessage(), message.GetSenderId(), (*it)->GetID(), message.GetParam1()); (*it)->OnMessage(msg); } return true; } break; } bool handled(false); //not intented for any specific control, send to all childs and our base handler. if (message.GetControlId() == 0) { for (iControls it = m_children.begin();it != m_children.end(); ++it) { CGUIControl* control = *it; handled |= control->OnMessage(message); } return CGUIControl::OnMessage(message) || handled; } // if it's intended for us, then so be it if (message.GetControlId() == GetID()) return CGUIControl::OnMessage(message); return SendControlMessage(message); }
void CGUIControlGroupList::AddControl(CGUIControl *control, int position /*= -1*/) { // NOTE: We override control navigation here, but we don't override the <onleft> etc. builtins // if specified. if (position < 0 || position > (int)m_children.size()) // add at the end position = (int)m_children.size(); if (control) { // set the navigation of items so that they form a list CGUIAction beforeAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_UP : ACTION_MOVE_LEFT); CGUIAction afterAction = GetAction((m_orientation == VERTICAL) ? ACTION_MOVE_DOWN : ACTION_MOVE_RIGHT); if (m_children.size()) { // we're inserting at the given position, so grab the items above and below and alter // their navigation accordingly CGUIControl *before = NULL; CGUIControl *after = NULL; if (position == 0) { // inserting at the beginning after = m_children[0]; if (!afterAction.HasActionsMeetingCondition() || afterAction.GetNavigation() == GetID()) // we're wrapping around bottom->top, so we have to update the last item before = m_children[m_children.size() - 1]; if (!beforeAction.HasActionsMeetingCondition() || beforeAction.GetNavigation() == GetID()) // we're wrapping around top->bottom beforeAction = CGUIAction(m_children[m_children.size() - 1]->GetID()); afterAction = CGUIAction(after->GetID()); } else if (position == (int)m_children.size()) { // inserting at the end before = m_children[m_children.size() - 1]; if (!beforeAction.HasActionsMeetingCondition() || beforeAction.GetNavigation() == GetID()) // we're wrapping around top->bottom, so we have to update the first item after = m_children[0]; if (!afterAction.HasActionsMeetingCondition() || afterAction.GetNavigation() == GetID()) // we're wrapping around bottom->top afterAction = CGUIAction(m_children[0]->GetID()); beforeAction = CGUIAction(before->GetID()); } else { // inserting somewhere in the middle before = m_children[position - 1]; after = m_children[position]; beforeAction = CGUIAction(before->GetID()); afterAction = CGUIAction(after->GetID()); } if (m_orientation == VERTICAL) { if (before) // update the DOWN action to point to us before->SetAction(ACTION_MOVE_DOWN, CGUIAction(control->GetID())); if (after) // update the UP action to point to us after->SetAction(ACTION_MOVE_UP, CGUIAction(control->GetID())); } else { if (before) // update the RIGHT action to point to us before->SetAction(ACTION_MOVE_RIGHT, CGUIAction(control->GetID())); if (after) // update the LEFT action to point to us after->SetAction(ACTION_MOVE_LEFT, CGUIAction(control->GetID())); } } // now the control's nav // set navigation path on orientation axis // and try to apply other nav actions from grouplist // don't override them if child have already defined actions if (m_orientation == VERTICAL) { control->SetAction(ACTION_MOVE_UP, beforeAction); control->SetAction(ACTION_MOVE_DOWN, afterAction); control->SetAction(ACTION_MOVE_LEFT, GetAction(ACTION_MOVE_LEFT), false); control->SetAction(ACTION_MOVE_RIGHT, GetAction(ACTION_MOVE_RIGHT), false); } else { control->SetAction(ACTION_MOVE_LEFT, beforeAction); control->SetAction(ACTION_MOVE_RIGHT, afterAction); control->SetAction(ACTION_MOVE_UP, GetAction(ACTION_MOVE_UP), false); control->SetAction(ACTION_MOVE_DOWN, GetAction(ACTION_MOVE_DOWN), false); } control->SetAction(ACTION_NAV_BACK, GetAction(ACTION_NAV_BACK), false); if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control, position); m_totalSize = GetTotalSize(); } }
bool CGUIControlGroupList::OnMessage(CGUIMessage& message) { switch (message.GetMessage() ) { case GUI_MSG_FOCUSED: { // a control has been focused // scroll if we need to and update our page control ValidateOffset(); float offset = 0; for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; if (!control->IsVisible()) continue; if (control->GetID() == message.GetControlId()) { // find out whether this is the first or last control if (IsFirstFocusableControl(control)) ScrollTo(0); else if (IsLastFocusableControl(control)) ScrollTo(m_totalSize - Size()); else if (offset < m_scroller.GetValue()) ScrollTo(offset); else if (offset + Size(control) > m_scroller.GetValue() + Size()) ScrollTo(offset + Size(control) - Size()); break; } offset += Size(control) + m_itemGap; } } break; case GUI_MSG_SETFOCUS: { // we've been asked to focus. We focus the last control if it's on this page, // else we'll focus the first focusable control from our offset (after verifying it) ValidateOffset(); // now check the focusControl's offset float offset = 0; for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; if (!control->IsVisible()) continue; if (control->GetID() == m_focusedControl) { if (IsControlOnScreen(offset, control)) return CGUIControlGroup::OnMessage(message); break; } offset += Size(control) + m_itemGap; } // find the first control on this page offset = 0; for (iControls it = m_children.begin(); it != m_children.end(); ++it) { CGUIControl *control = *it; if (!control->IsVisible()) continue; if (control->CanFocus() && IsControlOnScreen(offset, control)) { m_focusedControl = control->GetID(); break; } offset += Size(control) + m_itemGap; } } break; case GUI_MSG_PAGE_CHANGE: { if (message.GetSenderId() == m_pageControl) { // it's from our page control ScrollTo((float)message.GetParam1()); return true; } } break; } return CGUIControlGroup::OnMessage(message); }
void CGUIControlGroupList::AddControl(CGUIControl *control, int position /*= -1*/) { // NOTE: We override control navigation here, but we don't override the <onleft> etc. builtins // if specified. if (position < 0 || position > (int)m_children.size()) // add at the end position = (int)m_children.size(); if (control) { // set the navigation of items so that they form a list int beforeID = (m_orientation == VERTICAL) ? GetControlIdUp() : GetControlIdLeft(); int afterID = (m_orientation == VERTICAL) ? GetControlIdDown() : GetControlIdRight(); if (m_children.size()) { // we're inserting at the given position, so grab the items above and below and alter // their navigation accordingly CGUIControl *before = NULL; CGUIControl *after = NULL; if (position == 0) { // inserting at the beginning after = m_children[0]; if (afterID == GetID()) // we're wrapping around bottom->top, so we have to update the last item before = m_children[m_children.size() - 1]; if (beforeID == GetID()) // we're wrapping around top->bottom beforeID = m_children[m_children.size() - 1]->GetID(); afterID = after->GetID(); } else if (position == (int)m_children.size()) { // inserting at the end before = m_children[m_children.size() - 1]; if (beforeID == GetID()) // we're wrapping around top->bottom, so we have to update the first item after = m_children[0]; if (afterID == GetID()) // we're wrapping around bottom->top afterID = m_children[0]->GetID(); beforeID = before->GetID(); } else { // inserting somewhere in the middle before = m_children[position - 1]; after = m_children[position]; beforeID = before->GetID(); afterID = after->GetID(); } if (m_orientation == VERTICAL) { if (before) // update the DOWN action to point to us before->SetNavigation(before->GetControlIdUp(), control->GetID(), GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); if (after) // update the UP action to point to us after->SetNavigation(control->GetID(), after->GetControlIdDown(), GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); } else { if (before) // update the RIGHT action to point to us before->SetNavigation(GetControlIdUp(), GetControlIdDown(), before->GetControlIdLeft(), control->GetID(), GetControlIdBack()); if (after) // update the LEFT action to point to us after->SetNavigation(GetControlIdUp(), GetControlIdDown(), control->GetID(), after->GetControlIdRight(), GetControlIdBack()); } } // now the control's nav std::vector<CGUIActionDescriptor> empty; if (m_orientation == VERTICAL) { control->SetNavigation(beforeID, afterID, GetControlIdLeft(), GetControlIdRight(), GetControlIdBack()); control->SetNavigationActions(empty, empty, m_leftActions, m_rightActions, empty, false); } else { control->SetNavigation(GetControlIdUp(), GetControlIdDown(), beforeID, afterID, GetControlIdBack()); control->SetNavigationActions(m_upActions, m_downActions, empty, empty, empty, false); } if (!m_useControlPositions) control->SetPosition(0,0); CGUIControlGroup::AddControl(control, position); } }
/* Searches for a control in Window->vecControls * If we can't find any but the window has the controlId (in case of a not python window) * we create a new control with basic functionality */ Control* Window_GetControlById(Window* self, int iControlId) { Control* pControl = NULL; // find in window vector first!!! // this saves us from creating a complete new control vector<Control*>::iterator it = self->vecControls.begin(); while (it != self->vecControls.end()) { Control* control = *it; if (control->iControlId == iControlId) { Py_INCREF(control); return control; } else ++it; } // lock xbmc GUI before accessing data from it GilSafeSingleLock lock(g_graphicsContext); // check if control exists CGUIControl* pGUIControl = (CGUIControl*)self->pWindow->GetControl(iControlId); if (!pGUIControl) { // control does not exist. CStdString error; error.Format("Non-Existent Control %d",iControlId); PyErr_SetString(PyExc_TypeError, error.c_str()); return NULL; } // allocate a new control with a new reference CLabelInfo li; switch(pGUIControl->GetControlType()) { case CGUIControl::GUICONTROL_BUTTON: pControl = (Control*)ControlButton_Type.tp_alloc(&ControlButton_Type, 0); new(&((ControlButton*)pControl)->strFont) string(); new(&((ControlButton*)pControl)->strText) string(); new(&((ControlButton*)pControl)->strText2) string(); new(&((ControlButton*)pControl)->strTextureFocus) string(); new(&((ControlButton*)pControl)->strTextureNoFocus) string(); li = ((CGUIButtonControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlButton*)pControl)->disabledColor = li.disabledColor; ((ControlButton*)pControl)->focusedColor = li.focusedColor; ((ControlButton*)pControl)->textColor = li.textColor; ((ControlButton*)pControl)->shadowColor = li.shadowColor; if (li.font) ((ControlButton*)pControl)->strFont = li.font->GetFontName(); ((ControlButton*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_CHECKMARK: pControl = (Control*)ControlCheckMark_Type.tp_alloc(&ControlCheckMark_Type, 0); new(&((ControlCheckMark*)pControl)->strFont) string(); new(&((ControlCheckMark*)pControl)->strText) string(); new(&((ControlCheckMark*)pControl)->strTextureFocus) string(); new(&((ControlCheckMark*)pControl)->strTextureNoFocus) string(); li = ((CGUICheckMarkControl *)pGUIControl)->GetLabelInfo(); // note: conversion to plain colors from infocolors. ((ControlCheckMark*)pControl)->disabledColor = li.disabledColor; //((ControlCheckMark*)pControl)->shadowColor = li.shadowColor; ((ControlCheckMark*)pControl)->textColor = li.textColor; if (li.font) ((ControlCheckMark*)pControl)->strFont = li.font->GetFontName(); ((ControlCheckMark*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_LABEL: pControl = (Control*)ControlLabel_Type.tp_alloc(&ControlLabel_Type, 0); new(&((ControlLabel*)pControl)->strText) string(); new(&((ControlLabel*)pControl)->strFont) string(); break; case CGUIControl::GUICONTROL_SPIN: pControl = (Control*)ControlSpin_Type.tp_alloc(&ControlSpin_Type, 0); new(&((ControlSpin*)pControl)->strTextureUp) string(); new(&((ControlSpin*)pControl)->strTextureDown) string(); new(&((ControlSpin*)pControl)->strTextureUpFocus) string(); new(&((ControlSpin*)pControl)->strTextureDownFocus) string(); break; case CGUIControl::GUICONTROL_FADELABEL: pControl = (Control*)ControlFadeLabel_Type.tp_alloc(&ControlFadeLabel_Type, 0); new(&((ControlFadeLabel*)pControl)->strFont) string(); new(&((ControlFadeLabel*)pControl)->vecLabels) std::vector<string>(); break; case CGUIControl::GUICONTROL_TEXTBOX: pControl = (Control*)ControlTextBox_Type.tp_alloc(&ControlTextBox_Type, 0); new(&((ControlTextBox*)pControl)->strFont) string(); break; case CGUIControl::GUICONTROL_IMAGE: pControl = (Control*)ControlImage_Type.tp_alloc(&ControlImage_Type, 0); new(&((ControlImage*)pControl)->strFileName) string(); break; case CGUIControl::GUICONTROL_PROGRESS: pControl = (Control*)ControlProgress_Type.tp_alloc(&ControlProgress_Type, 0); new(&((ControlProgress*)pControl)->strTextureLeft) string(); new(&((ControlProgress*)pControl)->strTextureMid) string(); new(&((ControlProgress*)pControl)->strTextureRight) string(); new(&((ControlProgress*)pControl)->strTextureBg) string(); new(&((ControlProgress*)pControl)->strTextureOverlay) string(); break; case CGUIControl::GUICONTROL_SLIDER: pControl = (Control*)ControlSlider_Type.tp_alloc(&ControlSlider_Type, 0); new(&((ControlSlider*)pControl)->strTextureBack) string(); new(&((ControlSlider*)pControl)->strTexture) string(); new(&((ControlSlider*)pControl)->strTextureFoc) string(); break; case CGUIControl::GUICONTAINER_LIST: case CGUIControl::GUICONTAINER_WRAPLIST: case CGUIControl::GUICONTAINER_FIXEDLIST: case CGUIControl::GUICONTAINER_PANEL: pControl = (Control*)ControlList_Type.tp_alloc(&ControlList_Type, 0); new(&((ControlList*)pControl)->strFont) string(); new(&((ControlList*)pControl)->strTextureButton) string(); new(&((ControlList*)pControl)->strTextureButtonFocus) string(); new(&((ControlList*)pControl)->vecItems) std::vector<PYXBMC::ListItem*>(); // create a python spin control ((ControlList*)pControl)->pControlSpin = (ControlSpin*)ControlSpin_New(); break; case CGUIControl::GUICONTROL_GROUP: pControl = (Control*)ControlGroup_Type.tp_alloc(&ControlGroup_Type, 0); break; case CGUIControl::GUICONTROL_RADIO: pControl = (Control*)ControlRadioButton_Type.tp_alloc(&ControlRadioButton_Type, 0); new(&((ControlRadioButton*)pControl)->strFont) string(); new(&((ControlRadioButton*)pControl)->strText) string(); new(&((ControlRadioButton*)pControl)->strTextureFocus) string(); new(&((ControlRadioButton*)pControl)->strTextureNoFocus) string(); new(&((ControlRadioButton*)pControl)->strTextureRadioFocus) string(); new(&((ControlRadioButton*)pControl)->strTextureRadioNoFocus) string(); li = ((CGUIRadioButtonControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlRadioButton*)pControl)->disabledColor = li.disabledColor; ((ControlRadioButton*)pControl)->focusedColor = li.focusedColor; ((ControlRadioButton*)pControl)->textColor = li.textColor; ((ControlRadioButton*)pControl)->shadowColor = li.shadowColor; if (li.font) ((ControlRadioButton*)pControl)->strFont = li.font->GetFontName(); ((ControlRadioButton*)pControl)->align = li.align; break; case CGUIControl::GUICONTROL_EDIT: pControl = (Control*)ControlEdit_Type.tp_alloc(&ControlEdit_Type, 0); new(&((ControlEdit*)pControl)->strFont) string(); new(&((ControlEdit*)pControl)->strText) string(); new(&((ControlEdit*)pControl)->strTextureFocus) string(); new(&((ControlEdit*)pControl)->strTextureNoFocus) string(); li = ((CGUIEditControl *)pGUIControl)->GetLabelInfo(); // note: conversion from infocolors -> plain colors here ((ControlEdit*)pControl)->disabledColor = li.disabledColor; ((ControlEdit*)pControl)->textColor = li.textColor; if (li.font) ((ControlEdit*)pControl)->strFont = li.font->GetFontName(); ((ControlButton*)pControl)->align = li.align; break; default: break; } if (!pControl) { // throw an exeption PyErr_SetString(PyExc_Exception, "Unknown control type for python"); return NULL; } Py_INCREF(pControl); // we have a valid control here, fill in all the 'Control' data pControl->pGUIControl = pGUIControl; pControl->iControlId = pGUIControl->GetID(); pControl->iParentId = self->iWindowId; pControl->dwHeight = (int)pGUIControl->GetHeight(); pControl->dwWidth = (int)pGUIControl->GetWidth(); pControl->dwPosX = (int)pGUIControl->GetXPosition(); pControl->dwPosY = (int)pGUIControl->GetYPosition(); pControl->iControlUp = pGUIControl->GetControlIdUp(); pControl->iControlDown = pGUIControl->GetControlIdDown(); pControl->iControlLeft = pGUIControl->GetControlIdLeft(); pControl->iControlRight = pGUIControl->GetControlIdRight(); // It got this far so means the control isn't actually in the vector of controls // so lets add it to save doing all that next time self->vecControls.push_back(pControl); // return the control with increased reference (+1) return pControl; }
void CGUIWindowDebugInfo::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions) { g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); g_cpuInfo.getUsedPercentage(); // must call it to recalculate pct values static int yShift = 20; static int xShift = 40; static unsigned int lastShift = time(nullptr); time_t now = time(nullptr); if (now - lastShift > 10) { yShift *= -1; if (now % 5 == 0) xShift *= -1; lastShift = now; MarkDirtyRegion(); } if (!m_layout) { CGUIFont *font13 = g_fontManager.GetDefaultFont(); CGUIFont *font13border = g_fontManager.GetDefaultFont(true); if (font13) m_layout = new CGUITextLayout(font13, true, 0, font13border); } if (!m_layout) return; std::string info; if (LOG_LEVEL_DEBUG_FREEMEM <= g_advancedSettings.m_logLevel) { MEMORYSTATUSEX stat; stat.dwLength = sizeof(MEMORYSTATUSEX); GlobalMemoryStatusEx(&stat); std::string profiling = CGUIControlProfiler::IsRunning() ? " (profiling)" : ""; std::string strCores = g_cpuInfo.GetCoresUsageString(); std::string lcAppName = CCompileInfo::GetAppName(); StringUtils::ToLower(lcAppName); #if !defined(TARGET_POSIX) info = StringUtils::Format("LOG: %s%s.log\nMEM: %" PRIu64"/%" PRIu64" KB - FPS: %2.1f fps\nCPU: %s%s", CSpecialProtocol::TranslatePath("special://logpath").c_str(), lcAppName.c_str(), stat.ullAvailPhys/1024, stat.ullTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), profiling.c_str()); #else double dCPU = m_resourceCounter.GetCPUUsage(); std::string ucAppName = lcAppName; StringUtils::ToUpper(ucAppName); info = StringUtils::Format("LOG: %s%s.log\n" "MEM: %" PRIu64"/%" PRIu64" KB - FPS: %2.1f fps\n" "CPU: %s (CPU-%s %4.2f%%%s)", CSpecialProtocol::TranslatePath("special://logpath").c_str(), lcAppName.c_str(), stat.ullAvailPhys/1024, stat.ullTotalPhys/1024, g_infoManager.GetFPS(), strCores.c_str(), ucAppName.c_str(), dCPU, profiling.c_str()); #endif } // render the skin debug info if (g_SkinInfo->IsDebugging()) { if (!info.empty()) info += "\n"; CGUIWindow *window = g_windowManager.GetWindow(g_windowManager.GetFocusedWindow()); CGUIWindow *pointer = g_windowManager.GetWindow(WINDOW_DIALOG_POINTER); CPoint point; if (pointer) point = CPoint(pointer->GetXPosition(), pointer->GetYPosition()); if (window) { std::string windowName = CWindowTranslator::TranslateWindow(window->GetID()); if (!windowName.empty()) windowName += " (" + std::string(window->GetProperty("xmlfile").asString()) + ")"; else windowName = window->GetProperty("xmlfile").asString(); info += "Window: " + windowName + "\n"; // transform the mouse coordinates to this window's coordinates g_graphicsContext.SetScalingResolution(window->GetCoordsRes(), true); point.x *= g_graphicsContext.GetGUIScaleX(); point.y *= g_graphicsContext.GetGUIScaleY(); g_graphicsContext.SetRenderingResolution(g_graphicsContext.GetResInfo(), false); } info += StringUtils::Format("Mouse: (%d,%d) ", static_cast<int>(point.x), static_cast<int>(point.y)); if (window) { CGUIControl *control = window->GetFocusedControl(); if (control) info += StringUtils::Format("Focused: %i (%s)", control->GetID(), CGUIControlFactory::TranslateControlType(control->GetControlType()).c_str()); } } float w, h; if (m_layout->Update(info)) MarkDirtyRegion(); m_layout->GetTextExtent(w, h); float x = xShift + 0.04f * g_graphicsContext.GetWidth(); float y = yShift + 0.04f * g_graphicsContext.GetHeight(); m_renderRegion.SetRect(x, y, x+w, y+h); }
bool CGUIWindow::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_WINDOW_LOAD: { Initialize(); return true; } break; case GUI_MSG_WINDOW_INIT: { CLog::Log(LOGDEBUG, "------ Window Init (%s) ------", GetProperty("xmlfile").c_str()); if (m_dynamicResourceAlloc || !m_bAllocated) AllocResources(false); 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_UNFOCUS_ALL: { //unfocus the current focused control in this window CGUIControl *control = GetFocusedControl(); if(control) { //tell focused control that it has lost the focus CGUIMessage msgLostFocus(GUI_MSG_LOSTFOCUS, GetID(), control->GetID(), control->GetID()); control->OnMessage(msgLostFocus); CLog::Log(LOGDEBUG, "Unfocus WindowID: %i, ControlID: %i",GetID(), control->GetID()); } return true; } 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 = 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, static_cast<float>(message.GetParam1()), static_cast<float>(message.GetParam2()), 0, 0); EVENT_RESULT result = OnMouseAction(action); auto res = new int(result); message.SetPointer(static_cast<void*>(res)); return result != EVENT_RESULT_UNHANDLED; } case GUI_MSG_ADD_CONTROL: { if (message.GetPointer()) { CGUIControl *control = static_cast<CGUIControl*>(message.GetPointer()); control->AllocResources(); AddControl(control); } return true; } case GUI_MSG_REMOVE_CONTROL: { if (message.GetPointer()) { CGUIControl *control = static_cast<CGUIControl*>(message.GetPointer()); RemoveControl(control); control->FreeResources(true); delete control; } return true; } 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); } } else if (message.GetParam1() == GUI_MSG_STATE_CHANGED) MarkDirtyRegion(DIRTY_STATE_CHILD); //Don't force an dirtyRect, we don't know if / what has changed. } } break; } return CGUIControlGroup::OnMessage(message); }