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
|
# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
#
# Copyright (C) 2015 Canonical Ltd.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; version 3.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
from autopilot import logging as autopilot_logging
from autopilot.introspection import dbus
from lomiriuitoolkit._custom_proxy_objects import _common
from lomiriuitoolkit._custom_proxy_objects import _flickable
logger = logging.getLogger(__name__)
class ActionBar(_common.LomiriUIToolkitCustomProxyObjectBase):
"""ActionBar Autopilot custom proxy object."""
def __init__(self, *args):
super().__init__(*args)
# listview will only be set for a scrolling ActionBar.
try:
self.listview = self.select_single(objectName='actions_listview')
except dbus.StateNotFoundError:
self.listview = None
def _open_overflow(self):
"""Click the overflow button and return the overflow panel"""
actions_overflow_button = self.select_single(
objectName='overflow_action_button')
if not actions_overflow_button.visible:
raise _common.ToolkitException('No actions in overflow')
# open the popover
self.pointing_device.click_object(actions_overflow_button)
# the popover is not a child of the ActionBar, so use the popover
# object to find the requested button
try:
popover = self.get_root_instance().select_single(
objectName='actions_overflow_panel')
except dbus.StateNotFoundError:
raise _common.ToolkitException(
'Failed to select overflow panel')
return popover
def _overflow_bar_click_action_button(self, action_object_name):
try:
object_name = action_object_name + "_button"
button = self.select_single(objectName=object_name)
# In an animating header, the button is disabled until the header
# animation is done. Wait for that:
button.enabled.wait_for(True)
self.pointing_device.click_object(button)
except dbus.StateNotFoundError:
# the button is not in the ActionBar, but it may be in the overflow
try:
popover = self._open_overflow()
popover.click_action_button(action_object_name)
except _common.ToolkitException:
raise _common.ToolkitException(
'Button not found')
def _scrolling_bar_click_action_button(self, action_object_name):
buttonName = action_object_name + "_button"
try:
self.listview.click_element(buttonName)
except _flickable.CannotSwipeMoreToolkitException:
# The button was found, but is not inside the ListView. This
# happens because at the beginning and end of the ListView
# there are list items visible inside the extra margins. But
# the buttons are present otherwise a different error message
# wass given.
button = self.listview.select_single(objectName=buttonName)
self.pointing_device.click_object(button)
except _common.ToolkitException:
raise _common.ToolkitException('Button not found')
@autopilot_logging.log_action(logger.info)
def click_action_button(self, action_object_name):
"""Click an action button of the action bar.
:parameter object_name: The QML objectName property of the action
:raise ToolkitException: If there is no action button with that object
name.
"""
if self.styleName == "ActionBarStyle":
return self._overflow_bar_click_action_button(action_object_name)
elif self.styleName == "ScrollingActionBarStyle":
return self._scrolling_bar_click_action_button(action_object_name)
else:
raise _common.ToolkitException(
'Unsupported style name ' + self.styleName + ' for ActionBar.')
|