Skip to content

Commit

Permalink
add NavigationBar and NavigationItem
Browse files Browse the repository at this point in the history
  • Loading branch information
amaork committed Jun 21, 2019
1 parent 3121e32 commit 96d773e
Show file tree
Hide file tree
Showing 8 changed files with 164 additions and 1 deletion.
Binary file added demos/images/icons/configure.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demos/images/icons/dynamic_bar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demos/images/icons/manual.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demos/images/icons/menu.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demos/images/icons/method.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added demos/images/icons/waveform.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
45 changes: 45 additions & 0 deletions demos/widget_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,40 @@
from .images import ImagesPath
from ..gui.container import ComponentManager
from ..gui.widget import SerialPortSettingWidget
from ..gui.misc import NavigationItem, NavigationBar


class NavigationWidget(QMainWindow):
def __init__(self, parent=None):
super(NavigationWidget, self).__init__(parent)

self._initUi()
self._initStyle()

def _initUi(self):
self.ui_nav_bar = NavigationBar(moveAble=True, parent=self)
navigation_settings = [
('', self.ui_nav_bar.foldExpand, 'framework/demos/images/icons/menu.png', False),
('参数配置', None, 'framework/demos/images/icons/manual.png', True),
('数据传输', None, 'framework/demos//images/icons/method.png', True),
('运行日志', None, 'framework/demos//images/icons/dynamic_bar.png', True),
('状态检测', None, 'framework/demos//images/icons/waveform.png', True),
('高级设置', None, 'framework/demos//images/icons/configure.png', True)
]
for text, slot, icon, activate_invert in navigation_settings:
btn = NavigationItem(text, icon, slot, activate_invert, parent=self)
self.ui_nav_bar.addItem(btn)
if btn.text() == "状态检测":
self.ui_nav_bar.addExpandWidget()

self.addToolBar(Qt.LeftToolBarArea, self.ui_nav_bar)
self.setWindowTitle("导航栏演示")

def _initStyle(self):
self.ui_nav_bar.setStyleSheet(UiColorInput.get_bg_color_stylesheet((93, 78, 96)))

def slotGetActivateItem(self):
return self.ui_nav_bar.getActivateItemName()


class ListDemoWidget(QWidget):
Expand Down Expand Up @@ -520,6 +554,13 @@ def __init__(self):
self.multiJsonSettingButton = QPushButton("Get setting")
self.multiJsonSettingButton.clicked.connect(self.showWidget)

self.navigationWidget = NavigationWidget()
self.navigationWidget.setHidden(True)
self.navigationLabel = QLabel()
self.navigationLabel.setFrameStyle(frameStyle)
self.navigationButton = QPushButton("Show navigation")
self.navigationButton.clicked.connect(self.showWidget)

self.layout = QGridLayout()
self.layout.addWidget(self.listButton, 0, 0)
self.layout.addWidget(self.listLabel, 0, 1)
Expand All @@ -545,6 +586,8 @@ def __init__(self):
self.layout.addWidget(self.settingLabel, 10, 1)
self.layout.addWidget(self.multiJsonSettingButton, 11, 0)
self.layout.addWidget(self.multiJsonSettingLabel, 11, 1)
self.layout.addWidget(self.navigationButton, 12, 0)
self.layout.addWidget(self.navigationLabel, 12, 1)

self.setCentralWidget(QWidget())
self.centralWidget().setLayout(self.layout)
Expand All @@ -569,6 +612,8 @@ def showWidget(self):
self.settingWidget.setHidden(False)
elif self.sender() == self.multiJsonSettingButton:
self.multiJsonSettingWidget.setHidden(False)
elif self.sender() == self.navigationButton:
self.navigationWidget.setHidden(False)

def showImage(self):
if self.sender() == self.imageFsButton:
Expand Down
120 changes: 119 additions & 1 deletion gui/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
import serial.tools.list_ports
from raspi_io.utility import scan_server
from raspi_io import Query, RaspiSocketError
__all__ = ['SerialPortSelector', 'TabBar', 'updateFilterMenu']
__all__ = ['SerialPortSelector', 'TabBar',
'NavigationItem', 'NavigationBar',
'updateFilterMenu']


class SerialPortSelector(QComboBox):
Expand Down Expand Up @@ -162,3 +164,119 @@ def updateFilterMenu(options, menu, group, slot, select=None):

# Update
slot()


class NavigationItem(QToolButton):
activated = Signal()
ACTIVATE_STYLE = 'color: rgb(0, 0, 0);font: 20pt "宋体";'
DEFAULT_STYLE = 'color: rgb(255, 255, 255);font: 20pt "宋体";'

def __init__(self, text, icon, slot=None, activate_invert=True,
default_style=DEFAULT_STYLE, activate_style=ACTIVATE_STYLE, parent=None):
super(NavigationItem, self).__init__(parent)
self.__text = text
self.__icon = icon
self.__slot = slot
self.__activate = False
self.__default_style = default_style
self.__activate_style = activate_style
self.__activate_invert = activate_invert
self.__action = QAction(QIcon(icon), text, self)
self.__action.triggered.connect(self.slotSelected)
self.addAction(self.__action)
self.setDefaultAction(self.__action)
self.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
self.setStyleSheet(self.__default_style)

def slotSelected(self):
self.activated.emit()
if hasattr(self.__slot, "__call__"):
self.__slot()

def isActivate(self):
return self.__activate

def isActivateInvert(self):
return self.__activate_invert

def setFold(self, fold):
self.setToolButtonStyle(Qt.ToolButtonIconOnly if fold else Qt.ToolButtonTextBesideIcon)

def setActivate(self, activate):
self.__activate = activate
if not self.__activate_invert:
return
if activate:
image = QImage(self.__icon)
image.invertPixels()
self.setStyleSheet(self.__activate_style)
self.__action.setIcon(QPixmap.fromImage(image))
else:
self.setStyleSheet(self.__default_style)
self.__action.setIcon(QIcon(self.__icon))

def setDefaultStyle(self, style):
self.__default_style = style

def setActivateStyle(self, style):
self.__activate_style = style


class NavigationBar(QToolBar):
def __init__(self, normal_size=QSize(64, 64), fold_size=QSize(96, 96), moveAble=False, parent=None):
super(NavigationBar, self).__init__(parent)

self.__fold = False
self.__items = list()
self.__fold_size = fold_size
self.__normal_size = normal_size
self.setMovable(moveAble)
self.setIconSize(self.__normal_size)
self.setContextMenuPolicy(Qt.PreventContextMenu)

def foldExpand(self):
self.__fold = not self.__fold
[item.setFold(self.__fold) for item in self.__items]
self.setIconSize(self.__fold_size if self.__fold else self.__normal_size)

def addItem(self, item):
if not isinstance(item, NavigationItem):
return

self.addWidget(item)
self.__items.append(item)
if item.isActivateInvert():
item.activated.connect(self.slotActivateItem)

def addExpandWidget(self):
expand_widget = QWidget()
expand_widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
self.addWidget(expand_widget)

def slotActivateItem(self):
sender = self.sender()
activate_item = self.getActivateItem()
if isinstance(activate_item, NavigationItem):
activate_item.setActivate(False)

if isinstance(sender, NavigationItem):
sender.setActivate(True)

def setActivateItem(self, name):
for item in self.__items:
if item.text() == name:
item.activated.emit()

def getActivateItem(self):
for item in self.__items:
if item.isActivate():
return item

return None

def getActivateItemName(self):
item = self.getActivateItem()
if isinstance(item, NavigationItem):
return item.text()

return ""

0 comments on commit 96d773e

Please sign in to comment.