Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'helix-view/src/register_selection.rs')
-rw-r--r--helix-view/src/register_selection.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/helix-view/src/register_selection.rs b/helix-view/src/register_selection.rs
new file mode 100644
index 00000000..d7f073b6
--- /dev/null
+++ b/helix-view/src/register_selection.rs
@@ -0,0 +1,47 @@
+/// Register selection and configuration
+///
+/// This is a kind a of specialized `Option<char>` for register selection.
+/// Point is to keep whether the register selection has been explicitely
+/// set or not while being convenient by knowing the default register name.
+pub struct RegisterSelection {
+ selected: char,
+ default_name: char,
+}
+
+impl RegisterSelection {
+ pub fn new(default_name: char) -> Self {
+ Self {
+ selected: default_name,
+ default_name,
+ }
+ }
+
+ pub fn select(&mut self, name: char) {
+ self.selected = name;
+ }
+
+ pub fn take(&mut self) -> Self {
+ Self {
+ selected: std::mem::replace(&mut self.selected, self.default_name),
+ default_name: self.default_name,
+ }
+ }
+
+ pub fn is_default(&self) -> bool {
+ self.selected == self.default_name
+ }
+
+ pub fn name(&self) -> char {
+ self.selected
+ }
+}
+
+impl Default for RegisterSelection {
+ fn default() -> Self {
+ let default_name = '"';
+ Self {
+ selected: default_name,
+ default_name,
+ }
+ }
+}