3
3
QLineEdit , QPushButton , QCheckBox , QLabel
4
4
)
5
5
from qtpy .QtCore import Qt , Signal
6
+ from qtpy .QtGui import QKeyEvent
6
7
from .. import settings
7
8
8
-
9
+
9
10
class SearchReplaceFrame (QFrame ):
10
11
"""
11
12
A small widget containing 'Find' and optionally 'Replace' fields,
@@ -16,10 +17,10 @@ class SearchReplaceFrame(QFrame):
16
17
findPrevRequested = Signal ()
17
18
replaceOneRequested = Signal ()
18
19
replaceAllRequested = Signal ()
19
-
20
+
20
21
def __init__ (self , parent = None ):
21
22
super ().__init__ (parent )
22
-
23
+
23
24
self .setFrameShape (QFrame .StyledPanel )
24
25
self .setFrameShadow (QFrame .Raised )
25
26
editor = parent
@@ -51,14 +52,14 @@ def __init__(self, parent=None):
51
52
}}
52
53
''' )
53
54
self .setWindowFlags (Qt .SubWindow | Qt .FramelessWindowHint )
54
-
55
+
55
56
# Layout
56
57
layout = QVBoxLayout (self )
57
58
layout .setContentsMargins (5 , 5 , 5 , 5 )
58
-
59
+
59
60
# Find row
60
61
findRow = QHBoxLayout ()
61
-
62
+
62
63
self .findLabel = QLabel ("Find:" , self )
63
64
self .matchCountLabel = QLabel ("0 of 0" , self )
64
65
self .findEdit = QLineEdit (self )
@@ -68,10 +69,10 @@ def __init__(self, parent=None):
68
69
self .regexBox .setToolTip ("Use Regular Expressions" )
69
70
self .wholeWordBox = QCheckBox ("\\ b" , self )
70
71
self .wholeWordBox .setToolTip ("Match Whole Word" )
71
-
72
+
72
73
self .findNextBtn = QPushButton ("Next" , self )
73
74
self .findPrevBtn = QPushButton ("Prev" , self )
74
-
75
+
75
76
findRow .addWidget (self .findLabel )
76
77
findRow .addWidget (self .findEdit )
77
78
findRow .addWidget (self .matchCountLabel )
@@ -80,34 +81,56 @@ def __init__(self, parent=None):
80
81
findRow .addWidget (self .wholeWordBox )
81
82
findRow .addWidget (self .findNextBtn )
82
83
findRow .addWidget (self .findPrevBtn )
83
-
84
+
84
85
layout .addLayout (findRow )
85
-
86
+
86
87
# Replace row
87
88
replaceRow = QHBoxLayout ()
88
89
self .replaceLabel = QLabel ("Replace:" , self )
89
90
self .replaceEdit = QLineEdit (self )
90
91
self .replaceBtn = QPushButton ("Replace" , self )
91
92
self .replaceAllBtn = QPushButton ("Replace All" , self )
92
-
93
+
93
94
replaceRow .addWidget (self .replaceLabel )
94
95
replaceRow .addWidget (self .replaceEdit )
95
96
replaceRow .addWidget (self .replaceBtn )
96
97
replaceRow .addWidget (self .replaceAllBtn )
97
-
98
+
98
99
layout .addLayout (replaceRow )
99
-
100
+
100
101
self .replaceRowWidget = replaceRow # Keep reference to manage visibility
101
-
102
+
102
103
# Connections
103
104
self .findNextBtn .clicked .connect (self .findNextRequested )
104
105
self .findPrevBtn .clicked .connect (self .findPrevRequested )
105
106
self .replaceBtn .clicked .connect (self .replaceOneRequested )
106
107
self .replaceAllBtn .clicked .connect (self .replaceAllRequested )
107
-
108
+
109
+ # Install event filter to handle Shift+Enter
110
+ self .findEdit .installEventFilter (self )
111
+ self .replaceEdit .installEventFilter (self )
112
+
108
113
# Default: searching only, so hide the "replace" row
109
114
self .showSearchOnly ()
110
-
115
+
116
+ def eventFilter (self , obj , event ):
117
+ """Handle key events for find and replace fields"""
118
+ if event .type () == QKeyEvent .KeyPress :
119
+ if event .key () == Qt .Key_Return or event .key () == Qt .Key_Enter :
120
+ if event .modifiers () & Qt .ShiftModifier :
121
+ # Shift+Enter triggers find previous
122
+ self .findPrevRequested .emit ()
123
+ return True
124
+ elif obj == self .findEdit :
125
+ # Enter in find field triggers find next
126
+ self .findNextRequested .emit ()
127
+ return True
128
+ elif obj == self .replaceEdit :
129
+ # Enter in replace field triggers replace
130
+ self .replaceOneRequested .emit ()
131
+ return True
132
+ return super ().eventFilter (obj , event )
133
+
111
134
def showSearchOnly (self ):
112
135
# Hide replace UI
113
136
self .replaceLabel .setVisible (False )
@@ -116,13 +139,12 @@ def showSearchOnly(self):
116
139
self .replaceAllBtn .setVisible (False )
117
140
self .adjustSize ()
118
141
self .resize (self .sizeHint ())
119
-
142
+
120
143
def showSearchReplace (self ):
121
144
# Show replace UI
122
145
self .replaceLabel .setVisible (True )
123
146
self .replaceEdit .setVisible (True )
124
147
self .replaceBtn .setVisible (True )
125
148
self .replaceAllBtn .setVisible (True )
126
149
self .adjustSize ()
127
- self .resize (self .sizeHint ())
128
-
150
+ self .resize (self .sizeHint ())
0 commit comments