- Timestamp:
- 07/04/14 14:50:10 (11 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/gui/gui_common.hh
r270 r271 42 42 43 43 typedef nv::handle<> handle; 44 typedef nv::index_store<handle> index_store;45 44 46 45 } // namespace gui -
trunk/nv/gui/gui_element.hh
r270 r271 41 41 42 42 string m_id; ///< id type of the object 43 handle m_this; ///< pointer to parent44 43 handle m_parent; ///< pointer to parent 45 44 list m_children; ///< children objects -
trunk/nv/gui/gui_environment.hh
r270 r271 43 43 virtual ~environment(); 44 44 protected: 45 handle create_handle();46 element* get_element( handle h );47 45 handle get_element( const position& p ); 48 46 void add_child( handle child ); … … 60 58 void recalculate_absolute( handle e ); 61 59 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; 69 65 }; 70 66 -
trunk/nv/handle.hh
r270 r271 120 120 }; 121 121 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 122 164 123 165 } -
trunk/src/gui/gui_environment.cc
r270 r271 30 30 m_area.dim( dimension( w->get_width(), w->get_height() ) ); 31 31 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 ); 34 34 screen->m_absolute = m_area; 35 35 screen->m_relative = m_area; … … 51 51 { 52 52 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 ); 55 55 e->m_absolute = r; 56 56 e->m_relative = r; … … 59 59 } 60 60 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 68 61 void nv::gui::environment::destroy_element( handle e ) 69 62 { 70 element* dead_element = get_element( e );63 element* dead_element = m_elements.get( e ); 71 64 if ( dead_element == nullptr ) return; 72 65 destroy_children( e ); … … 77 70 dead_element->m_parent = handle(); 78 71 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 ); 88 73 } 89 74 90 75 void nv::gui::environment::update( handle e, uint32 elapsed ) 91 76 { 92 element* el = get_element( e );77 element* el = m_elements.get( e ); 93 78 if ( !el ) return; 94 79 // el->on_update( elapsed ); … … 109 94 void nv::gui::environment::draw( handle e ) 110 95 { 111 element* el = get_element( e );96 element* el = m_elements.get( e ); 112 97 if ( !el ) return; 113 98 if ( el->m_visible ) … … 140 125 void nv::gui::environment::add_child( handle parent, handle child ) 141 126 { 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 ); 144 129 if ( e && p ) 145 130 { … … 153 138 void nv::gui::environment::destroy_children( handle e ) 154 139 { 155 element* parent = get_element(e);140 element* parent = m_elements.get(e); 156 141 if ( parent ) 157 142 { … … 177 162 bool nv::gui::environment::process_io_event( handle e, const io_event& ev ) 178 163 { 179 element* el = get_element( e );164 element* el = m_elements.get( e ); 180 165 return el && el->m_parent.is_valid() ? process_io_event( el->m_parent, ev ) : false; 181 166 } … … 186 171 } 187 172 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 195 173 nv::gui::handle nv::gui::environment::get_deepest_child( handle e, const position& p ) 196 174 { 197 element* el = get_element(e);175 element* el = m_elements.get(e); 198 176 if ( !el && !el->m_visible ) return handle(); 199 177 … … 214 192 void nv::gui::environment::move_to_top( handle child ) 215 193 { 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 ); 218 196 if ( e && parent ) 219 197 { … … 230 208 void nv::gui::environment::move_to_bottom( handle child ) 231 209 { 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 ); 234 212 if ( e && parent ) 235 213 { … … 246 224 void nv::gui::environment::set_relative( handle e, const rectangle& r ) 247 225 { 248 element* el = get_element(e);226 element* el = m_elements.get(e); 249 227 if ( el ) 250 228 { … … 257 235 void nv::gui::environment::set_relative( handle e, const position& p ) 258 236 { 259 element* el = get_element(e);237 element* el = m_elements.get(e); 260 238 if ( el ) 261 239 { … … 266 244 void nv::gui::environment::recalculate_absolute( handle e ) 267 245 { 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; 270 248 el->m_absolute = el->m_relative + pabsolute.ul; 271 249 … … 278 256 void nv::gui::environment::set_class( handle e, const string& text ) 279 257 { 280 element* ep = get_element(e);258 element* ep = m_elements.get(e); 281 259 if ( ep != nullptr ) 282 260 { … … 288 266 void nv::gui::environment::set_text( handle e, const string& text ) 289 267 { 290 element* ep = get_element(e);268 element* ep = m_elements.get(e); 291 269 if ( ep != nullptr ) 292 270 { … … 298 276 void nv::gui::environment::remove_child( handle parent, handle child ) 299 277 { 300 element* p = get_element( parent );278 element* p = m_elements.get( parent ); 301 279 if ( p ) 302 280 { … … 304 282 if ( it != p->m_children.end() ) 305 283 { 306 element* e = get_element( *it );284 element* e = m_elements.get( *it ); 307 285 e->m_parent = handle(); 308 286 p->m_children.erase(it);
Note: See TracChangeset
for help on using the changeset viewer.