Changeset 271


Ignore:
Timestamp:
07/04/14 14:50:10 (11 years ago)
Author:
epyon
Message:
  • entity storage based on handles in handle.hh
  • gui uses entity storage
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/gui/gui_common.hh

    r270 r271  
    4242
    4343                typedef nv::handle<> handle;
    44                 typedef nv::index_store<handle> index_store;
    4544
    4645        } // namespace gui
  • trunk/nv/gui/gui_element.hh

    r270 r271  
    4141
    4242                        string    m_id;              ///< id type of the object
    43                         handle    m_this;            ///< pointer to parent
    4443                        handle    m_parent;          ///< pointer to parent
    4544                        list      m_children;        ///< children objects
  • trunk/nv/gui/gui_environment.hh

    r270 r271  
    4343                        virtual ~environment();
    4444                protected:
    45                         handle create_handle();
    46                         element* get_element( handle h );
    4745                        handle get_element( const position& p );
    4846                        void add_child( handle child );
     
    6058                        void recalculate_absolute( handle e );
    6159                       
    62                         std::vector< element > m_elements;
    63 
    64                         index_store      m_indexes;
    65                         renderer*    m_renderer;
    66                         window*      m_window;
    67                         handle       m_screen;
    68                         rectangle    m_area;
     60                        entity_store< element, handle > m_elements;
     61                        renderer*     m_renderer;
     62                        window*       m_window;
     63                        handle        m_screen;
     64                        rectangle     m_area;
    6965                };
    7066
  • trunk/nv/handle.hh

    r270 r271  
    120120        };
    121121
     122        template < typename T, typename HANDLE = handle<>, typename TINDEX = sint32 >
     123        class entity_store
     124        {
     125        public:
     126                typedef HANDLE handle;
     127                typedef TINDEX index_type;
     128                typedef T      value_type;
     129
     130                entity_store() {}
     131                handle create()
     132                {
     133                        m_data.emplace_back();
     134                        m_handles.push_back( m_indexes.create_handle( sint32( m_data.size() - 1 ) ) );
     135                        return m_handles.back();
     136                }
     137                value_type* get( handle h )
     138                {
     139                        if ( h.is_nil() ) return nullptr;
     140                        sint32 eindex = m_indexes.get_index( h );
     141                        return eindex >= 0 ? &(m_data[ eindex ]) : nullptr;
     142                }
     143                void destroy( handle e )
     144                {
     145                        handle swap_handle    = m_handles.back();
     146                        sint32 dead_eindex    = m_indexes.get_index( e );
     147                        if ( dead_eindex != (sint32)m_data.size()-1 )
     148                        {
     149                                m_data[ dead_eindex ]    = m_data.back();
     150                                m_handles[ dead_eindex ] = m_handles.back();
     151                        }
     152                        m_data.pop_back();
     153                        m_handles.pop_back();
     154                        m_indexes.swap_indices( e, swap_handle );
     155                        m_indexes.free_handle( e );
     156                }
     157        private:
     158                std::vector< handle >         m_handles;
     159                std::vector< value_type >     m_data;
     160                index_store< handle, TINDEX > m_indexes;
     161        };
     162
     163
    122164
    123165}
  • trunk/src/gui/gui_environment.cc

    r270 r271  
    3030        m_area.dim( dimension( w->get_width(), w->get_height() ) );
    3131       
    32         m_screen           = create_handle();
    33         element* screen    = get_element( m_screen );
     32        m_screen           = m_elements.create();
     33        element* screen    = m_elements.get( m_screen );
    3434        screen->m_absolute = m_area;
    3535        screen->m_relative = m_area;
     
    5151{
    5252        if ( parent.is_nil() ) parent = m_screen;
    53         handle result = create_handle();
    54         element* e    = get_element( result );
     53        handle result = m_elements.create();
     54        element* e    = m_elements.get( result );
    5555        e->m_absolute = r;
    5656        e->m_relative = r;
     
    5959}
    6060
    61 nv::gui::handle nv::gui::environment::create_handle()
    62 {
    63         m_elements.emplace_back();
    64         m_elements.back().m_this = m_indexes.create_handle( sint32( m_elements.size() - 1 ) );
    65         return m_elements.back().m_this;
    66 }
    67 
    6861void nv::gui::environment::destroy_element( handle e )
    6962{
    70         element* dead_element = get_element( e );
     63        element* dead_element = m_elements.get( e );
    7164        if ( dead_element == nullptr ) return;
    7265        destroy_children( e );
     
    7770        dead_element->m_parent = handle();
    7871
    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 );
     72        m_elements.destroy( e );
    8873}
    8974
    9075void nv::gui::environment::update( handle e, uint32 elapsed )
    9176{
    92         element* el = get_element( e );
     77        element* el = m_elements.get( e );
    9378        if ( !el ) return;
    9479        //      el->on_update( elapsed );
     
    10994void nv::gui::environment::draw( handle e )
    11095{
    111         element* el = get_element( e );
     96        element* el = m_elements.get( e );
    11297        if ( !el ) return;
    11398        if ( el->m_visible )
     
    140125void nv::gui::environment::add_child( handle parent, handle child )
    141126{
    142         element* e = get_element( child );
    143         element* p = get_element( parent );
     127        element* e = m_elements.get( child );
     128        element* p = m_elements.get( parent );
    144129        if ( e && p )
    145130        {
     
    153138void nv::gui::environment::destroy_children( handle e )
    154139{
    155         element* parent = get_element(e);
     140        element* parent = m_elements.get(e);
    156141        if ( parent )
    157142        {
     
    177162bool nv::gui::environment::process_io_event( handle e, const io_event& ev )
    178163{
    179         element* el = get_element( e );
     164        element* el = m_elements.get( e );
    180165        return el && el->m_parent.is_valid() ? process_io_event( el->m_parent, ev ) : false;
    181166}
     
    186171}
    187172
    188 nv::gui::element* nv::gui::environment::get_element( handle h )
    189 {
    190         if ( h.is_nil() ) return nullptr;
    191         sint32 eindex = m_indexes.get_index( h );
    192         return eindex >= 0 ? &m_elements[ eindex ] : nullptr;
    193 }
    194 
    195173nv::gui::handle nv::gui::environment::get_deepest_child( handle e, const position& p )
    196174{
    197         element* el = get_element(e);
     175        element* el = m_elements.get(e);
    198176        if ( !el && !el->m_visible ) return handle();
    199177
     
    214192void nv::gui::environment::move_to_top( handle child )
    215193{
    216         element* e      = get_element( child );
    217         element* parent = get_element( e->m_parent );
     194        element* e      = m_elements.get( child );
     195        element* parent = m_elements.get( e->m_parent );
    218196        if ( e && parent )
    219197        {
     
    230208void nv::gui::environment::move_to_bottom( handle child )
    231209{
    232         element* e      = get_element( child );
    233         element* parent = get_element( e->m_parent );
     210        element* e      = m_elements.get( child );
     211        element* parent = m_elements.get( e->m_parent );
    234212        if ( e && parent )
    235213        {
     
    246224void nv::gui::environment::set_relative( handle e, const rectangle& r )
    247225{
    248         element* el = get_element(e);
     226        element* el = m_elements.get(e);
    249227        if ( el )
    250228        {
     
    257235void nv::gui::environment::set_relative( handle e, const position& p )
    258236{
    259         element* el = get_element(e);
     237        element* el = m_elements.get(e);
    260238        if ( el )
    261239        {
     
    266244void nv::gui::environment::recalculate_absolute( handle e )
    267245{
    268         element* el = get_element(e);
    269         rectangle pabsolute = get_element( el->m_parent )->m_absolute;
     246        element* el = m_elements.get(e);
     247        rectangle pabsolute = m_elements.get( el->m_parent )->m_absolute;
    270248        el->m_absolute = el->m_relative + pabsolute.ul;
    271249
     
    278256void nv::gui::environment::set_class( handle e, const string& text )
    279257{
    280         element* ep = get_element(e);
     258        element* ep = m_elements.get(e);
    281259        if ( ep != nullptr )
    282260        {
     
    288266void nv::gui::environment::set_text( handle e, const string& text )
    289267{
    290         element* ep = get_element(e);
     268        element* ep = m_elements.get(e);
    291269        if ( ep != nullptr )
    292270        {
     
    298276void nv::gui::environment::remove_child( handle parent, handle child )
    299277{
    300         element* p = get_element( parent );
     278        element* p = m_elements.get( parent );
    301279        if ( p )
    302280        {
     
    304282                if ( it != p->m_children.end() )
    305283                {
    306                         element* e = get_element( *it );
     284                        element* e = m_elements.get( *it );
    307285                        e->m_parent = handle();
    308286                        p->m_children.erase(it);
Note: See TracChangeset for help on using the changeset viewer.