MainWindow.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import os.path
  2. from PySide6.QtCore import Qt, QFileInfo, Signal, QFile, QPoint
  3. from PySide6.QtGui import QColor, QIcon
  4. from PySide6.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QTabBar, QListWidget, QLabel, QSplitter, QToolButton
  5. from qframelesswindow import FramelessWindow, TitleBarButton, TitleBarBase
  6. import Kikka
  7. from Kikka.KikkaConst import *
  8. from .IconPanel import IconPanel
  9. from Kikka.Widgets.KMenu import KMenu
  10. class CustomTitleBar(TitleBarBase):
  11. """ Custom title bar """
  12. def __init__(self, parent):
  13. super().__init__(parent)
  14. self.minBtn.hide()
  15. self.maxBtn.hide()
  16. self.closeBtn.hide()
  17. self.settingsButton = QToolButton()
  18. self.settingsButton.resize(18, 18)
  19. self.settingsButton.setObjectName("SettingButton")
  20. self.settingsButton.clicked.connect(self.onSettingsButtonClicked)
  21. self.settingsButton.setToolButtonStyle(Qt.ToolButtonStyle.ToolButtonIconOnly)
  22. self.settingsButton.setIcon(QIcon(os.path.join(Kikka.style.getThemePath(), "settings.svg")))
  23. self.closeButton = QToolButton()
  24. self.closeButton.resize(18, 18)
  25. self.closeButton.setObjectName("CloseButton")
  26. self.closeButton.clicked.connect(self.closeBtn.clicked)
  27. self.closeButton.setIcon(QIcon(os.path.join(Kikka.style.getThemePath(), "close.svg")))
  28. self.iconLabel = QLabel(self)
  29. self.iconLabel.setObjectName("IconLabel")
  30. self.iconLabel.setPixmap(QIcon(os.path.join(Kikka.style.getThemePath(), "title.svg")).pixmap(26, 26))
  31. self.titleLabel = QLabel(self)
  32. self.titleLabel.setObjectName("TitleLabel")
  33. self.titleLabel.setText("Kikka")
  34. self.titleLabel.adjustSize()
  35. self.hBoxLayout = QHBoxLayout(self)
  36. self.hBoxLayout.setSpacing(0)
  37. self.hBoxLayout.setContentsMargins(0, 0, 0, 0)
  38. self.hBoxLayout.setAlignment(Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignLeft)
  39. self.hBoxLayout.addWidget(self.iconLabel)
  40. self.hBoxLayout.addWidget(self.titleLabel)
  41. self.hBoxLayout.addStretch(1)
  42. self.hBoxLayout.addWidget(self.settingsButton)
  43. self.hBoxLayout.addWidget(self.closeButton)
  44. def mouseDoubleClickEvent(self, event):
  45. pass
  46. def onSettingsButtonClicked(self):
  47. # menu = KMenu(self, 0, "TTTitle")
  48. # menu.setPosition(QPoint(100, 100))
  49. # menu.show()
  50. from Kikka.Widgets.KMenu import _createTestMenu
  51. menu = _createTestMenu()
  52. menu.setObjectName("ContextMenu")
  53. menu.setPosition(QPoint(100, 100))
  54. menu.show()
  55. class PagePanel(QWidget):
  56. def __init__(self, parent=None):
  57. super().__init__(parent)
  58. self._updating = False
  59. self.currentColumnIndex = -1
  60. self.currentRowIndex = -1
  61. self.data = None
  62. self.initGUI()
  63. def initGUI(self):
  64. self.iconPanel = IconPanel()
  65. self.columnTab = QTabBar()
  66. self.columnTab.setContentsMargins(0, 0, 0, 0)
  67. self.columnTab.setDrawBase(True)
  68. self.columnTab.setExpanding(False)
  69. self.columnTab.setDocumentMode(True)
  70. self.columnTab.setElideMode(Qt.TextElideMode.ElideNone)
  71. self.columnTab.tabBarClicked.connect(self.onTabClicked)
  72. self.rowList = QListWidget()
  73. self.rowList.itemClicked.connect(self.onListClicked)
  74. self.splitter = QSplitter()
  75. self.splitter.setChildrenCollapsible(False)
  76. self.splitter.addWidget(self.rowList)
  77. self.splitter.addWidget(self.iconPanel)
  78. self.splitter.setContentsMargins(0, 0, 0, 0)
  79. self.splitter.setStretchFactor(0, 1)
  80. self.splitter.setStretchFactor(1, 5)
  81. layout2 = QVBoxLayout()
  82. layout2.setSpacing(0)
  83. layout2.setContentsMargins(0, 0, 0, 0)
  84. layout2.addWidget(self.columnTab)
  85. layout2.addWidget(self.splitter)
  86. self.setLayout(layout2)
  87. def initData(self, data):
  88. self._updating = True
  89. self.data = data
  90. # init column
  91. sub = len(data) - self.columnTab.count()
  92. while sub > 0:
  93. self.columnTab.addTab("")
  94. sub -= 1
  95. while sub < 0:
  96. self.columnTab.setTabVisible(self.columnTab.count() - sub, False)
  97. sub += 1
  98. for i, category in data.items():
  99. self.columnTab.setTabText(i, category.name)
  100. self._updating = False
  101. def setPage(self, columnIndex, rowIndex):
  102. if columnIndex < 0 or columnIndex >= self.columnTab.count(): return
  103. if rowIndex < 0: return
  104. self._updating = True
  105. self.rowList.clear()
  106. rowData = self.data[columnIndex]
  107. for i, subCategory in rowData.sub_categories.items():
  108. self.rowList.addItem(subCategory.name)
  109. self.columnTab.setCurrentIndex(columnIndex)
  110. self.rowList.setCurrentRow(rowIndex)
  111. panelData = rowData[rowIndex]
  112. self.iconPanel.setData(panelData.actions)
  113. self.currentColumnIndex = columnIndex
  114. self.currentRowIndex = rowIndex
  115. self._updating = False
  116. def onTabClicked(self, columnIndex):
  117. self.setPage(columnIndex, 0)
  118. def onListClicked(self, item):
  119. index = self.rowList.indexFromItem(item)
  120. self.currentRowIndex = index.row()
  121. panelData = self.data[self.currentColumnIndex][self.currentRowIndex]
  122. self.iconPanel.setData(panelData.actions)
  123. pass
  124. class MainWindow(FramelessWindow):
  125. SIGNAL_OPERATION = Signal(EActionOperation, dict) # operation, param
  126. def __init__(self, parent=None):
  127. super().__init__(parent=parent)
  128. self.initGUI()
  129. self.connectSlot()
  130. def initGUI(self):
  131. self.setWindowTitle("Acrylic Window")
  132. self.setTitleBar(CustomTitleBar(self))
  133. self.panel = PagePanel(self)
  134. layout = QVBoxLayout()
  135. layout.setContentsMargins(0, 0, 0, 0)
  136. layout.setSpacing(0)
  137. layout.addSpacing(self.titleBar.height())
  138. layout.addWidget(self.panel)
  139. self.setLayout(layout)
  140. def initData(self, data):
  141. self.panel.initData(data)
  142. def connectSlot(self):
  143. self.panel.iconPanel.SIGNAL_DROP.connect(self.onDropFileEnter)
  144. self.panel.iconPanel.SIGNAL_DOUBLE_CLICK.connect(self.onDoubleClickIcon)
  145. def setPage(self, columnIndex, rowIndex):
  146. self.panel.setPage(columnIndex, rowIndex)
  147. def getCurrentPage(self):
  148. return (self.panel.currentRowIndex, self.panel.currentColumnIndex)
  149. def onDropFileEnter(self, filepath):
  150. param = {
  151. 'filepath': filepath,
  152. 'column': self.panel.currentColumnIndex,
  153. 'row': self.panel.currentRowIndex,
  154. }
  155. self.SIGNAL_OPERATION.emit(EActionOperation.NewAction, param)
  156. self.setPage(self.panel.currentColumnIndex, self.panel.currentRowIndex)
  157. def onDoubleClickIcon(self, action):
  158. param = {
  159. 'action': action,
  160. }
  161. self.SIGNAL_OPERATION.emit(EActionOperation.RunAction, param)