Push layered Qt host source files
This commit is contained in:
@@ -1,20 +1,59 @@
|
||||
#include "LOGIC/Lgc_Func_Button.h"
|
||||
|
||||
#include "LOGIC/Lgc_Core.h"
|
||||
#include <QtCore/QUrl>
|
||||
#include <QtCore/QVector>
|
||||
#include <QtGui/QDesktopServices>
|
||||
#include <Windows.h>
|
||||
#include "LOGIC/Lgc_Func_Button_Private.h"
|
||||
#include <QtCore/QStringList>
|
||||
#include <algorithm>
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
QString Lgc_Func_Button_Func_GetUsageShortText(quint16 Usage)
|
||||
QString Lgc_FunctionButton_GetKeyboardUsageText(quint16 Usage)
|
||||
{
|
||||
switch (Usage)
|
||||
{
|
||||
case 0x0053: return QStringLiteral("Num Lock");
|
||||
case 0x0054: return QStringLiteral("小键盘 /");
|
||||
case 0x0055: return QStringLiteral("小键盘 *");
|
||||
case 0x0056: return QStringLiteral("小键盘 -");
|
||||
case 0x0057: return QStringLiteral("小键盘 +");
|
||||
case 0x0058: return QStringLiteral("小键盘 Enter");
|
||||
case 0x0059: return QStringLiteral("小键盘 1");
|
||||
case 0x005A: return QStringLiteral("小键盘 2");
|
||||
case 0x005B: return QStringLiteral("小键盘 3");
|
||||
case 0x005C: return QStringLiteral("小键盘 4");
|
||||
case 0x005D: return QStringLiteral("小键盘 5");
|
||||
case 0x005E: return QStringLiteral("小键盘 6");
|
||||
case 0x005F: return QStringLiteral("小键盘 7");
|
||||
case 0x0060: return QStringLiteral("小键盘 8");
|
||||
case 0x0061: return QStringLiteral("小键盘 9");
|
||||
case 0x0062: return QStringLiteral("小键盘 0");
|
||||
case 0x0063: return QStringLiteral("小键盘 .");
|
||||
case 0x00E0: return QStringLiteral("Left Ctrl");
|
||||
case 0x00E1: return QStringLiteral("Left Shift");
|
||||
case 0x00E2: return QStringLiteral("Left Alt");
|
||||
case 0x00E3: return QStringLiteral("Left GUI");
|
||||
case 0x00E4: return QStringLiteral("Right Ctrl");
|
||||
case 0x00E5: return QStringLiteral("Right Shift");
|
||||
case 0x00E6: return QStringLiteral("Right Alt");
|
||||
case 0x00E7: return QStringLiteral("Right GUI");
|
||||
default:
|
||||
return QStringLiteral("未知按键");
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
QString Lgc_FunctionButton_GetUsageShortText(quint16 Usage)
|
||||
{
|
||||
switch (Usage)
|
||||
{
|
||||
case 0x0053: return QStringLiteral("Num");
|
||||
case 0x0054: return QStringLiteral("/");
|
||||
case 0x0055: return QStringLiteral("*");
|
||||
case 0x0056: return QStringLiteral("-");
|
||||
case 0x0057: return QStringLiteral("+");
|
||||
case 0x0058: return QStringLiteral("Enter");
|
||||
case 0x0059: return QStringLiteral("1");
|
||||
case 0x005A: return QStringLiteral("2");
|
||||
case 0x005B: return QStringLiteral("3");
|
||||
@@ -25,167 +64,244 @@ QString Lgc_Func_Button_Func_GetUsageShortText(quint16 Usage)
|
||||
case 0x0060: return QStringLiteral("8");
|
||||
case 0x0061: return QStringLiteral("9");
|
||||
case 0x0062: return QStringLiteral("0");
|
||||
case 0x0063: return QStringLiteral(".");
|
||||
default:
|
||||
return Mid_Func_GetKeyboardUsageText(Usage);
|
||||
return Lgc_FunctionButton_GetKeyboardUsageText(Usage);
|
||||
}
|
||||
}
|
||||
|
||||
WORD Lgc_Func_Button_Func_GetWindowsVirtualKey(quint16 Usage)
|
||||
QString Lgc_FunctionButton_GetFeatureTypeText(Lgc_FunctionFeature_Type Type)
|
||||
{
|
||||
switch (Usage)
|
||||
switch (Type)
|
||||
{
|
||||
case 0x0056: return VK_SUBTRACT;
|
||||
case 0x0057: return VK_ADD;
|
||||
case 0x0059: return VK_NUMPAD1;
|
||||
case 0x005A: return VK_NUMPAD2;
|
||||
case 0x005B: return VK_NUMPAD3;
|
||||
case 0x005C: return VK_NUMPAD4;
|
||||
case 0x005D: return VK_NUMPAD5;
|
||||
case 0x005E: return VK_NUMPAD6;
|
||||
case 0x005F: return VK_NUMPAD7;
|
||||
case 0x0060: return VK_NUMPAD8;
|
||||
case 0x0061: return VK_NUMPAD9;
|
||||
case 0x0062: return VK_NUMPAD0;
|
||||
case Lgc_FunctionFeature_Type::KeyCombination:
|
||||
return QStringLiteral("Shortcut");
|
||||
case Lgc_FunctionFeature_Type::KeySequence:
|
||||
return QStringLiteral("Shortcut Sequence");
|
||||
case Lgc_FunctionFeature_Type::Website:
|
||||
return QStringLiteral("Open Website");
|
||||
default:
|
||||
return 0;
|
||||
return QStringLiteral("Unknown");
|
||||
}
|
||||
}
|
||||
|
||||
bool Lgc_Func_Button_Func_SendUnicodeText(const QString& Text)
|
||||
QVector<quint16> Lgc_FunctionButton_GetConfigurableUsages()
|
||||
{
|
||||
if (Text.isEmpty())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QVector<INPUT> InputList;
|
||||
InputList.reserve(Text.size() * 2);
|
||||
for (QChar Character : Text)
|
||||
{
|
||||
INPUT InputDown = {};
|
||||
InputDown.type = INPUT_KEYBOARD;
|
||||
InputDown.ki.wScan = Character.unicode();
|
||||
InputDown.ki.dwFlags = KEYEVENTF_UNICODE;
|
||||
InputList.append(InputDown);
|
||||
|
||||
INPUT InputUp = InputDown;
|
||||
InputUp.ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
|
||||
InputList.append(InputUp);
|
||||
}
|
||||
|
||||
return SendInput(static_cast<UINT>(InputList.size()), InputList.data(), sizeof(INPUT)) ==
|
||||
static_cast<UINT>(InputList.size());
|
||||
return {
|
||||
0x0053, 0x0054, 0x0055, 0x0056,
|
||||
0x005F, 0x0060, 0x0061, 0x0057,
|
||||
0x005C, 0x005D, 0x005E,
|
||||
0x0059, 0x005A, 0x005B, 0x0058,
|
||||
0x0062, 0x0063
|
||||
};
|
||||
}
|
||||
|
||||
void Lgc_Func_Button_Func_RunMacroText(Lgc_Core_Struct_State* p_State, QString* p_TextStatus)
|
||||
QVector<int> Lgc_FunctionButton_GetFeatureIdList(const Lgc_FunctionButton_Config& Config)
|
||||
{
|
||||
const QString Text = p_State->FunctionButtonConfig.MacroText.trimmed();
|
||||
if (Text.isEmpty())
|
||||
QVector<int> FeatureIdList = Config.FeatureMap.keys().toVector();
|
||||
std::sort(FeatureIdList.begin(), FeatureIdList.end());
|
||||
return FeatureIdList;
|
||||
}
|
||||
|
||||
Lgc_FunctionFeature_Definition Lgc_FunctionButton_GetFeature(
|
||||
const Lgc_FunctionButton_Config& Config,
|
||||
int FeatureId)
|
||||
{
|
||||
return Config.FeatureMap.value(FeatureId);
|
||||
}
|
||||
|
||||
QString Lgc_FunctionButton_GetFeatureName(const Lgc_FunctionFeature_Definition& Feature)
|
||||
{
|
||||
if (!Feature.Name.trimmed().isEmpty())
|
||||
{
|
||||
return Feature.Name.trimmed();
|
||||
}
|
||||
|
||||
return Feature.Id > 0
|
||||
? QStringLiteral("Function %1").arg(Feature.Id)
|
||||
: QStringLiteral("Unnamed Function");
|
||||
}
|
||||
|
||||
QString Lgc_FunctionButton_GetFeatureDescription(const Lgc_FunctionFeature_Definition& Feature)
|
||||
{
|
||||
if (Feature.Id <= 0)
|
||||
{
|
||||
return QStringLiteral("No function selected.");
|
||||
}
|
||||
|
||||
if (!Feature.Description.trimmed().isEmpty())
|
||||
{
|
||||
return Feature.Description.trimmed();
|
||||
}
|
||||
|
||||
switch (Feature.Type)
|
||||
{
|
||||
case Lgc_FunctionFeature_Type::KeyCombination:
|
||||
return Feature.SequenceText.trimmed().isEmpty()
|
||||
? QStringLiteral("Send one shortcut. No shortcut is configured yet.")
|
||||
: QStringLiteral("Send shortcut: %1").arg(Feature.SequenceText.trimmed());
|
||||
case Lgc_FunctionFeature_Type::KeySequence:
|
||||
return Feature.SequenceText.trimmed().isEmpty()
|
||||
? QStringLiteral("Send a sequence of shortcuts. No sequence is configured yet.")
|
||||
: QStringLiteral("Send shortcut sequence: %1").arg(Feature.SequenceText.trimmed());
|
||||
case Lgc_FunctionFeature_Type::Website:
|
||||
return Feature.WebsiteUrl.trimmed().isEmpty()
|
||||
? QStringLiteral("Open a website. No URL is configured yet.")
|
||||
: QStringLiteral("Open website: %1").arg(Feature.WebsiteUrl.trimmed());
|
||||
default:
|
||||
return QStringLiteral("Unknown function.");
|
||||
}
|
||||
}
|
||||
|
||||
QString Lgc_FunctionButton_GetFeatureDescriptionById(
|
||||
const Lgc_FunctionButton_Config& Config,
|
||||
int FeatureId)
|
||||
{
|
||||
return Lgc_FunctionButton_GetFeatureDescription(
|
||||
Lgc_FunctionButton_GetFeature(Config, FeatureId));
|
||||
}
|
||||
|
||||
QString Lgc_FunctionButton_GetFeatureBindingSummary(
|
||||
const Lgc_FunctionButton_Config& Config,
|
||||
int FeatureId)
|
||||
{
|
||||
if (FeatureId <= 0)
|
||||
{
|
||||
return QStringLiteral("No keys are bound.");
|
||||
}
|
||||
|
||||
QStringList KeyList;
|
||||
for (quint16 Usage : Lgc_FunctionButton_GetConfigurableUsages())
|
||||
{
|
||||
if (Lgc_FunctionButton_GetUsageFeatureId(Config, Usage) == FeatureId)
|
||||
{
|
||||
KeyList.append(Lgc_FunctionButton_GetUsageShortText(Usage));
|
||||
}
|
||||
}
|
||||
|
||||
return KeyList.isEmpty()
|
||||
? QStringLiteral("No keys are bound.")
|
||||
: QStringLiteral("Bound keys: %1").arg(KeyList.join(QStringLiteral(", ")));
|
||||
}
|
||||
|
||||
int Lgc_FunctionButton_AddFeature(Lgc_FunctionButton_Config& Config)
|
||||
{
|
||||
int FeatureId = 1;
|
||||
while (Config.FeatureMap.contains(FeatureId))
|
||||
{
|
||||
++FeatureId;
|
||||
}
|
||||
|
||||
Lgc_FunctionFeature_Definition Feature;
|
||||
Feature.Id = FeatureId;
|
||||
Feature.Name = QStringLiteral("Function %1").arg(FeatureId);
|
||||
Feature.Type = Lgc_FunctionFeature_Type::KeyCombination;
|
||||
Config.FeatureMap.insert(FeatureId, Feature);
|
||||
return FeatureId;
|
||||
}
|
||||
|
||||
void Lgc_FunctionButton_RemoveFeature(Lgc_FunctionButton_Config& Config, int FeatureId)
|
||||
{
|
||||
if (FeatureId <= 0)
|
||||
{
|
||||
*p_TextStatus = QStringLiteral("功能键 0 未配置输出文本。");
|
||||
return;
|
||||
}
|
||||
|
||||
*p_TextStatus = Lgc_Func_Button_Func_SendUnicodeText(Text)
|
||||
? QStringLiteral("功能键 0 已输出文本:%1").arg(Text)
|
||||
: QStringLiteral("功能键 0 输出文本失败。");
|
||||
Config.FeatureMap.remove(FeatureId);
|
||||
|
||||
auto It = Config.UsageFeatureIdMap.begin();
|
||||
while (It != Config.UsageFeatureIdMap.end())
|
||||
{
|
||||
if (It.value() == FeatureId)
|
||||
{
|
||||
It = Config.UsageFeatureIdMap.erase(It);
|
||||
}
|
||||
else
|
||||
{
|
||||
++It;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void Lgc_Func_Button_Func_RunSwapKey(Lgc_Core_Struct_State* p_State, QString* p_TextStatus)
|
||||
void Lgc_FunctionButton_SetFeature(
|
||||
Lgc_FunctionButton_Config& Config,
|
||||
const Lgc_FunctionFeature_Definition& Feature)
|
||||
{
|
||||
const quint16 UsageLeft = p_State->FunctionButtonConfig.SwapUsageLeft;
|
||||
const quint16 UsageRight = p_State->FunctionButtonConfig.SwapUsageRight;
|
||||
if ((UsageLeft == 0) || (UsageRight == 0) || (UsageLeft == UsageRight))
|
||||
if (Feature.Id <= 0)
|
||||
{
|
||||
*p_TextStatus = QStringLiteral("功能键 1 的交换配置无效。");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!Lgc_Core_Func_SetSwapMode(p_State, UsageLeft, UsageRight, !p_State->IsSwapModeOn))
|
||||
{
|
||||
*p_TextStatus = QStringLiteral("功能键 1 切换按键交换失败。");
|
||||
return;
|
||||
}
|
||||
|
||||
*p_TextStatus = p_State->IsSwapModeOn
|
||||
? QStringLiteral("功能键 1 已开启按键交换:%1 <-> %2")
|
||||
.arg(Lgc_Func_Button_Func_GetUsageShortText(UsageLeft))
|
||||
.arg(Lgc_Func_Button_Func_GetUsageShortText(UsageRight))
|
||||
: QStringLiteral("功能键 1 已关闭按键交换:%1 <-> %2")
|
||||
.arg(Lgc_Func_Button_Func_GetUsageShortText(UsageLeft))
|
||||
.arg(Lgc_Func_Button_Func_GetUsageShortText(UsageRight));
|
||||
Config.FeatureMap.insert(Feature.Id, Feature);
|
||||
}
|
||||
|
||||
void Lgc_Func_Button_Func_RunOpenWebsite(Lgc_Core_Struct_State* p_State, QString* p_TextStatus)
|
||||
int Lgc_FunctionButton_GetUsageFeatureId(
|
||||
const Lgc_FunctionButton_Config& Config,
|
||||
quint16 Usage)
|
||||
{
|
||||
const QString UrlText = p_State->FunctionButtonConfig.WebsiteUrl.trimmed();
|
||||
const QUrl Url = QUrl::fromUserInput(UrlText);
|
||||
if (UrlText.isEmpty() || !Url.isValid() || Url.isEmpty())
|
||||
{
|
||||
*p_TextStatus = QStringLiteral("功能键 2 的网址配置无效。");
|
||||
return;
|
||||
}
|
||||
|
||||
*p_TextStatus = QDesktopServices::openUrl(Url)
|
||||
? QStringLiteral("功能键 2 已打开网址:%1").arg(Url.toString())
|
||||
: QStringLiteral("功能键 2 打开网址失败。");
|
||||
const int FeatureId = Config.UsageFeatureIdMap.value(Usage, 0);
|
||||
return Config.FeatureMap.contains(FeatureId) ? FeatureId : 0;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
bool Lgc_Func_Button_Func_SendUsageToWindows(quint16 Usage, bool IsPressed)
|
||||
{
|
||||
const WORD VirtualKey = Lgc_Func_Button_Func_GetWindowsVirtualKey(Usage);
|
||||
if (VirtualKey == 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
INPUT InputData = {};
|
||||
InputData.type = INPUT_KEYBOARD;
|
||||
InputData.ki.wVk = VirtualKey;
|
||||
if (!IsPressed)
|
||||
{
|
||||
InputData.ki.dwFlags = KEYEVENTF_KEYUP;
|
||||
}
|
||||
|
||||
return SendInput(1, &InputData, sizeof(INPUT)) == 1;
|
||||
}
|
||||
|
||||
bool Lgc_Func_Button_Func_HandlePressedUsage(
|
||||
Lgc_Core_Struct_State* p_State,
|
||||
void Lgc_FunctionButton_SetUsageFeatureId(
|
||||
Lgc_FunctionButton_Config& Config,
|
||||
quint16 Usage,
|
||||
QString* p_TextStatus)
|
||||
int FeatureId)
|
||||
{
|
||||
p_TextStatus->clear();
|
||||
switch (Usage)
|
||||
if ((FeatureId <= 0) || !Config.FeatureMap.contains(FeatureId))
|
||||
{
|
||||
case 0x0062:
|
||||
Lgc_Func_Button_Func_RunMacroText(p_State, p_TextStatus);
|
||||
return true;
|
||||
Config.UsageFeatureIdMap.remove(Usage);
|
||||
return;
|
||||
}
|
||||
|
||||
case 0x0059:
|
||||
Lgc_Func_Button_Func_RunSwapKey(p_State, p_TextStatus);
|
||||
return true;
|
||||
Config.UsageFeatureIdMap.insert(Usage, FeatureId);
|
||||
}
|
||||
|
||||
case 0x005A:
|
||||
Lgc_Func_Button_Func_RunOpenWebsite(p_State, p_TextStatus);
|
||||
return true;
|
||||
bool Lgc_FunctionButton_HasUsageFeature(
|
||||
const Lgc_FunctionButton_Config& Config,
|
||||
quint16 Usage)
|
||||
{
|
||||
return Lgc_FunctionButton_GetUsageFeatureId(Config, Usage) > 0;
|
||||
}
|
||||
|
||||
case 0x0056:
|
||||
case 0x0057:
|
||||
case 0x005B:
|
||||
case 0x005C:
|
||||
case 0x005D:
|
||||
case 0x005E:
|
||||
case 0x005F:
|
||||
case 0x0060:
|
||||
case 0x0061:
|
||||
*p_TextStatus = QStringLiteral("功能键 %1 还没有绑定具体功能。")
|
||||
.arg(Lgc_Func_Button_Func_GetUsageShortText(Usage));
|
||||
return true;
|
||||
bool Lgc_FunctionButton_SendUsageToWindows(quint16 Usage, bool IsPressed)
|
||||
{
|
||||
return Lgc_FunctionButton_SendWindowsKey(
|
||||
Lgc_FunctionButton_GetWindowsKey(Usage),
|
||||
IsPressed);
|
||||
}
|
||||
|
||||
default:
|
||||
bool Lgc_FunctionButton_RunBinding(
|
||||
Lgc_Core_Struct_State& State,
|
||||
quint16 Usage,
|
||||
QString& TextStatus)
|
||||
{
|
||||
TextStatus.clear();
|
||||
|
||||
const int FeatureId =
|
||||
Lgc_FunctionButton_GetUsageFeatureId(State.FunctionButtonConfig, Usage);
|
||||
if (FeatureId <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
const Lgc_FunctionFeature_Definition Feature =
|
||||
Lgc_FunctionButton_GetFeature(State.FunctionButtonConfig, FeatureId);
|
||||
|
||||
switch (Feature.Type)
|
||||
{
|
||||
case Lgc_FunctionFeature_Type::KeyCombination:
|
||||
Lgc_FunctionButton_RunKeyCombination(Feature, Usage, TextStatus);
|
||||
return true;
|
||||
case Lgc_FunctionFeature_Type::KeySequence:
|
||||
Lgc_FunctionButton_RunKeySequence(Feature, Usage, TextStatus);
|
||||
return true;
|
||||
case Lgc_FunctionFeature_Type::Website:
|
||||
Lgc_FunctionButton_RunOpenWebsite(Feature, TextStatus);
|
||||
return true;
|
||||
default:
|
||||
TextStatus = QStringLiteral("Unknown function type: %1")
|
||||
.arg(Lgc_FunctionButton_GetFeatureName(Feature));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user