Add (quoted) reply button to change messages

Change-Id: I900b719b508bbbf18277ae6156b856a547f73f31
This commit is contained in:
James E. Blair 2016-05-03 11:37:13 -07:00
parent e5f37b6796
commit 6641793ff3
1 changed files with 58 additions and 7 deletions

View File

@ -15,6 +15,7 @@
import datetime
import logging
import textwrap
from six.moves.urllib import parse as urlparse
import urwid
@ -89,7 +90,7 @@ class CherryPickDialog(urwid.WidgetWrap, mywid.LineBoxTitlePropertyMixin):
class ReviewDialog(urwid.WidgetWrap, mywid.LineBoxTitlePropertyMixin):
signals = ['submit', 'save', 'cancel']
def __init__(self, app, revision_key):
def __init__(self, app, revision_key, message=''):
self.revision_key = revision_key
self.app = app
save_button = mywid.FixedButton(u'Save')
@ -107,7 +108,6 @@ class ReviewDialog(urwid.WidgetWrap, mywid.LineBoxTitlePropertyMixin):
values = {}
descriptions = {}
self.button_groups = {}
message = ''
with self.app.db.getSession() as session:
revision = session.getRevision(self.revision_key)
change = revision.change
@ -206,9 +206,10 @@ class ReviewButton(mywid.FixedButton):
urwid.connect_signal(self, 'click',
lambda button: self.openReview())
def openReview(self):
def openReview(self, message=''):
self.dialog = ReviewDialog(self.change_view.app,
self.revision_row.revision_key)
self.revision_row.revision_key,
message=message)
urwid.connect_signal(self.dialog, 'save',
lambda button: self.closeReview(True, False))
urwid.connect_signal(self.dialog, 'submit',
@ -341,13 +342,54 @@ class ChangeButton(urwid.Button):
self.change_view.app.error(e.message)
class ChangeMessageBox(mywid.HyperText):
def __init__(self, app, message):
def __init__(self, change_view, message):
super(ChangeMessageBox, self).__init__(u'')
self.app = app
self.change_view = change_view
self.app = change_view.app
self.refresh(message)
def formatReply(self):
text = self.message_text
pgraphs = []
pgraph_accumulator = []
wrap = True
for line in text.split('\n')[2:]:
if line.startswith('> '):
wrap = False
line = '> ' + line
if not line:
if pgraph_accumulator:
pgraphs.append((wrap, '\n'.join(pgraph_accumulator)))
pgraph_accumulator = []
wrap = True
continue
pgraph_accumulator.append(line)
if pgraph_accumulator:
pgraphs.append((wrap, '\n'.join(pgraph_accumulator)))
pgraph_accumulator = []
wrap = True
wrapper = textwrap.TextWrapper(initial_indent='> ',
subsequent_indent='> ')
wrapped_pgraphs = []
for wrap, pgraph in pgraphs:
if wrap:
wrapped_pgraphs.append('\n'.join(wrapper.wrap(pgraph)))
else:
wrapped_pgraphs.append(pgraph)
return '\n>\n'.join(wrapped_pgraphs)
def reply(self):
reply_text = self.formatReply()
if reply_text:
reply_text = self.message_author + ' wrote:\n\n' + reply_text + '\n'
row = self.change_view.revision_rows[self.revision_key]
row.review_button.openReview(reply_text)
def refresh(self, message):
self.revision_key = message.revision.key
self.message_created = message.created
self.message_author = message.author_name
self.message_text = message.message
created = self.app.time(message.created)
lines = message.message.split('\n')
if message.draft:
@ -365,6 +407,15 @@ class ChangeMessageBox(mywid.HyperText):
created.strftime(' (%Y-%m-%d %H:%M:%S%z)'))]
if message.draft and not message.pending:
text.append(('change-message-draft', ' (draft)'))
else:
link = mywid.Link('< Reply >',
'revision-button',
'focused-revision-button')
urwid.connect_signal(link, 'selected',
lambda link:self.reply())
text.append(' ')
text.append(link)
if lines and lines[-1]:
lines.append('')
comment_text = ['\n'.join(lines)]
@ -692,7 +743,7 @@ class ChangeView(urwid.WidgetWrap):
for message in display_messages:
row = self.message_rows.get(message.key)
if not row:
box = ChangeMessageBox(self.app, message)
box = ChangeMessageBox(self, message)
row = urwid.Padding(box, width=80)
self.listbox.body.insert(listbox_index, row)
self.message_rows[message.key] = row