From 12266baac67d286a8de4397eaf308a017a583dc0 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Mon, 11 Dec 2023 16:29:20 +0800 Subject: [PATCH] Implement refresh result [WIP] --- Wox.UI.Flutter/wox/lib/entity/wox_query.dart | 35 +++++++++++++++ Wox.UI.Flutter/wox/lib/main.dart | 2 +- .../launcher/wox_launcher_controller.dart | 45 +++++++++++++++++++ Wox.UI.Flutter/wox/macos/Podfile.lock | 2 +- Wox/plugin/manager.go | 25 ++++++++--- Wox/plugin/refresh.go | 10 +++++ Wox/ui/ui_impl.go | 10 +---- 7 files changed, 114 insertions(+), 15 deletions(-) diff --git a/Wox.UI.Flutter/wox/lib/entity/wox_query.dart b/Wox.UI.Flutter/wox/lib/entity/wox_query.dart index 0b84e1c31..17ee98cc1 100644 --- a/Wox.UI.Flutter/wox/lib/entity/wox_query.dart +++ b/Wox.UI.Flutter/wox/lib/entity/wox_query.dart @@ -206,3 +206,38 @@ class WoxListViewItemParams { icon = json['Icon']; } } + +class WoxRefreshableResult { + late String resultId; + late String title; + late String subTitle; + late WoxImage icon; + late WoxPreview preview; + late String contextData; + late int refreshInterval; + + WoxRefreshableResult( + {required this.resultId, required this.title, required this.subTitle, required this.icon, required this.preview, required this.contextData, required this.refreshInterval}); + + WoxRefreshableResult.fromJson(Map json) { + resultId = json['ResultId']; + title = json['Title']; + subTitle = json['SubTitle'] ?? ""; + icon = json['Icon']; + preview = json['Preview']; + contextData = json['ContextData']; + refreshInterval = json['RefreshInterval']; + } + + Map toJson() { + final Map data = {}; + data['ResultId'] = resultId; + data['Title'] = title; + data['SubTitle'] = subTitle; + data['Icon'] = icon.toJson(); + data['Preview'] = preview.toJson(); + data['ContextData'] = contextData; + data['RefreshInterval'] = refreshInterval; + return data; + } +} diff --git a/Wox.UI.Flutter/wox/lib/main.dart b/Wox.UI.Flutter/wox/lib/main.dart index 7d50d1b24..cbd9f21e3 100644 --- a/Wox.UI.Flutter/wox/lib/main.dart +++ b/Wox.UI.Flutter/wox/lib/main.dart @@ -47,7 +47,7 @@ Future initialServices(List arguments) async { await initArgs(arguments); await WoxThemeUtil.instance.loadTheme(); await WoxSettingUtil.instance.loadSetting(); - var controller = WoxLauncherController(); + var controller = WoxLauncherController()..startRefreshSchedule(); await WoxWebsocketMsgUtil.instance.initialize(Uri.parse("ws://localhost:${Env.serverPort}/ws"), onMessageReceived: controller.handleWebSocketMessage); HeartbeatChecker().startChecking(); Get.put(controller); diff --git a/Wox.UI.Flutter/wox/lib/modules/launcher/wox_launcher_controller.dart b/Wox.UI.Flutter/wox/lib/modules/launcher/wox_launcher_controller.dart index 75f834cb2..e2dcb53c2 100644 --- a/Wox.UI.Flutter/wox/lib/modules/launcher/wox_launcher_controller.dart +++ b/Wox.UI.Flutter/wox/lib/modules/launcher/wox_launcher_controller.dart @@ -45,6 +45,7 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa final _resultActions = [].obs; final filterResultActions = [].obs; var _clearQueryResultsTimer = Timer(const Duration(milliseconds: 200), () => {}); + var refreshCounter = 0; @override Future toggleApp(ShowAppParams params) async { @@ -241,6 +242,9 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa final theme = WoxTheme.fromJson(msg.data); WoxThemeUtil.instance.changeTheme(theme); woxTheme.value = theme; + } else if (msg.method == "Refresh") { + final result = WoxRefreshableResult.fromJson(msg.data); + onRefreshResult(result); } } @@ -408,6 +412,47 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa return _activeActionIndex.value == index; } + startRefreshSchedule() { + Timer.periodic(const Duration(milliseconds: 100), (timer) { + refreshResults(); + }); + } + + Future refreshResults() async { + refreshCounter = refreshCounter + 100; + for (var result in queryResults) { + if (result.refreshInterval > 0 && refreshCounter % result.refreshInterval == 0) { + var msg = WoxWebsocketMsg(id: const UuidV4().generate(), type: WoxMsgTypeEnum.WOX_MSG_TYPE_REQUEST.code, method: WoxMsgMethodEnum.WOX_MSG_METHOD_REFRESH.code, data: { + "refreshableResult": WoxRefreshableResult( + resultId: result.id, + title: result.title, + subTitle: result.subTitle, + icon: result.icon, + preview: result.preview, + contextData: result.contextData, + refreshInterval: result.refreshInterval, + ).toJson(), + }); + WoxWebsocketMsgUtil.instance.sendMessage(msg); + } + } + } + + void onRefreshResult(WoxRefreshableResult result) { + Logger.instance.info("Refresh result: ${result.toJson()}"); + for (var i = 0; i < queryResults.length; i++) { + if (queryResults[i].id == result.resultId) { + queryResults[i].title = result.title; + queryResults[i].subTitle = result.subTitle; + queryResults[i].icon = result.icon; + queryResults[i].preview = result.preview; + queryResults[i].contextData = result.contextData; + queryResults[i].refreshInterval = result.refreshInterval; + break; + } + } + } + @override void dispose() { queryBoxFocusNode.dispose(); diff --git a/Wox.UI.Flutter/wox/macos/Podfile.lock b/Wox.UI.Flutter/wox/macos/Podfile.lock index f7efb636a..9fd3eb546 100644 --- a/Wox.UI.Flutter/wox/macos/Podfile.lock +++ b/Wox.UI.Flutter/wox/macos/Podfile.lock @@ -38,4 +38,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 16208599a12443d53889ba2270a4985981cfb204 -COCOAPODS: 1.12.1 +COCOAPODS: 1.11.3 diff --git a/Wox/plugin/manager.go b/Wox/plugin/manager.go index 281e1156e..2897c854e 100644 --- a/Wox/plugin/manager.go +++ b/Wox/plugin/manager.go @@ -7,6 +7,7 @@ import ( "fmt" "github.com/Masterminds/semver/v3" "github.com/google/uuid" + "github.com/jinzhu/copier" "github.com/samber/lo" "github.com/wissance/stringFormatter" "math" @@ -662,17 +663,31 @@ func (m *Manager) ExecuteAction(ctx context.Context, resultId string, actionId s setting.GetSettingManager().AddActionedResult(ctx, resultCache.PluginInstance.Metadata.Id, resultCache.ResultTitle, resultCache.ResultSubTitle) } -func (m *Manager) ExecuteRefresh(ctx context.Context, resultId string, refreshableResult RefreshableResult) (RefreshableResult, error) { - resultCache, found := m.resultCache.Load(resultId) +func (m *Manager) ExecuteRefresh(ctx context.Context, refreshableResultWithId RefreshableResultWithResultId) (RefreshableResultWithResultId, error) { + var refreshableResult RefreshableResult + copyErr := copier.Copy(&refreshableResult, &refreshableResultWithId) + if copyErr != nil { + return RefreshableResultWithResultId{}, fmt.Errorf("failed to copy refreshable result: %w", copyErr) + } + + resultCache, found := m.resultCache.Load(refreshableResultWithId.ResultId) if !found { - logger.Error(ctx, fmt.Sprintf("result cache not found for result id: %s", resultId)) - return refreshableResult, errors.New("result cache not found") + logger.Error(ctx, fmt.Sprintf("result cache not found for result id: %s", refreshableResultWithId.ResultId)) + return refreshableResultWithId, errors.New("result cache not found") } newResult := resultCache.Refresh(refreshableResult) newResult = m.PolishRefreshableResult(ctx, resultCache.PluginInstance, newResult) - return newResult, nil + return RefreshableResultWithResultId{ + ResultId: refreshableResultWithId.ResultId, + Title: newResult.Title, + SubTitle: newResult.SubTitle, + Icon: newResult.Icon, + Preview: newResult.Preview, + ContextData: newResult.ContextData, + RefreshInterval: newResult.RefreshInterval, + }, nil } func (m *Manager) GetResultPreview(ctx context.Context, resultId string) (WoxPreview, error) { diff --git a/Wox/plugin/refresh.go b/Wox/plugin/refresh.go index 21a6cf625..443183869 100644 --- a/Wox/plugin/refresh.go +++ b/Wox/plugin/refresh.go @@ -8,3 +8,13 @@ type RefreshableResult struct { ContextData string RefreshInterval int // set to 0 if you don't want to refresh this result anymore } + +type RefreshableResultWithResultId struct { + ResultId string + Title string + SubTitle string + Icon WoxImage + Preview WoxPreview + ContextData string + RefreshInterval int +} diff --git a/Wox/ui/ui_impl.go b/Wox/ui/ui_impl.go index 2eb864283..c9c3e9897 100644 --- a/Wox/ui/ui_impl.go +++ b/Wox/ui/ui_impl.go @@ -238,14 +238,8 @@ func handleRefresh(ctx context.Context, request WebsocketMsg) { responseUIError(ctx, request, resultErr.Error()) return } - resultId, resultIdErr := getWebsocketMsgParameter(ctx, request, "resultId") - if resultIdErr != nil { - logger.Error(ctx, resultIdErr.Error()) - responseUIError(ctx, request, resultIdErr.Error()) - return - } - var result plugin.RefreshableResult + var result plugin.RefreshableResultWithResultId unmarshalErr := json.Unmarshal([]byte(resultStr), &result) if unmarshalErr != nil { logger.Error(ctx, unmarshalErr.Error()) @@ -253,7 +247,7 @@ func handleRefresh(ctx context.Context, request WebsocketMsg) { return } - newResult, refreshErr := plugin.GetPluginManager().ExecuteRefresh(ctx, resultId, result) + newResult, refreshErr := plugin.GetPluginManager().ExecuteRefresh(ctx, result) if refreshErr != nil { logger.Error(ctx, refreshErr.Error()) responseUIError(ctx, request, refreshErr.Error())