Qt: Allow to clear keyboard shortcuts in dialog
Some checks are pending
Generate Translation Template / Generate Translation Template (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux-aarch64.sh, gcc, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (/rpcs3/.ci/build-linux.sh, gcc, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (a1d35836e8d45bfc6f63c26f0a3e5d46ef622fe1, rpcs3/rpcs3-binaries-linux-arm64, /rpcs3/.ci/build-linux-aarch64.sh, clang, rpcs3/rpcs3-ci-jammy-aarch64:1.6, ubuntu-24.04-arm) (push) Waiting to run
Build RPCS3 / RPCS3 Linux ${{ matrix.os }} ${{ matrix.compiler }} (d812f1254a1157c80fd402f94446310560f54e5f, rpcs3/rpcs3-binaries-linux, /rpcs3/.ci/build-linux.sh, clang, rpcs3/rpcs3-ci-jammy:1.6, ubuntu-24.04) (push) Waiting to run
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (51ae32f468089a8169aaf1567de355ff4a3e0842, rpcs3/rpcs3-binaries-mac, .ci/build-mac.sh, Intel) (push) Waiting to run
Build RPCS3 / RPCS3 Mac ${{ matrix.name }} (8e21bdbc40711a3fccd18fbf17b742348b0f4281, rpcs3/rpcs3-binaries-mac-arm64, .ci/build-mac-arm64.sh, Apple Silicon) (push) Waiting to run
Build RPCS3 / RPCS3 Windows (push) Waiting to run
Build RPCS3 / RPCS3 Windows Clang (win64, clang, clang64) (push) Waiting to run
Build RPCS3 / RPCS3 FreeBSD (push) Waiting to run

This commit is contained in:
Megamouse 2025-10-15 20:24:27 +02:00
parent 41a122a266
commit 146619de91
4 changed files with 47 additions and 29 deletions

View file

@ -39,6 +39,7 @@ shortcut_dialog::shortcut_dialog(const std::shared_ptr<gui_settings> gui_setting
key_sequence_edit->setObjectName(shortcut.name);
key_sequence_edit->setMinimumWidth(label->sizeHint().width());
key_sequence_edit->setKeySequence(key_sequence);
key_sequence_edit->setClearButtonEnabled(true);
m_values[shortcut.name] = key_sequence.toString();

View file

@ -17,32 +17,43 @@ shortcut_handler::shortcut_handler(gui::shortcuts::shortcut_handler_id handler_i
continue;
}
const QKeySequence key_sequence = sc_settings.get_key_sequence(info, gui_settings);
QShortcut* shortcut = new QShortcut(key_sequence, parent);
shortcut->setAutoRepeat(info.allow_auto_repeat);
QKeySequence key_sequence = sc_settings.get_key_sequence(info, gui_settings);
shortcut_key_info key_info{};
key_info.shortcut = shortcut;
key_info.shortcut = make_shortcut(shortcut_key, info, key_sequence);
key_info.info = info;
key_info.key_sequence = key_sequence;
key_info.key_sequence = std::move(key_sequence);
m_shortcuts[shortcut_key] = key_info;
connect(shortcut, &QShortcut::activated, this, [this, key = shortcut_key]()
{
handle_shortcut(key, m_shortcuts[key].key_sequence);
});
connect(shortcut, &QShortcut::activatedAmbiguously, this, [this, key = shortcut_key]()
{
// TODO: do not allow same shortcuts and remove this connect
// activatedAmbiguously will trigger if you have the same key sequence for several shortcuts
const QKeySequence& key_sequence = m_shortcuts[key].key_sequence;
shortcut_log.error("%s: Shortcut activated ambiguously: %s (%s)", m_handler_id, key, key_sequence.toString());
handle_shortcut(key, key_sequence);
});
m_shortcuts[shortcut_key] = std::move(key_info);
}
}
QShortcut* shortcut_handler::make_shortcut(gui::shortcuts::shortcut key, const shortcut_info& info, const QKeySequence& key_sequence)
{
if (key_sequence.isEmpty())
{
return nullptr;
}
QShortcut* shortcut = new QShortcut(key_sequence, parent());
shortcut->setAutoRepeat(info.allow_auto_repeat);
connect(shortcut, &QShortcut::activated, this, [this, key]()
{
handle_shortcut(key, m_shortcuts[key].key_sequence);
});
connect(shortcut, &QShortcut::activatedAmbiguously, this, [this, key]()
{
// TODO: do not allow same shortcuts and remove this connect
// activatedAmbiguously will trigger if you have the same key sequence for several shortcuts
const QKeySequence& key_sequence = m_shortcuts[key].key_sequence;
shortcut_log.error("%s: Shortcut activated ambiguously: %s (%s)", m_handler_id, key, key_sequence.toString());
handle_shortcut(key, key_sequence);
});
return shortcut;
}
void shortcut_handler::update()
{
shortcut_log.notice("%s: Updating shortcuts", m_handler_id);
@ -61,9 +72,22 @@ void shortcut_handler::update()
shortcut_key_info& key_info = m_shortcuts[shortcut_key];
key_info.key_sequence = key_sequence;
if (key_info.shortcut)
{
key_info.shortcut->setKey(key_sequence);
if (key_sequence.isEmpty())
{
key_info.shortcut->deleteLater();
key_info.shortcut = nullptr;
}
else
{
key_info.shortcut->setKey(key_sequence);
}
}
else
{
key_info.shortcut = make_shortcut(shortcut_key, info, key_sequence);
}
}
}

View file

@ -23,6 +23,7 @@ public Q_SLOTS:
private:
void handle_shortcut(gui::shortcuts::shortcut shortcut_key, const QKeySequence& key_sequence);
QShortcut* make_shortcut(gui::shortcuts::shortcut key, const shortcut_info& info, const QKeySequence& key_sequence);
gui::shortcuts::shortcut_handler_id m_handler_id;
std::shared_ptr<gui_settings> m_gui_settings;

View file

@ -114,13 +114,5 @@ QKeySequence shortcut_settings::get_key_sequence(const shortcut_info& entry, con
const QString saved_value = gui_settings->GetValue(get_shortcut_gui_save(entry.name)).toString();
QKeySequence key_sequence = QKeySequence::fromString(saved_value);
if (key_sequence.isEmpty())
{
// Use the default shortcut if no shortcut was configured
key_sequence = QKeySequence::fromString(entry.key_sequence);
}
return key_sequence;
return QKeySequence::fromString(saved_value);
}