def __init__(self, parent): super(MiniMap, self).__init__(parent) #self.setWordWrapMode(QTextOption.NoWrap) #self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) #self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.setMarginWidth(1, 0) self.setFolding(self.NoFoldStyle, 2) #self.setCenterOnScroll(True) self.setMouseTracking(True) #self.viewport().setCursor(Qt.PointingHandCursor) #self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent #self.highlighter = None #self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity")
def __init__(self, parent): super(MiniMap, self).__init__(parent) self.setWordWrapMode(QTextOption.NoWrap) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.setCenterOnScroll(True) self.setMouseTracking(True) self.viewport().setCursor(Qt.PointingHandCursor) self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent self.highlighter = None self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.slider = SliderArea(self) self.slider.show()
def __init__(self, parent=None, caption=None): QLabel.__init__(self, parent) self.setText(self.accessibleName()) self.setFont(QtGui.QFont("Arial", 12)) self.__separator = chr(004) #Used as separator while scrolling text #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN #SCROLLING self.__scrolling_timer = QTimer(parent) self.__scrolling_timer.timeout.connect(self.__on_scrolling_timer) self.__scroll_time = 1000 self.__original_text = "" #MOVE self.__move_animation_type = QEasingCurve.Linear self.__move_time = 350
def __init__(self, editor): super(MiniMap, self).__init__(editor) self._editor = editor self.SendScintilla(QsciScintilla.SCI_SETCARETSTYLE, 0) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETZOOM, -10) self.SendScintilla(QsciScintilla.SCI_SETREADONLY, 1) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, 1) self.SendScintilla(QsciScintilla.SCI_SETCURSOR, 8) # Hide markers for i in range(1, 5): self.SendScintilla(QsciScintilla.SCI_MARKERDEFINE, i, QsciScintilla.SC_MARK_EMPTY) self.SendScintilla(QsciScintilla.SCI_SETMARGINWIDTHN, 1, 0) self.setMouseTracking(True) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.animation.setDuration(300) self.slider = SliderArea(self) self.slider.show()
class SliderArea(QFrame): def __init__(self, minimap): super(SliderArea, self).__init__(minimap) self._minimap = minimap self.pressed = False self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get( 'MinimapVisibleArea', resources.COLOR_SCHEME['MinimapVisibleArea']) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;") def mousePressEvent(self, event): super(SliderArea, self).mousePressEvent(event) self.pressed = True self.setCursor(Qt.ClosedHandCursor) def mouseReleaseEvent(self, event): super(SliderArea, self).mouseReleaseEvent(event) self.pressed = False self.setCursor(Qt.OpenHandCursor) def update_position(self): font_size = round(self._minimap.font().pointSize() / 2.5) lines_count = self._minimap._editor.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) height = lines_count * font_size self.setFixedHeight(height) self.setFixedWidth(self._minimap.width()) def paintEvent(self, event): """Paint over the widget to overlay its content.""" if not ACTIVATE_OPACITY: painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.Antialiasing, True) painter.fillRect(event.rect(), QBrush( QColor(226, 0, 0, 80))) painter.setPen(QPen(Qt.NoPen)) painter.end() super(SliderArea, self).paintEvent(event) def mouseMoveEvent(self, event): super(SliderArea, self).mouseMoveEvent(event) if self.pressed: pos = self.mapToParent(event.pos()) self._minimap.scroll_area(pos)
class SliderArea(QFrame): def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = "#858585" self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(MINIMAP_MAX_OPACITY / 2) self.pressed = False self.__scroll_margins = None def paintEvent(self, event): """Paint over the widget to overlay its content.""" super(SliderArea, self).paintEvent(event) def update_position(self): font_size = QFontMetrics(self._parent.font()).height() height = self._parent.lines_count * font_size self.setFixedHeight(height) self.setFixedWidth(self._parent.width()) self.__scroll_margins = (height, self._parent.height() - height) def move_slider(self, y): self.move(0, y) def mousePressEvent(self, event): super(SliderArea, self).mousePressEvent(event) self.pressed = True self.setCursor(Qt.ClosedHandCursor) def mouseReleaseEvent(self, event): super(SliderArea, self).mouseReleaseEvent(event) self.pressed = False self.setCursor(Qt.OpenHandCursor) def mouseMoveEvent(self, event): super(SliderArea, self).mouseMoveEvent(event) if self.pressed: pos = self.mapToParent(event.pos()) y = pos.y() - (self.height() / 2) if y < 0: y = 0 if y < self.__scroll_margins[0]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() - 2) elif y > self.__scroll_margins[1]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() + 2) self.move(0, y) self._parent.scroll_area(pos, event.pos())
class Minimap(QsciScintilla): def __init__(self, weditor): QsciScintilla.__init__(self, weditor) self._weditor = weditor self._indentation = self._weditor._indentation self.setLexer(self._weditor.lexer()) # Configuración Scintilla self.setMouseTracking(True) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, False) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, True) self.setFolding(QsciScintilla.NoFoldStyle, 1) self.setReadOnly(True) self.setCaretWidth(0) self.setStyleSheet("background: transparent; border: 0px;") # Opacity self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.effect.setOpacity(0.5) # Deslizador self.slider = Slider(self) self.slider.hide() def resizeEvent(self, event): super(Minimap, self).resizeEvent(event) self.slider.setFixedWidth(self.width()) lines_on_screen = self._weditor.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) self.slider.setFixedHeight(lines_on_screen * 4) def update_geometry(self): self.setFixedHeight(self._weditor.height()) self.setFixedWidth(self._weditor.width() * 0.13) x = self._weditor.width() - self.width() self.move(x, 0) self.zoomIn(-3) def update_code(self): text = self._weditor.text().replace('\t', ' ' * self._indentation) self.setText(text) def leaveEvent(self, event): super(Minimap, self).leaveEvent(event) self.slider.animation.setStartValue(0.2) self.slider.animation.setEndValue(0) self.slider.animation.start() def enterEvent(self, event): super(Minimap, self).enterEvent(event) if not self.slider.isVisible(): self.slider.show() else: self.slider.animation.setStartValue(0) self.slider.animation.setEndValue(0.2) self.slider.animation.start()
def setBgPic(self): pl = QtGui.QPalette(self) pic_path = os.path.join(os.getcwd(), r'./resource/bg.png') brush = QtGui.QBrush(QtGui.QPixmap(pic_path)) pl.setBrush(QtGui.QPalette.Background, brush) self.setPalette(pl) self.setAutoFillBackground(True) self.opacity = QGraphicsOpacityEffect() self.opacity.setOpacity(0.5) self.setGraphicsEffect(self.opacity)
def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = "#858585" self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(MINIMAP_MAX_OPACITY / 2) self.pressed = False self.__scroll_margins = None
def __init__(self, minimap): QFrame.__init__(self, minimap) self._minimap = minimap self.setStyleSheet("background: gray; border-radius: 3px;") # Opacity self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.effect.setOpacity(0.2) # Animación self.animation = QPropertyAnimation(self.effect, "opacity") self.animation.setDuration(150) # Cursor self.setCursor(Qt.OpenHandCursor)
def __init__(self, minimap): super(SliderArea, self).__init__(minimap) self._minimap = minimap self.pressed = False self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get( 'MinimapVisibleArea', resources.COLOR_SCHEME['MinimapVisibleArea']) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;")
def __init__(self, parent): super(MiniMap, self).__init__(parent) # self.setWordWrapMode(QTextOption.NoWrap) # self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.setMarginWidth(1, 0) self.setFolding(self.NoFoldStyle, 2) # self.setCenterOnScroll(True) self.setMouseTracking(True) # self.viewport().setCursor(Qt.PointingHandCursor) # self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent # self.highlighter = None # self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity")
def __init__(self, editor): super(MiniMap, self).__init__(editor) self._editor = editor self.SendScintilla(QsciScintilla.SCI_SETCARETSTYLE, 0) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETZOOM, -10) self.SendScintilla(QsciScintilla.SCI_SETREADONLY, 1) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, 1) self.SendScintilla(QsciScintilla.SCI_SETCURSOR, 8) # Hide markers for i in range(1, 5): self.SendScintilla( QsciScintilla.SCI_MARKERDEFINE, i, QsciScintilla.SC_MARK_EMPTY) self.SendScintilla(QsciScintilla.SCI_SETMARGINWIDTHN, 1, 0) self.setMouseTracking(True) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.animation.setDuration(300) self.slider = SliderArea(self) self.slider.show()
def __init__(self, parent): super(HtmlViewerWidget, self).__init__(parent) self.setLayout(QGridLayout()) self.layout().setContentsMargins(0, 0, 0, 0) self.view = QWebView() self.view.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks) self.frame = QFrame() self.frame.setLayout(QGridLayout()) self.frame.layout().setContentsMargins(0, 0, 0, 0) self.toolbar = QToolBar() self.spacer = QWidget() self.spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.copyAction = self.toolbar.addAction(QIcon(":/icons/clipboard"), "Copy Text") self.label = QLabel() self.closeAction = self.toolbar.addAction(QIcon(":/icons/cancel"), "Close") self.spaceraction = self.toolbar.insertWidget(self.closeAction, self.spacer) self.labelaction = self.toolbar.insertWidget(self.spaceraction, self.label) self.closeAction.triggered.connect(self.close) self.copyAction.triggered.connect(self.copy_text) self.layout().addWidget(self.frame) self.frame.layout().addWidget(self.toolbar) self.frame.layout().addWidget(self.view) self.effect = QGraphicsOpacityEffect() self.label.setGraphicsEffect(self.effect) self.anim = QPropertyAnimation(self.effect, "opacity") self.anim.setDuration(2000) self.anim.setStartValue(1.0) self.anim.setEndValue(0.0) self.anim.setEasingCurve(QEasingCurve.OutQuad)
def __init__(self, parent=None): super(FileSelector, self).__init__(parent, Qt.Dialog | Qt.FramelessWindowHint) self.setObjectName("file-selector") self._files = {} self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.animation = QPropertyAnimation(self.effect, "opacity") self.animation.setDuration(1500) box = QVBoxLayout(self) box.setSpacing(30) self.list_of_files = QListWidget() self.list_of_files.setObjectName("list-selector") box.addWidget(self.list_of_files) self.label_path = QLabel() box.addWidget(self.label_path) self._load_files() self.connect(self.list_of_files, SIGNAL("itemSelectionChanged()"), self._update_label) self.connect(self.list_of_files, SIGNAL("itemActivated(QListWidgetItem*)"), self._open_file) self.connect(self.list_of_files, SIGNAL("itemEntered(QListWidgetItem*)"), self._open_file)
def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get( 'current-line', resources.COLOR_SCHEME['current-line']) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;") self.pressed = False self.__scroll_margins = None
def __init__(self, weditor): QsciScintilla.__init__(self, weditor) self._weditor = weditor self._indentation = self._weditor._indentation self.setLexer(self._weditor.lexer()) # Configuración Scintilla self.setMouseTracking(True) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, False) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, True) self.setFolding(QsciScintilla.NoFoldStyle, 1) self.setReadOnly(True) self.setCaretWidth(0) self.setStyleSheet("background: transparent; border: 0px;") # Opacity self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.effect.setOpacity(0.5) # Deslizador self.slider = Slider(self) self.slider.hide()
def __init__(self, parent=None): QFrame.__init__(self, parent) #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN self.resizeEvent = self.__onResize #MOVE self.__move_animation_type = QEasingCurve.Linear self.__move_time = 350 self.__is_moving = False #RESIZE self.__resize_animation_type = QEasingCurve.Linear self.__resize_time = 700 self.__is_resizing = False #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False #SHADOW self.__shadow_Xoffset = 3.0 #default value self.__shadow_Yoffset = 3.0 #default value self.__shadow_blur_radius = 8.0 #default value self.__shadow_color = QColor(38,38,38,150) #default value self.__shadow_effect = QGraphicsDropShadowEffect() self.__shadow_effect.setXOffset(self.__shadow_Xoffset) self.__shadow_effect.setYOffset(self.__shadow_Yoffset) self.__shadow_effect.setBlurRadius(self.__shadow_blur_radius) self.__shadow_effect.setColor(self.__shadow_color) self._shadow_visible = False
def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get('current-line', resources.COLOR_SCHEME['current-line']) self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) self.pressed = False self.__scroll_margins = None
class Slider(QFrame): def __init__(self, minimap): QFrame.__init__(self, minimap) self._minimap = minimap self.setStyleSheet("background: gray; border-radius: 3px;") # Opacity self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.effect.setOpacity(0.2) # Animación self.animation = QPropertyAnimation(self.effect, "opacity") self.animation.setDuration(150) # Cursor self.setCursor(Qt.OpenHandCursor) def mouseMoveEvent(self, event): super(Slider, self).mouseMoveEvent(event) #FIXME: funciona algo loco pos = self.mapToParent(event.pos()) dy = pos.y() - (self.height() / 2) if dy < 0: dy = 0 self.move(0, dy) pos.setY(pos.y() - event.pos().y()) self._minimap._weditor.verticalScrollBar().setValue(pos.y()) self._minimap.verticalScrollBar().setSliderPosition( self._minimap.verticalScrollBar().sliderPosition() + 2) self._minimap.verticalScrollBar().setValue(pos.y() - event.pos().y()) def mousePressEvent(self, event): super(Slider, self).mousePressEvent(event) self.setCursor(Qt.ClosedHandCursor) def mouseReleaseEvent(self, event): super(Slider, self).mouseReleaseEvent(event) self.setCursor(Qt.OpenHandCursor)
def __init__(self, parent): super(MiniMap, self).__init__(parent) self.setWordWrapMode(QTextOption.NoWrap) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.setCenterOnScroll(True) self.setMouseTracking(True) self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent self.highlighter = None styles.set_style(self, 'minimap') self.max_line = 0 self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity")
def __init__(self, logger): self.logger = logger self.good = False self.fadingEnabled = False self.minOpacity = 0. self.maxOpacity = 1. self.incr = (self.maxOpacity - self.minOpacity) / self.NUM_STEPS self.fadeIn = False try: from PyQt4.QtGui import QGraphicsOpacityEffect self.effect = QGraphicsOpacityEffect(self) self.setGraphicsEffect(self.effect) self.timer = QTimer(self) self.timer.timeout.connect(self._fade) self.good = True except: self.logger.debug(u"Could not enable opacity effects. %s: %s", sys.exc_info()[0].__name__, unicode(sys.exc_info()[1]))
def __init__(self, parent=None): QDialog.__init__(self, parent) self.setWindowTitle(self.tr("Configuraciones - Edis")) self.__sections = [] # Opacity effect self.effect = QGraphicsOpacityEffect() self.setGraphicsEffect(self.effect) self.animation = QPropertyAnimation(self.effect, "opacity") Edis.load_component("preferences", self) # Install sections #lint:disable from src.ui.dialogs.preferences import (environment_configuration, editor_configuration, compiler_configuration) #lint:enable self.load_ui() key_escape = QShortcut(QKeySequence(Qt.Key_Escape), self) self.connect(key_escape, SIGNAL("activated()"), self.close) self.connect(self.btn_cancel, SIGNAL("clicked()"), self.close) self.connect(self.btn_guardar, SIGNAL("clicked()"), self._save)
class MiniMap(QsciScintilla): def __init__(self, parent): super(MiniMap, self).__init__(parent) # self.setWordWrapMode(QTextOption.NoWrap) # self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.setMarginWidth(1, 0) self.setFolding(self.NoFoldStyle, 2) # self.setCenterOnScroll(True) self.setMouseTracking(True) # self.viewport().setCursor(Qt.PointingHandCursor) # self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent # self.highlighter = None # self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") # self.slider = SliderArea(self) # self.slider.show() def shutdown(self): self.disconnect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) def __calculate_max(self): # line_height = self._parent.cursorRect().height() # if line_height > 0: # self.lines_count = self._parent.viewport().height() / line_height # self.slider.update_position() self.update_visible_area() def set_code(self, source): # self.setPlainText(source) self.__calculate_max() def adjust_to_parent(self): self.setFixedHeight(self._parent.height()) self.setFixedWidth(self._parent.width() * settings.SIZE_PROPORTION) x = self._parent.width() - self.width() self.move(x, 0) # fontsize = int(self.width() / settings.MARGIN_LINE) # if fontsize < 1: # fontsize = 1 # font = self.document().defaultFont() # font.setPointSize(fontsize) # self.setFont(font) self.__calculate_max() def update_visible_area(self): pass
class MiniMap(QPlainTextEdit): def __init__(self, parent): super(MiniMap, self).__init__(parent) self.setWordWrapMode(QTextOption.NoWrap) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.setCenterOnScroll(True) self.setMouseTracking(True) self.viewport().setCursor(Qt.PointingHandCursor) self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent self.highlighter = None self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.slider = SliderArea(self) self.slider.show() def shutdown(self): self.disconnect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) def __calculate_max(self): line_height = self._parent.cursorRect().height() if line_height > 0: self.lines_count = self._parent.viewport().height() / line_height self.slider.update_position() self.update_visible_area() def set_code(self, source): self.setPlainText(source) self.__calculate_max() def adjust_to_parent(self): self.setFixedHeight(self._parent.height()) self.setFixedWidth(self._parent.width() * settings.SIZE_PROPORTION) x = self._parent.width() - self.width() self.move(x, 0) fontsize = int(self.width() / settings.MARGIN_LINE) if fontsize < 1: fontsize = 1 font = self.document().defaultFont() font.setPointSize(fontsize) self.setFont(font) self.__calculate_max() def update_visible_area(self): if not self.slider.pressed: line_number = self._parent.firstVisibleBlock().blockNumber() block = self.document().findBlockByLineNumber(line_number) cursor = self.textCursor() cursor.setPosition(block.position()) rect = self.cursorRect(cursor) self.setTextCursor(cursor) self.slider.move_slider(rect.y()) def enterEvent(self, event): if ACTIVATE_OPACITY: self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MIN_OPACITY) self.animation.setEndValue(settings.MINIMAP_MAX_OPACITY) self.animation.start() def leaveEvent(self, event): if ACTIVATE_OPACITY: self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MAX_OPACITY) self.animation.setEndValue(settings.MINIMAP_MIN_OPACITY) self.animation.start() def mousePressEvent(self, event): super(MiniMap, self).mousePressEvent(event) cursor = self.cursorForPosition(event.pos()) self._parent.jump_to_line(cursor.blockNumber()) def resizeEvent(self, event): super(MiniMap, self).resizeEvent(event) self.slider.update_position() def scroll_area(self, pos_parent, pos_slider): pos_parent.setY(pos_parent.y() - pos_slider.y()) cursor = self.cursorForPosition(pos_parent) self._parent.verticalScrollBar().setValue(cursor.blockNumber()) def wheelEvent(self, event): super(MiniMap, self).wheelEvent(event) self._parent.wheelEvent(event)
class SliderArea(QFrame): def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get("current-line", resources.COLOR_SCHEME["current-line"]) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;") self.pressed = False self.__scroll_margins = None def paintEvent(self, event): """Paint over the widget to overlay its content.""" if not ACTIVATE_OPACITY: painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.Antialiasing, True) painter.fillRect(event.rect(), QBrush(QColor(255, 255, 255, 80))) painter.setPen(QPen(Qt.NoPen)) painter.end() super(SliderArea, self).paintEvent(event) def update_position(self): font_size = QFontMetrics(self._parent.font()).height() height = self._parent.lines_count * font_size self.setFixedHeight(height) self.setFixedWidth(self._parent.width()) self.__scroll_margins = (height, self._parent.height() - height) def move_slider(self, y): self.move(0, y) def mousePressEvent(self, event): super(SliderArea, self).mousePressEvent(event) self.pressed = True self.setCursor(Qt.ClosedHandCursor) def mouseReleaseEvent(self, event): super(SliderArea, self).mouseReleaseEvent(event) self.pressed = False self.setCursor(Qt.OpenHandCursor) def mouseMoveEvent(self, event): super(SliderArea, self).mouseMoveEvent(event) if self.pressed: pos = self.mapToParent(event.pos()) y = pos.y() - (self.height() / 2) if y < 0: y = 0 if y < self.__scroll_margins[0]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() - 2 ) elif y > self.__scroll_margins[1]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() + 2 ) self.move(0, y) self._parent.scroll_area(pos, event.pos())
class MiniMap(QPlainTextEdit): def __init__(self, parent): super(MiniMap, self).__init__(parent) self.setWordWrapMode(QTextOption.NoWrap) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.setCenterOnScroll(True) self.setMouseTracking(True) self.viewport().setCursor(Qt.PointingHandCursor) self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent self.highlighter = None self.lines_count = 0 if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.slider = SliderArea(self) self.slider.show() def __calculate_max(self): line_height = self._parent.cursorRect().height() if line_height > 0: self.lines_count = self._parent.viewport().height() / line_height self.slider.update_position() self.update_visible_area() def set_code(self, source): self.highlighter.highlight_function = self.highlighter.open_highlight self.setPlainText(source) self.__calculate_max() self.highlighter.async_highlight() def adjust_to_parent(self): self.setFixedHeight(self._parent.height()) self.setFixedWidth(self._parent.width() * settings.SIZE_PROPORTION) x = self._parent.width() - self.width() self.move(x, 0) fontsize = int(self.width() / settings.MARGIN_LINE) if fontsize < 1: fontsize = 1 font = self.document().defaultFont() font.setPointSize(fontsize) self.setFont(font) self.__calculate_max() def update_visible_area(self): if not self.slider.pressed: line_number = self._parent.firstVisibleBlock().blockNumber() block = self.document().findBlockByLineNumber(line_number) cursor = self.textCursor() cursor.setPosition(block.position()) rect = self.cursorRect(cursor) self.setTextCursor(cursor) self.slider.move_slider(rect.y()) def enterEvent(self, event): if ACTIVATE_OPACITY: self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MIN_OPACITY) self.animation.setEndValue(settings.MINIMAP_MAX_OPACITY) self.animation.start() def leaveEvent(self, event): if ACTIVATE_OPACITY: self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MAX_OPACITY) self.animation.setEndValue(settings.MINIMAP_MIN_OPACITY) self.animation.start() def mousePressEvent(self, event): super(MiniMap, self).mousePressEvent(event) cursor = self.cursorForPosition(event.pos()) self._parent.jump_to_line(cursor.blockNumber()) def resizeEvent(self, event): super(MiniMap, self).resizeEvent(event) self.slider.update_position() def scroll_area(self, pos_parent, pos_slider): pos_parent.setY(pos_parent.y() - pos_slider.y()) cursor = self.cursorForPosition(pos_parent) self._parent.verticalScrollBar().setValue(cursor.blockNumber()) def wheelEvent(self, event): super(MiniMap, self).wheelEvent(event) self._parent.wheelEvent(event)
class CImprovedButton(QToolButton): def __init__(self, parent=None): QToolButton.__init__(self, parent) #TESTO ALTERNATIVO #Spesso se il pulsante ha icona troppo grossa e quando per ragioni di spazio o altro non si può spostare #o ridimensionare il pulsante stesso, la label ha posizioni assurde e schifose. Aggiungerne una "+ controllabile" #è l'unico modo.. self.__fixed_label = QLabel("alternative label", self) self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.__fixed_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__font = QtGui.QFont("Arial", 10) self.__fixed_label.setFont(self.__font) self.__fixed_label.show() #INDICATORE STILE iOS self.__indicator = QLabel("0", self) self.__indicator.setStyleSheet( "border-image: url(':/images/backgrounds/indicator.png'); padding-right:1px; color: white;" ) self.__indicator.geometry().setWidth(25) self.__indicator.geometry().setHeight(20) self.__indicator.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__indicator.setVisible(False) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) #default top-right corner #Quando il pulsante viene ridimensionato (designer o meno) devo anche sistemare la label di conseguenza self.resizeEvent = self.__onResize self.__indicator.resizeEvent = self.__on_indicator_Resize self.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.clicked.connect(self.stopAllAnimations) #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN # ANIMAZIONI GROW self.__animationGrow = QPropertyAnimation(self, "iconSize", self) self.__animationGrow.setDuration(1000) self.__animationGrow.setEasingCurve(QEasingCurve.Linear) self.__animationGrow.finished.connect(self.__on_growed) self.__animationShrink = QPropertyAnimation(self, "iconSize", self) self.__animationShrink.setDuration(1000) self.__animationShrink.setEasingCurve(QEasingCurve.Linear) self.__animationShrink.finished.connect(self.__on_shrinked) self.__defaultIconDimension = 60 self.__iconGrowsBy = 40 self.__growing = False # ANIMAZIONI BOUNCE self.__animationUp = QPropertyAnimation(self, "pos", self) self.__animationUp.setDuration(200) self.__animationUp.setEasingCurve(QEasingCurve.Linear) self.__animationUp.finished.connect(self.__on_top_reached) self.__animationBounce = QPropertyAnimation(self, "pos", self) self.__animationBounce.setDuration(1000) self.__animationBounce.setEasingCurve(QEasingCurve.OutBounce) self.__animationBounce.finished.connect(self.__on_bounce_finished) self.__bouncing = False self.__startPos = QPoint(self.pos().x(), self.pos().y()) #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False def setDefaultIconSize(self, value): """ Sets default icon size when growing stops. @param value: size (both width and height) @type value: int """ self.__defaultIconDimension = value def getDefaultIconSize(self): return self.__defaultIconDimension defaultIconSize = QtCore.pyqtProperty("int", getDefaultIconSize, setDefaultIconSize) def setFixetTextVisibility(self, bool): """ Sets if fixed text is visible or not. @param bool: visible or not @type bool: bool """ self.__fixed_label.setVisible(bool) def getFixetTextVisibility(self): return self.__fixed_label.isVisible() fixetTextVisibility = QtCore.pyqtProperty("bool", fget=getFixetTextVisibility, fset=setFixetTextVisibility) def setFixedText(self, txt): """ Sets text on the button. @param txt: text @type txt: string """ self.__fixed_label.setText(txt) def getFixedText(self): return self.__fixed_label.text() fixedText = QtCore.pyqtProperty("QString", getFixedText, setFixedText) def setFixedTextPos(self, qpoint): """ Sets text position in the button. @param qpoint: Position RELATIVE. 0,0 is top left corner of the button. @type qpoint: QPoint """ self.__fixed_label.move(qpoint) def getFixedTextPos(self): return self.__fixed_label.pos() fixedTextPos = QtCore.pyqtProperty("QPoint", getFixedTextPos, setFixedTextPos) def setFixedTextFont(self, font): """ Sets text font. @param font: Font for fixed text. @type font: QFont """ self.__font = font self.__fixed_label.setFont(self.__font) def getFixedTextFont(self): return self.__font fixedTextFont = QtCore.pyqtProperty("QFont", getFixedTextFont, setFixedTextFont) #FUNZIONI INDICATORE def setIndicatorVisibility(self, bool): """ Sets if indicator is visible or not. @param bool: visible or not @type bool: bool """ self.__indicator.setVisible(bool) def getIndicatorVisibility(self): return self.__indicator.isVisible() indicatorVisibility = QtCore.pyqtProperty("bool", fget=getIndicatorVisibility, fset=setIndicatorVisibility) def setIndicatorPos(self, qpoint): """ Sets indicator position in the button. @param qpoint: Position RELATIVE. 0,0 is top left corner of the button. @type qpoint: QPoint """ self.__indicator.move(qpoint) def getIndicatorPos(self): return self.__indicator.pos() indicatorPos = QtCore.pyqtProperty("QPoint", getIndicatorPos, setIndicatorPos) def setIndicatorSize(self, size): """ Sets indicator size. @param size: Size @type size: QSize """ self.__indicator.resize(size) def getIndicatorSize(self): return self.__indicator.size() indicatorSize = QtCore.pyqtProperty("QSize", getIndicatorSize, setIndicatorSize) def setIndicatorFont(self, font): """ Sets indicator text font. @param font: Font for indicator text. @type font: QFont """ self.__indicator.setFont(font) def getIndicatorFont(self): return self.__indicator.font() indicatorFont = QtCore.pyqtProperty("QFont", getIndicatorFont, setIndicatorFont) ## FUNZIONI PER BLINK def __on_blink_timer(self): self.setVisible(not (self.isVisible())) def setBlinking(self, blink): """ Sets if the button have to blink or not. @param blink: blinking or not @type blink: bool """ if blink: self.__blink_timer.setInterval(self.__blink_timer_interval) self.__blink_timer.start() else: self.__blink_timer.stop() self.setVisible(True) def setBlinkInterval(self, value): """ Sets blink interval. @param blink: blink interval (msec) @type blink: int """ self.__blink_timer_interval = value def getBlinkInterval(self): return self.__blink_timer_interval blinkInterval = QtCore.pyqtProperty("int", getBlinkInterval, setBlinkInterval) ##FUNZIONI PER FADING def fadeIn(self): """ Button fades in from completely invisible to completely visible. """ self.__opacity = 0.0 self.__selected_fade_type = self.__FADE_TYPE.IN self.__fading_timer.start(self.__fade_time) def fadeOut(self): """ Button fades out from completely visible to completely invisible. """ self.__selected_fade_type = self.__FADE_TYPE.OUT self.__fading_timer.start(self.__fade_time) def setFadeTime(self, value): """ Sets fading time. Everytime interval is reached, alpha is increased (or decreased) by __opacity_fading_coefficient. @param value: fade time (msec) @type value: int """ self.__fade_time = value def getFadeTime(self): return self.__fade_time fadeInterval = QtCore.pyqtProperty("int", getFadeTime, setFadeTime) def setFadeCoefficient(self, value): """ Sets fading coefficient. Alpha is increased (or decreased) by this value. @param value: coefficient (min 0.0 - max 1.0) @type value: float """ self.__opacity_fading_coefficient = value def getFadeCoefficient(self): return self.__opacity_fading_coefficient fadeCoefficient = QtCore.pyqtProperty("double", getFadeCoefficient, setFadeCoefficient) def __on_fading_timer(self): if self.__selected_fade_type == self.__FADE_TYPE.OUT: if self.__opacity > 0: self.__opacity -= self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() if self.__selected_fade_type == self.__FADE_TYPE.IN: if self.__opacity <= 1.0: self.__opacity += self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() # FUNZIONI PER GROW\SHRINK def __on_growed(self): self.__animationShrink.setStartValue( QSize(self.iconSize().width(), self.iconSize().height())) self.__animationShrink.setEndValue( QSize(self.iconSize().width() - self.__iconGrowsBy, self.iconSize().height() - self.__iconGrowsBy)) self.__animationShrink.start() def __on_shrinked(self): self.__animationGrow.setStartValue( QSize(self.iconSize().width(), self.iconSize().height())) self.__animationGrow.setEndValue( QSize(self.iconSize().width() + self.__iconGrowsBy, self.iconSize().height() + self.__iconGrowsBy)) self.__animationGrow.start() def startGrow(self): """ Button ICON starts to grow and shrink to standard value when maximum size (configured) is reached """ if self.__growing: return self.__animationGrow.setStartValue( QSize(self.iconSize().width(), self.iconSize().height())) self.__animationGrow.setEndValue( QSize(self.iconSize().width() + self.__iconGrowsBy, self.iconSize().height() + self.__iconGrowsBy)) self.__animationGrow.start() self.__growing = True def stopGrow(self): if self.__animationGrow.startValue().toSize() != QSize( 0, 0) and self.__animationShrink.startValue().toSize() != QPoint( 0, 0): self.__animationGrow.stop() self.__animationShrink.stop() self.setIconSize( QSize(self.__defaultIconDimension, self.__defaultIconDimension)) self.__growing = False #FUNZIONI PER BOUNCE def startBounce(self): """ Button starts to bounce requiring attention. """ if self.__bouncing: return self.__startPos = QPoint(self.pos().x(), self.pos().y()) self.__animationUp.setStartValue( QPoint(self.__startPos.x(), self.__startPos.y())) self.__animationUp.setEndValue( QPoint(self.__startPos.x(), self.__startPos.y() - self.geometry().height())) self.__animationUp.start() self.__bouncing = True def stopBounce(self): if self.__animationUp.startValue().toPoint() != QPoint( 0, 0) and self.__animationBounce.startValue().toPoint() != QPoint( 0, 0): self.__animationBounce.stop() self.__animationUp.stop() self.setGeometry(self.__startPos.x(), self.__startPos.y(), self.geometry().width(), self.geometry().height()) self.__bouncing = False def __on_top_reached(self): self.__animationBounce.setStartValue( QPoint(self.pos().x(), self.pos().y())) self.__animationBounce.setEndValue( QPoint(self.__startPos.x(), self.__startPos.y())) self.__animationBounce.start() def __on_bounce_finished(self): self.__animationUp.start() def stopAllAnimations(self): self.stopBounce() self.stopGrow() #FUNZIONI PER PIXMAP & MASCHERA def setPixmapFile(self, image_file): self.__pmap = image_file self.__pmap.scaled(self.size()) #NB: Il pixmap deve essere BIANCO e NERO. Con heuristicMask il primo pixel in alto a sinistra (0,0) viene #usato per decidere il colore trasparente, tutto il resto è visibile. def getPixmapFile(self): return self.__pmap pixmapFile = QtCore.pyqtProperty("QPixmap", getPixmapFile, setPixmapFile) def applyMask(self, bool): self.__show_mask_preview = bool if bool: self.setMask( QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) else: self.setMask(QBitmap()) def getMask(self): return self.__show_mask_preview appliedMask = QtCore.pyqtProperty("bool", fget=getMask, fset=applyMask) def __onResize(self, event): self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) self.__pmap.scaled(self.size()) if self.__show_mask_preview: self.setMask( QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) def __on_indicator_Resize(self, event): self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0))
class SliderArea(QFrame): def __init__(self, parent): super(SliderArea, self).__init__(parent) self._parent = parent self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get( 'current-line', resources.COLOR_SCHEME['current-line']) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;") self.pressed = False self.__scroll_margins = None def paintEvent(self, event): """Paint over the widget to overlay its content.""" if not ACTIVATE_OPACITY: painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.Antialiasing, True) painter.fillRect(event.rect(), QBrush(QColor(255, 255, 255, 80))) painter.setPen(QPen(Qt.NoPen)) painter.end() super(SliderArea, self).paintEvent(event) def update_position(self): font_size = QFontMetrics(self._parent.font()).height() height = self._parent.lines_count * font_size self.setFixedHeight(height) self.setFixedWidth(self._parent.width()) self.__scroll_margins = (height, self._parent.height() - height) def move_slider(self, y): self.move(0, y) def mousePressEvent(self, event): super(SliderArea, self).mousePressEvent(event) self.pressed = True self.setCursor(Qt.ClosedHandCursor) def mouseReleaseEvent(self, event): super(SliderArea, self).mouseReleaseEvent(event) self.pressed = False self.setCursor(Qt.OpenHandCursor) def mouseMoveEvent(self, event): super(SliderArea, self).mouseMoveEvent(event) if self.pressed: pos = self.mapToParent(event.pos()) y = pos.y() - (self.height() / 2) if y < 0: y = 0 if y < self.__scroll_margins[0]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() - 2) elif y > self.__scroll_margins[1]: self._parent.verticalScrollBar().setSliderPosition( self._parent.verticalScrollBar().sliderPosition() + 2) self.move(0, y) self._parent.scroll_area(pos, event.pos())
def __init__(self, parent=None): QToolButton.__init__(self, parent) #TESTO ALTERNATIVO #Spesso se il pulsante ha icona troppo grossa e quando per ragioni di spazio o altro non si può spostare #o ridimensionare il pulsante stesso, la label ha posizioni assurde e schifose. Aggiungerne una "+ controllabile" #è l'unico modo.. self.__fixed_label = QLabel("alternative label", self) self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.__fixed_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__font = QtGui.QFont("Arial", 10) self.__fixed_label.setFont(self.__font) self.__fixed_label.show() #INDICATORE STILE iOS self.__indicator = QLabel("0", self) self.__indicator.setStyleSheet("border-image: url(':/images/backgrounds/indicator.png'); padding-right:1px; color: white;") self.__indicator.geometry().setWidth(25) self.__indicator.geometry().setHeight(20) self.__indicator.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__indicator.setVisible(False) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) #default top-right corner #Quando il pulsante viene ridimensionato (designer o meno) devo anche sistemare la label di conseguenza self.resizeEvent = self.__onResize self.__indicator.resizeEvent = self.__on_indicator_Resize self.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.clicked.connect(self.stopAllAnimations) #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN # ANIMAZIONI GROW self.__animationGrow = QPropertyAnimation(self, "iconSize", self) self.__animationGrow.setDuration(1000) self.__animationGrow.setEasingCurve(QEasingCurve.Linear) self.__animationGrow.finished.connect(self.__on_growed) self.__animationShrink = QPropertyAnimation(self, "iconSize", self) self.__animationShrink.setDuration(1000) self.__animationShrink.setEasingCurve(QEasingCurve.Linear) self.__animationShrink.finished.connect(self.__on_shrinked) self.__defaultIconDimension = 60 self.__iconGrowsBy = 40 self.__growing = False # ANIMAZIONI BOUNCE self.__animationUp = QPropertyAnimation(self, "pos", self) self.__animationUp.setDuration(200) self.__animationUp.setEasingCurve(QEasingCurve.Linear) self.__animationUp.finished.connect(self.__on_top_reached) self.__animationBounce = QPropertyAnimation(self, "pos", self) self.__animationBounce.setDuration(1000) self.__animationBounce.setEasingCurve(QEasingCurve.OutBounce) self.__animationBounce.finished.connect(self.__on_bounce_finished) self.__bouncing = False self.__startPos = QPoint(self.pos().x(), self.pos().y()) #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False
class CImprovedButton(QToolButton): def __init__(self, parent=None): QToolButton.__init__(self, parent) #TESTO ALTERNATIVO #Spesso se il pulsante ha icona troppo grossa e quando per ragioni di spazio o altro non si può spostare #o ridimensionare il pulsante stesso, la label ha posizioni assurde e schifose. Aggiungerne una "+ controllabile" #è l'unico modo.. self.__fixed_label = QLabel("alternative label", self) self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.__fixed_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__font = QtGui.QFont("Arial", 10) self.__fixed_label.setFont(self.__font) self.__fixed_label.show() #INDICATORE STILE iOS self.__indicator = QLabel("0", self) self.__indicator.setStyleSheet("border-image: url(':/images/backgrounds/indicator.png'); padding-right:1px; color: white;") self.__indicator.geometry().setWidth(25) self.__indicator.geometry().setHeight(20) self.__indicator.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__indicator.setVisible(False) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) #default top-right corner #Quando il pulsante viene ridimensionato (designer o meno) devo anche sistemare la label di conseguenza self.resizeEvent = self.__onResize self.__indicator.resizeEvent = self.__on_indicator_Resize self.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.clicked.connect(self.stopAllAnimations) #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN # ANIMAZIONI GROW self.__animationGrow = QPropertyAnimation(self, "iconSize", self) self.__animationGrow.setDuration(1000) self.__animationGrow.setEasingCurve(QEasingCurve.Linear) self.__animationGrow.finished.connect(self.__on_growed) self.__animationShrink = QPropertyAnimation(self, "iconSize", self) self.__animationShrink.setDuration(1000) self.__animationShrink.setEasingCurve(QEasingCurve.Linear) self.__animationShrink.finished.connect(self.__on_shrinked) self.__defaultIconDimension = 60 self.__iconGrowsBy = 40 self.__growing = False # ANIMAZIONI BOUNCE self.__animationUp = QPropertyAnimation(self, "pos", self) self.__animationUp.setDuration(200) self.__animationUp.setEasingCurve(QEasingCurve.Linear) self.__animationUp.finished.connect(self.__on_top_reached) self.__animationBounce = QPropertyAnimation(self, "pos", self) self.__animationBounce.setDuration(1000) self.__animationBounce.setEasingCurve(QEasingCurve.OutBounce) self.__animationBounce.finished.connect(self.__on_bounce_finished) self.__bouncing = False self.__startPos = QPoint(self.pos().x(), self.pos().y()) #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False def setDefaultIconSize(self, value): """ Sets default icon size when growing stops. @param value: size (both width and height) @type value: int """ self.__defaultIconDimension = value def getDefaultIconSize(self): return self.__defaultIconDimension defaultIconSize = QtCore.pyqtProperty("int", getDefaultIconSize, setDefaultIconSize) def setFixetTextVisibility(self, bool): """ Sets if fixed text is visible or not. @param bool: visible or not @type bool: bool """ self.__fixed_label.setVisible(bool) def getFixetTextVisibility(self): return self.__fixed_label.isVisible() fixetTextVisibility = QtCore.pyqtProperty("bool", fget=getFixetTextVisibility, fset=setFixetTextVisibility) def setFixedText(self, txt): """ Sets text on the button. @param txt: text @type txt: string """ self.__fixed_label.setText(txt) def getFixedText(self): return self.__fixed_label.text() fixedText = QtCore.pyqtProperty("QString", getFixedText, setFixedText) def setFixedTextPos(self, qpoint): """ Sets text position in the button. @param qpoint: Position RELATIVE. 0,0 is top left corner of the button. @type qpoint: QPoint """ self.__fixed_label.move(qpoint) def getFixedTextPos(self): return self.__fixed_label.pos() fixedTextPos = QtCore.pyqtProperty("QPoint", getFixedTextPos, setFixedTextPos) def setFixedTextFont(self, font): """ Sets text font. @param font: Font for fixed text. @type font: QFont """ self.__font = font self.__fixed_label.setFont(self.__font) def getFixedTextFont(self): return self.__font fixedTextFont = QtCore.pyqtProperty("QFont", getFixedTextFont, setFixedTextFont) #FUNZIONI INDICATORE def setIndicatorVisibility(self, bool): """ Sets if indicator is visible or not. @param bool: visible or not @type bool: bool """ self.__indicator.setVisible(bool) def getIndicatorVisibility(self): return self.__indicator.isVisible() indicatorVisibility = QtCore.pyqtProperty("bool", fget=getIndicatorVisibility, fset=setIndicatorVisibility) def setIndicatorPos(self, qpoint): """ Sets indicator position in the button. @param qpoint: Position RELATIVE. 0,0 is top left corner of the button. @type qpoint: QPoint """ self.__indicator.move(qpoint) def getIndicatorPos(self): return self.__indicator.pos() indicatorPos = QtCore.pyqtProperty("QPoint", getIndicatorPos, setIndicatorPos) def setIndicatorSize(self, size): """ Sets indicator size. @param size: Size @type size: QSize """ self.__indicator.resize(size) def getIndicatorSize(self): return self.__indicator.size() indicatorSize = QtCore.pyqtProperty("QSize", getIndicatorSize, setIndicatorSize) def setIndicatorFont(self, font): """ Sets indicator text font. @param font: Font for indicator text. @type font: QFont """ self.__indicator.setFont(font) def getIndicatorFont(self): return self.__indicator.font() indicatorFont = QtCore.pyqtProperty("QFont", getIndicatorFont, setIndicatorFont) ## FUNZIONI PER BLINK def __on_blink_timer(self): self.setVisible(not (self.isVisible())) def setBlinking(self, blink): """ Sets if the button have to blink or not. @param blink: blinking or not @type blink: bool """ if blink: self.__blink_timer.setInterval(self.__blink_timer_interval) self.__blink_timer.start() else: self.__blink_timer.stop() self.setVisible(True) def setBlinkInterval(self, value): """ Sets blink interval. @param blink: blink interval (msec) @type blink: int """ self.__blink_timer_interval = value def getBlinkInterval(self): return self.__blink_timer_interval blinkInterval = QtCore.pyqtProperty("int", getBlinkInterval, setBlinkInterval) ##FUNZIONI PER FADING def fadeIn(self): """ Button fades in from completely invisible to completely visible. """ self.__opacity = 0.0 self.__selected_fade_type = self.__FADE_TYPE.IN self.__fading_timer.start(self.__fade_time) def fadeOut(self): """ Button fades out from completely visible to completely invisible. """ self.__selected_fade_type = self.__FADE_TYPE.OUT self.__fading_timer.start(self.__fade_time) def setFadeTime(self, value): """ Sets fading time. Everytime interval is reached, alpha is increased (or decreased) by __opacity_fading_coefficient. @param value: fade time (msec) @type value: int """ self.__fade_time = value def getFadeTime(self): return self.__fade_time fadeInterval = QtCore.pyqtProperty("int", getFadeTime, setFadeTime) def setFadeCoefficient(self, value): """ Sets fading coefficient. Alpha is increased (or decreased) by this value. @param value: coefficient (min 0.0 - max 1.0) @type value: float """ self.__opacity_fading_coefficient = value def getFadeCoefficient(self): return self.__opacity_fading_coefficient fadeCoefficient = QtCore.pyqtProperty("double", getFadeCoefficient, setFadeCoefficient) def __on_fading_timer(self): if self.__selected_fade_type == self.__FADE_TYPE.OUT: if self.__opacity > 0: self.__opacity -= self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() if self.__selected_fade_type == self.__FADE_TYPE.IN: if self.__opacity <= 1.0: self.__opacity += self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() # FUNZIONI PER GROW\SHRINK def __on_growed(self): self.__animationShrink.setStartValue(QSize(self.iconSize().width(), self.iconSize().height())) self.__animationShrink.setEndValue( QSize(self.iconSize().width() - self.__iconGrowsBy, self.iconSize().height() - self.__iconGrowsBy)) self.__animationShrink.start() def __on_shrinked(self): self.__animationGrow.setStartValue(QSize(self.iconSize().width(), self.iconSize().height())) self.__animationGrow.setEndValue( QSize(self.iconSize().width() + self.__iconGrowsBy, self.iconSize().height() + self.__iconGrowsBy)) self.__animationGrow.start() def startGrow(self): """ Button ICON starts to grow and shrink to standard value when maximum size (configured) is reached """ if self.__growing: return self.__animationGrow.setStartValue(QSize(self.iconSize().width(), self.iconSize().height())) self.__animationGrow.setEndValue( QSize(self.iconSize().width() + self.__iconGrowsBy, self.iconSize().height() + self.__iconGrowsBy)) self.__animationGrow.start() self.__growing = True def stopGrow(self): if self.__animationGrow.startValue().toSize() != QSize(0, 0) and self.__animationShrink.startValue().toSize() != QPoint( 0, 0): self.__animationGrow.stop() self.__animationShrink.stop() self.setIconSize(QSize(self.__defaultIconDimension, self.__defaultIconDimension)) self.__growing = False #FUNZIONI PER BOUNCE def startBounce(self): """ Button starts to bounce requiring attention. """ if self.__bouncing: return self.__startPos = QPoint(self.pos().x(), self.pos().y()) self.__animationUp.setStartValue(QPoint(self.__startPos.x(), self.__startPos.y())) self.__animationUp.setEndValue(QPoint(self.__startPos.x(), self.__startPos.y() - self.geometry().height())) self.__animationUp.start() self.__bouncing = True def stopBounce(self): if self.__animationUp.startValue().toPoint() != QPoint(0,0) and self.__animationBounce.startValue().toPoint() != QPoint(0,0): self.__animationBounce.stop() self.__animationUp.stop() self.setGeometry(self.__startPos.x(), self.__startPos.y(), self.geometry().width(), self.geometry().height()) self.__bouncing = False def __on_top_reached(self): self.__animationBounce.setStartValue(QPoint(self.pos().x(), self.pos().y())) self.__animationBounce.setEndValue(QPoint(self.__startPos.x(), self.__startPos.y())) self.__animationBounce.start() def __on_bounce_finished(self): self.__animationUp.start() def stopAllAnimations(self): self.stopBounce() self.stopGrow() #FUNZIONI PER PIXMAP & MASCHERA def setPixmapFile(self, image_file): self.__pmap = image_file self.__pmap.scaled(self.size()) #NB: Il pixmap deve essere BIANCO e NERO. Con heuristicMask il primo pixel in alto a sinistra (0,0) viene #usato per decidere il colore trasparente, tutto il resto è visibile. def getPixmapFile(self): return self.__pmap pixmapFile = QtCore.pyqtProperty("QPixmap", getPixmapFile, setPixmapFile) def applyMask(self, bool): self.__show_mask_preview = bool if bool: self.setMask(QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) else: self.setMask(QBitmap()) def getMask(self): return self.__show_mask_preview appliedMask = QtCore.pyqtProperty("bool", fget=getMask, fset=applyMask) def __onResize(self, event): self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) self.__pmap.scaled(self.size()) if self.__show_mask_preview: self.setMask(QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) def __on_indicator_Resize(self, event): self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0))
class SliderArea(QFrame): def __init__(self, minimap): super(SliderArea, self).__init__(minimap) self._minimap = minimap self.pressed = False self.setMouseTracking(True) self.setCursor(Qt.OpenHandCursor) color = resources.CUSTOM_SCHEME.get( 'MinimapVisibleArea', resources.COLOR_SCHEME['MinimapVisibleArea']) if ACTIVATE_OPACITY: self.setStyleSheet("background: %s;" % color) self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MAX_OPACITY / 2) else: self.setStyleSheet("background: transparent;") def mousePressEvent(self, event): super(SliderArea, self).mousePressEvent(event) self.pressed = True self.setCursor(Qt.ClosedHandCursor) # Get line number from lines on screen # This is to moving the slider from the point where you clicked first_visible_line = self._minimap._editor.SendScintilla( QsciScintilla.SCI_GETFIRSTVISIBLELINE) pos_parent = self.mapToParent(event.pos()) position = self._minimap.SendScintilla( QsciScintilla.SCI_POSITIONFROMPOINT, pos_parent.x(), pos_parent.y()) line = self._minimap.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, position) self.line_on_visible_area = (line - first_visible_line) + 1 def mouseReleaseEvent(self, event): super(SliderArea, self).mouseReleaseEvent(event) self.pressed = False self.setCursor(Qt.OpenHandCursor) def update_position(self): font_size = round(self._minimap.font().pointSize() / 2.5) lines_count = self._minimap._editor.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) height = lines_count * font_size self.setFixedHeight(height) self.setFixedWidth(self._minimap.width()) def paintEvent(self, event): """Paint over the widget to overlay its content.""" if not ACTIVATE_OPACITY: painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.TextAntialiasing, True) painter.setRenderHint(QPainter.Antialiasing, True) painter.fillRect(event.rect(), QBrush(QColor(226, 0, 0, 80))) painter.setPen(QPen(Qt.NoPen)) painter.end() super(SliderArea, self).paintEvent(event) def mouseMoveEvent(self, event): super(SliderArea, self).mouseMoveEvent(event) if self.pressed: pos = self.mapToParent(event.pos()) self._minimap.scroll_area(pos, self.line_on_visible_area)
class MiniMap(QPlainTextEdit): def __init__(self, parent): super(MiniMap, self).__init__(parent) self.setWordWrapMode(QTextOption.NoWrap) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.setCenterOnScroll(True) self.setMouseTracking(True) self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent self.highlighter = None styles.set_style(self, 'minimap') self.max_line = 0 self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") def __calculate_max(self): first_line = self._parent.firstVisibleBlock().blockNumber() last_line = self._parent._sidebarWidget.highest_line self.max_line = last_line - first_line self.update_visible_area() def set_code(self, source): self.setPlainText(source) self.__calculate_max() def adjust_to_parent(self): self.setFixedHeight(self._parent.height()) self.setFixedWidth(self._parent.width() * settings.SIZE_PROPORTION) x = self._parent.width() - self.width() self.move(x, 0) fontsize = int(self.width() / settings.MARGIN_LINE) if fontsize < 1: fontsize = 1 font = self.document().defaultFont() font.setPointSize(fontsize) self.setFont(font) self.__calculate_max() def update_visible_area(self): block = self._parent.firstVisibleBlock() first_line = block.blockNumber() max_count = self.blockCount() parent_cursor = self._parent.textCursor() parent_cursor.setPosition(block.position()) self.setTextCursor(parent_cursor) lines_count = self.max_line if (first_line + self.max_line) > max_count: lines_count = max_count - first_line extraSelections = [] for i in xrange(lines_count): selection = QTextEdit.ExtraSelection() lineColor = QColor(resources.CUSTOM_SCHEME.get('current-line', resources.COLOR_SCHEME['current-line'])) lineColor.setAlpha(100) selection.format.setBackground(lineColor) selection.format.setProperty(QTextFormat.FullWidthSelection, True) cursor = self.textCursor() cursor.setPosition(block.position()) selection.cursor = cursor selection.cursor.clearSelection() extraSelections.append(selection) block = block.next() self.setExtraSelections(extraSelections) def enterEvent(self, event): self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MIN_OPACITY) self.animation.setEndValue(settings.MINIMAP_MAX_OPACITY) self.animation.start() def leaveEvent(self, event): self.animation.setDuration(300) self.animation.setStartValue(settings.MINIMAP_MAX_OPACITY) self.animation.setEndValue(settings.MINIMAP_MIN_OPACITY) self.animation.start() def mousePressEvent(self, event): super(MiniMap, self).mousePressEvent(event) cursor = self.cursorForPosition(event.pos()) self._parent.jump_to_line(cursor.blockNumber())
class CImprovedLabel(QLabel): def __init__(self, parent=None, caption=None): QLabel.__init__(self, parent) self.setText(self.accessibleName()) self.setFont(QtGui.QFont("Arial", 12)) self.__separator = chr(004) #Used as separator while scrolling text #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN #SCROLLING self.__scrolling_timer = QTimer(parent) self.__scrolling_timer.timeout.connect(self.__on_scrolling_timer) self.__scroll_time = 1000 self.__original_text = "" #MOVE self.__move_animation_type = QEasingCurve.Linear self.__move_time = 350 ## FUNZIONI PER BLINK def __on_blink_timer(self): self.setVisible(not (self.isVisible())) def setBlinking(self, blink): """ Sets if the label have to blink or not. @param blink: blinking or not @type blink: bool """ if blink: self.__blink_timer.setInterval(self.__blink_timer_interval) self.__blink_timer.start() else: self.__blink_timer.stop() self.setVisible(True) def setBlinkInterval(self, value): """ Sets blink interval. @param value: blink interval (msec) @type value: int """ self.__blink_timer_interval = value def getBlinkInterval(self): return self.__blink_timer_interval blinkInterval = QtCore.pyqtProperty("int", getBlinkInterval, setBlinkInterval) ##FUNZIONI PER FADING def fadeIn(self): """ Labels fades in from completely invisible to completely visible. """ self.__opacity = 0.0 self.__selected_fade_type = self.__FADE_TYPE.IN self.__fading_timer.start(self.__fade_time) def fadeOut(self): """ Labels fades out from completely visible to completely invisible. """ self.__selected_fade_type = self.__FADE_TYPE.OUT self.__fading_timer.start(self.__fade_time) def setFadeTime(self, value): """ Sets fading time. Everytime interval is reached, alpha is increased (or decreased) by __opacity_fading_coefficient. @param value: fade time (msec) @type value: int """ self.__fade_time = value def getFadeTime(self): return self.__fade_time fadeInterval = QtCore.pyqtProperty("int", getFadeTime, setFadeTime) def setFadeCoefficient(self, value): """ Sets fading coefficient. Alpha is increased (or decreased) by this value. @param value: coefficient (min 0.0 - max 1.0) @type value: float """ self.__opacity_fading_coefficient = value def getFadeCoefficient(self): return self.__opacity_fading_coefficient fadeCoefficient = QtCore.pyqtProperty("double", getFadeCoefficient, setFadeCoefficient) def __on_fading_timer(self): if self.__selected_fade_type == self.__FADE_TYPE.OUT: if self.__opacity > 0: self.__opacity -= self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() if self.__selected_fade_type == self.__FADE_TYPE.IN: if self.__opacity <= 1.0: self.__opacity += self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() #FUNZIONI PER SCROLLING def __move_text_left(self): if self.__separator not in self.text(): self.setText(self.text() + " " + self.__separator + " ") left = str(self.text())[:1] right = str(self.text())[1:] self.setText(right + left) def __on_scrolling_timer(self): self.__move_text_left() def scrollingText(self, scroll): """ Sets if the label have to scroll or not. @param scroll: scrolling right to left or not @type scroll: bool """ self.__scrolling_timer.setInterval(self.__scroll_time) if scroll: self.__original_text = self.text() self.__scrolling_timer.start() else: self.__scrolling_timer.stop() self.setText(self.__original_text) def setScrollingTime(self, value): """ Sets scrolling time. Everytime interval is reached, string is scrolled to left by one char. @param value: scrolling time (msec) @type value: int """ self.__scroll_time = value ## FUNZIONI PER SPOSTAMENTO VERSO PUNTO (ANIMATO) def setMoveAnimationType(self, animation_type): """ Sets move animation type. @param animation_type: animation type @type animation_type: QtEasingCurve """ self.__move_animation_type = animation_type def getMoveAnimationType(self): return self.__move_animation_type #asd = QtCore.pyqtProperty("QEasingCurve", getMoveAnimationType, setMoveAnimationType) #sembra nn essere supportato per ora (06/05/2013) def setMoveTime(self, value): """ Sets animation moving time. @param value: animation time (duration) (msec) @type value: int """ self.__move_time = value def moveTo(self, x, y): """ Move itself to a given point with the given animation in the given duration. @param x: X point coordinate @type x: int @param y: Y point coordinate @type y: int """ self.__starting_position = QPoint(self.pos()) self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue(self.__starting_position) self.__moveAnimation.setEndValue(QPoint(x, y)) self.__moveAnimation.start() def returnToOriginalPoint(self): """ Label returns to its original position. The original position is stored when calling moveTo() method. """ self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue(QPoint(self.pos().x(), self.pos().y())) self.__moveAnimation.setEndValue(self.__starting_position) self.__moveAnimation.start() def mousePressEvent(self, event): self.clicked.emit()
class CImprovedPanel(QFrame): def __init__(self, parent=None): QFrame.__init__(self, parent) #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN self.resizeEvent = self.__onResize #MOVE self.__move_animation_type = QEasingCurve.Linear self.__move_time = 350 self.__is_moving = False #RESIZE self.__resize_animation_type = QEasingCurve.Linear self.__resize_time = 700 self.__is_resizing = False #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False #SHADOW self.__shadow_Xoffset = 3.0 #default value self.__shadow_Yoffset = 3.0 #default value self.__shadow_blur_radius = 8.0 #default value self.__shadow_color = QColor(38,38,38,150) #default value self.__shadow_effect = QGraphicsDropShadowEffect() self.__shadow_effect.setXOffset(self.__shadow_Xoffset) self.__shadow_effect.setYOffset(self.__shadow_Yoffset) self.__shadow_effect.setBlurRadius(self.__shadow_blur_radius) self.__shadow_effect.setColor(self.__shadow_color) self._shadow_visible = False ##FUNZIONI PER FADING def fadeIn(self): """ Labels fades in from completely invisible to completely visible. """ self.__opacity = 0.0 self.__selected_fade_type = self.__FADE_TYPE.IN self.__fading_timer.start(self.__fade_time) def fadeOut(self): """ Labels fades out from completely visible to completely invisible. """ self.__selected_fade_type = self.__FADE_TYPE.OUT self.__fading_timer.start(self.__fade_time) def setFadeTime(self, value): """ Sets fading time. Everytime interval is reached, alpha is increased (or decreased) by __opacity_fading_coefficient. @param value: fade time (msec) @type value: int """ self.__fade_time = value def getFadeTime(self): return self.__fade_time fadeInterval = QtCore.pyqtProperty("int", getFadeTime, setFadeTime) def setFadeCoefficient(self, value): """ Sets fading coefficient. Alpha is increased (or decreased) by this value. @param value: coefficient (min 0.0 - max 1.0) @type value: float """ self.__opacity_fading_coefficient = value def getFadeCoefficient(self): return self.__opacity_fading_coefficient fadeCoefficient = QtCore.pyqtProperty("double", getFadeCoefficient, setFadeCoefficient) def __on_fading_timer(self): if self.__selected_fade_type == self.__FADE_TYPE.OUT: if self.__opacity > 0: self.__opacity -= self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() if self.__selected_fade_type == self.__FADE_TYPE.IN: if self.__opacity <= 1.0: self.__opacity += self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() ## FUNZIONI PER SPOSTAMENTO VERSO PUNTO (ANIMATO) def setMoveAnimationType(self, animation_type): """ Sets move animation type. @param animation_type: animation type @type animation_type: QtEasingCurve """ self.__move_animation_type = animation_type def getMoveAnimationType(self): return self.__move_animation_type #asd = QtCore.pyqtProperty("QEasingCurve", getMoveAnimationType, setMoveAnimationType) #sembra nn essere supportato per ora (06/05/2013) def setMoveTime(self, value): """ Sets animation moving time. @param value: animation time (duration) (msec) @type value: int """ self.__move_time = value def getMoveTime(self): return self.__move_time moveTime = QtCore.pyqtProperty("int", getMoveTime, setMoveTime) def setResizeTime(self, value): """ Sets animation resize time. @param value: animation time (duration) (msec) @type value: int """ self.__resize_time = value def getResizeTime(self): return self.__resize_time resizeTime = QtCore.pyqtProperty("int", getResizeTime, setResizeTime) def moveTo(self, x, y): """ Move itself to a given point with the given animation in the given duration. @param x: X point coordinate @type x: int @param y: Y point coordinate @type y: int """ if self.__is_moving: return self.__is_moving = True self.__starting_position = QPoint(self.pos()) self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.finished.connect(self.__on_finished_moving) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue(self.__starting_position) self.__moveAnimation.setEndValue(QPoint(x, y)) self.__moveAnimation.start() def hideLeft(self): """ Panel hides sliding on the left. The slide amount is equal to his width - 5px. """ dest_x = self.geometry().x() - self.width() - 5 dest_y = self.geometry().y() self.moveTo(dest_x, dest_y) def showFromLeft(self): """ Panel shows sliding from the left. The slide amount is equal to his width + 5px. """ dest_x = self.geometry().x() + self.width() + 5 dest_y = self.geometry().y() self.moveTo(dest_x, dest_y) def hideRight(self): """ Panel hides sliding on the right. The slide amount is equal to his width - 5px. """ dest_x = self.geometry().x() + self.width() + 5 dest_y = self.geometry().y() self.moveTo(dest_x, dest_y) def showFromRight(self): """ Panel shows sliding from the right. The slide amount is equal to his width + 5px. """ dest_x = self.geometry().x() - self.width() - 5 dest_y = self.geometry().y() self.moveTo(dest_x, dest_y) def hideTop(self): """ Panel hides sliding on the top. The slide amount is equal to his height - 5px. """ dest_x = self.geometry().x() dest_y = self.geometry().y() - self.height() - 5 self.moveTo(dest_x, dest_y) def showFromTop(self): """ Panel shows sliding from the top. The slide amount is equal to his height - 5px. """ dest_x = self.geometry().x() dest_y = self.geometry().y() + self.height() - 5 self.moveTo(dest_x, dest_y) def hideBottom(self): """ Panel hides sliding to the bottom. The slide amount is equal to his height - 5px. """ dest_x = self.geometry().x() dest_y = self.geometry().y() + self.height() + 5 self.moveTo(dest_x, dest_y) def showFromBottom(self): """ Panel hides sliding from the bottom. The slide amount is equal to his height - 5px. """ dest_x = self.geometry().x() dest_y = self.geometry().y() - self.height() - 5 self.moveTo(dest_x, dest_y) def returnToOriginalPoint(self): """ Panel returns in its original position. The original position is stored when calling moveTo() method. """ if self.__is_moving: return self.__is_moving = True self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.finished.connect(self.__on_finished_moving) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue(QPoint(self.pos().x(), self.pos().y())) self.__moveAnimation.setEndValue(self.__starting_position) self.__moveAnimation.start() #FUNZIONI PER RIDIMENSIONAMENTO def setResizeAnimationType(self, animation_type): """ Sets move animation type. @param animation_type: animation type @type animation_type: QtEasingCurve """ self.__resize_animation_type = animation_type def resizeTo(self, width, height): """ Resize itself to a given size with the given animation in the given duration. @param width: New width @type width: int @param height: New height @type height: int """ if self.__is_resizing: return self.__is_resizing = True self.__original_size = self.geometry() self.__resizeAnimation = QPropertyAnimation(self, "geometry", self) self.__resizeAnimation.finished.connect(self.__on_finished_resizing) self.__resizeAnimation.setDuration(self.__resize_time) self.__resizeAnimation.setEasingCurve(self.__resize_animation_type) self.__resizeAnimation.setStartValue(self.__original_size) self.__resizeAnimation.setEndValue(QRect(self.pos().x(), self.pos().y(), width, height)) self.__resizeAnimation.start() def foldLeft(self): """ Panel hides folding to the left. """ new_width = 0 new_height = self.height() self.resizeTo(new_width, new_height) def unfoldLeft(self): """ Panel shows folding from the left. """ new_width = self.__original_size.width() new_height = self.height() self.resizeTo(new_width, new_height) def foldTop(self): """ Panel hides folding to the top. """ new_width = self.width() new_height = 0 self.resizeTo(new_width, new_height) def unfoldTop(self): """ Panel shows folding from the top. """ new_width = self.width() new_height = self.__original_size.height() self.resizeTo(new_width, new_height) #FUNZIONI PER PIXMAP & MASCHERA def setPixmapFile(self, image_file): self.__pmap = image_file self.__pmap.scaled(self.size()) #NB: Il pixmap deve essere BIANCO e NERO. Con heuristicMask il primo pixel in alto a sinistra (0,0) viene #usato per decidere il colore trasparente, tutto il resto è visibile. def getPixmapFile(self): return self.__pmap pixmapFile = QtCore.pyqtProperty("QPixmap", getPixmapFile, setPixmapFile) def applyMask(self, bool): self.__show_mask_preview = bool if bool: self.setMask(QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) else: self.setMask(QBitmap()) def getMask(self): return self.__show_mask_preview appliedMask = QtCore.pyqtProperty("bool", fget=getMask, fset=applyMask) def __on_finished_moving(self): self.__is_moving = False def __on_finished_resizing(self): self.__is_resizing = False def __onResize(self, event): self.__pmap.scaled(self.size()) if self.__show_mask_preview: self.setMask(QBitmap(self.__pmap.createHeuristicMask().scaled(self.size()))) #FUNZIONI PER SHADOW def getShadow(self): return self._shadow_visible def setShadow(self, bool): self.setGraphicsEffect(self.__shadow_effect) self._shadow_visible = bool self.__shadow_effect.setEnabled(bool) shadow = QtCore.pyqtProperty("bool", fget=getShadow, fset=setShadow) def setShadowXOffset(self, value): """ Sets shadow offset on X. @param value: offset @type value: float """ self.__shadow_Xoffset = value self.__shadow_effect.setXOffset(self.__shadow_Xoffset) def getShadowXOffset(self): return self.__shadow_Xoffset shadowXOffset = QtCore.pyqtProperty("double", getShadowXOffset, setShadowXOffset) def setShadowYOffset(self, value): """ Sets shadow offset on Y. @param value: offset @type value: float """ self.__shadow_Yoffset = value self.__shadow_effect.setYOffset(self.__shadow_Yoffset) def getShadowYOffset(self): return self.__shadow_Yoffset shadowYOffset = QtCore.pyqtProperty("double", getShadowYOffset, setShadowYOffset) def setShadowBlur(self, value): """ Sets blurred effect on item's shadow. @param value: coefficient @type value: float """ self.__shadow_blur_radius = value self.__shadow_effect.setBlurRadius(self.__shadow_blur_radius) def getShadowBlur(self): return self.__shadow_blur_radius shadowBlur = QtCore.pyqtProperty("double", getShadowBlur, setShadowBlur) def setShadowColor(self, color): """ Sets shadow's color. @param color: value @type color: color """ self.__shadow_color = color self.__shadow_effect.setColor(self.__shadow_color) def getShadowColor(self): return self.__shadow_color
class CImprovedLabel(QLabel): def __init__(self, parent=None, caption=None): QLabel.__init__(self, parent) self.setText(self.accessibleName()) self.setFont(QtGui.QFont("Arial", 12)) self.__separator = chr(004) #Used as separator while scrolling text #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN #SCROLLING self.__scrolling_timer = QTimer(parent) self.__scrolling_timer.timeout.connect(self.__on_scrolling_timer) self.__scroll_time = 1000 self.__original_text = "" #MOVE self.__move_animation_type = QEasingCurve.Linear self.__move_time = 350 ## FUNZIONI PER BLINK def __on_blink_timer(self): self.setVisible(not (self.isVisible())) def setBlinking(self, blink): """ Sets if the label have to blink or not. @param blink: blinking or not @type blink: bool """ if blink: self.__blink_timer.setInterval(self.__blink_timer_interval) self.__blink_timer.start() else: self.__blink_timer.stop() self.setVisible(True) def setBlinkInterval(self, value): """ Sets blink interval. @param value: blink interval (msec) @type value: int """ self.__blink_timer_interval = value def getBlinkInterval(self): return self.__blink_timer_interval blinkInterval = QtCore.pyqtProperty("int", getBlinkInterval, setBlinkInterval) ##FUNZIONI PER FADING def fadeIn(self): """ Labels fades in from completely invisible to completely visible. """ self.__opacity = 0.0 self.__selected_fade_type = self.__FADE_TYPE.IN self.__fading_timer.start(self.__fade_time) def fadeOut(self): """ Labels fades out from completely visible to completely invisible. """ self.__selected_fade_type = self.__FADE_TYPE.OUT self.__fading_timer.start(self.__fade_time) def setFadeTime(self, value): """ Sets fading time. Everytime interval is reached, alpha is increased (or decreased) by __opacity_fading_coefficient. @param value: fade time (msec) @type value: int """ self.__fade_time = value def getFadeTime(self): return self.__fade_time fadeInterval = QtCore.pyqtProperty("int", getFadeTime, setFadeTime) def setFadeCoefficient(self, value): """ Sets fading coefficient. Alpha is increased (or decreased) by this value. @param value: coefficient (min 0.0 - max 1.0) @type value: float """ self.__opacity_fading_coefficient = value def getFadeCoefficient(self): return self.__opacity_fading_coefficient fadeCoefficient = QtCore.pyqtProperty("double", getFadeCoefficient, setFadeCoefficient) def __on_fading_timer(self): if self.__selected_fade_type == self.__FADE_TYPE.OUT: if self.__opacity > 0: self.__opacity -= self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() if self.__selected_fade_type == self.__FADE_TYPE.IN: if self.__opacity <= 1.0: self.__opacity += self.__opacity_fading_coefficient self.__opacity_effect.setOpacity(self.__opacity) self.setGraphicsEffect(self.__opacity_effect) else: self.__fading_timer.stop() #FUNZIONI PER SCROLLING def __move_text_left(self): if self.__separator not in self.text(): self.setText(self.text() + " " + self.__separator + " ") left = str(self.text())[:1] right = str(self.text())[1:] self.setText(right + left) def __on_scrolling_timer(self): self.__move_text_left() def scrollingText(self, scroll): """ Sets if the label have to scroll or not. @param scroll: scrolling right to left or not @type scroll: bool """ self.__scrolling_timer.setInterval(self.__scroll_time) if scroll: self.__original_text = self.text() self.__scrolling_timer.start() else: self.__scrolling_timer.stop() self.setText(self.__original_text) def setScrollingTime(self, value): """ Sets scrolling time. Everytime interval is reached, string is scrolled to left by one char. @param value: scrolling time (msec) @type value: int """ self.__scroll_time = value ## FUNZIONI PER SPOSTAMENTO VERSO PUNTO (ANIMATO) def setMoveAnimationType(self, animation_type): """ Sets move animation type. @param animation_type: animation type @type animation_type: QtEasingCurve """ self.__move_animation_type = animation_type def getMoveAnimationType(self): return self.__move_animation_type #asd = QtCore.pyqtProperty("QEasingCurve", getMoveAnimationType, setMoveAnimationType) #sembra nn essere supportato per ora (06/05/2013) def setMoveTime(self, value): """ Sets animation moving time. @param value: animation time (duration) (msec) @type value: int """ self.__move_time = value def moveTo(self, x, y): """ Move itself to a given point with the given animation in the given duration. @param x: X point coordinate @type x: int @param y: Y point coordinate @type y: int """ self.__starting_position = QPoint(self.pos()) self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue(self.__starting_position) self.__moveAnimation.setEndValue(QPoint(x, y)) self.__moveAnimation.start() def returnToOriginalPoint(self): """ Label returns to its original position. The original position is stored when calling moveTo() method. """ self.__moveAnimation = QPropertyAnimation(self, "pos", self) self.__moveAnimation.setDuration(self.__move_time) self.__moveAnimation.setEasingCurve(self.__move_animation_type) self.__moveAnimation.setStartValue( QPoint(self.pos().x(), self.pos().y())) self.__moveAnimation.setEndValue(self.__starting_position) self.__moveAnimation.start() def mousePressEvent(self, event): self.clicked.emit()
class MiniMap(QsciScintilla): def __init__(self, editor): super(MiniMap, self).__init__(editor) self._editor = editor self.SendScintilla(QsciScintilla.SCI_SETCARETSTYLE, 0) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETZOOM, -10) self.SendScintilla(QsciScintilla.SCI_SETREADONLY, 1) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, 1) self.SendScintilla(QsciScintilla.SCI_SETCURSOR, 8) # Hide markers for i in range(1, 5): self.SendScintilla(QsciScintilla.SCI_MARKERDEFINE, i, QsciScintilla.SC_MARK_EMPTY) self.SendScintilla(QsciScintilla.SCI_SETMARGINWIDTHN, 1, 0) self.setMouseTracking(True) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.animation.setDuration(300) self.slider = SliderArea(self) self.slider.show() def adjust_to_parent(self): self.setFixedHeight(self._editor.height()) self.setFixedWidth(self._editor.width() * settings.SIZE_PROPORTION) x = self._editor.width() - self.width() self.move(x, 0) self.slider.update_position() def shutdown(self): self._editor.SCN_UPDATEUI.disconnect() self._editor.SCN_ZOOM.disconnect() def fold(self, line): self.foldLine(line) def scroll_map(self): first_visible_line = self._editor.SendScintilla( QsciScintilla.SCI_GETFIRSTVISIBLELINE) num_doc_lines = self._editor.SendScintilla( QsciScintilla.SCI_GETLINECOUNT) num_visible_lines = self._editor.SendScintilla( QsciScintilla.SCI_DOCLINEFROMVISIBLE, num_doc_lines) lines_on_screen = self._editor.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) if num_visible_lines > lines_on_screen: last_top_visible_line = num_visible_lines - lines_on_screen num_map_visible_lines = self.SendScintilla( QsciScintilla.SCI_DOCLINEFROMVISIBLE, num_doc_lines) # Lines on screen map lines_on_screenm = self.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) # Last top visible line on map last_top_visible_linem = num_map_visible_lines - lines_on_screenm # Portion covered portion = first_visible_line / last_top_visible_line first_visible_linem = round(last_top_visible_linem * portion) # Scroll self.verticalScrollBar().setValue(first_visible_linem) # Move slider higher_pos = self._editor.SendScintilla( QsciScintilla.SCI_POSITIONFROMPOINT, 0, 0) y = self.SendScintilla(QsciScintilla.SCI_POINTYFROMPOSITION, 0, higher_pos) self.slider.move(0, y) self._current_scroll_value = self._editor.verticalScrollBar().value() def scroll_area(self, pos_parent, line_area): line = self.__line_from_position(pos_parent) self._editor.verticalScrollBar().setValue(line - line_area) def mousePressEvent(self, event): super(MiniMap, self).mousePressEvent(event) line = self.__line_from_position(event.pos()) self._editor.jump_to_line(line) # Go to center los = self._editor.SendScintilla(QsciScintilla.SCI_LINESONSCREEN) / 2 scroll_value = self._editor.verticalScrollBar().value() if self._current_scroll_value < scroll_value: self._editor.verticalScrollBar().setValue(scroll_value + los) else: self._editor.verticalScrollBar().setValue(scroll_value - los) def __line_from_position(self, point): position = self.SendScintilla(QsciScintilla.SCI_POSITIONFROMPOINT, point.x(), point.y()) return self.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, position) def enterEvent(self, event): if ACTIVATE_OPACITY: self.animation.setStartValue(settings.MINIMAP_MIN_OPACITY) self.animation.setEndValue(settings.MINIMAP_MAX_OPACITY) self.animation.start() def leaveEvent(self, event): if ACTIVATE_OPACITY: self.animation.setStartValue(settings.MINIMAP_MAX_OPACITY) self.animation.setEndValue(settings.MINIMAP_MIN_OPACITY) self.animation.start() def wheelEvent(self, event): super(MiniMap, self).wheelEvent(event) self._editor.wheelEvent(event) def resizeEvent(self, event): super(MiniMap, self).resizeEvent(event) self.slider.update_position()
class Ui_MainWindow(QMainWindow): def __init__(self): super(Ui_MainWindow, self).__init__() MainWindow = self self.setBgPic() self.setupUi(MainWindow) self.excel_file = r'' self.setIcon() self.setBtnConnect() def setupUi(self, window1): window1.setObjectName(_fromUtf8("window1")) window1.resize(734, 422) self.setFixedSize(734, 422) self.centralwidget = QtGui.QWidget(window1) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) self.importBtn = QtGui.QPushButton(self.centralwidget) self.importBtn.setGeometry(QtCore.QRect(320, 240, 101, 51)) self.importBtn.setStyleSheet( _fromUtf8("font: 10pt \"MS Shell Dlg 2\";")) self.importBtn.setObjectName(_fromUtf8("importBtn")) self.selectBtn = QtGui.QPushButton(self.centralwidget) self.selectBtn.setGeometry(QtCore.QRect(460, 240, 101, 51)) self.selectBtn.setStyleSheet( _fromUtf8("font: 10pt \"MS Shell Dlg 2\";")) self.selectBtn.setObjectName(_fromUtf8("selectBtn")) self.startBtn = QtGui.QPushButton(self.centralwidget) self.startBtn.setGeometry(QtCore.QRect(600, 240, 101, 51)) self.startBtn.setStyleSheet( _fromUtf8("font: 10pt \"MS Shell Dlg 2\";")) self.startBtn.setObjectName(_fromUtf8("startBtn")) window1.setCentralWidget(self.centralwidget) self.menubar = QtGui.QMenuBar(window1) self.menubar.setGeometry(QtCore.QRect(0, 0, 801, 26)) self.menubar.setObjectName(_fromUtf8("menubar")) window1.setMenuBar(self.menubar) self.statusbar = QtGui.QStatusBar(window1) self.statusbar.setObjectName(_fromUtf8("statusbar")) window1.setStatusBar(self.statusbar) self.retranslateUi(window1) QtCore.QMetaObject.connectSlotsByName(window1) def retranslateUi(self, window1): window1.setWindowTitle(_translate("window1", "消防监督抽查系统", None)) self.importBtn.setText(_translate("window1", "导入数据", None)) self.selectBtn.setText(_translate("window1", "编辑数据", None)) self.startBtn.setText(_translate("window1", "开始抽查", None)) def setBgPic(self): pl = QtGui.QPalette(self) pic_path = os.path.join(os.getcwd(), r'./resource/bg.png') brush = QtGui.QBrush(QtGui.QPixmap(pic_path)) pl.setBrush(QtGui.QPalette.Background, brush) self.setPalette(pl) self.setAutoFillBackground(True) self.opacity = QGraphicsOpacityEffect() self.opacity.setOpacity(0.5) self.setGraphicsEffect(self.opacity) def setIcon(self): self.setWindowIcon(QIcon('./resource/logo.png')) def setBtnConnect(self): self.importBtn.clicked.connect(self.clickImportBtn) self.selectBtn.clicked.connect(self.clickSelectBtn) self.startBtn.clicked.connect(self.clickStartBtn) def clickImportBtn(self): self.excel_file = QFileDialog.getOpenFileName(None, self.tr('请选择导入数据'), r'/') if self.excel_file == r'': return QMessageBox.about(self, self.tr('导入文件成功'), self.tr(self.excel_file.toUtf8())) self.excel_file = str( self.excel_file.toUtf8()).decode('utf-8').encode('gb2312') def clickSelectBtn(self): if self.excel_file == r'': QMessageBox.about(self, self.tr('提示'), self.tr('你还没有导入数据文件')) return try: subprocess.check_output(self.excel_file, shell=True) except subprocess.CalledProcessError as e: QMessageBox.about(self, self.tr('提示'), self.tr('%s' % e.output)) def clickStartBtn(self): if not self.excel_file or self.excel_file == r'': QMessageBox.about(self, self.tr('提示'), self.tr('你还没有导入数据文件')) return self.dlg2 = Ui_dialog2(self.excel_file) self.dlg2.show()
class MiniMap(QsciScintilla): def __init__(self, parent): super(MiniMap, self).__init__(parent) #self.setWordWrapMode(QTextOption.NoWrap) #self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) #self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setReadOnly(True) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.setMarginWidth(1, 0) self.setFolding(self.NoFoldStyle, 2) #self.setCenterOnScroll(True) self.setMouseTracking(True) #self.viewport().setCursor(Qt.PointingHandCursor) #self.setTextInteractionFlags(Qt.NoTextInteraction) self._parent = parent #self.highlighter = None #self.lines_count = 0 self.connect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") #self.slider = SliderArea(self) #self.slider.show() def shutdown(self): self.disconnect(self._parent, SIGNAL("updateRequest(const QRect&, int)"), self.update_visible_area) def __calculate_max(self): #line_height = self._parent.cursorRect().height() #if line_height > 0: #self.lines_count = self._parent.viewport().height() / line_height #self.slider.update_position() self.update_visible_area() def set_code(self, source): #self.setPlainText(source) self.__calculate_max() def adjust_to_parent(self): self.setFixedHeight(self._parent.height()) self.setFixedWidth(self._parent.width() * settings.SIZE_PROPORTION) x = self._parent.width() - self.width() self.move(x, 0) #fontsize = int(self.width() / settings.MARGIN_LINE) #if fontsize < 1: #fontsize = 1 #font = self.document().defaultFont() #font.setPointSize(fontsize) #self.setFont(font) self.__calculate_max() def update_visible_area(self): pass
class MiniMap(QsciScintilla): def __init__(self, editor): super(MiniMap, self).__init__(editor) self._editor = editor self.SendScintilla(QsciScintilla.SCI_SETCARETSTYLE, 0) self.SendScintilla(QsciScintilla.SCI_SETBUFFEREDDRAW, 0) self.SendScintilla(QsciScintilla.SCI_SETHSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETVSCROLLBAR, 0) self.SendScintilla(QsciScintilla.SCI_SETZOOM, -10) self.SendScintilla(QsciScintilla.SCI_SETREADONLY, 1) self.SendScintilla(QsciScintilla.SCI_HIDESELECTION, 1) self.SendScintilla(QsciScintilla.SCI_SETCURSOR, 8) # Hide markers for i in range(1, 5): self.SendScintilla( QsciScintilla.SCI_MARKERDEFINE, i, QsciScintilla.SC_MARK_EMPTY) self.SendScintilla(QsciScintilla.SCI_SETMARGINWIDTHN, 1, 0) self.setMouseTracking(True) if ACTIVATE_OPACITY: self.goe = QGraphicsOpacityEffect() self.setGraphicsEffect(self.goe) self.goe.setOpacity(settings.MINIMAP_MIN_OPACITY) self.animation = QPropertyAnimation(self.goe, "opacity") self.animation.setDuration(300) self.slider = SliderArea(self) self.slider.show() def adjust_to_parent(self): self.setFixedHeight(self._editor.height()) self.setFixedWidth(self._editor.width() * settings.SIZE_PROPORTION) x = self._editor.width() - self.width() self.move(x, 0) self.slider.update_position() def shutdown(self): self._editor.SCN_UPDATEUI.disconnect() self._editor.SCN_ZOOM.disconnect() def fold(self, line): self.foldLine(line) def scroll_map(self): first_visible_line = self._editor.SendScintilla( QsciScintilla.SCI_GETFIRSTVISIBLELINE) num_doc_lines = self._editor.SendScintilla( QsciScintilla.SCI_GETLINECOUNT) num_visible_lines = self._editor.SendScintilla( QsciScintilla.SCI_DOCLINEFROMVISIBLE, num_doc_lines) lines_on_screen = self._editor.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) if num_visible_lines > lines_on_screen: last_top_visible_line = num_visible_lines - lines_on_screen num_map_visible_lines = self.SendScintilla( QsciScintilla.SCI_DOCLINEFROMVISIBLE, num_doc_lines) # Lines on screen map lines_on_screenm = self.SendScintilla( QsciScintilla.SCI_LINESONSCREEN) # Last top visible line on map last_top_visible_linem = num_map_visible_lines - lines_on_screenm # Portion covered portion = first_visible_line / last_top_visible_line first_visible_linem = round(last_top_visible_linem * portion) # Scroll self.verticalScrollBar().setValue(first_visible_linem) # Move slider higher_pos = self._editor.SendScintilla( QsciScintilla.SCI_POSITIONFROMPOINT, 0, 0) y = self.SendScintilla( QsciScintilla.SCI_POINTYFROMPOSITION, 0, higher_pos) self.slider.move(0, y) self._current_scroll_value = self._editor.verticalScrollBar().value() def scroll_area(self, pos_parent): line = self.__line_from_position(pos_parent) self._editor.verticalScrollBar().setValue(line) def mousePressEvent(self, event): super(MiniMap, self).mousePressEvent(event) line = self.__line_from_position(event.pos()) self._editor.jump_to_line(line) # Go to center los = self._editor.SendScintilla(QsciScintilla.SCI_LINESONSCREEN) / 2 scroll_value = self._editor.verticalScrollBar().value() if self._current_scroll_value < scroll_value: self._editor.verticalScrollBar().setValue(scroll_value + los) else: self._editor.verticalScrollBar().setValue(scroll_value - los) def __line_from_position(self, point): position = self.SendScintilla(QsciScintilla.SCI_POSITIONFROMPOINT, point.x(), point.y()) return self.SendScintilla(QsciScintilla.SCI_LINEFROMPOSITION, position) def enterEvent(self, event): if ACTIVATE_OPACITY: self.animation.setStartValue(settings.MINIMAP_MIN_OPACITY) self.animation.setEndValue(settings.MINIMAP_MAX_OPACITY) self.animation.start() def leaveEvent(self, event): if ACTIVATE_OPACITY: self.animation.setStartValue(settings.MINIMAP_MAX_OPACITY) self.animation.setEndValue(settings.MINIMAP_MIN_OPACITY) self.animation.start() def wheelEvent(self, event): super(MiniMap, self).wheelEvent(event) self._editor.wheelEvent(event) def resizeEvent(self, event): super(MiniMap, self).resizeEvent(event) self.slider.update_position()
def __init__(self, parent=None): QToolButton.__init__(self, parent) #TESTO ALTERNATIVO #Spesso se il pulsante ha icona troppo grossa e quando per ragioni di spazio o altro non si può spostare #o ridimensionare il pulsante stesso, la label ha posizioni assurde e schifose. Aggiungerne una "+ controllabile" #è l'unico modo.. self.__fixed_label = QLabel("alternative label", self) self.__fixed_label.move(0, self.geometry().height() - 35) self.__fixed_label.resize(self.geometry().width(), self.__fixed_label.geometry().height()) self.__fixed_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__font = QtGui.QFont("Arial", 10) self.__fixed_label.setFont(self.__font) self.__fixed_label.show() #INDICATORE STILE iOS self.__indicator = QLabel("0", self) self.__indicator.setStyleSheet( "border-image: url(':/images/backgrounds/indicator.png'); padding-right:1px; color: white;" ) self.__indicator.geometry().setWidth(25) self.__indicator.geometry().setHeight(20) self.__indicator.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.__indicator.setVisible(False) self.setIndicatorPos(QPoint(self.width() - self.__indicator.width(), 0)) #default top-right corner #Quando il pulsante viene ridimensionato (designer o meno) devo anche sistemare la label di conseguenza self.resizeEvent = self.__onResize self.__indicator.resizeEvent = self.__on_indicator_Resize self.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly) self.clicked.connect(self.stopAllAnimations) #BLINK self.__blink_timer = QTimer(parent) self.__blink_timer.timeout.connect(self.__on_blink_timer) self.__blink_timer_interval = 1000 #FADING self.__opacity_effect = QGraphicsOpacityEffect() self.__fading_timer = QTimer(parent) self.__fading_timer.timeout.connect(self.__on_fading_timer) self.__FADE_TYPE = Enum("IN", "OUT") self.__fade_time = 20 self.__opacity = 1.0 self.__opacity_fading_coefficient = 0.02 self.__selected_fade_type = self.__FADE_TYPE.IN # ANIMAZIONI GROW self.__animationGrow = QPropertyAnimation(self, "iconSize", self) self.__animationGrow.setDuration(1000) self.__animationGrow.setEasingCurve(QEasingCurve.Linear) self.__animationGrow.finished.connect(self.__on_growed) self.__animationShrink = QPropertyAnimation(self, "iconSize", self) self.__animationShrink.setDuration(1000) self.__animationShrink.setEasingCurve(QEasingCurve.Linear) self.__animationShrink.finished.connect(self.__on_shrinked) self.__defaultIconDimension = 60 self.__iconGrowsBy = 40 self.__growing = False # ANIMAZIONI BOUNCE self.__animationUp = QPropertyAnimation(self, "pos", self) self.__animationUp.setDuration(200) self.__animationUp.setEasingCurve(QEasingCurve.Linear) self.__animationUp.finished.connect(self.__on_top_reached) self.__animationBounce = QPropertyAnimation(self, "pos", self) self.__animationBounce.setDuration(1000) self.__animationBounce.setEasingCurve(QEasingCurve.OutBounce) self.__animationBounce.finished.connect(self.__on_bounce_finished) self.__bouncing = False self.__startPos = QPoint(self.pos().x(), self.pos().y()) #PIXMAP & MASCHERA self.__pmap = QPixmap(self.size()) self.__pmap_fname = "" self.__show_mask_preview = False
class HiddenWidgetBase(object): INITIAL_TIMEOUT = 2000 NUM_STEPS = 15 INTERVAL = 20 def __init__(self, logger): self.logger = logger self.good = False self.fadingEnabled = False self.minOpacity = 0. self.maxOpacity = 1. self.incr = (self.maxOpacity - self.minOpacity) / self.NUM_STEPS self.fadeIn = False try: from PyQt4.QtGui import QGraphicsOpacityEffect self.effect = QGraphicsOpacityEffect(self) self.setGraphicsEffect(self.effect) self.timer = QTimer(self) self.timer.timeout.connect(self._fade) self.good = True except: self.logger.debug(u"Could not enable opacity effects. %s: %s", sys.exc_info()[0].__name__, unicode(sys.exc_info()[1])) # cannot use loggingSlot here because this is no QObject @loggingFunc def setMinOpacity(self, newVal): self.minOpacity = newVal self.incr = (self.maxOpacity - self.minOpacity) / self.NUM_STEPS if self.fadingEnabled and not self.timer.isActive(): self.timer.start(self.INTERVAL) # cannot use loggingSlot here because this is no QObject @loggingFunc def setMaxOpacity(self, newVal): self.maxOpacity = newVal self.incr = (self.maxOpacity - self.minOpacity) / self.NUM_STEPS if self.fadingEnabled and not self.timer.isActive(): self.timer.start(self.INTERVAL) # cannot use loggingSlot here because this is no QObject @loggingFunc def showTemporarily(self): if self.good: self.fadingEnabled = False self.fadeIn = False self.timer.stop() self.effect.setOpacity(self.maxOpacity) QTimer.singleShot(self.INITIAL_TIMEOUT, self._fadeOut) def _fadeOut(self): self.fadingEnabled = True self.timer.start(self.INTERVAL * 1.5) # cannot use loggingSlot here because this is no QObject @loggingFunc def _fade(self): if self.fadeIn: desOp = self.maxOpacity else: desOp = self.minOpacity opacity = self.effect.opacity() if abs(opacity - desOp) < self.incr: # prevent flickering if timer does not stop immediately return if opacity < desOp: opacity += self.incr self.effect.setOpacity(opacity) else: opacity -= self.incr self.effect.setOpacity(opacity) #finish animation if desired opacity is reached if abs(opacity - desOp) < self.incr: self.timer.stop() def _mouseEntered(self): if self.good and self.fadingEnabled: self.fadeIn = True self.timer.start(self.INTERVAL) def _mouseLeft(self): if self.good and self.fadingEnabled: self.fadeIn = False self.timer.start(self.INTERVAL)