Implement synced views

This commit is contained in:
baldurk
2017-01-26 11:37:24 +00:00
parent 425e65a1e8
commit 849f3970ab
2 changed files with 81 additions and 2 deletions
+76 -2
View File
@@ -25,6 +25,7 @@
#include "BufferViewer.h"
#include <QFontDatabase>
#include <QMouseEvent>
#include <QScrollBar>
#include <QTimer>
#include "ui_BufferViewer.h"
@@ -655,6 +656,13 @@ BufferViewer::BufferViewer(CaptureContext *ctx, QWidget *parent)
QObject::connect(ui->gsoutData->selectionModel(), &QItemSelectionModel::selectionChanged, this,
&BufferViewer::data_selected);
QObject::connect(ui->vsinData->verticalScrollBar(), &QScrollBar::valueChanged, this,
&BufferViewer::data_scrolled);
QObject::connect(ui->vsoutData->verticalScrollBar(), &QScrollBar::valueChanged, this,
&BufferViewer::data_scrolled);
QObject::connect(ui->gsoutData->verticalScrollBar(), &QScrollBar::valueChanged, this,
&BufferViewer::data_scrolled);
QTimer *renderTimer = new QTimer(this);
QObject::connect(renderTimer, &QTimer::timeout, this, &BufferViewer::render_timer);
renderTimer->setSingleShot(false);
@@ -1107,10 +1115,23 @@ void BufferViewer::render_clicked(QMouseEvent *e)
int row = (int)vertSelected;
BufferItemModel *model = NULL;
if(ui->outputTabs->currentIndex() == 0)
RDTableView *table = NULL;
if(m_CurStage == eMeshDataStage_VSIn)
{
model = m_ModelVSIn;
else if(ui->outputTabs->currentIndex() == 1)
table = ui->vsinData;
}
else if(m_CurStage == eMeshDataStage_VSOut)
{
model = m_ModelVSOut;
table = ui->vsoutData;
}
else if(m_CurStage == eMeshDataStage_GSOut)
{
model = m_ModelGSOut;
table = ui->gsoutData;
}
if(model && row >= 0 && row < model->rowCount())
{
@@ -1118,6 +1139,8 @@ void BufferViewer::render_clicked(QMouseEvent *e)
model->view->clearSelection();
model->view->selectRow(row);
}
SyncViews(table, true, true);
});
}
});
@@ -1315,11 +1338,62 @@ void BufferViewer::data_selected(const QItemSelection &selected, const QItemSele
{
m_Config.highlightVert = selected[0].indexes()[0].row();
SyncViews(qobject_cast<RDTableView *>(QObject::sender()), true, false);
INVOKE_MEMFN(RT_UpdateAndDisplay);
}
}
void BufferViewer::data_scrolled(int scrollvalue)
{
SyncViews(qobject_cast<RDTableView *>(QObject::sender()), false, true);
}
void BufferViewer::SyncViews(RDTableView *primary, bool selection, bool scroll)
{
if(!ui->syncViews->isChecked())
return;
RDTableView *views[] = {ui->vsinData, ui->vsoutData, ui->gsoutData};
if(primary == NULL)
{
for(RDTableView *table : views)
{
if(table->hasFocus())
{
primary = table;
break;
}
}
}
if(primary == NULL)
primary = views[0];
for(RDTableView *table : views)
{
if(table == primary)
continue;
if(selection)
{
QModelIndexList selected = primary->selectionModel()->selectedRows();
if(!selected.empty())
table->selectRow(selected[0].row());
}
if(scroll)
table->verticalScrollBar()->setValue(primary->verticalScrollBar()->value());
}
}
void BufferViewer::on_toggleControls_toggled(bool checked)
{
ui->cameraControlsGroup->setVisible(checked);
}
void BufferViewer::on_syncViews_toggled(bool checked)
{
SyncViews(NULL, true, true);
}
+5
View File
@@ -55,6 +55,7 @@ private slots:
// automatic slots
void on_outputTabs_currentChanged(int index);
void on_toggleControls_toggled(bool checked);
void on_syncViews_toggled(bool checked);
// manual slots
void render_mouseMove(QMouseEvent *e);
@@ -63,7 +64,9 @@ private slots:
void render_keyPress(QKeyEvent *e);
void render_keyRelease(QKeyEvent *e);
void render_timer();
void data_selected(const QItemSelection &selected, const QItemSelection &deselected);
void data_scrolled(int scroll);
private:
Ui::BufferViewer *ui;
@@ -98,4 +101,6 @@ private:
void CalcColumnWidth();
void ApplyColumnWidths(int numColumns, RDTableView *view);
void SyncViews(RDTableView *primary, bool selection, bool scroll);
};