Source code for pyvisor.GUI.tab_behaviours.animal_tab

from typing import Tuple, Dict

from PyQt5.QtWidgets import QTabWidget, QWidget

import os
from .single_animal_tab import SingleAnimalTab
from ..model.animal import Animal
from ..model.gui_data_interface import GUIDataInterface

HERE = os.path.dirname(os.path.abspath(__file__))


[docs] class AnimalTab(QTabWidget): def __init__(self, parent: QWidget, gui_data_interface: GUIDataInterface): super(AnimalTab, self).__init__(parent) self.gui_data_interface = gui_data_interface self.animals = gui_data_interface.animals self.tabs_ = {} # type: Dict[int, SingleAnimalTab] self._block_add = False self.init_UI()
[docs] def init_UI(self): if self.animals: for number in sorted(self.animals.keys()): animal = self.animals[number] self.create_new_tab(animal) else: self.add_tab(-1) ## Add a '+' tab, creating a new tab when pressed. # Inspired by user Garjy from stackoverflow.com # (full URL: http://stackoverflow.com/questions/19975137/how-can-i-add-a-new-tab-button-next-to-the-tabs-of-a-qmdiarea-in-tabbed-view-m) self.addTab(QWidget(), ' + ') self.currentChanged.connect(self.add_tab)
[docs] def add_tab(self, index): # if last tab was clicked if self._last_tab_was_clicked(index): name, number = self._generate_unique_name(0) animal = self.gui_data_interface.add_animal(name, number) self._create_animal_tab_and_insert(animal, index) self._block_add = False
def _create_animal_tab_and_insert(self, animal, index): tab = SingleAnimalTab(self, animal, index, self.gui_data_interface) self.insertTab(index, tab, animal.name) self.tabs_[animal.number] = tab self.setCurrentIndex(index) self._block_add = False def _last_tab_was_clicked(self, index: int) -> bool: return index == self.count() - 1 and not self._block_add def _generate_unique_name(self, subscript) -> Tuple[str, int]: name = "animal_" + str(subscript) if self._is_unique(name, subscript): return name, subscript return self._generate_unique_name(subscript + 1) def _is_unique(self, name, subscript: int) -> bool: for number in self.animals: animal = self.animals[number] if animal.name == name: return False if animal.number == subscript: return False return True
[docs] def rename_tab(self, index, name): self.tabBar().setTabText(index, name)
[docs] def remove_tab(self, animal_number: int, index: int): self.tabs_.pop(animal_number) self._block_add = True self.removeTab(index) for tab in self.tabs_.values(): if tab.index > index: tab.index = tab.index - 1 if len(self.tabs_) == 0: self.add_tab(0) current = index if index < len(self.tabs_) else len(self.tabs_) - 1 self.setCurrentIndex(current) self._block_add = False
[docs] def copy_tab(self, animal: Animal, index: int): self._block_add = True name = 'copy_of_' + animal.name uname, number = self._generate_unique_name(0) copied_animal = self.gui_data_interface.add_animal(name, number) copied_animal.copy_behaviours(animal.behaviours) self._create_animal_tab_and_insert(copied_animal, index + 1)
[docs] def create_new_tab(self, animal: Animal): tab = SingleAnimalTab(self, animal, len(self.tabs_), self.gui_data_interface) self.addTab(tab, animal.name) self.tabs_[animal.number] = tab