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.

70 lines
1.8 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",
  27. max_height=10
  28. )
  29. self.keepers.entry_widget.register_oppisite(
  30. self.to_remove.entry_widget)
  31. def on_cancel(self):
  32. self.canceled = True
  33. def on_ok(self):
  34. self.canceled = False
  35. def afterEditing(self):
  36. self.parentApp.setNextForm(None)
  37. class RemoveWordsActivity(npyscreen.NPSAppManaged):
  38. def __init__(self, starting_values, *args, **kwargs):
  39. super().__init__(*args, **kwargs)
  40. self.starting_values = starting_values
  41. def onStart(self):
  42. self.addForm('MAIN', AddRemoveForm, name="Exclude Words")
  43. def get_results(self):
  44. form = self.getForm('MAIN')
  45. vals = form.to_remove.entry_widget.values
  46. canceled = form.canceled
  47. return canceled, vals
  48. if __name__ == "__main__":
  49. values = list(range(1, 10+1))
  50. app = RemoveWordsActivity(values)
  51. app.run()