예제 #1
0
 def scale(self, width_scale_factor=1, height_scale_factor=1):
     """Scale the size of the function wheel and all of its child widgets"""
     #Scale the function wheel form
     geo = self.geometry()
     new_width = int(geo.width() * width_scale_factor)
     new_height = int(geo.height() * height_scale_factor)
     rectangle = data.QRect(
         geo.topLeft(), 
         data.QSize(new_width, new_height)
     )
     self.setGeometry(rectangle)
     #Scale all of the function wheel child widgets
     for button in self.children():
         geo = button.geometry()
         new_topLeft = data.QPoint(
             int(geo.topLeft().x() * width_scale_factor),
             int(geo.topLeft().y() * height_scale_factor)
         )
         new_width = int(geo.width() * width_scale_factor)
         new_height = int(geo.height() * height_scale_factor)
         new_size = data.QSize(new_width, new_height)
         rectangle   = data.QRect(new_topLeft, new_size)
         button.setGeometry(rectangle)
     #Center to main form
     self.center(self.size())
예제 #2
0
 def init_extra_button(self, 
                       parent, 
                       main_form, 
                       input_extra_pixmap, 
                       input_extra_function=None, 
                       input_extra_function_text=""):   
     #Store the parent and main form references
     self._parent     = parent
     self.main_form  = main_form
     #Initialize the extra button
     self.extra_button = data.QLabel(self)
     width   = int(self.geometry().width() * self.extra_button_size_factor)
     height  = int(self.geometry().height() * self.extra_button_size_factor)
     self.extra_button_position = data.QPoint(
                                     self.geometry().width()*2/3-width, 
                                     self.geometry().height()*1/4
                                     )
     rectangle   = data.QRect(self.extra_button_position, data.QSize(width, height))
     self.extra_button.setGeometry(rectangle)
     self.extra_button_stored_pixmap = input_extra_pixmap
     self.extra_button.setPixmap(input_extra_pixmap)
     self.extra_button.setScaledContents(True)
     #Store the function options
     self.extra_button_function      = input_extra_function
     self.extra_button_function_text = input_extra_function_text
     #Set the extra button opacity to low
     self._set_extra_button_opacity(self.OPACITY_LOW)
     #Overridden the extra buttons events
     self.extra_button.mousePressEvent   = self.extra_button_click
     self.extra_button.enterEvent        = self.extra_button_enter_event
     self.extra_button.leaveEvent        = self.extra_button_leave_event
예제 #3
0
 def set_position(self, x, y):
     self.setGeometry(
         data.QRect(
             x, y, 
             self.geometry().width(), self.geometry().height()
         )
     )
예제 #4
0
    def animate(self):
        def end(new_state, old_state, button):
            button.set_start_position()
            if new_state == data.QPropertyAnimation.Stopped:
#                button.set_green()
                button.enable()
                button.add_to_queue("leave")
                if button.animating == False:
                    button.animate()
                
        animation_time = 300
        animation_delay = 20
        def _animate(animation):
            animation.start()
        for i,b in enumerate(self.buttons):
            b.raise_()
            animation = data.QPropertyAnimation(b, b"geometry")
            animation.setStartValue(
                data.QRect(
                    b.starting_position[0],
                    b.starting_position[1],
                    b.geometry().width(), 
                    b.geometry().height()
                )
            )
            animation.setEndValue(
                data.QRect(
                    b.end_position[0],
                    b.end_position[1],
                    b.geometry().width(), 
                    b.geometry().height()
                )
            )
            animation.stateChanged.connect(functools.partial(end, button=b))
            animation.setDuration(animation_time)
            animation_time += 5
#            animation.setEasingCurve(data.QEasingCurve.InQuad)

#            animation_timer = data.QTimer(self)
#            animation_timer.setInterval(animation_delay)
#            animation_delay += 5
#            animation_timer.setSingleShot(True)
#            animation_timer.timeout.connect(functools.partial(_animate, animation))
#            animation_timer.start()
            
            animation.start()
            self.animations.append(animation)
예제 #5
0
 def center(self, size):
     """
     Center the settings GUI manipulator to the main form,
     according to the size parameter
     """
     x_offset = int((self.main_form.size().width() - size.width()) / 2)
     y_offset = int((self.main_form.size().height()*93/100 - size.height()) / 2)
     rectangle_top_left  = data.QPoint(x_offset, y_offset)
     rectangle_size = size
     rectangle = data.QRect(rectangle_top_left, rectangle_size)
     self.setGeometry(rectangle)
예제 #6
0
 def resizeEvent(self, event):
     """Overridden resize event"""
     #Execute the superclass resize function
     super().resizeEvent(event)
     #Update the extra button geometry
     width = int(self.geometry().width() * self.extra_button_size_factor)
     height = int(self.geometry().height() * self.extra_button_size_factor)
     rectangle   = data.QRect(
                     self.extra_button_position, 
                     data.QSize(width, height)
                     )
     self.extra_button.setGeometry(rectangle)
예제 #7
0
 def _start_animation(self,
                      state,
                      start_position_x,
                      start_position_y,
                      start_width,
                      start_height,
                      end_position_x,
                      end_position_y,
                      end_width,
                      end_height):
     self.clearMask()
     animation = data.QPropertyAnimation(self, b"geometry")
     animation.setEasingCurve(data.QEasingCurve.Linear)
     animation.setDuration(self.animation_duration)
 
     animation.setStartValue(
         data.QRect(
             start_position_x,
             start_position_y,
             start_width,
             start_height,
         )
     )
     animation.setEndValue(
         data.QRect(
             end_position_x,
             end_position_y,
             end_width,
             end_height,
         )
     )
     animation.setDirection(data.QAbstractAnimation.Forward)
     self.state = state
     animation.start()
     self.add_animation(animation)
     animation.stateChanged.connect(self.sig_animation_ended)
예제 #8
0
 def __init__(self, parent=None, main_form=None, offset=(0, 0)):
     # Initialize the superclass
     super().__init__(parent)
     # Store the reference to the parent
     self.setParent(parent)
     # Store the reference to the main form
     self.main_form = main_form
     # Store the painting offset
     self.offset = offset
     # Set the background color
     style_sheet = "background-color: transparent;"
     style_sheet += "border: 0 px;"
     self.setStyleSheet(style_sheet)
     # Set the groupbox size
     screen_resolution = data.application.desktop().screenGeometry()
     width, height = screen_resolution.width(), screen_resolution.height()
     self.setGeometry(data.QRect(0, 0, width, height))
예제 #9
0
 def __init__(self, parent, app_dir=""):
     """Initialization routine"""
     #Initialize superclass, from which the current class is inherited,
     #THIS MUST BE DONE SO THAT THE SUPERCLASS EXECUTES ITS __init__ !!!!!!
     super().__init__()
     #Setup the window
     self.setWindowTitle("About Ex.Co.")
     self.setWindowFlags(data.Qt.WindowStaysOnTopHint)
     #Setup the picture
     exco_picture = data.QPixmap(data.about_image)
     self.picture = data.QLabel(self)
     self.picture.setPixmap(exco_picture)
     self.picture.setGeometry(self.frameGeometry())
     self.picture.setScaledContents(True)
     #Assign events
     self.picture.mousePressEvent = self._close
     self.picture.mouseDoubleClickEvent = self._close
     #Initialize layout
     self.layout = data.QGridLayout()
     self.layout.addWidget(self.picture)
     self.layout.setSpacing(0)
     self.layout.setContentsMargins(data.QMargins(0, 0, 0, 0))
     self.setLayout(self.layout)
     #Set the log window icon
     if os.path.isfile(data.application_icon) == True:
         self.setWindowIcon(data.QIcon(data.application_icon))
     #Save the info window geometry, the values were gotten by showing a dialog with the label containing
     #the ExCo info image with the size set to (50, 50), so it would automatically resize to the label image size
     my_width = 610
     my_height = 620
     #Set the info window position
     parent_left = parent.geometry().left()
     parent_top = parent.geometry().top()
     parent_width = parent.geometry().width()
     parent_height = parent.geometry().height()
     my_left = parent_left + (parent_width / 2) - (my_width / 2)
     my_top = parent_top + (parent_height / 2) - (my_height / 2)
     self.setGeometry(data.QRect(my_left, my_top, my_width, my_height))
     self.setFixedSize(my_width, my_height)
예제 #10
0
    def init_layout(self, text, dialog_type):
        # Setup the image
        # First create the background image using the hex builder
        back_image = data.QImage(data.QSize(246, 211),
                                 data.QImage.Format_ARGB32_Premultiplied)
        back_image.fill(data.Qt.transparent)
        painter = data.QPainter(back_image)
        painter.setRenderHints(data.QPainter.Antialiasing
                               | data.QPainter.TextAntialiasing
                               | data.QPainter.SmoothPixmapTransform)
        hex_builder = components.HexBuilder(
            painter,
            (123, 28),
            30,
            1.0,
            fill_color=data.theme.YesNoDialog_Background,
            line_width=3,
            line_color=data.theme.YesNoDialog_Edge,
        )
        hex_builder.create_grid(
            False,
            2,
            2,
            3,
            4,
            0,
            5,
            3,
            (3, True),
            5,
            0,
            0,
            4,
            3  # OkDialog
        )
        painter.end()
        original_dialog_image = data.QPixmap.fromImage(back_image)

        # Now add the images according to the type of dialog
        dialog_image = original_dialog_image.scaled(
            original_dialog_image.size() * self.scale,
            transformMode=data.Qt.SmoothTransformation)
        self.image = data.QLabel(self)
        self.image.setPixmap(dialog_image)
        self.image.setGeometry(
            0,
            0,
            dialog_image.rect().width() * self.scale,
            dialog_image.rect().height() * self.scale,
        )
        self.image.setScaledContents(True)
        # Set the dialog mask to match the image mask
        self.setMask(dialog_image.mask())
        # Setup the image behind the label
        if dialog_type != None:
            if dialog_type == "question":
                type_pixmap = data.QPixmap(
                    os.path.join(data.resources_directory,
                                 "various/dialog-question.png"))
            elif dialog_type == "warning":
                type_pixmap = data.QPixmap(
                    os.path.join(data.resources_directory,
                                 "various/dialog-warning.png"))
            elif dialog_type == "error":
                type_pixmap = data.QPixmap(
                    os.path.join(data.resources_directory,
                                 "various/dialog-error.png"))
            else:
                raise Exception("Wrong dialog type!")
            image = data.QImage(type_pixmap.size(),
                                data.QImage.Format_ARGB32_Premultiplied)
            image.fill(data.Qt.transparent)
            painter = data.QPainter(image)
            painter.setOpacity(0.2)
            painter.drawPixmap(0, 0, type_pixmap)
            painter.end()
            type_pixmap = data.QPixmap.fromImage(image)
            type_pixmap = type_pixmap.scaled(
                type_pixmap.size() * 2.0 * self.scale,
                transformMode=data.Qt.SmoothTransformation)
            self.type_label = data.QLabel(self)
            self.type_label.setPixmap(type_pixmap)
            type_label_rect = data.QRect(
                (self.image.rect().width() - type_pixmap.rect().width()) / 2 *
                self.scale,
                (self.image.rect().height() - type_pixmap.rect().height()) /
                2 * self.scale,
                type_pixmap.rect().width() * self.scale,
                type_pixmap.rect().height() * self.scale,
            )
            self.type_label.setGeometry(type_label_rect)
        # Setup the text label
        self.text = text
        self.label = data.QLabel(self)
        self.label.setFont(
            data.QFont('Segoe UI', 12 * self.scale, data.QFont.Bold))
        self.label.setWordWrap(True)
        self.label.setAlignment(data.Qt.AlignCenter)
        self.label.setStyleSheet('color: rgb({}, {}, {})'.format(
            data.theme.Font.Default.red(),
            data.theme.Font.Default.green(),
            data.theme.Font.Default.blue(),
        ))
        self.label.setText(text)
        width_diff = self.image.rect().width() - original_dialog_image.width()
        height_diff = self.image.rect().height(
        ) - original_dialog_image.height()
        x_offset = 20 * (self.scale - 1.0)
        y_offset = 60 * (self.scale - 1.0)
        label_rect = data.QRect(
            dialog_image.rect().x() + 20 + x_offset,
            dialog_image.rect().y() + 60 + y_offset,
            dialog_image.rect().width() - (40 * self.scale),
            dialog_image.rect().height() - (120 * self.scale),
        )
        self.label.setGeometry(label_rect)
        # Shrink text if needed
        for i in range(10):
            label_width = label_rect.width()
            label_height = label_rect.height()
            font_metrics = data.QFontMetrics(self.label.font())
            bounding_rectangle = font_metrics.boundingRect(
                data.QRect(0, 0, label_width, label_height),
                self.label.alignment() | data.Qt.TextWordWrap, text)
            if (bounding_rectangle.width() > label_width
                    or bounding_rectangle.height() > label_height):
                self.label.setFont(
                    data.QFont('Segoe UI', (12 - i) * self.scale,
                               data.QFont.Bold))
            else:
                break
        # Setup the buttons
        self.button_no = self.Button(
            self, os.path.join(data.resources_directory,
                               "various/hex-red.png"), "OK",
            data.QMessageBox.No, self.scale)
        x_offset = 93 * (self.scale - 1.0)
        y_offset = 158 * (self.scale - 1.0)
        self.button_no.setGeometry(93 + x_offset, 158 + y_offset,
                                   59 * self.scale, 50 * self.scale)
        self.button_no.on_signal.connect(self.update_state_off)
        self.button_no.off_signal.connect(self.update_state_reset)
        # Setup the layout
        self.layout = data.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(data.QMargins(0, 0, 0, 0))
        self.layout.addWidget(self.image)
        self.setLayout(self.layout)
        # Setup tranparency and borders
        if data.on_rpi == True:
            self.image.setStyleSheet("border:0;" + "background-color:white;")
        else:
            self.image.setAttribute(data.Qt.WA_TranslucentBackground)
            self.image.setStyleSheet("border:0;" +
                                     "background-color:transparent;")
        self.setAttribute(data.Qt.WA_TranslucentBackground)
        self.setStyleSheet("border:0;" + "background-color:transparent;")

        self.setGeometry(dialog_image.rect())
        self.center()
        self.setWindowFlags(data.Qt.FramelessWindowHint)