diff --git a/dist/changes-4.0.1.md b/dist/changes-4.0.1.md index 5562d4d98a0..e3911e156ed 100644 --- a/dist/changes-4.0.1.md +++ b/dist/changes-4.0.1.md @@ -12,6 +12,7 @@ CMake Projects * Added notification when `CMakeCache.txt` changes and introduces a conflict with the build configuration settings, with the option to adapt the build configuration settings +* Made it possible to add arbitrary CMake variables (QTCREATORBUG-16238) * Fixed that build configurations could not override kit settings, and added a warning to build configurations that override kit settings * Fixed that `yes` was not considered as boolean `true` value @@ -28,6 +29,11 @@ Debugging * Fixed QObject property expansion (QTCREATORBUG-15798) * Fixed updating evaluated expressions * Fixed crash on spontaneous debugger exit (QTCREATORBUG-16233) +* GDB + * Fixed issues with restarting debugger (QTCREATORBUG-16355) +* QML + * Restored expression evaluation by using the selection tool + (QTCREATORBUG-16300) Valgrind @@ -51,3 +57,9 @@ Platform Specific Windows * Fixed detection of Microsoft Visual C++ Build Tools +* Fixed that tool tips could stay visible even after switching applications + (QTCREATORBUG-15882) + +iOS + +* Added missing human readable error messages (QTCREATORBUG-16328) diff --git a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp index b1b1c450ace..fd34055f42c 100644 --- a/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp +++ b/src/plugins/projectexplorer/jsonwizard/jsonfieldpage.cpp @@ -951,7 +951,7 @@ bool JsonFieldPage::isComplete() const showError(message); hasErrorMessage = true; } - if (f->isMandatory()) + if (f->isMandatory() && !f->widget()->isHidden()) result = false; } } diff --git a/tests/system/shared/classes.py b/tests/system/shared/classes.py index f276e8d19eb..a03be7eeb2a 100644 --- a/tests/system/shared/classes.py +++ b/tests/system/shared/classes.py @@ -23,6 +23,7 @@ # ############################################################################ +import __builtin__ import operator # for easier re-usage (because Python hasn't an enum type) @@ -177,26 +178,65 @@ class Qt5Path: @staticmethod def getPaths(pathSpec): + qt5targets = [Targets.DESKTOP_521_DEFAULT, Targets.DESKTOP_531_DEFAULT] + if platform.system() != 'Darwin': + qt5targets.append(Targets.DESKTOP_541_GCC) if pathSpec == Qt5Path.DOCS: - path52 = "/doc" - path53 = "/Docs/Qt-5.3" - path54 = "/Docs/Qt-5.4" + return map(lambda target: Qt5Path.docsPath(target), qt5targets) elif pathSpec == Qt5Path.EXAMPLES: - path52 = "/examples" - path53 = "/Examples/Qt-5.3" - path54 = "/Examples/Qt-5.4" + return map(lambda target: Qt5Path.examplesPath(target), qt5targets) else: test.fatal("Unknown pathSpec given: %s" % str(pathSpec)) return [] + + @staticmethod + def __preCheckAndExtractQtVersionStr__(target): + if target not in Targets.ALL_TARGETS: + raise Exception("Unexpected target '%s'" % str(target)) + + matcher = re.match("^Desktop (5\\d{2}).*$", Targets.getStringForTarget(target)) + if matcher is None: + raise Exception("Currently this is supported for Desktop Qt5 only, got target '%s'" + % str(Targets.getStringForTarget(target))) + return matcher.group(1) + + @staticmethod + def __createPlatformQtPath__(qt5Minor): + # special handling for Qt5.2 + if qt5Minor == 2: + if platform.system() in ('Microsoft', 'Windows'): + return "C:/Qt/Qt5.2.1/5.2.1/msvc2010" + elif platform.system() == 'Linux': + if __is64BitOS__(): + return os.path.expanduser("~/Qt5.2.1/5.2.1/gcc_64") + else: + return os.path.expanduser("~/Qt5.2.1/5.2.1/gcc") + else: + return os.path.expanduser("~/Qt5.2.1/5.2.1/clang_64") + # Qt5.3+ if platform.system() in ('Microsoft', 'Windows'): - return ["C:/Qt/Qt5.2.1/5.2.1/msvc2010" + path52, - "C:/Qt/Qt5.3.1" + path53, "C:/Qt/Qt5.4.1" + path54] - elif platform.system() == 'Linux': - if __is64BitOS__(): - return map(os.path.expanduser, ["~/Qt5.2.1/5.2.1/gcc_64" + path52, - "~/Qt5.3.1" + path53, "~/Qt5.4.1" + path54]) - return map(os.path.expanduser, ["~/Qt5.2.1/5.2.1/gcc" + path52, - "~/Qt5.3.1" + path53, "~/Qt5.4.1" + path54]) + return "C:/Qt/Qt5.%d.1" % qt5Minor else: - return map(os.path.expanduser, ["~/Qt5.2.1/5.2.1/clang_64" + path52, - "~/Qt5.3.1" + path53]) + return os.path.expanduser("~/Qt5.%d.1" % qt5Minor) + + @staticmethod + def examplesPath(target): + qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) + qtMinorVersion = __builtin__.int(qtVersionStr[1]) + if qtMinorVersion == 2: + path = "examples" + else: + path = "Examples/Qt-5.%d" % qtMinorVersion + + return os.path.join(Qt5Path.__createPlatformQtPath__(qtMinorVersion), path) + + @staticmethod + def docsPath(target): + qtVersionStr = Qt5Path.__preCheckAndExtractQtVersionStr__(target) + qtMinorVersion = __builtin__.int(qtVersionStr[1]) + if qtMinorVersion == 2: + path = "doc" + else: + path = "Docs/Qt-5.%d" % qtMinorVersion + + return os.path.join(Qt5Path.__createPlatformQtPath__(qtMinorVersion), path) diff --git a/tests/system/shared/hook_utils.py b/tests/system/shared/hook_utils.py index 16314fe50fc..9fc9e2463ef 100644 --- a/tests/system/shared/hook_utils.py +++ b/tests/system/shared/hook_utils.py @@ -316,7 +316,8 @@ def __configureFW__(workingDir, projectName, isReleaseBuild, addToFW=True): # Needs admin privileges on Windows 7 # Using the deprecated "netsh firewall" because the newer # "netsh advfirewall" would need admin privileges on Windows Vista, too. - return subprocess.call('netsh firewall %s allowedprogram "%s.exe" %s %s' % (mode, path, projectName, enable)) + return subprocess.call(["netsh", "firewall", mode, "allowedprogram", + "%s.exe" % path, projectName, enable]) # helper to check whether win firewall is running or not # this doesn't check for other firewalls! @@ -333,11 +334,6 @@ def __isWinFirewallRunning__(): return __isWinFirewallRunning__.fireWallState return None -def __fixQuotes__(string): - if platform.system() in ('Windows', 'Microsoft'): - string = '"' + string + '"' - return string - # this function adds the given executable as an attachable AUT # Bad: executable/port could be empty strings - you should be aware of this def addExecutableAsAttachableAUT(executable, port, host=None): @@ -348,8 +344,8 @@ def addExecutableAsAttachableAUT(executable, port, host=None): squishSrv = __getSquishServer__() if (squishSrv == None): return False - result = subprocess.call(__fixQuotes__('"%s" --config addAttachableAUT "%s" %s:%s') - % (squishSrv, executable, host, port), shell=True) + result = subprocess.call([squishSrv, "--config", "addAttachableAUT", + executable, "%s:%s" % (host, port)]) if result == 0: test.passes("Added %s as attachable AUT" % executable) else: @@ -366,8 +362,8 @@ def removeExecutableAsAttachableAUT(executable, port, host=None): squishSrv = __getSquishServer__() if (squishSrv == None): return False - result = subprocess.call(__fixQuotes__('"%s" --config removeAttachableAUT "%s" %s:%s') - % (squishSrv, executable, host, port), shell=True) + result = subprocess.call([squishSrv, "--config", "removeAttachableAUT", + executable, "%s:%s" % (host, port)]) if result == 0: test.passes("Removed %s as attachable AUT" % executable) else: diff --git a/tests/system/shared/qtcreator.py b/tests/system/shared/qtcreator.py index b33d5f6170d..5e2ebeae640 100644 --- a/tests/system/shared/qtcreator.py +++ b/tests/system/shared/qtcreator.py @@ -99,9 +99,8 @@ def waitForCleanShutdown(timeOut=10): # following work-around because os.kill() works for win not until python 2.7 if appCtxt.pid==-1: break - tasks = subprocess.Popen("tasklist /FI \"PID eq %d\"" % appCtxt.pid, shell=True,stdout=subprocess.PIPE) - output = tasks.communicate()[0] - tasks.stdout.close() + output = getOutputFromCmdline(["tasklist", "/FI", "PID eq %d" % appCtxt.pid], + acceptedError=1) if (output=="INFO: No tasks are running which match the specified criteria." or output=="" or output.find("ERROR")==0): shutdownDone=True @@ -131,14 +130,11 @@ def waitForCleanShutdown(timeOut=10): def checkForStillRunningQmlExecutable(possibleNames): for qmlHelper in possibleNames: - tasks = subprocess.Popen("tasklist /FI \"IMAGENAME eq %s\"" % qmlHelper, shell=True, - stdout=subprocess.PIPE) - output = tasks.communicate()[0] - tasks.stdout.close() + output = getOutputFromCmdline(["tasklist", "/FI", "IMAGENAME eq %s" % qmlHelper]) if "INFO: No tasks are running which match the specified criteria." in output: continue else: - if subprocess.call("taskkill /F /FI \"IMAGENAME eq %s\"" % qmlHelper, shell=True) == 0: + if subprocess.call(["taskkill", "/F", "/FI", "IMAGENAME eq %s" % qmlHelper]) == 0: print "Killed still running %s" % qmlHelper else: print "%s is still running - failed to kill it" % qmlHelper diff --git a/tests/system/suite_editors/tst_qml_editor/test.py b/tests/system/suite_editors/tst_qml_editor/test.py index 69dc71a14b2..70f56ea14d4 100644 --- a/tests/system/suite_editors/tst_qml_editor/test.py +++ b/tests/system/suite_editors/tst_qml_editor/test.py @@ -26,7 +26,8 @@ source("../../shared/qtcreator.py") def main(): - sourceExample = os.path.abspath(Qt5Path.getPaths(Qt5Path.EXAMPLES)[0] + "/declarative/keyinteraction/focus") + target = Targets.DESKTOP_521_DEFAULT + sourceExample = os.path.join(Qt5Path.examplesPath(target), "declarative/keyinteraction/focus") proFile = "focus.pro" if not neededFilePresent(os.path.join(sourceExample, proFile)): return @@ -34,9 +35,9 @@ def main(): if not startedWithoutPluginError(): return # add docs to have the correct tool tips - addHelpDocumentation([os.path.join(Qt5Path.getPaths(Qt5Path.DOCS)[0], "qtquick.qch")]) + addHelpDocumentation([os.path.join(Qt5Path.docsPath(target), "qtquick.qch")]) templateDir = prepareTemplate(sourceExample, "/../../helper") - openQmakeProject(os.path.join(templateDir, proFile), Targets.DESKTOP_521_DEFAULT) + openQmakeProject(os.path.join(templateDir, proFile), target) openDocument("focus.QML.qml" + os.sep + "focus.focus\\.qml") testRenameId() testFindUsages()