]> git.cworth.org Git - vogl/blob - src/vogleditor/vogleditor_qprogramexplorer.cpp
Initial vogl checkin
[vogl] / src / vogleditor / vogleditor_qprogramexplorer.cpp
1 #include "vogleditor_qprogramexplorer.h"
2 #include "ui_vogleditor_qprogramexplorer.h"
3
4 #include "vogl_gl_object.h"
5 #include "vogl_program_state.h"
6
7 Q_DECLARE_METATYPE(vogl_program_state*);
8 Q_DECLARE_METATYPE(vogl_shader_state*);
9
10 vogleditor_QProgramExplorer::vogleditor_QProgramExplorer(QWidget *parent) :
11     QWidget(parent),
12     ui(new Ui::vogleditor_QProgramExplorer)
13 {
14     ui->setupUi(this);
15
16     ui->saveShaderButton->setEnabled(false);
17 }
18
19 vogleditor_QProgramExplorer::~vogleditor_QProgramExplorer()
20 {
21     delete ui;
22 }
23
24 void vogleditor_QProgramExplorer::clear()
25 {
26     ui->programListBox->clear();
27     ui->shaderListBox->clear();
28
29     ui->shaderTextEdit->clear();
30 }
31
32 void vogleditor_QProgramExplorer::set_program_objects(vogl_gl_object_state_ptr_vec objects)
33 {
34     clear();
35     m_objects = objects;
36
37     for (vogl_gl_object_state_ptr_vec::iterator iter = objects.begin(); iter != objects.end(); iter++)
38     {
39         if ((*iter)->get_type() == cGLSTProgram)
40         {
41             vogl_program_state* pState = static_cast<vogl_program_state*>(*iter);
42
43             QString valueStr;
44             valueStr = valueStr.sprintf("Program %" PRIu64, pState->get_snapshot_handle());
45
46             ui->programListBox->addItem(valueStr, QVariant::fromValue(pState));
47         }
48         else
49         {
50             VOGL_ASSERT(!"Unhandled object type in vogleditor_QProgramExplorer");
51         }
52     }
53 }
54
55 bool vogleditor_QProgramExplorer::set_active_program(unsigned long long programHandle)
56 {
57     bool bActivated = false;
58     int index = 0;
59     for (vogl_gl_object_state_ptr_vec::iterator iter = m_objects.begin(); iter != m_objects.end(); iter++)
60     {
61         vogl_program_state* pState = static_cast<vogl_program_state*>(*iter);
62         if (pState->get_snapshot_handle() == programHandle)
63         {
64             ui->programListBox->setCurrentIndex(index);
65             bActivated = true;
66             break;
67         }
68
69         ++index;
70     }
71     return bActivated;
72 }
73
74 void vogleditor_QProgramExplorer::on_programListBox_currentIndexChanged(int index)
75 {
76     ui->shaderListBox->clear();
77
78     int count = ui->programListBox->count();
79     if (index >= 0 && index < count)
80     {
81         vogl_program_state* pObjState = ui->programListBox->itemData(index).value<vogl_program_state*>();
82         if (pObjState == NULL)
83         {
84             VOGL_ASSERT(!"NULL object type in vogleditor_QProgramExplorer");
85             return;
86         }
87
88         vogl_shader_state_vec& attachedShaderVec = pObjState->get_shaders();
89         vogl_shader_state_vec& linkedShaderVec = pObjState->get_link_time_snapshot()->get_shaders();
90
91         QString valueStr;
92         for (vogl_shader_state_vec::iterator linkedIter = linkedShaderVec.begin(); linkedIter != linkedShaderVec.end(); linkedIter++)
93         {
94             vogl_shader_state* pShaderState = linkedIter;
95             valueStr = valueStr.sprintf("Linked Shader %" PRIu64 " - %s", pShaderState->get_snapshot_handle(), g_gl_enums.find_gl_name(pShaderState->get_shader_type()));
96             ui->shaderListBox->addItem(valueStr, QVariant::fromValue(pShaderState));
97         }
98
99         for (vogl_shader_state_vec::iterator attachedIter = attachedShaderVec.begin(); attachedIter != attachedShaderVec.end(); attachedIter++)
100         {
101             vogl_shader_state* pShaderState = attachedIter;
102             valueStr = valueStr.sprintf("Attached Shader %" PRIu64 " - %s", pShaderState->get_snapshot_handle(), g_gl_enums.find_gl_name(pShaderState->get_shader_type()));
103             ui->shaderListBox->addItem(valueStr, QVariant::fromValue(pShaderState));
104         }
105     }
106 }
107
108 void vogleditor_QProgramExplorer::on_shaderListBox_currentIndexChanged(int index)
109 {
110     ui->shaderTextEdit->clear();
111
112     int count = ui->shaderListBox->count();
113     if (index >= 0 && index < count)
114     {
115         vogl_shader_state* pObjState = ui->shaderListBox->itemData(index).value<vogl_shader_state*>();
116         if (pObjState == NULL)
117         {
118             VOGL_ASSERT(!"NULL shader object type in vogleditor_QProgramExplorer");
119         }
120         else
121         {
122             ui->shaderTextEdit->setText(pObjState->get_source().c_str());
123         }
124     }
125
126     ui->saveShaderButton->setEnabled(false);
127 }
128
129 void vogleditor_QProgramExplorer::on_shaderTextEdit_textChanged()
130 {
131     ui->saveShaderButton->setEnabled(true);
132 }
133
134 void vogleditor_QProgramExplorer::on_saveShaderButton_clicked()
135 {
136     int index = ui->shaderListBox->currentIndex();
137     if (index >= 0 && ui->shaderListBox->count() > 0)
138     {
139         vogl_shader_state* pObjState = ui->shaderListBox->itemData(index).value<vogl_shader_state*>();
140         if (pObjState == NULL)
141         {
142             VOGL_ASSERT(!"NULL shader object type in vogleditor_QProgramExplorer");
143             return;
144         }
145
146         pObjState->set_source(ui->shaderTextEdit->toPlainText().toStdString().c_str());
147
148         ui->saveShaderButton->setEnabled(false);
149
150         vogl_program_state* pProgramState = ui->programListBox->itemData(index).value<vogl_program_state*>();
151         emit program_edited(pProgramState);
152     }
153 }