Fix shaderviewer shortcuts using QShortcut which doesn't work well

This commit is contained in:
baldurk
2019-02-04 14:16:09 +00:00
parent 73a5357419
commit 36770522d7
3 changed files with 38 additions and 14 deletions
+21
View File
@@ -33,6 +33,7 @@
#include <QPixmapCache>
#include <QProgressBar>
#include <QProgressDialog>
#include <QShortcut>
#include <QToolButton>
#include <QToolTip>
#include "Code/QRDUtils.h"
@@ -2032,6 +2033,12 @@ void MainWindow::RegisterShortcut(const rdcstr &shortcut, QWidget *widget, Short
if(widget)
{
// we need to create a Qt shortcut for this widget. Even though we don't actually use the
// callback, unless a shortcut exists Qt might not properly send the ShortcutOverride event to
// our eventFilter - an example is on windows where Shift-F10 might go straight to a
// ContextEvent. So we create a shortcut on this widget & key-sequence to force Qt to process it
m_QtShortcuts.push_back(new QShortcut(ks, widget));
m_WidgetShortcutCallbacks[ks][widget] = callback;
}
else
@@ -2050,6 +2057,20 @@ void MainWindow::UnregisterShortcut(const rdcstr &shortcut, QWidget *widget)
{
if(widget)
{
// delete any Qt shortcuts we created for this widget
for(auto it = m_QtShortcuts.begin(); it != m_QtShortcuts.end();)
{
if((*it)->parent() == widget)
{
delete *it;
it = m_QtShortcuts.erase(it);
}
else
{
++it;
}
}
if(shortcut.isEmpty())
{
// if no shortcut is specified, remove all shortcuts for this widget
+2
View File
@@ -41,6 +41,7 @@ class RDLabel;
class LambdaThread;
class QMimeData;
class QProgressBar;
class QShortcut;
class QToolButton;
class CaptureDialog;
class LiveCapture;
@@ -194,6 +195,7 @@ private:
QMap<QKeySequence, ShortcutCallback> m_GlobalShortcutCallbacks;
QMap<QKeySequence, QMap<QWidget *, ShortcutCallback>> m_WidgetShortcutCallbacks;
QList<QShortcut *> m_QtShortcuts;
RDLabel *statusIcon;
RDLabel *statusText;
+15 -14
View File
@@ -584,20 +584,21 @@ void ShaderViewer::debugShader(const ShaderBindpointMapping *bind, const ShaderR
QObject::connect(edit, &ScintillaEdit::dwellEnd, this, &ShaderViewer::disasm_tooltipHide);
}
// register the shortcuts globally for this shader viewer so it works regardless of the active
// scintilla
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F10), this), &QShortcut::activated, this,
&ShaderViewer::stepNext);
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F10 | Qt::ShiftModifier), this),
&QShortcut::activated, this, &ShaderViewer::stepBack);
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F10 | Qt::ControlModifier), this),
&QShortcut::activated, this, &ShaderViewer::runToCursor);
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F5), this), &QShortcut::activated, this,
&ShaderViewer::run);
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F5 | Qt::ShiftModifier), this),
&QShortcut::activated, this, &ShaderViewer::runBack);
QObject::connect(new QShortcut(QKeySequence(Qt::Key_F9), this), &QShortcut::activated,
[this]() { ToggleBreakpoint(); });
// register the shortcuts via MainWindow so that it works regardless of the active scintilla but
// still handles multiple shader viewers being present (the one with focus will get the input)
m_Ctx.GetMainWindow()->RegisterShortcut(QKeySequence(Qt::Key_F10).toString(), this,
[this](QWidget *) { stepNext(); });
m_Ctx.GetMainWindow()->RegisterShortcut(QKeySequence(Qt::Key_F10 | Qt::ShiftModifier).toString(),
this, [this](QWidget *) { stepBack(); });
m_Ctx.GetMainWindow()->RegisterShortcut(
QKeySequence(Qt::Key_F10 | Qt::ControlModifier).toString(), this,
[this](QWidget *) { runToCursor(); });
m_Ctx.GetMainWindow()->RegisterShortcut(QKeySequence(Qt::Key_F5).toString(), this,
[this](QWidget *) { run(); });
m_Ctx.GetMainWindow()->RegisterShortcut(QKeySequence(Qt::Key_F5 | Qt::ShiftModifier).toString(),
this, [this](QWidget *) { runBack(); });
m_Ctx.GetMainWindow()->RegisterShortcut(QKeySequence(Qt::Key_F9).toString(), this,
[this](QWidget *) { ToggleBreakpoint(); });
// event filter to pick up tooltip events
ui->constants->installEventFilter(this);