Changeset 270
- Timestamp:
- 07/04/14 13:57:51 (11 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/common.hh
r266 r270 191 191 }; 192 192 193 193 194 } // namespace nv 194 195 -
trunk/nv/gui/gui_common.hh
r267 r270 15 15 16 16 #include <nv/common.hh> 17 #include <nv/handle.hh> 17 18 18 19 namespace nv … … 40 41 class renderer; 41 42 43 typedef nv::handle<> handle; 44 typedef nv::index_store<handle> index_store; 45 42 46 } // namespace gui 43 47 -
trunk/nv/gui/gui_element.hh
r269 r270 24 24 { 25 25 26 class handle27 {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 46 26 class element 47 27 { … … 53 33 element() 54 34 : m_id( "" ) 55 , m_this()56 , m_parent()57 , m_children()58 35 , m_child_count(0) 59 36 , m_class("") 60 , m_relative()61 , m_absolute()62 37 , m_enabled( true ) 63 38 , m_visible( true ) 64 39 , m_dirty( true ) 65 40 , m_render_data( nullptr ) {} 66 67 friend class environment;68 friend class renderer;69 friend class style;70 41 71 42 string m_id; ///< id type of the object -
trunk/nv/gui/gui_environment.hh
r269 r270 26 26 namespace gui 27 27 { 28 28 29 class environment 29 30 { … … 43 44 protected: 44 45 handle create_handle(); 45 handle create_index( sint16 element_id );46 46 element* get_element( handle h ); 47 47 handle get_element( const position& p ); … … 60 60 void recalculate_absolute( handle e ); 61 61 62 struct index 63 { 64 sint16 element_id; 65 uint16 counter; 66 sint32 next_free; 62 std::vector< element > m_elements; 67 63 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; 79 65 renderer* m_renderer; 80 66 window* m_window; -
trunk/src/gui/gui_environment.cc
r269 r270 26 26 27 27 nv::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 ) 29 29 { 30 30 m_area.dim( dimension( w->get_width(), w->get_height() ) ); … … 62 62 { 63 63 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 ) ); 65 65 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: reuse94 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 else102 {103 m_indices[ m_last_free ].next_free = idx_index;104 m_last_free = idx_index;105 }106 66 } 107 67 … … 117 77 dead_element->m_parent = handle(); 118 78 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 ); 129 88 } 130 89 … … 219 178 { 220 179 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; 222 181 } 223 182 … … 230 189 { 231 190 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; 234 193 } 235 194 … … 245 204 { 246 205 result = get_deepest_child( *it, p ); 247 if ( result. m_index) return result;206 if ( result.is_valid() ) return result; 248 207 ++it; 249 208 }
Note: See TracChangeset
for help on using the changeset viewer.