Skip to content
This repository was archived by the owner on Aug 28, 2020. It is now read-only.

Commit 96f12fd

Browse files
committed
Merge pull request #94 from robertbasic/feature/break-at-first-line
Feature/break at first line. Resolves #39
2 parents 233ba46 + 6386a0d commit 96f12fd

File tree

4 files changed

+66
-8
lines changed

4 files changed

+66
-8
lines changed

pugdebug/debugger.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class PugdebugDebugger(QObject):
3333
step_command_signal = pyqtSignal()
3434
got_all_variables_signal = pyqtSignal(object)
3535
got_stacktraces_signal = pyqtSignal(object)
36+
init_breakpoints_set = pyqtSignal()
3637
breakpoint_removed_signal = pyqtSignal(int)
3738
breakpoints_listed_signal = pyqtSignal(list)
3839
expression_evaluated_signal = pyqtSignal(int, dict)
@@ -98,7 +99,7 @@ def connect_connection_signals(self, connection):
9899

99100
# Breakpoints signals
100101
connection.set_init_breakpoints_signal.connect(
101-
self.handle_set_breakpoint
102+
self.handle_set_init_breakpoint
102103
)
103104
connection.set_breakpoint_signal.connect(
104105
self.handle_set_breakpoint
@@ -269,6 +270,11 @@ def handle_set_breakpoint(self, successful):
269270
if successful:
270271
self.list_breakpoints()
271272

273+
def handle_set_init_breakpoint(self, successful):
274+
if successful:
275+
self.list_breakpoints()
276+
self.init_breakpoints_set.emit()
277+
272278
def remove_breakpoint(self, breakpoint_id):
273279
self.current_connection.remove_breakpoint(breakpoint_id)
274280

pugdebug/gui/settings.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99

1010
__author__ = "robertbasic"
1111

12-
from PyQt5.QtWidgets import QWidget, QLineEdit, QFormLayout, QSpinBox
12+
from PyQt5.QtWidgets import (QWidget, QLineEdit, QFormLayout,
13+
QSpinBox, QCheckBox)
1314

1415
from pugdebug.models.settings import get_setting, set_setting
1516

@@ -60,6 +61,15 @@ def __init__(self, parent):
6061
idekey = get_setting('debugger/idekey')
6162
self.idekey.setText(idekey)
6263

64+
self.break_at_first_line = QCheckBox("Break at first line")
65+
66+
self.break_at_first_line.stateChanged.connect(
67+
self.handle_break_at_first_line_changed
68+
)
69+
70+
break_at_first_line = int(get_setting('debugger/break_at_first_line'))
71+
self.break_at_first_line.setCheckState(break_at_first_line)
72+
6373
layout = QFormLayout()
6474
self.setLayout(layout)
6575

@@ -68,6 +78,7 @@ def __init__(self, parent):
6878
layout.addRow("Host", self.host)
6979
layout.addRow("Port", self.port_number)
7080
layout.addRow("IDE Key", self.idekey)
81+
layout.addRow("", self.break_at_first_line)
7182

7283
def get_project_root(self):
7384
return self.project_root.text()
@@ -102,3 +113,6 @@ def handle_port_number_changed(self, value):
102113
def handle_idekey_changed(self):
103114
value = self.idekey.text()
104115
set_setting('debugger/idekey', value)
116+
117+
def handle_break_at_first_line_changed(self, value):
118+
set_setting('debugger/break_at_first_line', value)

pugdebug/models/settings.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ def setup_debugger_settings(self):
5151
if not self.application_settings.contains('idekey'):
5252
self.application_settings.setValue('idekey', 'pugdebug')
5353

54+
if not self.application_settings.contains('break_at_first_line'):
55+
# 2 is the init value because 1 is some weird
56+
# between checked and unchecked state
57+
self.application_settings.setValue('break_at_first_line', 2)
58+
5459
self.application_settings.endGroup()
5560

5661
def setup_path_settings(self):

pugdebug/pugdebug.py

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import os
1313

1414
from PyQt5.QtCore import QObject
15-
from PyQt5.QtWidgets import QErrorMessage
15+
from PyQt5.QtWidgets import QErrorMessage, QMessageBox
1616

1717
from pugdebug.debugger import PugdebugDebugger
1818
from pugdebug.syntaxer import PugdebugFormatter
@@ -168,6 +168,9 @@ def connect_debugger_signals(self):
168168
)
169169

170170
# Breakpoints signals
171+
self.debugger.init_breakpoints_set.connect(
172+
self.handle_init_breakpoints_set
173+
)
171174
self.debugger.breakpoint_removed_signal.connect(
172175
self.handle_breakpoint_removed
173176
)
@@ -354,13 +357,30 @@ def start_debug(self):
354357
355358
Start a debugging session.
356359
"""
357-
self.variable_viewer.clear()
358-
self.stacktrace_viewer.clear()
360+
break_at_first_line = int(get_setting('debugger/break_at_first_line'))
361+
362+
start_debugging = True
363+
364+
if break_at_first_line == 0 and len(self.init_breakpoints) == 0:
365+
messageBox = QMessageBox()
366+
messageBox.setText("There are no breakpoints set and the break at"
367+
" first line setting is turned off.")
368+
messageBox.setInformativeText("Are you sure you want to start"
369+
" debugging?")
370+
messageBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
371+
answer = messageBox.exec_()
372+
373+
if answer == QMessageBox.No:
374+
start_debugging = False
375+
376+
if start_debugging:
377+
self.variable_viewer.clear()
378+
self.stacktrace_viewer.clear()
359379

360-
self.document_viewer.remove_line_highlights()
380+
self.document_viewer.remove_line_highlights()
361381

362-
self.debugger.start_debug()
363-
self.main_window.set_statusbar_text("Waiting for connection...")
382+
self.debugger.start_debug()
383+
self.main_window.set_statusbar_text("Waiting for connection...")
364384

365385
def handle_debugging_started(self):
366386
"""Handle when debugging starts
@@ -385,6 +405,10 @@ def handle_debugging_started(self):
385405

386406
self.open_document(self.debugger.get_index_file())
387407

408+
break_at_first_line = int(get_setting('debugger/break_at_first_line'))
409+
if break_at_first_line > 0:
410+
self.step_into()
411+
388412
def stop_debug(self):
389413
"""Stop a debugging session
390414
@@ -583,6 +607,15 @@ def remove_stale_breakpoints(self, path):
583607

584608
self.breakpoint_viewer.set_breakpoints(breakpoints)
585609

610+
def handle_init_breakpoints_set(self):
611+
"""Handle when init breakpoints get set
612+
613+
If the code should not break at first line, run the debugger.
614+
"""
615+
break_at_first_line = int(get_setting('debugger/break_at_first_line'))
616+
if break_at_first_line == 0:
617+
self.run_debug()
618+
586619
def handle_breakpoint_removed(self, breakpoint_id):
587620
"""Handle when a breakpoint gets removed
588621

0 commit comments

Comments
 (0)