forked from qt-creator/qt-creator
Merge remote-tracking branch 'origin/9.0'
Conflicts: cmake/QtCreatorIDEBranding.cmake qbs/modules/qtc/qtc.qbs qtcreator_ide_branding.pri src/plugins/texteditor/texteditor.cpp Change-Id: I9c8f1331be3f5442f1fd28aeb0a9bc07128629d1
This commit is contained in:
22
README.md
22
README.md
@@ -157,15 +157,21 @@ like Qt and LLVM, additionally run
|
|||||||
|
|
||||||
cmake --install . --prefix /path/to/qtcreator_install --component Dependencies
|
cmake --install . --prefix /path/to/qtcreator_install --component Dependencies
|
||||||
|
|
||||||
### Performance Analyzer
|
### Perf Profiler Support
|
||||||
|
|
||||||
If you have not installed Qt with the Maintenance Tool, you must
|
Support for the [perf](https://perf.wiki.kernel.org/index.php/Main_Page) profiler
|
||||||
either set the path to the `perfparser` executable as a value of
|
requires the `perfparser` tool that is part of the Qt Creator source package, and also
|
||||||
the `PERFPROFILER_PARSER_FILEPATH` environment variable or copy
|
part of the Qt Creator Git repository in form of a submodule in `src/tools/perfparser`.
|
||||||
the executable to from the Qt Creator installation directory to
|
|
||||||
the build directory. That is, copy it from
|
Compilation of `perfparser` requires ELF and DWARF development packages.
|
||||||
`/path/to/qtcreator_install/Tools/QtCreator/libexec/qtcreator/` to
|
You can either download and extract a prebuilt package from
|
||||||
/path/to/qtcreator_buid/libexec/qtcreator/`.
|
https://download.qt.io/development_releases/prebuilt/elfutils/ and add the
|
||||||
|
directory to the `CMAKE_PREFIX_PATH` when configuring Qt Creator,
|
||||||
|
or install the `libdw-dev` package on Debian-style Linux systems.
|
||||||
|
|
||||||
|
You can also point Qt Creator to a separate installation of `perfparser` by
|
||||||
|
setting the `PERFPROFILER_PARSER_FILEPATH` environment variable to the full
|
||||||
|
path to the executable.
|
||||||
|
|
||||||
## Getting LLVM/Clang for the Clang Code Model
|
## Getting LLVM/Clang for the Clang Code Model
|
||||||
|
|
||||||
|
@@ -62,6 +62,8 @@ if(elfutils_FOUND)
|
|||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
else()
|
||||||
|
message(STATUS " (set ELFUTILS_INSTALL_DIR, or install libdw-dev on a Debian-like system)")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
mark_as_advanced(ELFUTILS_INCLUDE_DIR ELFUTILS_LIB_elf ELFUTILS_LIB_dw)
|
mark_as_advanced(ELFUTILS_INCLUDE_DIR ELFUTILS_LIB_elf ELFUTILS_LIB_dw)
|
||||||
|
@@ -39,6 +39,13 @@ def get_arguments():
|
|||||||
action='store_true', default=False)
|
action='store_true', default=False)
|
||||||
parser.add_argument('--build-type', help='Build type to pass to CMake (defaults to RelWithDebInfo)',
|
parser.add_argument('--build-type', help='Build type to pass to CMake (defaults to RelWithDebInfo)',
|
||||||
default='RelWithDebInfo')
|
default='RelWithDebInfo')
|
||||||
|
# zipping
|
||||||
|
parser.add_argument('--zip-threads', help='Sets number of threads to use for 7z. Use "+" for turning threads on '
|
||||||
|
'without a specific number of threads. This is directly passed to the "-mmt" option of 7z.',
|
||||||
|
default='2')
|
||||||
|
# signing
|
||||||
|
parser.add_argument('--keychain-unlock-script',
|
||||||
|
help='Path to script for unlocking the keychain used for signing (macOS)')
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
args.with_debug_info = args.build_type == 'RelWithDebInfo'
|
args.with_debug_info = args.build_type == 'RelWithDebInfo'
|
||||||
return args
|
return args
|
||||||
@@ -144,6 +151,21 @@ def package(args, paths):
|
|||||||
common.check_print_call(['7z', 'a', '-mmt2',
|
common.check_print_call(['7z', 'a', '-mmt2',
|
||||||
os.path.join(paths.result, args.name + '-debug.7z'), '*'],
|
os.path.join(paths.result, args.name + '-debug.7z'), '*'],
|
||||||
paths.debug_install)
|
paths.debug_install)
|
||||||
|
if common.is_mac_platform() and common.codesign_call():
|
||||||
|
if args.keychain_unlock_script:
|
||||||
|
common.check_print_call([args.keychain_unlock_script], paths.install)
|
||||||
|
if os.environ.get('SIGNING_IDENTITY'):
|
||||||
|
signed_install_path = paths.install + '-signed'
|
||||||
|
common.copytree(paths.install, signed_install_path, symlinks=True)
|
||||||
|
apps = [d for d in os.listdir(signed_install_path) if d.endswith('.app')]
|
||||||
|
if apps:
|
||||||
|
app = apps[0]
|
||||||
|
common.conditional_sign_recursive(os.path.join(signed_install_path, app),
|
||||||
|
lambda ff: ff.endswith('.dylib'))
|
||||||
|
common.check_print_call(['7z', 'a', '-mmt' + args.zip_threads,
|
||||||
|
os.path.join(paths.result, args.name + '-signed.7z'),
|
||||||
|
app],
|
||||||
|
signed_install_path)
|
||||||
|
|
||||||
def get_paths(args):
|
def get_paths(args):
|
||||||
Paths = collections.namedtuple('Paths',
|
Paths = collections.namedtuple('Paths',
|
||||||
|
@@ -110,9 +110,12 @@ def is_ignored_windows_file(use_debug, basepath, filename):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def ignored_qt_lib_files(path, filenames):
|
def ignored_qt_lib_files(path, filenames):
|
||||||
|
# Qt ships some unneeded object files in the qml plugins
|
||||||
|
# On Windows we also do not want to ship the wrong debug/release .dlls or .lib files etc
|
||||||
if not common.is_windows_platform():
|
if not common.is_windows_platform():
|
||||||
return []
|
return [fn for fn in filenames if fn.endswith('.cpp.o')]
|
||||||
return [fn for fn in filenames if is_ignored_windows_file(debug_build, path, fn)]
|
return [fn for fn in filenames
|
||||||
|
if fn.endswith('.cpp.obj') or is_ignored_windows_file(debug_build, path, fn)]
|
||||||
|
|
||||||
def copy_qt_libs(target_qt_prefix_path, qt_bin_dir, qt_libs_dir, qt_plugin_dir, qt_qml_dir, plugins):
|
def copy_qt_libs(target_qt_prefix_path, qt_bin_dir, qt_libs_dir, qt_plugin_dir, qt_qml_dir, plugins):
|
||||||
print("copying Qt libraries...")
|
print("copying Qt libraries...")
|
||||||
|
@@ -143,6 +143,9 @@ if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then
|
|||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# clean up unneeded object files that are part of Qt for some static libraries
|
||||||
|
find "$app_path" -ipath "*/objects-*" -delete
|
||||||
|
|
||||||
# clean up after macdeployqt
|
# clean up after macdeployqt
|
||||||
# it deploys some plugins (and libs for these) that interfere with what we want
|
# it deploys some plugins (and libs for these) that interfere with what we want
|
||||||
echo "Cleaning up after macdeployqt..."
|
echo "Cleaning up after macdeployqt..."
|
||||||
|
@@ -290,7 +290,10 @@ public:
|
|||||||
return val.isUndefined() ? std::nullopt : std::make_optional(fromJsonValue<Error>(val));
|
return val.isUndefined() ? std::nullopt : std::make_optional(fromJsonValue<Error>(val));
|
||||||
}
|
}
|
||||||
void setError(const Error &error)
|
void setError(const Error &error)
|
||||||
{ m_jsonObject.insert(errorKey, QJsonValue(error)); }
|
{
|
||||||
|
QTC_CHECK(error.isValid());
|
||||||
|
m_jsonObject.insert(errorKey, QJsonValue(error));
|
||||||
|
}
|
||||||
void clearError() { m_jsonObject.remove(errorKey); }
|
void clearError() { m_jsonObject.remove(errorKey); }
|
||||||
|
|
||||||
bool isValid(QString *errorMessage) const override
|
bool isValid(QString *errorMessage) const override
|
||||||
|
@@ -467,10 +467,9 @@ Utils::Text::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffe
|
|||||||
bool secondTry) const
|
bool secondTry) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(replacementsToKeep != ReplacementsToKeep::All, return Utils::Text::Replacements());
|
QTC_ASSERT(replacementsToKeep != ReplacementsToKeep::All, return Utils::Text::Replacements());
|
||||||
|
QTC_ASSERT(!m_fileName.isEmpty(), return {});
|
||||||
|
|
||||||
clang::format::FormatStyle style = styleForFile();
|
|
||||||
QByteArray originalBuffer = buffer;
|
QByteArray originalBuffer = buffer;
|
||||||
|
|
||||||
int utf8Offset = Utils::Text::utf8NthLineOffset(m_doc, buffer, startBlock.blockNumber() + 1);
|
int utf8Offset = Utils::Text::utf8NthLineOffset(m_doc, buffer, startBlock.blockNumber() + 1);
|
||||||
QTC_ASSERT(utf8Offset >= 0, return Utils::Text::Replacements(););
|
QTC_ASSERT(utf8Offset >= 0, return Utils::Text::Replacements(););
|
||||||
int utf8Length = selectedLines(m_doc, startBlock, endBlock).toUtf8().size();
|
int utf8Length = selectedLines(m_doc, startBlock, endBlock).toUtf8().size();
|
||||||
@@ -479,6 +478,7 @@ Utils::Text::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffe
|
|||||||
if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore)
|
if (replacementsToKeep == ReplacementsToKeep::IndentAndBefore)
|
||||||
rangeStart = formattingRangeStart(startBlock, buffer, lastSaveRevision());
|
rangeStart = formattingRangeStart(startBlock, buffer, lastSaveRevision());
|
||||||
|
|
||||||
|
clang::format::FormatStyle style = styleForFile();
|
||||||
adjustFormatStyleForLineBreak(style, replacementsToKeep);
|
adjustFormatStyleForLineBreak(style, replacementsToKeep);
|
||||||
if (replacementsToKeep == ReplacementsToKeep::OnlyIndent) {
|
if (replacementsToKeep == ReplacementsToKeep::OnlyIndent) {
|
||||||
CharacterContext currentCharContext = CharacterContext::Unknown;
|
CharacterContext currentCharContext = CharacterContext::Unknown;
|
||||||
@@ -527,6 +527,7 @@ Utils::Text::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffe
|
|||||||
Utils::Text::Replacements ClangFormatBaseIndenter::format(
|
Utils::Text::Replacements ClangFormatBaseIndenter::format(
|
||||||
const TextEditor::RangesInLines &rangesInLines)
|
const TextEditor::RangesInLines &rangesInLines)
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(!m_fileName.isEmpty(), return {});
|
||||||
if (rangesInLines.empty())
|
if (rangesInLines.empty())
|
||||||
return Utils::Text::Replacements();
|
return Utils::Text::Replacements();
|
||||||
|
|
||||||
|
@@ -441,6 +441,28 @@ static QString extractVisualStudioPlatformFromConfig(const CMakeConfig &config)
|
|||||||
return platform;
|
return platform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void updateCompilerPaths(CMakeConfig &config, const Environment &env)
|
||||||
|
{
|
||||||
|
auto updateRelativePath = [&config, env](const QByteArray &key) {
|
||||||
|
FilePath pathValue = config.filePathValueOf(key);
|
||||||
|
|
||||||
|
if (pathValue.isAbsolutePath() || pathValue.isEmpty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
pathValue = env.searchInPath(pathValue.fileName());
|
||||||
|
|
||||||
|
auto it = std::find_if(config.begin(), config.end(), [&key](const CMakeConfigItem &item) {
|
||||||
|
return item.key == key;
|
||||||
|
});
|
||||||
|
QTC_ASSERT(it != config.end(), return);
|
||||||
|
|
||||||
|
it->value = pathValue.path().toUtf8();
|
||||||
|
};
|
||||||
|
|
||||||
|
updateRelativePath("CMAKE_C_COMPILER");
|
||||||
|
updateRelativePath("CMAKE_CXX_COMPILER");
|
||||||
|
}
|
||||||
|
|
||||||
QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
|
QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
|
||||||
QString *warningMessage) const
|
QString *warningMessage) const
|
||||||
{
|
{
|
||||||
@@ -518,6 +540,7 @@ QList<void *> CMakeProjectImporter::examineDirectory(const FilePath &importPath,
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
config = cache;
|
config = cache;
|
||||||
|
updateCompilerPaths(config, env);
|
||||||
config << CMakeConfigItem("CMAKE_COMMAND",
|
config << CMakeConfigItem("CMAKE_COMMAND",
|
||||||
CMakeConfigItem::PATH,
|
CMakeConfigItem::PATH,
|
||||||
configurePreset.cmakeExecutable.value().toUtf8());
|
configurePreset.cmakeExecutable.value().toUtf8());
|
||||||
|
@@ -1893,6 +1893,7 @@ void ClientPrivate::handleMethod(const QString &method, const MessageId &id, con
|
|||||||
Response<JsonObject, JsonObject> response(id);
|
Response<JsonObject, JsonObject> response(id);
|
||||||
ResponseError<JsonObject> error;
|
ResponseError<JsonObject> error;
|
||||||
error.setCode(ResponseError<JsonObject>::MethodNotFound);
|
error.setCode(ResponseError<JsonObject>::MethodNotFound);
|
||||||
|
error.setMessage(QString("The client cannot handle the method '%1'.").arg(method));
|
||||||
response.setError(error);
|
response.setError(error);
|
||||||
sendResponse(response);
|
sendResponse(response);
|
||||||
}
|
}
|
||||||
|
@@ -538,6 +538,11 @@ QWidget *QMakeStep::createConfigWidget()
|
|||||||
BuildManager::buildLists({bc->cleanSteps()});
|
BuildManager::buildLists({bc->cleanSteps()});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
connect(widget, &QObject::destroyed, this, [this] {
|
||||||
|
abisLabel = nullptr;
|
||||||
|
abisListWidget = nullptr;
|
||||||
|
});
|
||||||
|
|
||||||
VariableChooser::addSupportForChildWidgets(widget, macroExpander());
|
VariableChooser::addSupportForChildWidgets(widget, macroExpander());
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
|
@@ -4481,7 +4481,7 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data,
|
|||||||
|
|
||||||
const QTextLine textLine = blockData.layout->lineAt(0);
|
const QTextLine textLine = blockData.layout->lineAt(0);
|
||||||
const QRectF rect = textLine.naturalTextRect();
|
const QRectF rect = textLine.naturalTextRect();
|
||||||
qreal x = textLine.cursorToX(0) + data.offset.x() + qMax(0, q->cursorWidth() - 1)
|
qreal x = textLine.x() + data.offset.x() + qMax(0, q->cursorWidth() - 1)
|
||||||
+ singleAdvance * m_visualIndentOffset;
|
+ singleAdvance * m_visualIndentOffset;
|
||||||
int paintColumn = 0;
|
int paintColumn = 0;
|
||||||
|
|
||||||
@@ -4489,8 +4489,10 @@ void TextEditorWidgetPrivate::paintIndentDepth(PaintEventData &data,
|
|||||||
while (paintColumn < depth) {
|
while (paintColumn < depth) {
|
||||||
if (x >= 0) {
|
if (x >= 0) {
|
||||||
int paintPosition = data.tabSettings.positionAtColumn(text, paintColumn);
|
int paintPosition = data.tabSettings.positionAtColumn(text, paintColumn);
|
||||||
if (blockData.layout->lineForTextPosition(paintPosition).lineNumber() != 0)
|
if (q->lineWrapMode() == QPlainTextEdit::WidgetWidth
|
||||||
|
&& blockData.layout->lineForTextPosition(paintPosition).lineNumber() != 0) {
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
const QPointF top(x, blockData.boundingRect.top());
|
const QPointF top(x, blockData.boundingRect.top());
|
||||||
const QPointF bottom(x, blockData.boundingRect.top() + rect.height());
|
const QPointF bottom(x, blockData.boundingRect.top() + rect.height());
|
||||||
const QLineF line(top, bottom);
|
const QLineF line(top, bottom);
|
||||||
|
@@ -209,8 +209,7 @@ def runVerify():
|
|||||||
availableConfigs = iterateBuildConfigs()
|
availableConfigs = iterateBuildConfigs()
|
||||||
if not availableConfigs:
|
if not availableConfigs:
|
||||||
test.fatal("Haven't found build configurations, quitting")
|
test.fatal("Haven't found build configurations, quitting")
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
for kit, config in availableConfigs:
|
for kit, config in availableConfigs:
|
||||||
selectBuildConfig(kit, config)
|
selectBuildConfig(kit, config)
|
||||||
test.log("Using build config '%s'" % config)
|
test.log("Using build config '%s'" % config)
|
||||||
|
@@ -400,8 +400,7 @@ def openDocument(treeElement):
|
|||||||
|
|
||||||
def earlyExit(details="No additional information"):
|
def earlyExit(details="No additional information"):
|
||||||
test.fail("Something went wrong running this test", details)
|
test.fail("Something went wrong running this test", details)
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
|
||||||
def openDocumentPlaceCursor(doc, line, additionalFunction=None):
|
def openDocumentPlaceCursor(doc, line, additionalFunction=None):
|
||||||
cppEditorStr = ":Qt Creator_CppEditor::Internal::CPPEditorWidget"
|
cppEditorStr = ":Qt Creator_CppEditor::Internal::CPPEditorWidget"
|
||||||
|
@@ -42,7 +42,5 @@ def main():
|
|||||||
# wait for issues
|
# wait for issues
|
||||||
test.verify(waitFor("issuesModel.rowCount() == 0", 3000),
|
test.verify(waitFor("issuesModel.rowCount() == 0", 3000),
|
||||||
"Verifying if error was properly cleared after code fix")
|
"Verifying if error was properly cleared after code fix")
|
||||||
#save and exit
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Save All")
|
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
|
||||||
|
@@ -46,16 +46,13 @@ def main():
|
|||||||
waitForObjectItem(":Qt Creator_Utils::NavigationTreeView", addBranchWildcardToRoot(myCompTE), 1000)
|
waitForObjectItem(":Qt Creator_Utils::NavigationTreeView", addBranchWildcardToRoot(myCompTE), 1000)
|
||||||
except:
|
except:
|
||||||
test.fail("Refactoring failed - file MyComponent.qml was not generated properly in project explorer")
|
test.fail("Refactoring failed - file MyComponent.qml was not generated properly in project explorer")
|
||||||
#save and exit
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Save All")
|
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
return
|
return
|
||||||
test.passes("Refactoring - file MyComponent.qml was generated properly in project explorer")
|
test.passes("Refactoring - file MyComponent.qml was generated properly in project explorer")
|
||||||
# open MyComponent.qml file for verification
|
# open MyComponent.qml file for verification
|
||||||
if not openDocument(myCompTE):
|
if not openDocument(myCompTE):
|
||||||
test.fatal("Could not open MyComponent.qml.")
|
test.fatal("Could not open MyComponent.qml.")
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
return
|
return
|
||||||
editorArea = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
editorArea = waitForObject(":Qt Creator_QmlJSEditor::QmlJSTextEditorWidget")
|
||||||
codeText = str(editorArea.plainText)
|
codeText = str(editorArea.plainText)
|
||||||
|
@@ -19,8 +19,7 @@ def verifyNextLineIndented(editorArea, expectedIndentation):
|
|||||||
def verifyIndentation(editorArea):
|
def verifyIndentation(editorArea):
|
||||||
#verify indentation
|
#verify indentation
|
||||||
if not placeCursorToLine(editorArea, "id: wdw"):
|
if not placeCursorToLine(editorArea, "id: wdw"):
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
return False
|
return False
|
||||||
type(editorArea, "<Up>")
|
type(editorArea, "<Up>")
|
||||||
expectedIndentations = [1,1,1,2,2,2,2,3,3,3,4,3,3,2,1]
|
expectedIndentations = [1,1,1,2,2,2,2,3,3,3,4,3,3,2,1]
|
||||||
@@ -58,6 +57,4 @@ def main():
|
|||||||
# verify invoked indentation
|
# verify invoked indentation
|
||||||
if not verifyIndentation(editorArea):
|
if not verifyIndentation(editorArea):
|
||||||
return
|
return
|
||||||
# save and exit
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Save All")
|
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
@@ -196,9 +196,8 @@ def main():
|
|||||||
if current.endswith(".lhs"):
|
if current.endswith(".lhs"):
|
||||||
type(editor, ">")
|
type(editor, ">")
|
||||||
type(editor, "<Tab>")
|
type(editor, "<Tab>")
|
||||||
|
saveAndExit()
|
||||||
|
|
||||||
invokeMenuItem("File", "Save All")
|
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
|
||||||
def init():
|
def init():
|
||||||
syntaxDirectory = __highlighterDefinitionsDirectory__()
|
syntaxDirectory = __highlighterDefinitionsDirectory__()
|
||||||
|
@@ -24,9 +24,7 @@ def main():
|
|||||||
expectedHeaderName=headerName)
|
expectedHeaderName=headerName)
|
||||||
if not testRenameMacroAfterSourceMoving():
|
if not testRenameMacroAfterSourceMoving():
|
||||||
return
|
return
|
||||||
# save and exit
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Save All")
|
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
|
||||||
def testRenameMacroAfterSourceModification():
|
def testRenameMacroAfterSourceModification():
|
||||||
def __deleteAnyClass__():
|
def __deleteAnyClass__():
|
||||||
|
@@ -21,8 +21,7 @@ def main():
|
|||||||
qmlFiles = [treebase + "focus\\.qml", treebase + "Core.ListMenu\\.qml"]
|
qmlFiles = [treebase + "focus\\.qml", treebase + "Core.ListMenu\\.qml"]
|
||||||
checkOutlineFor(qmlFiles)
|
checkOutlineFor(qmlFiles)
|
||||||
testModify()
|
testModify()
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
|
||||||
def checkOutlineFor(qmlFiles):
|
def checkOutlineFor(qmlFiles):
|
||||||
for qmlFile in qmlFiles:
|
for qmlFile in qmlFiles:
|
||||||
|
@@ -46,5 +46,4 @@ def main():
|
|||||||
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), "ui->%s" % buttonName))
|
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), "ui->%s" % buttonName))
|
||||||
type(editor, "<Shift+Delete>") # Delete line
|
type(editor, "<Shift+Delete>") # Delete line
|
||||||
selectFromLocator("mainwindow.ui")
|
selectFromLocator("mainwindow.ui")
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
@@ -33,5 +33,4 @@ def main():
|
|||||||
type(editor, "<Up>")
|
type(editor, "<Up>")
|
||||||
test.verify(waitFor('str(lineUnderCursor(editor)).strip() == con[3]', 1000),
|
test.verify(waitFor('str(lineUnderCursor(editor)).strip() == con[3]', 1000),
|
||||||
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), con[3]))
|
'Comparing line "%s" to expected "%s"' % (lineUnderCursor(editor), con[3]))
|
||||||
invokeMenuItem("File", "Save All")
|
saveAndExit()
|
||||||
invokeMenuItem("File", "Exit")
|
|
||||||
|
Reference in New Issue
Block a user