Skip to content

Use singleton object for Float x/ycursor #183

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 26 additions & 4 deletions prompt_toolkit/layout/containers.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
'Window',
'WindowRenderInfo',
'ConditionalContainer',
'ScrollOffsets'
'ScrollOffsets',
'cursor',
)

Transparent = Token.Transparent
Expand Down Expand Up @@ -284,6 +285,8 @@ def write_to_screen(self, cli, screen, mouse_handlers, write_position):
y=cursor_position.y - write_position.ypos)

for fl in self.floats:
#if isinstance(fl.left, Cursor):
# fl.left = fl.left.delta+cursor_position.x
# Left & width given.
if fl.left is not None and fl.width is not None:
xpos = fl.left
Expand All @@ -296,13 +299,17 @@ def write_to_screen(self, cli, screen, mouse_handlers, write_position):
elif fl.width is not None and fl.right is not None:
xpos = write_position.width - fl.right - fl.width
width = fl.width
elif fl.xcursor:
elif fl.xcursor or isinstance(fl.left, Cursor):
width = fl.width
if width is None:
width = fl.content.preferred_width(cli, write_position.width).preferred
width = min(write_position.width, width)
xpos = 0
if isinstance(fl.left, Cursor):
xpos += fl.left.delta + cursor_position.x
else:
xpos = cursor_position.x

xpos = cursor_position.x
if xpos + width > write_position.width:
xpos = max(0, write_position.width - width)
# Only width given -> center horizontally.
Expand Down Expand Up @@ -336,8 +343,10 @@ def write_to_screen(self, cli, screen, mouse_handlers, write_position):
ypos = write_position.height - fl.height - fl.bottom
height = fl.height
# Near cursor
elif fl.ycursor:
elif fl.ycursor or isinstance(fl.top, Cursor):
ypos = cursor_position.y + 1
if isinstance(fl.top, Cursor):
ypos += fl.top.delta

height = fl.height
if height is None:
Expand Down Expand Up @@ -391,6 +400,19 @@ def walk(self):
for i in f.content.walk():
yield i

class Cursor(object):

def __init__(self, delta=0):
self.delta = delta

def __add__(self, other):
return Cursor(self.delta+other)

def __sub__(self, other):
return Cursor(self.delta-other)

cursor = Cursor()


class Float(object):
def __init__(self, top=None, right=None, bottom=None, left=None,
Expand Down
6 changes: 3 additions & 3 deletions prompt_toolkit/shortcuts.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@
from .interface import CommandLineInterface, Application, AbortAction, AcceptAction
from .key_binding.manager import KeyBindingManager
from .layout import Window, HSplit, VSplit, FloatContainer, Float
from .layout.containers import ConditionalContainer
from .layout.containers import ConditionalContainer, cursor
from .layout.controls import BufferControl, TokenListControl
from .layout.dimension import LayoutDimension
from .layout.lexers import PygmentsLexer
Expand Down Expand Up @@ -274,8 +274,8 @@ def get_height(cli):
scroll_offset=1,
extra_filter=HasFocus(DEFAULT_BUFFER) &
~display_completions_in_columns)),
Float(xcursor=True,
ycursor=True,
Float(left=cursor,
top=cursor,
content=MultiColumnCompletionsMenu(
extra_filter=HasFocus(DEFAULT_BUFFER) &
display_completions_in_columns,
Expand Down