void UIScreenEldBindInputs::InitializeFromDefinition( const SimpleString& DefinitionName )
{
	FlushWidgets();

	UIScreen::InitializeFromDefinition( DefinitionName );

	EldritchFramework* const	pFramework		= EldritchFramework::GetInstance();
	ASSERT( pFramework );

	InputSystem* const			pInputSystem	= pFramework->GetInputSystem();
	ASSERT( pInputSystem );

	const Array<SimpleString>&	ExposedInputs	= pInputSystem->GetExposedInputs();
	ASSERT( ExposedInputs.Size() );

	MAKEHASH( DefinitionName );

	CreateRulesDefinition();

	const uint NumExposedInputs = ExposedInputs.Size();
	for( m_ExposedInputIndex = 0; m_ExposedInputIndex < NumExposedInputs; ++m_ExposedInputIndex )
	{
		m_ExposedInput	= ExposedInputs[ m_ExposedInputIndex ];
		m_Y				= m_YBase + m_ExposedInputIndex * m_YStep;

		CreateLabelWidgetDefinition();
		CreateKeyboardWidgetDefinition();
		CreateMouseWidgetDefinition();
		CreateControllerWidgetDefinition();
		CreateBindingActionDefinition();
		CreateCompositeWidgetDefinition();
		CreateCompositeWidget();
	}

	UpdateRender();

	// Initialize focus to the first element (so that we're never unfocused,
	// because that doesn't make sense for controllers).
	if( m_FocusWidgets.Size() > 0 )
	{
		m_FocusedWidget = m_FocusWidgets[0];
		// NOTE: Intentionally not calling SetFocus here, so effects don't happen; we
		// just need an initial focus for controllers, it's not really *getting* focus
	}
}
Esempio n. 2
0
void UIScreenEldSetRes::InitializeFromDefinition(
    const SimpleString& DefinitionName) {
  FlushWidgets();
  m_ResMap.Clear();

  UIScreen::InitializeFromDefinition(DefinitionName);

  Display* const pDisplay = m_UIManager->GetDisplay();
  Array<SDisplayMode> DisplayModes;
  m_UIManager->GetRenderer()->EnumerateDisplayModes(DisplayModes);
  DisplayModes.InsertionSort();
  ASSERT(DisplayModes.Size());

  MAKEHASH(DefinitionName);

  // Dynamically create definitions for each text button

  STATICHASH(Rules);
  SimpleString UsingRules =
      ConfigManager::GetString(sRules, "", sDefinitionName);

  MAKEHASH(UsingRules);

  STATICHASH(Archetype);
  const char* const ArchetypeName =
      ConfigManager::GetString(sArchetype, "", sUsingRules);

  STATICHASH(Parent);
  const char* const Parent = ConfigManager::GetString(sParent, "", sUsingRules);

  STATICHASH(PixelYBase);
  const float YBase = ConfigManager::GetFloat(sPixelYBase, 0.0f, sUsingRules);

  STATICHASH(PixelYStep);
  const float YStep = ConfigManager::GetFloat(sPixelYStep, 0.0f, sUsingRules);

  STATICHASH(Column0PixelX);
  const float Column0X =
      ConfigManager::GetFloat(sColumn0PixelX, 0.0f, sUsingRules);

  STATICHASH(Column1PixelX);
  const float Column1X =
      ConfigManager::GetFloat(sColumn1PixelX, 0.0f, sUsingRules);

#if DEBUG_SETRES
  PRINTF("UIScreenEldSetRes info:\n");
  PRINTF("  ScreenWidth:  %d\n", pDisplay->m_ScreenWidth);
  PRINTF("  ScreenHeight: %d\n", pDisplay->m_ScreenHeight);
#endif

  FOR_EACH_ARRAY_REVERSE(DisplayIter, DisplayModes, SDisplayMode) {
    const SDisplayMode& DisplayMode = DisplayIter.GetValue();
    if (!pDisplay->m_Fullscreen &&
        (DisplayMode.Width > pDisplay->m_ScreenWidth ||
         DisplayMode.Height > pDisplay->m_ScreenHeight)) {
#if DEBUG_SETRES
      PRINTF("  Skipping mode %dx%d:\n", DisplayMode.Width, DisplayMode.Height);
#endif
      DisplayModes.FastRemove(DisplayIter);
    }
  }

  const int NumDisplayModes = static_cast<int>(DisplayModes.Size());
  const int LeftColumnSize = (NumDisplayModes + 1) / 2;
  const int RightColumnSize =
      (NumDisplayModes + 1) - LeftColumnSize;  // Add one for the Back button

  for (int DisplayModeIndex = 0; DisplayModeIndex < NumDisplayModes;
       ++DisplayModeIndex) {
    const SDisplayMode& DisplayMode = DisplayModes[DisplayModeIndex];

    float ScreenX = 0.0f;
    float ScreenY = 0.0f;

    int FocusShiftUp = 0;
    int FocusShiftDown = 0;
    int FocusShiftLeft = 0;
    int FocusShiftRight = 0;

    if (DisplayModeIndex < LeftColumnSize) {
      // Display mode is in left column
      ScreenY = YBase + DisplayModeIndex * YStep;
      ScreenX = Column0X;
      FocusShiftLeft = -RightColumnSize;
      FocusShiftRight = LeftColumnSize;
    } else {
      // Display mode is in right column
      ScreenY = YBase + (DisplayModeIndex - LeftColumnSize) * YStep;
      ScreenX = Column1X;
      FocusShiftLeft = -LeftColumnSize;
      FocusShiftRight = RightColumnSize;
    }

    if (DisplayModeIndex == 0) {
      // Display mode is on top left
      FocusShiftUp = -(RightColumnSize + 1);
    } else if (DisplayModeIndex == (LeftColumnSize - 1)) {
      // Display mode is on bottom left
      FocusShiftDown = (RightColumnSize + 1);

      // If columns are the same size (*including* the back button),
      // this widget doesn't have a pair in the right column.
      if (LeftColumnSize == RightColumnSize) {
        // Setting focus override to 0 uses the screen's shift values, so loop
        // instead.
        FocusShiftLeft = -(NumDisplayModes + 1);
        FocusShiftRight = (NumDisplayModes + 1);
      }
    } else if (DisplayModeIndex == LeftColumnSize) {
      // Display mode is on top right left
      FocusShiftUp = -(LeftColumnSize + 1);
    }
    // Back button shift down is handled below this loop.

    const SimpleString NewDefinitionName =
        SimpleString::PrintF("_Res%d", DisplayModeIndex);
    // HACKHACK: Insert the UTF-8 codes for the U+00D7 (multiplication sign)
    const SimpleString ResolutionString = SimpleString::PrintF(
        "%d \xc3\x97 %d", DisplayMode.Width, DisplayMode.Height);

    MAKEHASH(NewDefinitionName);

    STATICHASH(UIWidgetType);
    ConfigManager::SetString(sUIWidgetType, "Text", sNewDefinitionName);

    ConfigManager::SetString(sArchetype, ArchetypeName, sNewDefinitionName);

    ConfigManager::SetString(sParent, Parent, sNewDefinitionName);

    STATICHASH(String);
    ConfigManager::SetString(sString, ResolutionString.CStr(),
                             sNewDefinitionName);

    STATICHASH(PixelX);
    ConfigManager::SetFloat(sPixelX, ScreenX, sNewDefinitionName);

    STATICHASH(PixelY);
    ConfigManager::SetFloat(sPixelY, ScreenY, sNewDefinitionName);

    STATICHASH(FocusShiftUp);
    ConfigManager::SetInt(sFocusShiftUp, FocusShiftUp, sNewDefinitionName);

    STATICHASH(FocusShiftDown);
    ConfigManager::SetInt(sFocusShiftDown, FocusShiftDown, sNewDefinitionName);

    STATICHASH(FocusShiftLeft);
    ConfigManager::SetInt(sFocusShiftLeft, FocusShiftLeft, sNewDefinitionName);

    STATICHASH(FocusShiftRight);
    ConfigManager::SetInt(sFocusShiftRight, FocusShiftRight,
                          sNewDefinitionName);

    UIWidget* const pResWidget =
        UIFactory::CreateWidget(NewDefinitionName, this);
    ASSERT(pResWidget);

    pResWidget->m_Callback = m_Callback;

    AddWidget(pResWidget);

    m_ResMap[NewDefinitionName] = DisplayMode;
  }

  STATIC_HASHED_STRING(SetResBackButton);
  UIWidget* const pBackButtonWidget = GetWidget(sSetResBackButton);
  ASSERT(pBackButtonWidget);
  pBackButtonWidget->m_FocusShiftLeft = -(NumDisplayModes + 1);
  pBackButtonWidget->m_FocusShiftRight = (NumDisplayModes + 1);
  pBackButtonWidget->m_FocusShiftDown = (LeftColumnSize + 1);

  UpdateRender();

  // Initialize focus to the first element (so that we're never unfocused,
  // because that doesn't make sense for controllers).
  if (m_FocusWidgets.Size() > 0) {
    m_FocusedWidget = m_FocusWidgets[0];
    // NOTE: Intentionally not calling SetFocus here, so effects don't happen;
    // we
    // just need an initial focus for controllers, it's not really *getting*
    // focus
  }
}