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.

73 lines
1.9 KiB

  1. import npyscreen
  2. import bisect
  3. class RemovableMulti(npyscreen.MultiLineAction):
  4. def actionHighlighted(self, act_on_this, keypress):
  5. self.remove_item()
  6. def register_oppisite(self, opposite):
  7. self.opposite = opposite
  8. opposite.opposite = self
  9. def remove_item(self):
  10. selected_value = self.values[self.cursor_line]
  11. del self.values[self.cursor_line]
  12. bisect.insort(self.opposite.values, selected_value)
  13. self.opposite.display()
  14. self.display()
  15. class BoxedRemovableMulti(npyscreen.BoxTitle):
  16. _contained_widget = RemovableMulti
  17. class AddRemoveForm(npyscreen.ActionFormV2):
  18. def create(self):
  19. self.keepers = self.add(
  20. BoxedRemovableMulti,
  21. values=sorted(self.parentApp.starting_values),
  22. name="Words to keep",
  23. max_height=10,
  24. )
  25. self.to_remove = self.add(
  26. BoxedRemovableMulti, values=[], name="Words to remove", max_height=10
  27. )
  28. self.keepers.entry_widget.register_oppisite(self.to_remove.entry_widget)
  29. def on_cancel(self):
  30. self.canceled = True
  31. def on_ok(self):
  32. self.canceled = False
  33. def afterEditing(self):
  34. self.parentApp.setNextForm(None)
  35. class RemoveWordsActivity(npyscreen.NPSAppManaged):
  36. def __init__(self, starting_values, *args, **kwargs):
  37. super().__init__(*args, **kwargs)
  38. self.starting_values = starting_values
  39. def onStart(self):
  40. self.addForm(
  41. "MAIN",
  42. AddRemoveForm,
  43. name="Exclude Words",
  44. minimum_lines=0,
  45. minimum_columns=0,
  46. )
  47. def get_results(self):
  48. form = self.getForm("MAIN")
  49. vals = form.to_remove.entry_widget.values
  50. canceled = form.canceled
  51. return canceled, vals
  52. if __name__ == "__main__":
  53. values = ["hello", "return", "butt", "fuck", "abcdefghijklmnopqrstuvwxyz"]
  54. app = RemoveWordsActivity(values)
  55. app.run()