示例#1
0
    def _init_tab_buttons(self):
        """Add enough tabbuttons for all widgets."""
        def on_tab_removal(tabwidget):
            # called when a tab is being removed (via weakref since tabs shouldn't have references to the parent tabwidget)
            # If one tab is removed, the whole tabwidget will die..
            # This is easy usually the desired behavior.
            if tabwidget():
                tabwidget().on_remove()

        # Load buttons
        for index, tab in enumerate(self._tabs):
            # don't add a reference to the
            tab.add_remove_listener(Callback(on_tab_removal,
                                             weakref.ref(self)))
            container = Container(name="container_{}".format(index))
            background = Icon(name="bg_{}".format(index))
            button = ImageButton(name=str(index), size=(50, 50))
            if self.current_tab is tab:
                background.image = tab.button_background_image_active
                button.path = tab.path_active
            else:
                background.image = tab.button_background_image
                button.path = tab.path
            button.capture(Callback(self.show_tab, index))
            if hasattr(tab, 'helptext') and tab.helptext:
                button.helptext = tab.helptext
            container.size = (50, 52)
            container.addChild(background)
            container.addChild(button)
            self.content.addChild(container)
        self.widget.size = (54, 55 * len(self._tabs))
        self.widget.adaptLayout()

        self._apply_layout_hack()
示例#2
0
    def __init__(self):
        self.page_widgets = {}
        self.widget = load_uh_widget(self.widget_xml, center_widget=True)

        # Lists holding pickbelt ImageButtons, placed to the left/right of the book
        self.buttons = {'left': [], 'right': []}

        for i, (name, text) in enumerate(self.sections):
            self.page_widgets[i] = self.widget.findChild(name=name)

        # Create the required pickbelts
        for i, (name, text) in enumerate(self.sections):
            for side in self.buttons:
                pickbelt = ImageButton(text=text)
                pickbelt.name = name + '_' + side
                pickbelt.path = 'images/background/pickbelt_%s' % side
                pickbelt.font = "pickbelt"

                pickbelt.capture(Callback(self.update_view, i),
                                 event_name="mouseClicked")

                start_x, start_y = self.pickbelt_start_pos
                pickbelt.position = (start_x + 5 * i, start_y + 70 * i)

                container = self.widget.findChild(name="%s_pickbelts" % side)
                container.addChild(pickbelt)
                self.buttons[side].append(pickbelt)

        self.widget.show()  # Hack to initially setup the pickbelts properly
        self.update_view()
        self.widget.hide()  # Hack to initially setup the pickbelts properly
示例#3
0
	def _create_build_buttons(self, building_id, container):
		# {{mode}} in double braces because it is replaced as a second step
		building_type = Entities.buildings[building_id]
		build_button = ImageButton(name="build{id}".format(id=building_id), helptext=building_type.get_tooltip())
		build_button.path = "icons/buildmenu/{id:03d}".format(id=building_id)
		build_button.capture(Callback(self.build_related, building_id))
		return build_button
 def _create_build_buttons(self, building_id, container):
     # {{mode}} in double braces because it is replaced as a second step
     helptext = self.instance.session.db.get_building_tooltip(building_id)
     build_button = ImageButton(name="build{id}".format(id=building_id),
                                helptext=helptext)
     build_button.path = "icons/buildmenu/{id:03d}".format(id=building_id)
     build_button.capture(Callback(self.build_related, building_id))
     return build_button
示例#5
0
	def init_widget(self):
		super(LumberjackOverviewTab, self).init_widget()
		container = AutoResizeContainer(position=(20, 210))
		icon = Icon(name='build_all_bg')
		button = ImageButton(name='build_all_button')
		container.addChild(icon)
		container.addChild(button)
		self.widget.addChild(container)
		self.update_data()
 def init_widget(self):
     super().init_widget()
     container = ABox(position=(20, 210))
     icon = Icon(name='build_all_bg')
     button = ImageButton(name='build_all_button')
     container.addChild(icon)
     container.addChild(button)
     self.widget.addChild(container)
     self.update_data()
示例#7
0
    def draw_widget(self):
        """
		Updates whole messagewidget (all messages): draw icons.
		Inactive messages need their icon hovered to display their text again
		"""
        button_space = self.widget.findChild(name="button_space")
        button_space.removeAllChildren()  # Remove old buttons
        for index, message in enumerate(self.active_messages):
            if index >= len(self.active_messages):
                # Only display most recent notifications
                continue
            button = ImageButton()
            button.name = str(index)
            button.path = message.path
            # show text on hover
            events = {
                button.name + "/mouseEntered": Callback(self.show_text, index),
                button.name + "/mouseExited": self.hide_text,
            }
            # init callback to something callable to improve robustness
            callback = Callback(lambda: None)
            if message.x != 0 and message.y != 0:
                # move camera to source of event on click, if there is a source
                callback = Callback.ChainedCallbacks(
                    callback,  # this makes it so the order of callback assignment doesn't matter
                    Callback(self.session.view.center, message.x, message.y),
                    Callback(self.session.ingame_gui.minimap.highlight,
                             (message.x, message.y)))
            if message.msg_type == "logbook":
                # open logbook to relevant page
                callback = Callback.ChainedCallbacks(
                    callback,  # this makes it so the order of callback assignment doesn't matter
                    Callback(self.session.ingame_gui.windows.toggle,
                             self.session.ingame_gui.logbook,
                             msg_id=message.created))
            if callback:
                events[button.name] = callback

            button.mapEvents(events)
            button_space.addChild(button)
        button_space.resizeToContent()
        self.widget.size = button_space.size
示例#8
0
def create_resource_selection_dialog(on_click, inventory, db,
                                     widget='select_trade_resource.xml', res_filter=None, amount_per_line=None):
	"""Returns a container containing resource icons.
	@param on_click: called with resource id as parameter on clicks
	@param inventory: to determine fill status of resource slots
	@param db: main db instance
	@param widget: which xml file to use as a template. Default: tabwidget. Required
	               since the resource bar also uses this code (no tabs there though).
	@param res_filter: callback to decide which icons to use. Default: show all
	@param amount_per_line: how many resource icons per line. Default: try to fit layout
	"""
	from horizons.gui.widgets.imagefillstatusbutton import ImageFillStatusButton
	dummy_icon_path = "icons/resources/none_gray"

	dlg = load_uh_widget(widget)

	icon_size = ImageFillStatusButton.ICON_SIZE # used for dummy button
	cell_size = ImageFillStatusButton.CELL_SIZE
	button_width = cell_size[0]
	vbox = dlg.findChild(name="resources")
	amount_per_line = amount_per_line or vbox.width // button_width
	# Add the zero element to the beginning that allows to remove the currently
	# sold/bought resource:
	resources = [0] + db.get_res(only_tradeable=True)
	current_hbox = HBox(name="hbox_0", padding=0)
	index = 1
	for res_id in resources:
		# don't show resources that are already in the list
		if res_filter is not None and not res_filter(res_id):
			continue

		# on click: add this res
		cb = Callback(on_click, res_id)

		# create button (dummy one or real one)
		if res_id == 0 or inventory is None:
			reset_button = ImageButton(max_size=icon_size, name="resource_icon_00")
			reset_button.path = dummy_icon_path

			button = Container(size=cell_size)
			# add the "No Resource" image to the container, positioned in the top left
			button.addChild(reset_button)
			# capture a mouse click on the container. It's possible to click on the
			# image itself or into the empty area (below or to the right of the image)
			button.capture(cb, event_name="mouseClicked")
			button.name = "resource_{:d}".format(res_id)
		else:
			amount = inventory[res_id]
			filled = int(inventory[res_id] / inventory.get_limit(res_id) * 100)
			button = ImageFillStatusButton.init_for_res(db, res_id,
						                                amount=amount, filled=filled, uncached=True,
						                                use_inactive_icon=False, showprice=True)
			button.capture(cb, event_name="mouseClicked")
			button.name = "resource_{:d}".format(res_id)

		current_hbox.addChild(button)
		if index % amount_per_line == 0:
			vbox.addChild(current_hbox)
			box_id = index // amount_per_line
			current_hbox = HBox(name="hbox_{}".format(box_id), padding=0)
		index += 1
	vbox.addChild(current_hbox)
	vbox.adaptLayout()

	return dlg