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

  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,
  27. values=sorted(self.parentApp.starting_excludes),
  28. name="Words to remove",
  29. max_height=10,
  30. )
  31. self.keepers.entry_widget.register_oppisite(self.to_remove.entry_widget)
  32. def on_cancel(self):
  33. self.canceled = True
  34. def on_ok(self):
  35. self.canceled = False
  36. def afterEditing(self):
  37. self.parentApp.setNextForm(None)
  38. class RemoveWordsActivity(npyscreen.NPSAppManaged):
  39. def __init__(self, words, excludes, *args, **kwargs):
  40. super().__init__(*args, **kwargs)
  41. self.starting_values = words
  42. self.starting_excludes = excludes
  43. def onStart(self):
  44. self.addForm(
  45. "MAIN",
  46. AddRemoveForm,
  47. name="Exclude Words",
  48. minimum_lines=0,
  49. minimum_columns=0,
  50. )
  51. def get_results(self):
  52. form = self.getForm("MAIN")
  53. vals = form.to_remove.entry_widget.values
  54. canceled = form.canceled
  55. return canceled, vals
  56. if __name__ == "__main__":
  57. values = ["hello", "return", "butt", "fuck", "abcdefghijklmnopqrstuvwxyz"]
  58. app = RemoveWordsActivity(values)
  59. app.run()