Make comments and docstrings comply with PEP8
This commit is contained in:
@@ -362,8 +362,8 @@ class GuiExportMain(QWidget):
|
||||
"Comments are exported as LaTeX comments."
|
||||
),
|
||||
FMT_PDOC : (
|
||||
"Exports first to markdown or html5. The file is then passed on to Pandoc for a second "
|
||||
"stage. Use the Pandoc tab for settings up the conversion."
|
||||
"Exports first to markdown or html5. The file is then passed on to Pandoc for a "
|
||||
"second stage. Use the Pandoc tab for settings up the conversion."
|
||||
),
|
||||
}
|
||||
|
||||
@@ -537,7 +537,8 @@ class GuiExportMain(QWidget):
|
||||
##
|
||||
|
||||
def _updateFormat(self, currIdx):
|
||||
"""Update help text under output format selection and file extension in file box
|
||||
"""Update help text under output format selection and file
|
||||
extension in file box
|
||||
"""
|
||||
if currIdx == -1:
|
||||
self.outputHelp.setText("")
|
||||
|
||||
@@ -51,9 +51,15 @@ class GuiSessionLogView(QDialog):
|
||||
self.setMinimumWidth(420)
|
||||
self.setMinimumHeight(400)
|
||||
|
||||
widthCol0 = self.optState.validIntRange(self.optState.getSetting("widthCol0"), 30, 999, 180)
|
||||
widthCol1 = self.optState.validIntRange(self.optState.getSetting("widthCol1"), 30, 999, 80)
|
||||
widthCol2 = self.optState.validIntRange(self.optState.getSetting("widthCol2"), 30, 999, 80)
|
||||
widthCol0 = self.optState.validIntRange(
|
||||
self.optState.getSetting("widthCol0"), 30, 999, 180
|
||||
)
|
||||
widthCol1 = self.optState.validIntRange(
|
||||
self.optState.getSetting("widthCol1"), 30, 999, 80
|
||||
)
|
||||
widthCol2 = self.optState.validIntRange(
|
||||
self.optState.getSetting("widthCol2"), 30, 999, 80
|
||||
)
|
||||
|
||||
self.listBox = QTreeWidget()
|
||||
self.listBox.setHeaderLabels(["Session Start","Length","Words",""])
|
||||
|
||||
@@ -136,9 +136,9 @@ class GuiDocEditor(QTextEdit):
|
||||
return True
|
||||
|
||||
def initEditor(self):
|
||||
"""Initialise or re-initialise the editor with the user's settings.
|
||||
This function is both called when the editor is created, and when the user changes the
|
||||
main editor preferences.
|
||||
"""Initialise or re-initialise the editor with the user's
|
||||
settings. This function is both called when the editor is
|
||||
created, and when the user changes the main editor preferences.
|
||||
"""
|
||||
|
||||
# Reload dictionaries
|
||||
@@ -179,10 +179,12 @@ class GuiDocEditor(QTextEdit):
|
||||
# Initialise the syntax highlighter
|
||||
self.hLight.initHighlighter()
|
||||
|
||||
# If we have a document open, we should reload it in case the font changed, otherwise
|
||||
# we just clear the editor entirely, which makes it read only.
|
||||
# If we have a document open, we should reload it in case the
|
||||
# font changed, otherwise we just clear the editor entirely,
|
||||
# which makes it read only.
|
||||
if self.theHandle is not None:
|
||||
# We must save the current handle as clearEditor() sets it to None
|
||||
# We must save the current handle as clearEditor() sets it
|
||||
# to None
|
||||
tHandle = self.theHandle
|
||||
self.clearEditor()
|
||||
self.loadText(tHandle)
|
||||
@@ -193,11 +195,13 @@ class GuiDocEditor(QTextEdit):
|
||||
return True
|
||||
|
||||
def loadText(self, tHandle):
|
||||
"""Load text from a document into the editor. If we have an io error, we must handle this
|
||||
and clear the editor so that we don't risk overwriting the file if it exists. This can for
|
||||
instance happen of the file contains binary elements or an encoding that novelWriter does
|
||||
not support. If load is successful, ot the document is new (empty string) we set up the
|
||||
editor for editing the file.
|
||||
"""Load text from a document into the editor. If we have an io
|
||||
error, we must handle this and clear the editor so that we don't
|
||||
risk overwriting the file if it exists. This can for instance
|
||||
happen of the file contains binary elements or an encoding that
|
||||
novelWriter does not support. If load is successful, or the
|
||||
document is new (empty string) we set up the editor for editing
|
||||
the file.
|
||||
"""
|
||||
|
||||
theDoc = self.nwDocument.openDocument(tHandle)
|
||||
@@ -251,8 +255,9 @@ class GuiDocEditor(QTextEdit):
|
||||
return self.docChanged
|
||||
|
||||
def getText(self):
|
||||
"""Get the text content of the current document. This method uses QTextEdit->toPlainText for
|
||||
Qt versions lower than 5.9, and the QDocument->toRawText for higher version. The latter
|
||||
"""Get the text content of the current document. This method
|
||||
uses QTextEdit->toPlainText for Qt versions lower than 5.9, and
|
||||
the QDocument->toRawText for higher version. The latter
|
||||
preserves non-breaking spaces, which the former does not.
|
||||
"""
|
||||
if self.mainConf.verQtValue >= 50900:
|
||||
@@ -296,8 +301,8 @@ class GuiDocEditor(QTextEdit):
|
||||
##
|
||||
|
||||
def changeWidth(self):
|
||||
"""Automatically adjust the margins so the text is centred, but only if Config.textFixedW is
|
||||
set to True.
|
||||
"""Automatically adjust the margins so the text is centred, but
|
||||
only if Config.textFixedW is set to True.
|
||||
"""
|
||||
if self.mainConf.textFixedW:
|
||||
vBar = self.verticalScrollBar()
|
||||
@@ -322,23 +327,40 @@ class GuiDocEditor(QTextEdit):
|
||||
if not self.theParent.hasProject:
|
||||
logger.error("No project open")
|
||||
return False
|
||||
if theAction == nwDocAction.UNDO: self.undo()
|
||||
elif theAction == nwDocAction.REDO: self.redo()
|
||||
elif theAction == nwDocAction.CUT: self.cut()
|
||||
elif theAction == nwDocAction.COPY: self.copy()
|
||||
elif theAction == nwDocAction.PASTE: self.paste()
|
||||
elif theAction == nwDocAction.BOLD: self._wrapSelection("**","**")
|
||||
elif theAction == nwDocAction.ITALIC: self._wrapSelection("_","_")
|
||||
elif theAction == nwDocAction.U_LINE: self._wrapSelection("__","__")
|
||||
elif theAction == nwDocAction.S_QUOTE: self._wrapSelection(self.typSQOpen,self.typSQClose)
|
||||
elif theAction == nwDocAction.D_QUOTE: self._wrapSelection(self.typDQOpen,self.typDQClose)
|
||||
elif theAction == nwDocAction.SEL_ALL: self._makeSelection(QTextCursor.Document)
|
||||
elif theAction == nwDocAction.SEL_PARA: self._makeSelection(QTextCursor.BlockUnderCursor)
|
||||
elif theAction == nwDocAction.FIND: self._beginSearch()
|
||||
elif theAction == nwDocAction.REPLACE: self._beginReplace()
|
||||
elif theAction == nwDocAction.GO_NEXT: self._findNext()
|
||||
elif theAction == nwDocAction.GO_PREV: self._findPrev()
|
||||
elif theAction == nwDocAction.REPL_NEXT: self._replaceNext()
|
||||
if theAction == nwDocAction.UNDO:
|
||||
self.undo()
|
||||
elif theAction == nwDocAction.REDO:
|
||||
self.redo()
|
||||
elif theAction == nwDocAction.CUT:
|
||||
self.cut()
|
||||
elif theAction == nwDocAction.COPY:
|
||||
self.copy()
|
||||
elif theAction == nwDocAction.PASTE:
|
||||
self.paste()
|
||||
elif theAction == nwDocAction.BOLD:
|
||||
self._wrapSelection("**","**")
|
||||
elif theAction == nwDocAction.ITALIC:
|
||||
self._wrapSelection("_","_")
|
||||
elif theAction == nwDocAction.U_LINE:
|
||||
self._wrapSelection("__","__")
|
||||
elif theAction == nwDocAction.S_QUOTE:
|
||||
self._wrapSelection(self.typSQOpen,self.typSQClose)
|
||||
elif theAction == nwDocAction.D_QUOTE:
|
||||
self._wrapSelection(self.typDQOpen,self.typDQClose)
|
||||
elif theAction == nwDocAction.SEL_ALL:
|
||||
self._makeSelection(QTextCursor.Document)
|
||||
elif theAction == nwDocAction.SEL_PARA:
|
||||
self._makeSelection(QTextCursor.BlockUnderCursor)
|
||||
elif theAction == nwDocAction.FIND:
|
||||
self._beginSearch()
|
||||
elif theAction == nwDocAction.REPLACE:
|
||||
self._beginReplace()
|
||||
elif theAction == nwDocAction.GO_NEXT:
|
||||
self._findNext()
|
||||
elif theAction == nwDocAction.GO_PREV:
|
||||
self._findPrev()
|
||||
elif theAction == nwDocAction.REPL_NEXT:
|
||||
self._replaceNext()
|
||||
else:
|
||||
logger.error("Unknown or unsupported document action %s" % str(theAction))
|
||||
return False
|
||||
@@ -366,13 +388,15 @@ class GuiDocEditor(QTextEdit):
|
||||
|
||||
def keyPressEvent(self, keyEvent):
|
||||
"""Intercept key press events.
|
||||
We need to intercept key presses briefly to record the state of selection. This is in order
|
||||
to know whether we had a selection prior to triggering the _docChange slot, as we do not
|
||||
want to trigger autoreplace on selections. Autoreplace on selections messes with undo/redo
|
||||
history.
|
||||
We also need to intercept the Shift key modifier for certain key combinations that modifies
|
||||
standard keys like enter and space. However, we don't want to spend a lot of time in this
|
||||
function as it is triggered on every keypress when typing.
|
||||
We need to intercept key presses briefly to record the state of
|
||||
selection. This is in order to know whether we had a selection
|
||||
prior to triggering the _docChange slot, as we do not want to
|
||||
trigger autoreplace on selections. Autoreplace on selections
|
||||
messes with undo/redo history.
|
||||
We also need to intercept the Shift key modifier for certain key
|
||||
combinations that modifies standard keys like enter and space.
|
||||
However, we don't want to spend a lot of time in this function
|
||||
as it is triggered on every keypress when typing.
|
||||
"""
|
||||
|
||||
self.hasSelection = self.textCursor().hasSelection()
|
||||
@@ -393,8 +417,9 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def mouseReleaseEvent(self, mEvent):
|
||||
"""If the mouse button is released and the control key is pressed, check if we're clicking
|
||||
on a tag, and trigger the follow tag function.
|
||||
"""If the mouse button is released and the control key is
|
||||
pressed, check if we're clicking on a tag, and trigger the
|
||||
follow tag function.
|
||||
"""
|
||||
if qApp.keyboardModifiers() == Qt.ControlModifier:
|
||||
theCursor = self.cursorForPosition(mEvent.pos())
|
||||
@@ -407,9 +432,11 @@ class GuiDocEditor(QTextEdit):
|
||||
##
|
||||
|
||||
def _followTag(self, theCursor=None):
|
||||
"""Activated by Ctrl+Enter. Checks that we're in a block starting with '@'. We then find the
|
||||
word under the cursor and check that it is after the ':'. If all this is fine, we have a tag
|
||||
and can tell the document viewer to try and find and load the file where the tag is defined.
|
||||
"""Activated by Ctrl+Enter. Checks that we're in a block
|
||||
starting with '@'. We then find the word under the cursor and
|
||||
check that it is after the ':'. If all this is fine, we have a
|
||||
tag and can tell the document viewer to try and find and load
|
||||
the file where the tag is defined.
|
||||
"""
|
||||
|
||||
if theCursor is None:
|
||||
@@ -574,7 +601,8 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def _runCounter(self):
|
||||
"""Decide whether to run the word counter, or stop the timer due to inactivity.
|
||||
"""Decide whether to run the word counter, or stop the timer due
|
||||
to inactivity.
|
||||
"""
|
||||
sinceActive = time()-self.lastEdit
|
||||
if sinceActive > 5*self.wcInterval:
|
||||
@@ -603,9 +631,10 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def _wrapSelection(self, tBefore, tAfter):
|
||||
"""Wraps the selected text in whatever is in tBefore and tAfter. If there is no selection,
|
||||
the autoSelect setting decides the action. AutoSelect will select the word under the cursor
|
||||
before wrapping it. If this feature is disabled, nothing is done.
|
||||
"""Wraps the selected text in whatever is in tBefore and tAfter.
|
||||
If there is no selection, the autoSelect setting decides the
|
||||
action. AutoSelect will select the word under the cursor before
|
||||
wrapping it. If this feature is disabled, nothing is done.
|
||||
"""
|
||||
theCursor = self.textCursor()
|
||||
if self.mainConf.autoSelect and not theCursor.hasSelection():
|
||||
@@ -643,15 +672,16 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def _beginReplace(self):
|
||||
"""Opens the replace line of the search bar and sets the replace text.
|
||||
"""Opens the replace line of the search bar and sets the replace
|
||||
text.
|
||||
"""
|
||||
self._beginSearch()
|
||||
self.theParent.searchBar.setReplaceText("")
|
||||
return
|
||||
|
||||
def _findNext(self):
|
||||
"""Searches for the next occurrence of the search bar text in the document.
|
||||
Wraps back to the top if not found.
|
||||
"""Searches for the next occurrence of the search bar text in
|
||||
the document. Wraps back to the top if not found.
|
||||
"""
|
||||
searchFor = self.theParent.searchBar.getSearchText()
|
||||
wasFound = self.find(searchFor)
|
||||
@@ -662,8 +692,8 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def _findPrev(self):
|
||||
"""Searches for the previous occurrence of the search bar text in the document.
|
||||
Wraps back to the end if not found.
|
||||
"""Searches for the previous occurrence of the search bar text
|
||||
in the document. Wraps back to the end if not found.
|
||||
"""
|
||||
searchFor = self.theParent.searchBar.getSearchText()
|
||||
wasFound = self.find(searchFor, QTextDocument.FindBackward)
|
||||
@@ -674,8 +704,9 @@ class GuiDocEditor(QTextEdit):
|
||||
return
|
||||
|
||||
def _replaceNext(self):
|
||||
"""Searches for the next occurrence of the search bar text in the document and replaces it
|
||||
with the replace text. Wraps back to the top if not found.
|
||||
"""Searches for the next occurrence of the search bar text in
|
||||
the document and replaces it with the replace text. Wraps back
|
||||
to the top if not found.
|
||||
"""
|
||||
theCursor = self.textCursor()
|
||||
searchFor = self.theParent.searchBar.getSearchText()
|
||||
|
||||
+18
-14
@@ -129,7 +129,8 @@ class GuiDocTree(QTreeWidget):
|
||||
tHandle = self.theProject.newRoot(nwLabels.CLASS_NAME[itemClass], itemClass)
|
||||
|
||||
else:
|
||||
# If no parent has been selected, make the new file under the root NOVEL item.
|
||||
# If no parent has been selected, make the new file under
|
||||
# the root NOVEL item.
|
||||
if pHandle is None:
|
||||
pHandle = self.theProject.findRootItem(nwItemClass.NOVEL)
|
||||
|
||||
@@ -138,7 +139,8 @@ class GuiDocTree(QTreeWidget):
|
||||
logger.error("Did not find anywhere to add the item!")
|
||||
return False
|
||||
|
||||
# Now check if the selected item is a file, in which case the new file will be a sibling
|
||||
# Now check if the selected item is a file, in which case
|
||||
# the new file will be a sibling
|
||||
pItem = self.theProject.getItem(pHandle)
|
||||
if pItem.itemType == nwItemType.FILE:
|
||||
pHandle = pItem.parHandle
|
||||
@@ -177,8 +179,8 @@ class GuiDocTree(QTreeWidget):
|
||||
return True
|
||||
|
||||
def moveTreeItem(self, nStep):
|
||||
"""Move an item up or down in the tree, but only if the treeView has focus. This also
|
||||
applies when the menu is used.
|
||||
"""Move an item up or down in the tree, but only if the treeView
|
||||
has focus. This also applies when the menu is used.
|
||||
"""
|
||||
if QApplication.focusWidget() == self and self.theParent.hasProject:
|
||||
tHandle = self.getSelectedHandle()
|
||||
@@ -225,10 +227,11 @@ class GuiDocTree(QTreeWidget):
|
||||
return retVals
|
||||
|
||||
def deleteItem(self, tHandle=None):
|
||||
"""Delete items from the tree. Note that this does not delete the item from the item tree in
|
||||
the project object. However, since this is only meta data, there isn't really a need to do
|
||||
that to save memory. Items not in the tree are not saved to the project file, so a loaded
|
||||
project will be clean anyway.
|
||||
"""Delete items from the tree. Note that this does not delete
|
||||
the item from the item tree in the project object. However,
|
||||
since this is only meta data, there isn't really a need to do
|
||||
that to save memory. Items not in the tree are not saved to the
|
||||
project file, so a loaded project will be clean anyway.
|
||||
"""
|
||||
|
||||
if tHandle is None:
|
||||
@@ -453,8 +456,9 @@ class GuiDocTree(QTreeWidget):
|
||||
return
|
||||
|
||||
def _updateItemParent(self, tHandle):
|
||||
"""Update the parent handle of an item so that the information in the project is consistent
|
||||
with the treeView. Also move the word count over to the new parent tree.
|
||||
"""Update the parent handle of an item so that the information
|
||||
in the project is consistent with the treeView. Also move the
|
||||
word count over to the new parent tree.
|
||||
"""
|
||||
|
||||
trItemS = self._getTreeItem(tHandle)
|
||||
@@ -496,8 +500,8 @@ class GuiDocTree(QTreeWidget):
|
||||
##
|
||||
|
||||
def mousePressEvent(self, theEvent):
|
||||
"""Overload mousePressEvent to clear selection if clicking the mouse in a blank
|
||||
area of the tree view.
|
||||
"""Overload mousePressEvent to clear selection if clicking the
|
||||
mouse in a blank area of the tree view.
|
||||
"""
|
||||
QTreeWidget.mousePressEvent(self, theEvent)
|
||||
selItem = self.indexAt(theEvent.pos())
|
||||
@@ -506,8 +510,8 @@ class GuiDocTree(QTreeWidget):
|
||||
return
|
||||
|
||||
def dropEvent(self, theEvent):
|
||||
"""Overload the drop of dragged item event to check whether the drop is allowed
|
||||
or not. Disallowed drops are cancelled.
|
||||
"""Overload the drop of dragged item event to check whether the
|
||||
drop is allowed or not. Disallowed drops are cancelled.
|
||||
"""
|
||||
sHandle = self.getSelectedHandle()
|
||||
if sHandle is None:
|
||||
|
||||
+4
-3
@@ -17,7 +17,7 @@ from PyQt5.QtCore import QUrl
|
||||
from PyQt5.QtGui import QIcon, QDesktopServices
|
||||
from PyQt5.QtWidgets import QMenuBar, QAction, QMessageBox
|
||||
|
||||
from nw.enum import nwItemType, nwItemClass, nwDocAction
|
||||
from nw.enum import nwItemType, nwItemClass, nwDocAction
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -122,8 +122,9 @@ class GuiMainMenu(QMenuBar):
|
||||
aboutMsg = (
|
||||
"<h3>About {name:s}</h3>"
|
||||
"<p>Version: {version:s}<br>Release Date: {date:s}</p>"
|
||||
"<p>{name:s} is a markdown-like text editor designed for organising and writing novels. "
|
||||
"It is written in Python 3 with a Qt5 GUI, using PyQt5</p>"
|
||||
"<p>{name:s} is a markdown-like text editor designed for organising "
|
||||
"and writing novels. It is written in Python 3 with a Qt5 GUI, "
|
||||
"using PyQt5</p>"
|
||||
"<p>{name:s} is licensed under GPL v3.0</p>"
|
||||
"<p>{copyright:s}</p>"
|
||||
"<p>Website: <a href='{website:s}'>{website:s}</a></p>"
|
||||
|
||||
+20
-12
@@ -244,7 +244,8 @@ class GuiMain(QMainWindow):
|
||||
|
||||
def closeProject(self, isYes=False):
|
||||
"""Closes the project if one is open.
|
||||
isYes is passed on from the close application event so the user doesn't get prompted twice.
|
||||
isYes is passed on from the close application event so the user
|
||||
doesn't get prompted twice.
|
||||
"""
|
||||
if not self.hasProject:
|
||||
# There is no project loaded, everything OK
|
||||
@@ -288,15 +289,17 @@ class GuiMain(QMainWindow):
|
||||
return saveOK
|
||||
|
||||
def openProject(self, projFile=None):
|
||||
"""Open a project. The parameter projFile is passed from the open recent projects menu, so
|
||||
can be set. If not, we pop the dialog.
|
||||
"""Open a project. The parameter projFile is passed from the
|
||||
open recent projects menu, so can be set. If not, we pop the
|
||||
dialog.
|
||||
"""
|
||||
if projFile is None:
|
||||
projFile = self.openProjectDialog()
|
||||
if projFile is None:
|
||||
return False
|
||||
|
||||
# Make sure any open project is cleared out first before we load another one
|
||||
# Make sure any open project is cleared out first before we load
|
||||
# another one
|
||||
if not self.closeProject():
|
||||
return False
|
||||
|
||||
@@ -629,8 +632,9 @@ class GuiMain(QMainWindow):
|
||||
return True
|
||||
|
||||
def makeAlert(self, theMessage, theLevel=nwAlert.INFO):
|
||||
"""Alert both the user and the logger at the same time. Message can be either a string or an
|
||||
array of strings. Severity level is 0 = info, 1 = warning, and 2 = error.
|
||||
"""Alert both the user and the logger at the same time. Message
|
||||
can be either a string or an array of strings. Severity level is
|
||||
0 = info, 1 = warning, and 2 = error.
|
||||
"""
|
||||
|
||||
if isinstance(theMessage, list):
|
||||
@@ -724,7 +728,8 @@ class GuiMain(QMainWindow):
|
||||
return True
|
||||
|
||||
def _autoSaveProject(self):
|
||||
if self.hasProject and self.theProject.projChanged and self.theProject.projPath is not None:
|
||||
if (self.hasProject and self.theProject.projChanged and
|
||||
self.theProject.projPath is not None):
|
||||
logger.debug("Autosaving project")
|
||||
self.saveProject(isAuto=True)
|
||||
return
|
||||
@@ -756,8 +761,8 @@ class GuiMain(QMainWindow):
|
||||
##
|
||||
|
||||
def resizeEvent(self, theEvent):
|
||||
"""Extend QMainWindow.resizeEvent to signal dependent GUI elements that its pane may have
|
||||
changed size.
|
||||
"""Extend QMainWindow.resizeEvent to signal dependent GUI
|
||||
elements that its pane may have changed size.
|
||||
"""
|
||||
QMainWindow.resizeEvent(self,theEvent)
|
||||
self.docEditor.changeWidth()
|
||||
@@ -803,7 +808,8 @@ class GuiMain(QMainWindow):
|
||||
return
|
||||
|
||||
def _keyPressEscape(self):
|
||||
"""When the escape key is pressed somewhere in the main window, do the following, in order.
|
||||
"""When the escape key is pressed somewhere in the main window,
|
||||
do the following, in order.
|
||||
"""
|
||||
if self.searchBar.isVisible():
|
||||
self.searchBar.setVisible(False)
|
||||
@@ -811,13 +817,15 @@ class GuiMain(QMainWindow):
|
||||
return
|
||||
|
||||
def _splitMainMove(self, pWidth, pHeight):
|
||||
"""Alert dependent GUI elements that the main pane splitter has been moved.
|
||||
"""Alert dependent GUI elements that the main pane splitter has
|
||||
been moved.
|
||||
"""
|
||||
self.docEditor.changeWidth()
|
||||
return
|
||||
|
||||
def _splitViewMove(self, pWidth, pHeight):
|
||||
"""Alert dependent GUI elements that the main pane splitter has been moved.
|
||||
"""Alert dependent GUI elements that the main pane splitter has
|
||||
been moved.
|
||||
"""
|
||||
self.docEditor.changeWidth()
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user