Source code for eye.widgets.minibuffer

# this project is licensed under the WTFPLv2, see COPYING.txt for details

from enum import IntFlag

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QKeySequence
from PyQt5.QtWidgets import QLineEdit, QShortcut

from eye.app import qApp
from eye.connector import category_objects
from eye.qt import Signal, Slot
from eye.widgets.helpers import WidgetMixin

__all__ = ('Minibuffer', 'open_mini_buffer', 'get_mini_buffer')


class CloseFlag(IntFlag):
	ON_ENTER = 1
	ON_ESCAPE = 2
	ON_FOCUS_OUT = 4
	ALL = ON_ENTER | ON_ESCAPE | ON_FOCUS_OUT


[docs] class Minibuffer(QLineEdit, WidgetMixin): def __init__(self, parent=None): super().__init__(parent=parent) self.status_bar = None self.close_flags = 0 sh = QShortcut(QKeySequence(Qt.Key_Escape), self) sh.activated.connect(self.on_escape) self.returnPressed.connect(self.on_return_pressed) self.add_category('minibuffer') def __del__(self): self.cancelled.emit()
[docs] def add_to_window(self, window): if self.status_bar: self.remove() self.status_bar = window.statusBar() self.status_bar.insertWidget(0, self)
[docs] def remove(self): # warning: this triggers the focus-out if self.status_bar: self.status_bar.removeWidget(self) self.status_bar = None
[docs] def set_close_flags(self, f): self.close_flags = f
text_entered = Signal(str) cancelled = Signal()
[docs] @Slot() def cancel(self): self.cancelled.emit() self.remove()
[docs] @Slot() def on_return_pressed(self): self.text_entered.emit(self.text()) if self.close_flags & CloseFlag.ON_ENTER: self.remove()
[docs] @Slot() def on_escape(self): if self.close_flags & CloseFlag.ON_ESCAPE: self.cancel()
[docs] def focusOutEvent(self, ev): QLineEdit.focusOutEvent(self, ev) if self.close_flags & CloseFlag.ON_FOCUS_OUT: self.cancel()
def _make_mini_buffer(text='', placeholder='', window=None, category=None, close_flags=CloseFlag.ALL): if window is None: window = qApp().last_window m = Minibuffer() m.set_close_flags(close_flags) m.setPlaceholderText(placeholder) m.setText(text) m.add_to_window(window) m.give_focus() if category: m.add_category(category) return m
[docs] def open_mini_buffer(text='', placeholder='', window=None, category=None, close_flags=CloseFlag.ALL): old = get_mini_buffer(window) if old: old.cancel() old = None return _make_mini_buffer(text, placeholder, window, category, close_flags)
[docs] def get_mini_buffer(window=None, category=None): if window is None: window = qApp().last_window for mb in category_objects('minibuffer'): if mb.window() == window: if category and category not in mb.categories(): return None return mb
# TODO: only one minibuffer at a time # create another minibuffer if different category (because different use) # possible reuse if same category?