]> git.cworth.org Git - vogl/blob - src/vogleditor/vogleditor_qshaderexplorer.cpp
UI: Improved support for shared contexts and viewing shared state objects
[vogl] / src / vogleditor / vogleditor_qshaderexplorer.cpp
1 #include "vogleditor_qshaderexplorer.h"
2 #include "ui_vogleditor_qshaderexplorer.h"
3
4 #include "vogl_gl_object.h"
5 #include "vogl_gl_state_snapshot.h"
6 #include "vogl_shader_state.h"
7
8 Q_DECLARE_METATYPE(vogl_shader_state*);
9
10 vogleditor_QShaderExplorer::vogleditor_QShaderExplorer(QWidget *parent) :
11     QWidget(parent),
12     ui(new Ui::vogleditor_QShaderExplorer)
13 {
14     ui->setupUi(this);
15 }
16
17 vogleditor_QShaderExplorer::~vogleditor_QShaderExplorer()
18 {
19     delete ui;
20 }
21
22 void vogleditor_QShaderExplorer::clear()
23 {
24     ui->shaderListbox->clear();
25     ui->shaderTextEdit->clear();
26 }
27
28 uint vogleditor_QShaderExplorer::set_shader_objects(vogl::vector<vogl_context_snapshot*> sharingContexts)
29 {
30     clear();
31
32     uint shaderCount = 0;
33     for (uint c = 0; c < sharingContexts.size(); c++)
34     {
35         vogl_gl_object_state_ptr_vec shaderObjects;
36         sharingContexts[c]->get_all_objects_of_category(cGLSTShader, shaderObjects);
37
38         shaderCount += add_shader_objects(shaderObjects);
39     }
40
41     return shaderCount;
42 }
43
44 uint vogleditor_QShaderExplorer::add_shader_objects(vogl_gl_object_state_ptr_vec objects)
45 {
46     m_objects.append(objects);
47
48     for (vogl_gl_object_state_ptr_vec::iterator iter = objects.begin(); iter != objects.end(); iter++)
49     {
50         if ((*iter)->get_type() == cGLSTShader)
51         {
52             vogl_shader_state* pState = static_cast<vogl_shader_state*>(*iter);
53
54             QString valueStr;
55             valueStr = valueStr.sprintf("Shader %" PRIu64 " - %s", pState->get_snapshot_handle(), g_gl_enums.find_gl_name(pState->get_shader_type()));
56
57             ui->shaderListbox->addItem(valueStr, QVariant::fromValue(pState));
58         }
59         else
60         {
61             VOGL_ASSERT(!"Unhandled object type in vogleditor_QShaderExplorer");
62         }
63     }
64
65     return m_objects.size();
66 }
67
68
69 bool vogleditor_QShaderExplorer::set_active_shader(unsigned long long shaderHandle)
70 {
71     bool bActivated = false;
72     int index = 0;
73     for (vogl_gl_object_state_ptr_vec::iterator iter = m_objects.begin(); iter != m_objects.end(); iter++)
74     {
75         vogl_shader_state* pState = static_cast<vogl_shader_state*>(*iter);
76         if (pState->get_snapshot_handle() == shaderHandle)
77         {
78             ui->shaderListbox->setCurrentIndex(index);
79             bActivated = true;
80             break;
81         }
82
83         ++index;
84     }
85     return bActivated;
86 }
87
88 void vogleditor_QShaderExplorer::on_shaderListbox_currentIndexChanged(int index)
89 {
90     ui->shaderTextEdit->clear();
91
92     int count = ui->shaderListbox->count();
93     if (index >= 0 && index < count)
94     {
95         vogl_shader_state* pObjState = ui->shaderListbox->itemData(index).value<vogl_shader_state*>();
96         if (pObjState == NULL)
97         {
98             VOGL_ASSERT(!"NULL shader object type in vogleditor_QShaderExplorer");
99             return;
100         }
101
102         ui->shaderTextEdit->setText(pObjState->get_source().c_str());
103     }
104 }