class Counters(QScrollArea): button_clicked = Signal(object, object) SPACING = 2 def __init__(self, parent=None): QScrollArea.__init__(self, parent) self.setWidgetResizable(True) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self._layout = QVBoxLayout() self._layout.setContentsMargins(0, 0, 0, 0) self._layout.setSpacing(Counters.SPACING) widget = QWidget() widget.setLayout(self._layout) self.setWidget(widget) self.setFixedWidth(200) self.checked_buttons = dict() def set(self, counters): previous_buttons = self.checked_buttons.copy() self.clear() for column, counter in counters.items(): for entry, value in counter.items(): checked = previous_buttons.get(entry, False) self.checked_buttons[entry] = checked button = QPushButton('{} {}'.format(entry, value)) button.setProperty(PROPERTY_SIDE_STROKED, checked) button.clicked.connect(self._clicked) self._layout.addWidget(button) self._layout.addWidget(QLabel()) self._layout.addWidget(QWidget()) self._layout.setStretch(self._layout.count() - 1, 100) def clear(self): clear_layout(self._layout) self.checked_buttons = dict() def _clicked(self): button = self.sender() checked = not button.property(PROPERTY_SIDE_STROKED) entry = button.text().split()[0] self.checked_buttons[entry] = checked button.setProperty(PROPERTY_SIDE_STROKED, checked) self.button_clicked.emit(entry, self.checked_buttons)
class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self, url: QUrl) -> None: super().__init__() self.setupUi(self) self.m_cookies = [] self.m_urlLineEdit.setText(url.toString()) self.m_layout = QVBoxLayout() self.m_layout.addItem( QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.m_layout.setContentsMargins(0, 0, 0, 0) self.m_layout.setSpacing(0) w = QWidget() p = w.palette() p.setColor(self.widget.backgroundRole(), Qt.white) w.setPalette(p) w.setLayout(self.m_layout) self.m_scrollArea.setWidget(w) self.m_scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.m_scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.m_urlButton.clicked.connect(self.handleUrlClicked) self.m_deleteAllButton.clicked.connect(self.handleDeleteAllClicked) self.m_newButton.clicked.connect(self.handleNewClicked) self.m_store: QWebEngineCookieStore = self.m_webview.page().profile( ).cookieStore() self.m_store.cookieAdded.connect(self.handleCookieAdded) self.m_store.loadAllCookies() self.m_webview.load(url) def containsCookie(self, cookie: QNetworkCookie): for c in self.m_cookies: if c.hasSameIdentifier(cookie): return True return False @Slot(QNetworkCookie) def handleCookieAdded(self, cookie: QNetworkCookie): if self.containsCookie(cookie): return widget = CookieWidget(cookie) widget.setHighlighted(len(self.m_cookies) % 2) self.m_cookies.append(QNetworkCookie(cookie)) self.m_layout.insertWidget(0, widget) widget.deleteClicked.connect( partial(self._on_deleteClicked, QNetworkCookie(cookie), widget)) widget.viewClicked.connect( partial(self._on_viewClicked, QNetworkCookie(cookie))) def _on_deleteClicked(self, cookie: QNetworkCookie, widget: QWidget): self.m_store.deleteCookie(QNetworkCookie(cookie)) # FIXME # sip.delete(widget) self.m_cookies.remove(cookie) for i in range(self.m_layout.count() - 1, -1, -1): w = self.m_layout.itemAt(i).widget() if isinstance(w, CookieWidget): w.setHighlighted(i % 2) def _on_viewClicked(self, cookie): dialog = CookieDialog(cookie) dialog.exec_() @Slot() def handleDeleteAllClicked(self): self.m_store.deleteAllCookies() for i in range(self.m_layout.count() - 1, -1, -1): w = self.m_layout.itemAt(i).widget() if w: sip.delete(w) self.m_cookies.clear() @Slot() def handleNewClicked(self): dialog = CookieDialog() if dialog.exec_() == QDialog.Accepted: self.m_store.setCookie(QNetworkCookie(dialog.cookie())) @Slot() def handleUrlClicked(self): self.m_webview.load(QUrl.fromUserInput(self.m_urlLineEdit.text()))