| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- 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)
-
-
-
-
-
-
-
-
|