import os.path from PySide6.QtCore import Qt, QFileInfo, Signal, QFile, QPoint from PySide6.QtGui import QColor, QIcon from PySide6.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QTabBar, QListWidget, QLabel, QSplitter, QToolButton from qframelesswindow import FramelessWindow, TitleBarButton, TitleBarBase import Kikka from Kikka.KikkaConst import * from .IconPanel import IconPanel from Kikka.Widgets.KMenu import KMenu class CustomTitleBar(TitleBarBase): """ Custom title bar """ def __init__(self, parent): super().__init__(parent) self.minBtn.hide() self.maxBtn.hide() self.closeBtn.hide() self.settingsButton = QToolButton() self.settingsButton.resize(18, 18) self.settingsButton.setObjectName("SettingButton") self.settingsButton.clicked.connect(self.onSettingsButtonClicked) self.settingsButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly) self.settingsButton.setIcon(QIcon(os.path.join(Kikka.style.getThemePath(), "settings.svg"))) self.closeButton = QToolButton() self.closeButton.resize(18, 18) self.closeButton.setObjectName("CloseButton") self.closeButton.clicked.connect(self.closeBtn.clicked) self.closeButton.setIcon(QIcon(os.path.join(Kikka.style.getThemePath(), "close.svg"))) self.iconLabel = QLabel(self) self.iconLabel.setObjectName("IconLabel") self.iconLabel.setPixmap(QIcon(os.path.join(Kikka.style.getThemePath(), "title.svg")).pixmap(26, 26)) self.titleLabel = QLabel(self) self.titleLabel.setObjectName("TitleLabel") self.titleLabel.setText("Kikka") self.titleLabel.adjustSize() self.hBoxLayout = QHBoxLayout(self) self.hBoxLayout.setSpacing(0) self.hBoxLayout.setContentsMargins(0, 0, 0, 0) self.hBoxLayout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft) self.hBoxLayout.addWidget(self.iconLabel) self.hBoxLayout.addWidget(self.titleLabel) self.hBoxLayout.addStretch(1) self.hBoxLayout.addWidget(self.settingsButton) self.hBoxLayout.addWidget(self.closeButton) def mouseDoubleClickEvent(self, event): pass def onSettingsButtonClicked(self): # menu = KMenu(self, 0, "TTTitle") # menu.setPosition(QPoint(100, 100)) # menu.show() from Kikka.Widgets.KMenu import _createTestMenu menu = _createTestMenu() menu.setObjectName("ContextMenu") menu.setPosition(QPoint(100, 100)) menu.show() class PagePanel(QWidget): def __init__(self, parent=None): super().__init__(parent) self._updating = False self.currentColumnIndex = -1 self.currentRowIndex = -1 self.data = None self.initGUI() def initGUI(self): self.iconPanel = IconPanel() self.columnTab = QTabBar() self.columnTab.setContentsMargins(0, 0, 0, 0) self.columnTab.setDrawBase(True) self.columnTab.setExpanding(False) self.columnTab.setDocumentMode(True) self.columnTab.setElideMode(Qt.TextElideMode.ElideNone) self.columnTab.tabBarClicked.connect(self.onTabClicked) self.rowList = QListWidget() self.rowList.itemClicked.connect(self.onListClicked) self.splitter = QSplitter() self.splitter.setChildrenCollapsible(False) self.splitter.addWidget(self.rowList) self.splitter.addWidget(self.iconPanel) self.splitter.setContentsMargins(0, 0, 0, 0) self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 5) layout2 = QVBoxLayout() layout2.setSpacing(0) layout2.setContentsMargins(0, 0, 0, 0) layout2.addWidget(self.columnTab) layout2.addWidget(self.splitter) self.setLayout(layout2) def initData(self, data): self._updating = True self.data = data # init column sub = len(data) - self.columnTab.count() while sub > 0: self.columnTab.addTab("") sub -= 1 while sub < 0: self.columnTab.setTabVisible(self.columnTab.count() - sub, False) sub += 1 for i, category in data.items(): self.columnTab.setTabText(i, category.name) self._updating = False def setPage(self, columnIndex, rowIndex): if columnIndex < 0 or columnIndex >= self.columnTab.count(): return if rowIndex < 0: return self._updating = True self.rowList.clear() rowData = self.data[columnIndex] for i, subCategory in rowData.sub_categories.items(): self.rowList.addItem(subCategory.name) self.columnTab.setCurrentIndex(columnIndex) self.rowList.setCurrentRow(rowIndex) panelData = rowData[rowIndex] self.iconPanel.setData(panelData.actions) self.currentColumnIndex = columnIndex self.currentRowIndex = rowIndex self._updating = False def onTabClicked(self, columnIndex): self.setPage(columnIndex, 0) def onListClicked(self, item): index = self.rowList.indexFromItem(item) self.currentRowIndex = index.row() panelData = self.data[self.currentColumnIndex][self.currentRowIndex] self.iconPanel.setData(panelData.actions) pass class MainWindow(FramelessWindow): SIGNAL_OPERATION = Signal(EActionOperation, dict) # operation, param def __init__(self, parent=None): super().__init__(parent=parent) self.initGUI() self.connectSlot() def initGUI(self): self.setWindowTitle("Acrylic Window") self.setTitleBar(CustomTitleBar(self)) self.panel = PagePanel(self) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(0) layout.addSpacing(self.titleBar.height()) layout.addWidget(self.panel) self.setLayout(layout) def initData(self, data): self.panel.initData(data) def connectSlot(self): self.panel.iconPanel.SIGNAL_DROP.connect(self.onDropFileEnter) self.panel.iconPanel.SIGNAL_DOUBLE_CLICK.connect(self.onDoubleClickIcon) def setPage(self, columnIndex, rowIndex): self.panel.setPage(columnIndex, rowIndex) def getCurrentPage(self): return (self.panel.currentRowIndex, self.panel.currentColumnIndex) def onDropFileEnter(self, filepath): param = { 'filepath': filepath, 'column': self.panel.currentColumnIndex, 'row': self.panel.currentRowIndex, } self.SIGNAL_OPERATION.emit(EActionOperation.NewAction, param) self.setPage(self.panel.currentColumnIndex, self.panel.currentRowIndex) def onDoubleClickIcon(self, action): param = { 'action': action, } self.SIGNAL_OPERATION.emit(EActionOperation.RunAction, param)