You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

77 lines
2.0 KiB

import npyscreen
import bisect
class RemovableMulti(npyscreen.MultiLineAction):
def actionHighlighted(self, act_on_this, keypress):
self.remove_item()
def register_oppisite(self, opposite):
self.opposite = opposite
opposite.opposite = self
def remove_item(self):
selected_value = self.values[self.cursor_line]
del self.values[self.cursor_line]
bisect.insort(self.opposite.values, selected_value)
self.opposite.display()
self.display()
class BoxedRemovableMulti(npyscreen.BoxTitle):
_contained_widget = RemovableMulti
class AddRemoveForm(npyscreen.ActionFormV2):
def create(self):
self.keepers = self.add(
BoxedRemovableMulti,
values=sorted(self.parentApp.starting_values),
name="Words to keep",
max_height=10,
)
self.to_remove = self.add(
BoxedRemovableMulti,
values=sorted(self.parentApp.starting_excludes),
name="Words to remove",
max_height=10,
)
self.keepers.entry_widget.register_oppisite(self.to_remove.entry_widget)
def on_cancel(self):
self.canceled = True
def on_ok(self):
self.canceled = False
def afterEditing(self):
self.parentApp.setNextForm(None)
class RemoveWordsActivity(npyscreen.NPSAppManaged):
def __init__(self, words, excludes, *args, **kwargs):
super().__init__(*args, **kwargs)
self.starting_values = words
self.starting_excludes = excludes
def onStart(self):
self.addForm(
"MAIN",
AddRemoveForm,
name="Exclude Words",
minimum_lines=0,
minimum_columns=0,
)
def get_results(self):
form = self.getForm("MAIN")
vals = form.to_remove.entry_widget.values
canceled = form.canceled
return canceled, vals
if __name__ == "__main__":
values = ["hello", "return", "butt", "fuck", "abcdefghijklmnopqrstuvwxyz"]
app = RemoveWordsActivity(values)
app.run()