Files
0417_QT_code/LOGIC/Lgc_Func_Button.cpp

308 lines
9.1 KiB
C++

#include "LOGIC/Lgc_Func_Button.h"
#include "LOGIC/Lgc_Core.h"
#include "LOGIC/Lgc_Func_Button_Private.h"
#include <QtCore/QStringList>
#include <algorithm>
namespace
{
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");
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(".");
default:
return Lgc_FunctionButton_GetKeyboardUsageText(Usage);
}
}
QString Lgc_FunctionButton_GetFeatureTypeText(Lgc_FunctionFeature_Type Type)
{
switch (Type)
{
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 QStringLiteral("Unknown");
}
}
QVector<quint16> Lgc_FunctionButton_GetConfigurableUsages()
{
return {
0x0053, 0x0054, 0x0055, 0x0056,
0x005F, 0x0060, 0x0061, 0x0057,
0x005C, 0x005D, 0x005E,
0x0059, 0x005A, 0x005B, 0x0058,
0x0062, 0x0063
};
}
QVector<int> Lgc_FunctionButton_GetFeatureIdList(const Lgc_FunctionButton_Config& Config)
{
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)
{
return;
}
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_FunctionButton_SetFeature(
Lgc_FunctionButton_Config& Config,
const Lgc_FunctionFeature_Definition& Feature)
{
if (Feature.Id <= 0)
{
return;
}
Config.FeatureMap.insert(Feature.Id, Feature);
}
int Lgc_FunctionButton_GetUsageFeatureId(
const Lgc_FunctionButton_Config& Config,
quint16 Usage)
{
const int FeatureId = Config.UsageFeatureIdMap.value(Usage, 0);
return Config.FeatureMap.contains(FeatureId) ? FeatureId : 0;
}
void Lgc_FunctionButton_SetUsageFeatureId(
Lgc_FunctionButton_Config& Config,
quint16 Usage,
int FeatureId)
{
if ((FeatureId <= 0) || !Config.FeatureMap.contains(FeatureId))
{
Config.UsageFeatureIdMap.remove(Usage);
return;
}
Config.UsageFeatureIdMap.insert(Usage, FeatureId);
}
bool Lgc_FunctionButton_HasUsageFeature(
const Lgc_FunctionButton_Config& Config,
quint16 Usage)
{
return Lgc_FunctionButton_GetUsageFeatureId(Config, Usage) > 0;
}
bool Lgc_FunctionButton_SendUsageToWindows(quint16 Usage, bool IsPressed)
{
return Lgc_FunctionButton_SendWindowsKey(
Lgc_FunctionButton_GetWindowsKey(Usage),
IsPressed);
}
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;
}
}