@@ -113,17 +113,20 @@ class Gui(tk.Frame):
113
113
def __init__ (self , master = None , * args , ** kwargs ):
114
114
super ().__init__ (master , * args , ** kwargs )
115
115
self .icon = load_icon ()
116
+ self .multi_select = tk .BooleanVar ()
116
117
self .build_menu ()
117
118
self .build_interface ()
118
119
self .id_tracker = dict ()
120
+ self .transforms_tracker = set ()
119
121
120
122
def build_menu (self ):
121
123
"""Initializes and builds program menu bar"""
122
124
self .top = tk .Menu (self )
123
125
124
126
# create run menu
125
127
self .run = tk .Menu (self .top , tearoff = False )
126
- self .run .add_command (label = 'Search' , accelerator = 'Ctrl+S' ,
128
+ self .run .add_checkbutton (label = "Multi-select" , onvalue = True , offvalue = False , variable = self .multi_select , command = self .config_menu )
129
+ self .run .add_command (label = 'Run transform' , accelerator = 'Ctrl+R' ,
127
130
command = self .run_data_mining , compound = tk .LEFT , underline = 0 )
128
131
self .run .add_separator ()
129
132
self .run .add_command (label = 'Exit' , command = self .quit_program ,
@@ -142,7 +145,7 @@ def build_menu(self):
142
145
compound = tk .LEFT , underline = 0 )
143
146
self .top .add_cascade (label = '?' , menu = self .info , underline = 0 )
144
147
145
- self .run .entryconfig ("Search " , state = "disabled" )
148
+ self .run .entryconfig ("Run transform " , state = "disabled" )
146
149
147
150
def build_interface (self ):
148
151
"""Builds the gui interface"""
@@ -161,7 +164,13 @@ def build_interface(self):
161
164
# create data mining action selection drop down
162
165
self .selector = ttk .Combobox (labelframe_1 , values = ["" ], state = "readonly" )
163
166
self .selector .pack (expand = True , fill = 'x' , side = "top" , padx = 2 , pady = 2 )
164
-
167
+
168
+ #self.checkBox1 = tk.Checkbutton(labelframe_1, variable=None, onvalue=1, offvalue=0, text="Multi-select")
169
+ #self.checkBox1.pack(expand=False, side="left", padx=2, pady=2, anchor="w")
170
+
171
+ #self.entry2 = tk.Entry(labelframe_1)
172
+ #self.entry2.pack(expand=True, fill='x', side="left", padx=2, pady=2, anchor="w")
173
+
165
174
# create results frame
166
175
frame_2 = tk .Frame ()
167
176
frame_2 .pack (expand = True , fill = 'both' , anchor = "n" )
@@ -191,13 +200,25 @@ def build_interface(self):
191
200
192
201
# gui bindings
193
202
self .entry .bind ('<Return>' , self .validate_input )
203
+ self .entry .bind ('<FocusOut>' , self .validate_input )
194
204
self .selector .bind ("<<ComboboxSelected>>" , self .run_data_mining )
195
205
self .selector .bind ("<Return>" , self .run_data_mining )
206
+ self .selector .bind ("<ButtonRelease-1>" , self .config_menu )
196
207
self .treeview .bind ('<ButtonRelease-1>' , self .selectItem )
208
+ self .bind_all ('<Control-r>' , self .run_data_mining )
197
209
198
210
# focus on entry widget
199
211
self .entry .focus ()
200
212
213
+ def config_menu (self , event = None ):
214
+ """Ensures search menu option is properly enabled and disabled"""
215
+ if self .multi_select .get ():
216
+ self .run .entryconfig ("Run transform" , state = "disabled" )
217
+ elif self .selector .get () == "" :
218
+ self .run .entryconfig ("Run transform" , state = "disabled" )
219
+ else :
220
+ self .run .entryconfig ("Run transform" , state = "active" )
221
+
201
222
def validate_input (self , event = None ):
202
223
"""Validates and sanitizes user input"""
203
224
self .validator = InputValidator ()
@@ -209,36 +230,46 @@ def validate_input(self, event=None):
209
230
self .selector ['values' ] = validated_input [2 ]
210
231
self .selector .current (0 )
211
232
self .selector .focus ()
212
- self .run . entryconfig ( "Search" , state = "active" )
233
+ self .config_menu ( )
213
234
else :
214
235
self .selector ["values" ] = ["" ]
215
236
self .selector .set ("" )
216
- self .run .entryconfig ("Search " , state = "disabled" )
237
+ self .run .entryconfig ("Run transform " , state = "disabled" )
217
238
self .status ['text' ] = "input: invalid"
218
239
elif not _input :
219
240
self .status ['text' ] = "ready"
220
241
self .selector ["values" ] = ["" ]
221
- self .run .entryconfig ("Search " , state = "disabled" )
242
+ self .run .entryconfig ("Run transform " , state = "disabled" )
222
243
self .selector .current (0 )
223
244
224
245
def run_data_mining (self , event = None ):
225
246
"""Performs the select OSINT data mining operation"""
226
- self .status ['text' ] = "running..."
227
- _input = self .entry .get ().split ("," )
228
- transform = self .selector .get ()
229
- try :
230
- for i in _input :
231
- data = self .validator .execute_transform (i , transform )
232
- for item in data :
233
- self .treeview .insert (self .getID (i ), "end" , values = (transform , item ))
234
- # todo: focus on last treeview output to be able to hit enter and iterate
235
- # item = self.treeview.insert('', 'end', text=_input, values=(transform, data))
236
- # self.treeview.focus_set()
237
- # self.treeview.selection_set(item)
238
- self .entry .focus ()
239
- self .status ['text' ] = "ready"
240
- except Exception as e :
241
- messagebox .showerror ("Error" , "Error message:" + str (e ))
247
+ if self .multi_select .get ():
248
+ self .transforms_tracker .add (self .selector .get ())
249
+ self .status ['text' ] = "multi-select: [{}]" .format (" - " .join ([transform for transform in self .transforms_tracker ]))
250
+ else :
251
+ self .status ['text' ] = "running..."
252
+ _input = self .entry .get ().split ("," )
253
+ if _input [0 ]:
254
+ transform = self .selector .get ()
255
+ self .transforms_tracker .add (transform )
256
+ try :
257
+ for i in _input :
258
+ for transform in self .transforms_tracker :
259
+ data = self .validator .execute_transform (i , transform )
260
+ for item in data :
261
+ self .treeview .insert (self .getID (i ), "end" , values = (transform , item ))
262
+ # todo: focus on last treeview output to be able to hit enter and iterate
263
+ # item = self.treeview.insert('', 'end', text=_input, values=(transform, data))
264
+ # self.treeview.focus_set()
265
+ # self.treeview.selection_set(item)
266
+ self .entry .focus ()
267
+ self .status ['text' ] = "ready"
268
+ self .transforms_tracker .clear ()
269
+ except Exception as e :
270
+ messagebox .showerror ("Error" , "Error message:" + str (e ))
271
+ else :
272
+ self .status ['text' ] = "no inputs"
242
273
243
274
def getID (self , item ):
244
275
"""Grabs the ID of the queried treeview item"""
0 commit comments