Wed, 11 Aug 2010 09:42:20 +0200
Continued porting signal/slot usage to the new API.
--- a/Helpviewer/CookieJar/CookieJar.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/CookieJar/CookieJar.py Wed Aug 11 09:42:20 2010 +0200 @@ -24,6 +24,8 @@ @signal cookiesChanged() emitted after the cookies have been changed """ + cookiesChanged = pyqtSignal() + JAR_VERSION = 23 AcceptAlways = 0 @@ -115,7 +117,7 @@ self.setAllCookies([]) self.__saveTimer.changeOccurred() - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit() def load(self): """ @@ -154,7 +156,7 @@ Preferences.getHelp("FilterTrackingCookies")) self.__loaded = True - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit() def save(self): """ @@ -200,7 +202,7 @@ if oldCount == len(cookies): return self.setAllCookies(cookies) - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit() def cookiesForUrl(self, url): """ @@ -278,7 +280,7 @@ if addedCookies: self.__saveTimer.changeOccurred() - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit() return addedCookies @@ -463,7 +465,7 @@ if changed: self.setAllCookies(cookiesList) self.__saveTimer.changeOccurred() - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit() def cookies(self): """ @@ -487,4 +489,4 @@ self.setAllCookies(cookies) self.__saveTimer.changeOccurred() - self.emit(SIGNAL("cookiesChanged()")) + self.cookiesChanged.emit()
--- a/Helpviewer/CookieJar/CookieModel.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/CookieJar/CookieModel.py Wed Aug 11 09:42:20 2010 +0200 @@ -32,7 +32,7 @@ self.trUtf8("Contents"), ] self.__cookieJar = cookieJar - self.connect(self.__cookieJar, SIGNAL("cookiesChanged()"), self.__cookiesChanged) + self.__cookieJar.cookiesChanged.connect(self.__cookiesChanged) self.__cookieJar.load() def headerData(self, section, orientation, role):
--- a/Helpviewer/CookieJar/CookiesDialog.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/CookieJar/CookiesDialog.py Wed Aug 11 09:42:20 2010 +0200 @@ -44,16 +44,12 @@ model = CookieModel(cookieJar, self) self.__proxyModel = QSortFilterProxyModel(self) self.__proxyModel.setSourceModel(model) - self.connect(self.searchEdit, SIGNAL("textChanged(QString)"), - self.__proxyModel.setFilterFixedString) + self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString) self.cookiesTable.setModel(self.__proxyModel) self.cookiesTable.doubleClicked.connect(self.__showCookieDetails) - self.connect(self.cookiesTable.selectionModel(), - SIGNAL("selectionChanged(const QItemSelection&, const QItemSelection&)"), - self.__tableSelectionChanged) - self.connect(self.cookiesTable.model(), - SIGNAL("modelReset()"), - self.__tableModelReset) + self.cookiesTable.selectionModel().selectionChanged.connect( + self.__tableSelectionChanged) + self.cookiesTable.model().modelReset.connect(self.__tableModelReset) fm = QFontMetrics(QFont()) height = fm.height() + fm.height() // 3 @@ -135,4 +131,4 @@ """ Private slot to handle a reset of the cookies table. """ - self.addButton.setEnabled(False) \ No newline at end of file + self.addButton.setEnabled(False)
--- a/Helpviewer/CookieJar/CookiesExceptionsDialog.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/CookieJar/CookiesExceptionsDialog.py Wed Aug 11 09:42:20 2010 +0200 @@ -43,8 +43,7 @@ self.__exceptionsModel = CookieExceptionsModel(cookieJar) self.__proxyModel = QSortFilterProxyModel(self) self.__proxyModel.setSourceModel(self.__exceptionsModel) - self.connect(self.searchEdit, SIGNAL("textChanged(QString)"), - self.__proxyModel.setFilterFixedString) + self.searchEdit.textChanged.connect(self.__proxyModel.setFilterFixedString) self.exceptionsTable.setModel(self.__proxyModel) cookieModel = CookieModel(cookieJar, self) @@ -105,4 +104,4 @@ """ Private slot to allow cookies of a domain. """ - self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Allow) \ No newline at end of file + self.__exceptionsModel.addRule(self.domainEdit.text(), CookieJar.Allow)
--- a/Helpviewer/DownloadDialog.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/DownloadDialog.py Wed Aug 11 09:42:20 2010 +0200 @@ -83,12 +83,9 @@ self.__url = self.__reply.url() self.__reply.setParent(self) self.__reply.readyRead[()].connect(self.__readyRead) - self.connect(self.__reply, SIGNAL("error(QNetworkReply::NetworkError)"), - self.__networkError) - self.connect(self.__reply, SIGNAL("downloadProgress(qint64, qint64)"), - self.__downloadProgress) - self.connect(self.__reply, SIGNAL("metaDataChanged()"), - self.__metaDataChanged) + self.__reply.error.connect(self.__networkError) + self.__reply.downloadProgress.connect(self.__downloadProgress) + self.__reply.metaDataChanged.connect(self.__metaDataChanged) self.__reply.finished[()].connect(self.__finished) # reset info @@ -433,4 +430,4 @@ self.__reply.close() self.__reply.deleteLater() - self.done.emit() \ No newline at end of file + self.done.emit()
--- a/Helpviewer/HelpBrowserWV.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpBrowserWV.py Wed Aug 11 09:42:20 2010 +0200 @@ -295,6 +295,12 @@ @signal highlighted(const QString&) emitted, when the mouse hovers over a link @signal search(const QUrl &) emitted, when a search is requested """ + sourceChanged = pyqtSignal(QUrl) + forwardAvailable = pyqtSignal(bool) + backwardAvailable = pyqtSignal(bool) + highlighted = pyqtSignal(str) + search = pyqtSignal(QUrl) + def __init__(self, parent = None, name = ""): """ Constructor @@ -327,39 +333,31 @@ self.__javaScriptBinding = None self.__javaScriptEricObject = None - self.connect(self.mw, SIGNAL("zoomTextOnlyChanged(bool)"), self.__applyZoom) + self.mw.zoomTextOnlyChanged.connect(self.__applyZoom) self.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) - self.connect(self, SIGNAL('linkClicked(const QUrl &)'), self.setSource) - self.connect(self, SIGNAL('iconChanged()'), self.__iconChanged) + self.linkClicked.connect(self.setSource) + self.iconChanged.connect(self.__iconChanged) - self.connect(self, SIGNAL('urlChanged(const QUrl &)'), self.__urlChanged) - self.connect(self, SIGNAL('statusBarMessage(const QString &)'), - self.__statusBarMessage) - self.connect(self.page(), - SIGNAL('linkHovered(const QString &, const QString &, const QString &)'), - self.__linkHovered) + self.urlChanged.connect(self.__urlChanged) + self.statusBarMessage.connect(self.__statusBarMessage) + self.page().linkHovered.connect(self.__linkHovered) - self.connect(self, SIGNAL('loadStarted()'), self.__loadStarted) - self.connect(self, SIGNAL('loadProgress(int)'), self.__loadProgress) - self.connect(self, SIGNAL('loadFinished(bool)'), self.__loadFinished) + self.loadStarted.connect(self.__loadStarted) + self.loadProgress.connect(self.__loadProgress) + self.loadFinished.connect(self.__loadFinished) self.page().setForwardUnsupportedContent(True) - self.connect(self.page(), SIGNAL('unsupportedContent(QNetworkReply *)'), - self.__unsupportedContent) + self.page().unsupportedContent.connect(self.__unsupportedContent) - self.connect(self.page(), SIGNAL('downloadRequested(const QNetworkRequest &)'), - self.__downloadRequested) - self.connect(self.page(), SIGNAL("frameCreated(QWebFrame *)"), - self.__addExternalBinding) + self.page().downloadRequested.connect(self.__downloadRequested) + self.page().frameCreated.connect(self.__addExternalBinding) self.__addExternalBinding(self.page().mainFrame()) - self.connect(self.page(), SIGNAL('databaseQuotaExceeded(QWebFrame*, QString)'), - self.__databaseQuotaExceeded) + self.page().databaseQuotaExceeded.connect(self.__databaseQuotaExceeded) - self.connect(self.mw.openSearchManager(), - SIGNAL("currentEngineChanged()"), - self.__currentEngineChanged) + self.mw.openSearchManager().currentEngineChanged.connect( + self.__currentEngineChanged) def __addExternalBinding(self, frame = None): """ @@ -386,8 +384,7 @@ frame.addToJavaScriptWindowObject("eric", self.__javaScriptEricObject) else: # called from QWebPage.frameCreated - self.connect(frame, SIGNAL("javaScriptWindowObjectCleared()"), - self.__addExternalBinding) + frame.javaScriptWindowObjectCleared.connect(self.__addExternalBinding) frame.addToJavaScriptWindowObject("external", self.__javaScriptBinding) def linkedResources(self, relation = ""): @@ -760,8 +757,7 @@ act = OpenSearchEngineAction(engine, self.__searchMenu) self.__searchMenu.addAction(act) act.setData(engineName) - self.connect(self.__searchMenu, SIGNAL("triggered(QAction *)"), - self.__searchRequested) + self.__searchMenu.triggered.connect(self.__searchRequested) menu.addSeparator() @@ -861,7 +857,7 @@ engineName = act.data() if engineName: engine = self.mw.openSearchManager().engine(engineName) - self.emit(SIGNAL("search(const QUrl &)"), engine.searchUrl(searchText)) + self.search.connect(engine.searchUrl(searchText)) def __addSearchEngine(self): """ @@ -1013,10 +1009,10 @@ @param url the new url (QUrl) """ - self.emit(SIGNAL('sourceChanged(const QUrl &)'), url) + self.sourceChanged.emit(url) - self.emit(SIGNAL('forwardAvailable(bool)'), self.isForwardAvailable()) - self.emit(SIGNAL('backwardAvailable(bool)'), self.isBackwardAvailable()) + self.forwardAvailable.emit(self.isForwardAvailable()) + self.backwardAvailable.emit(self.isBackwardAvailable()) def __statusBarMessage(self, text): """ @@ -1034,7 +1030,7 @@ @param title the link title (string) @param textContent text content of the link (string) """ - self.emit(SIGNAL('highlighted(const QString&)'), link) + self.highlighted.emit(link) ############################################################################ ## Signal handlers below @@ -1121,7 +1117,7 @@ requestFilename = Preferences.getUI("RequestDownloadFilename") dlg = DownloadDialog(reply, requestFilename, self.page(), download) if dlg.initialize(): - self.connect(dlg, SIGNAL("done()"), self.__downloadDone) + dlg.done[()].connect(self.__downloadDone) self.__downloadWindows.append(dlg) dlg.show() self.setUrl(self.url()) @@ -1155,7 +1151,7 @@ ) self.setHtml(html, replyUrl) self.mw.historyManager().removeHistoryEntry(replyUrl, self.title()) - self.emit(SIGNAL('loadFinished(bool)'), False) + self.loadFinished.emit(False) def __downloadDone(self): """ @@ -1163,7 +1159,7 @@ """ dlg = self.sender() if dlg in self.__downloadWindows: - self.disconnect(dlg, SIGNAL("done()"), self.__downloadDone) + dlg.done[()].disconnect(self.__downloadDone) def __downloadRequested(self, request): """
--- a/Helpviewer/HelpDocsInstaller.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpDocsInstaller.py Wed Aug 11 09:42:20 2010 +0200 @@ -23,6 +23,9 @@ the installation of the documentation @signal docsInstalled(bool) emitted after the installation has finished """ + errorMessage = pyqtSignal(str) + docsInstalled = pyqtSignal(bool) + def __init__(self, collection): """ Constructor @@ -74,7 +77,7 @@ changes |= self.__installEric5Doc(engine) engine = None del engine - self.emit(SIGNAL("docsInstalled(bool)"), changes) + self.docsInstalled.emit(changes) def __installQtDoc(self, name, engine): """ @@ -122,7 +125,7 @@ engine.unregisterDocumentation(namespace) if not engine.registerDocumentation(fi.absoluteFilePath()): - self.emit(SIGNAL("errorMessage(const QString&)"), + self.errorMessage.emit( self.trUtf8("""<p>The file <b>{0}</b> could not be registered.""" """<br/>Reason: {1}</p>""")\ .format(fi.absoluteFilePath, engine.error()) @@ -179,7 +182,7 @@ engine.unregisterDocumentation(namespace) if not engine.registerDocumentation(fi.absoluteFilePath()): - self.emit(SIGNAL("errorMessage(const QString&)"), + self.errorMessage.emit( self.trUtf8("""<p>The file <b>{0}</b> could not be registered.""" """<br/>Reason: {1}</p>""")\ .format(fi.absoluteFilePath, engine.error())
--- a/Helpviewer/HelpIndexWidget.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpIndexWidget.py Wed Aug 11 09:42:20 2010 +0200 @@ -21,6 +21,10 @@ multiple targets is activated @signal escapePressed() emitted when the ESC key was pressed """ + linkActivated = pyqtSignal(QUrl) + linksActivated = pyqtSignal(dict, str) + escapePressed = pyqtSignal() + def __init__(self, engine, mainWindow, parent = None): """ Constructor @@ -43,19 +47,15 @@ self.__searchEdit = QLineEdit() l.setBuddy(self.__searchEdit) - self.connect(self.__searchEdit, SIGNAL("textChanged(QString)"), - self.__filterIndices) + self.__searchEdit.textChanged.connect(self.__filterIndices) self.__searchEdit.installEventFilter(self) self.__layout.addWidget(self.__searchEdit) self.__index = self.__engine.indexWidget() self.__index.installEventFilter(self) - self.connect(self.__engine.indexModel(), SIGNAL("indexCreationStarted()"), - self.__disableSearchEdit) - self.connect(self.__engine.indexModel(), SIGNAL("indexCreated()"), - self.__enableSearchEdit) - self.connect(self.__index, SIGNAL("activated(const QModelIndex&)"), - self.__activated) + self.__engine.indexModel().indexCreationStarted.connect(self.__disableSearchEdit) + self.__engine.indexModel().indexCreated.connect(self.__enableSearchEdit) + self.__index.activated.connect(self.__activated) self.__searchEdit.returnPressed.connect(self.__index.activateCurrentItem) self.__layout.addWidget(self.__index) @@ -72,10 +72,9 @@ keyword = model.data(idx, Qt.DisplayRole) links = model.linksForKeyword(keyword) if len(links) == 1: - self.emit(SIGNAL("linkActivated(const QUrl&)"), - QUrl(links[list(links.keys())[0]])) + self.linkActivated.emit(QUrl(links[list(links.keys())[0]])) else: - self.emit(SIGNAL("linksActivated"), links, keyword) + self.linksActivated.emit(links, keyword) def __filterIndices(self, filter): """ @@ -133,7 +132,7 @@ if idx.isValid(): self.__index.setCurrentIndex(idx) elif event.key() == Qt.Key_Escape: - self.emit(SIGNAL("escapePressed()")) + self.escapePressed.emit() elif self.__index and watched == self.__index and \ event.type() == QEvent.ContextMenu: idx = self.__index.indexAt(event.pos())
--- a/Helpviewer/HelpLanguagesDialog.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpLanguagesDialog.py Wed Aug 11 09:42:20 2010 +0200 @@ -29,9 +29,7 @@ self.__model = QStringListModel() self.languagesList.setModel(self.__model) - self.connect(self.languagesList.selectionModel(), - SIGNAL("currentChanged(const QModelIndex&, const QModelIndex&)"), - self.__currentChanged) + self.languagesList.selectionModel().currentChanged.connect(self.__currentChanged) languages = Preferences.toList(Preferences.Prefs.settings.value( "Help/AcceptLanguages", self.defaultAcceptLanguages()))
--- a/Helpviewer/HelpSearchWidget.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpSearchWidget.py Wed Aug 11 09:42:20 2010 +0200 @@ -17,6 +17,9 @@ @signal linkActivated(const QUrl&) emitted when a search result entry is activated @signal escapePressed() emitted when the ESC key was pressed """ + linkActivated = pyqtSignal(QUrl) + escapePressed = pyqtSignal() + def __init__(self, engine, mainWindow, parent = None): """ Constructor @@ -40,15 +43,11 @@ self.setFocusProxy(self.__query) - self.connect(self.__query, SIGNAL("search()"), - self.__search) - self.connect(self.__result, SIGNAL("requestShowLink(const QUrl&)"), - self, SIGNAL("linkActivated(const QUrl&)")) + self.__query.search.connect(self.__search) + self.__result.requestShowLink.connect(self.linkActivated) - self.connect(self.__engine, SIGNAL("searchingStarted()"), - self.__searchingStarted) - self.connect(self.__engine, SIGNAL("searchingFinished(int)"), - self.__searchingFinished) + self.__engine.searchingStarted.connect(self.__searchingStarted) + self.__engine.searchingFinished.connect(self.__searchingFinished) self.__browser = self.__result.findChildren(QTextBrowser)[0] if self.__browser: @@ -101,7 +100,7 @@ @param evt reference to the key press event (QKeyEvent) """ if evt.key() == Qt.Key_Escape: - self.emit(SIGNAL("escapePressed()")) + self.escapePressed.emit() else: evt.ignore() @@ -131,6 +130,6 @@ menu.move(evt.globalPos()) act = menu.exec_() if act == curTab: - self.emit(SIGNAL("linkActivated(const QUrl&)"), link) + self.linkActivated.emit(link) elif act == newTab: - self.__mw.newTab(link) \ No newline at end of file + self.__mw.newTab(link)
--- a/Helpviewer/HelpTocWidget.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpTocWidget.py Wed Aug 11 09:42:20 2010 +0200 @@ -17,6 +17,9 @@ @signal linkActivated(const QUrl&) emitted when a TOC entry is activated @signal escapePressed() emitted when the ESC key was pressed """ + linkActivated = pyqtSignal(QUrl) + escapePressed = pyqtSignal() + def __init__(self, engine, mainWindow, parent = None): """ Constructor @@ -39,11 +42,10 @@ self.__layout.addWidget(self.__tocWidget) self.__tocWidget.customContextMenuRequested.connect(self.__showContextMenu) - self.connect(self.__tocWidget, SIGNAL("linkActivated(const QUrl&)"), - self, SIGNAL("linkActivated(const QUrl&)")) + self.__tocWidget.linkActivated.connect(self.linkActivated) model = self.__tocWidget.model() - self.connect(model, SIGNAL("contentsCreated()"), self.__expandTOC) + model.contentsCreated.connect(self.__expandTOC) def __expandTOC(self): """ @@ -81,7 +83,7 @@ @param evt reference to the key press event (QKeyEvent) """ if evt.key() == Qt.Key_Escape: - self.emit(SIGNAL("escapePressed()")) + self.escapePressed.emit() def eventFilter(self, watched, event): """ @@ -116,7 +118,7 @@ model = self.__tocWidget.model() itm = model.contentItemAt(index) if itm: - self.emit(SIGNAL("linkActivated(const QUrl&)"), itm.url()) + self.linkActivated.emit(itm.url()) def syncToContent(self, url): """ @@ -150,6 +152,6 @@ act = menu.exec_() if act == curTab: - self.emit(SIGNAL("linkActivated(const QUrl&)"), itm.url()) + self.linkActivated.emit(itm.url()) elif act == newTab: self.__mw.newTab(itm.url())
--- a/Helpviewer/HelpTopicDialog.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpTopicDialog.py Wed Aug 11 09:42:20 2010 +0200 @@ -8,7 +8,7 @@ """ from PyQt4.QtGui import QDialog -from PyQt4.QtCore import SIGNAL, QUrl +from PyQt4.QtCore import QUrl from .Ui_HelpTopicDialog import Ui_HelpTopicDialog @@ -38,8 +38,7 @@ self.topicsList.setCurrentRow(0) self.topicsList.setFocus() - self.connect(self.topicsList, SIGNAL("itemActivated(QListWidgetItem*)"), - self.accept) + self.topicsList.itemActivated.connect(self.accept) def link(self): """
--- a/Helpviewer/HelpWindow.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/HelpWindow.py Wed Aug 11 09:42:20 2010 +0200 @@ -67,6 +67,9 @@ @signal zoomTextOnlyChanged(bool) emitted after the zoom text only setting was changed """ + zoomTextOnlyChanged = pyqtSignal(bool) + helpClosed = pyqtSignal() + helpwindows = [] maxMenuFilePathLen = 75 @@ -243,9 +246,7 @@ # index window self.connect(self.__indexWindow, SIGNAL("linkActivated(const QUrl&)"), self.__linkActivated) - self.connect(self.__indexWindow, - SIGNAL("linksActivated"), - self.__linksActivated) + self.__indexWindow.linksActivated.connect(self.__linksActivated) self.connect(self.__indexWindow, SIGNAL("escapePressed()"), self.__activateCurrentBrowser) # search window @@ -2126,8 +2127,7 @@ """ browser = HelpBrowser(self) - self.connect(browser, SIGNAL('sourceChanged(const QUrl &)'), - self.__sourceChanged) + browser.sourceChanged.connect(self.__sourceChanged) self.connect(browser, SIGNAL("titleChanged(const QString&)"), self.__titleChanged) index = self.tabWidget.addTab(browser, self.trUtf8("...")) @@ -2146,18 +2146,14 @@ self.__elide(browser.documentTitle().replace("&", "&&"))) self.tabWidget.setTabToolTip(index, browser.documentTitle()) - self.connect(browser, SIGNAL('highlighted(const QString&)'), - self.statusBar(), SLOT('showMessage(const QString&)')) - self.connect(browser, SIGNAL('backwardAvailable(bool)'), - self.__setBackwardAvailable) - self.connect(browser, SIGNAL('forwardAvailable(bool)'), - self.__setForwardAvailable) + browser.highlighted.connect(self.statusBar().showMessage) + browser.backwardAvailable.connect(self.__setBackwardAvailable) + browser.forwardAvailable.connect(self.__setForwardAvailable) self.connect(browser.page(), SIGNAL('windowCloseRequested()'), self.__windowCloseRequested) self.connect(browser.page(), SIGNAL('printRequested(QWebFrame*)'), self.__printRequested) - self.connect(browser, SIGNAL("search(const QUrl &)"), - self.newTab) + browser.search.connect(self.newTab) self.closeAct.setEnabled(True) self.closeAllAct.setEnabled(True) @@ -3013,4 +3009,4 @@ else: print(codecs[offset]) QWebSettings.globalSettings().setDefaultTextEncoding(codecs[offset]) - Preferences.setHelp("DefaultTextEncoding", codecs[offset]) \ No newline at end of file + Preferences.setHelp("DefaultTextEncoding", codecs[offset])
--- a/Helpviewer/OpenSearch/OpenSearchManager.py Tue Aug 10 19:40:44 2010 +0200 +++ b/Helpviewer/OpenSearch/OpenSearchManager.py Wed Aug 11 09:42:20 2010 +0200 @@ -32,6 +32,9 @@ @signal currentEngineChanged() emitted to indicate a change of the current search engine """ + changed = pyqtSignal() + currentEngineChanged = pyqtSignal() + def __init__(self, parent = None): """ Constructor @@ -514,4 +517,4 @@ """ Public slot to tell the search engine manager, that something has changed. """ - self.emit(SIGNAL("changed()")) \ No newline at end of file + self.emit(SIGNAL("changed()"))