예제 #1
0
class FileSystemView(QWidget):
    def __init__(self, dir_path):
        super().__init__()

        appWidth = 800
        appHeight = 300

        self.setWindowTitle('File System Viewer')
        self.setGeometry(300, 300, appWidth, appHeight)

        self.model = QFileSystemModel()
        self.model.setRootPath(dir_path)

        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(dirPath))
        self.tree.setColumnWidth(200, 250)
        self.tree.setAlternatingRowColors(True)

        layout = QVBoxLayout()
        layout.addWidget(self.tree)
        btnSelect = QPushButton("SELECT")
        layout.addWidget(btnSelect)

        self.setLayout(layout)
예제 #2
0
    def init_ui(self):
        layout = QHBoxLayout()
        secondlayout = QVBoxLayout()

        templist = QTextEdit()

        maillist = QTreeView()
        maillist.setRootIsDecorated(False)
        maillist.setAlternatingRowColors(True)

        model = self.create_mail_model()
        maillist.setModel(model)
        self.add_mail(model, '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM')
        self.add_mail(model, '*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM')
        self.add_mail(model, '*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM')

        tempview = QTextEdit()

        secondlayout.addWidget(maillist)
        secondlayout.addWidget(tempview)
        layout.addWidget(templist)
        layout.addLayout(secondlayout)

        self.setLayout(layout)
        self.show()
예제 #3
0
def set_tree_view(view: QTreeView):
    view.setRootIsDecorated(False)
    view.setAlternatingRowColors(True)
    view.setSortingEnabled(True)
    view.sortByColumn(1, Qt.AscendingOrder)
    view.setContextMenuPolicy(Qt.CustomContextMenu)
    view.setSelectionMode(QAbstractItemView.ExtendedSelection)
예제 #4
0
class MethodErrorListWidget():
    def __init__(self):
        self.groupDataTypes = QGroupBox('')
        self.treeView = QTreeView()
        self.treeView.setRootIsDecorated(False)
        self.treeView.setAlternatingRowColors(True)
        dataLayout = QHBoxLayout()
        dataLayout.addWidget(self.treeView)
        self.groupDataTypes.setLayout(dataLayout)
        self.model = None
        self.clear()
        pass

    def add(self, name, error_number, xml_node=None):

        item = QStandardItem(error_number)
        self.model.appendRow([item, QStandardItem(name)])
        if xml_node != None:
            #print(xml_node)
            item.setData(xml_node, Qt.UserRole + 1)
            pass
        return item

    def clear(self):
        #self.model.clear()
        #self.model.setHeaderData(0, Qt.Horizontal, "POSSIBLE-ERROR-REFS")
        if self.model != None:
            self.model.clear()
        self.model = QStandardItemModel(0, 2, None)
        self.model.setHeaderData(0, Qt.Horizontal, "Error Code")
        self.model.setHeaderData(1, Qt.Horizontal, "POSSIBLE-ERROR-REFS")
        self.treeView.setModel(self.model)
        #self.treeView.setColumnWidth(0, 350)
        pass
예제 #5
0
class App(QWidget):

    FROM, SUBJECT, DATE = range(3)

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 Treeview Example - pythonspot.com'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 240
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.dataGroupBox = QGroupBox('Inbox')
        # data view
        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)

        # data layout 水平
        dataLayout = QHBoxLayout()
        # 添加 data view
        dataLayout.addWidget(self.dataView)
        self.dataGroupBox.setLayout(dataLayout)

        # 创建 model
        model = self.createMailModel(self)
        # 为 data view 设置 model
        self.dataView.setModel(model)
        # 向 model 中插入数据
        self.addMail(model, '*****@*****.**', 'Your Github Donation',
                     '03/25/2017 02:05 PM')
        self.addMail(model, '*****@*****.**', 'Github Projects',
                     '02/02/2017 03:05 PM')
        self.addMail(model, '*****@*****.**', 'Your Phone Bill',
                     '01/01/2017 04:05 PM')

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.dataGroupBox)
        self.setLayout(mainLayout)

        self.show()

    def createMailModel(self, parent):
        model = QStandardItemModel(0, 3, parent)
        model.setHeaderData(self.FROM, Qt.Horizontal, 'From')
        model.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject")
        model.setHeaderData(self.DATE, Qt.Horizontal, "Date")
        return model

    def addMail(self, model, mailFrom, subject, date):
        model.insertRow(0)
        model.setData(model.index(0, self.FROM), mailFrom)
        model.setData(model.index(0, self.SUBJECT), subject)
        model.setData(model.index(0, self.DATE), date)
    def __init__(self):
        QWidget.__init__(self, flags=Qt.Widget)
        self.setWindowTitle("ItemView QTreeView")
        self.setFixedWidth(310)
        self.setFixedHeight(200)

        data = [{
            "name":
            "Mouse Action",
            "icon":
            "assets/mouse.png",
            "objects": [
                {
                    "name": "Click",
                    "icon": "assets/network.png",
                    "objects": None
                },
                {
                    "name": "Double Click",
                    "icon": "assets/mail.png",
                    "objects": None
                },
            ]
        }, {
            "name":
            "Keyboard",
            "icon":
            "assets/keyboard.png",
            "objects": [
                {
                    "name": "Send Hotkey",
                    "icon": "assets/earth.png",
                    "objects": None
                },
                {
                    "name": "Type",
                    "icon": "assets/folder.png",
                    "objects": None
                },
            ]
        }]

        self.layout = QBoxLayout(QBoxLayout.LeftToRight, self)
        self.setLayout(self.layout)

        # QTreeView 생성 및 설정
        view = QTreeView(self)
        # QTreeView 스타일시트 설정
        view.setStyleSheet(open("./ItemViews_QTreeView_03_style.css").read())
        view.setAlternatingRowColors(True)  # 라인별 교차색
        self.model = Model(data)
        view.setModel(self.model)
        self.layout.addWidget(view)

        # 그림을 띄울 QLabel 생성
        self.lb = QLabel()
        self.lb.setFixedSize(50, 50)
        self.layout.addWidget(self.lb)
예제 #7
0
class FileListWidget(QGroupBox):

    FILENAME, PATH = range(2)

    def __init__(self, title="Files"):
        super(QGroupBox, self).__init__(title)

        self.layout = QVBoxLayout(self)

        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)
        self.layout.addWidget(self.dataView)

        model = self.create_file_list_model(self)
        self.dataView.setModel(model)

        self.data_dir = None
        self.loaded_directory_label = QLabel(
            "Click 'Open' to select a directory.", self)
        self.layout.addWidget(self.loaded_directory_label)

        self.btnOpen = QPushButton("Open", self)
        self.btnOpen.clicked.connect(self.load_data_directory)
        self.layout.addWidget(self.btnOpen)

        self.setLayout(self.layout)

    def load_data_directory(self):
        d = QFileDialog.getExistingDirectory(self, "Select Directory")
        self.data_dir = d
        self.loaded_directory_label.setText(self.data_dir)

        # Load all encountered files
        files = []
        allowed_extensions = ["jpg", "jpeg", "png"]
        for ext in allowed_extensions:
            files.extend(glob.glob(os.path.join(d, "*." + ext)))

        # Add them all into the file list.
        for file in files:
            self.add_file_entry(self.dataView.model(), file)

        return d

    def create_file_list_model(self, parent):
        model = QStandardItemModel(0, 2, parent)
        model.setHeaderData(self.FILENAME, Qt.Horizontal, "Filename")
        model.setHeaderData(self.PATH, Qt.Horizontal, "Path")
        return model

    def add_file_entry(self, model, path):
        filename = os.path.basename(path)
        model.insertRow(0)
        model.setData(model.index(0, self.FILENAME), filename)
        model.setData(model.index(0, self.PATH), path)
예제 #8
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.items = [
            '呵呵', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff', 'g', 'h', 'i', 'j', 'k',
            'l', 'm', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't'
        ]
        self.init()
        self.addDock()

    def init(self):
        self.text = QTextEdit('主窗口')
        self.text.setAlignment(Qt.AlignCenter)
        # self.setCentralWidget(self.text)

        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)

        self.setCentralWidget(self.dataView)

        model = self.create_model(self, ['from', 'sub', 'date'])
        self.dataView.setModel(model)
        self.add_data(model, [
            '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM'
        ])
        self.setGeometry(200, 200, 800, 400)
        self.setWindowTitle('QDockWidget示例')
        self.show()

    def onDockListIndexChanged(self, index):
        item = self.items[index]
        self.text.setText(item)

    def addDock(self):
        dock1 = QDockWidget('DockWidget')
        dock1.setFeatures(QDockWidget.DockWidgetFloatable)
        dock1.setAllowedAreas(Qt.LeftDockWidgetArea)
        listwidget = QListWidget()

        listwidget.addItems(self.items)
        listwidget.currentRowChanged.connect(self.onDockListIndexChanged)
        dock1.setWidget(listwidget)
        self.addDockWidget(Qt.LeftDockWidgetArea, dock1)

    def create_model(self, parent, columns=['column1']):
        model = QStandardItemModel(0, len(columns), parent)
        for k, v in enumerate(columns):
            model.setHeaderData(k, Qt.Horizontal, v)
        return model

    def add_data(self, model, data):
        model.insertRow(0)
        for k, v in enumerate(data):
            model.setData(model.index(0, k), v)
예제 #9
0
class RouteTable(QWidget):
    NO1, FROM, NO2, TO, CLUSTER = range(5)

    def __init__(self):
        super().__init__()
        # Main layout
        main_layout = QVBoxLayout()

        # Sub layout
        self.cluster_combobox = QComboBox()
        self.table_container = QGroupBox("Result")

        # Route Table
        self.table = QTreeView()
        self.table.setRootIsDecorated(False)
        self.table.setAlternatingRowColors(True)

        self.model = QStandardItemModel(0, 5, self)
        self.model.setHeaderData(self.NO1, Qt.Horizontal, "No")
        self.model.setHeaderData(self.FROM, Qt.Horizontal, "From")
        self.model.setHeaderData(self.NO2, Qt.Horizontal, "No")
        self.model.setHeaderData(self.TO, Qt.Horizontal, "To")
        self.model.setHeaderData(self.CLUSTER, Qt.Horizontal, "Cluster number")

        self.table.setModel(self.model)
        table_header = self.table.header()
        table_header.resizeSection(0, 25)
        table_header.resizeSection(1, 190)
        table_header.resizeSection(2, 25)
        table_header.resizeSection(3, 190)

        table_container_layout = QHBoxLayout()
        table_container_layout.addWidget(self.table)
        self.table_container.setLayout(table_container_layout)

        # Add to main layout
        main_layout.addWidget(self.cluster_combobox)
        main_layout.addWidget(self.table_container)
        self.setLayout(main_layout)

    def addRoute(self, model, from_no, from_route, to_no, to_route,
                 cluster_number):
        root = self.table.model()
        n = root.rowCount()
        model.insertRow(n)
        model.setData(model.index(n, self.NO1), from_no)
        model.setData(model.index(n, self.FROM), from_route)
        model.setData(model.index(n, self.NO2), to_no)
        model.setData(model.index(n, self.TO), to_route)
        model.setData(model.index(n, self.CLUSTER), cluster_number)

    def clearAllRoute(self):
        root = self.table.model()
        root.removeRows(0, root.rowCount())
예제 #10
0
class App(QWidget):
    FROM, SUBJECT, DATE, TEST = range(4)

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 Treeview Example - pythonspot.com'
        self.left = 200
        self.top = 200
        self.width = 640
        self.height = 240
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.dataGroupBox = QGroupBox("Inbox")
        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)
        #self.setEditTriggers(QAbstractItemView.NoEditTriggers)
        dataLayout = QHBoxLayout()
        dataLayout.addWidget(self.dataView)
        self.dataGroupBox.setLayout(dataLayout)

        model = self.createModel(self)
        self.dataView.setModel(model)

        self.addItem(model, '*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM', "test1")
        self.addItem(model, '*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM', "test222")
        self.addItem(model, '*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM', "test3")

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.dataGroupBox)
        self.setLayout(mainLayout)

        self.show()

    """def createModel(self, parent):
        model = QStandardItemModel(0, 4, parent)
        model.setHeaderData(self.FROM, Qt.Horizontal, "From")
        model.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject")
        model.setHeaderData(self.DATE, Qt.Horizontal, "Date")
        model.setHeaderData(self.TEST, Qt.Horizontal, "Test")

        return model"""

    def addItem(self, model, mailFrom, subject, date, test):
        model.insertRow(0)
        model.setData(model.index(0, self.FROM), mailFrom)
        model.setData(model.index(0, self.SUBJECT), subject)
        model.setData(model.index(0, self.DATE), date)
        model.setData(model.index(0, self.TEST), test)
예제 #11
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self._skip_next_hide = False

        self.setStyleSheet("""QPushButton {
                              text-decoration:underline;
                              border: none;}""")

        view = QTreeView()
        view.setUniformRowHeights(True)
        view.setAlternatingRowColors(True)
        view.setHeaderHidden(True)
        view.viewport().installEventFilter(self)
        self.setView(view)
예제 #12
0
    def __init__(self, *args):
        super().__init__(*args)

        self.__skip_next_hide = False

        tree_view = QTreeView(self)
        tree_view.setFrameShape(QFrame.NoFrame)
        tree_view.setEditTriggers(tree_view.NoEditTriggers)
        tree_view.setAlternatingRowColors(True)
        tree_view.setSelectionBehavior(tree_view.SelectRows)
        tree_view.setWordWrap(True)
        tree_view.setAllColumnsShowFocus(True)
        tree_view.setHeaderHidden(True)
        self.setView(tree_view)
        self.view().viewport().installEventFilter(self)
예제 #13
0
    def __init__(self, parent=None):
        super(TreeComboBox, self).__init__(parent)

        self.__skip_next_hide = False
        self._last_pick = None

        tree_view = QTreeView(self)
        tree_view.setFrameShape(QFrame.NoFrame)
        tree_view.setEditTriggers(tree_view.NoEditTriggers)
        tree_view.setAlternatingRowColors(True)
        tree_view.setSelectionBehavior(tree_view.SelectRows)
        tree_view.setWordWrap(True)
        tree_view.setAllColumnsShowFocus(True)
        self.setView(tree_view)

        self.view().viewport().installEventFilter(self)
예제 #14
0
class FileBrowser(QWidget):
    def __init__(self, dirPath):
        super(FileBrowser, self).__init__()
        appWidth = 800
        appHeight = 800
        self.setWindowTitle('File Browser')
        self.setGeometry(300, 300, appWidth, appHeight)
        self.model = QFileSystemModel()
        self.model.setRootPath(dirPath)
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(dirPath))
        self.tree.setColumnWidth(0, 250)
        self.tree.setAlternatingRowColors(True)
        layout = QVBoxLayout()
        layout.addWidget(self.tree)
        self.setLayout(layout)
예제 #15
0
class FileSystemView(QWidget):
    def __init__(self, dir_path):
        super().__init__()
        self.setWindowTitle("Todos los archivos")
        self.setGeometry(300, 300, 800, 300)

        self.model = QFileSystemModel()
        self.model.setRootPath(dir_path)
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(dir_path))
        self.tree.setColumnWidth(300, 300)
        self.tree.setAlternatingRowColors(True)

        layout = QVBoxLayout()
        layout.addWidget(self.tree)

        self.setLayout(layout)
예제 #16
0
class MetadataList(QWidget):

    def __init__(self, parent=None):
        super().__init__(parent)
        self._parent = parent
        #self.resize(100, 100)

        #sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        #sizePolicy.setHorizontalStretch(2)
        #sizePolicy.setVerticalStretch(0)
        #sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        #self.setSizePolicy(sizePolicy)

        self.mdataview = QTreeView()
        self.mdataview.setHeaderHidden(True)
        self.mdataview.setSortingEnabled(True)
        self.mdataview.setAlternatingRowColors(True)
        self.mdataview.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.mdataview.sortByColumn(0, Qt.AscendingOrder)  # Qt.DescendingOrder
        model = QStandardItemModel(0, 2)
        self.mdataview.setModel(model)

        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.mdataview)
        self.setLayout(layout)
        self.setVisible(True)         

    def setupDataMapper(self, treeview):
        self._dataMapper = treeview.dataMapper
        self._dataMapper.setItemDelegate(MetadataDelegate(self)) # self._parent.parent().parent().db
        self._dataMapper.addMapping(self.mdataview, 1)
        treeview.selectionModel().currentChanged.connect(self.setSelection)

    def setSelection(self, current):
        parent = current.parent()
        self._dataMapper.setRootIndex(parent)
        self._dataMapper.setCurrentModelIndex(current) 

    def clearData(self, layout=None):
        # NOT IMPLEMENTED----------------------------------------------
        if hasattr(self, "_dataMapper"):
            self._dataMapper.clearMapping()
예제 #17
0
class FileView(QWidget):
    def __init__(self, dir_path):
        super().__init__()
        # Setup Window
        self.setFixedSize(700, 300)
        self.setWindowTitle('File Viewer')
        self.setGeometry(640, 360, 700, 300)
        self.model = QFileSystemModel()
        self.model.setRootPath(dir_path)
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(dirPath))
        self.tree.setColumnWidth(0, 250)
        self.tree.setAlternatingRowColors(True)

        # Layout
        layout = QVBoxLayout()
        layout.addWidget(self.tree)
        self.setLayout(layout)
예제 #18
0
class HistoryWidget(QWidget):
    def __init__(self, parent=None):
        super(HistoryWidget, self).__init__(parent=parent)
        self.historyView = QTreeView(self)
        self.proxyModel = HistorySortModel(self)
        self.sourceModel = QStandardItemModel()
        self.initUI()

    def initUI(self):
        self.historyView.setRootIsDecorated(False)
        self.historyView.setAlternatingRowColors(True)
        self.historyView.setModel(self.proxyModel)
        self.historyView.setSortingEnabled(True)
        self.historyView.sortByColumn(1, Qt.AscendingOrder)

        self.historyView.setFixedWidth(750)

        self.sourceModel = QStandardItemModel(0, 6, self)
        self.sourceModel.setHeaderData(0, Qt.Horizontal, "Model Name")
        self.sourceModel.setHeaderData(1, Qt.Horizontal, "Algorithm")
        self.sourceModel.setHeaderData(2, Qt.Horizontal, "Score")
        self.sourceModel.setHeaderData(3, Qt.Horizontal, "TrainSet")
        self.sourceModel.setHeaderData(4, Qt.Horizontal, "Running Time")
        self.sourceModel.setHeaderData(5, Qt.Horizontal, "Param")
        self.proxyModel.setSourceModel(self.sourceModel)
        self.historyView.setModel(self.sourceModel)

    def addItem(self, result: modelResult):
        self.sourceModel.insertRow(self.sourceModel.rowCount())

        self.sourceModel.setData(self.sourceModel.index(0, 0),
                                 result.modelName)  # string
        self.sourceModel.setData(self.sourceModel.index(0, 1),
                                 result.algorithm)  # string
        self.sourceModel.setData(self.sourceModel.index(0, 2),
                                 result.score)  # float
        self.sourceModel.setData(self.sourceModel.index(0, 3),
                                 result.trainSet)  # string
        self.sourceModel.setData(self.sourceModel.index(0, 4),
                                 result.runTime)  # second
        self.sourceModel.setData(self.sourceModel.index(0, 5),
                                 result.param)  # dict
예제 #19
0
    def _init_ui(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        group_box = QGroupBox('Inbox');
        data_view = QTreeView()
        data_view.setRootIsDecorated(False)
        data_view.setAlternatingRowColors(True)
        data_layout = QHBoxLayout()
        data_layout.addWidget(data_view)
        group_box.setLayout(data_layout)

        model = self._create_mail_model(self)
        data_view.setModel(model)
        self._add_mail(model, '*****@*****.**', 'A subject', '01/01/2001')
        self._add_mail(model, '*****@*****.**', 'B subject', '02/02/2002')
        self._add_mail(model, '*****@*****.**', 'C subject', '03/03/2003')

        main_layout = QHBoxLayout()
        main_layout.addWidget(group_box)
        self.setLayout(main_layout)
예제 #20
0
class App(QWidget):

    FROM, SUBJECT, DATE = range(3)

    def __init__(self):
        super.__init__()
        self.title = 'Treeview Example'
        self.left = 10
        self.top = 30
        self.width = 640
        self.height = 240
        self.init_ui()

    def init_ui(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.dataGroupBox = QGroupBox("Inbox")
        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)
예제 #21
0
class CodeInspector(QWidget):
    def __init__(self, parent):
        QWidget.__init__(self, parent)

        self.parent = parent

        root_size = self.parent.size()
        w = root_size.width()
        #h = root_size.height()
        self.setMaximumWidth(250)

        hbox = QVBoxLayout(self)
        self.setLayout(hbox)

        scroll = QScrollArea(self)
        scroll.setAlignment(Qt.AlignLeft | Qt.AlignTop)
        scroll.setWidgetResizable(True)

        self.treeView = QTreeView(self)
        self.treeView.setAlternatingRowColors(True)
        model = self.createModel()
        self.treeView.setModel(model)

        toolbar = QToolBar(self)

        scroll.setWidget(self.treeView)
        hbox.addWidget(scroll)
        hbox.addWidget(toolbar)

        model.insertRow(0)
        model.setData(model.index(0, 0), 0)
        model.setData(model.index(0, 1), 'un icono')
        model.setData(model.index(0, 2), 'una definición')

    def createModel(self):
        model = QStandardItemModel(0, 3, self.treeView)
        model.setHeaderData(0, Qt.Horizontal, "id")
        model.setHeaderData(1, Qt.Horizontal, "icon")
        model.setHeaderData(2, Qt.Horizontal, "def")
        return model
예제 #22
0
class FileSystemView(QWidget):
    def __init__(self, dir_path):
        super().__init__()
        appWidth = 800
        appHeight = 300
        self.setWindowTitle('File System Viewer')
        self.setGeometry(300, 300, appWidth, appHeight)

        self.model = QFileSystemModel()
        self.model.setRootPath(dir_path)
        self.tree = QTreeView()
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(dirPath))
        self.tree.setColumnWidth(0, 250)
        self.tree.setAlternatingRowColors(True)

        layout = QVBoxLayout()
        self.photo = QLabel('Hola' + chr(10) + 'Caracola')
        layout.addWidget(self.tree)
        layout.addWidget(self.photo)
        self.setLayout(layout)
        self.tree.selectionModel().selectionChanged.connect(self.select)

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return:
            index = self.tree.selectedIndexes()[0]
            crawler = index.model().filePath(index)
            print(crawler)
        #self.tree.keyPressEvent(self, event)

    def select(self, index1):
        index = self.tree.selectedIndexes()[0]
        file_sel = index.model().filePath(index)
        if os.path.isfile(file_sel) and file_sel[-3:].upper() in 'JPG PNG':
            pixmap = QPixmap(file_sel)
            self.photo.setPixmap(pixmap)
            print(file_sel)
예제 #23
0
class FileSystemView(QWidget):
   def __init__(self, dir_path):
      super().__init__()

      #TITULO Y DIMENSIONES DE LA VENTANA.
      self.setWindowTitle('File System Viewer')
      self.setGeometry(300, 300, 800, 300)

      #DEFINIR DIRECTORIO.
      self.model = QFileSystemModel()
      self.model.setRootPath(dir_path)

      #GENERAR VISTA DE ARCHIVOS Y CARPETAS.
      self.tree = QTreeView()
      self.tree.setModel(self.model)
      self.tree.setRootIndex(self.model.index(dirPath))
      self.tree.setColumnWidth(200,250)
      self.tree.setAlternatingRowColors(True)

      #MOSTRAR VENTANA CON LAS VISTA.
      layout = QVBoxLayout()
      layout.addWidget(self.tree)

      self.setLayout(layout)
예제 #24
0
class Explorer(QDialog):
    def __init__(self,
                 parent,
                 window_title=_("Select resources"),
                 subtitle=_("Select files and/or folders to include")):
        super().__init__(parent)
        self.logger = logging.getLogger(__name__)
        self.setModal(True)
        self.setSizeGripEnabled(True)
        self.setWindowTitle(window_title)
        self.subtitle = subtitle
        self.file_set = set()
        self.config = Configuration()
        self.__init_ui__()
        self.filename_filter = FilenameFilter()
        #self.show()

    def __init_ui__(self):
        # layout
        vert = QVBoxLayout(self)
        vert.setContentsMargins(0, 0, 0, 0)

        resource_dir = self.config.cfg_resource_dir()

        p_top = QVBoxLayout()
        lb_subtitle = QLabel(self.subtitle)
        lb_subtitle.setContentsMargins(10, 10, 10, 0)
        p_top.addWidget(lb_subtitle)

        self.model = QFileSystemModel()
        self.model.setRootPath(resource_dir)

        self.view = QTreeView()
        self.view.setModel(self.model)
        self.view.setRootIndex(self.model.index(self.model.rootPath()))
        self.view.setAlternatingRowColors(True)
        self.view.setSelectionMode(QAbstractItemView.MultiSelection)
        self.view.selectionModel().selectionChanged.connect(
            self.selection_changed)
        self.view.collapsed.connect(self.item_collapsed)
        self.view.expanded.connect(self.item_expanded)
        p_top.addWidget(self.view)

        p_info = QHBoxLayout()
        lb_resource = QLabel(_("resource dir") + ": " + resource_dir)
        lb_resource.setContentsMargins(10, 0, 10, 0)

        self.lb_selection_count = QLabel(
            str(self.selected_file_count()) + " " + _("resources selected"))
        self.lb_selection_count.setContentsMargins(10, 0, 10, 0)

        p_info.addWidget(self.lb_selection_count)
        p_info.addStretch(1)
        p_info.addWidget(lb_resource)

        p_top.addLayout(p_info)

        p_bottom = QHBoxLayout()

        self.pb_deselect = QPushButton(_("Deselect all"))
        self.pb_deselect.clicked.connect(self.pb_deselect_clicked)
        self.pb_deselect.setEnabled(self.selected_file_count() > 0)
        p_bottom.addWidget(self.pb_deselect)

        p_bottom.addStretch(1)
        self.pb_ok = QPushButton(_("OK"))
        self.pb_ok.setAutoDefault(True)
        self.pb_ok.clicked.connect(self.accept)
        p_bottom.addWidget(self.pb_ok)

        pb_cancel = QPushButton(_("Cancel"))
        pb_cancel.clicked.connect(self.reject)
        p_bottom.addWidget(pb_cancel)

        vert.addLayout(p_top)
        vert.addLayout(p_bottom)

        self.setLayout(vert)
        self.resize(self.config.explorer_width(),
                    self.config.explorer_height())
        width = self.view.width() - 50
        self.view.setColumnWidth(0, width / 2)
        self.view.setColumnWidth(1, width / 6)
        self.view.setColumnWidth(2, width / 6)
        self.view.setColumnWidth(3, width / 6)

    def __persist__(self):
        # persist properties of the explorer
        self.config.set_explorer_width(self.width())
        self.config.set_explorer_height(self.height())
        self.config.persist()

    def __compute_filenames__(self, item_selection):
        # item_selection: a QItemSelection
        # return corresponding absolute filenames as a set, including filenames in underlying folders
        s = set()
        for index in item_selection.indexes():
            # we have an index for each column in the model
            if index.column() == 0:
                path = index.model().filePath(index)
                if os.path.isdir(path):
                    for root, directories, filenames in os.walk(path):
                        for filename in filenames:
                            if self.filename_filter.accept(filename):
                                s.add(os.path.join(root, filename))
                elif os.path.isfile(path):
                    s.add(path)
                else:
                    self.logger.warn("isUnknownThing", path)
        return s

    def showEvent(self, QShowEvent):
        #self.pb_ok.setFocus()
        pass

    def set_filename_filter(self, filename_filter):
        # set the FilenameFilter
        self.filename_filter = filename_filter

    def selected_file_count(self):
        return len(self.file_set)

    def selected_file_set(self):
        return frozenset(self.file_set)

    def selection_changed(self, selected, deselected):
        # selected, deselected: PyQt5.QtCore.QItemSelection
        selected_filenames = self.__compute_filenames__(selected)
        self.file_set.update(selected_filenames)
        deselected_filenames = self.__compute_filenames__(deselected)
        self.file_set.difference_update(deselected_filenames)

        self.pb_deselect.setEnabled(self.selected_file_count() > 0)
        self.lb_selection_count.setText(
            str(self.selected_file_count()) + " " + _("resources selected"))

    def item_expanded(self, index):
        # index: a QModelIndex
        # show all child items selected/deselected in accordance with state of parent folder
        pass

    def item_collapsed(self, index):
        pass

    def pb_deselect_clicked(self):
        self.view.selectionModel().clear()

    def hideEvent(self, QHideEvent):
        self.__persist__()
예제 #25
0
파일: main.py 프로젝트: JJL772/pycfscape
class PYCFScape(QMainWindow):
    def __init__(self):
        super().__init__()

        self.VPK = None
        self.VPKDir = ''
        self.ExportItems = []

        self.OptionsMenu = options.PYCFScapeOptionsWindow(app)

        self.Setup()

    def LoadVPK(self, file):
        print('Opening {}'.format(file))
        self.DirectoryModel.clear()
        self.ExportItems = []
        self.VPK = None

        try:
            self.VPK = vpk.open(file)
        except FileNotFoundError as E:
            self.ErrorBox(str(E), 'File Doesn\'t Exist.')
            return
        except ValueError as E:
            self.ErrorBox(str(E))
            return

        self.VPKDir = file

        self.HandleVPK(self.VPK)

    def ExportVPKFiles(self):
        print('Exporting files from {}'.format('VPK'))

        for Item in self.ExportItems:
            self.ExportFile(Item.PathInfo)

    def ExportFile(self, file):
        outputdir = self.OptionsMenu.Options['config']['path']
        if not os.path.isdir('{}{}'.format(outputdir, '/'.join(
                file.split('/')[:-1]))):
            print("path {} doesn't exist.".format(file))
            os.makedirs('{}{}'.format(outputdir,
                                      '/'.join(file.split('/')[:-1])))
        print(file)
        outFile = open('{}{}'.format(outputdir, file[1:]),
                       'wb')  #WB - Write, Bytes
        pakLines = self.VPK.get_file(file[1:]).read()
        outFile.write(pakLines)
        outFile.close()

    def OpenVPK(self):
        File = self.OpenDialog('Open VPK', 'Valve Pack Files (*.vpk)')
        if not File == '': self.LoadVPK(File)

    def Setup(self):
        #Winow Information & Such
        self.setWindowTitle('PYCFScape')
        self.setMinimumSize(QSize(750, 500))
        self.setWindowIcon(QIcon('./res/Icon64.ico'))

        #Setup Content Layout & Container
        self.Content = QGroupBox()
        self.ContentLayout = QGridLayout()

        #Setup UI Elements
        self.DirectoryList = QTreeView()
        self.DirectoryList.setAlternatingRowColors(True)

        self.ContentLayout.addWidget(self.DirectoryList, 0, 0)

        self.DirectoryModel = QStandardItemModel(self.DirectoryList)
        self.DirectoryList.setModel(self.DirectoryModel)

        #Setup Actions
        self.OpenAction = QAction('&Open...', self)
        self.OpenAction.setShortcut('Ctrl+O')
        self.OpenAction.setStatusTip('Open VPK')
        self.OpenAction.triggered.connect(self.OpenVPK)

        self.ExportAction = QAction('&Export...', self)
        self.ExportAction.setShortcut('Ctrl+E')
        self.ExportAction.setStatusTip('Export Chosen Files')
        self.ExportAction.triggered.connect(self.ExportVPKFiles)

        self.OptionsAction = QAction("&Config")
        self.OptionsAction.setStatusTip('Change some things')
        self.OptionsAction.triggered.connect(self.OptionsMenu.show)

        self.Menu = self.menuBar()
        self.FileMenu = self.Menu.addMenu('&File')
        self.FileMenu.addAction(self.OpenAction)
        self.FileMenu.addAction(self.ExportAction)
        self.EditMenu = self.Menu.addMenu('&Edit')
        self.EditMenu.addAction(self.OptionsAction)

        #Sort out Layout placements and such.
        self.Content.setLayout(self.ContentLayout)
        self.setCentralWidget(self.Content)

        self.DirectoryModel.itemChanged.connect(self.VPKItemClicked)

        #Show ourselves
        self.show()

    def HandleVPK(self, paths):
        dictPaths = pathtodir.get_path_dict(paths)
        self.DirectoryMagic(dictPaths)

    def VPKItemClicked(self, item):
        #print(item.parent())
        if item.VPKItemType == 'File':
            if item.checkState():
                self.ExportItems.append(item)
            else:
                self.ExportItems.remove(item)
        elif item.VPKItemType == 'Dir':
            if item.checkState():
                for Item in item.VPKChildren:
                    Item.setCheckState(2)
                    self.ExportItems.append(Item)
                item.setCheckState(2)
            else:

                for Item in item.VPKChildren:
                    Item.setCheckState(0)
                    self.ExportItems.remove(Item)

    def DirectoryMagic(self, path, parent=None, wPath=''):
        #A Magic function that uses R E C U R S I O N!

        for thing in path:

            wwPath = wPath + '/{}'.format(thing)

            #Create our Item variable
            thingItem = VPKItem(wwPath)
            thingItem.setText(thing)

            thingItem.setEditable(False)
            #thingItem.setIcon(QIcon.fromTheme('document'))

            thingItem.setCheckable(True)

            if type(path[thing]
                    ) == dict:  #If it's a dictionary, it's a folder.
                thingItem.setIcon(QIcon.fromTheme('folder-new'))
                self.DirectoryMagic(path[thing], thingItem, wwPath)
                thingItem.setType('Dir')
            else:
                thingItem.setType('File')
            if not parent: self.DirectoryModel.appendRow(thingItem)
            else: parent.appendRow(thingItem)

    def AddFile(self, filePath):
        path, file = os.path.split(filePath)
        pathFolders = path.split('/')

        Magic(filePath)

    def ErrorBox(self, text="Message..", title="Error"):
        box = QMessageBox()
        box.setIcon(QMessageBox.Critical)
        box.setText(text)
        box.setWindowTitle(title)
        box.setStandardButtons(QMessageBox.Ok)

        return box.exec()

    def OpenDialog(self, title="Open File", files="All Files (*)"):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        filename, _ = QFileDialog.getOpenFileName(self,
                                                  title,
                                                  "",
                                                  files,
                                                  options=options)

        return filename
        self.setHeaderData(self.SUBJECT, Qt.Horizontal, "Subject")
        self.setHeaderData(self.DATE, Qt.Horizontal, "Date")

    def addMail(self, mail_from, subject, date):
        self.insertRow(0)
        self.setData(self.index(0, self.FROM), mail_from)
        self.setData(self.index(0, self.SUBJECT), subject)
        self.setData(self.index(0, self.DATE), date)


if __name__ == '__main__':
    app = QApplication(sys.argv)

    dataView = QTreeView()
    dataView.setRootIsDecorated(False)
    dataView.setAlternatingRowColors(True)

    model = MyModel()

    # Add data
    model.addMail('*****@*****.**', 'Your Github Donation', '03/25/2017 02:05 PM')
    model.addMail('*****@*****.**', 'Github Projects', '02/02/2017 03:05 PM')
    model.addMail('*****@*****.**', 'Your Phone Bill', '01/01/2017 04:05 PM')

    dataView.setModel(model)
    dataView.show()

    # The mainloop of the application. The event handling starts from this point.
    # The exec_() method has an underscore. It is because the exec is a Python keyword. And thus, exec_() was used instead.
    exit_code = app.exec_()
예제 #27
0
class App(QWidget):

    Country, IPAddress, SessionName, Status, OS, CPU, CPU_Core, RAM, PING = range(
        0, 9)

    def __init__(self):

        super().__init__()

        #=========== Main GUI block ==================
        # Main Window Setting
        self.title = 'COINPAIGN: Remote Administration Tool'
        self.setWindowIcon(QIcon('logo.ico'))
        self.left = 500
        self.top = 250
        self.width = 1000
        self.height = 500

        # Getting subnet, LAN and WAN
        host = self.get_Host_name_IP()
        self.local = host[0]
        self.subnet_mask = host[1]

        self.initUI()
        self.displayItem()

    def initUI(self):

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.dataGroupBox = QGroupBox()
        self.dataView = QTreeView()
        # self.dataView.move(0,100)
        # self.dataView.resize(500, 500)

        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)
        self.dataView.setSortingEnabled(True)

        dataLayout = QVBoxLayout()
        dataLayout.addWidget(self.dataView)
        self.dataGroupBox.setLayout(dataLayout)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.dataGroupBox)
        self.setLayout(mainLayout)

        self.dataView.setContextMenuPolicy(Qt.CustomContextMenu)
        self.dataView.customContextMenuRequested.connect(self.openMenu)

        # Layout "Refresh" button
        button = QPushButton('Refresh', self)
        button.move(900, 5)
        button.resize(80, 20)
        button.clicked.connect(self.execute_Refresh)

        # Layout "IP Lookup" button
        button = QPushButton('IP Lookup', self)
        button.move(15, 5)
        button.resize(80, 20)
        button.clicked.connect(self.execute_IPlookup)

        # Layout "MAC Vendor" button
        button = QPushButton('MAC Vendor', self)
        button.move(110, 5)
        button.resize(80, 20)
        button.clicked.connect(self.execute_MACvendor)

    def createMailModel(
            self,
            parent=None
    ):  #--- create information table view of remote computer

        model = QStandardItemModel(0, 9, parent)

        model.setHeaderData(self.Country, Qt.Horizontal, "Country/City ")
        model.setHeaderData(self.IPAddress, Qt.Horizontal, "IP LAN/WAN")
        model.setHeaderData(self.SessionName, Qt.Horizontal, "SessionName")
        model.setHeaderData(self.Status, Qt.Horizontal, "Status")
        model.setHeaderData(self.OS, Qt.Horizontal, "OS")
        model.setHeaderData(self.CPU, Qt.Horizontal, "CPU")
        model.setHeaderData(self.CPU_Core, Qt.Horizontal, "CPU Core")
        model.setHeaderData(self.RAM, Qt.Horizontal, "RAM(GB)")
        model.setHeaderData(self.PING, Qt.Horizontal, "PING(ms)")

        return model

#=========== Get and dislay information of remote computers block ==================

    def displayItem(
        self
    ):  #--- get and display information of remote computer when applictoin start

        progressBar.setMaximum(254)

        #--- get information of remote computer
        for i in range(1, 254):
            host = self.subnet_mask + ".%d" % i
            data = AgentClient.client_program(
                host)  #--- get data from Agentclient module

            if data != "0":
                pi = self.get_pingtime(host)
                data = data + ":" + str(pi)
                serverdata.append(data)

            progressBar.setValue(i)
            t = time.time()
            while time.time() < t + 0.1:
                app.processEvents()

        #--- display information of remote computer
        self.onReload()

        splash.hide()
        self.show()

    def get_pingtime(self, host):  #--- get ping time of live computer

        ping = subprocess.Popen(["ping", "-n", "1", host],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)

        out, error = ping.communicate()
        out = str(out).replace("\\r\\n", "")
        temp = out.split("ms")
        temp1 = temp[3]
        temp2 = temp1.split(" ")
        result = temp2[3]

        return result

    def onReload(self):  #--- display information of remote computer

        self.model = self.createMailModel(self)
        self.dataView.setModel(self.model)

        for data in serverdata:
            itemData = data.split(":")
            cn = pycountry.countries.get(alpha_2=itemData[0])
            countryname = cn.name
            amount = int(itemData[8])
            GB = round(amount / int(1024 * 1024 * 1024), 2)
            self.addMail(self.model,
                         './images/' + itemData[0].lower() + '/30.png',
                         countryname + "/" + itemData[1], itemData[2],
                         itemData[3], itemData[4],
                         './icons/' + itemData[5] + '.png', itemData[5],
                         itemData[6], itemData[7], str(GB), itemData[9])

    def addMail(self, model, nflag, country, ipaddress, ss_name, status,
                os_logo, os, cpu, cpu_core, ram, ping):

        icon = QIcon()
        icon.addPixmap(QPixmap(nflag))
        logo = QIcon()
        logo.addPixmap(QPixmap(os_logo))

        item_col_0 = QStandardItem(icon, country)
        item_col_1 = QStandardItem(ipaddress)
        item_col_2 = QStandardItem(ss_name)
        item_col_3 = QStandardItem(status)
        item_col_4 = QStandardItem(logo, os)
        item_col_5 = QStandardItem(cpu)
        item_col_6 = QStandardItem(cpu_core)
        item_col_7 = QStandardItem(ram)
        item_col_8 = QStandardItem(ping)

        model.appendRow([
            item_col_0, item_col_1, item_col_2, item_col_3, item_col_4,
            item_col_5, item_col_6, item_col_7, item_col_8
        ])

#=========== Refresh button process block ==================

    def execute_Refresh(self):

        splash.show()
        progressBar.setMaximum(255)
        new_serverdata = []

        for i in range(1, 254):
            host = self.subnet_mask + ".%d" % i
            data = AgentClient.client_program(
                host
            )  #--- get information of remote computer from AgentClient module again

            if data != "0":
                pi = self.get_pingtime(host)
                data = data + ":" + str(pi)
                new_serverdata.append(data)

            progressBar.setValue(i)
            t = time.time()
            while time.time() < t + 0.1:
                app.processEvents()

        for old_item in serverdata:  #--- update new data
            k = 0
            for new_item in new_serverdata:
                old1 = old_item.split(":")
                oldip = old1[2]
                new1 = new_item.split(":")
                newip = new1[2]
                if oldip == newip:
                    break
                k = k + 1
            if k == len(new_serverdata):
                item = old_item.replace("Connected", "Disconnected")
                new_serverdata.append(item)

        serverdata.clear()

        for i in range(0, len(new_serverdata)):
            serverdata.append(new_serverdata[i])

        self.onReload()  #--- display new data on GUI

        splash.hide()
        self.show()

#=========== IP lookup button process block ==================

    def execute_IPlookup(self):  #---- IP lookup Diaglog GUI
        dlgEdit = QDialog()
        dlgEdit.setWindowTitle("IP Lookup")
        dlgEdit.setWindowIcon(QIcon("./icons/iplookup.png"))
        dlgEdit.resize(600, 300)

        # getservIP GUI   ( get IP from domain address)
        self.dnsName = QLabel(dlgEdit)
        self.dnsName.setText("Target WebSite Domain")
        self.dnsName.move(20, 12)

        self.tagDns = QLineEdit(dlgEdit)
        self.tagDns.setPlaceholderText('google.com')
        self.tagDns.setReadOnly(False)
        self.tagDns.setEnabled(True)
        self.tagDns.move(20, 30)
        self.tagDns.resize(170, 25)

        Subm1 = QPushButton('Submit', dlgEdit)
        Subm1.resize(80, 25)
        Subm1.move(200, 30)
        Subm1.clicked.connect(self.submit1_click)

        self.ipValue = QTextEdit(dlgEdit)
        self.ipValue.move(0, 60)
        self.ipValue.resize(300, 240)

        # Whois GUI ( get informaion corresponding to IP)
        self.ipAdrr = QLabel(dlgEdit)
        self.ipAdrr.setText("Target IP Address")
        self.ipAdrr.move(320, 12)

        self.tagIP = QLineEdit(dlgEdit)
        self.tagIP.setPlaceholderText('216.58.200.46')

        ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"  # IP addres validation ( regular expression )
        ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange +
                          "\\." + ipRange + "$")
        ipValidator = QRegExpValidator(ipRegex, self)
        self.tagIP.setValidator(ipValidator)

        self.tagIP.setReadOnly(False)
        self.tagIP.setEnabled(True)
        self.tagIP.move(320, 30)
        self.tagIP.resize(170, 25)

        Subm2 = QPushButton('Submit', dlgEdit)
        Subm2.resize(80, 25)
        Subm2.move(500, 30)
        Subm2.clicked.connect(self.submit2_click)

        self.ipInfo = QTextEdit(dlgEdit)
        self.ipInfo.move(300, 60)
        self.ipInfo.resize(300, 240)

        dlgEdit.exec_()

    def submit1_click(self):  #---  getservIP processing

        tagDns = ""
        tagDns = self.tagDns.text()  #--- get domain address from LineEdit()

        # type website domain address
        if tagDns == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type website domain.")
            msg.exec_()
        else:
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))

            ipResult = IP_Lookup.func_getservip(
                tagDns)  #--- get IP from IP_Lookup module

            self.ipValue.append("  " + ipResult)
            self.ipValue.append("")

            QApplication.restoreOverrideCursor()

    def submit2_click(self):  #--- whois processing

        tagIP = ""
        tagIP = self.tagIP.text()  #--- get ip from LineEdit()

        # IP validation
        numItem = tagIP.split(".")
        if len(numItem) != 4 or tagIP == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type IP address.")
            msg.exec_()
        elif numItem[3] == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type IP address.")
            msg.exec_()
        else:
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            self.ipInfo.append("Detail Information on " + tagIP)
            getResult = IP_Lookup.func_whois(
                tagIP)  # get information from IP_Lookup module
            if getResult == []:
                self.ipInfo.append("   No result.")
            else:
                self.ipInfo.append("  " + "IP:" + "\t " + getResult[0])
                self.ipInfo.append("  " + "City:" + "\t " + getResult[1])
                self.ipInfo.append("  " + "Region:" + "\t " + getResult[2])
                self.ipInfo.append("  " + "Country:" + "\t " + getResult[3])
                self.ipInfo.append("  " + "Location:" + "\t " + getResult[4])
                self.ipInfo.append("  " + "Postal:" + "\t " + getResult[5])
                self.ipInfo.append("")

            QApplication.restoreOverrideCursor()

#=========== MAC Vendor button process block ==================

    def execute_MACvendor(self):  #--- MAC Vendor GUI

        dlgEdit = QDialog()
        dlgEdit.setWindowTitle("Mac Vendor")
        dlgEdit.setWindowIcon(QIcon("./icons/default.png"))
        dlgEdit.resize(600, 300)

        self.ipName = QLabel(dlgEdit)
        self.ipName.setText("MAC Address:")
        self.ipName.move(20, 25)

        self.mac = QLineEdit(dlgEdit)
        self.mac.setPlaceholderText('30-B4-9E-F1-C1-A5')
        self.mac.setReadOnly(False)
        self.mac.setEnabled(True)
        self.mac.move(100, 20)
        self.mac.resize(170, 25)

        self.efName = QTextEdit(dlgEdit)
        self.efName.move(0, 50)
        self.efName.resize(600, 250)

        Scan = QPushButton('Submit', dlgEdit)
        Scan.resize(80, 25)
        Scan.move(500, 20)
        Scan.clicked.connect(self.macvendor_click)

        dlgEdit.exec_()

    def macvendor_click(self):  #--- mac vendor processing

        mac = ""
        mac = self.mac.text()  #--- get mac from LineEdit()
        # mac validation
        if len(mac) < 6 or mac == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type MAC address.")
            msg.exec_()
        else:
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            self.efName.append("Vendor Information on " + mac)
            vendorInfo = Mac_Vendor.getMacVendor(
                mac)  #--- get vendor informaion from Mac_Vendor module
            strven = str(vendorInfo)
            errcheck = strven.split(":")
            print(errcheck)
            if errcheck[0] == "{'error'":
                self.efName.append("   Incorrect MAC address.")
            else:
                self.efName.append("   Address:" + "\t " +
                                   vendorInfo['address'])
                self.efName.append("")
                self.efName.append("   Company:" + "\t " +
                                   vendorInfo['company'])
                self.efName.append("   Country:" + "\t " +
                                   vendorInfo['country'])
                self.efName.append("   End_Hex:" + "\t " +
                                   vendorInfo['end_hex'])
                self.efName.append("   Mac_Prefix:" + "\t " +
                                   vendorInfo['mac_prefix'])
                self.efName.append("   Start_Hex:" + "\t " +
                                   vendorInfo['start_hex'])
                self.efName.append("   Type:" + "\t " + vendorInfo['type'])
            self.efName.append("")

            QApplication.restoreOverrideCursor()

#=========== PopUP Menu  process block ==================

    def openMenu(self, position):  #--- popup menu main GUI

        menu = QMenu()

        ipscanItem = QAction(QIcon("./icons/IPScan.png"), "&IPScan", self)
        menu.addAction(ipscanItem)
        ipscanItem.triggered.connect(
            self.execute_ipscan)  #--- click ipscan menu

        portscanItem = QAction(QIcon("./icons/PortScan.png"), "&PortScan",
                               self)
        menu.addAction(portscanItem)
        portscanItem.triggered.connect(
            self.execute_portscan)  #--- click port scan menu

        reverseItem = QAction(QIcon("./icons/ReverseShell.png"),
                              "&ReverseShell", self)
        menu.addAction(reverseItem)
        reverseItem.triggered.connect(
            self.execute_reverse_shell)  #--- click reverse shell menu

        remoteItem = QAction(QIcon("./icons/RemoteDesktop.png"),
                             "&RemoteDesktop", self)
        menu.addAction(remoteItem)
        remoteItem.triggered.connect(
            self.execute_RDC)  #--- click remote desktop menu

        menu.exec_(self.dataView.viewport().mapToGlobal(position))

    #------- ip scan procee block ---------
    def execute_ipscan(self):  # ip scan diaglog GUI

        dlgEdit = QDialog()
        dlgEdit.setWindowTitle("IP Scan")
        dlgEdit.setWindowIcon(QIcon("./icons/IPScan.png"))
        dlgEdit.resize(600, 300)

        self.ipName = QLabel(dlgEdit)
        self.ipName.setText("Subnet: ")
        self.ipName.move(20, 25)

        self.ips = QLineEdit(dlgEdit)
        self.ips.setPlaceholderText('192.168.1.0/24')
        ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"  # ips validation ( regular expression )
        ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange +
                          "\\." + ipRange + "\\/" + ipRange + "$")
        ipValidator = QRegExpValidator(ipRegex, self)
        self.ips.setValidator(ipValidator)
        self.ips.setReadOnly(False)
        self.ips.setEnabled(True)
        self.ips.move(70, 20)
        self.ips.resize(170, 25)

        self.comments = QLabel(dlgEdit)
        self.comments.setText("Ex: 192.168.1.0/24")
        self.comments.move(245, 25)

        self.efName = QTextEdit(dlgEdit)
        self.efName.move(0, 50)
        self.efName.resize(600, 250)

        Scan = QPushButton('Scan', dlgEdit)
        Scan.resize(80, 25)
        Scan.move(500, 20)
        Scan.clicked.connect(self.ipscan_click)  # call ip scan process

        dlgEdit.exec_()

    def ipscan_click(self):  #--- ip scan process

        ips = ""
        ips = self.ips.text()  #--- get ips from LineEdit()
        #--- ips validation
        numItem = ips.split(".")
        if len(numItem) != 4 or ips == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type correct subnet...")
            msg.exec_()
        elif numItem[3] == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type correct subnet...")
            msg.exec_()
        # display ip scan result
        else:
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            self.efName.append("IP Address and MAC on " + ips)

            devices = IP_Scan.arp(
                str(ips))  #--- ip scan process from IP_Scan module
            rcv = str(devices)
            print(rcv)
            ans = rcv.split(":")
            if ans[5] == "0>":
                self.efName.append("  No result.")
            else:
                for snd, rcv in devices:
                    self.efName.append("  " + rcv.psrc + "\t" + ":   " +
                                       rcv.src)
            self.efName.append("")

            QApplication.restoreOverrideCursor()

    #------- port scan procee block ---------
    def execute_portscan(self):  #---  GUI-dialog for port scan

        dlgEdit = QDialog()
        dlgEdit.setWindowTitle("Port Scan")
        dlgEdit.setWindowIcon(QIcon("./icons/PortScan.png"))
        dlgEdit.resize(600, 300)

        self.ipName = QLabel(dlgEdit)
        self.ipName.setText("Host IP:")
        self.ipName.move(20, 25)

        self.hostip = QLineEdit(dlgEdit)
        self.hostip.setPlaceholderText('192.168.1.131')
        ipRange = "(?:[0-1]?[0-9]?[0-9]|2[0-4][0-9]|25[0-5])"  # Part of the regular expression
        ipRegex = QRegExp("^" + ipRange + "\\." + ipRange + "\\." + ipRange +
                          "\\." + ipRange + "$")
        ipValidator = QRegExpValidator(ipRegex, self)
        self.hostip.setValidator(ipValidator)
        self.hostip.setReadOnly(False)
        self.hostip.setEnabled(True)
        self.hostip.move(70, 20)
        self.hostip.resize(170, 25)

        self.efName = QTextEdit(dlgEdit)
        self.efName.move(0, 50)
        self.efName.resize(600, 250)

        Scan = QPushButton('Scan', dlgEdit)
        Scan.resize(80, 25)
        Scan.move(500, 20)
        Scan.clicked.connect(self.portscan_click)  #--- call port scan process

        dlgEdit.exec_()

    def portscan_click(self):  #---  port scan process
        shost = ""
        shost = self.hostip.text()  #--- get host ip from GUI LineEdit()

        #--- IP address validation processing
        numItem = shost.split(".")
        if len(numItem) != 4 or shost == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type correct host IP.")
            msg.exec_()
        elif numItem[3] == "":
            msg = QMessageBox()
            msg.setIcon(QMessageBox.Warning)
            msg.setWindowTitle("Warning")
            msg.setText("Please type correct host IP.")
            msg.exec_()
        #---- get open port and display
        else:
            QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
            self.efName.append("Open Ports on " + shost)
            port = ""
            openPorts = Port_Scan.port_scan(
                str(shost))  #--- call function of Port_Scan module
            if openPorts == []:
                self.efName.append("  No result.")
            else:
                for i in openPorts:
                    port = port + "  " + i
                self.efName.append("  " + port)
                self.efName.append("")

            QApplication.restoreOverrideCursor()

#========== reverse shell  processing block  ================

    def execute_reverse_shell(self):  #--- run reverse shell program
        window_command = "cmd.exe /c start cmd.exe /k python Reverse_Shell.py"
        Popen(window_command)

#========== remote desktop connection  block  ================

    def execute_RDC(self):  #--- run remote desktop client program
        window_command = "python RDC_Client.py"
        Popen(window_command)


# Function to get Local IP address
# def get_Host_name_IP(self):
#     interfaces = netifaces.interfaces()
#     gws=netifaces.gateways()
#     ss = gws['default']
#     dd = ss[2]
#     aa = dd[0].split('.')
#     subnet = aa[0]+"."+aa[1]+"."+aa[2]
#     UserIP = []
#     ii = 0
#     for i in interfaces:
#         if i == 'lo':
#             continue
#         iface = netifaces.ifaddresses(i).get(netifaces.AF_INET)
#         if iface != None:
#             for j in iface:
#                 UserIP.append(j['addr'])
#         ii = ii+1
#     for ip in UserIP:
#         sub = ip.split(".")
#         subip = sub[0]+"."+sub[1]+"."+sub[2]
#         if subip == subnet:
#             lan = ip
#     # array = [lan, subnet, wan]
#     array = [lan, subnet]
#     return array

    def get_Host_name_IP(
            self):  #--- get IP address and subnet of host(this computer)

        hostname = socket.gethostname()
        host = socket.gethostbyname(hostname)
        print(host)

        sub = host.split(".")
        subnet = sub[0] + "." + sub[1] + "." + sub[2]

        array = [host, subnet]
        return array
예제 #28
0
파일: export_frame.py 프로젝트: EHRI/resyto
class Explorer(QDialog):
    def __init__(
        self, parent, window_title=_("Select resources"), subtitle=_("Select files and/or folders to include")
    ):
        super().__init__(parent)
        self.logger = logging.getLogger(__name__)
        self.setModal(True)
        self.setSizeGripEnabled(True)
        self.setWindowTitle(window_title)
        self.subtitle = subtitle
        self.file_set = set()
        self.config = Configuration()
        self.__init_ui__()
        self.filename_filter = FilenameFilter()
        # self.show()

    def __init_ui__(self):
        # layout
        vert = QVBoxLayout(self)
        vert.setContentsMargins(0, 0, 0, 0)

        resource_dir = self.config.cfg_resource_dir()

        p_top = QVBoxLayout()
        lb_subtitle = QLabel(self.subtitle)
        lb_subtitle.setContentsMargins(10, 10, 10, 0)
        p_top.addWidget(lb_subtitle)

        self.model = QFileSystemModel()
        self.model.setRootPath(resource_dir)

        self.view = QTreeView()
        self.view.setModel(self.model)
        self.view.setRootIndex(self.model.index(self.model.rootPath()))
        self.view.setAlternatingRowColors(True)
        self.view.setSelectionMode(QAbstractItemView.MultiSelection)
        self.view.selectionModel().selectionChanged.connect(self.selection_changed)
        self.view.collapsed.connect(self.item_collapsed)
        self.view.expanded.connect(self.item_expanded)
        p_top.addWidget(self.view)

        p_info = QHBoxLayout()
        lb_resource = QLabel(_("resource dir") + ": " + resource_dir)
        lb_resource.setContentsMargins(10, 0, 10, 0)

        self.lb_selection_count = QLabel(str(self.selected_file_count()) + " " + _("resources selected"))
        self.lb_selection_count.setContentsMargins(10, 0, 10, 0)

        p_info.addWidget(self.lb_selection_count)
        p_info.addStretch(1)
        p_info.addWidget(lb_resource)

        p_top.addLayout(p_info)

        p_bottom = QHBoxLayout()

        self.pb_deselect = QPushButton(_("Deselect all"))
        self.pb_deselect.clicked.connect(self.pb_deselect_clicked)
        self.pb_deselect.setEnabled(self.selected_file_count() > 0)
        p_bottom.addWidget(self.pb_deselect)

        p_bottom.addStretch(1)
        self.pb_ok = QPushButton(_("OK"))
        self.pb_ok.setAutoDefault(True)
        self.pb_ok.clicked.connect(self.accept)
        p_bottom.addWidget(self.pb_ok)

        pb_cancel = QPushButton(_("Cancel"))
        pb_cancel.clicked.connect(self.reject)
        p_bottom.addWidget(pb_cancel)

        vert.addLayout(p_top)
        vert.addLayout(p_bottom)

        self.setLayout(vert)
        self.resize(self.config.explorer_width(), self.config.explorer_height())
        width = self.view.width() - 50
        self.view.setColumnWidth(0, width / 2)
        self.view.setColumnWidth(1, width / 6)
        self.view.setColumnWidth(2, width / 6)
        self.view.setColumnWidth(3, width / 6)

    def __persist__(self):
        # persist properties of the explorer
        self.config.set_explorer_width(self.width())
        self.config.set_explorer_height(self.height())
        self.config.persist()

    def __compute_filenames__(self, item_selection):
        # item_selection: a QItemSelection
        # return corresponding absolute filenames as a set, including filenames in underlying folders
        s = set()
        for index in item_selection.indexes():
            # we have an index for each column in the model
            if index.column() == 0:
                path = index.model().filePath(index)
                if os.path.isdir(path):
                    for root, directories, filenames in os.walk(path):
                        for filename in filenames:
                            if self.filename_filter.accept(filename):
                                s.add(os.path.join(root, filename))
                elif os.path.isfile(path):
                    s.add(path)
                else:
                    self.logger.warn("isUnknownThing", path)
        return s

    def showEvent(self, QShowEvent):
        # self.pb_ok.setFocus()
        pass

    def set_filename_filter(self, filename_filter):
        # set the FilenameFilter
        self.filename_filter = filename_filter

    def selected_file_count(self):
        return len(self.file_set)

    def selected_file_set(self):
        return frozenset(self.file_set)

    def selection_changed(self, selected, deselected):
        # selected, deselected: PyQt5.QtCore.QItemSelection
        selected_filenames = self.__compute_filenames__(selected)
        self.file_set.update(selected_filenames)
        deselected_filenames = self.__compute_filenames__(deselected)
        self.file_set.difference_update(deselected_filenames)

        self.pb_deselect.setEnabled(self.selected_file_count() > 0)
        self.lb_selection_count.setText(str(self.selected_file_count()) + " " + _("resources selected"))

    def item_expanded(self, index):
        # index: a QModelIndex
        # show all child items selected/deselected in accordance with state of parent folder
        pass

    def item_collapsed(self, index):
        pass

    def pb_deselect_clicked(self):
        self.view.selectionModel().clear()

    def hideEvent(self, QHideEvent):
        self.__persist__()
예제 #29
0
파일: locator.py 프로젝트: bjones1/enki
class _LocatorDialog(QDialog):
    """Locator widget and implementation
    """

    def __init__(self, parent, commandClasses):
        QDialog.__init__(self, parent)
        self._terminated = False
        self._commandClasses = commandClasses

        self._createUi()

        self._loadingTimer = QTimer(self)
        self._loadingTimer.setSingleShot(True)
        self._loadingTimer.setInterval(200)
        self._loadingTimer.timeout.connect(self._applyLoadingCompleter)

        self._completerLoaderThread = _CompleterLoaderThread(self)

        self.finished.connect(self._terminate)

        self._command = None
        self._updateCurrentCommand()

    def _createUi(self):
        self.setWindowTitle(core.project().path().replace(os.sep, '/') or 'Locator')

        self.setLayout(QVBoxLayout())
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.layout().setSpacing(1)

        biggerFont = self.font()
        biggerFont.setPointSizeF(biggerFont.pointSizeF() * 2)
        self.setFont(biggerFont)

        self._edit = _CompletableLineEdit(self)
        self._edit.updateCurrentCommand.connect(self._updateCurrentCommand)
        self._edit.enterPressed.connect(self._onEnterPressed)
        self._edit.installEventFilter(self)  # catch Up, Down
        self._edit.setFont(biggerFont)
        self.layout().addWidget(self._edit)
        self.setFocusProxy(self._edit)

        self._table = QTreeView(self)
        self._table.setFont(biggerFont)
        self._model = _CompleterModel()
        self._table.setModel(self._model)
        self._table.setItemDelegate(HTMLDelegate(self._table))
        self._table.setRootIsDecorated(False)
        self._table.setHeaderHidden(True)
        self._table.clicked.connect(self._onItemClicked)
        self._table.setAlternatingRowColors(True)
        self._table.installEventFilter(self)  # catch focus and give to the edit
        self.layout().addWidget(self._table)

        width = QFontMetrics(self.font()).width('x' * 64)  # width of 64 'x' letters
        self.resize(width, width * 0.62)

    def _terminate(self):
        if not self._terminated:
            if self._command is not None:
                self._command.terminate()
                self._command = None

            self._edit.terminate()

            self._completerLoaderThread.terminate()
            if self._model:
                self._model.terminate()
            core.workspace().focusCurrentDocument()
            self._terminated = True

    def _updateCurrentCommand(self):
        """Try to parse line edit text and set current command
        """
        if self._terminated:
            return

        newCommand = self._parseCurrentCommand()

        if newCommand is not self._command:
            if self._command is not None:
                self._command.updateCompleter.disconnect(self._updateCompletion)
                self._command.terminate()

            self._command = newCommand
            if self._command is not None:
                self._command.updateCompleter.connect(self._updateCompletion)

        self._updateCompletion()

    def _updateCompletion(self):
        """User edited text or moved cursor. Update inline and TreeView completion
        """
        if self._command is not None:
            completer = self._command.completer()

            if completer is not None and completer.mustBeLoaded:
                self._loadingTimer.start()
                self._completerLoaderThread.loadCompleter(self._command, completer)
            else:
                self._applyCompleter(self._command, completer)
        else:
            self._applyCompleter(None, _HelpCompleter(self._commandClasses))

    def _applyLoadingCompleter(self):
        """Set 'Loading...' message
        """
        self._applyCompleter(None, StatusCompleter('<i>Loading...</i>'))

    def onCompleterLoaded(self, command, completer):
        """The method called from _CompleterLoaderThread when the completer is ready
        This code works in the GUI thread
        """
        self._applyCompleter(command, completer)

    def _applyCompleter(self, command, completer):
        """Apply completer. Called by _updateCompletion or by thread function when Completer is constructed
        """
        self._loadingTimer.stop()

        if command is not None:
            command.onCompleterLoaded(completer)

        if completer is None:
            completer = _HelpCompleter([command])

        if self._edit.cursorPosition() == len(self._edit.text()):  # if cursor at the end of text
            self._edit.setInlineCompletion(completer.inline())

        self._model.setCompleter(completer)
        if completer.columnCount() > 1:
            self._table.resizeColumnToContents(0)
            self._table.setColumnWidth(0, self._table.columnWidth(0) + 20)  # 20 px spacing between columns

        selItem = completer.autoSelectItem()
        if selItem:
            index = self._model.createIndex(selItem[0],
                                            selItem[1])
            self._table.setCurrentIndex(index)

    def _onItemClicked(self, index):
        """Item in the TreeView has been clicked.
        Open file, if user selected it
        """
        if self._command is not None:
            fullText = self._model.completer.getFullText(index.row())
            if fullText is not None:
                self._command.onItemClicked(fullText)
                if self._tryExecCurrentCommand():
                    self.accept()
                    return
                else:
                    self._edit.setText(self._command.lineEditText())
                    self._updateCurrentCommand()

        self._edit.setFocus()

    def _onEnterPressed(self):
        """User pressed Enter or clicked item. Execute command, if possible
        """
        if self._table.currentIndex().isValid():
            self._onItemClicked(self._table.currentIndex())
        else:
            self._tryExecCurrentCommand()

    def _tryExecCurrentCommand(self):
        if self._command is not None and self._command.isReadyToExecute():
            self._command.execute()
            self.accept()
            return True
        else:
            return False

    def _chooseCommand(self, words):
        for cmd in self._commandClasses:
            if cmd.command == words[0]:
                return cmd, words[1:]

        isPath = words and (words[0].startswith('/') or
                            words[0].startswith('./') or
                            words[0].startswith('../') or
                            words[0].startswith('~/') or
                            words[0][1:3] == ':\\' or
                            words[0][1:3] == ':/'
                            )
        isNumber = len(words) == 1 and all([c.isdigit() for c in words[0]])

        def matches(cmd):
            if isPath:
                return cmd.isDefaultPathCommand
            elif isNumber:
                return cmd.isDefaultNumericCommand
            else:
                return cmd.isDefaultCommand

        for cmd in self._commandClasses:
            if matches(cmd):
                return cmd, words

    def _parseCurrentCommand(self):
        """ Parse text and try to get (command, completable word index)
        Return None if failed to parse
        """
        # Split line
        text = self._edit.commandText()
        words = splitLine(text)
        if not words:
            return None

        # Find command
        cmdClass, args = self._chooseCommand(words)

        if isinstance(self._command, cmdClass):
            command = self._command
        else:
            command = cmdClass()

        # Try to make command object
        try:
            command.setArgs(args)
        except InvalidCmdArgs:
            return None
        else:
            return command

    def eventFilter(self, obj, event):
        if obj is self._edit:
            if event.type() == QEvent.KeyPress and \
               event.key() in (Qt.Key_Up, Qt.Key_Down, Qt.Key_PageUp, Qt.Key_PageDown):
                return self._table.event(event)
        elif obj is self._table:
            if event.type() == QEvent.FocusIn:
                self._edit.setFocus()
                return True

        return False
예제 #30
0
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.proxyModel = MySortFilterProxyModel(self)
        self.proxyModel.setDynamicSortFilter(True)

        self.sourceView = QTreeView()
        self.sourceView.setRootIsDecorated(False)
        self.sourceView.setAlternatingRowColors(True)

        sourceLayout = QHBoxLayout()
        sourceLayout.addWidget(self.sourceView)
        sourceGroupBox = QGroupBox("Original Model")
        sourceGroupBox.setLayout(sourceLayout)

        self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter")
        self.filterCaseSensitivityCheckBox.setChecked(True)
        self.filterPatternLineEdit = QLineEdit()
        self.filterPatternLineEdit.setText("Grace|Sports")
        filterPatternLabel = QLabel("&Filter pattern:")
        filterPatternLabel.setBuddy(self.filterPatternLineEdit)
        self.filterSyntaxComboBox = QComboBox()
        self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp)
        self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard)
        self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString)
        self.fromDateEdit = QDateEdit()
        self.fromDateEdit.setDate(QDate(2006, 12, 22))
        self.fromDateEdit.setCalendarPopup(True)
        fromLabel = QLabel("F&rom:")
        fromLabel.setBuddy(self.fromDateEdit)
        self.toDateEdit = QDateEdit()
        self.toDateEdit.setDate(QDate(2007, 1, 5))
        self.toDateEdit.setCalendarPopup(True)
        toLabel = QLabel("&To:")
        toLabel.setBuddy(self.toDateEdit)

        self.filterPatternLineEdit.textChanged.connect(self.textFilterChanged)
        self.filterSyntaxComboBox.currentIndexChanged.connect(self.textFilterChanged)
        self.filterCaseSensitivityCheckBox.toggled.connect(self.textFilterChanged)
        self.fromDateEdit.dateChanged.connect(self.dateFilterChanged)
        self.toDateEdit.dateChanged.connect(self.dateFilterChanged)

        self.proxyView = QTreeView()
        self.proxyView.setRootIsDecorated(False)
        self.proxyView.setAlternatingRowColors(True)
        self.proxyView.setModel(self.proxyModel)
        self.proxyView.setSortingEnabled(True)
        self.proxyView.sortByColumn(1, Qt.AscendingOrder)

        self.textFilterChanged()
        self.dateFilterChanged()

        proxyLayout = QGridLayout()
        proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
        proxyLayout.addWidget(filterPatternLabel, 1, 0)
        proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1)
        proxyLayout.addWidget(self.filterSyntaxComboBox, 1, 2)
        proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 2, 0, 1, 3)
        proxyLayout.addWidget(fromLabel, 3, 0)
        proxyLayout.addWidget(self.fromDateEdit, 3, 1, 1, 2)
        proxyLayout.addWidget(toLabel, 4, 0)
        proxyLayout.addWidget(self.toDateEdit, 4, 1, 1, 2)
        proxyGroupBox = QGroupBox("Sorted/Filtered Model")
        proxyGroupBox.setLayout(proxyLayout)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(sourceGroupBox)
        mainLayout.addWidget(proxyGroupBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Custom Sort/Filter Model")
        self.resize(500, 450)

    def setSourceModel(self, model):
        self.proxyModel.setSourceModel(model)
        self.sourceView.setModel(model)

    def textFilterChanged(self):
        syntax = QRegExp.PatternSyntax(
            self.filterSyntaxComboBox.itemData(
                self.filterSyntaxComboBox.currentIndex()))
        caseSensitivity = (
            self.filterCaseSensitivityCheckBox.isChecked()
            and Qt.CaseSensitive or Qt.CaseInsensitive)
        regExp = QRegExp(self.filterPatternLineEdit.text(), caseSensitivity, syntax)
        self.proxyModel.setFilterRegExp(regExp)

    def dateFilterChanged(self):
        self.proxyModel.setFilterMinimumDate(self.fromDateEdit.date())
        self.proxyModel.setFilterMaximumDate(self.toDateEdit.date())
예제 #31
0
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.proxyModel = SortFilterProxyModel()
        self.proxyModel.setDynamicSortFilter(True)

        self.sourceGroupBox = QGroupBox("Original Model")
        self.proxyGroupBox = QGroupBox("Sorted/Filtered Model")

        self.sourceView = QTreeView()
        self.sourceView.setRootIsDecorated(False)
        self.sourceView.setAlternatingRowColors(True)

        self.proxyView = QTreeView()
        self.proxyView.setRootIsDecorated(False)
        self.proxyView.setAlternatingRowColors(True)
        self.proxyView.setModel(self.proxyModel)
        self.proxyView.setSortingEnabled(True)

        self.sortCaseSensitivityCheckBox = QCheckBox("Case sensitive sorting")
        self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter")

        self.filterPatternLineEdit = QLineEdit()
        self.filterPatternLabel = QLabel("&Filter pattern:")
        self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)

        self.filterSyntaxComboBox = QComboBox()
        self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp)
        self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard)
        self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString)
        self.filterSyntaxLabel = QLabel("Filter &syntax:")
        self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox)

        self.filterColumnComboBox = QComboBox()
        self.filterColumnComboBox.addItem("Signal Group")
        self.filterColumnComboBox.addItem("Signal Name")
        self.filterColumnComboBox.addItem("Unit")
        self.filterColumnLabel = QLabel("Filter &column:")
        self.filterColumnLabel.setBuddy(self.filterColumnComboBox)

        self.filterPatternLineEdit.textChanged.connect(
            self.filterRegExpChanged)
        self.filterSyntaxComboBox.currentIndexChanged.connect(
            self.filterRegExpChanged)
        self.filterColumnComboBox.currentIndexChanged.connect(
            self.filterColumnChanged)
        self.filterCaseSensitivityCheckBox.toggled.connect(
            self.filterRegExpChanged)
        self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged)

        sourceLayout = QHBoxLayout()
        sourceLayout.addWidget(self.sourceView)
        self.sourceGroupBox.setLayout(sourceLayout)

        proxyLayout = QGridLayout()
        proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
        proxyLayout.addWidget(self.filterPatternLabel, 1, 0)
        proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2)
        proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0)
        proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2)
        proxyLayout.addWidget(self.filterColumnLabel, 3, 0)
        proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2)
        proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2)
        proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2)
        self.proxyGroupBox.setLayout(proxyLayout)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.sourceGroupBox)
        mainLayout.addWidget(self.proxyGroupBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Basic Sort/Filter Model")
        self.resize(500, 450)

        self.proxyView.sortByColumn(SENDER, Qt.AscendingOrder)
        self.filterColumnComboBox.setCurrentIndex(SENDER)

        self.filterPatternLineEdit.setText("")
        self.filterCaseSensitivityCheckBox.setChecked(True)
        self.sortCaseSensitivityCheckBox.setChecked(True)

    def setSourceModel(self, model):
        self.proxyModel.setSourceModel(model)
        self.sourceView.setModel(model)

    def filterRegExpChanged(self):
        syntax_nr = self.filterSyntaxComboBox.itemData(
            self.filterSyntaxComboBox.currentIndex())
        syntax = QRegExp.PatternSyntax(syntax_nr)

        if self.filterCaseSensitivityCheckBox.isChecked():
            caseSensitivity = Qt.CaseSensitive
        else:
            caseSensitivity = Qt.CaseInsensitive

        regExp = QRegExp(self.filterPatternLineEdit.text(), caseSensitivity,
                         syntax)
        self.proxyModel.setFilterRegExp(regExp)

    def filterColumnChanged(self):
        self.proxyModel.setFilterKeyColumn(
            self.filterColumnComboBox.currentIndex())

    def sortChanged(self):
        if self.sortCaseSensitivityCheckBox.isChecked():
            caseSensitivity = Qt.CaseSensitive
        else:
            caseSensitivity = Qt.CaseInsensitive

        self.proxyModel.setSortCaseSensitivity(caseSensitivity)
예제 #32
0
class LootWizard(QMainWindow):

	def __init__(self):
		super (LootWizard, self).__init__()
		self.hide()
		self._upToDateMessage = 'is up-to-date'
		self.initUI()

	def kill_on_init(self):
		QTimer.singleShot(0, app.quit)

	def initUI(self):
		data_found = False
		try:
			self.__getFileinfo(sys.argv[1])
		except (IndexError, FileNotFoundError):
			directory = QStandardPaths.standardLocations(QStandardPaths.DocumentsLocation)[0]
			directory += "/My Games/Path of Exile"
			fname = QFileDialog.getOpenFileName(None, 'Open file', directory)
			if fname[0]:
				try:
					self.__getFileinfo(fname[0])
				except FileNotFoundError:
					pass
				else:
					data_found = True
		else:
			data_found = True
		if not data_found:
			self.kill_on_init()
		else:
			self.initWindowUI()

	def initWindowUI(self):
		self.resetButton = QPushButton("Reset")
		self.resetButton.setEnabled(False)
		self.resetButton.clicked.connect(self.reset)
		self.orphanButton = SquareButton("+")
		self.orphanButton.hide()
		self.overwriteButton = QPushButton("Overwrite")
		self.overwriteButton.setStyleSheet("background-color: #EFC795")
		self.overwriteButton.setEnabled(False)
		self.overwriteButton.clicked.connect(self.overwrite)
		self.forceCheckBox = QCheckBox("&Always inherit")
		self.forceCheckBox.setToolTip('Smartblocks inherit from virtual blockgroups.<br/>Check me to change from a <b>smartblock</b> parent.')
		self.forceCheckBox.hide()
		hbox = QHBoxLayout()
		hbox2 = QHBoxLayout()
		hbox2.addWidget(self.forceCheckBox)
		hbox.addLayout(hbox2)
		hbox.addWidget(self.orphanButton)
		hbox.addStretch(1)
		hbox.addWidget(self.overwriteButton)
		hbox.addWidget(self.resetButton)
		vbox = QVBoxLayout()
		self.setWindowTitle('Loot Wizard')
		self.view = QTreeView()
		self.setCentralWidget(QWidget())
		self.scrollLayout = QFormLayout()
		self.scrollWidget = QWidget()
		self.scrollWidget.setLayout(self.scrollLayout)
		self.orphanDialog = OrphanDialog(self)
		self.orphanButton.clicked.connect(self.openOrphans)
		vbox.addWidget(self.view)
		vbox.addLayout(hbox)
		self.scrollLayout.addRow(self.view)
		self.centralWidget().setLayout(vbox)
		self.model = SmartblockModel(self.file_content, self)
		self.statusBar().showMessage(self.file_info.fileName() + ' ' + self._upToDateMessage)
		self.forceCheckBox.stateChanged.connect(self.switchforce)
		self.view.setModel(self.model)
		self.view.expandAll()
		self.view.setAlternatingRowColors(True)
		self.resize(300, 600)
		self.show()

	def inform(self, flag, external_call = False, end_process = False):
		reset_flag = False # hidden first
		if flag:
			if external_call:
				message = 'has non-updated changes'
			else:
				message = 'has changed'
				reset_flag = True
		else:
			if end_process:
				message = 'is saved'
			else:
				message = self._upToDateMessage
		self.statusBar().showMessage(self.file_info.fileName() + ' ' + message)
		self.resetButton.setEnabled(reset_flag)
		self.overwriteButton.setEnabled(flag)

	def displayOrphan(self, display = True):
		# self.displayButton(self.orphanButton, display)
		pass

	def displayInheritance(self, display = True):
		self.displayButton(self.forceCheckBox, display)

	def displayButton(self, btn, display = True):
		if display:
			btn.show()
		else:
			btn.hide()

	def switchforce(self, state):
		self.model.forceInheritance = state == Qt.Checked

	def overwrite(self):
		self.overwriteButton.setEnabled(False)
		self.resetButton.setEnabled(False) # TODO: disable from elsewhere ?!
		if self.model.save(self.file_info.absoluteFilePath()):
			self.inform(False, False, True)

	def reset(self):
		self.model.resetStatus()

	def __getFileinfo(self, filename):
		self.file_content = ''.join(fileinput.input(filename))
		self.file_info = QFileInfo(filename)

	def openOrphans(self):
		self.orphanDialog.show()
예제 #33
0
class TestDialog(QDialog):
    def __init__(self, data):

        super(TestDialog, self).__init__()

        self.data = copy.deepcopy(data)

        # Layout
        btOk = QPushButton("OK")
        btCancel = QPushButton("Cancel")
        self.tree = QTreeView()
        hbox = QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(btOk)
        hbox.addWidget(btCancel)
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)
        vbox.addWidget(self.tree)
        self.setLayout(vbox)
        self.setGeometry(300, 300, 600, 400)

        # Button signals
        btCancel.clicked.connect(self.reject)
        btOk.clicked.connect(self.accept)

        # Tree view
        self.tree.setModel(QStandardItemModel())
        self.tree.setAlternatingRowColors(True)
        self.tree.setSortingEnabled(True)
        self.tree.setHeaderHidden(False)
        self.tree.setSelectionBehavior(QAbstractItemView.SelectItems)

        self.tree.model().setHorizontalHeaderLabels(['Parameter', 'Value'])

        for x in self.data:
            if not self.data[x]:
                continue
            parent = QStandardItem(x)
            parent.setFlags(QtCore.Qt.NoItemFlags)
            for y in self.data[x]:
                value = self.data[x][y]
                child0 = QStandardItem(y)
                child0.setFlags(QtCore.Qt.NoItemFlags
                                | QtCore.Qt.ItemIsEnabled)
                child1 = QStandardItem(repr(value))
                child1.setFlags(QtCore.Qt.ItemIsEnabled
                                | QtCore.Qt.ItemIsEditable
                                | ~QtCore.Qt.ItemIsSelectable)
                parent.appendRow([child0, child1])
            self.tree.model().appendRow(parent)

        self.tree.expandAll()
        self.tree.model().itemChanged.connect(self.handleItemChanged)

    def get_data(self):
        return self.data

    def handleItemChanged(self, item):
        parent = self.data[item.parent().text()]
        key = item.parent().child(item.row(), 0).text()
        parent[key] = eval(item.text())
예제 #34
0
class App(QWidget):
    PROC_ID, PROC_NAME, PROC_USER, PROC_CPU, PROC_MEM, = range(5)

    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 PROC LIST'
        self.left = 20
        self.top = 20
        self.width = 640
        self.height = 840
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.dataGroupBox = QGroupBox("ps")
        self.dataView = QTreeView()
        self.dataView.setRootIsDecorated(False)
        self.dataView.setAlternatingRowColors(True)
        self.btn = QPushButton(self)
        self.btn.setText("Refresh")
        dataLayout = QHBoxLayout()
        dataLayout.addWidget(self.dataView)
        dataLayout.addWidget(self.btn)
        self.dataGroupBox.setLayout(dataLayout)

        self.model = self.createProcModel(self)
        self.dataView.setModel(self.model)
        #for proc in psutil.process_iter():
        #    self.addProc(model, proc.pid, proc.name(), proc.cpu_percent(), proc.memory_percent())
        self.btn.clicked.connect(self.add_procs)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.dataGroupBox)
        self.setLayout(mainLayout)

        self.show()

    def createProcModel(self, parent):
        model = QStandardItemModel(0, 5, parent)
        model.setHeaderData(self.PROC_ID, Qt.Horizontal, "PID")
        model.setHeaderData(self.PROC_NAME, Qt.Horizontal, "Name")
        model.setHeaderData(self.PROC_USER, Qt.Horizontal, "USER")
        model.setHeaderData(self.PROC_CPU, Qt.Horizontal, "CPU%")
        model.setHeaderData(self.PROC_MEM, Qt.Horizontal, "MEM%")
        return model

    def addProc(self, model, process_id, process_name, proc_cpu, proc_mem):
        model.insertRow(0)
        model.setData(model.index(0, self.PROC_ID), process_id)
        model.setData(model.index(0, self.PROC_NAME), process_name)
        model.setData(model.index(0, self.PROC_CPU), proc_cpu)
        model.setData(model.index(0, self.PROC_MEM), proc_mem)

    def add_procs(self):
        if (self.model.hasChildren()):
            self.model.removeRows(0, self.model.rowCount())
        for proc in psutil.process_iter():
            self.model.insertRow(0)
            self.model.setData(self.model.index(0, self.PROC_ID), proc.pid)
            self.model.setData(self.model.index(0, self.PROC_NAME),
                               proc.name())
            self.model.setData(self.model.index(0, self.PROC_USER),
                               proc.username())
            self.model.setData(self.model.index(0, self.PROC_CPU),
                               proc.cpu_percent())
            self.model.setData(self.model.index(0, self.PROC_MEM),
                               proc.memory_percent())
예제 #35
0
class FileTreeView(QWidget):
    on_menu_select = pyqtSignal(str, str)
    on_dir_change = pyqtSignal()

    def __init__(self, parent: Application):
        super().__init__()
        self.stopped = threading.Event()
        self.tree = QTreeView()
        self.handle = self.Handler(self)
        self.get_data_file()
        self.model = QtGui.QStandardItemModel()
        self.item_construct = {}

        v_box = QVBoxLayout()
        v_box.addWidget(self.finder())
        v_box.addWidget(self.tree_view())
        self.setLayout(v_box)
        self.watch_dog()
        parent.app_close.connect(self.exit_push)

        self.tree.setAlternatingRowColors(True)

    def exit_push(self):
        self.stopped.set()

    def finder(self):
        w_find = QLineEdit()
        w_find.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed))
        w_find.textChanged.connect(self.sort_list)
        w_find.setPlaceholderText("Search file..")

        return w_find

    def sort_list(self, text):
        list_sort = []
        if text == "":
            self.show_tree(self.list_file)
        else:
            for data in self.list_file:
                if text.lower() in data.name().lower():
                    list_sort.append(data)
            self.show_tree(list_sort)

    def watch_dog(self):
        watch = ProcessRunnable(target=watch_winform,
                                args=(get_data_folder(), self.handle,
                                      self.stopped))
        watch.start()

    class Handler(watchdog.events.PatternMatchingEventHandler):
        def __init__(self, parent):
            super().__init__()
            self.parent = parent

        def on_created(self, event):
            print("Watchdog received created event", event.src_path, sep=" : ")
            asyncio.run(
                self.parent.file_change('create', event.src_path,
                                        event.is_directory))

        def on_modified(self, event):
            print("Watchdog received modified event",
                  event.src_path,
                  sep=" : ")
            asyncio.run(
                self.parent.file_change('modify', event.src_path,
                                        event.is_directory))

        def on_moved(self, event):
            print("Watchdog received move event",
                  event.src_path,
                  event.dest_path,
                  sep=" : ")
            asyncio.run(
                self.parent.file_change('move', event.src_path,
                                        event.is_directory, event.dest_path))

        def on_deleted(self, event):
            print("Watchdog received delete event", event.src_path, sep=" : ")
            asyncio.run(
                self.parent.file_change('delete', event.src_path,
                                        event.is_directory))

    async def file_change(self, tpe, old, is_directory, new=""):
        if tpe == "move":
            self.import_single(self.model.invisibleRootItem(), new)
            self.remove_single(old)
        elif tpe == "delete":
            self.remove_single(old)
        elif tpe == "create":
            self.import_single(self.model.invisibleRootItem(), old)

        if is_directory:
            self.on_dir_change.emit()

    def get_data_file(self):
        self.list_file = []
        self.create_list(get_data_folder())

    def create_list(self, dir):
        lst = os.listdir(path=dir)
        for f in lst:
            path = os.path.join(dir, f)
            file = MyFile()
            if os.path.isdir(path):
                file.setParentName(os.path.basename(dir))
                file.setParent(dir)
                file.setName(f)
                file.setDir(True)
                self.list_file.append(file)
                self.create_list(path)
            else:
                file.setParentName(os.path.basename(dir))
                file.setParent(dir)
                file.setName(f)
                file.setDir(False)
                self.list_file.append(file)

    def tree_view(self):
        self.tree.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))

        self.tree.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tree.customContextMenuRequested.connect(self.open_menu)
        self.tree.doubleClicked.connect(self.open_event)
        # self.model.itemChanged.connect(self.data_change)
        self.tree.setModel(self.model)
        self.show_tree(self.list_file)
        return self.tree

    def show_tree(self, list_file):
        self.model.clear()
        self.model.setHorizontalHeaderLabels(['List API'])
        self.tree.header().setDefaultSectionSize(180)
        parent = self.model.invisibleRootItem()
        self.item_construct = {}
        self.import_data(parent, list_file)
        self.tree.expandAll()

    def import_data_by_path(self, parent, path: list, index):
        if index < len(path):
            full = os.sep.join(path[:index + 1])
            if full in self.item_construct:
                item = self.item_construct[full]
            else:
                item = QStandardItem(path[index])
                if os.path.isfile(os.path.join(get_data_folder(), full)):
                    item.setToolTip(
                        self.read_description(
                            os.path.join(get_data_folder(), full)))
                item.setEditable(False)
                if not os.path.isdir(os.path.join(get_data_folder(), full)):
                    item.setIcon(QIcon(get_icon_link("text_snippet.svg")))
                else:
                    item.setIcon(QIcon(get_icon_link("folder_yellow.svg")))

                item.setData(full)
                parent.appendRow(item)
                self.item_construct[full] = item

            self.import_data_by_path(item, path, index + 1)

    def read_description(self, path):
        try:
            data = json.loads(open(path, encoding='utf-8').read())
            json_data = APIData()
            json_data.construct(data)
            x = json_data.parseSave().description()
            if x.isspace() or x == "":
                return ".."
            else:
                return x
        except Exception as ex:
            print(ex)
            return ".."

    def import_data(self, parent, list_data):
        for i in list_data:
            self.import_single(parent, i)

    def import_single(self, parent, file_path):
        path = self.path_extract(file_path)
        self.import_data_by_path(parent, path, 0)

    def remove_single(self, file_path):
        path = self.path_extract(file_path)
        full = os.sep.join(path[:len(path)])
        if full in self.item_construct:
            item = self.item_construct[full]
            (item.parent()
             or self.model.invisibleRootItem()).removeRow(item.row())
            del self.item_construct[full]

    def path_extract(self, file_path):
        if isinstance(file_path, MyFile):
            path = os.path.join(file_path.parent(), file_path.name())
        else:
            path = file_path

        path = path.replace(get_data_folder(), "")
        if path.startswith(os.sep):
            path = path.replace(os.sep, "", 1)
        path = path.split(os.sep)
        return path

    def open_menu(self, position):
        indexes = self.tree.selectedIndexes()
        level = 0
        data = ""
        item = None
        if len(indexes) > 0:
            index = indexes[0]
            item = self.model.itemFromIndex(index)
            data = item.data()
            data = os.path.join(get_data_folder(), data)
            if os.path.isdir(data):
                level = 1
            else:
                level = 2

        menu = QMenu()
        menu.setStyleSheet(open(get_stylesheet()).read())

        rename_action = QAction(QIcon(get_icon_link('edit.svg')), '&Rename',
                                self)
        rename_action.setStatusTip('Rename')

        new_action = QAction(QIcon(get_icon_link('create_new_folder.svg')),
                             '&New Folder', self)
        new_action.setStatusTip('New Folder')

        refresh_action = QAction(QIcon(get_icon_link('refresh.svg')),
                                 '&Refresh', self)
        refresh_action.setStatusTip('Refresh')

        delete_action = QAction(QIcon(get_icon_link('delete_forever.svg')),
                                '&Delete', self)
        delete_action.setStatusTip('Delete')

        open_action = QAction(QIcon(get_icon_link('open_in_new.svg')), '&Open',
                              self)
        open_action.setStatusTip('Open file')

        expand_action = QAction(QIcon(), '&Expand', self)
        expand_action.setStatusTip('Expand')

        collapse_action = QAction(QIcon(), '&Collapse', self)
        collapse_action.setStatusTip('Collapse')

        duplicate_action = QAction(QIcon(get_icon_link('content_copy.svg')),
                                   '&Duplicate', self)
        duplicate_action.setStatusTip('Duplicate')

        copy_action = QAction(QIcon(get_icon_link('content_copy.svg')),
                              '&Copy', self)
        copy_action.setStatusTip('Copy')

        move_action = QAction(QIcon(get_icon_link('zoom_out_map.svg')),
                              '&Move', self)
        move_action.setStatusTip('Move')

        if level == 1:
            menu.addAction(rename_action)
            menu.addAction(new_action)
            menu.addSeparator()
            menu.addAction(refresh_action)
            menu.addAction(expand_action)
            menu.addAction(collapse_action)
            menu.addSeparator()
            menu.addAction(delete_action)
        elif level == 2:
            menu.addAction(open_action)
            menu.addAction(new_action)
            menu.addAction(refresh_action)
            menu.addSeparator()
            menu.addAction(rename_action)
            menu.addAction(duplicate_action)
            menu.addAction(copy_action)
            menu.addAction(move_action)
            menu.addSeparator()
            menu.addAction(delete_action)
        else:
            menu.addAction(new_action)
            menu.addAction(refresh_action)

        action = menu.exec_(self.tree.viewport().mapToGlobal(position))

        if action == open_action:
            if data != "":
                self.on_menu_select.emit("open", data)
        elif action == refresh_action:
            self.get_data_file()
            self.show_tree(self.list_file)
        elif action == expand_action:
            if item is not None:
                self.tree.expand(item.index())
        elif action == collapse_action:
            if item is not None:
                self.tree.collapse(item.index())
        elif action == delete_action:
            if data != "":
                msg = QMessageBox()
                msg.setStyleSheet(open(get_stylesheet()).read())
                msg.setIcon(QMessageBox.Warning)
                msg.setBaseSize(QSize(500, 300))
                msg.setText("Delete file.")
                msg.setInformativeText("Are you sure to detele " +
                                       os.path.basename(data) + "?")
                msg.setWindowTitle("Delete Warning!!!")
                msg.addButton('Delete', QMessageBox.YesRole)
                msg.addButton('Move to Trash', QMessageBox.YesRole)
                msg.addButton('Cancel', QMessageBox.NoRole)

                rs = msg.exec_()
                if rs == 0:
                    if os.path.isdir(data):
                        shutil.rmtree(data)
                    else:
                        os.remove(data)
                elif rs == 1:
                    send2trash(data)
        elif action == new_action:
            if data == "":
                data = get_data_folder()
            # input_name = QInputDialog()
            # input_name.setStyleSheet(open(get_stylesheet()).read())
            # text, ok = input_name.getText(self, 'New Folder', 'Folder name:')
            inp = QComboDialog('New Folder', 'Folder name:', QComboDialog.Text)
            ok = inp.exec_()
            if ok and inp.select:
                if os.path.isdir(data):
                    try:
                        os.mkdir(os.path.join(data, inp.select))
                    except Exception as ex:
                        alert = Alert("Error", "Create folder error", str(ex))
                        alert.exec_()
                        print(ex)
                else:
                    new = os.path.join(os.path.dirname(data), inp.select)
                    try:
                        os.mkdir(new)
                    except Exception as ex:
                        alert = Alert("Error", "Create folder error", str(ex))
                        alert.exec_()
                        print(ex)
        elif action == rename_action:
            if data != "":
                # input_name = QInputDialog()
                # input_name.setStyleSheet(open(get_stylesheet()).read())
                # text, ok = input_name.getText(self, 'Rename file', 'New name:')
                inp = QComboDialog('Rename file', 'New name:',
                                   QComboDialog.Text)
                ok = inp.exec_()
                if ok and inp.select:
                    if os.path.isdir(data):
                        new = os.path.join(os.path.dirname(data), inp.select)
                        try:
                            os.rename(data, new)
                        except Exception as ex:
                            alert = Alert("Error", "Rename folder error",
                                          str(ex))
                            alert.exec_()
                            print(ex)
                    else:
                        filename, file_extension = os.path.splitext(data)
                        new = os.path.join(os.path.dirname(data),
                                           inp.select + file_extension)
                        try:
                            os.rename(data, new)
                        except Exception as ex:
                            alert = Alert("Error", "Rename file error",
                                          str(ex))
                            alert.exec_()
                            print(ex)
        elif action == move_action:
            if data != "":
                items = get_list_folder(get_data_folder(), get_data_folder())
                #
                # item, ok = QInputDialog.getItem(self, "Select folder dialog",
                #                                 "Select the destination folder", items, 0, False)

                inp = QComboDialog("Move", "Select the destination folder",
                                   QComboDialog.ComboBox, items)
                ok = inp.exec_()

                if ok and inp.select:
                    folder = inp.select
                    if inp.select.startswith(os.sep):
                        folder = inp.select.replace(os.sep, "", 1)
                    new = os.path.join(get_data_folder(), folder,
                                       os.path.basename(data))
                    try:
                        os.rename(data, new)
                    except Exception as ex:
                        alert = Alert("Error", "Move file error", str(ex))
                        alert.exec_()
                        print(ex)
        elif action == duplicate_action:
            if data != "":
                # input_name = QInputDialog()
                # input_name.setStyleSheet(open(get_stylesheet()).read())
                # text, ok = input_name.getText(self, 'Duplicate file', 'New name:')
                inp = QComboDialog('Duplicate file', 'New name:',
                                   QComboDialog.Text)
                filename, file_extension = os.path.splitext(data)
                inp.set_init_text(filename)
                ok = inp.exec_()
                if ok and inp.select:
                    new = os.path.join(os.path.dirname(data),
                                       inp.select + file_extension)
                    try:
                        copyfile(data, new)
                    except Exception as ex:
                        alert = Alert("Error", "Duplicate file error", str(ex))
                        alert.exec_()
                        print(ex)
        elif action == copy_action:
            if data != "":
                items = get_list_folder(get_data_folder(), get_data_folder())
                inp = QComboDialog("Copy", "Select the destination folder",
                                   QComboDialog.ComboBox, items)
                ok = inp.exec_()
                # item, ok = QInputDialog.getItem(self, "Select folder dialog",
                #                                 "Select the destination folder", items, 0, False)

                if ok and inp.select:
                    folder = inp.select
                    if inp.select.startswith(os.sep):
                        folder = inp.select.replace(os.sep, "", 1)
                    new = os.path.join(get_data_folder(), folder,
                                       os.path.basename(data))
                    try:
                        copyfile(data, new)
                    except Exception as ex:
                        alert = Alert("Error", "Copy file error", str(ex))
                        alert.exec_()
                        print(ex)

    def open_event(self, index):
        item = self.model.itemFromIndex(index)
        if item is not None:
            data = item.data()
            data = os.path.join(get_data_folder(), data)
            if os.path.isdir(data):
                level = 1
            else:
                level = 2
            if data != "":
                if level == 2:
                    self.on_menu_select.emit("open", data)
                elif level == 1:
                    if not self.tree.isExpanded(item.index()):
                        self.tree.collapse(item.index())
                    else:
                        self.tree.expand(item.index())
예제 #36
0
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.proxyModel = SortFilterProxyModel()
        self.proxyModel.setDynamicSortFilter(True)

        self.sourceGroupBox = QGroupBox("Original Model")
        self.proxyGroupBox = QGroupBox("Sorted/Filtered Model")

        self.sourceView = QTreeView()
        self.sourceView.setRootIsDecorated(False)
        self.sourceView.setAlternatingRowColors(True)

        self.proxyView = QTreeView()
        self.proxyView.setRootIsDecorated(False)
        self.proxyView.setAlternatingRowColors(True)
        self.proxyView.setModel(self.proxyModel)
        self.proxyView.setSortingEnabled(True)

        self.sortCaseSensitivityCheckBox = QCheckBox("Case sensitive sorting")
        self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter")

        self.filterPatternLineEdit = QLineEdit()
        self.filterPatternLabel = QLabel("&Filter pattern:")
        self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)

        self.filterSyntaxComboBox = QComboBox()
        self.filterSyntaxComboBox.addItem("Regular expression", QRegExp.RegExp)
        self.filterSyntaxComboBox.addItem("Wildcard", QRegExp.Wildcard)
        self.filterSyntaxComboBox.addItem("Fixed string", QRegExp.FixedString)
        self.filterSyntaxLabel = QLabel("Filter &syntax:")
        self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox)

        self.filterColumnComboBox = QComboBox()
        self.filterColumnComboBox.addItem("Subject")
        self.filterColumnComboBox.addItem("Sender")
        self.filterColumnComboBox.addItem("Date")
        self.filterColumnLabel = QLabel("Filter &column:")
        self.filterColumnLabel.setBuddy(self.filterColumnComboBox)

        self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged)
        self.filterSyntaxComboBox.currentIndexChanged.connect(self.filterRegExpChanged)
        self.filterColumnComboBox.currentIndexChanged.connect(self.filterColumnChanged)
        self.filterCaseSensitivityCheckBox.toggled.connect(self.filterRegExpChanged)
        self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged)

        sourceLayout = QHBoxLayout()
        sourceLayout.addWidget(self.sourceView)
        self.sourceGroupBox.setLayout(sourceLayout)

        proxyLayout = QGridLayout()
        proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
        proxyLayout.addWidget(self.filterPatternLabel, 1, 0)
        proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2)
        proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0)
        proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2)
        proxyLayout.addWidget(self.filterColumnLabel, 3, 0)
        proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2)
        proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2)
        proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2)
        self.proxyGroupBox.setLayout(proxyLayout)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.sourceGroupBox)
        mainLayout.addWidget(self.proxyGroupBox)
        self.setLayout(mainLayout)

        self.setWindowTitle("Basic Sort/Filter Model")
        self.resize(500, 450)

        self.proxyView.sortByColumn(SENDER, Qt.AscendingOrder)
        self.filterColumnComboBox.setCurrentIndex(SENDER)

        self.filterPatternLineEdit.setText("Andy|Grace")
        self.filterCaseSensitivityCheckBox.setChecked(True)
        self.sortCaseSensitivityCheckBox.setChecked(True)

    def setSourceModel(self, model):
        self.proxyModel.setSourceModel(model)
        self.sourceView.setModel(model)

    def filterRegExpChanged(self):
        syntax_nr = self.filterSyntaxComboBox.itemData(self.filterSyntaxComboBox.currentIndex())
        syntax = QRegExp.PatternSyntax(syntax_nr)

        if self.filterCaseSensitivityCheckBox.isChecked():
            caseSensitivity = Qt.CaseSensitive
        else:
            caseSensitivity = Qt.CaseInsensitive

        regExp = QRegExp(self.filterPatternLineEdit.text(),
                caseSensitivity, syntax)
        self.proxyModel.setFilterRegExp(regExp)

    def filterColumnChanged(self):
        self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex())

    def sortChanged(self):
        if self.sortCaseSensitivityCheckBox.isChecked():
            caseSensitivity = Qt.CaseSensitive
        else:
            caseSensitivity = Qt.CaseInsensitive

        self.proxyModel.setSortCaseSensitivity(caseSensitivity)
예제 #37
0
if __name__ == '__main__':
    from timeit import default_timer

    app = QApplication(sys.argv)

    t = default_timer()
    items = []
    for i in range(9999):
        item = TreeItem(f'root_{i:04}')
        items.append(item)

        for j in range(10):
            child = item.appendChild(f'item__{i:04}/{j}')

            for k in range(10):
                child.appendChild(f'item__{i:04}/{j}/{k}')
    print(f'Elapsed time: {default_timer() - t:.2f} secs')

    model = TreeModel()
    model.setModelData(items)

    view = QTreeView()
    view.setWindowTitle("Simple Tree Model")
    view.setAlternatingRowColors(True)
    view.setUniformRowHeights(True)  # Allows for scrolling optimizations.
    view.setModel(model)
    view.show()

    sys.exit(app.exec_())