presik_pos/app/commons/menu_list.py

193 lines
6.1 KiB
Python

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from decimal import Decimal
from PyQt5.QtCore import Qt, pyqtSignal, QSize
from PyQt5.QtWidgets import QWidget, QHBoxLayout, QFrame, QScroller,\
QVBoxLayout, QPushButton, QLabel, QGridLayout, QDialog, QScrollArea
def money(v):
return '${:20,}'.format(int(v))
class Separator(QFrame):
def __init__(self):
QFrame.__init__(self)
self.setLineWidth(1)
self.setFrameShape(QFrame.HLine)
class TLabel(QLabel):
# Category Label
def __init__(self, key, id_, parent):
QLabel.__init__(self, key)
self.parent = parent
self.setAlignment(Qt.AlignCenter)
self.id = id_
def mouseDoubleClickEvent(self, qmouse_event):
self.parent.setState({
'layout_invisible': True,
'view': self.id,
})
super(TLabel, self).mouseDoubleClickEvent(qmouse_event)
class RLabel(QLabel):
#Item Label
def __init__(self, name, idx):
super(RLabel, self).__init__(name)
self.idx = idx
def mouseDoubleClickEvent(self, qmouse_event):
self.parent().action_selected(self.idx)
super(RLabel, self).mouseDoubleClickEvent(qmouse_event)
class List(QWidget):
sigItem_selected = pyqtSignal(str)
def __init__(self, rows, num_cols, show_code, action):
"""
rows: a list of lists
num_cols: number of columns?
"""
QWidget.__init__(self)
self.layout_list = QGridLayout()
self.setLayout(self.layout_list)
self.rows = rows
self.show_code = show_code
self.action = action
self.num_cols = num_cols
self.layout_list.setVerticalSpacing(5)
self.layout_list.setColumnStretch(1, 1)
if rows:
self.set_items(rows)
def action_selected(self, idx):
self.action(idx) #.selected_method(idx)
def set_items(self, rows):
self.rows = rows
idx = 0
self.layout_list.addWidget(Separator(), 0, 0, 1, self.num_cols)
for row in rows:
idx += 1
separator = Separator()
for col in range(self.num_cols):
val = row[col]
if isinstance(val, Decimal):
val = money(int(val))
if not self.show_code:
if col == 0:
val = ''
item = RLabel(val, idx=row[0])
self.layout_list.addWidget(item, idx, col)
idx += 1
self.layout_list.addWidget(separator, idx, 0, 1, self.num_cols)
self.layout_list.setRowStretch(idx + 1, 1)
class MenuWindow(QDialog):
def __init__(self, parent, values, selected_method=None, title=None):
"""
parent: parent window
values: is to list of list/tuples values for data model
[('a' 'b', 'c'), ('d', 'e', 'f')...]
on_selected: method to call when triggered the selection
title: title of window
"""
super(MenuWindow, self).__init__(parent)
self.parent = parent
self.values = values
self.current_view = None
if not title:
title = 'Menu...'
self.setWindowTitle(title)
self.resize(QSize(200, 400))
self.show_code = False
self.create_categories()
self.create_widgets()
# ---------------------------------------------------------------
self.layout = QVBoxLayout()
self.layout_buttons = QHBoxLayout()
self.layout.addLayout(self.layout_buttons, 0)
self.layout_buttons.addWidget(self.pushButtonOk)
self.layout_buttons.addWidget(self.pushButtonBack)
self.layout.addWidget(self.category, 0)
self.setLayout(self.layout)
# ---------------------------------------------------------------
self.create_connections()
self.method_on_selected = getattr(self.parent, selected_method)
def setState(self, args):
if args.get('layout_invisible'):
self.category.hide()
else:
self.category.show()
self.layout.addWidget(self.category)
if self.current_view:
self.current_view.hide()
if args.get('view'):
view_id = args.get('view')
if hasattr(self, 'view_' + str(view_id)):
self.current_view = getattr(self, 'view_' + str(view_id))
self.layout.addWidget(self.current_view)
self.current_view.show()
def create_categories(self):
# set the list model
self.category = QWidget()
self.layout_category = QVBoxLayout()
self.category.setLayout(self.layout_category)
id_ = 1
self.layout_category.addWidget(Separator())
for k, values in self.values.items():
separator = Separator()
label = TLabel(k, id_, self)
self.layout_category.addWidget(label)
self.layout_category.addWidget(separator)
list_item = List(values, 3, self.show_code, self.selected_method)
scroll_area = QScrollArea()
scroll_area.setWidgetResizable(True)
scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
scroll_area.setWidget(list_item)
QScroller.grabGesture(scroll_area, QScroller.LeftMouseButtonGesture)
setattr(self, 'view_' + str(id_), scroll_area)
id_ += 1
def create_widgets(self):
self.pushButtonOk = QPushButton("&ACEPTAR")
self.pushButtonOk.setAutoDefault(True)
self.pushButtonOk.setDefault(False)
self.pushButtonBack = QPushButton("&VOLVER")
def create_layout(self):
pass
def create_connections(self):
self.pushButtonOk.clicked.connect(self.action_close)
self.pushButtonBack.clicked.connect(self.action_back)
def action_back(self):
self.setState({
'layout_invisible': False,
})
def action_close(self):
self.close()
def selected_method(self, args):
if self.parent and self.selected_method:
self.method_on_selected(args)