Changeset 270


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
Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/common.hh

    r266 r270  
    191191        };
    192192
     193
    193194} // namespace nv
    194195
  • trunk/nv/gui/gui_common.hh

    r267 r270  
    1515
    1616#include <nv/common.hh>
     17#include <nv/handle.hh>
    1718
    1819namespace nv
     
    4041                class renderer;
    4142
     43                typedef nv::handle<> handle;
     44                typedef nv::index_store<handle> index_store;
     45
    4246        } // namespace gui
    4347
  • trunk/nv/gui/gui_element.hh

    r269 r270  
    2424        {
    2525
    26                 class handle
    27                 {
    28                 public:
    29                         handle() : m_index(0), m_counter(0) {}
    30 
    31                         inline bool operator==(const handle& rhs){return m_index == rhs.m_index && m_counter == rhs.m_counter; }
    32                         inline bool operator!=(const handle& rhs){return !(*this == rhs);}
    33 
    34                         bool is_nil() { return m_index == 0 && m_counter == 0; }
    35                         bool is_valid() { return !is_nil(); }
    36                 private:
    37                         friend class environment;
    38 
    39                         explicit handle( uint16 a_index, uint16 a_counter ) : m_index( a_index ), m_counter(a_counter) {}
    40 
    41                         uint16 m_index;
    42                         uint16 m_counter;
    43                 };
    44 
    45 
    4626                class element
    4727                {
     
    5333                        element()
    5434                                : m_id( "" )
    55                                 , m_this()
    56                                 , m_parent()
    57                                 , m_children()
    5835                                , m_child_count(0)
    5936                                , m_class("")
    60                                 , m_relative()
    61                                 , m_absolute()
    6237                                , m_enabled( true )
    6338                                , m_visible( true )
    6439                                , m_dirty( true )
    6540                                , m_render_data( nullptr ) {}
    66 
    67                         friend class environment;
    68                         friend class renderer;
    69                         friend class style;
    7041
    7142                        string    m_id;              ///< id type of the object
  • trunk/nv/gui/gui_environment.hh

    r269 r270  
    2626        namespace gui
    2727        {
     28
    2829                class environment
    2930                {
     
    4344                protected:
    4445                        handle create_handle();
    45                         handle create_index( sint16 element_id );
    4646                        element* get_element( handle h );
    4747                        handle get_element( const position& p );
     
    6060                        void recalculate_absolute( handle e );
    6161                       
    62                         struct index
    63                         {
    64                                 sint16 element_id;
    65                                 uint16 counter;
    66                                 sint32 next_free;
     62                        std::vector< element > m_elements;
    6763
    68                                 index() : element_id(0), counter(0), next_free(-1) {}
    69                         };
    70                         uint16 get_free_index();
    71                         void free_index( uint16 idx_index );
    72 
    73                         sint32 m_first_free;
    74                         sint32 m_last_free;
    75 
    76                         std::vector< element > m_elements;
    77                         std::vector< index >   m_indices;
    78 
     64                        index_store      m_indexes;
    7965                        renderer*    m_renderer;
    8066                        window*      m_window;
  • 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.