Skip to content

Commit

Permalink
Handle arrow up keys for navigation query history
Browse files Browse the repository at this point in the history
  • Loading branch information
qianlifeng committed Dec 20, 2023
1 parent 4cdf849 commit 91a18e8
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 28 deletions.
8 changes: 4 additions & 4 deletions Wox.UI.Flutter/wox/lib/components/wox_list_item_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ class WoxListItemView extends StatelessWidget {

@override
Widget build(BuildContext context) {
Logger.instance.info("repaint: list item view $key - container");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: list item view $key - container");

return Container(
decoration: BoxDecoration(
Expand All @@ -58,7 +58,7 @@ class WoxListItemView extends StatelessWidget {
Padding(
padding: const EdgeInsets.only(left: 5.0, right: 10.0),
child: Obx(() {
Logger.instance.info("repaint: list item view $key - icon");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: list item view $key - icon");

return WoxImageView(
woxImage: icon.value,
Expand All @@ -69,7 +69,7 @@ class WoxListItemView extends StatelessWidget {
Expanded(
child: Column(crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [
Obx(() {
Logger.instance.info("repaint: list item view $key - title");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: list item view $key - title");

return Text(
title.value,
Expand All @@ -87,7 +87,7 @@ class WoxListItemView extends StatelessWidget {
);
}),
Obx(() {
Logger.instance.info("repaint: list item view $key - subtitle");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: list item view $key - subtitle");

return subTitle.isNotEmpty
? Padding(
Expand Down
2 changes: 1 addition & 1 deletion Wox.UI.Flutter/wox/lib/components/wox_preview_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class WoxPreviewView extends StatelessWidget {

@override
Widget build(BuildContext context) {
Logger.instance.info("repaint: preview view data");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: preview view data");

if (woxPreview.previewType == WoxPreviewTypeEnum.WOX_PREVIEW_TYPE_REMOTE.code) {
return FutureBuilder<WoxPreview>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import 'package:get/get.dart';
import 'package:uuid/v4.dart';
import 'package:window_manager/window_manager.dart';
import 'package:wox/entity/wox_query.dart';
import 'package:wox/enums/wox_direction_enum.dart';
import 'package:wox/enums/wox_event_device_type_enum.dart';
import 'package:wox/enums/wox_query_type_enum.dart';
import 'package:wox/utils/log.dart';

Expand All @@ -17,7 +15,7 @@ class WoxQueryBoxView extends GetView<WoxLauncherController> {

@override
Widget build(BuildContext context) {
Logger.instance.info("repaint: query box view");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: query box view");

return Obx(() {
return Stack(children: [
Expand All @@ -30,10 +28,10 @@ class WoxQueryBoxView extends GetView<WoxLauncherController> {
controller.hideApp();
return KeyEventResult.handled;
case LogicalKeyboardKey.arrowDown:
controller.changeResultScrollPosition(WoxEventDeviceTypeEnum.WOX_EVENT_DEVEICE_TYPE_KEYBOARD.code, WoxDirectionEnum.WOX_DIRECTION_DOWN.code);
controller.handleQueryBoxArrowDown();
return KeyEventResult.handled;
case LogicalKeyboardKey.arrowUp:
controller.changeResultScrollPosition(WoxEventDeviceTypeEnum.WOX_EVENT_DEVEICE_TYPE_KEYBOARD.code, WoxDirectionEnum.WOX_DIRECTION_UP.code);
controller.handleQueryBoxArrowUp();
return KeyEventResult.handled;
case LogicalKeyboardKey.enter:
controller.executeResultAction();
Expand Down Expand Up @@ -94,6 +92,7 @@ class WoxQueryBoxView extends GetView<WoxLauncherController> {
return;
}

controller.canArrowUpHistory = false;
WoxChangeQuery woxChangeQuery = WoxChangeQuery(
queryId: const UuidV4().generate(),
queryType: WoxQueryTypeEnum.WOX_QUERY_TYPE_INPUT.code,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class WoxQueryResultView extends GetView<WoxLauncherController> {
}

Widget getActionPanelView() {
Logger.instance.info("repaint: action panel view container");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: action panel view container");

return Obx(
() => controller.isShowActionPanel.value
Expand Down Expand Up @@ -83,7 +83,7 @@ class WoxQueryResultView extends GetView<WoxLauncherController> {
}

Widget getResultView() {
Logger.instance.info("repaint: result view container");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: result view container");

return Obx(
() => controller.queryResults.isNotEmpty
Expand Down Expand Up @@ -131,7 +131,7 @@ class WoxQueryResultView extends GetView<WoxLauncherController> {
}

Widget getPreviewView() {
Logger.instance.info("repaint: preview view container");
if (LoggerSwitch.enablePaintLog) Logger.instance.info("repaint: preview view container");

return Obx(
() => controller.isShowPreviewPanel.value
Expand Down
100 changes: 85 additions & 15 deletions Wox.UI.Flutter/wox/lib/modules/launcher/wox_launcher_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import 'package:wox/entity/wox_theme.dart';
import 'package:wox/entity/wox_websocket_msg.dart';
import 'package:wox/enums/wox_direction_enum.dart';
import 'package:wox/enums/wox_event_device_type_enum.dart';
import 'package:wox/enums/wox_last_query_mode_enum.dart';
import 'package:wox/enums/wox_msg_method_enum.dart';
import 'package:wox/enums/wox_msg_type_enum.dart';
import 'package:wox/enums/wox_position_type_enum.dart';
Expand Down Expand Up @@ -47,6 +48,10 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
final filterResultActions = <WoxResultAction>[].obs;
var _clearQueryResultsTimer = Timer(const Duration(milliseconds: 200), () => {});
var refreshCounter = 0;
final latestQueryHistories = <QueryHistory>[];
var selectedQueryHistoryIndex = 0;
var lastQueryMode = WoxLastQueryModeEnum.WOX_LAST_QUERY_MODE_PRESERVE.code;
var canArrowUpHistory = true;

@override
Future<void> toggleApp(ShowAppParams params) async {
Expand All @@ -60,6 +65,10 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa

@override
Future<void> showApp(ShowAppParams params) async {
canArrowUpHistory = true;
latestQueryHistories.assignAll(params.queryHistories);
lastQueryMode = params.lastQueryMode;

if (params.selectAll) {
_selectQueryBoxAllText();
}
Expand All @@ -69,12 +78,37 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
await windowManager.show();
await windowManager.focus();
queryBoxFocusNode.requestFocus();

WoxWebsocketMsgUtil.instance.sendMessage(
WoxWebsocketMsg(
id: const UuidV4().generate(),
type: WoxMsgTypeEnum.WOX_MSG_TYPE_REQUEST.code,
method: WoxMsgMethodEnum.WOX_MSG_METHOD_VISIBILITY_CHANGED.code,
data: {"isVisible": "true", "query": _query.value.toJson()},
),
);
}

@override
Future<void> hideApp() async {
isShowActionPanel.value = false;
await windowManager.hide();

if (lastQueryMode == WoxLastQueryModeEnum.WOX_LAST_QUERY_MODE_PRESERVE.code) {
//skip the first one, because it's the current query
selectedQueryHistoryIndex = 0;
} else {
selectedQueryHistoryIndex = -1;
}

WoxWebsocketMsgUtil.instance.sendMessage(
WoxWebsocketMsg(
id: const UuidV4().generate(),
type: WoxMsgTypeEnum.WOX_MSG_TYPE_REQUEST.code,
method: WoxMsgMethodEnum.WOX_MSG_METHOD_VISIBILITY_CHANGED.code,
data: {"isVisible": "false", "query": _query.value.toJson()},
),
);
}

@override
Expand Down Expand Up @@ -137,25 +171,37 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
}

final queryText = queryResults[_activeResultIndex.value].title;
onQueryChanged(WoxChangeQuery(
queryId: const UuidV4().generate(),
queryType: WoxQueryTypeEnum.WOX_QUERY_TYPE_INPUT.code,
queryText: queryText.value,
querySelection: Selection.empty(),
));
onQueryChanged(
WoxChangeQuery(
queryId: const UuidV4().generate(),
queryType: WoxQueryTypeEnum.WOX_QUERY_TYPE_INPUT.code,
queryText: queryText.value,
querySelection: Selection.empty(),
),
moveCursorToEnd: true,
);
}

@override
void onQueryChanged(WoxChangeQuery query) {
void onQueryChanged(WoxChangeQuery query, {bool moveCursorToEnd = false}) {
if (query.queryId == "") {
query.queryId = const UuidV4().generate();
}

_query.value = query;
isShowActionPanel.value = false;

if (query.queryType == WoxQueryTypeEnum.WOX_QUERY_TYPE_INPUT.code) {
// save the cursor position
final cursorPosition = queryBoxTextFieldController.selection.baseOffset;
queryBoxTextFieldController.text = query.queryText;
// try to restore the cursor position after set text, which will reset the cursor position
queryBoxTextFieldController.selection = TextSelection(baseOffset: cursorPosition, extentOffset: cursorPosition);

if (moveCursorToEnd) {
moveQueryBoxCursorToEnd();
} else {
// try to restore the cursor position after set text, which will reset the cursor position
queryBoxTextFieldController.selection = TextSelection(baseOffset: cursorPosition, extentOffset: cursorPosition);
}
} else {
queryBoxTextFieldController.text = query.toString();
}
Expand Down Expand Up @@ -234,22 +280,25 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
return;
}

Logger.instance.info("Received message: ${msg.method}");
if (msg.method != "Query") {
Logger.instance.info("Received message: ${msg.method}");
}

if (msg.method == "ToggleApp") {
toggleApp(ShowAppParams.fromJson(msg.data));
} else if (msg.method == "HideApp") {
hideApp();
} else if (msg.method == "ShowApp") {
showApp(ShowAppParams.fromJson(msg.data));
} else if (msg.method == "ChangeQuery") {
var changedQuery = WoxChangeQuery.fromJson(msg.data);
changedQuery.queryId = const UuidV4().generate();
onQueryChanged(changedQuery);
onQueryChanged(WoxChangeQuery.fromJson(msg.data), moveCursorToEnd: true);
} else if (msg.method == "Query") {
var results = <WoxQueryResult>[];
for (var item in msg.data) {
results.add(WoxQueryResult.fromJson(item));
}
Logger.instance.info("Received message: ${msg.method}, results count: ${results.length}");

_onReceivedQueryResults(results);
} else if (msg.method == "ChangeTheme") {
final theme = WoxTheme.fromJson(msg.data);
Expand Down Expand Up @@ -354,10 +403,10 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
// 3.0-> 3

final totalHeightFinal = totalHeight.toDouble() + (10 / PlatformDispatcher.instance.views.first.devicePixelRatio).ceil();
Logger.instance.info("Resize window height to $totalHeightFinal");
if (LoggerSwitch.enableSizeAndPositionLog) Logger.instance.info("Resize window height to $totalHeightFinal");
windowManager.setSize(Size(800, totalHeightFinal));
} else {
Logger.instance.info("Resize window height to $totalHeight");
if (LoggerSwitch.enableSizeAndPositionLog) Logger.instance.info("Resize window height to $totalHeight");
windowManager.setSize(Size(800, totalHeight.toDouble()));
}
}
Expand Down Expand Up @@ -487,4 +536,25 @@ class WoxLauncherController extends GetxController implements WoxLauncherInterfa
queryBoxTextFieldController.selection = TextSelection.collapsed(offset: queryBoxTextFieldController.text.length);
queryBoxScrollController.jumpTo(queryBoxScrollController.position.maxScrollExtent);
}

void handleQueryBoxArrowUp() {
if (canArrowUpHistory) {
if (selectedQueryHistoryIndex < latestQueryHistories.length - 1) {
selectedQueryHistoryIndex = selectedQueryHistoryIndex + 1;
var changedQuery = latestQueryHistories[selectedQueryHistoryIndex].query;
if (changedQuery != null) {
onQueryChanged(changedQuery);
_selectQueryBoxAllText();
}
}
return;
}

changeResultScrollPosition(WoxEventDeviceTypeEnum.WOX_EVENT_DEVEICE_TYPE_KEYBOARD.code, WoxDirectionEnum.WOX_DIRECTION_UP.code);
}

void handleQueryBoxArrowDown() {
canArrowUpHistory = false;
changeResultScrollPosition(WoxEventDeviceTypeEnum.WOX_EVENT_DEVEICE_TYPE_KEYBOARD.code, WoxDirectionEnum.WOX_DIRECTION_DOWN.code);
}
}
5 changes: 5 additions & 0 deletions Wox.UI.Flutter/wox/lib/utils/log.dart
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,11 @@ class Logger {
}
}

class LoggerSwitch {
static bool enablePaintLog = false;
static bool enableSizeAndPositionLog = false;
}

class WoxFileOutput extends xlogger.LogOutput {
late IOSink sink;

Expand Down

0 comments on commit 91a18e8

Please sign in to comment.