Skip to content

Commit bb16326

Browse files
Added line number mode
1 parent 31d8ade commit bb16326

File tree

9 files changed

+138
-61
lines changed

9 files changed

+138
-61
lines changed

CodeReview/Diff/RawTextDocument.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ def flat_to_line_slice(self, flat_slice):
233233
upper_line = self.line_of(flat_slice.upper)
234234
else:
235235
upper_line= start_line
236-
236+
237237
return LineSlice(start_line, upper_line +1)
238238

239239
##############################################
@@ -339,7 +339,7 @@ def _split_lines(self, text_buffer):
339339
elif char == '\n':
340340
line_separator_length = 1
341341
if line_separator_length:
342-
new_line_location = i + line_separator_length
342+
new_line_location = i + line_separator_length
343343
line_start_locations.append(new_line_location)
344344
line_separators.append(text_buffer[i:new_line_location])
345345
i = new_line_location

CodeReview/GUI/DiffViewer/DiffViewerMainWindow.py

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,22 +109,32 @@ def _create_actions(self):
109109
shortcut='Ctrl+R',
110110
triggered=lambda: self._refresh,
111111
)
112-
112+
113+
self._line_number_action = \
114+
QtWidgets.QAction(icon_loader['line-number-mode@svg'],
115+
'Line Number Mode',
116+
self,
117+
toolTip='Line Number Mode',
118+
shortcut='Ctrl+N',
119+
checkable=True,
120+
triggered=self._set_document_models,
121+
)
122+
113123
self._align_action = \
114124
QtWidgets.QAction(icon_loader['align-mode@svg'],
115-
'Align',
125+
'Align Mode',
116126
self,
117-
toolTip='Align view',
127+
toolTip='Align Mode',
118128
shortcut='Ctrl+L',
119129
checkable=True,
120130
triggered=self._set_document_models,
121131
)
122132

123133
self._complete_action = \
124134
QtWidgets.QAction(icon_loader['complete-mode@svg'],
125-
'Complete',
135+
'Complete Mode',
126136
self,
127-
toolTip='Complete view',
137+
toolTip='Complete Mode',
128138
shortcut='Ctrl+A',
129139
checkable=True,
130140
triggered=self._set_document_models,
@@ -174,6 +184,7 @@ def _create_toolbar(self):
174184
QtWidgets.QLabel(' '), # Fixme
175185
QtWidgets.QLabel('Font Size:'),
176186
self._font_size_combobox,
187+
self._line_number_action,
177188
self._align_action,
178189
self._complete_action,
179190
self._highlight_action,
@@ -326,8 +337,10 @@ def _set_document_models(self):
326337

327338
aligned_mode = self._align_action.isChecked()
328339
complete_mode = self._complete_action.isChecked()
340+
line_number_mode = self._line_number_action.isChecked()
329341
# Fixme: right way ?
330-
self._diff_view.set_document_models(self._highlighted_documents, aligned_mode, complete_mode)
342+
self._diff_view.set_document_models(self._highlighted_documents,
343+
aligned_mode, complete_mode, line_number_mode)
331344

332345
##############################################
333346

CodeReview/GUI/DiffViewer/DiffWidget.py

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
from .SyntaxHighlighterStyle import SyntaxHighlighterStyle
3030
from CodeReview.Diff.RawTextDocumentDiff import chunk_type
31+
from CodeReview.Math.Functions import number_of_digits
3132
from CodeReview.Tools.IteratorTools import pairwise, iter_with_last_flag
3233
from CodeReview.Tools.StringTools import remove_trailing_newline
3334
import CodeReview.GUI.DiffViewer.DiffWidgetConfig as DiffWidgetConfig
@@ -368,35 +369,68 @@ def _insert_metadata(self, cursor, document_model):
368369

369370
##############################################
370371

372+
def _append_document_on_side(self, side, document_model,
373+
aligned_mode,
374+
complete_mode,
375+
line_number_mode,
376+
):
377+
378+
cursor = self._cursors[side]
379+
380+
if line_number_mode:
381+
previous_line_number = -1
382+
last_line_number = document_model[-1].line_slice.upper
383+
line_number_pattern = '{:' + str(number_of_digits(last_line_number)) + '} | '
384+
385+
if document_model.metadata is not None:
386+
cursor.begin_block(side, chunk_type.header)
387+
self._insert_metadata(cursor, document_model)
388+
389+
for text_block in document_model:
390+
cursor.begin_block(side, text_block.frame_type, aligned_mode)
391+
if text_block.frame_type != chunk_type.equal_block or complete_mode:
392+
for text_fragment, last_text_fragment in iter_with_last_flag(text_block):
393+
text_format = self._syntax_highlighter_style[text_fragment.token_type]
394+
if (text_block.frame_type == chunk_type.replace and
395+
text_fragment.frame_type != chunk_type.equal):
396+
text_format.setBackground(DiffWidgetConfig.intra_difference_background_colour)
397+
if line_number_mode:
398+
line_slice = text_block.line_slice
399+
line_number = line_slice.start
400+
for line in text_fragment.text.line_iterator():
401+
if line_number > previous_line_number:
402+
cursor.insert_text(line_number_pattern.format(line_number +1))
403+
cursor.insert_text(str(line), text_format, line_number == line_slice.upper)
404+
previous_line_number = line_number
405+
line_number += 1
406+
else:
407+
cursor.insert_text(str(text_fragment), text_format, last_text_fragment)
408+
if aligned_mode:
409+
padding = '\n'*(text_block.alignment_padding() -1) # same as last_text_fragment=True
410+
cursor.insert_text(padding)
411+
412+
##############################################
413+
371414
def append_document_models(self, document_models,
372415
aligned_mode=True,
373416
complete_mode=True,
374-
line_number_mode=True):
417+
line_number_mode=True,
418+
):
375419

376420
for side, document_model in enumerate(document_models):
377-
cursor = self._cursors[side]
378-
if document_model.metadata is not None:
379-
cursor.begin_block(side, chunk_type.header)
380-
self._insert_metadata(cursor, document_model)
381-
for text_block in document_model:
382-
cursor.begin_block(side, text_block.frame_type, aligned_mode)
383-
if text_block.frame_type != chunk_type.equal_block or complete_mode:
384-
for text_fragment, last_text_fragment in iter_with_last_flag(text_block):
385-
text_format = self._syntax_highlighter_style[text_fragment.token_type]
386-
if (text_block.frame_type == chunk_type.replace and
387-
text_fragment.frame_type != chunk_type.equal):
388-
text_format.setBackground(DiffWidgetConfig.intra_difference_background_colour)
389-
cursor.insert_text(str(text_fragment), text_format, last_text_fragment)
390-
if aligned_mode:
391-
padding = '\n'*(text_block.alignment_padding() -1) # same as last_text_fragment=True
392-
cursor.insert_text(padding)
421+
self._append_document_on_side(side, document_model,
422+
aligned_mode, complete_mode, line_number_mode)
393423

394424
##############################################
395425

396-
def set_document_models(self, document_models, aligned_mode=True, complete_mode=True):
426+
def set_document_models(self, document_models,
427+
aligned_mode=True,
428+
complete_mode=True,
429+
line_number_mode=True,
430+
):
397431

398432
self.clear()
399-
self.append_document_models(document_models, aligned_mode, complete_mode)
433+
self.append_document_models(document_models, aligned_mode, complete_mode, line_number_mode)
400434
for cursor in self._cursors:
401435
cursor.end()
402436

CodeReview/Math/Functions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@
1818

1919
####################################################################################################
2020

21+
import math
22+
23+
####################################################################################################
24+
2125
def rint(f):
2226
return int(round(f))
2327

@@ -26,6 +30,11 @@ def rint(f):
2630
def middle(a, b):
2731
return .5*(a + b)
2832

33+
####################################################################################################
34+
35+
def number_of_digits(x):
36+
return max(math.ceil(math.log10(x)), 1)
37+
2938
####################################################################################################
3039
#
3140
# End

share/icons/32x32/align-mode.png

-1.45 KB
Binary file not shown.
-1.2 KB
Binary file not shown.

share/icons/32x32/highlight.png

-978 Bytes
Binary file not shown.

share/icons/svg/align-mode.svg

Lines changed: 47 additions & 22 deletions
Loading

share/icons/svg/complete-mode.svg

Lines changed: 8 additions & 12 deletions
Loading

0 commit comments

Comments
 (0)