1
# -*- coding: utf-8 -*-
3
# Copyright © 2012 Jed Ludlow
4
# based loosley on pylintgui.py by Pierre Raybaut
5
# Licensed under the terms of the MIT License
6
# (see spyderlib/__init__.py for details)
8
"""Breakpoint widget"""
10
# pylint: disable=C0103
11
# pylint: disable=R0903
12
# pylint: disable=R0911
13
# pylint: disable=R0201
15
from __future__ import with_statement
17
from spyderlib.qt.QtGui import (QWidget, QTableView, QItemDelegate,
19
from spyderlib.qt.QtCore import (Qt, SIGNAL, QTextCodec,
20
QModelIndex, QAbstractTableModel)
21
locale_codec = QTextCodec.codecForLocale()
22
from spyderlib.qt.compat import to_qvariant
27
from spyderlib.baseconfig import get_translation
28
from spyderlib.config import CONF
30
_ = get_translation("p_breakpoints", dirname="spyderplugins")
32
class BreakpointTableModel(QAbstractTableModel):
34
Table model for breakpoints dictionary
37
def __init__(self, parent, data):
38
QAbstractTableModel.__init__(self, parent)
42
self.breakpoints = None
45
def set_data(self, data):
53
for item in data[key]:
54
self.breakpoints.append((key, item[0], item[1], ""))
57
def rowCount(self, qindex=QModelIndex()):
58
"""Array row number"""
59
return len(self.breakpoints)
61
def columnCount(self, qindex=QModelIndex()):
62
"""Array column count"""
65
def sort(self, column, order=Qt.DescendingOrder):
66
"""Overriding sort method"""
68
self.breakpoints.sort(
69
key=lambda breakpoint: breakpoint[1])
70
self.breakpoints.sort(
71
key=lambda breakpoint: osp.basename(breakpoint[0]))
80
def headerData(self, section, orientation, role=Qt.DisplayRole):
81
"""Overriding method headerData"""
82
if role != Qt.DisplayRole:
84
i_column = int(section)
85
if orientation == Qt.Horizontal:
86
headers = (_("File"), _("Line"), _("Condition"), "")
87
return to_qvariant( headers[i_column] )
91
def get_value(self, index):
92
"""Return current value"""
93
return self.breakpoints[index.row()][index.column()]
95
def data(self, index, role=Qt.DisplayRole):
96
"""Return data at table index"""
97
if not index.isValid():
99
if role == Qt.DisplayRole:
100
if index.column() == 0:
101
value = osp.basename(self.get_value(index))
102
return to_qvariant(value)
104
value = self.get_value(index)
105
return to_qvariant(value)
106
elif role == Qt.TextAlignmentRole:
107
return to_qvariant(int(Qt.AlignLeft|Qt.AlignVCenter))
108
elif role == Qt.ToolTipRole:
109
if index.column() == 0:
110
value = self.get_value(index)
111
return to_qvariant(value)
115
class BreakpointDelegate(QItemDelegate):
116
def __init__(self, parent=None):
117
QItemDelegate.__init__(self, parent)
119
class BreakpointTableView(QTableView):
120
def __init__(self, parent, data):
121
QTableView.__init__(self, parent)
122
self.model = BreakpointTableModel(self, data)
123
self.setModel(self.model)
124
self.delegate = BreakpointDelegate(self)
125
self.setItemDelegate(self.delegate)
129
def setup_table(self):
131
self.horizontalHeader().setStretchLastSection(True)
132
self.adjust_columns()
135
self.setSortingEnabled(False)
136
self.sortByColumn(0, Qt.DescendingOrder)
138
def adjust_columns(self):
139
"""Resize three first columns to contents"""
141
self.resizeColumnToContents(col)
143
def mouseDoubleClickEvent(self, event):
144
"""Reimplement Qt method"""
145
index_clicked = self.indexAt(event.pos())
146
filename = self.model.breakpoints[index_clicked.row()][0]
147
line_number_str = self.model.breakpoints[index_clicked.row()][1]
148
self.parent().emit(SIGNAL("edit_goto(QString,int,QString)"),
149
filename, int(line_number_str), '')
151
class BreakpointWidget(QWidget):
157
def __init__(self, parent):
158
QWidget.__init__(self, parent)
160
self.setWindowTitle("Breakpoints")
161
self.dictwidget = BreakpointTableView(self,
162
self._load_all_breakpoints())
163
layout = QVBoxLayout()
164
layout.addWidget(self.dictwidget)
165
self.setLayout(layout)
167
def _load_all_breakpoints(self):
168
bp_dict = CONF.get('run', 'breakpoints', {})
169
for filename in bp_dict.keys():
170
if not osp.isfile(filename):
171
bp_dict.pop(filename)
178
bp_dict = self._load_all_breakpoints()
179
self.dictwidget.model.set_data(bp_dict)
180
self.dictwidget.adjust_columns()
181
self.dictwidget.sortByColumn(0, Qt.DescendingOrder)
184
"""Run breakpoint widget test"""
185
from spyderlib.utils.qthelpers import qapplication
187
widget = BreakpointWidget(None)
189
sys.exit(app.exec_())
191
if __name__ == '__main__':