docs: def slideIn(self, index, direction=Direction.Automatic):
          """
          Slides in the panel at the inputed index in the given
          direction for this widget.
          
          :param      index | <int>
                      direction | <XStackedWidget.Direction>
          
          :return     <bool> | success
          """
          # do not allow multiple slides while it is active
          if self._active:
              return False
          
          # determine the proper index to calculate
          invert = False
          if self.count() <= index:
              if not self.wrap():
                  return False
              index = self.count() % index
              invert = True
          elif index < 0:
              if not self.wrap():
                  return False
              index = self.count() + index
              invert = True
          
          # define the direction information
          if index == self.currentIndex():
              return False
          elif self.currentIndex() < index:
              if direction == XStackedWidget.Direction.Automatic:
                  if self.isVerticalMode():
                      direction = XStackedWidget.Direction.BottomToTop
                  else:
                      direction = XStackedWidget.Direction.RightToLeft
          else:
              if direction == XStackedWidget.Direction.Automatic:
                  if self.isVerticalMode():
                      direction = XStackedWidget.Direction.TopToBottom
                  else:
                      direction = XStackedWidget.Direction.LeftToRight
          
          # invert the animation if we are wrapping
          if invert:
              if direction == XStackedWidget.Direction.BottomToTop:
                  direction = XStackedWidget.Direction.TopToBottom
              elif direction == XStackedWidget.Direction.TopToBottom:
                  direction = XStackedWidget.Direction.BottomToTop
              elif direction == XStackedWidget.Direction.LeftToRight:
                  direction = XStackedWidget.Direction.RightToLeft
              else:
                  direction = XStackedWidget.Direction.LeftToRight
          
          self._active = True
          offset_x = self.frameRect().width()
          offset_y = self.frameRect().height()
          
          next_widget = self.widget(index)
          curr_widget = self.widget(self.currentIndex())
          
          next_widget.setGeometry(0, 0, offset_x, offset_y)
          
          if direction == XStackedWidget.Direction.BottomToTop:
              offset_x = 0
              offset_y = -offset_y
          elif direction == XStackedWidget.Direction.TopToBottom:
              offset_x = 0
          elif direction == XStackedWidget.Direction.RightToLeft:
              offset_x = -offset_x
              offset_y = 0
          elif direction == XStackedWidget.Direction.LeftToRight:
              offset_y = 0
          
          next_point = next_widget.pos()
          curr_point = curr_widget.pos()
          
          self._nextIndex = index
          self._lastIndex = self.currentIndex()
          self._lastPoint = QPoint(curr_point)
          
          next_widget.move(next_point.x()-offset_x, next_point.y()-offset_y)
          next_widget.raise_()
          next_widget.show()
          
          curr_anim = QPropertyAnimation(curr_widget, 'pos')
          curr_anim.setDuration(self.speed())
          curr_anim.setEasingCurve(self.animationType())
          curr_anim.setStartValue(curr_point)
          curr_anim.setEndValue(QPoint(curr_point.x()+offset_x,
                                       curr_point.y()+offset_y))
          
          next_anim = QPropertyAnimation(next_widget, 'pos')
          next_anim.setDuration(self.speed())
          next_anim.setEasingCurve(self.animationType())
          next_anim.setStartValue(QPoint(next_point.x()-offset_x,
                                         next_point.y()-offset_y))
          next_anim.setEndValue(next_point)
          
          anim_group = QParallelAnimationGroup(self)
          anim_group.addAnimation(curr_anim)
          anim_group.addAnimation(next_anim)
          
          anim_group.finished.connect(self._finishAnimation)
          anim_group.finished.connect(anim_group.deleteLater)
          anim_group.start()
          
          return True