Ticket #2405: COList_cpp_add_event_header_selection.patch

File COList_cpp_add_event_header_selection.patch, 2.2 KB (added by Vladislav Belov, 9 years ago)
  • source/gui/COList.cpp

     
    1919#include "i18n/L10n.h"
    2020
    2121#include "ps/CLogger.h"
     22#include "soundmanager/ISoundManager.h"
    2223
    2324COList::COList() : CList(),m_HeadingHeight(30.f)
    2425{
    2526    AddSetting(GUIST_CGUISpriteInstance,    "sprite_heading");
     27    AddSetting(GUIST_bool, "sortable");
     28    AddSetting(GUIST_CStr, "selected_column");
     29    AddSetting(GUIST_int, "selected_def");
     30
     31    // Nothing is selected as default.
     32    GUI<CStr>::SetSetting(this, "selected_column", "");
     33    GUI<int>::SetSetting(this, "selected_def", -1);
    2634}
    2735
    2836void COList::SetupText()
     
    119127void COList::HandleMessage(SGUIMessage &Message)
    120128{
    121129    CList::HandleMessage(Message);
     130
     131    switch (Message.type)
     132    {
     133    case GUIM_MOUSE_PRESS_LEFT:
     134    {
     135        bool sortable;
     136        GUI<bool>::GetSetting(this, "sortable", sortable);
     137        if (!sortable)
     138            break;
     139
     140        CPos mouse = GetMousePos();
     141        if (!m_CachedActualSize.PointInside(mouse))
     142            break;
     143
     144        float xpos = 0;
     145        int set = -1;
     146        for (unsigned int def = 0; def < m_ObjectsDefs.size(); ++def)
     147        {
     148            // Check if it's a decimal value, and if so, assume relative positioning.
     149            float width = 0;
     150            if (m_ObjectsDefs[def].m_Width < 1 && m_ObjectsDefs[def].m_Width > 0)
     151                width = m_ObjectsDefs[def].m_Width * m_TotalAvalibleColumnWidth;
     152            else
     153                width = m_ObjectsDefs[def].m_Width;
     154            CPos leftTopCorner = m_CachedActualSize.TopLeft() + CPos(xpos, 4);
     155            if (mouse.x >= leftTopCorner.x &&
     156                mouse.x < leftTopCorner.x + width &&
     157                mouse.y < leftTopCorner.y + m_HeadingHeight)
     158            {
     159                set = def;
     160                break;
     161            }
     162            xpos += width;
     163        }
     164
     165        if (set != -1)
     166        {
     167            GUI<CStr>::SetSetting(this, "selected_column", m_ObjectsDefs[set].m_Id.substr(5));
     168            GUI<int>::SetSetting(this, "selected_def", set);
     169            ScriptEvent("selectioncolumnchange");
     170
     171            CStrW soundPath;
     172            if (g_SoundManager && GUI<CStrW>::GetSetting(this, "sound_selected", soundPath) == PSRETURN_OK && !soundPath.empty())
     173                g_SoundManager->PlayAsUI(soundPath.c_str(), false);
     174        }
     175        break;
     176    }
     177    default:
     178        break;
     179    }
    122180}
    123181
    124182bool COList::HandleAdditionalChildren(const XMBElement& child, CXeromyces* pFile)