diff options
Diffstat (limited to 'Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp')
| -rw-r--r-- | Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp | 112 |
1 files changed, 23 insertions, 89 deletions
diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp index 6e1a2fa813..a068397d09 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp @@ -2,8 +2,7 @@ // Licensed under GPLv2+ // Refer to the license.txt file included. -#include <future> -#include <utility> +#include "DolphinQt/Config/Mapping/MappingButton.h" #include <QApplication> #include <QFontMetrics> @@ -12,8 +11,6 @@ #include <QString> #include <QTimer> -#include "DolphinQt/Config/Mapping/MappingButton.h" - #include "Common/Thread.h" #include "Core/Core.h" @@ -103,96 +100,33 @@ void MappingButton::Detect() if (m_parent->GetDevice() == nullptr || !m_reference->IsInput()) return; - installEventFilter(BlockUserInputFilter::Instance()); - grabKeyboard(); - - // Make sure that we don't block event handling - QueueOnObject(this, [this] { - setText(QStringLiteral("...")); - - // The button text won't be updated if we don't process events here - QApplication::processEvents(); - - // Avoid that the button press itself is registered as an event - Common::SleepCurrentThread(100); - - std::vector<std::future<std::pair<QString, QString>>> futures; - QString expr; + const auto default_device_qualifier = m_parent->GetController()->GetDefaultDevice(); - if (m_parent->GetParent()->IsMappingAllDevices()) - { - for (const std::string& device_str : g_controller_interface.GetAllDeviceStrings()) - { - ciface::Core::DeviceQualifier devq; - devq.FromString(device_str); - - auto dev = g_controller_interface.FindDevice(devq); - - auto future = std::async(std::launch::async, [this, devq, dev, device_str] { - return std::make_pair( - QString::fromStdString(device_str), - MappingCommon::DetectExpression(m_reference, dev.get(), - m_parent->GetController()->GetDefaultDevice())); - }); - - futures.push_back(std::move(future)); - } - - bool done = false; - - while (!done) - { - for (auto& future : futures) - { - const auto status = future.wait_for(std::chrono::milliseconds(10)); - if (status == std::future_status::ready) - { - const auto pair = future.get(); - - done = true; - - if (pair.second.isEmpty()) - break; - - expr = QStringLiteral("`%1:%2`") - .arg(pair.first) - .arg(pair.second.startsWith(QLatin1Char('`')) ? pair.second.mid(1) : - pair.second); - break; - } - } - } - } - else - { - const auto dev = m_parent->GetDevice(); - expr = MappingCommon::DetectExpression(m_reference, dev.get(), - m_parent->GetController()->GetDefaultDevice()); - } + QString expression; - releaseKeyboard(); - removeEventFilter(BlockUserInputFilter::Instance()); + if (m_parent->GetParent()->IsMappingAllDevices()) + { + expression = MappingCommon::DetectExpression(this, g_controller_interface, + g_controller_interface.GetAllDeviceStrings(), + default_device_qualifier); + } + else + { + expression = MappingCommon::DetectExpression(this, g_controller_interface, + {default_device_qualifier.ToString()}, + default_device_qualifier); + } - if (!expr.isEmpty()) - { - m_reference->SetExpression(expr.toStdString()); - m_parent->SaveSettings(); - Update(); - m_parent->GetController()->UpdateReferences(g_controller_interface); + if (expression.isEmpty()) + return; - if (m_parent->IsIterativeInput()) - m_parent->NextButton(this); - } - else - { - OnButtonTimeout(); - } - }); -} + m_reference->SetExpression(expression.toStdString()); + m_parent->SaveSettings(); + Update(); + m_parent->GetController()->UpdateReferences(g_controller_interface); -void MappingButton::OnButtonTimeout() -{ - setText(ToDisplayString(QString::fromStdString(m_reference->GetExpression()))); + if (m_parent->IsIterativeInput()) + m_parent->NextButton(this); } void MappingButton::Clear() |
