Changeset 270 for trunk/src


Ignore:
Timestamp:
07/04/14 13:57:51 (11 years ago)
Author:
epyon
Message:
  • nv::handle - generic handle implementation
  • nv::index_store - index store based on handles
  • gui elements fully based on handles instead of pointers
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gui/gui_environment.cc

    r269 r270  
    2626
    2727nv::gui::environment::environment( window* w, const std::string& shader_path )
    28         : m_renderer( nullptr ), m_window( w ), m_first_free(-1), m_last_free(-1)
     28        : m_renderer( nullptr ), m_window( w )
    2929{
    3030        m_area.dim( dimension( w->get_width(), w->get_height() ) );
     
    6262{
    6363        m_elements.emplace_back();
    64         m_elements.back().m_this = create_index( uint16( m_elements.size() - 1 ) );
     64        m_elements.back().m_this = m_indexes.create_handle( sint32( m_elements.size() - 1 ) );
    6565        return m_elements.back().m_this;
    66 }
    67 
    68 nv::gui::handle nv::gui::environment::create_index( sint16 element_id )
    69 {
    70         uint16 i   = get_free_index();
    71         index& idx = m_indices[i];
    72         idx.element_id = element_id;
    73         idx.counter++;
    74         return handle( i, idx.counter );
    75 }
    76 
    77 nv::uint16 nv::gui::environment::get_free_index()
    78 {
    79         if ( m_first_free != -1 )
    80         {
    81                 uint16 result = (uint16)m_first_free;
    82                 m_first_free = m_indices[result].next_free;
    83                 m_indices[result].next_free = -1;
    84                 if ( m_first_free == -1 ) m_last_free = -1;
    85                 return result;
    86         }
    87         m_indices.emplace_back();
    88         return uint16( m_indices.size() - 1 );
    89 }
    90 
    91 void nv::gui::environment::free_index( uint16 idx_index )
    92 {
    93         // TODO: reuse
    94         index& idx = m_indices[ idx_index ];
    95         idx.element_id = -1;
    96         idx.next_free  = -1;
    97         if ( m_last_free == -1 )
    98         {
    99                 m_first_free = m_last_free = idx_index;
    100         }
    101         else
    102         {
    103                 m_indices[ m_last_free ].next_free = idx_index;
    104                 m_last_free = idx_index;
    105         }
    10666}
    10767
     
    11777        dead_element->m_parent = handle();
    11878
    119         uint16 dead_index    = m_indices[ e.m_index ].element_id;
    120         if ( dead_index != m_elements.size()-1 )
    121         {
    122                 m_elements[ dead_index ] = m_elements.back();
    123                 m_elements.pop_back();
    124                 m_indices[ m_elements[ dead_index ].m_this.m_index ].element_id = dead_index;
    125         }
    126         else
    127                 m_elements.pop_back();
    128         free_index( e.m_index );
     79        handle swap_handle    = m_elements.back().m_this;
     80        sint32 dead_eindex    = m_indexes.get_index( e );
     81        if ( dead_eindex != (sint32)m_elements.size()-1 )
     82        {
     83                m_elements[ dead_eindex ] = m_elements.back();
     84        }
     85        m_elements.pop_back();
     86        m_indexes.swap_indices( e, swap_handle );
     87        m_indexes.free_handle( e );
    12988}
    13089
     
    219178{
    220179        element* el = get_element( e );
    221         return el && el->m_parent.m_index ? process_io_event( el->m_parent, ev ) : false;
     180        return el && el->m_parent.is_valid() ? process_io_event( el->m_parent, ev ) : false;
    222181}
    223182
     
    230189{
    231190        if ( h.is_nil() ) return nullptr;
    232         const index& idx = m_indices[ h.m_index ];
    233         return idx.counter == h.m_counter && idx.element_id >= 0 ? &m_elements[ idx.element_id ] : nullptr;
     191        sint32 eindex = m_indexes.get_index( h );
     192        return eindex >= 0 ? &m_elements[ eindex ] : nullptr;
    234193}
    235194
     
    245204        {
    246205                result = get_deepest_child( *it, p );
    247                 if ( result.m_index ) return result;
     206                if ( result.is_valid() ) return result;
    248207                ++it;
    249208        }
Note: See TracChangeset for help on using the changeset viewer.