From c107e0b70b1b773b76ce5403f9da733bdef63176 Mon Sep 17 00:00:00 2001 From: David Aguilar Date: Sun, 6 Oct 2013 21:14:40 -0700 Subject: [PATCH] widgets: refactor DAG diff widgets to widgets.diff Signed-off-by: David Aguilar --- cola/dag/view.py | 174 +-------------------------------------- cola/{dag => }/gravatar.py | 0 cola/stash/view.py | 2 +- cola/widgets/diff.py | 186 +++++++++++++++++++++++++++++++++++++++++- cola/widgets/search.py | 2 +- cola/widgets/selectcommits.py | 2 +- cola/widgets/text.py | 10 --- 7 files changed, 190 insertions(+), 186 deletions(-) rename cola/{dag => }/gravatar.py (100%) diff --git a/cola/dag/view.py b/cola/dag/view.py index 57b08c7c..f23aa1f0 100644 --- a/cola/dag/view.py +++ b/cola/dag/view.py @@ -11,12 +11,9 @@ from PyQt4.QtCore import QRectF from cola import cmds from cola import difftool -from cola import gitcmds from cola import observable from cola import qt from cola import qtutils -from cola.compat import set -from cola.dag import gravatar from cola.dag.model import RepoReader from cola.i18n import N_ from cola.qt import create_menu @@ -28,175 +25,8 @@ from cola.widgets.archive import GitArchiveDialog from cola.widgets.browse import BrowseDialog from cola.widgets.standard import MainWindow from cola.widgets.tree import FlatTreeWidget -from cola.widgets.text import DiffTextEdit - - -COMMITS_SELECTED = 'COMMITS_SELECTED' - - -class TextLabel(QtGui.QLabel): - def __init__(self, parent=None): - QtGui.QLabel.__init__(self, parent) - self.setTextInteractionFlags(Qt.TextSelectableByMouse | - Qt.LinksAccessibleByMouse) - self._display = '' - self._template = '' - self._text = '' - self._elide = False - self._metrics = QtGui.QFontMetrics(self.font()) - self.setOpenExternalLinks(True) - - def elide(self): - self._elide = True - - def set_text(self, text): - self.set_template(text, text) - - def set_template(self, text, template): - self._display = text - self._text = text - self._template = template - self.update_text(self.width()) - self.setText(self._display) - - def update_text(self, width): - self._display = self._text - if not self._elide: - return - text = self._metrics.elidedText(self._template, - Qt.ElideRight, width-2) - if unicode(text) != self._template: - self._display = text - - # Qt overrides - def setFont(self, font): - self._metrics = QtGui.QFontMetrics(font) - QtGui.QLabel.setFont(self, font) - - def resizeEvent(self, event): - if self._elide: - self.update_text(event.size().width()) - block = self.blockSignals(True) - self.setText(self._display) - self.blockSignals(block) - QtGui.QLabel.resizeEvent(self, event) - - -class DiffInfoTask(QtCore.QRunnable): - def __init__(self, sha1, reflector): - QtCore.QRunnable.__init__(self) - self.sha1 = sha1 - self.reflector = reflector - - def run(self): - diff = gitcmds.diff_info(self.sha1) - self.reflector.emit(SIGNAL('diff'), diff) - - -class DiffWidget(QtGui.QWidget): - - def __init__(self, notifier, parent): - QtGui.QWidget.__init__(self, parent) - - author_font = QtGui.QFont(self.font()) - author_font.setPointSize(int(author_font.pointSize() * 1.1)) - - summary_font = QtGui.QFont(author_font) - summary_font.setWeight(QtGui.QFont.Bold) - - policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, - QtGui.QSizePolicy.Minimum) - - self.gravatar_label = gravatar.GravatarLabel() - - self.author_label = TextLabel() - self.author_label.setTextFormat(Qt.RichText) - self.author_label.setFont(author_font) - self.author_label.setSizePolicy(policy) - self.author_label.setAlignment(Qt.AlignBottom) - self.author_label.elide() - - self.summary_label = TextLabel() - self.summary_label.setTextFormat(Qt.PlainText) - self.summary_label.setFont(summary_font) - self.summary_label.setSizePolicy(policy) - self.summary_label.setAlignment(Qt.AlignTop) - self.summary_label.elide() - - self.sha1_label = TextLabel() - self.sha1_label.setTextFormat(Qt.PlainText) - self.sha1_label.setSizePolicy(policy) - self.sha1_label.setAlignment(Qt.AlignTop) - self.sha1_label.elide() - - self.diff = DiffTextEdit(self, whitespace=False) - self.tasks = set() - self.reflector = QtCore.QObject(self) - - self.info_layout = QtGui.QVBoxLayout() - self.info_layout.setMargin(defs.no_margin) - self.info_layout.setSpacing(defs.no_spacing) - self.info_layout.addWidget(self.author_label) - self.info_layout.addWidget(self.summary_label) - self.info_layout.addWidget(self.sha1_label) - - self.logo_layout = QtGui.QHBoxLayout() - self.logo_layout.setContentsMargins(defs.margin, 0, defs.margin, 0) - self.logo_layout.setSpacing(defs.button_spacing) - self.logo_layout.addWidget(self.gravatar_label) - self.logo_layout.addLayout(self.info_layout) - - self.main_layout = QtGui.QVBoxLayout() - self.main_layout.setMargin(defs.no_margin) - self.main_layout.setSpacing(defs.spacing) - self.main_layout.addLayout(self.logo_layout) - self.main_layout.addWidget(self.diff) - self.setLayout(self.main_layout) - - notifier.add_observer(COMMITS_SELECTED, self.commits_selected) - self.connect(self.reflector, SIGNAL('diff'), self.diff.setText) - self.connect(self.reflector, SIGNAL('task_done'), self.task_done) - - def task_done(self, task): - try: - self.tasks.remove(task) - except: - pass - - def set_diff_sha1(self, sha1): - self.diff.setText('+++ ' + N_('Loading...')) - task = DiffInfoTask(sha1, self.reflector) - self.tasks.add(task) - QtCore.QThreadPool.globalInstance().start(task) - - def commits_selected(self, commits): - if len(commits) != 1: - return - commit = commits[0] - sha1 = commit.sha1 - - email = commit.email or '' - summary = commit.summary or '' - author = commit.author or '' - - template_args = { - 'author': author, - 'email': email, - 'summary': summary - } - - author_text = ("""%(author)s <""" - """""" - """%(email)s>""" - % template_args) - - author_template = '%(author)s <%(email)s>' % template_args - self.author_label.set_template(author_text, author_template) - self.summary_label.set_text(summary) - self.sha1_label.set_text(sha1) - - self.set_diff_sha1(sha1) - self.gravatar_label.set_email(email) +from cola.widgets.diff import COMMITS_SELECTED +from cola.widgets.diff import DiffWidget class ViewerMixin(object): diff --git a/cola/dag/gravatar.py b/cola/gravatar.py similarity index 100% rename from cola/dag/gravatar.py rename to cola/gravatar.py diff --git a/cola/stash/view.py b/cola/stash/view.py index ac3e9fb6..894ea2e7 100644 --- a/cola/stash/view.py +++ b/cola/stash/view.py @@ -11,7 +11,7 @@ from cola import utils from cola.i18n import N_ from cola.stash.model import ApplyStash, SaveStash, DropStash from cola.widgets import defs -from cola.widgets.text import DiffTextEdit +from cola.widgets.diff import DiffTextEdit from cola.widgets.standard import Dialog diff --git a/cola/widgets/diff.py b/cola/widgets/diff.py index 4d9bcd22..d38ceddc 100644 --- a/cola/widgets/diff.py +++ b/cola/widgets/diff.py @@ -1,14 +1,32 @@ import os +from PyQt4 import QtCore from PyQt4 import QtGui from PyQt4.QtCore import Qt, SIGNAL import cola from cola import cmds +from cola import gitcmds +from cola import gravatar from cola import qtutils from cola.cmds import run +from cola.compat import set from cola.i18n import N_ -from cola.widgets.text import DiffTextEdit +from cola.qt import DiffSyntaxHighlighter +from cola.widgets import defs +from cola.widgets.text import MonoTextView + + +COMMITS_SELECTED = 'COMMITS_SELECTED' + + +class DiffTextEdit(MonoTextView): + def __init__(self, parent, whitespace=True): + + MonoTextView.__init__(self, parent) + # Diff/patch syntax highlighter + self.highlighter = DiffSyntaxHighlighter(self.document(), + whitespace=whitespace) class DiffEditor(DiffTextEdit): @@ -275,3 +293,169 @@ class DiffEditor(DiffTextEdit): return cmds.do(cmds.ApplyDiffSelection, staged, selected, offset, selection, apply_to_worktree) + + + +class DiffWidget(QtGui.QWidget): + + def __init__(self, notifier, parent): + QtGui.QWidget.__init__(self, parent) + + author_font = QtGui.QFont(self.font()) + author_font.setPointSize(int(author_font.pointSize() * 1.1)) + + summary_font = QtGui.QFont(author_font) + summary_font.setWeight(QtGui.QFont.Bold) + + policy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, + QtGui.QSizePolicy.Minimum) + + self.gravatar_label = gravatar.GravatarLabel() + + self.author_label = TextLabel() + self.author_label.setTextFormat(Qt.RichText) + self.author_label.setFont(author_font) + self.author_label.setSizePolicy(policy) + self.author_label.setAlignment(Qt.AlignBottom) + self.author_label.elide() + + self.summary_label = TextLabel() + self.summary_label.setTextFormat(Qt.PlainText) + self.summary_label.setFont(summary_font) + self.summary_label.setSizePolicy(policy) + self.summary_label.setAlignment(Qt.AlignTop) + self.summary_label.elide() + + self.sha1_label = TextLabel() + self.sha1_label.setTextFormat(Qt.PlainText) + self.sha1_label.setSizePolicy(policy) + self.sha1_label.setAlignment(Qt.AlignTop) + self.sha1_label.elide() + + self.diff = DiffTextEdit(self, whitespace=False) + self.tasks = set() + self.reflector = QtCore.QObject(self) + + self.info_layout = QtGui.QVBoxLayout() + self.info_layout.setMargin(defs.no_margin) + self.info_layout.setSpacing(defs.no_spacing) + self.info_layout.addWidget(self.author_label) + self.info_layout.addWidget(self.summary_label) + self.info_layout.addWidget(self.sha1_label) + + self.logo_layout = QtGui.QHBoxLayout() + self.logo_layout.setContentsMargins(defs.margin, 0, defs.margin, 0) + self.logo_layout.setSpacing(defs.button_spacing) + self.logo_layout.addWidget(self.gravatar_label) + self.logo_layout.addLayout(self.info_layout) + + self.main_layout = QtGui.QVBoxLayout() + self.main_layout.setMargin(defs.no_margin) + self.main_layout.setSpacing(defs.spacing) + self.main_layout.addLayout(self.logo_layout) + self.main_layout.addWidget(self.diff) + self.setLayout(self.main_layout) + + notifier.add_observer(COMMITS_SELECTED, self.commits_selected) + self.connect(self.reflector, SIGNAL('diff'), self.diff.setText) + self.connect(self.reflector, SIGNAL('task_done'), self.task_done) + + def task_done(self, task): + try: + self.tasks.remove(task) + except: + pass + + def set_diff_sha1(self, sha1): + self.diff.setText('+++ ' + N_('Loading...')) + task = DiffInfoTask(sha1, self.reflector) + self.tasks.add(task) + QtCore.QThreadPool.globalInstance().start(task) + + def commits_selected(self, commits): + if len(commits) != 1: + return + commit = commits[0] + sha1 = commit.sha1 + + email = commit.email or '' + summary = commit.summary or '' + author = commit.author or '' + + template_args = { + 'author': author, + 'email': email, + 'summary': summary + } + + author_text = ("""%(author)s <""" + """""" + """%(email)s>""" + % template_args) + + author_template = '%(author)s <%(email)s>' % template_args + self.author_label.set_template(author_text, author_template) + self.summary_label.set_text(summary) + self.sha1_label.set_text(sha1) + + self.set_diff_sha1(sha1) + self.gravatar_label.set_email(email) + + +class TextLabel(QtGui.QLabel): + def __init__(self, parent=None): + QtGui.QLabel.__init__(self, parent) + self.setTextInteractionFlags(Qt.TextSelectableByMouse | + Qt.LinksAccessibleByMouse) + self._display = '' + self._template = '' + self._text = '' + self._elide = False + self._metrics = QtGui.QFontMetrics(self.font()) + self.setOpenExternalLinks(True) + + def elide(self): + self._elide = True + + def set_text(self, text): + self.set_template(text, text) + + def set_template(self, text, template): + self._display = text + self._text = text + self._template = template + self.update_text(self.width()) + self.setText(self._display) + + def update_text(self, width): + self._display = self._text + if not self._elide: + return + text = self._metrics.elidedText(self._template, + Qt.ElideRight, width-2) + if unicode(text) != self._template: + self._display = text + + # Qt overrides + def setFont(self, font): + self._metrics = QtGui.QFontMetrics(font) + QtGui.QLabel.setFont(self, font) + + def resizeEvent(self, event): + if self._elide: + self.update_text(event.size().width()) + block = self.blockSignals(True) + self.setText(self._display) + self.blockSignals(block) + QtGui.QLabel.resizeEvent(self, event) + + +class DiffInfoTask(QtCore.QRunnable): + def __init__(self, sha1, reflector): + QtCore.QRunnable.__init__(self) + self.sha1 = sha1 + self.reflector = reflector + + def run(self): + diff = gitcmds.diff_info(self.sha1) + self.reflector.emit(SIGNAL('diff'), diff) diff --git a/cola/widgets/search.py b/cola/widgets/search.py index e9c27a85..c0cadc8d 100644 --- a/cola/widgets/search.py +++ b/cola/widgets/search.py @@ -18,7 +18,7 @@ from cola.qtutils import connect_button from cola.qtutils import dir_icon from cola.widgets import defs from cola.widgets import standard -from cola.widgets.text import DiffTextEdit +from cola.widgets.diff import DiffTextEdit def mkdate(timespec): diff --git a/cola/widgets/selectcommits.py b/cola/widgets/selectcommits.py index 2eead3ef..7c280cde 100644 --- a/cola/widgets/selectcommits.py +++ b/cola/widgets/selectcommits.py @@ -8,7 +8,7 @@ from cola import qtutils from cola.i18n import N_ from cola.interaction import Interaction from cola.widgets import defs -from cola.widgets.text import DiffTextEdit +from cola.widgets.diff import DiffTextEdit def select_commits(title, revs, summaries, multiselect=True): diff --git a/cola/widgets/text.py b/cola/widgets/text.py index 032536d3..835c215d 100644 --- a/cola/widgets/text.py +++ b/cola/widgets/text.py @@ -72,16 +72,6 @@ class MonoTextView(MonoTextEdit): Qt.TextSelectableByMouse) -class DiffTextEdit(MonoTextView): - def __init__(self, parent, whitespace=True): - from cola.qt import DiffSyntaxHighlighter - - MonoTextView.__init__(self, parent) - # Diff/patch syntax highlighter - self.highlighter = DiffSyntaxHighlighter(self.document(), - whitespace=whitespace) - - class HintedTextWidgetEventFilter(QtCore.QObject): def __init__(self, parent): QtCore.QObject.__init__(self, parent) -- 2.11.4.GIT