1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
# Copyright (C) 2016 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
# this function switches the MainWindow of creator to the specified view
def switchViewTo(view):
# make sure that no tooltip is shown, so move the mouse away and wait until all disappear
mouseMove(waitForObject(':Qt Creator_Core::Internal::MainWindow'), -20, -20)
waitFor("not QToolTip.isVisible()", 15000)
if view < ViewConstants.FIRST_AVAILABLE or view > ViewConstants.LAST_AVAILABLE:
return
mouseClick(waitForObject("{name='ModeSelector' type='Core::Internal::FancyTabBar' visible='1' "
"window=':Qt Creator_Core::Internal::MainWindow'}"), 20, 20 + 52 * view, 0, Qt.LeftButton)
def __kitIsActivated__(kit):
return not ("<h3>Click to enable target, click again to make active</h3>" in str(kit.toolTip)
or "<h3>Kit is unsuited for project</h3>" in str(kit.toolTip))
# helper function - assumes to be already in Projects mode
def kitIndicesFromProjectsMode():
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
projectCombo = waitForObject(":ProjectSelectionComboBox")
currentProject = str(projectCombo.currentText)
allIndices = dumpIndices(treeView.model())
projectIndex = None
for idx in allIndices:
if str(idx.data(0)) == currentProject:
projectIndex = idx
break
test.verify(projectIndex is not None, "Found the project index.")
secondLevelIndices = dumpIndices(treeView.model(), projectIndex)
test.compare(3, len(secondLevelIndices), "Verify expected count of secondary level.")
kitIndices = dumpIndices(treeView.model(), secondLevelIndices[0])
return kitIndices
# returns a list of the IDs (see class Targets) of all kits
# which are currently configured for the active project
# Creator must be in projects mode when calling
def iterateConfiguredKits():
kitIndices = kitIndicesFromProjectsMode()
configuredKitNames = map(lambda t: str(t.data(0)),
filter(__kitIsActivated__, kitIndices))
return map(Targets.getIdForTargetName, configuredKitNames)
# This function switches to the build or the run settings (inside the Projects view).
# If you haven't already switched to the Projects view this will raise a LookupError.
# It will return a boolean value indicating whether the selected Kit was changed by the function.
# Note that a 'False' return does not indicate any error.
# param wantedKit specifies the ID of the kit (see class Targets)
# for which to switch into the specified settings
# param projectSettings specifies where to switch to (must be one of
# ProjectSettings.BUILD or ProjectSettings.RUN)
def switchToBuildOrRunSettingsFor(wantedKit, projectSettings):
treeView = waitForObject(":Projects.ProjectNavigationTreeView")
wantedKitName = Targets.getStringForTarget(wantedKit)
wantedKitIndexString = getQModelIndexStr("text='%s'" % wantedKitName, ":Projects.ProjectNavigationTreeView")
if not test.verify(__kitIsActivated__(findObject(wantedKitIndexString)),
"Verifying target '%s' is enabled." % wantedKitName):
raise Exception("Kit '%s' is not activated in the project." % wantedKitName)
index = waitForObject(wantedKitIndexString)
kitAlreadySelected = index.font.bold
if kitAlreadySelected:
test.log("Kit '%s' is already selected." % wantedKitName)
else:
test.log("Selecting kit '%s'..." % wantedKitName)
treeView.scrollTo(index)
mouseClick(index)
if projectSettings == ProjectSettings.BUILD:
settingsText = "Build Settings"
elif projectSettings == ProjectSettings.RUN:
settingsText = "Run Settings"
else:
raise Exception("Unexpected projectSettings parameter (%s), needs to be BUILD or RUN."
% str(projectSettings))
clickOnTab(":ProjectConfigurationTabBar", settingsText)
return not kitAlreadySelected
# this function switches "Run in terminal" on or off in a project's run settings
# param wantedKit specifies the ID of the kit to edit (see class Targets)
# param runInTerminal specifies if "Run in terminal should be turned on (True) or off (False)
def setRunInTerminal(wantedKit, runInTerminal=True):
switchViewTo(ViewConstants.PROJECTS)
switchToBuildOrRunSettingsFor(wantedKit, ProjectSettings.RUN)
ensureChecked("{window=':Qt Creator_Core::Internal::MainWindow' text='Run in terminal'\
type='QCheckBox' unnamed='1' visible='1'}", runInTerminal)
switchViewTo(ViewConstants.EDIT)
def __getTargetFromToolTip__(toolTip):
if toolTip == None or not isString(toolTip):
test.warning("Parameter toolTip must be of type str and can't be None!")
return None
pattern = re.compile(".*<b>Kit:</b>(.*)<b>Deploy.*")
target = pattern.match(toolTip)
if target == None:
test.fatal("UI seems to have changed - expected ToolTip does not match.",
"ToolTip: '%s'" % toolTip)
return None
return target.group(1).split("<br/>")[0].strip()
def getExecutableAndTargetFromToolTip(toolTip):
target = __getTargetFromToolTip__(toolTip)
if toolTip == None or not isString(toolTip):
return None, target
pattern = re.compile('.*<b>Run:</b>(.*)</.*')
exe = pattern.match(toolTip)
if exe == None:
test.fatal("UI seems to have changed - expected ToolTip does not match.",
"ToolTip: '%s'" % toolTip)
return None, target
return exe.group(1).strip(), target
# treeElement is the dot-separated tree to the wanted element, e.g.
# root.first.second.leaf
def waitForProjectTreeItem(treeElement, timeoutMSec):
projectTV = ":Qt Creator_Utils::NavigationTreeView"
projItem = None
treeElementWithBranch = addBranchWildcardToRoot(treeElement)
for _ in range(__builtins__.int(timeoutMSec / 200)):
try:
projItem = waitForObjectItem(projectTV, treeElement, 100)
except:
try:
projItem = waitForObjectItem(projectTV, treeElementWithBranch, 100)
except:
pass
if projItem:
return projItem
raise LookupError("Could not find project tree element: %s or %s"
% (treeElement, treeElementWithBranch))
def invokeContextMenuOnProject(projectName, menuItem):
try:
projItem = waitForProjectTreeItem(projectName, 4000)
except:
test.fatal("Failed to find root node of the project '%s'." % projectName)
return
openItemContextMenu(waitForObject(":Qt Creator_Utils::NavigationTreeView"),
str(projItem.text).replace("_", "\\_").replace(".", "\\."), 5, 5, 0)
activateItem(waitForObjectItem("{name='Project.Menu.Project' type='QMenu' visible='1'}", menuItem))
return projItem
def addAndActivateKit(kit):
kitString = Targets.getStringForTarget(kit)
clickToActivate = "<html><body><h3>%s</h3><p><h3>Click to activate</h3>" % kitString
switchViewTo(ViewConstants.PROJECTS)
try:
waitForObject(":Projects.ProjectNavigationTreeView")
wanted = getQModelIndexStr("text='%s'" % kitString, ":Projects.ProjectNavigationTreeView")
index = findObject(wanted)
if str(index.toolTip).startswith(clickToActivate):
mouseClick(index)
test.verify(waitFor("not str(index.toolTip).startswith(clickToActivate)", 1500),
"Kit added for this project")
else:
test.warning("Kit is already added for this project.")
mouseClick(index)
test.verify(waitFor("index.font.bold == True", 1500),
"Verifying whether kit is current active")
except:
return False
finally:
switchViewTo(ViewConstants.EDIT)
return True
|