Skip to content

Commit

Permalink
Implement refresh result [WIP]
Browse files Browse the repository at this point in the history
  • Loading branch information
qianlifeng committed Dec 11, 2023
1 parent 09a329b commit 12266ba
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 15 deletions.
35 changes: 35 additions & 0 deletions Wox.UI.Flutter/wox/lib/entity/wox_query.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, dynamic> json) {
resultId = json['ResultId'];
title = json['Title'];
subTitle = json['SubTitle'] ?? "";
icon = json['Icon'];
preview = json['Preview'];
contextData = json['ContextData'];
refreshInterval = json['RefreshInterval'];
}

Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
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;
}
}
2 changes: 1 addition & 1 deletion Wox.UI.Flutter/wox/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ Future<void> initialServices(List<String> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
final _resultActions = <WoxResultAction>[].obs;
final filterResultActions = <WoxResultAction>[].obs;
var _clearQueryResultsTimer = Timer(const Duration(milliseconds: 200), () => {});
var refreshCounter = 0;

@override
Future<void> toggleApp(ShowAppParams params) async {
Expand Down Expand Up @@ -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);
}
}

Expand Down Expand Up @@ -408,6 +412,47 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
return _activeActionIndex.value == index;
}

startRefreshSchedule() {
Timer.periodic(const Duration(milliseconds: 100), (timer) {
refreshResults();
});
}

Future<void> 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();
Expand Down
2 changes: 1 addition & 1 deletion Wox.UI.Flutter/wox/macos/Podfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,4 @@ SPEC CHECKSUMS:

PODFILE CHECKSUM: 16208599a12443d53889ba2270a4985981cfb204

COCOAPODS: 1.12.1
COCOAPODS: 1.11.3
25 changes: 20 additions & 5 deletions Wox/plugin/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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) {
Expand Down
10 changes: 10 additions & 0 deletions Wox/plugin/refresh.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
10 changes: 2 additions & 8 deletions Wox/ui/ui_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -238,22 +238,16 @@ 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())
responseUIError(ctx, request, unmarshalErr.Error())
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())
Expand Down

0 comments on commit 12266ba

Please sign in to comment.