#include "LOGIC/Lgc_Func_Button.h" #include "LOGIC/Lgc_Core.h" #include "LOGIC/Lgc_Func_Button_Private.h" #include #include 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 Lgc_FunctionButton_GetConfigurableUsages() { return { 0x0053, 0x0054, 0x0055, 0x0056, 0x005F, 0x0060, 0x0061, 0x0057, 0x005C, 0x005D, 0x005E, 0x0059, 0x005A, 0x005B, 0x0058, 0x0062, 0x0063 }; } QVector Lgc_FunctionButton_GetFeatureIdList(const Lgc_FunctionButton_Config& Config) { QVector 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; } }