Use separate debug log window.

This commit is contained in:
Bastian Kleineidam 2010-10-16 19:26:46 +02:00
parent dcff139d04
commit ced1b42124
10 changed files with 248 additions and 254 deletions

View file

@ -9,6 +9,7 @@ Fixes:
Changes:
- gui: Display cancel message in progress window.
- gui: Use separate debug log window.
- install: Copy and execute the Microsoft Visual C runtime DLL
installer. This solves startup error on WinXP systems that don't
have this DLL installed.

View file

@ -1,6 +1,4 @@
- [GUI] Allow login URL to be configured.
- [GUI] Move the debug tab someplace else. Perhaps make a separate
debug window out of it that gets displayed only on demand.
- [GUI] Show detailed URL properties
- [GUI] Save options in qsettings or in external file (for each URL?).
- [PYTHON3]

View file

@ -243,6 +243,12 @@ Version 2 or later.</p>
self.config["verbose"] = self.options.verbose.isChecked()
self.config["timeout"] = self.options.timeout.value()
self.config["threads"] = self.options.threads.value()
if self.options.debug:
self.config.set_debug(["all"])
# make sure at least one thread is used
self.config["threads"] = 1
else:
self.config.reset_loglevel()
def log_url (self, url_data):
"""Add URL data to tree widget."""

View file

@ -48,4 +48,5 @@ class CheckerThread (QtCore.QThread):
def run (self):
# start checking
assert self.aggregate.config["threads"] > 0
director.check_urls(self.aggregate)

View file

@ -25,13 +25,10 @@ class LinkCheckerDebug (QtGui.QDialog, Ui_DebugDialog):
def __init__ (self, parent=None):
super(LinkCheckerDebug, self).__init__(parent)
self.setupUi(self)
self.textBrowser.setFontFamily("Consolas")
self.connect(self, QtCore.SIGNAL("log_msg(QString)"), self.log_msg)
def log_msg (self, msg):
text = self.textBrowser.toPlainText()
self.textBrowser.setText(text+msg)
self.textBrowser.moveCursor(QtGui.QTextCursor.End)
self.textEdit.appendPlainText(msg)
def reset (self):
self.textBrowser.setText(u"")
self.textEdit.clear()

View file

@ -2,7 +2,7 @@
# Form implementation generated from reading ui file 'ui/debug.ui'
#
# Created: Thu Oct 14 20:54:43 2010
# Created: Sat Oct 16 19:17:16 2010
# by: PyQt4 UI code generator 4.7.3
#
# WARNING! All changes made in this file will be lost!
@ -22,9 +22,12 @@ class Ui_DebugDialog(object):
self.frame.setObjectName("frame")
self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.textBrowser = QtGui.QTextBrowser(self.frame)
self.textBrowser.setObjectName("textBrowser")
self.verticalLayout_2.addWidget(self.textBrowser)
self.textEdit = QtGui.QPlainTextEdit(self.frame)
self.textEdit.setUndoRedoEnabled(False)
self.textEdit.setReadOnly(True)
self.textEdit.setPlainText("None")
self.textEdit.setObjectName("textEdit")
self.verticalLayout_2.addWidget(self.textEdit)
self.verticalLayout.addWidget(self.frame)
self.retranslateUi(DebugDialog)

View file

@ -2,8 +2,8 @@
# Form implementation generated from reading ui file 'ui/options.ui'
#
# Created: Wed Mar 4 21:31:00 2009
# by: PyQt4 UI code generator 4.4.4
# Created: Thu Oct 14 21:28:53 2010
# by: PyQt4 UI code generator 4.7.3
#
# WARNING! All changes made in this file will be lost!
@ -12,65 +12,81 @@ from PyQt4 import QtCore, QtGui
class Ui_Options(object):
def setupUi(self, Options):
Options.setObjectName("Options")
Options.resize(306, 255)
self.resetButton = QtGui.QPushButton(Options)
self.resetButton.setGeometry(QtCore.QRect(200, 220, 91, 27))
self.resetButton.setObjectName("resetButton")
Options.resize(299, 179)
self.verticalLayout = QtGui.QVBoxLayout(Options)
self.verticalLayout.setObjectName("verticalLayout")
self.frame = QtGui.QFrame(Options)
self.frame.setGeometry(QtCore.QRect(9, 9, 288, 201))
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName("frame")
self.formLayout = QtGui.QFormLayout(self.frame)
self.formLayout.setObjectName("formLayout")
self.label = QtGui.QLabel(self.frame)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.label)
self.recursionlevel = QtGui.QSpinBox(self.frame)
self.recursionlevel.setGeometry(QtCore.QRect(130, 20, 46, 23))
self.recursionlevel.setMinimum(-1)
self.recursionlevel.setMaximum(100)
self.recursionlevel.setProperty("value", QtCore.QVariant(-1))
self.recursionlevel.setProperty("value", -1)
self.recursionlevel.setObjectName("recursionlevel")
self.label = QtGui.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(30, 20, 111, 20))
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.recursionlevel)
self.label_2 = QtGui.QLabel(self.frame)
self.label_2.setGeometry(QtCore.QRect(30, 60, 91, 17))
self.label_2.setObjectName("label_2")
self.label_3 = QtGui.QLabel(self.frame)
self.label_3.setGeometry(QtCore.QRect(30, 100, 48, 17))
self.label_3.setObjectName("label_3")
self.timeout = QtGui.QSpinBox(self.frame)
self.timeout.setGeometry(QtCore.QRect(130, 100, 81, 23))
self.timeout.setMinimum(2)
self.timeout.setMaximum(300)
self.timeout.setProperty("value", QtCore.QVariant(60))
self.timeout.setObjectName("timeout")
self.label_5 = QtGui.QLabel(self.frame)
self.label_5.setGeometry(QtCore.QRect(30, 140, 101, 17))
self.label_5.setObjectName("label_5")
self.threads = QtGui.QSpinBox(self.frame)
self.threads.setGeometry(QtCore.QRect(130, 140, 46, 23))
self.threads.setMinimum(1)
self.threads.setMaximum(20)
self.threads.setProperty("value", QtCore.QVariant(10))
self.threads.setObjectName("threads")
self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.label_2)
self.verbose = QtGui.QCheckBox(self.frame)
self.verbose.setEnabled(True)
self.verbose.setGeometry(QtCore.QRect(130, 60, 31, 22))
self.verbose.setText("")
self.verbose.setObjectName("verbose")
self.closeButton = QtGui.QPushButton(Options)
self.closeButton.setGeometry(QtCore.QRect(10, 220, 75, 27))
self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.verbose)
self.label_3 = QtGui.QLabel(self.frame)
self.label_3.setObjectName("label_3")
self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.label_3)
self.timeout = QtGui.QSpinBox(self.frame)
self.timeout.setMinimum(2)
self.timeout.setMaximum(300)
self.timeout.setProperty("value", 60)
self.timeout.setObjectName("timeout")
self.formLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.timeout)
self.label_5 = QtGui.QLabel(self.frame)
self.label_5.setObjectName("label_5")
self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.label_5)
self.threads = QtGui.QSpinBox(self.frame)
self.threads.setMinimum(1)
self.threads.setMaximum(20)
self.threads.setProperty("value", 10)
self.threads.setObjectName("threads")
self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.threads)
self.label_4 = QtGui.QLabel(self.frame)
self.label_4.setObjectName("label_4")
self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.label_4)
self.debug = QtGui.QCheckBox(self.frame)
self.debug.setText("")
self.debug.setObjectName("debug")
self.formLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.debug)
self.verticalLayout.addWidget(self.frame)
self.widget = QtGui.QWidget(Options)
self.widget.setObjectName("widget")
self.horizontalLayout = QtGui.QHBoxLayout(self.widget)
self.horizontalLayout.setObjectName("horizontalLayout")
self.resetButton = QtGui.QPushButton(self.widget)
self.resetButton.setObjectName("resetButton")
self.horizontalLayout.addWidget(self.resetButton)
self.closeButton = QtGui.QPushButton(self.widget)
self.closeButton.setObjectName("closeButton")
self.horizontalLayout.addWidget(self.closeButton)
self.verticalLayout.addWidget(self.widget)
self.retranslateUi(Options)
QtCore.QMetaObject.connectSlotsByName(Options)
def retranslateUi(self, Options):
Options.setWindowTitle(_("Dialog"))
self.resetButton.setToolTip(_("Reset all options to default values."))
self.resetButton.setText(_("Reset"))
self.recursionlevel.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion."))
self.label.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion."))
self.label.setText(_("Recursive depth"))
self.recursionlevel.setToolTip(_("Check recursively all links up to given depth. A negative depth will enable infinite recursion."))
self.label_2.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings."))
self.label_2.setText(_("Verbose output"))
self.verbose.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings."))
self.label_3.setToolTip(_("Set the timeout for connection attempts in seconds."))
self.label_3.setText(_("Timeout"))
self.timeout.setToolTip(_("Set the timeout for connection attempts in seconds."))
@ -78,6 +94,8 @@ class Ui_Options(object):
self.label_5.setToolTip(_("Generate no more than the given number of threads."))
self.label_5.setText(_("Number of threads"))
self.threads.setToolTip(_("Generate no more than the given number of threads."))
self.verbose.setToolTip(_("Log all checked URLs once. Default is to log only errors and warnings."))
self.label_4.setText(_("Debug"))
self.resetButton.setToolTip(_("Reset all options to default values."))
self.resetButton.setText(_("Reset"))
self.closeButton.setText(_("Close"))

View file

@ -37,4 +37,5 @@ class LinkCheckerOptions (QtGui.QDialog, Ui_Options):
self.verbose.setChecked(config["verbose"])
self.threads.setValue(config["threads"])
self.timeout.setValue(config["timeout"])
self.debug.setChecked(False)
del config

View file

@ -27,7 +27,17 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTextBrowser" name="textBrowser"/>
<widget class="QPlainTextEdit" name="textEdit">
<property name="undoRedoEnabled">
<bool>false</bool>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="plainText">
<string notr="true"/>
</property>
</widget>
</item>
</layout>
</widget>

View file

@ -1,214 +1,173 @@
<ui version="4.0" >
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Options</class>
<widget class="QDialog" name="Options" >
<property name="geometry" >
<widget class="QDialog" name="Options">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>306</width>
<height>255</height>
<width>299</width>
<height>179</height>
</rect>
</property>
<property name="windowTitle" >
<property name="windowTitle">
<string>Dialog</string>
</property>
<widget class="QPushButton" name="resetButton" >
<property name="geometry" >
<rect>
<x>200</x>
<y>220</y>
<width>91</width>
<height>27</height>
</rect>
</property>
<property name="toolTip" >
<string>Reset all options to default values.</string>
</property>
<property name="text" >
<string>Reset</string>
</property>
</widget>
<widget class="QFrame" name="frame" >
<property name="geometry" >
<rect>
<x>9</x>
<y>9</y>
<width>288</width>
<height>201</height>
</rect>
</property>
<property name="frameShape" >
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow" >
<enum>QFrame::Raised</enum>
</property>
<widget class="QSpinBox" name="recursionlevel" >
<property name="geometry" >
<rect>
<x>130</x>
<y>20</y>
<width>46</width>
<height>23</height>
</rect>
</property>
<property name="toolTip" >
<string>Check recursively all links up to given depth. A negative depth will enable infinite recursion.</string>
</property>
<property name="minimum" >
<number>-1</number>
</property>
<property name="maximum" >
<number>100</number>
</property>
<property name="value" >
<number>-1</number>
</property>
</widget>
<widget class="QLabel" name="label" >
<property name="geometry" >
<rect>
<x>30</x>
<y>20</y>
<width>111</width>
<height>20</height>
</rect>
</property>
<property name="toolTip" >
<string>Check recursively all links up to given depth. A negative depth will enable infinite recursion.</string>
</property>
<property name="text" >
<string>Recursive depth</string>
</property>
</widget>
<widget class="QLabel" name="label_2" >
<property name="geometry" >
<rect>
<x>30</x>
<y>60</y>
<width>91</width>
<height>17</height>
</rect>
</property>
<property name="toolTip" >
<string>Log all checked URLs once. Default is to log only errors and warnings.</string>
</property>
<property name="text" >
<string>Verbose output</string>
</property>
</widget>
<widget class="QLabel" name="label_3" >
<property name="geometry" >
<rect>
<x>30</x>
<y>100</y>
<width>48</width>
<height>17</height>
</rect>
</property>
<property name="toolTip" >
<string>Set the timeout for connection attempts in seconds.</string>
</property>
<property name="text" >
<string>Timeout</string>
</property>
</widget>
<widget class="QSpinBox" name="timeout" >
<property name="geometry" >
<rect>
<x>130</x>
<y>100</y>
<width>81</width>
<height>23</height>
</rect>
</property>
<property name="toolTip" >
<string>Set the timeout for connection attempts in seconds.</string>
</property>
<property name="suffix" >
<string> seconds</string>
</property>
<property name="minimum" >
<number>2</number>
</property>
<property name="maximum" >
<number>300</number>
</property>
<property name="value" >
<number>60</number>
</property>
</widget>
<widget class="QLabel" name="label_5" >
<property name="geometry" >
<rect>
<x>30</x>
<y>140</y>
<width>101</width>
<height>17</height>
</rect>
</property>
<property name="toolTip" >
<string>Generate no more than the given number of threads.</string>
</property>
<property name="text" >
<string>Number of threads</string>
</property>
</widget>
<widget class="QSpinBox" name="threads" >
<property name="geometry" >
<rect>
<x>130</x>
<y>140</y>
<width>46</width>
<height>23</height>
</rect>
</property>
<property name="toolTip" >
<string>Generate no more than the given number of threads.</string>
</property>
<property name="minimum" >
<number>1</number>
</property>
<property name="maximum" >
<number>20</number>
</property>
<property name="value" >
<number>10</number>
</property>
</widget>
<widget class="QCheckBox" name="verbose" >
<property name="enabled" >
<bool>true</bool>
</property>
<property name="geometry" >
<rect>
<x>130</x>
<y>60</y>
<width>31</width>
<height>22</height>
</rect>
</property>
<property name="toolTip" >
<string>Log all checked URLs once. Default is to log only errors and warnings.</string>
</property>
<property name="text" >
<string/>
</property>
</widget>
</widget>
<widget class="QPushButton" name="closeButton" >
<property name="geometry" >
<rect>
<x>10</x>
<y>220</y>
<width>75</width>
<height>27</height>
</rect>
</property>
<property name="text" >
<string>Close</string>
</property>
</widget>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QFrame" name="frame">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="toolTip">
<string>Check recursively all links up to given depth. A negative depth will enable infinite recursion.</string>
</property>
<property name="text">
<string>Recursive depth</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="recursionlevel">
<property name="toolTip">
<string>Check recursively all links up to given depth. A negative depth will enable infinite recursion.</string>
</property>
<property name="minimum">
<number>-1</number>
</property>
<property name="maximum">
<number>100</number>
</property>
<property name="value">
<number>-1</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="toolTip">
<string>Log all checked URLs once. Default is to log only errors and warnings.</string>
</property>
<property name="text">
<string>Verbose output</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="verbose">
<property name="enabled">
<bool>true</bool>
</property>
<property name="toolTip">
<string>Log all checked URLs once. Default is to log only errors and warnings.</string>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="toolTip">
<string>Set the timeout for connection attempts in seconds.</string>
</property>
<property name="text">
<string>Timeout</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="timeout">
<property name="toolTip">
<string>Set the timeout for connection attempts in seconds.</string>
</property>
<property name="suffix">
<string> seconds</string>
</property>
<property name="minimum">
<number>2</number>
</property>
<property name="maximum">
<number>300</number>
</property>
<property name="value">
<number>60</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="toolTip">
<string>Generate no more than the given number of threads.</string>
</property>
<property name="text">
<string>Number of threads</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QSpinBox" name="threads">
<property name="toolTip">
<string>Generate no more than the given number of threads.</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>20</number>
</property>
<property name="value">
<number>10</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Debug</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="debug">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="resetButton">
<property name="toolTip">
<string>Reset all options to default values.</string>
</property>
<property name="text">
<string>Reset</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="closeButton">
<property name="text">
<string>Close</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>