コード例 #1
0
    def __init__(self):
        """ Create the windows and set some variables. """

        self.app = MyApp(False)

        self.frame = MainWindow(None, "Region-Fixer-GUI")
        # NOTE: It's very important that the MainWindow is parent of all others windows
        self.backups = BackupsWindow(self.frame, "Backups")
        self.about = AboutWindow(self.frame, "About")
        self.frame.backups = self.backups
        self.frame.about = self.about
        self.frame.help = HelpWindow(self.frame, "Help")
        #         self.frame.error = ErrorWindow(self.frame, "Error")

        self.app.main_window = self.frame
コード例 #2
0
 def on_aboutAct_triggered(self):
     self.aboutWindow = AboutWindow()
     self.aboutWindow.show()
コード例 #3
0
class Window(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(QMainWindow, self).__init__()
        self.setupUi(self)

        self.statusBar.showMessage("请选择文件")

        self.AdNDP = AdNDP()
        self.AdNDP.resultSignal.connect(self.resultTextEdit.append)
        self.AdNDP.logSignal.connect(self.logTextEdit.append)
        self.AdNDP.informationSignal.connect(self.informationTextEdit.append)
        self.AdNDP.setMaximumSignal.connect(self.progressBar.setMaximum)
        self.AdNDP.setValueSignal.connect(self.progressBar.setValue)

    @pyqtSlot()
    def on_openFileAct_triggered(self):
        path = QFileDialog.getOpenFileName(
            self, "请选择初始化文件", "./example",
            "NBO Files (*.log);;All Files (*)")[0]
        # path = "./example/Li5+.log"
        if path != '':
            self.AdNDP.readFile(path)
            self.progressBar.setValue(0)
            self.startAnalysisAct.setEnabled(True)
            self.settingAct.setEnabled(True)
        else:
            QMessageBox.warning(self, "错误", "请选择文件")

    @pyqtSlot()
    def on_startAnalysisAct_triggered(self):
        self.statusBar.showMessage("分析中......")
        self.WorkThread = WorkThread(self.AdNDP)
        self.WorkThread.start()
        self.WorkThread.finishSignal.connect(self.on_workThread_finishSignal)

    def on_workThread_finishSignal(self):
        QMessageBox.about(self, "提示", "分析完成")
        self.exportFileAct.setEnabled(True)
        self.statusBar.showMessage("分析结束,共找到" + str(self.AdNDP.nboAmnt) +
                                   "个轨道")

    @pyqtSlot()
    def on_aboutAct_triggered(self):
        self.aboutWindow = AboutWindow()
        self.aboutWindow.show()

    @pyqtSlot()
    def on_exportFileAct_triggered(self):
        savePath = QFileDialog.getSaveFileName(self, "请选择保存位置", "./example",
                                               "log格式 (*.log)")[0]
        if savePath != '':
            self.AdNDP.nboPlotMolden(savePath)
            QMessageBox.about(self, "提示", "保存成功")
        else:
            QMessageBox.warning(self, "提示", "请重新选择保存位置")

    @pyqtSlot()
    def on_settingAct_triggered(self):
        self.settingWindow = SettingWindow(self.AdNDP.NAt)
        self.settingWindow.resultSignal.connect(self.AdNDP.setThreshold)
        self.settingWindow.show()

    @pyqtSlot()
    def on_clearScreenAct_triggered(self):
        self.resultTextEdit.clear()
        self.informationTextEdit.clear()
        self.logTextEdit.clear()

        self.progressBar.setValue(0)
        self.startAnalysisAct.setEnabled(False)
        self.exportFileAct.setEnabled(False)
        self.settingAct.setEnabled(False)
        self.statusBar.showMessage("清除完成,请重新选择文件......")
コード例 #4
0
 def _about(self, widget):
     AboutWindow(self.config).show()
コード例 #5
0
ファイル: main.py プロジェクト: ekaputra07/wpcdesk
 def showAboutWindow(self):
     aboutWindow = AboutWindow()
     aboutWindow.exec_()
コード例 #6
0
 def openAbout(self,menu):
     self.about_window = AboutWindow()
     self.about_window.show()
コード例 #7
0
ファイル: root_painter.py プロジェクト: Abe404/root_painter
class RootPainter(QtWidgets.QMainWindow):

    closed = QtCore.pyqtSignal()

    def __init__(self, sync_dir):
        super().__init__()
        self.sync_dir = sync_dir
        self.instruction_dir = sync_dir / 'instructions'
        self.send_instruction = partial(send_instruction,
                                        instruction_dir=self.instruction_dir,
                                        sync_dir=sync_dir)
        self.tracking = False
        self.image_pixmap_holder = None
        self.seg_pixmap_holder = None
        self.annot_pixmap_holder = None

        self.image_visible = True
        self.seg_visible = False
        self.annot_visible = True
        self.pre_segment_count = 0
        self.im_width = None
        self.im_height = None

        self.initUI()

    def mouse_scroll(self, event):
        scroll_up = event.angleDelta().y() > 0
        modifiers = QtWidgets.QApplication.keyboardModifiers()
        alt_down = (modifiers & QtCore.Qt.AltModifier)
        shift_down = (modifiers & QtCore.Qt.ShiftModifier)

        if alt_down or shift_down:
            # change by 10% (nearest int) or 1 (min)
            increment = max(1, int(round(self.scene.brush_size / 10)))
            if scroll_up:
                self.scene.brush_size += increment
            else:
                self.scene.brush_size -= increment
            self.scene.brush_size = max(1, self.scene.brush_size)
            self.update_cursor()
        else:
            if scroll_up:
                self.graphics_view.zoom *= 1.1
            else:
                self.graphics_view.zoom /= 1.1
            self.graphics_view.update_zoom()

    def initUI(self):
        if len(sys.argv) < 2:
            self.init_missing_project_ui()
            return

        fname = sys.argv[1]
        if os.path.splitext(fname)[1] == '.seg_proj':
            proj_file_path = os.path.abspath(sys.argv[1])
            self.open_project(proj_file_path)
        else:
            # only warn if -psn not in the args. -psn is in the args when
            # user opened app in a normal way by clicking on the Application icon.
            if not '-psn' in sys.argv[1]:
                QtWidgets.QMessageBox.about(
                    self, 'Error', sys.argv[1] + ' is not a valid '
                    'segmentation project (.seg_proj) file')
            self.init_missing_project_ui()

    def open_project(self, proj_file_path):
        # extract json
        with open(proj_file_path, 'r') as json_file:
            settings = json.load(json_file)
            self.dataset_dir = self.sync_dir / 'datasets' / PurePath(
                settings['dataset'])

            self.proj_location = self.sync_dir / PurePath(settings['location'])
            self.image_fnames = settings['file_names']
            self.seg_dir = self.proj_location / 'segmentations'
            self.log_dir = self.proj_location / 'logs'
            self.train_annot_dir = self.proj_location / 'annotations' / 'train'
            self.val_annot_dir = self.proj_location / 'annotations' / 'val'

            self.model_dir = self.proj_location / 'models'

            self.message_dir = self.proj_location / 'messages'

            self.proj_file_path = proj_file_path

            # If there are any annotations which have already been saved
            # then go through the annotations in the order specified
            # by self.image_fnames
            # and set fname (current image) to be the last image with annotation
            last_with_annot = last_fname_with_annotations(
                self.image_fnames, self.train_annot_dir, self.val_annot_dir)
            if last_with_annot:
                fname = last_with_annot
            else:
                fname = self.image_fnames[0]

            # manual override for the image to show
            if 'image_index' in settings:
                fname = self.image_fnames[settings['image_index']]

            # set first image from project to be current image
            self.image_path = os.path.join(self.dataset_dir, fname)
            self.update_window_title()
            self.seg_path = os.path.join(self.seg_dir, fname)
            self.annot_path = get_annot_path(fname, self.train_annot_dir,
                                             self.val_annot_dir)
            self.init_active_project_ui()
            self.track_changes()

    def update_file(self, fpath):
        # Save current annotation (if it exists) before moving on
        self.save_annotation()

        # save current annotation first
        fname = os.path.basename(fpath)
        # set first image from project to be current image
        self.image_path = os.path.join(self.dataset_dir, fname)
        self.png_fname = os.path.splitext(fname)[0] + '.png'
        self.seg_path = os.path.join(self.seg_dir, self.png_fname)
        self.annot_path = get_annot_path(self.png_fname, self.train_annot_dir,
                                         self.val_annot_dir)
        self.update_image()

        self.scene.history = []
        self.scene.redo_list = []

        self.update_seg()
        self.update_annot()

        self.segment_current_image()
        self.update_window_title()

    def update_image(self):
        # Will also update self.im_width and self.im_height
        assert os.path.isfile(
            self.image_path), f"Cannot find file {self.image_path}"
        image_pixmap = QtGui.QPixmap(self.image_path)
        im_size = image_pixmap.size()
        im_width, im_height = im_size.width(), im_size.height()
        assert im_width > 0, self.image_path
        assert im_height > 0, self.image_path
        self.graphics_view.image = image_pixmap  # for resize later
        self.im_width = im_width
        self.im_height = im_height

        self.scene.setSceneRect(-15, -15, im_width + 30, im_height + 30)

        # Used to replace the segmentation or annotation when they are not visible.
        self.blank_pixmap = QtGui.QPixmap(self.im_width, self.im_height)
        self.blank_pixmap.fill(Qt.transparent)

        self.black_pixmap = QtGui.QPixmap(self.im_width, self.im_height)
        self.black_pixmap.fill(Qt.black)

        if self.image_pixmap_holder:
            self.image_pixmap_holder.setPixmap(image_pixmap)
        else:
            self.image_pixmap_holder = self.scene.addPixmap(image_pixmap)
        if not self.image_visible:
            self.image_pixmap_holder.setPixmap(self.black_pixmap)

    def update_seg(self):
        # if seg file is present then load.
        if os.path.isfile(self.seg_path):
            self.seg_mtime = os.path.getmtime(self.seg_path)
            self.seg_pixmap = QtGui.QPixmap(self.seg_path)
            self.nav.next_image_button.setText('Save && Next >')
            if hasattr(self, 'vis_widget'):
                self.vis_widget.seg_checkbox.setText('Segmentation (S)')
            self.nav.next_image_button.setEnabled(True)
        else:
            self.seg_mtime = None
            # otherwise use blank
            self.seg_pixmap = QtGui.QPixmap(self.im_width, self.im_height)
            self.seg_pixmap.fill(Qt.transparent)
            painter = QtGui.QPainter()
            painter.begin(self.seg_pixmap)
            font = QtGui.QFont()
            font.setPointSize(48)
            painter.setFont(font)
            painter.setPen(QtGui.QPen(QtGui.QColor(255, 255, 255)))
            painter.setBrush(
                QtGui.QBrush(QtGui.QColor(255, 255, 255), Qt.SolidPattern))
            if sys.platform == 'win32':
                # For some reason the text has a different size
                # and position on windows
                # so change the background rectangle also.
                painter.drawRect(0, 0, 657, 75)
            else:
                painter.drawRect(10, 10, 465, 55)
            painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0, 150)))
            painter.drawText(16, 51, 'Loading segmentation')
            painter.end()
            self.nav.next_image_button.setText('Loading Segmentation...')
            if hasattr(self, 'vis_widget'):
                self.vis_widget.seg_checkbox.setText('Segmentation (Loading)')
            self.nav.next_image_button.setEnabled(False)

        if self.seg_pixmap_holder:
            self.seg_pixmap_holder.setPixmap(self.seg_pixmap)
        else:
            self.seg_pixmap_holder = self.scene.addPixmap(self.seg_pixmap)
        if not self.seg_visible:
            self.seg_pixmap_holder.setPixmap(self.blank_pixmap)

    def update_annot(self):
        # if annot file is present then load
        if self.annot_path and os.path.isfile(self.annot_path):
            self.annot_pixmap = QtGui.QPixmap(self.annot_path)
        else:
            # otherwise use blank
            self.annot_pixmap = QtGui.QPixmap(self.im_width, self.im_height)
            self.annot_pixmap.fill(Qt.transparent)
        if self.annot_pixmap_holder:
            self.annot_pixmap_holder.setPixmap(self.annot_pixmap)
        else:
            self.annot_pixmap_holder = self.scene.addPixmap(self.annot_pixmap)
        self.scene.annot_pixmap_holder = self.annot_pixmap_holder
        self.scene.annot_pixmap = self.annot_pixmap
        self.scene.history.append(self.scene.annot_pixmap.copy())

        if not self.annot_visible:
            self.annot_pixmap_holder.setPixmap(self.blank_pixmap)

    def segment_image(self, image_fnames):
        # send instruction to segment the new image.
        content = {
            "dataset_dir": self.dataset_dir,
            "seg_dir": self.seg_dir,
            "file_names": image_fnames,
            "message_dir": self.message_dir,
            "model_dir": self.model_dir
        }
        self.send_instruction('segment', content)

    def segment_current_image(self):
        dir_path, _ = os.path.split(self.image_path)
        path_list = self.nav.get_path_list(dir_path)
        cur_index = path_list.index(self.image_path)
        to_segment_paths = path_list[cur_index:1 + cur_index +
                                     self.pre_segment_count]
        to_segment_paths = [
            f for f in to_segment_paths
            if os.path.isfile(os.path.join(self.seg_dir, f))
        ]
        to_segment_fnames = [os.path.basename(p) for p in to_segment_paths]
        self.segment_image(to_segment_fnames)

    def show_open_project_widget(self):
        options = QtWidgets.QFileDialog.Options()
        default_loc = self.sync_dir / 'projects'
        file_path, _ = QtWidgets.QFileDialog.getOpenFileName(
            self,
            "Load project file",
            str(default_loc),
            "Segmentation project file (*.seg_proj)",
            options=options)

        if file_path:
            self.open_project(file_path)

    def show_create_project_widget(self):
        print("Open the create project widget..")
        self.create_project_widget = CreateProjectWidget(self.sync_dir)
        self.create_project_widget.show()
        self.create_project_widget.created.connect(self.open_project)

    def init_missing_project_ui(self):
        ## Create project menu
        # project has not yet been selected or created
        # need to open minimal interface which allows users
        # to open or create a project.

        menu_bar = self.menuBar()
        self.menu_bar = menu_bar
        self.menu_bar.clear()
        self.project_menu = menu_bar.addMenu("Project")

        # Open project
        self.open_project_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                     "Open project", self)
        self.open_project_action.setShortcut("Ctrl+O")

        self.project_menu.addAction(self.open_project_action)
        self.open_project_action.triggered.connect(
            self.show_open_project_widget)

        # Create project
        self.create_project_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                       "Create project", self)
        self.create_project_action.setShortcut("Ctrl+C")
        self.project_menu.addAction(self.create_project_action)
        self.create_project_action.triggered.connect(
            self.show_create_project_widget)

        # Network Menu
        self.network_menu = menu_bar.addMenu('Network')
        # # segment folder
        self.segment_folder_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                                    'Segment folder', self)

        def show_segment_folder():
            self.segment_folder_widget = SegmentFolderWidget(
                self.sync_dir, self.instruction_dir)
            self.segment_folder_widget.show()

        self.segment_folder_btn.triggered.connect(show_segment_folder)
        self.network_menu.addAction(self.segment_folder_btn)

        self.add_measurements_menu(menu_bar)
        self.add_extras_menu(menu_bar)
        self.add_about_menu(menu_bar)

        ### Add project btns to open window (so it shows something useful)
        project_btn_widget = QtWidgets.QWidget()
        self.setCentralWidget(project_btn_widget)

        layout = QtWidgets.QHBoxLayout()
        project_btn_widget.setLayout(layout)
        open_project_btn = QtWidgets.QPushButton('Open existing project')
        open_project_btn.clicked.connect(self.show_open_project_widget)
        layout.addWidget(open_project_btn)

        create_project_btn = QtWidgets.QPushButton('Create new project')
        create_project_btn.clicked.connect(self.show_create_project_widget)
        layout.addWidget(create_project_btn)

        create_dataset_btn = QtWidgets.QPushButton('Create training dataset')

        def show_create_dataset():
            self.create_dataset_widget = CreateDatasetWidget(self.sync_dir)
            self.create_dataset_widget.show()

        create_dataset_btn.clicked.connect(show_create_dataset)
        layout.addWidget(create_dataset_btn)

        self.setWindowTitle("RootPainter")
        self.resize(layout.sizeHint())

    def add_extras_menu(self, menu_bar, project_open=False):
        extras_menu = menu_bar.addMenu('Extras')
        comp_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                     'Extract composites', self)
        comp_btn.triggered.connect(self.show_extract_comp)
        extras_menu.addAction(comp_btn)

        conv_to_rve_btn = QtWidgets.QAction(
            QtGui.QIcon('missing.png'),
            'Convert segmentations for RhizoVision Explorer', self)
        conv_to_rve_btn.triggered.connect(self.show_conv_to_rve)
        extras_menu.addAction(conv_to_rve_btn)

        if project_open:
            extend_dataset_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                                   'Extend dataset', self)

            def update_dataset_after_check():
                was_extended, file_names = check_extend_dataset(
                    self, self.dataset_dir, self.image_fnames,
                    self.proj_file_path)
                if was_extended:
                    self.image_fnames = file_names
                    self.nav.all_fnames = file_names
                    self.nav.update_nav_label()

            extend_dataset_btn.triggered.connect(update_dataset_after_check)
            extras_menu.addAction(extend_dataset_btn)

    def add_about_menu(self, menu_bar):
        about_menu = menu_bar.addMenu('About')
        license_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'), 'License',
                                        self)
        license_btn.triggered.connect(self.show_license_window)
        about_menu.addAction(license_btn)

        about_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                      'RootPainter', self)
        about_btn.triggered.connect(self.show_about_window)
        about_menu.addAction(about_btn)

    def show_license_window(self):
        self.license_window = LicenseWindow()
        self.license_window.show()

    def show_about_window(self):
        self.about_window = AboutWindow()
        self.about_window.show()

    def update_window_title(self):
        proj_dirname = os.path.basename(self.proj_location)
        self.setWindowTitle(f"RootPainter {proj_dirname}"
                            f" {os.path.basename(self.image_path)}")

    def init_active_project_ui(self):
        # container for both nav and graphics view.
        container = QtWidgets.QWidget()
        container_layout = QtWidgets.QVBoxLayout()
        container_layout.setContentsMargins(0, 0, 0, 0)
        container.setLayout(container_layout)
        self.setCentralWidget(container)

        self.graphics_view = CustomGraphicsView()
        self.graphics_view.zoom_change.connect(self.update_cursor)

        container_layout.addWidget(self.graphics_view)
        scene = GraphicsScene()
        scene.parent = self
        self.graphics_view.setScene(scene)
        self.graphics_view.mouse_scroll_event.connect(self.mouse_scroll)

        # Required so graphics scene can track mouse up when mouse is not pressed
        self.graphics_view.setMouseTracking(True)
        self.scene = scene
        self.nav = NavWidget(self.image_fnames)
        self.update_file(self.image_path)

        # bottom bar
        bottom_bar = QtWidgets.QWidget()
        bottom_bar_layout = QtWidgets.QHBoxLayout()
        # left, top, right, bottom
        bottom_bar_layout.setContentsMargins(20, 0, 20, 20)
        bottom_bar_layout.setSpacing(0)
        bottom_bar.setLayout(bottom_bar_layout)

        container_layout.addWidget(bottom_bar)

        # Bottom bar left
        self.vis_widget = VisibilityWidget()
        self.vis_widget.setMaximumWidth(200)
        self.vis_widget.setMinimumWidth(200)
        self.vis_widget.seg_checkbox.stateChanged.connect(
            self.seg_checkbox_change)
        self.vis_widget.annot_checkbox.stateChanged.connect(
            self.annot_checkbox_change)
        self.vis_widget.im_checkbox.stateChanged.connect(
            self.im_checkbox_change)
        bottom_bar_layout.addWidget(self.vis_widget)

        # bottom bar right
        bottom_bar_r = QtWidgets.QWidget()
        bottom_bar_r_layout = QtWidgets.QVBoxLayout()
        bottom_bar_r.setLayout(bottom_bar_r_layout)
        bottom_bar_layout.addWidget(bottom_bar_r)

        # Nav
        self.nav.file_change.connect(self.update_file)

        self.nav.image_path = self.image_path
        self.nav.update_nav_label()

        # info label
        info_container = QtWidgets.QWidget()
        info_container_layout = QtWidgets.QHBoxLayout()
        info_container_layout.setAlignment(Qt.AlignCenter)
        info_label = QtWidgets.QLabel()
        info_label.setText("")
        info_container_layout.addWidget(info_label)
        # left, top, right, bottom
        info_container_layout.setContentsMargins(0, 0, 0, 0)
        info_container.setLayout(info_container_layout)
        self.info_label = info_label

        bottom_bar_r_layout.addWidget(info_container)
        bottom_bar_r_layout.addWidget(self.nav)

        self.add_menu()

        self.resize(container_layout.sizeHint())

        self.update_cursor()

        def view_fix():
            """ hack for linux bug """
            self.update_cursor()
            self.graphics_view.fit_to_view()

        QtCore.QTimer.singleShot(100, view_fix)

    def track_changes(self):
        if self.tracking:
            return
        print('Starting watch for changes')
        self.tracking = True

        def check():
            # check for any messages
            messages = os.listdir(str(self.message_dir))
            for m in messages:
                if hasattr(self, 'info_label'):
                    self.info_label.setText(m)
                try:
                    # Added try catch because this error happened (very rarely)
                    # PermissionError: [WinError 32]
                    # The process cannot access the file because it is
                    # being used by another process
                    os.remove(os.path.join(self.message_dir, m))
                except Exception as e:
                    print('Caught exception when trying to detele msg', e)
            if hasattr(self, 'seg_path') and os.path.isfile(self.seg_path):
                try:
                    # seg mtime is not actually used any more.
                    new_mtime = os.path.getmtime(self.seg_path)
                    # seg_mtime is None before the seg is loaded.
                    if not self.seg_mtime:
                        print('load seg from file.')
                        self.seg_pixmap = QtGui.QPixmap(self.seg_path)
                        self.seg_mtime = new_mtime
                        self.nav.next_image_button.setText('Save && Next >')
                        self.nav.next_image_button.setEnabled(True)
                        if self.seg_visible:
                            self.seg_pixmap_holder.setPixmap(self.seg_pixmap)
                        if hasattr(self, 'vis_widget'):
                            self.vis_widget.seg_checkbox.setText(
                                'Segmentation (S)')
                except Exception as e:
                    print('Error: when trying to load segmention ' + str(e))
                    # sometimes problems reading file.
                    # don't worry about this exception
            else:
                print('no seg found', end=",")
            QtCore.QTimer.singleShot(500, check)

        QtCore.QTimer.singleShot(500, check)

    def close_project_window(self):
        self.close()
        self.closed.emit()

    def add_menu(self):
        menu_bar = self.menuBar()
        menu_bar.clear()

        self.project_menu = menu_bar.addMenu("Project")

        self.close_project_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                      "Close project", self)
        self.project_menu.addAction(self.close_project_action)
        self.close_project_action.triggered.connect(self.close_project_window)

        edit_menu = menu_bar.addMenu("Edit")
        # Undo
        undo_action = QtWidgets.QAction(QtGui.QIcon(""), "Undo", self)
        undo_action.setShortcut("Z")
        edit_menu.addAction(undo_action)
        undo_action.triggered.connect(self.scene.undo)

        # Redo
        redo_action = QtWidgets.QAction(QtGui.QIcon(""), "Redo", self)
        redo_action.setShortcut("Ctrl+Shift+Z")
        edit_menu.addAction(redo_action)
        redo_action.triggered.connect(self.scene.redo)

        options_menu = menu_bar.addMenu("Options")
        # pre segment count
        pre_segment_count_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                     "Pre-Segment", self)
        options_menu.addAction(pre_segment_count_action)
        pre_segment_count_action.triggered.connect(
            self.open_pre_segment_count_dialog)

        # change brush colors
        change_foreground_color_action = QtWidgets.QAction(
            QtGui.QIcon(""), "Foreground brush colour", self)
        options_menu.addAction(change_foreground_color_action)
        change_foreground_color_action.triggered.connect(
            self.change_foreground_color)
        change_background_color_action = QtWidgets.QAction(
            QtGui.QIcon(""), "Background brush colour", self)
        options_menu.addAction(change_background_color_action)
        change_background_color_action.triggered.connect(
            self.change_background_color)

        brush_menu = menu_bar.addMenu("Brushes")
        foreground_color_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                    "Foreground", self)
        foreground_color_action.setShortcut("Q")
        brush_menu.addAction(foreground_color_action)
        foreground_color_action.triggered.connect(self.set_foreground_color)

        background_color_action = QtWidgets.QAction(QtGui.QIcon(""),
                                                    "Background", self)
        background_color_action.setShortcut("W")
        brush_menu.addAction(background_color_action)
        background_color_action.triggered.connect(self.set_background_color)

        eraser_color_action = QtWidgets.QAction(QtGui.QIcon(""), "Eraser",
                                                self)
        eraser_color_action.setShortcut("E")
        brush_menu.addAction(eraser_color_action)
        eraser_color_action.triggered.connect(self.set_eraser_color)

        ## View menu
        # Fit to view
        view_menu = menu_bar.addMenu('View')
        fit_to_view_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                            'Fit to View', self)
        fit_to_view_btn.setShortcut('Ctrl+F')
        fit_to_view_btn.setStatusTip('Fit image to view')
        fit_to_view_btn.triggered.connect(self.graphics_view.fit_to_view)
        view_menu.addAction(fit_to_view_btn)

        # Actual size
        actual_size_view_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                                 'Actual size', self)
        actual_size_view_btn.setShortcut('Ctrl+A')
        actual_size_view_btn.setStatusTip('Show image at actual size')
        actual_size_view_btn.triggered.connect(
            self.graphics_view.show_actual_size)
        view_menu.addAction(actual_size_view_btn)

        toggle_seg_visibility_btn = QtWidgets.QAction(
            QtGui.QIcon('missing.png'), 'Toggle segmentation visibility', self)
        toggle_seg_visibility_btn.setShortcut('S')
        toggle_seg_visibility_btn.setStatusTip('Show or hide segmentation')
        toggle_seg_visibility_btn.triggered.connect(self.show_hide_seg)
        view_menu.addAction(toggle_seg_visibility_btn)

        toggle_annot_visibility_btn = QtWidgets.QAction(
            QtGui.QIcon('missing.png'), 'Toggle annotation visibility', self)
        toggle_annot_visibility_btn.setShortcut('A')
        toggle_annot_visibility_btn.setStatusTip('Show or hide annotation')
        toggle_annot_visibility_btn.triggered.connect(self.show_hide_annot)
        view_menu.addAction(toggle_annot_visibility_btn)

        toggle_image_visibility_btn = QtWidgets.QAction(
            QtGui.QIcon('missing.png'), 'Toggle image visibility', self)
        toggle_image_visibility_btn.setShortcut('I')
        toggle_image_visibility_btn.setStatusTip('Show or hide image')
        toggle_image_visibility_btn.triggered.connect(self.show_hide_image)
        view_menu.addAction(toggle_image_visibility_btn)

        def zoom_in():
            self.graphics_view.zoom *= 1.1
            self.graphics_view.update_zoom()

        def zoom_out():
            self.graphics_view.zoom /= 1.1
            self.graphics_view.update_zoom()

        zoom_in_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'), 'Zoom in',
                                        self)
        zoom_in_btn.setShortcut('+')
        zoom_in_btn.setStatusTip('Zoom in')
        zoom_in_btn.triggered.connect(zoom_in)
        view_menu.addAction(zoom_in_btn)

        zoom_out_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                         'Zoom out', self)
        zoom_out_btn.setShortcut('-')
        zoom_out_btn.setStatusTip('Zoom out')
        zoom_out_btn.triggered.connect(zoom_out)
        view_menu.addAction(zoom_out_btn)

        # Network Menu
        network_menu = menu_bar.addMenu('Network')

        # start training
        start_training_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                               'Start training', self)
        start_training_btn.triggered.connect(self.start_training)
        network_menu.addAction(start_training_btn)

        # stop training
        stop_training_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                              'Stop training', self)
        stop_training_btn.triggered.connect(self.stop_training)
        network_menu.addAction(stop_training_btn)

        # # segment folder
        segment_folder_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                               'Segment folder', self)

        def show_segment_folder():
            self.segment_folder_widget = SegmentFolderWidget(
                self.sync_dir, self.instruction_dir)
            self.segment_folder_widget.show()

        segment_folder_btn.triggered.connect(show_segment_folder)
        network_menu.addAction(segment_folder_btn)

        # segment current image
        # segment_image_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
        #                                       'Segment current image', self)
        # segment_image_btn.triggered.connect(self.segment_current_image)
        # network_menu.addAction(segment_image_btn)
        self.add_measurements_menu(menu_bar)
        self.add_extras_menu(menu_bar, project_open=True)

    def add_measurements_menu(self, menu_bar):
        # Measurements
        measurements_menu = menu_bar.addMenu('Measurements')
        # object count
        object_count_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                             'Extract count', self)

        def show_extract_count():
            self.extract_count_widget = ExtractCountWidget()
            self.extract_count_widget.show()

        object_count_btn.triggered.connect(show_extract_count)
        measurements_menu.addAction(object_count_btn)

        # length
        length_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                       'Extract length', self)

        def show_extract_length():
            self.extract_length_widget = ExtractLengthWidget()
            self.extract_length_widget.show()

        length_btn.triggered.connect(show_extract_length)
        measurements_menu.addAction(length_btn)

        # region props
        region_props_btn = QtWidgets.QAction(QtGui.QIcon('missing.png'),
                                             'Extract region properties', self)

        def show_extract_region_props():
            self.extract_regions_widget = ExtractRegionsWidget()
            self.extract_regions_widget.show()

        region_props_btn.triggered.connect(show_extract_region_props)
        measurements_menu.addAction(region_props_btn)

    def show_extract_comp(self):
        self.extract_comp_widget = ExtractCompWidget()
        self.extract_comp_widget.show()

    def show_conv_to_rve(self):
        """ show window to convert segmentations
            to RhizoVision Explorer compatible format """
        self.convert_to_rve_widget = ConvertSegForRVEWidget()
        self.convert_to_rve_widget.show()

    def stop_training(self):
        self.info_label.setText("Stopping training...")
        content = {"message_dir": self.message_dir}
        self.send_instruction('stop_training', content)

    def start_training(self):
        self.info_label.setText("Starting training...")
        content = {
            "model_dir": self.model_dir,
            "dataset_dir": self.dataset_dir,
            "train_annot_dir": self.train_annot_dir,
            "val_annot_dir": self.val_annot_dir,
            "seg_dir": self.seg_dir,
            "log_dir": self.log_dir,
            "message_dir": self.message_dir
        }
        self.send_instruction('start_training', content)

    def seg_checkbox_change(self, state):
        checked = (state == QtCore.Qt.Checked)
        if checked is not self.seg_visible:
            self.show_hide_seg()

    def annot_checkbox_change(self, state):
        checked = (state == QtCore.Qt.Checked)
        if checked is not self.annot_visible:
            self.show_hide_annot()

    def im_checkbox_change(self, state):
        checked = (state == QtCore.Qt.Checked)
        if checked is not self.image_visible:
            self.show_hide_image()

    def show_hide_seg(self):
        # show or hide the current segmentation.
        if self.seg_visible:
            self.seg_pixmap_holder.setPixmap(self.blank_pixmap)
            self.seg_visible = False
        else:
            self.seg_pixmap_holder.setPixmap(self.seg_pixmap)
            self.seg_visible = True
        self.vis_widget.seg_checkbox.setChecked(self.seg_visible)

    def show_hide_image(self):
        # show or hide the current image.
        # Could be useful to help inspect the segmentation or annotation
        if self.image_visible:
            self.image_pixmap_holder.setPixmap(self.black_pixmap)
            self.image_visible = False
        else:
            self.image_pixmap_holder.setPixmap(self.graphics_view.image)
            self.image_visible = True
        self.vis_widget.im_checkbox.setChecked(self.image_visible)

    def show_hide_annot(self):
        # show or hide the current annotations.
        # Could be useful to help inspect the background image
        if self.annot_visible:
            self.annot_pixmap_holder.setPixmap(self.blank_pixmap)
            self.annot_visible = False
        else:
            self.scene.annot_pixmap_holder.setPixmap(self.scene.annot_pixmap)
            self.annot_visible = True
        self.vis_widget.annot_checkbox.setChecked(self.annot_visible)

    def set_foreground_color(self, _event):
        self.scene.brush_color = self.scene.foreground_color
        self.update_cursor()

    def change_foreground_color(self, _event):
        foreground_set = (
            self.scene.brush_color == self.scene.foreground_color)
        show_alpha_option = QtWidgets.QColorDialog.ColorDialogOption(1)
        new_color = QtWidgets.QColorDialog.getColor(
            self.scene.foreground_color, options=show_alpha_option)

        if new_color.isValid():
            self.scene.foreground_color = new_color

        if foreground_set:
            self.scene.brush_color = self.scene.foreground_color
            self.update_cursor()

    def change_background_color(self, _event):
        background_set = (
            self.scene.brush_color == self.scene.background_color)
        show_alpha_option = QtWidgets.QColorDialog.ColorDialogOption(1)
        new_color = QtWidgets.QColorDialog.getColor(
            self.scene.background_color, options=show_alpha_option)

        if new_color.isValid():
            self.scene.background_color = new_color

        if background_set:
            self.scene.brush_color = self.scene.background_color
            self.update_cursor()

    def set_background_color(self, _event):
        self.scene.brush_color = self.scene.background_color
        self.update_cursor()

    def set_eraser_color(self, _event):
        self.scene.brush_color = self.scene.eraser_color
        self.update_cursor()

    def update_cursor(self):
        brush_w = self.scene.brush_size * self.graphics_view.zoom * 0.93
        brush_w = max(brush_w, 3)

        canvas_w = max(brush_w, 30)
        pm = QtGui.QPixmap(canvas_w, canvas_w)
        pm.fill(Qt.transparent)
        painter = QtGui.QPainter(pm)

        painter.drawPixmap(canvas_w, canvas_w, pm)

        brush_rgb = self.scene.brush_color.toRgb()
        r, g, b = brush_rgb.red(), brush_rgb.green(), brush_rgb.blue()
        cursor_color = QtGui.QColor(r, g, b, 120)

        painter.setPen(
            QtGui.QPen(cursor_color, 3, Qt.SolidLine, Qt.RoundCap,
                       Qt.RoundJoin))
        ellipse_x = int(round(canvas_w / 2 - (brush_w) / 2))
        ellipse_y = int(round(canvas_w / 2 - (brush_w) / 2))
        ellipse_w = brush_w
        ellipse_h = brush_w

        painter.drawEllipse(ellipse_x, ellipse_y, ellipse_w, ellipse_h)
        painter.setPen(
            QtGui.QPen(QtGui.QColor(0, 0, 0, 180), 2, Qt.SolidLine,
                       Qt.FlatCap))

        # Draw black to show where cursor is even when brush is small
        painter.drawLine(0, (canvas_w / 2), canvas_w * 2, (canvas_w / 2))
        painter.drawLine((canvas_w / 2), 0, (canvas_w / 2), canvas_w * 2)
        painter.end()

        cursor = QtGui.QCursor(pm)
        self.setCursor(cursor)

    def open_pre_segment_count_dialog(self):
        new_count, ok = QtWidgets.QInputDialog.getInt(
            self, "", "Select Pre-Segment count", self.pre_segment_count, 0,
            100, 1)
        if ok:
            self.pre_segment_count = new_count
        # For some reason the events get confused and
        # scroll+pan gets switched on here.
        # Check if control key is up to disble it.
        modifiers = QtWidgets.QApplication.keyboardModifiers()
        if not modifiers & QtCore.Qt.ControlModifier:
            self.graphics_view.setDragMode(QtWidgets.QGraphicsView.NoDrag)

    def save_annotation(self):
        if self.scene.annot_pixmap:
            self.annot_path = maybe_save_annotation(
                self.proj_location, self.scene.annot_pixmap, self.annot_path,
                self.png_fname, self.train_annot_dir, self.val_annot_dir)
コード例 #8
0
class MainWindow(MainWindow_Ui):
    def __init__(self):
        super().__init__()
        self.system_tray_icon = QSystemTrayIcon() 
        self.system_tray_icon.setIcon(QIcon.fromTheme('persepolis',QIcon(':/icon.svg') ))
        system_tray_menu = QMenu()
        system_tray_menu.addAction(self.addlinkAction)
        system_tray_menu.addAction(self.pauseAllAction)
        system_tray_menu.addAction(self.stopAllAction)
        system_tray_menu.addAction(self.minimizeAction)
        system_tray_menu.addAction(self.exitAction)
        self.system_tray_icon.setContextMenu(system_tray_menu)
        self.system_tray_icon.activated.connect(self.systemTrayPressed)
        self.system_tray_icon.show()
        self.system_tray_icon.setToolTip('Persepolis Download Manager')
        f = Open(setting_file)
        setting_file_lines = f.readlines()
        f.close()
        setting_dict_str = str(setting_file_lines[0].strip())
        setting_dict = ast.literal_eval(setting_dict_str) 
        if setting_dict['tray-icon'] != 'yes': 
            self.minimizeAction.setEnabled(False)
            self.trayAction.setChecked(False)
            self.system_tray_icon.hide()


        self.statusbar.showMessage('Please Wait ...')
        self.checkSelectedRow()

#touch download_list_file
        if not(os.path.isfile(download_list_file)):
            f = Open(download_list_file , 'w')
            f.close()

#touch download_list_file_active
        if not(os.path.isfile(download_list_file_active)):
            f = Open(download_list_file_active , 'w')
            f.close()


#lock files perventing to access a file simultaneously

#removing lock files in starting persepolis
        os.system("rm " + config_folder +"/*.lock" + "  2>/dev/null" )
        os.system("rm " + download_info_folder + "/*.lock" + "   2>/dev/null" )



#threads     
        self.threadPool=[]
#starting aria
        start_aria = StartAria2Thread()
        self.threadPool.append(start_aria)
        self.threadPool[0].start() 
        self.threadPool[0].ARIA2RESPONDSIGNAL.connect(self.startAriaMessage)

#initializing    
#add downloads to the download_table
        f_download_list_file = Open(download_list_file)
        download_list_file_lines = f_download_list_file.readlines()
        f_download_list_file.close()
            
        for line in download_list_file_lines:
            gid = line.strip()
            self.download_table.insertRow(0)
            download_info_file = download_info_folder + "/" + gid
            download_info_file_list = readList(download_info_file,'string')
            for i in range(10):
                item = QTableWidgetItem(download_info_file_list[i])
                self.download_table.setItem(0 , i , item)

        row_numbers = self.download_table.rowCount()
        for row in range(row_numbers):
            status = self.download_table.item(row , 1).text() 
            if (status != "complete" and status != "error"):
                gid = self.download_table.item(row,8).text() 
                add_link_dictionary_str = self.download_table.item(row,9).text() 
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str.strip()) 
                add_link_dictionary['start_hour'] = None
                add_link_dictionary['start_minute'] = None
                add_link_dictionary['end_hour'] = None
                add_link_dictionary['end_minute'] = None
                add_link_dictionary['after_download'] = 'None'

                download_info_file = download_info_folder + "/" + gid
                download_info_file_list = readList(download_info_file,'string')

                for i in range(10):
                    if i == 1 :
                        download_info_file_list[i] = 'stopped'
                        item = QTableWidgetItem('stopped')
                        self.download_table.setItem(row , i , item )
                download_info_file_list[9] = add_link_dictionary
                writeList(download_info_file , download_info_file_list)

        self.addlinkwindows_list = []
        self.propertieswindows_list = []
        self.progress_window_list = []
        self.afterdownload_list = []
        self.progress_window_list_dict = {}

        check_download_info = CheckDownloadInfoThread()
        self.threadPool.append(check_download_info)
        self.threadPool[1].start()
        self.threadPool[1].DOWNLOAD_INFO_SIGNAL.connect(self.checkDownloadInfo)

        check_selected_row = CheckSelectedRowThread()
        self.threadPool.append(check_selected_row)
        self.threadPool[2].start()
        self.threadPool[2].CHECKSELECTEDROWSIGNAL.connect(self.checkSelectedRow)

        check_flashgot = CheckFlashgot()
        self.threadPool.append(check_flashgot)
        self.threadPool[3].start()
        self.threadPool[3].CHECKFLASHGOTSIGNAL.connect(self.checkFlashgot)
        self.threadPool[3].SHOWMAINWINDOWSIGNAL.connect(self.showMainWindow)

        self.download_table.itemDoubleClicked.connect(self.openFile)
        
    def startAriaMessage(self,message):
        global aria_startup_answer
        if message == 'yes':
            sleep (2)
            self.statusbar.showMessage('Ready...')
            aria_startup_answer = 'ready'
        else:
            self.statusbar.showMessage('Error...')
            notifySend('Persepolis can not connect to Aria2' , 'Restart Persepolis' ,10000,'critical' , systemtray = self.system_tray_icon )

    def checkDownloadInfo(self,gid):
        try:

#get download information from download_info_file according to gid and write them in download_table cells
            download_info_file = config_folder + "/download_info/" + gid
            download_info_file_list = readList(download_info_file)
            download_info_file_list_string = readList(download_info_file ,'string')
#finding row of this gid!
            for i in range(self.download_table.rowCount()):
                row_gid = self.download_table.item(i , 8).text()
                if gid == row_gid :
                    row = i 
                    break

            for i in range(10):
#check flag of download!
#It's showing that selection mode is active or not!
                if i == 0 :
                    flag = int(self.download_table.item(row , i).flags())

#remove gid of completed download from active downloads list file
                elif i == 1 :
                    status = str(download_info_file_list[i])
                    status_download_table = str(self.download_table.item(row , 1 ) . text())
                    if status == "complete":
                        f = Open(download_list_file_active)
                        download_list_file_active_lines = f.readlines()
                        f.close()
                        f = Open(download_list_file_active , "w")
                        for line in download_list_file_active_lines :
                            if line.strip() != gid :
                                f.writelines(line.strip() + "\n")
                        f.close()
                    
#update download_table cells
                item = QTableWidgetItem(download_info_file_list_string[i])
#48 means that item is checkable and enabled
                if i == 0 and flag == 48:
                    item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                    if self.download_table.item(row , i).checkState() == 2:
                        item.setCheckState(QtCore.Qt.Checked)
                    else:
                        item.setCheckState(QtCore.Qt.Unchecked)


                self.download_table.setItem(row , i , item)
                self.download_table.viewport().update()
#update progresswindow
            try :

#finding progress_window for gid            
                member_number = self.progress_window_list_dict[gid]
                progress_window = self.progress_window_list[member_number]
                #link
                add_link_dictionary = download_info_file_list[9]
                link = "<b>Link</b> : " +  str(add_link_dictionary ['link'])
                progress_window.link_label.setText(link)
                progress_window.link_label.setToolTip(link)

                #Save as
                final_download_path = add_link_dictionary['final_download_path']
                if final_download_path == None :
                    final_download_path = str(add_link_dictionary['download_path'])
                        
                save_as = "<b>Save as</b> : " + final_download_path + "/" + str(download_info_file_list[0])
                progress_window.save_label.setText(save_as)
                progress_window.save_label.setToolTip(save_as)

                #status
                progress_window.status = download_info_file_list[1]
                status = "<b>Status</b> : " + progress_window.status 
                progress_window.status_label.setText(status)
                if progress_window.status == "downloading":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(True)
                elif progress_window.status == "paused":
                    progress_window.resume_pushButton.setEnabled(True)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "waiting":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "scheduled":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "stopped" or progress_window.status == "error" or progress_window.status == "complete" :
#close progress_window if download status is stopped or completed or error
                    progress_window.close()
                    self.progress_window_list[member_number] = []
                    del self.progress_window_list_dict[gid]
                    if progress_window.status == "stopped":
                        notifySend("Download Stopped" , str(download_info_file_list[0]) , 10000 , 'no', systemtray = self.system_tray_icon )

                    elif progress_window.status == "error":
                        notifySend("Error - " + add_link_dictionary['error'] , str(download_info_file_list[0]) , 10000 , 'fail', systemtray = self.system_tray_icon )
               
                        add_link_dictionary['start_hour'] = None
                        add_link_dictionary['start_minute'] = None
                        add_link_dictionary['end_hour'] = None
                        add_link_dictionary['end_minute'] = None
                        add_link_dictionary['after_download'] = 'None'

                        for i in range(10):
                            if i == 9 :
                                download_info_file_list[i] = add_link_dictionary
                                
                        download_info_file_list[9] = add_link_dictionary 
                        writeList(download_info_file , download_info_file_list )


#this section is sending shutdown signal to the shutdown script(if user select shutdown for after download)
                    if os.path.isfile('/tmp/persepolis/shutdown/' + gid ) == True and progress_window.status != 'stopped':
                        answer = download.shutDown()
#KILL aria2c if didn't respond
                        if answer == 'error':
                            os.system('killall aria2c')
                        f = Open('/tmp/persepolis/shutdown/' + gid , 'w')
                        notifySend('Persepolis is shutting down','your system in 20 seconds' , 15000 ,'warning', systemtray = self.system_tray_icon )
                        f.writelines('shutdown')
                        f.close()
                    elif os.path.isfile('/tmp/persepolis/shutdown/' + gid ) == True and progress_window.status == 'stopped':
                        f = Open('/tmp/persepolis/shutdown/' + gid , 'w')
                        f.writelines('canceled')
                        f.close()

#showing download compelete dialog
#check user's Preferences
                    f = Open(setting_file)
                    setting_file_lines = f.readlines()
                    f.close()
                    setting_dict_str = str(setting_file_lines[0].strip())
                    setting_dict = ast.literal_eval(setting_dict_str) 
 
                    if progress_window.status == "complete" and setting_dict['after-dialog'] == 'yes' :
                        afterdownloadwindow = AfterDownloadWindow(download_info_file_list,setting_file)
                        self.afterdownload_list.append(afterdownloadwindow)
                        self.afterdownload_list[len(self.afterdownload_list) - 1].show()
                    elif progress_window.status == "complete" and setting_dict['after-dialog'] == 'no' :
                        notifySend("Download Complete" ,str(download_info_file_list[0])  , 10000 , 'ok' , systemtray = self.system_tray_icon )



             
                #downloaded
                downloaded = "<b>Downloaded</b> : " + str(download_info_file_list[3]) + "/" + str(download_info_file_list[2])
                progress_window.downloaded_label.setText(downloaded)

                #Transfer rate
                rate = "<b>Transfer rate</b> : " + str(download_info_file_list[6])
                progress_window.rate_label.setText(rate)

                #Estimate time left
                estimate_time_left = "<b>Estimate time left</b> : " + str(download_info_file_list[7]) 
                progress_window.time_label.setText(estimate_time_left)

                #Connections
                connections = "<b>Connections</b> : " + str(download_info_file_list[5])
                progress_window.connections_label.setText(connections)


                #progressbar
                value = download_info_file_list[4]
                file_name = str(download_info_file_list[0])
                if file_name != "***":
                    windows_title = '(' + str(value) + ')' +  str(file_name)
                    progress_window.setWindowTitle(windows_title) 

                value = value[:-1]
                progress_window.download_progressBar.setValue(int(value))



            except :
                pass

        except:
            pass
                   



#contex menu
    def contextMenuEvent(self, event):
        self.tablewidget_menu = QMenu(self)
        self.tablewidget_menu.addAction(self.openFileAction)
        self.tablewidget_menu.addAction(self.openDownloadFolderAction)
        self.tablewidget_menu.addAction(self.resumeAction)
        self.tablewidget_menu.addAction(self.pauseAction)
        self.tablewidget_menu.addAction(self.stopAction)
        self.tablewidget_menu.addAction(self.removeAction)
        self.tablewidget_menu.addAction(self.deleteFileAction)
        self.tablewidget_menu.addAction(self.propertiesAction)
        self.tablewidget_menu.addAction(self.progressAction)
        self.tablewidget_menu.popup(QtGui.QCursor.pos())
#drag and drop for links
    def dragEnterEvent(self, droplink):

        text = str(droplink.mimeData().text())
      
        if ("tp:/" in text[2:6]) or ("tps:/" in text[2:7]) :
            droplink.accept()
        else:
            droplink.ignore() 

    def dropEvent(self, droplink):
        link_clipborad = QApplication.clipboard()
        link_clipborad.clear(mode=link_clipborad.Clipboard )
        link_string = droplink.mimeData().text() 
        link_clipborad.setText(str(link_string), mode=link_clipborad.Clipboard) 
        self.addLinkButtonPressed(button =link_clipborad )
    
	
    def gidGenerator(self):
        my_gid = hex(random.randint(1152921504606846976,18446744073709551615))
        my_gid = my_gid[2:18]
        my_gid = str(my_gid)
        f = Open(download_list_file_active)
        active_gid_list = f.readlines()
        f.close()
        while my_gid in active_gid_list :
            my_gid = self.gidGenerator()
        active_gids = download.activeDownloads()
        while my_gid in active_gids:
            my_gid = self.gidGenerator()
        
        return my_gid

    def selectedRow(self):
        try:
            item = self.download_table.selectedItems()
            selected_row_return = self.download_table.row(item[1]) 
            download_info = self.download_table.item(selected_row_return , 9).text()
            download_info = ast.literal_eval(download_info) 
            link = download_info['link']
            self.statusbar.showMessage(str(link))

        except :
            selected_row_return = None

        return selected_row_return 

    def checkSelectedRow(self):
        try:
            item = self.download_table.selectedItems()
            selected_row_return = self.download_table.row(item[1]) 
        except :
            selected_row_return = None

        if selected_row_return != None :
            status = self.download_table.item(selected_row_return , 1).text() 
            if status == "scheduled":
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.stopAction.setEnabled(True)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)

            elif status == "stopped" or status == "error" :
                self.stopAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.resumeAction.setEnabled(True)
                self.removeAction.setEnabled(True)
                self.propertiesAction.setEnabled(True)
                self.progressAction.setEnabled(False)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)



            elif status == "downloading":
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(True)
                self.stopAction.setEnabled(True)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)



            elif status == "waiting": 
                self.stopAction.setEnabled(True)
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)



            elif status == "complete":
                self.stopAction.setEnabled(False)
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(True)
                self.propertiesAction.setEnabled(True)
                self.progressAction.setEnabled(False)
                self.openDownloadFolderAction.setEnabled(True)
                self.openFileAction.setEnabled(True)            
                self.deleteFileAction.setEnabled(True)



            elif status == "paused":
                self.stopAction.setEnabled(True)
                self.resumeAction.setEnabled(True)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)


              
 
            else:
                self.progressAction.setEnabled(False)
                self.resumeAction.setEnabled(False)
                self.stopAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.openDownloadFolderAction.setEnabled(False)
                self.openFileAction.setEnabled(False)            
                self.deleteFileAction.setEnabled(False)



        else:
            self.progressAction.setEnabled(False)
            self.resumeAction.setEnabled(False)
            self.stopAction.setEnabled(False)
            self.pauseAction.setEnabled(False)
            self.removeAction.setEnabled(False)
            self.propertiesAction.setEnabled(False)
            self.openDownloadFolderAction.setEnabled(False)
            self.openFileAction.setEnabled(False)            
            self.deleteFileAction.setEnabled(False)



           
    def checkFlashgot(self):
        sleep(0.5)
        flashgot_file = Open("/tmp/persepolis-flashgot")
        flashgot_line = flashgot_file.readlines()
        flashgot_file.close()
        flashgot_file.remove()
        flashgot_add_link_dictionary_str = flashgot_line[0]
        flashgot_add_link_dictionary = ast.literal_eval(flashgot_add_link_dictionary_str) 
        self.flashgotAddLink(flashgot_add_link_dictionary)


    def flashgotAddLink(self,flashgot_add_link_dictionary):
        addlinkwindow = AddLinkWindow(self.callBack , flashgot_add_link_dictionary)
        self.addlinkwindows_list.append(addlinkwindow)
        self.addlinkwindows_list[len(self.addlinkwindows_list) - 1].show()

       
            



    def addLinkButtonPressed(self ,button):
        addlinkwindow = AddLinkWindow(self.callBack)
        self.addlinkwindows_list.append(addlinkwindow)
        self.addlinkwindows_list[len(self.addlinkwindows_list) - 1].show()

    def callBack(self , add_link_dictionary):
        gid = self.gidGenerator()

        download_info_file_list = ['***','waiting','***','***','***','***','***','***',gid , add_link_dictionary]
        download_info_file = config_folder + "/download_info/" + gid
        os.system("touch " + download_info_file )
         
        writeList(download_info_file , download_info_file_list)
        
        self.download_table.insertRow(0)
        j = 0
        download_info_file_list[9] = str(download_info_file_list[9])
        for i in download_info_file_list :
            item = QTableWidgetItem(i)
            self.download_table.setItem(0,j,item)
            j = j + 1

        if self.selectAction.isChecked() == True:
            item = self.download_table.item(0 , 0)
            item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
            item.setCheckState(QtCore.Qt.Unchecked)
 
        f = Open (download_list_file , "a")
        f.writelines(gid + "\n")
        f.close()


        f = Open (download_list_file_active , "a")
        f.writelines(gid + "\n")
        f.close()
        new_download = DownloadLink(gid)
        self.threadPool.append(new_download)
        self.threadPool[len(self.threadPool) - 1].start()
        self.progressBarOpen(gid) 
        if add_link_dictionary['start_hour'] == None :
            message = "Download Starts"
        else:
            message = "Download Scheduled"
        notifySend(message ,'' , 10000 , 'no', systemtray = self.system_tray_icon )

 

        
    def resumeButtonPressed(self,button):
        self.resumeAction.setEnabled(False)
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            download_status = self.download_table.item(selected_row_return , 1).text()
 
                
            if download_status == "paused" :
                answer = download.downloadUnpause(gid)
                if answer == 'None':
                    notifySend("Aria2 did not respond!","Try agian!",10000,'warning' , systemtray = self.system_tray_icon )



            else:
                new_download = DownloadLink(gid)
                self.threadPool.append(new_download)
                self.threadPool[len(self.threadPool) - 1].start()
                sleep(1)
                self.progressBarOpen(gid)




        else:
            self.statusbar.showMessage("Please select an item first!")


    def stopButtonPressed(self,button):
        self.stopAction.setEnabled(False)
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            answer = download.downloadStop(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!","Try agian!" , 10000 , 'critical' , systemtray = self.system_tray_icon )



           
               
        else:
            self.statusbar.showMessage("Please select an item first!")

    def pauseButtonPressed(self,button):
        self.pauseAction.setEnabled(False)
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            answer = download.downloadPause(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' , systemtray = self.system_tray_icon )

        else:
            self.statusbar.showMessage("Please select an item first!")
        sleep(1)

    def removeButtonPressed(self,button):
        self.removeAction.setEnabled(False)
        global remove_flag
        if remove_flag !=3 :
            remove_flag = 1
            while remove_flag != 2 :
                sleep(0.1)
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            file_name = self.download_table.item(selected_row_return , 0).text()
            status = self.download_table.item(selected_row_return , 1).text()
            sleep(0.5)
            self.download_table.removeRow(selected_row_return)

#remove gid of download from download list file
            f = Open(download_list_file)
            download_list_file_lines = f.readlines()
            f.close()
            f = Open(download_list_file , "w")
            for i in download_list_file_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove gid of download from active download list file
            f = Open(download_list_file_active)
            download_list_file_active_lines = f.readlines()
            f.close()
            f = Open(download_list_file_active , "w")
            for i in download_list_file_active_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove download_info_file
            download_info_file = download_info_folder + "/" + gid
            f = Open(download_info_file)
            f.close()
            f.remove()
#remove file of download form download temp folder
            if file_name != '***' and status != 'complete' :
                file_name_path = temp_download_folder + "/" +  str(file_name)
                os.system('rm "' + str(file_name_path) +'"')
                file_name_aria = file_name_path + str('.aria2')
                os.system('rm "' + str(file_name_aria) +'"')
        else:
            self.statusbar.showMessage("Please select an item first!")
        remove_flag = 0
        self.selectedRow()

    def propertiesButtonPressed(self,button):
        self.propertiesAction.setEnabled(False)
        selected_row_return = self.selectedRow()
        if selected_row_return != None :
            add_link_dictionary_str = self.download_table.item(selected_row_return , 9).text() 
            add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
            gid = self.download_table.item(selected_row_return , 8 ).text()
            propertieswindow = PropertiesWindow(self.propertiesCallback ,gid)
            self.propertieswindows_list.append(propertieswindow)
            self.propertieswindows_list[len(self.propertieswindows_list) - 1].show()

    def propertiesCallback(self,add_link_dictionary , gid ):
        download_info_file = download_info_folder + "/" + gid
        download_info_file_list = readList(download_info_file )
        download_info_file_list [9] = add_link_dictionary
        writeList(download_info_file , download_info_file_list)
            
    def progressButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            if gid in self.progress_window_list_dict :
                member_number = self.progress_window_list_dict[gid]
                if self.progress_window_list[member_number].isVisible() == False:
                    self.progress_window_list[member_number].show()
                else :
                    self.progress_window_list[member_number].hide()

    def progressBarOpen(self,gid):
        progress_window = ProgressWindow(parent = self,gid = gid)
        self.progress_window_list.append(progress_window)
        member_number = len(self.progress_window_list) - 1
        self.progress_window_list_dict[gid] = member_number 
        self.progress_window_list[member_number].show()
 
#close event
    def closeEvent(self, event):
        print("Please Wait...")
        self.hide()
        self.system_tray_icon.hide()
        download.shutDown()
        sleep(0.5)
        global shutdown_notification
        shutdown_notification = 1
        while shutdown_notification != 2:
            sleep (0.1)

        QCoreApplication.instance().closeAllWindows()

        QCoreApplication.instance().quit
        print("Persepolis Closed")
        sys.exit(0)

    def showTray(self,menu):
        if self.trayAction.isChecked() == True :
            self.system_tray_icon.show()
            self.minimizeAction.setEnabled(True)
        else:
            self.system_tray_icon.hide()
            self.minimizeAction.setEnabled(False)

    def systemTrayPressed(self,click):
        if click == 3 :
            self.minMaxTray(click)
            

    def minMaxTray(self,menu):
        if self.isVisible() == False:
            self.show()
            self.minimizeAction.setText('Minimize to system tray')
            self.minimizeAction.setIcon(QIcon(icons + 'minimize'))
        

        else :
            self.minimizeAction.setText('Show main Window')
            self.minimizeAction.setIcon(QIcon(icons + 'window'))
            self.hide()

    def showMainWindow(self):
        self.show()
        self.minimizeAction.setText('Minimize to system tray')
        self.minimizeAction.setIcon(QIcon(icons + 'minimize'))
 

    def stopAllDownloads(self,menu):
        active_gids = []
        for i in range(self.download_table.rowCount()):
            try:
                row_status = self.download_table.item(i , 1).text()
                if row_status == 'downloading' or row_status == 'paused' or row_status == 'waiting':
                    row_gid = self.download_table.item(i , 8).text()
                    active_gids.append(row_gid)
            except :
                pass
        for gid in active_gids:
            answer = download.downloadStop(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' , systemtray = self.system_tray_icon )


            sleep(0.3)

           

    def pauseAllDownloads(self,menu):
#get active gid of downloads from aria
        active_gids = download.activeDownloads()
#check that if gid is in download_list_file_active
        f = Open(download_list_file_active)
        download_list_file_active_lines = f.readlines()
        f.close()
        for i in range(len(download_list_file_active_lines)):
            download_list_file_active_lines[i] = download_list_file_active_lines[i].strip()

        for gid in active_gids :
            if gid in download_list_file_active_lines :
                answer = download.downloadPause(gid)
                if answer == 'None':
                    notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' , systemtray = self.system_tray_icon )

                sleep(0.3)
            

    def openPreferences(self,menu):
        self.preferenceswindow = PreferencesWindow(self)
        self.preferenceswindow.show()



    def openAbout(self,menu):
        self.about_window = AboutWindow()
        self.about_window.show()


    def openDefaultDownloadFolder(self,menu):
        f = Open(setting_file)
        setting_file_lines = f.readlines()
        f.close()
        setting_dict_str = str(setting_file_lines[0].strip())
        setting_dict = ast.literal_eval(setting_dict_str) 
        download_path = setting_dict ['download_path']
        if os.path.isdir(download_path):
            os.system("xdg-open '" + download_path + "'" )
        else:
            notifySend(str(download_path) ,'Not Found' , 5000 , 'warning' , systemtray = self.system_tray_icon )




    def openDownloadFolder(self,menu):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            download_status = self.download_table.item(selected_row_return , 1).text()
            if download_status == 'complete':
                add_link_dictionary_str = self.download_table.item(selected_row_return , 9).text() 
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
                if 'file_path' in add_link_dictionary :
                    file_path = add_link_dictionary ['file_path']
                    file_path_split = file_path.split('/')
                    del file_path_split[-1]
                    download_path = '/'.join(file_path_split)
                    if os.path.isdir(download_path):
                        os.system("xdg-open '" + download_path + "' &" )
                    else:
                        notifySend(str(download_path) ,'Not Found' , 5000 , 'warning' , systemtray = self.system_tray_icon )



    def openFile(self,menu):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            download_status = self.download_table.item(selected_row_return , 1).text()
            if download_status == 'complete':
                add_link_dictionary_str = self.download_table.item(selected_row_return , 9).text() 
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
                if 'file_path' in add_link_dictionary:
                    file_path = add_link_dictionary['file_path']
                    if os.path.isfile(file_path):
                        os.system("xdg-open '" + file_path  + "' &" )
                    else:
                        notifySend(str(file_path) ,'Not Found' , 5000 , 'warning' , systemtray = self.system_tray_icon )

    def deleteFile(self,menu):
        selected_row_return = self.selectedRow()
        global remove_flag
        remove_flag = 1
        while remove_flag != 2 :
            sleep(0.1)
#This section is checking the download status , if download was completed then download file is removing
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            download_status = self.download_table.item(selected_row_return , 1).text()
            if download_status == 'complete':
                add_link_dictionary_str = self.download_table.item(selected_row_return , 9).text() 
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
                if 'file_path' in add_link_dictionary:
                    file_path = add_link_dictionary['file_path']
                    if os.path.isfile(file_path):
                        os.system("rm '" + file_path  + "'" )
                    else:
                        notifySend(str(file_path) ,'Not Found' , 5000 , 'warning' , systemtray = self.system_tray_icon )
                    remove_flag = 3
                    self.removeButtonPressed(menu)

    def selectDownloads(self,menu):
        if self.selectAction.isChecked() == True:
#selectAllAction is checked >> activating actions and adding removeSelectedAction and deleteSelectedAction to the toolBar
            self.toolBar.clear()
            for i in self.addlinkAction,self.resumeAction, self.pauseAction , self.stopAction, self.removeSelectedAction , self.deleteSelectedAction , self.propertiesAction, self.progressAction , self.exitAction :
                self.toolBar.addAction(i)
         

            self.toolBar.insertSeparator(self.addlinkAction)
            self.toolBar.insertSeparator(self.resumeAction)     
            self.toolBar.insertSeparator(self.removeSelectedAction)
            self.toolBar.insertSeparator(self.exitAction)
            self.toolBar.addSeparator()

            for i in range(self.download_table.rowCount()):
                item = self.download_table.item(i , 0)
                item.setFlags(QtCore.Qt.ItemIsUserCheckable | QtCore.Qt.ItemIsEnabled)
                item.setCheckState(QtCore.Qt.Unchecked)
                self.selectAllAction.setEnabled(True)
                self.removeSelectedAction.setEnabled(True)
                self.deleteSelectedAction.setEnabled(True)
                 
        else:
#selectAction is unchecked deactivate actions and adding removeAction and deleteFileAction to the toolBar
            self.toolBar.clear()
            for i in self.addlinkAction,self.resumeAction, self.pauseAction , self.stopAction, self.removeAction , self.deleteFileAction , self.propertiesAction, self.progressAction , self.exitAction :
                self.toolBar.addAction(i)
         

            self.toolBar.insertSeparator(self.addlinkAction)
            self.toolBar.insertSeparator(self.resumeAction)     
            self.toolBar.insertSeparator(self.removeSelectedAction)
            self.toolBar.insertSeparator(self.exitAction)
            self.toolBar.addSeparator()
 
            for i in range(self.download_table.rowCount()):
                item_text = self.download_table.item(i , 0).text()
                item = QTableWidgetItem(item_text) 
                self.download_table.setItem(i , 0 , item)
                self.selectAllAction.setEnabled(False)
                self.removeSelectedAction.setEnabled(False)
                self.deleteSelectedAction.setEnabled(False)
                


    def selectAll(self,menu):
        for i in range(self.download_table.rowCount()):
            item = self.download_table.item(i , 0)
            item.setCheckState(QtCore.Qt.Checked)
 
    def removeSelected(self,menu):
        global remove_flag
        remove_flag = 1
        while remove_flag != 2 :
            sleep(0.1)

        gid_list = []
        for row in range(self.download_table.rowCount()):
            status = self.download_table.item(row , 1).text() 
            item = self.download_table.item(row , 0)
            if (item.checkState() == 2) and (status == 'complete' or status == 'error' or status == 'stopped' ):
                gid = self.download_table.item(row , 8 ).text()
                gid_list.append(gid)


        for gid in gid_list:        
            for i in range(self.download_table.rowCount()):
                row_gid = self.download_table.item(i , 8).text()
                if gid == row_gid :
                    row = i 
                    break

           
            file_name = self.download_table.item(row , 0).text()
            sleep(0.5)
            self.download_table.removeRow(row)

#remove gid of download from download list file
            f = Open(download_list_file)
            download_list_file_lines = f.readlines()
            f.close()
            f = Open(download_list_file , "w")
            for i in download_list_file_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove gid of download from active download list file
            f = Open(download_list_file_active)
            download_list_file_active_lines = f.readlines()
            f.close()
            f = Open(download_list_file_active , "w")
            for i in download_list_file_active_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove download_info_file
            download_info_file = download_info_folder + "/" + gid
            f = Open(download_info_file)
            f.close()
            f.remove()
#remove file of download form download temp folder
            if file_name != '***' and status != 'complete' :
                file_name_path = temp_download_folder + "/" +  str(file_name)
                os.system('rm "' + str(file_name_path) +'"')
                file_name_aria = file_name_path + str('.aria2')
                os.system('rm "' + str(file_name_aria) +'"')

        remove_flag = 0

    def deleteSelected(self,menu):
        global remove_flag
        remove_flag = 1
        while remove_flag != 2 :
            sleep(0.1)

        gid_list = []
        for row in range(self.download_table.rowCount()):
            status = self.download_table.item(row , 1).text() 
            item = self.download_table.item(row , 0)
            if (item.checkState() == 2) and (status == 'complete' or status == 'error' or status == 'stopped' ):
                gid = self.download_table.item(row , 8 ).text()
                gid_list.append(gid)


        for gid in gid_list:        
            for i in range(self.download_table.rowCount()):
                row_gid = self.download_table.item(i , 8).text()
                if gid == row_gid :
                    row = i 
                    break
            file_name = self.download_table.item(row , 0).text()
            add_link_dictionary_str = self.download_table.item(row , 9).text() 
            add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 


            sleep(0.5)
            self.download_table.removeRow(row)
#remove gid of download from download list file
            f = Open(download_list_file)
            download_list_file_lines = f.readlines()
            f.close()
            f = Open(download_list_file , "w")
            for i in download_list_file_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove gid of download from active download list file
            f = Open(download_list_file_active)
            download_list_file_active_lines = f.readlines()
            f.close()
            f = Open(download_list_file_active , "w")
            for i in download_list_file_active_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()


#remove download_info_file
            download_info_file = download_info_folder + "/" + gid
            f = Open(download_info_file)
            f.close()
            f.remove()

#remove file of download form download temp folder
            if file_name != '***' and status != 'complete' :
                file_name_path = temp_download_folder + "/" +  str(file_name)
                os.system('rm "' + str(file_name_path) +'"')
                file_name_aria = file_name_path + str('.aria2')
                os.system('rm "' + str(file_name_aria) +'"')

#remove download file
            if status == 'complete':
                if 'file_path' in add_link_dictionary:
                    file_path = add_link_dictionary['file_path']
                    if os.path.isfile(file_path):
                        os.system("rm '" + file_path  + "'" )
                    else:
                        notifySend(str(file_path) ,'Not Found' , 5000 , 'warning' , systemtray = self.system_tray_icon )

        remove_flag = 0
コード例 #9
0
ファイル: main_ui.py プロジェクト: Strice91/PySIMS
 def openAboutWindow(self):
     # Open the About Window
     self.AboutWindow = AboutWindow(parent=self)
     self.AboutWindow.exec_()
コード例 #10
0
ファイル: root_painter.py プロジェクト: Abe404/root_painter
 def show_about_window(self):
     self.about_window = AboutWindow()
     self.about_window.show()
コード例 #11
0
ファイル: main_ui.py プロジェクト: Strice91/PySIMS
class MainWindow(QMainWindow):
    """ This class builds the main window pf PySIMS. It is able to
        open the chat windows. Chat windows are opend when the Server
        pushes new messages or the user wants to start a chat."""
    # Signal to make a new ChatWindo with a message
    openChat = Signal(str)
    # Incoming new message
    newMsg = Signal(str, str)

    # Cunstructor of MainWindow ##############################################

    def __init__(self, parent=None):
        super(MainWindow, self).__init__()

        self.parent = parent

        self.tcp = parent.tcp
        self.tcp.recvAns.connect(self.parseAns)
        self.tcp.ConError.connect(self.tcpError)

        self.UID = parent.UID
        self.sound = Sound()
        self.initUI()
        
    # Init Functions #########################################################
    def initUI(self):

        # Write all Stylsheets
        self.setStyle()
        # Init the Profile Groupbox
        self.Profile()
        # Init the Contro Groupbox
        #self.Control()
        # Init the Contact Groupbox
        self.Contacts()
        # Request Contact List from Server
        #self.requestList()
        # Requste Stored Messages from Server
        self.requestMsg()
        # Init List of Chatwindows
        self.ChatWindows = {}


        # Adjust Window ------------------------------------------------------
        # Set Title
        self.setWindowTitle('PySIMS')
        # Set Windwo Icon
        self.setWindowIcon(QIcon('img/pysims_icon_16.png')) 
        # Set Window Position and Size
        self.setGeometry(10, 50, 250, 400)
        self.setFixedWidth(250)

        # Show Statusbar
        self.statusBar().showMessage('Verbinung hergestellt')

        # MenuBar ------------------------------------------------------------
        # Create Exit
        exitAction = QAction(QIcon('img/main/exit.png'), 'Beenden', self)
        exitAction.setStatusTip('Beenden')
        exitAction.setShortcut('Ctrl+Q')
        exitAction.triggered.connect(self.close)

        # Create Profil
        profileAction = QAction(QIcon('img/main/profile.png'), 'Profil', self)
        profileAction.setStatusTip('Benutzer Profil')
        profileAction.setShortcut('Ctrl+P')
        #profileAction.triggered.connect(self.close)

        # Create Settings
        settingsAction = QAction(QIcon('img/main/settings.png'), 'Einstellungen', self)
        settingsAction.setStatusTip('Einstellungen')
        settingsAction.setShortcut('Ctrl+E')
        #settingsAction.triggered.connect(self.close)

        # Create About
        aboutAction = QAction(QIcon('img/main/about.png'), 'Ueber PySIMS', self)
        aboutAction.setStatusTip('Ueber PySIMS')
        aboutAction.triggered.connect(self.openAboutWindow)

        # Create Help
        helpAction = QAction(QIcon('img/main/help.png'), 'Hilfe', self)
        helpAction.setStatusTip('Hilfe')
        #settingsAction.triggered.connect(self.close)

        # Create MenuBar
        menubar = self.menuBar()
        # Add File Menu
        fileMenu = menubar.addMenu('&Datei')
        fileMenu.addAction(exitAction)
        # Add Options Menu
        optMenu = menubar.addMenu('&Optionen')
        optMenu.addAction(profileAction)
        optMenu.addAction(settingsAction)
        # Add Help Menu
        helpMenu = menubar.addMenu('&Hilfe')
        helpMenu.addAction(helpAction)
        helpMenu.addAction(aboutAction)


        # Create layout and add widgets --------------------------------------
        widget = QWidget()
        self.setCentralWidget(widget)

        # Build Main Layout, Add all Widgets
        layout = QVBoxLayout()
        #layout.addWidget(scroll)
        layout.addWidget(self.ProfileGroup)
        #layout.addWidget(self.ControlGroup)
        layout.addWidget(self.ContactGroup)
        layout.addStretch(1)

        widget.setLayout(layout)

    # Style ##################################################################
    def setStyle(self):

        # Set the Syle for all classes
        self.setStyleSheet( """
                            QLabel[labelClass='Username'] 
                            {font-size: 16px;

                            }
                            """)

    # Contact List ###########################################################
    def Contacts(self):

        # Create Contact Group Box
        self.ContactGroup = QGroupBox('Kontakte')
        # Create Main Layout
        layout = QVBoxLayout()
        # Create Scroll Area
        self.ContactScroll = QScrollArea()
        # Scroll Area Properties
        self.ContactScroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.ContactScroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.ContactScroll.setWidgetResizable(False)
        self.ContactScroll.setMinimumSize(30,300)

        # Create a Container Widget for the VBoxLayout
        self.ContactScrollContainer = QWidget()
        # Create the Contactlist
        self.ContactListLayout = QVBoxLayout()
        # Add Scroll Area to Layout
        layout.addWidget(self.ContactScroll)
        # Add Layout to Group
        self.ContactGroup.setLayout(layout)

    # User Profile ###########################################################
    def Profile(self):

        # Create the Profile Groupbox
        self.ProfileGroup = QGroupBox('Profil')

        # Create the Profile Main Layout
        ProfileLayout = QHBoxLayout()

        # Create Profile Information Layout
        ProfileInfoLayout = QVBoxLayout()

        # Create username Label
        self.userNameLabel = QLabel(self.parent.userName)
        self.userNameLabel.setProperty('labelClass', 'Username')

        # Create Status selector
        self.statusSelect = QComboBox(self)
        self.statusSelect.addItem('Online')
        self.statusSelect.addItem('Abwesend')
        self.statusSelect.addItem('Beschaeftigt')
        self.statusSelect.addItem('Offline')

        self.statusSelect.currentIndexChanged[int].connect(self.changeStatus)

        # Create Infotext Label
        self.ProfileinfoLabel = QLabel('<font color=green>Verbunden</font>')

        # Create Profile Picture
        self.UserImgPixmap = QPixmap('img/user/userpic.png')
        self.UserImgLabel = ClickableLabel(self)
        self.UserImgLabel.setPixmap(self.UserImgPixmap)
        
        # Build Profile Info Layout
        ProfileInfoLayout.addWidget(self.userNameLabel)
        ProfileInfoLayout.addWidget(self.statusSelect)
        ProfileInfoLayout.addWidget(self.ProfileinfoLabel)

        # Build Profile Main Layout
        ProfileLayout.addLayout(ProfileInfoLayout)
        ProfileLayout.addStretch(1)
        ProfileLayout.addWidget(self.UserImgLabel)

        # Add to Profile Group
        self.ProfileGroup.setLayout(ProfileLayout)

    # Control Group Box ######################################################
    # For adding addition Features to the main Window
    def Control(self):

        self.ControlGroup = QGroupBox('Control')
        # Create the Control Main Layout
        ControlLayout = QHBoxLayout()


    # Actions and Slots ######################################################

    def updateContacts(self, contactList):

        # Sort contacts by name
        sortedList = sorted(contactList.items(), key= lambda x: x[1]['name'].lower())

        # Empty old Contact list
        self.ContactScrollContainer.deleteLater()
        self.ContactScrollContainer = QWidget()
        self.ContactListLayout = None
        self.ContactListLayout = QVBoxLayout()

        # Add every Contact from the List
        for c in sortedList:

            # exxtract contact
            contact = c[1]
            cLayout = QHBoxLayout()

            # Name
            cLabel = QLabel(contact['name'])
            cLabel.setMinimumSize(QSize(100,24))
            cLabel.setStyleSheet("QLabel {font-size: 14px}")

            # Status
            StatusImgPath = path.join('img/user/',contact['status'] +'.png')
            cStatusPixmap = QPixmap(StatusImgPath)
            cStatus = QLabel()
            cStatus.setToolTip(contact['status'])
            cStatus.setPixmap(cStatusPixmap)

            # Add Chat Button
            cChatPixmap = QPixmap('img/main/chat.png')
            cChat = ClickableChat(self, contact['UID'])
            cChat.setPixmap(cChatPixmap)
            cChat.setToolTip('Chat beginnen')
            cChat.openChat.connect(self.openChat)

            # Build the Contact horizontal Layout
            cLayout.addWidget(cLabel)
            cLayout.addStretch(1)
            cLayout.addWidget(cStatus)
            cLayout.addWidget(cChat)

            # Add contact to the List
            self.ContactListLayout.addLayout(cLayout)
            
        # Add Contactlist to Container
        self.ContactScrollContainer.setLayout(self.ContactListLayout)
        # Add Container to Scroll Area
        self.ContactScroll.setWidget(self.ContactScrollContainer) 

    def openAboutWindow(self):
        # Open the About Window
        self.AboutWindow = AboutWindow(parent=self)
        self.AboutWindow.exec_()

    def requestList(self):
        # Request the userlist from the Server
        req = 'GETLIST'
        self.tcp.sendReq(req)

    def requestMsg(self):
        # Request Messages from the Server
        req = 'PULLMSGS'
        self.tcp.sendReq(req)

    def requestGID(self, members):
        # Request a group ID to open a new Chat
        req = 'MKGRP\r\n'
        req += 'UID:'
        for userID in members:
            if not userID == members[-1]:
                req += userID + ','
            else:
                req += userID + '\r\n'

        req += 'SID:' + self.parent.SID + '\r\n\r\n'

        self.tcp.sendReq(req)

    def sendAck(self):
        # Send ACK to Server
        #self.tcp.sendReq('ACK\r\n')
        #print('ACK sent')
        pass

    def changeStatus(self, status):
        # Change the Status of the online mode
        if status == 0:
            # Online
            print('New Status: Online')
        elif status == 1:
            # Abwesend
            print('New Status: Abwesend')
        elif status == 2:
            # Beschaeftigt
            print('New Status: Beschaeftigt')
        elif status == 3:
            # Offline
            print('New Status: Offline')

    @Slot(str, str)
    def parseAns(self, lastReq, ServerAns):
        # Parse the message from the Server

        dlvmsg = False
        gids = {}

        # Split the different Commands
        for ans in ServerAns.split('\r\n\r\n'):
            ans = ans.split('\r\n')
            print('------  Main Window Recived: -----')
            print(ans)
            print('----------------------------------')

            # Is it a new Userlist?
            if ans[0] == 'USRLIST':
                myContacts = contactList(ans[1:], self.parent.userName)
                self.contactList = myContacts.getList()
                self.updateContacts(self.contactList)

            # Is it a new GroupID for a Chat?
            if ans[0] == 'MKGRP OK':
                GID = ans[1].split(':')
                if GID[0] == 'GID':
                    self.checkChatWindow(GID[1])
            
            # Is it a new Message?
            if ans[0] == 'DLVMSG':
                GID = ans[1].split(':')
                UID = ans[2].split(':')
                if GID[0] == 'GID':
                    if GID[1] in gids:
                        if UID[0] == 'UID':
                            gids[GID[1]]['UIDS'].append(UID[1])
                            gids[GID[1]]['MSGS'].append(ans[3])
                    else:
                        if UID[0] == 'UID':
                            gids[GID[1]] = {'UIDS': [], 'MSGS': []}
                            gids[GID[1]]['UIDS'].append(UID[1])
                            gids[GID[1]]['MSGS'].append(ans[3])
                        

        # If there are more than one message and more groups that got new
        # Messages it is important to give the right Messages to the right
        # chat windows
        if gids:
            for gid in gids:
                print(gids[gid])
                #self.sendAck()
                self.checkChatWindow(gid, gids[gid]['UIDS'], gids[gid]['MSGS'])
                self.sound.newWindow()

                    

    @Slot(str)
    def openChat(self, memberID):
        # Open a new Chat
        print('Open Chat with', memberID)
        members = [self.UID, memberID] 
        self.requestGID(members)

    def checkChatWindow(self, gid, senderID=None, msg=None):
        # Check if the Chat allready exsists or if it is
        # nescessary to open a new window

        #print('SenderID:', senderID)
        if gid in self.ChatWindows:
            pass
            #print (self.ChatWindows[gid])
        else:
            self.ChatWindows[gid] = QChatWindow(gid, senderID, msg, self)
            self.ChatWindows[gid].show()

    @Slot(str)
    def tcpError(self, err):
        # Detect network error and forward the errortype
        if err == 'ConnectionClosed':
            self.statusBar().showMessage('Verbinung unterbrochen!')
            self.ProfileinfoLabel.setText('<font color=red>Verbinung unterbrochen!</font>')
        elif err == 'ConnectionRefused':
            self.statusBar().showMessage('Server nicht erreichbar!')
            self.ProfileinfoLabel.setText('<font color=red>Server nicht erreichbar!</font>')
        self.logout()

    def logout(self):
        # Logout the user and show the login Window
        self.sound.conError()
        self.parent.show()
        #self.Log = login_ui.LoginWindow()
        #self.Log.show()

        self.close()

    def closeEvent(self, ev):

        # When the main Window is closes than all the
        # other windows should close too.

        # It is important to search all open chats because
        # should not change the array while ittarting
        gids = []
        for gid in self.ChatWindows:
            # Find all open Chats
            gids.append(gid)

        for gid in gids:
            # Close all open Chats
            self.ChatWindows[gid].close() 
コード例 #12
0
ファイル: mainwindow.py プロジェクト: amirsdream/persepolis
 def openAbout(self,menu):
     self.about_window = AboutWindow()
     self.about_window.show()
コード例 #13
0
ファイル: mainwindow.py プロジェクト: amirsdream/persepolis
class MainWindow(MainWindow_Ui):
    def __init__(self):
        super().__init__()
        self.statusbar.showMessage('Please Wait ...')

#threads     
        self.threadPool=[]
#starting aria
        start_aria = StartAria2Thread()
        self.threadPool.append(start_aria)
        self.threadPool[0].start() 
        self.threadPool[0].ARIA2RESPONDSIGNAL.connect(self.startAriaMessage)

#initializing    

#add downloads to the download_table
        f_download_list_file = Open(download_list_file)
        download_list_file_lines = f_download_list_file.readlines()
        f_download_list_file.close()
            
        for line in download_list_file_lines:
            gid = line.strip()
            self.download_table.insertRow(0)
            download_info_file = download_info_folder + "/" + gid
            f = Open(download_info_file)
            download_info_file_lines = f.readlines()
            f.close()
            for i in range(10):
                item = QTableWidgetItem(download_info_file_lines[i].strip())
                self.download_table.setItem(0 , i , item)

        row_numbers = self.download_table.rowCount()
        for row in range(row_numbers):
            status = self.download_table.item(row , 1).text() 
            if (status != "complete" and status != "error"):
                gid = self.download_table.item(row,8).text() 
                add_link_dictionary_str = self.download_table.item(row,9).text() 
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str.strip()) 
                add_link_dictionary['start_hour'] = None
                add_link_dictionary['start_minute'] = None
                add_link_dictionary['end_hour'] = None
                add_link_dictionary['end_minute'] = None
                add_link_dictionary['after_download'] = 'None'

                download_info_file = download_info_folder + "/" + gid
                f = Open(download_info_file)
                download_info_file_lines = f.readlines()
                f.close()

                f = Open(download_info_file , "w")
                for i in range(10):
                    if i == 1 :
                        f.writelines("stopped" + "\n")
                        item = QTableWidgetItem('stopped')
                        self.download_table.setItem(row , i , item )
                    elif i == 9 :
                        f.writelines(str(add_link_dictionary) + "\n")
                        item = QTableWidgetItem(str(add_link_dictionary))
                        self.download_table.setItem(row,i , item)
                    else:
                        f.writelines(download_info_file_lines[i].strip() + "\n")

                f.close()
        self.addlinkwindows_list = []
        self.propertieswindows_list = []
        self.progress_window_list = []
        self.progress_window_list_dict = {}

        check_download_info = CheckDownloadInfoThread()
        self.threadPool.append(check_download_info)
        self.threadPool[1].start()
        self.threadPool[1].DOWNLOAD_INFO_SIGNAL.connect(self.checkDownloadInfo)

        check_selected_row = CheckSelectedRowThread()
        self.threadPool.append(check_selected_row)
        self.threadPool[2].start()
        self.threadPool[2].CHECKSELECTEDROWSIGNAL.connect(self.checkSelectedRow)

        check_flashgot = CheckFlashgot()
        self.threadPool.append(check_flashgot)
        self.threadPool[3].start()
        self.threadPool[3].CHECKFLASHGOTSIGNAL.connect(self.checkFlashgot)

        

 

        self.system_tray_icon = QSystemTrayIcon() 
        self.system_tray_icon.setIcon(QIcon('icon'))
        system_tray_menu = QMenu()
        system_tray_menu.addAction(self.addlinkAction)
        system_tray_menu.addAction(self.pauseAllAction)
        system_tray_menu.addAction(self.stopAllAction)
        system_tray_menu.addAction(self.minimizeAction)
        system_tray_menu.addAction(self.exitAction)
        self.system_tray_icon.setContextMenu(system_tray_menu)
        self.system_tray_icon.activated.connect(self.systemTrayPressed)
        self.system_tray_icon.show()

    def startAriaMessage(self,message):
        global aria_startup_answer
        if message == 'yes':
            sleep (2)
            self.statusbar.showMessage('Ready...')
            aria_startup_answer = 'ready'
        else:
            self.statusbar.showMessage('Error...')
            notifySend('Persepolis can not connect to Aria2' , 'Restart Persepolis' ,10000,'critical' )

    def checkDownloadInfo(self,gid):
        try:
#get download information from download_info_file according to gid and write them in download_table cells
            download_info_file = config_folder + "/download_info/" + gid
            f = Open(download_info_file)
            download_info_file_lines = f.readlines()
            f.close()
#finding row of this gid!
            for i in range(self.download_table.rowCount()):
                row_gid = self.download_table.item(i , 8).text()
                if gid == row_gid :
                    row = i 
                    break

            for i in range(10):
#remove gid of completed download from active downloads list file
                if i == 1 :
                    status = download_info_file_lines[i].strip()
                    status = str(status)
                    status_download_table = str(self.download_table.item(row , 1 ) . text())

                    if status == "complete":
                        f = Open(download_list_file_active)
                        download_list_file_active_lines = f.readlines()
                        f.close()
                        f = Open(download_list_file_active , "w")
                        for line in download_list_file_active_lines :
                            if line.strip() != gid :
                                f.writelines(line.strip() + "\n")
                        f.close()
                    
#update download_table cells
                item = QTableWidgetItem(download_info_file_lines[i].strip())
                self.download_table.setItem(row , i , item)
                self.download_table.viewport().update()
#update progresswindow
            try :
            
                member_number = self.progress_window_list_dict[gid]
                progress_window = self.progress_window_list[member_number]
                #link
                add_link_dictionary_str = str(download_info_file_lines[9].strip())
                add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
                link = "<b>Link</b> : " +  str(add_link_dictionary ['link'])
                progress_window.link_label.setText(link)
                progress_window.setToolTip(link)

                #Save as
                final_download_path = add_link_dictionary['final_download_path']
                if final_download_path == None :
                    final_download_path = str(add_link_dictionary['download_path'])
                        
                save_as = "<b>Save as</b> : " + final_download_path + "/" + str(download_info_file_lines[0].strip())
                progress_window.save_label.setText(save_as)
                file_name = str(download_info_file_lines[0].strip())
                if file_name != "***":
                    progress_window.setWindowTitle(file_name ) 

                #status
                progress_window.status = download_info_file_lines[1].strip()
                status = "<b>status</b> : " + progress_window.status 
                progress_window.status_label.setText(status)
                if progress_window.status == "downloading":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(True)
                elif progress_window.status == "paused":
                    progress_window.resume_pushButton.setEnabled(True)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "waiting":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(False)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "scheduled":
                    progress_window.resume_pushButton.setEnabled(False)
                    progress_window.stop_pushButton.setEnabled(True)
                    progress_window.pause_pushButton.setEnabled(False)
                elif progress_window.status == "stopped" or progress_window.status == "error" or progress_window.status == "complete" :
                    progress_window.close()
                    self.progress_window_list[member_number] = []
                    del self.progress_window_list_dict[gid]
                    if progress_window.status == "complete":
                        notifySend("Download Complete" ,str(download_info_file_lines[0])  , 10000 , 'ok' )
                    elif progress_window.status == "stopped":
                        notifySend("Download Stopped" , str(download_info_file_lines[0]) , 10000 , 'no')

                    elif progress_window.status == "error":
                        notifySend("Download Error" , str(download_info_file_lines[0]) , 10000 , 'fail')
               
                        add_link_dictionary['start_hour'] = None
                        add_link_dictionary['start_minute'] = None
                        add_link_dictionary['end_hour'] = None
                        add_link_dictionary['end_minute'] = None
                        add_link_dictionary['after_download'] = 'None'

                        f = Open(download_info_file , "w")
                        for i in range(10):
                            if i == 9 :
                                f.writelines(str(add_link_dictionary) + "\n")
                            else:
                                f.writelines(download_info_file_lines[i].strip() + "\n")

                        f.close()
                    
                    if os.path.isfile('/tmp/persepolis/shutdown/' + gid ) == True and progress_window.status != 'stopped':
                        answer = download.shutDown()
                        if answer == 'error':
                            os.system('killall aria2c')
                        f = Open('/tmp/persepolis/shutdown/' + gid , 'w')
                        f.writelines('shutdown')
                        f.close()
                    elif os.path.isfile('/tmp/persepolis/shutdown/' + gid ) == True and progress_window.status == 'stopped':
                        f = Open('/tmp/persepolis/shutdown/' + gid , 'w')
                        f.writelines('canceled')
                        f.close()



             
                #downloaded
                downloaded = "<b>Downloaded</b> : " + str(download_info_file_lines[3].strip()) + "/" + str(download_info_file_lines[2].strip())
                progress_window.downloaded_label.setText(downloaded)

                #Transfer rate
                rate = "<b>Transfer rate</b> : " + str(download_info_file_lines[6].strip())
                progress_window.rate_label.setText(rate)

                #Estimate time left
                estimate_time_left = "<b>Estimate time left</b> : " + str(download_info_file_lines[7].strip()) 
                progress_window.time_label.setText(estimate_time_left)

                #Connections
                connections = "<b>Connections</b> : " + str(download_info_file_lines[5].strip())
                progress_window.connections_label.setText(connections)


                #progressbar
                value = download_info_file_lines[4].strip()
                value = value[:-1]
                progress_window.download_progressBar.setValue(int(value))
            except :
                pass
        except:
            pass
                   



#contex menu
    def contextMenuEvent(self, event):
        self.tablewidget_menu = QMenu(self)
        self.tablewidget_menu.addAction(self.resumeAction)
        self.tablewidget_menu.addAction(self.pauseAction)
        self.tablewidget_menu.addAction(self.stopAction)
        self.tablewidget_menu.addAction(self.removeAction)
        self.tablewidget_menu.addAction(self.propertiesAction)
        self.tablewidget_menu.addAction(self.progressAction)
        self.tablewidget_menu.popup(QtGui.QCursor.pos())
#drag and drop for links
    def dragEnterEvent(self, droplink):

        text = str(droplink.mimeData().text())
      
        if ("tp:/" in text[2:6]) or ("tps:/" in text[2:7]) :
            droplink.accept()
        else:
            droplink.ignore() 

    def dropEvent(self, droplink):
        link_clipborad = QApplication.clipboard()
        link_clipborad.clear(mode=link_clipborad.Clipboard )
        link_string = droplink.mimeData().text() 
        link_clipborad.setText(str(link_string), mode=link_clipborad.Clipboard) 
        self.addLinkButtonPressed(button =link_clipborad )
    
	
    def gidGenerator(self):
        my_gid = hex(random.randint(1152921504606846976,18446744073709551615))
        my_gid = my_gid[2:18]
        my_gid = str(my_gid)
        f = Open(download_list_file_active)
        active_gid_list = f.readlines()
        f.close()
        while my_gid in active_gid_list :
            my_gid = self.gidGenerator()
        active_gids = download.activeDownloads()
        while my_gid in active_gids:
            my_gid = self.gidGenerator()
        
        return my_gid

    def selectedRow(self):
        try:
            item = self.download_table.selectedItems()
            selected_row_return = self.download_table.row(item[1]) 
            download_info = self.download_table.item(selected_row_return , 9).text()
            download_info = ast.literal_eval(download_info) 
            link = download_info['link']
            self.statusbar.showMessage(str(link))

        except :
            selected_row_return = None

        return selected_row_return 

    def checkSelectedRow(self):
        try:
            item = self.download_table.selectedItems()
            selected_row_return = self.download_table.row(item[1]) 
        except :
            selected_row_return = None

        if selected_row_return != None :
            status = self.download_table.item(selected_row_return , 1).text() 
            if status == "scheduled":
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.stopAction.setEnabled(True)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
            elif status == "stopped" or status == "error" :
                self.stopAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.resumeAction.setEnabled(True)
                self.removeAction.setEnabled(True)
                self.propertiesAction.setEnabled(True)
                self.progressAction.setEnabled(False)
            elif status == "downloading":
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(True)
                self.stopAction.setEnabled(True)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
            elif status == "waiting": 
                self.stopAction.setEnabled(False)
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
            elif status == "complete":
                self.stopAction.setEnabled(False)
                self.resumeAction.setEnabled(False)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(True)
                self.propertiesAction.setEnabled(True)
                self.progressAction.setEnabled(False)
            elif status == "paused":
                self.stopAction.setEnabled(True)
                self.resumeAction.setEnabled(True)
                self.pauseAction.setEnabled(False)
                self.removeAction.setEnabled(False)
                self.propertiesAction.setEnabled(False)
                self.progressAction.setEnabled(True)
                
 
            else:
                self.resumeAction.setEnabled(True)
                self.stopAction.setEnabled(True)
                self.pauseAction.setEnabled(True)
                self.propertiesAction.setEnabled(True)
        else:
            self.resumeAction.setEnabled(True)
            self.stopAction.setEnabled(True)
            self.pauseAction.setEnabled(True)
            self.removeAction.setEnabled(True)
            self.propertiesAction.setEnabled(True)

           
    def checkFlashgot(self):
        sleep(0.5)
        flashgot_file = Open("/tmp/persepolis-flashgot")
        flashgot_line = flashgot_file.readlines()
        flashgot_file.close()
        flashgot_file.remove()
        flashgot_add_link_dictionary_str = flashgot_line[0]
        flashgot_add_link_dictionary = ast.literal_eval(flashgot_add_link_dictionary_str) 
        self.flashgotAddLink(flashgot_add_link_dictionary)


    def flashgotAddLink(self,flashgot_add_link_dictionary):
        addlinkwindow = AddLinkWindow(self.callBack , flashgot_add_link_dictionary)
        self.addlinkwindows_list.append(addlinkwindow)
        self.addlinkwindows_list[len(self.addlinkwindows_list) - 1].show()

       
            



    def addLinkButtonPressed(self ,button):
        addlinkwindow = AddLinkWindow(self.callBack)
        self.addlinkwindows_list.append(addlinkwindow)
        self.addlinkwindows_list[len(self.addlinkwindows_list) - 1].show()

    def callBack(self , add_link_dictionary):
        gid = self.gidGenerator()

        download_info_file_list = ['***','waiting','***','***','***','***','***','***',gid , str(add_link_dictionary)]
        download_info_file = config_folder + "/download_info/" + gid
        os.system("touch " + download_info_file )
        f = Open(download_info_file , "w")
        for i in range(10):
            f.writelines(download_info_file_list[i] + "\n")

        f.close()
        
        self.download_table.insertRow(0)
        j = 0
        for i in download_info_file_list :
            item = QTableWidgetItem(i)
            self.download_table.setItem(0,j,item)
            j = j + 1

        f = Open (download_list_file , "a")
        f.writelines(gid + "\n")
        f.close()


        f = Open (download_list_file_active , "a")
        f.writelines(gid + "\n")
        f.close()
        new_download = DownloadLink(gid)
        self.threadPool.append(new_download)
        self.threadPool[len(self.threadPool) - 1].start()
        self.progressBarOpen(gid) 
        if add_link_dictionary['start_hour'] == None :
            message = "Download Starts"
        else:
            message = "Download Scheduled"
        notifySend(message ,'' , 10000 , 'no')

 

        
    def resumeButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            download_status = self.download_table.item(selected_row_return , 1).text()
 
                
            if download_status == "paused" :
                answer = download.downloadUnpause(gid)
                if answer == 'None':
                    notifySend("Aria2 did not respond!","Try agian!",10000,'warning' )



            else:
                new_download = DownloadLink(gid)
                self.threadPool.append(new_download)
                self.threadPool[len(self.threadPool) - 1].start()
                sleep(1)
                self.progressBarOpen(gid)



        else:
            self.statusbar.showMessage("Please select an item first!")


    def stopButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            answer = download.downloadStop(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!","Try agian!" , 10000 , 'critical' )



           
               
        else:
            self.statusbar.showMessage("Please select an item first!")

    def pauseButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            answer = download.downloadPause(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' )

        else:
            self.statusbar.showMessage("Please select an item first!")
        sleep(1)

    def removeButtonPressed(self,button):
        self.removeAction.setEnabled(False)
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            try:
                file_name = self.download_table.item(selected_row_return , 0).text()
            except:
                file_name = None 
            sleep(0.5)
            self.download_table.removeRow(selected_row_return)

#remove gid of download from download list file
            f = Open(download_list_file)
            download_list_file_lines = f.readlines()
            f.close()
            f = Open(download_list_file , "w")
            for i in download_list_file_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove gid of download from active download list file
            f = Open(download_list_file_active)
            download_list_file_active_lines = f.readlines()
            f.close()
            f = Open(download_list_file_active , "w")
            for i in download_list_file_active_lines:
                if i.strip() != gid:
                    f.writelines(i.strip() + "\n")
            f.close()
#remove download_info_file
            download_info_file = download_info_folder + "/" + gid
            f = Open(download_info_file)
            f.close()
            f.remove()
#remove file of download form download temp folder
            if file_name != None :
                file_name_path = temp_download_folder + "/" +  str(file_name)
                os.system('rm "' + str(file_name_path) +'"')
                file_name_aria = file_name_path + str('.aria2')
                os.system('rm "' + str(file_name_aria) +'"')
        else:
            self.statusbar.showMessage("Please select an item first!")
        self.selectedRow()

    def propertiesButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None :
            add_link_dictionary_str = self.download_table.item(selected_row_return , 9).text() 
            add_link_dictionary = ast.literal_eval(add_link_dictionary_str) 
            gid = self.download_table.item(selected_row_return , 8 ).text()
            propertieswindow = PropertiesWindow(self.propertiesCallback ,gid)
            self.propertieswindows_list.append(propertieswindow)
            self.propertieswindows_list[len(self.propertieswindows_list) - 1].show()

    def propertiesCallback(self,add_link_dictionary , gid ):
        download_info_file = download_info_folder + "/" + gid
        f = Open(download_info_file)
        download_info_file_lines = f.readlines()
        f.close()
        f = Open(download_info_file , "w")
        for i in range(10):
            if i == 9 :
                f.writelines(str(add_link_dictionary) + "\n")
            else:
                f.writelines(download_info_file_lines[i].strip() + "\n")

        f.close()
            
    def progressButtonPressed(self,button):
        selected_row_return = self.selectedRow()
        if selected_row_return != None:
            gid = self.download_table.item(selected_row_return , 8 ).text()
            member_number = self.progress_window_list_dict[gid]
            if self.progress_window_list[member_number].isVisible() == False:
                self.progress_window_list[member_number].show()
            else :
                self.progress_window_list[member_number].hide()

    def progressBarOpen(self,gid):
            progress_window = ProgressWindow(gid)
            self.progress_window_list.append(progress_window)
            member_number = len(self.progress_window_list) - 1
            self.progress_window_list_dict[gid] = member_number 
            self.progress_window_list[member_number].show()
 

#close event
    def closeEvent(self, event):
        self.hide()
        self.system_tray_icon.hide()
        download.shutDown()
        sleep(0.5)
        global shutdown_notification
        shutdown_notification = 1
        while shutdown_notification != 2:
            sleep (0.1)

        QCoreApplication.instance().closeAllWindows()
        for qthread in self.threadPool :
            try:
                qthread.exit(0)
                sleep(0.1)
                answer = qthread.isRunning()
                print(answer)
            except:
                print("not quit")


        QCoreApplication.instance().quit
        print("Persepolis Closed")

    def systemTrayPressed(self,click):
        if click == 3 :
            self.minMaxTray(click)
            

    def minMaxTray(self,menu):
        if self.isVisible() == False:
            self.minimizeAction.setText('Minimize to system tray')
            self.minimizeAction.setIcon(QIcon(icons + 'minimize'))
            self.show()

        else :
            self.hide()
            self.minimizeAction.setText('Show main Window')
            self.minimizeAction.setIcon(QIcon(icons + 'window'))

    def stopAllDownloads(self,menu):
        active_gids = []
        for i in range(self.download_table.rowCount()):
            try:
                row_status = self.download_table.item(i , 1).text()
                if row_status == 'downloading' or row_status == 'paused' or row_status == 'waiting':
                    row_gid = self.download_table.item(i , 8).text()
                    active_gids.append(row_gid)
            except :
                pass
        for gid in active_gids:
            answer = download.downloadStop(gid)
            if answer == 'None':
                notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' )


            sleep(0.3)

           

    def pauseAllDownloads(self,menu):
#get active gid of downloads from aria
        active_gids = download.activeDownloads()
#check that if gid is in download_list_file_active
        f = Open(download_list_file_active)
        download_list_file_active_lines = f.readlines()
        f.close()
        for i in range(len(download_list_file_active_lines)):
            download_list_file_active_lines[i] = download_list_file_active_lines[i].strip()

        for gid in active_gids :
            if gid in download_list_file_active_lines :
                answer = download.downloadPause(gid)
                if answer == 'None':
                    notifySend("Aria2 did not respond!" , "Try agian!" , 10000 , 'critical' )

                sleep(0.3)
            

    def openPreferences(self,menu):
        self.preferenceswindow = PreferencesWindow()
        self.preferenceswindow.show()


    def openAbout(self,menu):
        self.about_window = AboutWindow()
        self.about_window.show()
コード例 #14
0
class Window(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setupUi(self)

        # -------setupUi------------
        self.originImgFigure = ImgFigure()
        self.enhancedImgFigure = ImgFigure()

        self.originImgLayout = QHBoxLayout(self.originBox)
        self.enhancedImgLayout = QHBoxLayout(self.enhancedBox)
        self.originImgLayout.addWidget(self.originImgFigure)
        self.enhancedImgLayout.addWidget(self.enhancedImgFigure)

        self.statusBar.showMessage("请选择文件")
        self.progressBar = QProgressBar()
        self.statusBar.addPermanentWidget(self.progressBar)
        # self.progressBar.setVisible(False)

        self.showProgressBarAct.triggered['bool'].connect(
            self.progressBar.setVisible)

        self.showToolBarAct.setChecked(True)
        self.showProgressBarAct.setChecked(True)
        # -------setupUi------------

        self.alpha = 1
        self.gamma = 0.7
        self.weigh = 1

        self.settingWindow = SettingWindow()
        self.settingWindow.changeParameterSignal.connect(self.changeParameter)

        self._illuMapWindowFlag = False

        with open("./resource/config/.history", 'r') as fp:
            self.action1 = self.recentOpenMenu.addAction(fp.readline())
            self.action1.triggered.connect(
                lambda: self.openImage(self.action1.text()))
            self.action2 = self.recentOpenMenu.addAction(fp.readline())
            self.action2.triggered.connect(
                lambda: self.openImage(self.action2.text()))
            self.action3 = self.recentOpenMenu.addAction(fp.readline())
            self.action3.triggered.connect(
                lambda: self.openImage(self.action3.text()))

    @pyqtSlot()
    def on_openAct_triggered(self):
        # imgPath = "./data/13.jpg"
        imgPath = QFileDialog.getOpenFileName(self, "请选择图片", "/",
                                              "All Files (*)")[0]
        self.openImage(imgPath)

    def openImage(self, imgPath):
        self.imgPath = imgPath.strip()
        if imgPath != '':
            self.originImg = imread(self.imgPath)
            self.originImgFigure.axes.imshow(self.originImg)
            self.originImgFigure.draw()
            self.statusBar.showMessage("当前图片路径: " + self.imgPath)

            self.historyFile()
            self.progressBar.setValue(0)
            self.enhanceAct.setEnabled(True)
        else:
            QMessageBox.warning(self, "提示", "请重新选择图片")

    def historyFile(self):
        with open("./resource/config/.history", 'r+') as fp:
            history = fp.readlines()
            history = self.imgPath + '\n' + history[0] + history[1]
            fp.seek(0, 0)
            fp.truncate()
            fp.write(history)

    def changeParameter(self, alpha, gamma, weigh):
        self.alpha = alpha
        self.gamma = gamma
        self.weigh = weigh

    @pyqtSlot()
    def on_enhanceAct_triggered(self):
        self.progressBar.setValue(0)
        # self.progressBar.setVisible(True)
        self.workThread = WorkThread(self.imgPath, self.progressBar,
                                     self.alpha, self.gamma)
        self.workThread.start()
        self.workThread.finishSignal.connect(self.on_workThread_finishSignal)

    def on_workThread_finishSignal(self, T, R):
        self.T = T
        self.R = R
        self.statusBar.showMessage("当前图片路径: " + self.imgPath + "   图像增强成功")
        # self.imgFigure.T_axes.imshow(self.T, )
        self.enhancedImgFigure.axes.imshow(self.R)

        self.progressBar.setValue(self.progressBar.maximum())
        # self.progressBar.setVisible(False)

        self.enhancedImgFigure.draw()
        self.saveAct.setEnabled(True)
        self.saveAsAct.setEnabled(True)
        self.saveIlluMapAct.setEnabled(True)
        self.denoiseAct.setEnabled(True)
        self.illuMapAct.setEnabled(True)

    @pyqtSlot()
    def on_saveAsAct_triggered(self):
        savePath = QFileDialog.getSaveFileName(
            self, "请选择保存位置", "/", "BMP格式 (*.bmp);;JPG格式 (*.jpg)")[0]
        if savePath != '':
            imsave(savePath, self.R)
            QMessageBox.about(self, "提示", "保存成功")
        else:
            QMessageBox.warning(self, "提示", "请重新选择保存位置")

    @pyqtSlot()
    def on_saveAct_triggered(self):
        savePath = self.imgPath
        imsave(savePath, self.R)
        QMessageBox.about(self, "提示", "保存成功")

    @pyqtSlot()
    def on_clearAct_triggered(self):
        self.originImgFigure.axes.cla()
        self.originImgFigure.draw()
        self.enhancedImgFigure.axes.cla()
        self.enhancedImgFigure.draw()

        self.enhanceAct.setEnabled(False)
        self.saveIlluMapAct.setEnabled(False)
        self.saveAsAct.setEnabled(False)
        self.saveAct.setEnabled(False)
        self.denoiseAct.setEnabled(False)

    @pyqtSlot()
    def on_quitAct_triggered(self):
        qApp.quit()

    @pyqtSlot()
    def on_denoiseAct_triggered(self):
        self.R = restoration.denoise_tv_bregman(self.R, self.weigh)
        self.enhancedImgFigure.axes.imshow(self.R)
        self.enhancedImgFigure.draw()
        QMessageBox.about(self, "提示", "去噪成功")

    @pyqtSlot()
    def on_saveIlluMapAct_triggered(self):
        savePath = QFileDialog.getSaveFileName(
            self, "请选择保存位置", "/", "BMP格式 (*.bmp);;JPG格式 (*.jpg)")[0]
        if savePath != '':
            if self._illuMapWindowFlag == True:
                color = self.illuMapWindow.colorComboBox.currentText()
                color = self.illuMapWindow.colorMap[color]
                imsave(savePath, self.T, cmap=get_cmap(color))
            else:
                imsave(savePath, self.T, cmap=get_cmap('OrRd_r'))
            QMessageBox.about(self, "提示", "保存成功")
        else:
            QMessageBox.warning(self, "提示", "请重新选择保存位置")

        # -------------其他界面-------------

    @pyqtSlot()
    def on_aboutAct_triggered(self):
        self.aboutWindow = AboutWindow()
        self.aboutWindow.show()

    @pyqtSlot()
    def on_illuMapAct_triggered(self):
        self.illuMapWindow = IlluMapWindow()
        self._illuMapWindowFlag = True
        self.illuMapWindow.saveIlluMapBtn.clicked.connect(
            self.on_saveIlluMapAct_triggered)
        self.illuMapWindow.confirmBtn.clicked.connect(
            self.on_confirmBtn_triggered)
        self.illuMapWindow.figure.axes.imshow(self.T, cmap=get_cmap('OrRd_r'))
        self.illuMapWindow.figure.draw()
        self.illuMapWindow.show()

    def on_confirmBtn_triggered(self):
        color = self.illuMapWindow.colorComboBox.currentText()
        color = self.illuMapWindow.colorMap[color]
        self.illuMapWindow.figure.axes.imshow(self.T, cmap=get_cmap(color))
        self.illuMapWindow.figure.draw()

    @pyqtSlot()
    def on_settingAct_triggered(self):
        self.settingWindow.smoothnessSlider.setValue(
            int(401 - 100 * self.alpha))
        self.settingWindow.brightnessSlider.setValue(int(100 * self.gamma))
        self.settingWindow.denosieSlider.setValue(int(100 * self.weigh))
        self.settingWindow.show()
コード例 #15
0
 def aboutWindowInit(self):
     self.aboutWindow = AboutWindow()