From 472d0aff18d437205110a70c568d66325c9e9a89 Mon Sep 17 00:00:00 2001 From: qianlifeng Date: Mon, 11 Dec 2023 21:43:31 +0800 Subject: [PATCH] Impl refresh function --- .../wox/lib/components/wox_preview_view.dart | 12 ++++++++++- .../wox/lib/entity/wox_preview.dart | 2 +- Wox.UI.Flutter/wox/lib/entity/wox_query.dart | 4 ++-- .../launcher/wox_launcher_controller.dart | 9 +++++++++ Wox.UI.Flutter/wox/macos/Podfile.lock | 2 +- Wox/plugin/manager.go | 20 +++++++++++++++++-- Wox/ui/http.go | 1 + Wox/ui/ui_impl.go | 11 ++++++++++ 8 files changed, 54 insertions(+), 7 deletions(-) diff --git a/Wox.UI.Flutter/wox/lib/components/wox_preview_view.dart b/Wox.UI.Flutter/wox/lib/components/wox_preview_view.dart index 18b8451fe..461d34263 100644 --- a/Wox.UI.Flutter/wox/lib/components/wox_preview_view.dart +++ b/Wox.UI.Flutter/wox/lib/components/wox_preview_view.dart @@ -36,7 +36,17 @@ class WoxPreviewView extends StatelessWidget { Widget contentWidget = const SizedBox(); if (woxPreview.previewType == WoxPreviewTypeEnum.WOX_PREVIEW_TYPE_MARKDOWN.code) { - contentWidget = Markdown(data: woxPreview.previewData, padding: EdgeInsets.zero); + var styleTheme = Theme.of(context).copyWith( + textTheme: Theme.of(context).textTheme.apply( + bodyColor: fromCssColor(woxTheme.previewFontColor), + displayColor: fromCssColor(woxTheme.previewFontColor), + )); + contentWidget = Markdown( + data: woxPreview.previewData, + padding: EdgeInsets.zero, + selectable: true, + styleSheet: MarkdownStyleSheet.fromTheme(styleTheme), + ); } else if (woxPreview.previewType == WoxPreviewTypeEnum.WOX_PREVIEW_TYPE_TEXT.code) { contentWidget = SelectableText(woxPreview.previewData, style: TextStyle(color: fromCssColor(woxTheme.previewFontColor))); } else if (woxPreview.previewType == WoxPreviewTypeEnum.WOX_PREVIEW_TYPE_IMAGE.code) { diff --git a/Wox.UI.Flutter/wox/lib/entity/wox_preview.dart b/Wox.UI.Flutter/wox/lib/entity/wox_preview.dart index 695bb9ba7..d579e7ffb 100644 --- a/Wox.UI.Flutter/wox/lib/entity/wox_preview.dart +++ b/Wox.UI.Flutter/wox/lib/entity/wox_preview.dart @@ -19,7 +19,7 @@ class WoxPreview { final Map data = {}; data['PreviewType'] = previewType; data['PreviewData'] = previewData; - data['PreviewProperties'] = const JsonEncoder().convert(previewProperties); + data['PreviewProperties'] = previewProperties; return data; } diff --git a/Wox.UI.Flutter/wox/lib/entity/wox_query.dart b/Wox.UI.Flutter/wox/lib/entity/wox_query.dart index 17ee98cc1..6b7c6c753 100644 --- a/Wox.UI.Flutter/wox/lib/entity/wox_query.dart +++ b/Wox.UI.Flutter/wox/lib/entity/wox_query.dart @@ -223,8 +223,8 @@ class WoxRefreshableResult { resultId = json['ResultId']; title = json['Title']; subTitle = json['SubTitle'] ?? ""; - icon = json['Icon']; - preview = json['Preview']; + icon = WoxImage.fromJson(json['Icon']); + preview = WoxPreview.fromJson(json['Preview']); contextData = json['ContextData']; refreshInterval = json['RefreshInterval']; } 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 e2dcb53c2..cd3fe0cd9 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 @@ -221,6 +221,11 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa void handleWebSocketMessage(event) { var msg = WoxWebsocketMsg.fromJson(jsonDecode(event)); + if (msg.success == false) { + Logger.instance.error("Received error message: ${msg.toJson()}"); + return; + } + Logger.instance.info("Received message: ${msg.toJson()}"); if (msg.method == "ToggleApp") { toggleApp(ShowAppParams.fromJson(msg.data)); @@ -448,6 +453,10 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa queryResults[i].preview = result.preview; queryResults[i].contextData = result.contextData; queryResults[i].refreshInterval = result.refreshInterval; + + currentPreview.value = result.preview; + + queryResults.refresh(); break; } } diff --git a/Wox.UI.Flutter/wox/macos/Podfile.lock b/Wox.UI.Flutter/wox/macos/Podfile.lock index 9fd3eb546..f7efb636a 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.11.3 +COCOAPODS: 1.12.1 diff --git a/Wox/plugin/manager.go b/Wox/plugin/manager.go index 2897c854e..8360660ce 100644 --- a/Wox/plugin/manager.go +++ b/Wox/plugin/manager.go @@ -473,7 +473,7 @@ func (m *Manager) calculateResultScore(ctx context.Context, pluginId, title, sub return score } -func (m *Manager) PolishRefreshableResult(ctx context.Context, pluginInstance *Instance, result RefreshableResult) RefreshableResult { +func (m *Manager) PolishRefreshableResult(ctx context.Context, pluginInstance *Instance, resultId string, result RefreshableResult) RefreshableResult { // convert icon result.Icon = ConvertIcon(ctx, result.Icon, pluginInstance.PluginDirectory) // translate title @@ -487,6 +487,22 @@ func (m *Manager) PolishRefreshableResult(ctx context.Context, pluginInstance *I previewProperties[translatedKey] = value } result.Preview.PreviewProperties = previewProperties + + // store preview for ui invoke later + // because preview may contain some heavy data (E.g. image or large text), we will store preview in cache and only send preview to ui when user select the result + if result.Preview.PreviewType != "" && result.Preview.PreviewType != WoxPreviewTypeRemote { + // update preview in cache + if v, ok := m.resultCache.Load(resultId); ok { + v.Preview = result.Preview + m.resultCache.Store(resultId, v) + } + + result.Preview = WoxPreview{ + PreviewType: WoxPreviewTypeRemote, + PreviewData: fmt.Sprintf("/preview?id=%s", resultId), + } + } + return result } @@ -677,7 +693,7 @@ func (m *Manager) ExecuteRefresh(ctx context.Context, refreshableResultWithId Re } newResult := resultCache.Refresh(refreshableResult) - newResult = m.PolishRefreshableResult(ctx, resultCache.PluginInstance, newResult) + newResult = m.PolishRefreshableResult(ctx, resultCache.PluginInstance, refreshableResultWithId.ResultId, newResult) return RefreshableResultWithResultId{ ResultId: refreshableResultWithId.ResultId, diff --git a/Wox/ui/http.go b/Wox/ui/http.go index 3659a336d..bf56f8833 100644 --- a/Wox/ui/http.go +++ b/Wox/ui/http.go @@ -534,6 +534,7 @@ func serveAndWait(ctx context.Context, port int) { func requestUI(ctx context.Context, request WebsocketMsg) { request.Type = WebsocketMsgTypeRequest + request.Success = true marshalData, marshalErr := json.Marshal(request) if marshalErr != nil { logger.Error(ctx, fmt.Sprintf("failed to marshal websocket request: %s", marshalErr.Error())) diff --git a/Wox/ui/ui_impl.go b/Wox/ui/ui_impl.go index c9c3e9897..2ee140dab 100644 --- a/Wox/ui/ui_impl.go +++ b/Wox/ui/ui_impl.go @@ -247,6 +247,17 @@ func handleRefresh(ctx context.Context, request WebsocketMsg) { return } + // replace remote preview with local preview + if result.Preview.PreviewType == plugin.WoxPreviewTypeRemote { + preview, err := plugin.GetPluginManager().GetResultPreview(util.NewTraceContext(), result.ResultId) + if err != nil { + logger.Error(ctx, err.Error()) + responseUIError(ctx, request, err.Error()) + return + } + result.Preview = preview + } + newResult, refreshErr := plugin.GetPluginManager().ExecuteRefresh(ctx, result) if refreshErr != nil { logger.Error(ctx, refreshErr.Error())