diff --git a/qrenderdoc/Widgets/Extended/RDListWidget.cpp b/qrenderdoc/Widgets/Extended/RDListWidget.cpp index f5e03b77f..f0173a77b 100644 --- a/qrenderdoc/Widgets/Extended/RDListWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDListWidget.cpp @@ -23,7 +23,10 @@ ******************************************************************************/ #include "RDListWidget.h" +#include +#include #include +#include "Code/Interface/QRDInterface.h" RDListWidget::RDListWidget(QWidget *parent) : QListWidget(parent) { @@ -44,3 +47,29 @@ void RDListWidget::mouseDoubleClickEvent(QMouseEvent *event) emit(mouseDoubleClicked(event)); QListWidget::mouseDoubleClickEvent(event); } + +void RDListWidget::keyPressEvent(QKeyEvent *event) +{ + if(!m_customCopyPaste && event->matches(QKeySequence::Copy)) + { + QList items = selectedItems(); + + std::sort(items.begin(), items.end(), + [this](QListWidgetItem *a, QListWidgetItem *b) { return row(a) < row(b); }); + + QString clipboardText; + for(QListWidgetItem *i : items) + { + clipboardText += i->text() + lit("\n"); + } + + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(clipboardText.trimmed()); + } + else + { + QListWidget::keyPressEvent(event); + } + + emit(keyPress(event)); +} diff --git a/qrenderdoc/Widgets/Extended/RDListWidget.h b/qrenderdoc/Widgets/Extended/RDListWidget.h index edbd0e783..8981055c6 100644 --- a/qrenderdoc/Widgets/Extended/RDListWidget.h +++ b/qrenderdoc/Widgets/Extended/RDListWidget.h @@ -29,17 +29,24 @@ class RDListWidget : public QListWidget { private: Q_OBJECT + Q_PROPERTY(bool customCopyPasteHandler READ customCopyPasteHandler WRITE setCustomCopyPasteHandler) public: explicit RDListWidget(QWidget *parent = 0); ~RDListWidget(); + bool customCopyPasteHandler() { return m_customCopyPaste; } + void setCustomCopyPasteHandler(bool custom) { m_customCopyPaste = custom; } signals: void mouseClicked(QMouseEvent *event); void mouseDoubleClicked(QMouseEvent *event); + void keyPress(QKeyEvent *event); public slots: protected: void mousePressEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; + void keyPressEvent(QKeyEvent *event) override; + + bool m_customCopyPaste = false; }; diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp index 93f1be66d..2c09840f6 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.cpp @@ -23,6 +23,8 @@ ******************************************************************************/ #include "RDTreeWidget.h" +#include +#include #include #include #include @@ -30,6 +32,7 @@ #include #include #include +#include "Code/Interface/QRDInterface.h" class RDTreeWidgetModel : public QAbstractItemModel { @@ -639,8 +642,61 @@ void RDTreeWidget::focusOutEvent(QFocusEvent *event) void RDTreeWidget::keyPressEvent(QKeyEvent *e) { + if(!m_customCopyPaste && e->matches(QKeySequence::Copy)) + { + QModelIndexList sel = selectionModel()->selectedRows(); + + int stackWidths[16]; + int *heapWidths = NULL; + + int colCount = m_model->columnCount(); + + if(colCount >= 16) + heapWidths = new int[colCount]; + + int *widths = heapWidths ? heapWidths : stackWidths; + + for(int i = 0; i < colCount; i++) + widths[i] = 0; + + // align the copied data so that each column is the same width + for(QModelIndex idx : sel) + { + RDTreeWidgetItem *item = m_model->itemForIndex(idx); + + for(int i = 0; i < qMin(colCount, item->m_text.count()); i++) + widths[i] = qMax(widths[i], item->m_text[i].toString().count()); + } + + // only align up to 50 characters so one really long item doesn't mess up the whole thing + for(int i = 0; i < colCount; i++) + widths[i] = qMin(50, widths[i]); + + QString clipData; + for(QModelIndex idx : sel) + { + RDTreeWidgetItem *item = m_model->itemForIndex(idx); + + for(int i = 0; i < qMin(colCount, item->m_text.count()); i++) + { + QString format = i == 0 ? QFormatStr("%1") : QFormatStr(" %1"); + clipData += format.arg(item->m_text[i].toString(), -widths[i]); + } + + clipData += lit("\n"); + } + + QClipboard *clipboard = QApplication::clipboard(); + clipboard->setText(clipData.trimmed()); + + delete[] heapWidths; + } + else + { + QTreeView::keyPressEvent(e); + } + emit(keyPress(e)); - QTreeView::keyPressEvent(e); } void RDTreeWidget::drawBranches(QPainter *painter, const QRect &rect, const QModelIndex &index) const diff --git a/qrenderdoc/Widgets/Extended/RDTreeWidget.h b/qrenderdoc/Widgets/Extended/RDTreeWidget.h index 94b60e52d..bab564137 100644 --- a/qrenderdoc/Widgets/Extended/RDTreeWidget.h +++ b/qrenderdoc/Widgets/Extended/RDTreeWidget.h @@ -150,6 +150,7 @@ class RDTreeWidget : public QTreeView Q_OBJECT Q_PROPERTY(bool instantTooltips READ instantTooltips WRITE setInstantTooltips) + Q_PROPERTY(bool customCopyPasteHandler READ customCopyPasteHandler WRITE setCustomCopyPasteHandler) public: explicit RDTreeWidget(QWidget *parent = 0); ~RDTreeWidget(); @@ -167,6 +168,8 @@ public: void setClearSelectionOnFocusLoss(bool clear) { m_clearSelectionOnFocusLoss = clear; } bool instantTooltips() { return m_instantTooltips; } void setInstantTooltips(bool instant) { m_instantTooltips = instant; } + bool customCopyPasteHandler() { return m_customCopyPaste; } + void setCustomCopyPasteHandler(bool custom) { m_customCopyPaste = custom; } RDTreeWidgetItem *invisibleRootItem() { return m_root; } void addTopLevelItem(RDTreeWidgetItem *item) { m_root->addChild(item); } RDTreeWidgetItem *topLevelItem(int index) const { return m_root->child(index); } @@ -241,6 +244,7 @@ private: RDTreeWidgetItem *m_currentHoverItem = NULL; bool m_instantTooltips = false; + bool m_customCopyPaste = false; int m_hoverColumn = -1; QIcon m_normalHoverIcon; QIcon m_activeHoverIcon; diff --git a/qrenderdoc/Windows/APIInspector.ui b/qrenderdoc/Windows/APIInspector.ui index 728b5a7af..5890e1a16 100644 --- a/qrenderdoc/Windows/APIInspector.ui +++ b/qrenderdoc/Windows/APIInspector.ui @@ -47,6 +47,9 @@ false + + QAbstractItemView::ContiguousSelection + 20 @@ -60,13 +63,16 @@ true - + 0 1 + + QAbstractItemView::ContiguousSelection + @@ -84,6 +90,11 @@
Widgets/Extended/RDSplitter.h
1 + + RDListWidget + QListWidget +
Widgets/Extended/RDListWidget.h
+
diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 232e21e0e..f2a95b215 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -2253,7 +2253,7 @@ void TextureViewer::render_keyPress(QKeyEvent *e) if(texptr == NULL) return; - if((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_C) + if(e->matches(QKeySequence::Copy)) { QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(ui->texStatusDim->text() + lit(" | ") + ui->statusText->text());