Esempio n. 1
0
    def _SetupUI(self):
        main_layout = QVBoxLayout()
        search_filter_widget = QWidget()
        search_filter_layout = QHBoxLayout(search_filter_widget)
        central_widget = QWidget()
        central_layout = QVBoxLayout(central_widget)

        panel_splitter = QSplitter(Qt.Horizontal)
        panel_splitter.setHandleWidth(4)
        panel_splitter.addWidget(self._source_panel)
        panel_splitter.addWidget(central_widget)
        panel_splitter.setStretchFactor(0, 0)
        panel_splitter.setStretchFactor(1, 1)
        panel_splitter.moveSplitter(LEFT_PANEL_WIDTH, 1)
        panel_splitter.setSizePolicy(QSizePolicy.Expanding,
                                     QSizePolicy.Expanding)

        search_filter_layout.addWidget(self._search_bar)
        search_filter_layout.addWidget(self._filter_bar)
        search_filter_layout.setContentsMargins(0, 0, 0, 0)

        central_layout.addWidget(search_filter_widget)
        central_layout.addWidget(self._splitter)
        central_layout.addWidget(self._status_bar)
        central_layout.setContentsMargins(0, 0, 0, 0)

        main_layout.addWidget(panel_splitter)
        self.setLayout(main_layout)
Esempio n. 2
0
    def home(self):
        """
        Add the GUI elements to the window that represent the home state of the application.
        """
        toolbar = self.addToolBar("File")
        save = QAction(QIcon("res/icon_save.png"), "Save", self)
        save.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_S))
        toolbar.addAction(save)
        load = QAction(QIcon("res/icon_load.png"), "Load", self)
        load.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_O))
        toolbar.addAction(load)
        toolbar.addSeparator()
        undo = QAction(QIcon("res/icon_undo.png"), "Undo", self)
        undo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Z))
        toolbar.addAction(undo)
        redo = QAction(QIcon("res/icon_redo.png"), "Redo", self)
        redo.setShortcut(QKeySequence(Qt.CTRL + Qt.Key_Y))
        toolbar.addAction(redo)
        toolbar.addSeparator()
        zoom_in = QAction(QIcon("res/icon_zoom_in.png"), "Zoom In", self)
        toolbar.addAction(zoom_in)
        zoom_out = QAction(QIcon("res/icon_zoom_out.png"), "Zoom Out", self)
        toolbar.addAction(zoom_out)
        toolbar.addSeparator()
        clear = QAction(QIcon("res/icon_clear.png"), "Clear", self)
        toolbar.addAction(clear)
        toolbar.addSeparator()
        grid = QAction(QIcon("res/icon_grid.png"), "Grid", self)
        toolbar.addAction(grid)
        toolbar.actionTriggered[QAction].connect(self.toolbar_pressed)

        splitter = QSplitter(self)
        splitter.setOrientation(Qt.Vertical)
        splitter.setHandleWidth(16)

        self.tile_ed = TileEd(self.size, self.tile_size, self.pixmap, self)
        scroll_area_tile_ed = QScrollArea()
        scroll_area_tile_ed.setBackgroundRole(QPalette.Dark)
        scroll_area_tile_ed.setWidgetResizable(True)
        scroll_area_tile_ed.setWidget(self.tile_ed)

        splitter.addWidget(scroll_area_tile_ed)

        self.tile_sel = TileSelector(self.tile_size, self.pixmap, self)
        scroll_area_tile_sel = QScrollArea()
        scroll_area_tile_sel.setBackgroundRole(QPalette.Dark)
        scroll_area_tile_sel.setWidgetResizable(True)
        scroll_area_tile_sel.setWidget(self.tile_sel)

        splitter.addWidget(scroll_area_tile_sel)
        self.setCentralWidget(splitter)
    def _setup(self):
        self.serial_input = SerialInputGui()
        self.serial_device = SerialDevicesGui()
        self.serial_monitor = SerialMonitorGui(self)

        hsplitter = QSplitter()
        hsplitter.setRubberBand(-1)
        hsplitter.setHandleWidth(10)
        hsplitter.setOrientation(Qt.Horizontal)
        hsplitter.addWidget(self.serial_monitor)
        hsplitter.addWidget(self.serial_device)

        vsplitter = QSplitter()
        vsplitter.setRubberBand(-1)
        vsplitter.setHandleWidth(10)
        vsplitter.setOrientation(Qt.Vertical)
        vsplitter.addWidget(hsplitter)
        vsplitter.addWidget(self.serial_input)

        self.layout.addWidget(vsplitter, 0, 0, 1, 1)
Esempio n. 4
0
    def __init__(self, *args, **kwargs):
        super(ExchangeSpiderUI, self).__init__(*args, **kwargs)
        layout = QVBoxLayout()
        layout.setContentsMargins(QMargins(2, 0, 2, 1))
        main_splitter = QSplitter(self)
        main_splitter.setHandleWidth(1)
        self.tree_widget = ExchangeLibTree(self)
        main_splitter.addWidget(self.tree_widget)

        action_splitter = QSplitter(Qt.Vertical, self)
        action_splitter.setHandleWidth(1)

        spider_widget = QWidget(self)
        spider_widget.setAutoFillBackground(True)
        palette = QPalette()
        pix = QPixmap("images/spider_bg.png")
        pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio)
        palette.setBrush(QPalette.Background, QBrush(pix))
        spider_widget.setPalette(palette)

        spider_layout = QVBoxLayout()

        tips_layout = QHBoxLayout()
        tips_layout.setSpacing(1)
        tips_layout.addWidget(QLabel("当前交易所:", self))
        self.spider_exchange_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.spider_exchange_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("当前操作:", self))
        self.spider_action_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.spider_action_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("选择日期:", self))
        self.spider_date_edit = QDateEdit(QDate.currentDate(), self)
        self.spider_date_edit.setCalendarPopup(True)
        self.spider_date_edit.setDisplayFormat("yyyy-MM-dd")
        tips_layout.addWidget(self.spider_date_edit)

        tips_layout.addWidget(QLabel(self))
        self.spider_start_button = QPushButton("开始", self)
        tips_layout.addWidget(self.spider_start_button)
        tips_layout.addStretch()

        spider_layout.addLayout(tips_layout)

        self.spider_status = QLabel("等待开始抓取", self)
        self.spider_status.setWordWrap(True)
        self.spider_status.setAlignment(Qt.AlignCenter)

        spider_layout.addWidget(self.spider_status)

        spider_widget.setLayout(spider_layout)

        action_splitter.addWidget(spider_widget)

        # 解析部分
        parser_widget = QWidget(self)
        parser_widget.setAutoFillBackground(True)
        palette = QPalette()
        pix = QPixmap("images/parser_bg.png")
        pix = pix.scaled(QSize(700, 700), Qt.KeepAspectRatio)
        palette.setBrush(QPalette.Background, QBrush(pix))
        parser_widget.setPalette(palette)

        parser_layout = QVBoxLayout()

        tips_layout = QHBoxLayout()
        tips_layout.setSpacing(1)
        tips_layout.addWidget(QLabel("当前交易所:", self))
        self.parser_exchange_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.parser_exchange_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("当前操作:", self))
        self.parser_action_button = QPushButton("未选择", self)
        tips_layout.addWidget(self.parser_action_button)

        tips_layout.addWidget(QLabel(self))
        tips_layout.addWidget(QLabel("选择日期:", self))
        self.parser_date_edit = QDateEdit(QDate.currentDate(), self)
        self.parser_date_edit.setCalendarPopup(True)
        self.parser_date_edit.setDisplayFormat("yyyy-MM-dd")
        tips_layout.addWidget(self.parser_date_edit)

        tips_layout.addWidget(QLabel(self))
        self.parser_start_button = QPushButton("开始", self)
        tips_layout.addWidget(self.parser_start_button)
        tips_layout.addStretch()

        parser_layout.addLayout(tips_layout)

        self.parser_status = QLabel("等待开始解析", self)
        self.parser_status.setAlignment(Qt.AlignCenter)
        parser_layout.addWidget(self.parser_status)

        parser_widget.setLayout(parser_layout)

        action_splitter.addWidget(parser_widget)

        main_splitter.addWidget(action_splitter)

        main_splitter.setStretchFactor(0, 4)
        main_splitter.setStretchFactor(1, 6)

        layout.addWidget(main_splitter)
        self.setLayout(layout)

        main_splitter.setObjectName("mainSplitter")
        action_splitter.setObjectName("actionSplitter")

        self.spider_exchange_button.setObjectName("tipButton")
        self.spider_action_button.setObjectName("tipButton")
        self.spider_status.setObjectName("spiderStatus")

        self.parser_exchange_button.setObjectName("tipButton")
        self.parser_action_button.setObjectName("tipButton")
        self.parser_status.setObjectName("parserStatus")

        self.setStyleSheet(
            "#mainSplitter::handle{background-color:rgba(50,50,50,100)}"
            "#actionSplitter::handle{background-color:rgba(50,50,50,100)}"
            "#tipButton{border:none;color:rgb(220,100,100)}"
            "#spiderStatus,#parserStatus{font-size:16px;font-weight:bold;color:rgb(230,50,50)}"
        )
Esempio n. 5
0
class MainView(QWidget):
    def __init__(self):
        """
        MainView of the application, contains three Widgets divided by splitters
        from the left:
        GroupView containg all groups info
        FeedView containg all feed
        ArticleBox containg selected article and its content
        """
        super().__init__()
        self.selected_group = None
        self.group_view = GroupView(self)
        self.feed_view = FeedView(self)
        self.article_box = ArticleBox(self)
        self.feed_view.selectionModel().selectionChanged.connect(
            self.set_article)
        self.group_view.itemClicked.connect(
            lambda: self.refresh_feed(self.group_view.selectedItems()[0]))
        self.refresh_groups()
        all_group = self.group_view.groups["All"]
        all_group.setExpanded(True)
        self.refresh_feed(self.group_view.groups["All"])
        self.__split = QSplitter(parent=self)
        self.__split.addWidget(self.group_view)
        self.__split.addWidget(self.feed_view)
        self.__split.addWidget(self.article_box)
        self.__split.setHandleWidth(4)
        self.__main_layout = QHBoxLayout()
        self.__main_layout.addWidget(self.__split)
        self.setLayout(self.__main_layout)

    def get_user_groups(self, update=False):
        """
        Load all user groups from database to gui

        Args:
            update (bool, optional): Enforces selecting group to the first group, Defaults to False.
        """
        group_dict = self.entry["groups"]
        active_exists = False
        popular_name = URLHandler.popular_name
        self.group_view.clear()
        if popular_name in group_dict:
            self.get_single_group(group_dict, popular_name)
            group_dict.pop(popular_name)
        for group in group_dict:
            active_exists = self.get_single_group(group_dict, group)
        ix = self.group_view.model().index(0, 0)
        if not active_exists or update:
            self.group_view.selectionModel().setCurrentIndex(
                ix, QItemSelectionModel.SelectCurrent)
            self.group_view.expand(ix)

    def get_single_group(self, group_dict, group):
        """
        Add single group to group view, returns active groups

        Args:
            group_dict (dict): dictionary of user groups from database
            group (string): group name

        Returns:
            bool: true if selected group is the group that is being added
        """
        active_exists = False
        indexes = group_dict[group]
        urls = []
        if self.selected_group == group:
            active_exists = True
        for index in indexes:
            urls.append(self.entry['urls'][index]["actual_url"])
        self.group_view.add_group(group, urls, indexes)
        return active_exists

    def set_group(self, item, update=False):
        """
        Sets group to provided in item arg
        If update is set to True group will update even if it is not currenlt selected,
        used for refreshing

        Args:
            item (QItem): selected group 
            update (bool, optional): Enforces group update, Defaults to False.
        """
        if (self.selected_group != item.text(0) or update):
            self.feed_view.clear_list()
            self.selected_group = item.text(0)
            art_list = []
            if item.rss_type == "group":
                for url_name in self.group_view.urls:
                    if item.text(0) in url_name:
                        sub_item = self.group_view.urls[url_name]
                        url = self.entry['urls'][sub_item.url_index]
                        art_list.extend(self.get_gui_articles(url))
            elif item.rss_type == "url":
                url = self.entry['urls'][item.url_index]
                art_list.extend(self.get_gui_articles(url))
            art_list = sorted(art_list,
                              key=lambda x: (not x["seen"], x["date"]))
            for article in art_list:
                self.feed_view.append_message(**article)

    def get_gui_articles(self, url):
        """
        Returns all articles from selected url

        Args:
            url (string): url

        Returns:
            list: list of article objects
        """
        site = url["rss_title"]
        art_list = []
        for article in url["articles"]:
            article_bundle = {
                "date": article["pub_date_parsed"],
                "title": article["title"],
                "desc": article["desc"],
                "seen": article["seen"],
                "link": article["link"],
                "site": site,
            }
            art_list.append(article_bundle)
        return art_list

    def set_article(self, current):
        """
        Sets selected article to seen and updates data of articlebox
        to view newest content

        Args:
            current (QItem): item conteining row with selected article
        """
        row = [qmi.row() for qmi in self.feed_view.selectedIndexes()][0]
        item = self.feed_view.model().item(row)
        self.article_box.set_data(**item.article_bundle)
        self.feed_view.set_seen(item, True)

        URLHandler.set_article_seen(item.article_bundle['link'], True)

    def refresh_groups(self, download=False):
        """
        Refreshes groups after adding/removing group or url

        Args:
            download (bool, optional): Option to fetch newset article while refreshing content. Defaults to False.
        """
        dbh = DatabaseHandler()
        self.entry = dbh.get_entry(CredentialsHandler.lastUsername)
        self.get_user_groups(update=True)
        if download:
            self.group_view.menu_refresh_callback(
                self.group_view.selectedItems()[0])

    def refresh_feed(self, item):
        """Refreshes content of FeedView

        Args:
            item (QItem): Item of selected group from groupview
        """
        dbh = DatabaseHandler()
        self.entry = dbh.get_entry(CredentialsHandler.lastUsername)
        self.set_group(item, True)
Esempio n. 6
0
class MainWindow(QMainWindow):
    """
    Main application window
    :version:
    :author: pir
    """

    #--------------------------------------------------------------------------

    def __init__(self):
        super().__init__()

        self.setWindowTitle("Organiser")
        self.mainLayout = QVBoxLayout()

        # Create menu bar & menus
        self.fileMenu = self.menuBar().addMenu("&File")
        self.openMenuAction = self.fileMenu.addAction("&Open")
        self.openMenuAction.triggered.connect(
            self.on_open_action)  # New-style connect!
        self.fileMenu.addSeparator()
        self.setPreferencesMenuAction = self.fileMenu.addAction(
            "Set Preferences")
        self.setPreferencesMenuAction.triggered.connect(
            self.on_set_preferences_action)
        self.fileMenu.addSeparator()
        self.quitMenuAction = self.fileMenu.addAction("&Quit")
        self.quitMenuAction.triggered.connect(self.on_quit_action)

        # Create main toolbar
        self.mainToolBar = QToolBar()
        self.mainToolBar.setMovable(False)

        self.addItemToolButton = self.mainToolBar.addAction(
            QIcon("./mainToolbarIcons/Gnome-item-add.svg"), "Add new item"
        )  # Icons from https://commons.wikimedia.org/wiki/GNOME_Desktop_icons
        self.addItemToolButton.triggered.connect(self.on_insert_item_action)
        self.addChildItemToolButton = self.mainToolBar.addAction(
            QIcon("./mainToolbarIcons/Gnome-item-add-child.svg"),
            "Add child item")
        self.addChildItemToolButton.triggered.connect(
            self.on_insert_child_item_action)
        self.mainLayout.addWidget(self.mainToolBar)

        # Configure window splitter
        self.splitter = QSplitter()
        self.splitter.setHandleWidth(2)

        # Configure item tree widget
        self.itemTree = ItemTree()
        self.splitter.addWidget(self.itemTree)
        self.splitter.addWidget(self.itemTree.editBox)
        self.mainLayout.addWidget(self.splitter)

        # Is a status bar needed in this application?
        #self.statusBar = QStatusBar()
        #self.mainLayout.addWidget(self.statusBar)

        # Set layout as the central widget
        self.mainWidget = QWidget()
        self.mainWidget.setLayout(self.mainLayout)
        self.setCentralWidget(self.mainWidget)

        # TEST ONLY
        self.uniqueCounter = 0

        return

    #--------------------------------------------------------------------------

    def on_insert_item_action(self):
        """Handler for 'add item' action"""

        # test code
        title = str(self.uniqueCounter)
        self.uniqueCounter += 1
        # test code

        # TODO Get parameters of new task
        iconIndex = 0
        #title = ""
        deadline = 0

        self.itemTree.insert_task_item(iconIndex, title, deadline, True, False)
        print("adding an item")

        return

#--------------------------------------------------------------------------

    def on_insert_child_item_action(self):
        """Handler for 'add child item' action"""

        # Test code
        title = str(self.uniqueCounter)
        self.uniqueCounter += 1

        # TODO Get parameters of new task
        iconIndex = 0
        #title = ""
        deadline = 0

        self.itemTree.insert_task_item(iconIndex, title, deadline, True, True)
        print("add a child item")

        return

#--------------------------------------------------------------------------

    def on_open_action(self):
        """Handler for 'open' action"""

        print("open file item")

        return

    #--------------------------------------------------------------------------

    def on_set_preferences_action(self):
        """Handler for 'set preferences' action"""

        self.itemTree.set_item_tree_preferences()

        return

    #--------------------------------------------------------------------------

    def on_quit_action(self):
        """Handler for 'quit' action"""

        print("quitting application")
        self.close()

        return
Esempio n. 7
0
class BasisUI(QSplitter):
    def __init__(self, *args, **kwargs):
        super(BasisUI, self).__init__(*args, **kwargs)
        main_layout = QHBoxLayout()
        self.variety_tree = VarietyTree(self)
        main_layout.addWidget(self.variety_tree)

        self.right_widget = QWidget(self)
        right_layout = QVBoxLayout()
        right_layout.setContentsMargins(QMargins(1, 1, 1, 1))

        opts_layout = QHBoxLayout()
        opts_layout.addWidget(QLabel("合约:", self))
        self.contract_combobox = QComboBox(self)
        self.contract_combobox.setMinimumWidth(80)
        opts_layout.addWidget(self.contract_combobox)
        self.query_button = QPushButton("查询", self)
        opts_layout.addWidget(self.query_button)

        # 日期间隔选项
        self.query_month_combobox = QComboBox(self)
        self.query_month_combobox.addItem("近三月", 3)
        self.query_month_combobox.addItem("近六月", 6)
        self.query_month_combobox.addItem("近一年", 12)
        opts_layout.addWidget(self.query_month_combobox)

        self.tip_label = QLabel('选择对应品种和合约后查询数据. ', self)
        opts_layout.addWidget(self.tip_label)
        opts_layout.addStretch()

        right_layout.addLayout(opts_layout)

        self.show_splitter = QSplitter(orientation=Qt.Vertical)
        # 图形容器
        self.chart_view = QWebEngineView(self)
        self.chart_view.setMinimumHeight(int(self.height() * 0.518))
        self.show_splitter.addWidget(self.chart_view)
        # 数据展示
        self.chart_data_table = QTableWidget(self)
        self.chart_data_table.setEditTriggers(
            QAbstractItemView.NoEditTriggers)  # 不可编辑
        self.chart_data_table.setFocusPolicy(Qt.NoFocus)  # 去选中时的虚线框
        self.chart_data_table.setAlternatingRowColors(True)  # 交替行颜色
        self.chart_data_table.setFrameShape(QFrame.NoFrame)
        self.chart_data_table.setColumnCount(6)
        self.chart_data_table.setHorizontalHeaderLabels(
            ["品种", "合约", "日期", "现货价", "收盘价", "基差"])
        self.show_splitter.addWidget(self.chart_data_table)
        self.show_splitter.setStretchFactor(0, 6)
        self.show_splitter.setStretchFactor(1, 4)
        self.show_splitter.setHandleWidth(2)

        right_layout.addWidget(self.show_splitter)

        self.right_widget.setLayout(right_layout)

        main_layout.addWidget(self.right_widget)

        self.setLayout(main_layout)

        self.setStretchFactor(0, 3)
        self.setStretchFactor(1, 7)
        self.setHandleWidth(1)

        self.tip_label.setObjectName("tipLabel")
        self.chart_data_table.setObjectName("dataTable")
        self.setStyleSheet(
            "#tipLabel{border:none;color:rgb(230,50,50);font-weight:bold}"
            "#dataTable{selection-color:rgb(255,255,255);selection-background-color:rgb(51,143,255);alternate-background-color:rgb(245,250,248)}"
        )