source: trunk/src/gui/gui_environment.cc @ 267

Last change on this file since 267 was 267, checked in by epyon, 11 years ago
  • gui::element class now pure data
  • gui::element related code in environment
  • gui shaders use general library mechanism
File size: 4.6 KB
Line 
1// Copyright (C) 2012-2013 ChaosForge / Kornel Kisielewicz
2// http://chaosforge.org/
3//
4// This file is part of NV Libraries.
5// For conditions of distribution and use, see copyright notice in nv.hh
6
7#include "nv/gui/gui_environment.hh"
8
9#include "nv/gui/gui_renderer.hh"
10
11
12        /*
13
14        TODO: parse a lua stylesheet as per Trac wiki
15
16        IDEA: Store everything in std::unordered_maps, with lua_value's?
17
18        A lua_value is a variant stores strings as const char* that deletes them on destructor?
19        Question is that there might not be much gained on speed anyway, due to Lua's speed.
20        Special function field allows delayed per parse execution?
21
22        */
23
24#include "nv/gfx/sliced_buffer.hh"
25#include "nv/gfx/texture_atlas.hh"
26
27nv::gui::environment::environment( window* w, const std::string& shader_path )
28        : m_renderer( nullptr ), m_window( w ), m_screen( nullptr )
29{
30        m_area.dim( dimension( w->get_width(), w->get_height() ) );
31        m_screen = new element( m_area );
32        m_renderer = new renderer( w, shader_path );
33}
34
35void nv::gui::environment::load_style( const std::string& filename )
36{
37        m_renderer->load_style( filename );
38}
39
40nv::gui::element* nv::gui::environment::create_element( element* parent, const rectangle& r )
41{
42        element* result = new element( r );
43        if ( parent == nullptr ) parent = m_screen;
44        parent->add_child( result );
45        return result;
46}
47
48void nv::gui::environment::destroy_element( element* e )
49{
50        destroy_children( e );
51        e->detach();
52        delete e;
53}
54
55void nv::gui::environment::update( element* e, uint32 elapsed )
56{
57//      e->on_update( elapsed );
58        if ( e->is_visible() )
59        {
60                for ( object* i : *e )
61                {
62                        update( ((element*)i), elapsed );
63                }
64        }
65        if ( e->is_dirty() || e->m_render_data == nullptr )
66        {
67                m_renderer->redraw( e, elapsed );
68                e->set_dirty( false );
69        }
70}
71
72void nv::gui::environment::draw( element* e )
73{
74        if ( e->is_visible() )
75        {
76//              e->on_draw();
77                m_renderer->draw( e );
78                for ( object* i : *e )
79                {
80                        draw((element*)i);
81                }
82        }
83}
84
85void nv::gui::environment::update()
86{
87        update( m_screen, 0 );
88}
89
90void nv::gui::environment::draw()
91{
92        draw( m_screen );
93        m_renderer->draw();
94}
95
96void nv::gui::environment::add_child( element* child )
97{
98        m_screen->add_child( child );
99}
100
101void nv::gui::environment::destroy_children( element* e )
102{
103        while ( !e->m_children.empty() )
104        {
105                destroy_element( (element*)e->m_children.front() );
106        }
107}
108
109
110nv::gui::environment::~environment()
111{
112        destroy_element( m_screen );
113        delete m_renderer;
114}
115
116bool nv::gui::environment::process_io_event( const io_event& )
117{
118        return false;
119}
120
121bool nv::gui::environment::process_io_event( element* e, const io_event& ev )
122{
123        return e->m_parent ? process_io_event( (element*)e->m_parent, ev ) : false;
124}
125
126nv::gui::element* nv::gui::environment::get_element( const position& p )
127{
128        return get_deepest_child( m_screen, p );
129}
130
131nv::gui::element* nv::gui::environment::get_deepest_child( element* e, const position& p )
132{
133        if ( !e->is_visible() ) return nullptr;
134
135        element* result = nullptr;
136        element::list::reverse_iterator it = e->m_children.rbegin();
137
138        while ( it != e->m_children.rend() )
139        {
140                result = get_deepest_child( (element*)(*it), p );
141                if ( result ) return result;
142                ++it;
143        }
144
145        if ( e->contains( p ) ) return e;
146        return nullptr;
147}
148
149void nv::gui::environment::move_to_top( element* child )
150{
151        element* parent = (element*)child->m_parent;
152        if ( parent )
153        {
154                auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
155                if ( it != parent->m_children.end() )
156                {
157                        parent->m_children.erase( it );
158                        parent->m_children.push_back( child );
159                        parent->m_dirty = true;
160                }       
161        }
162}
163
164void nv::gui::environment::move_to_bottom( element* child )
165{
166        element* parent = (element*)child->m_parent;
167        if ( parent )
168        {
169                auto it = std::find( parent->m_children.begin(), parent->m_children.end(), (object*)child );
170                if ( it != parent->m_children.end() )
171                {
172                        parent->m_children.erase( it );
173                        parent->m_children.push_front( child );
174                        parent->m_dirty = true;
175                }
176        }
177}
178
179void nv::gui::environment::set_relative( element* e, const rectangle& r )
180{
181        e->m_dirty    = true;
182        e->m_relative = r;
183        recalculate_absolute( e );
184}
185
186void nv::gui::environment::set_relative( element* e, const position& p )
187{
188        set_relative( e, rectangle( p, p + e->m_relative.get_size() ) );
189}
190
191void nv::gui::environment::recalculate_absolute( element* e )
192{
193        rectangle pabsolute;
194
195        if ( e->m_parent )
196        {
197                pabsolute = ((element*)(e->m_parent))->m_absolute;
198        }
199
200        e->m_absolute = e->m_relative + pabsolute.ul;
201
202        for ( object* o : e->m_children )
203        {
204                recalculate_absolute( ((element*)o) );
205        }
206}
207
Note: See TracBrowser for help on using the repository browser.