# -*- Mode: Python; coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2011 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
import platform
import gtk
from kiwi.component import get_utility
from stoqlib.lib.interfaces import IApplicationDescriptions
from stoqlib.lib.translation import stoqlib_gettext
_ = stoqlib_gettext
_user_bindings = {}
if platform.system() == 'Darwin':
default_pref_shortcut = '<Primary>comma'
else:
default_pref_shortcut = ''
_bindings = [
# Common application shortcuts
('app.common.toggle_fullscreen', '<Primary>F11',
_('Toggle fullscreen')),
('app.common.toggle_statusbar', '',
_('Toggle statusbar')),
('app.common.toggle_toolbar', '',
_('Toggle toolbar')),
('app.common.new_window', '<Primary>n',
_('Create a new Window')),
('app.common.change_password', '',
_('Change password')),
('app.common.sign_out', '',
_('Sign out')),
('app.common.close_window', '<Primary>w',
_('Close window')),
('app.common.print', '<Primary>p',
_("Print"),),
('app.common.preferences', default_pref_shortcut,
_("Show preferences")),
('app.common.quit', '<Primary>q',
_("Quit the application")),
('app.common.help', 'F1',
_('Show help')),
('app.common.help_contents', '<Primary>F1',
_('Show help contents')),
# Admin application
('app.admin.search_cost_centers', '',
_("Search for cost centers")),
('app.admin.search_roles', '<Primary><Alt>o',
_("Search for employee roles")),
('app.admin.search_employees', '<Primary><Alt>e',
_("Search for employees")),
('app.admin.search_events', '',
_("Search for events")),
('app.admin.search_cfop', '<Primary>o',
_("Search for C.F.O.Ps")),
('app.admin.search_fiscalbook', '<Primary><alt>f',
_("Search for fiscal books")),
('app.admin.search_profile', '<Primary><Alt>u',
_("Search for user profiles")),
('app.admin.search_users', '<Primary>u',
_("Search for users")),
('app.admin.search_branches', '<Primary>b',
_("Search for company branches")),
('app.admin.search_computers', '<Primary><alt>h',
_("Search for computers")),
('app.admin.config_devices', '<Primary>d',
_("Configure devices")),
('app.admin.config_payment_methods', '<Primary>m',
_("Configure payment methods")),
('app.admin.config_payment_categories', '<Primary>a',
_("Configure payment categories")),
('app.admin.config_client_categories', '<Primary>x',
_("Configure client categories")),
('app.admin.config_invoices', '<Primary>n',
_("Configure invoices")),
('app.admin.config_invoice_printers', '<Primary>f',
_("Configure invoice printers")),
('app.admin.config_sintegra', '',
_("Configure sintegra")),
('app.admin.config_taxes', '<Primary>l',
_("Configure tax classes")),
('app.admin.config_parameters', '<Primary>y',
_("Configure parameters")),
# Calendar application
('app.calendar.new_client_call', '',
_("Register a new client call")),
('app.calendar.new_payable', '',
_("Add a new account payable")),
('app.calendar.new_receivable', '',
_("Add a new account receivable")),
('app.calendar.new_work_order', '',
_("Add a new work order")),
('app.calendar.go_back', '',
_("Go back")),
('app.calendar.go_forward', '',
_("Go forward")),
('app.calendar.show_today', '',
_("Show today")),
# Financial application
('app.financial.configure_payment_methods', '',
_("Configure payment methods")),
('app.financial.import', '<Primary>i',
_("Import transactions")),
('app.financial.delete_account', '',
_("Delete account")),
('app.financial.delete_transaction', '',
_("Delete account transaction")),
('app.financial.new_account', '<Primary>a',
_("Create a new account")),
('app.financial.new_store', '<Primary>t',
_("Create a new account transaction")),
('app.financial.edit', '',
_("Edit an account or account transaction")),
# Inventory application
('app.inventory.new_inventory', '',
_("Open a new inventory")),
('app.inventory.inventory_count', '<Primary>c',
_("Count the selected inventory")),
('app.inventory.inventory_adjust', '<Primary>a',
_("Adjust the selected inventory")),
('app.inventory.inventory_cancel', '',
_("Cancel the selected inventory")),
('app.inventory.inventory_details', '',
_("View details of the selected inventory")),
('app.inventory.inventory_print', '',
_('Print the product listing for the selected inventory')),
# Services application
('app.services.new_order', '<control>o',
_("Create a new work order")),
('app.services.search_categories', '<control>c',
_("Search for categories")),
('app.services.search_clients', '<Primary><Alt>c',
_("Search for clients")),
('app.services.search_products', '<Primary>d',
_("Search for products")),
('app.services.search_services', '<Primary>s',
_("Search for services")),
('app.services.order_edit', '',
_("Edit the selected work order")),
('app.services.order_cancel', '',
_("Cancel the selected work order")),
('app.services.order_finish', '',
_("Finish the selected work order")),
('app.services.order_details', '',
_("Show details for the selected work order")),
('app.services.order_print_quote', '',
_("Print a quote report of the selected order")),
('app.services.order_print_receipt', '',
_("Print a receipt of the selected order")),
# Payable application
('app.payable.add_payable', '',
_("Create a new account payable")),
('app.payable.payment_flow_history', '<Primary>f',
_('Show a report of payment expected to receive grouped by day')),
('app.payable.payment_details', '',
_("Show details for the selected payment")),
('app.payable.payment_pay', '',
_("Pay the selected payment")),
('app.payable.payment_edit', '',
_("Edit the selected payment installments")),
('app.payable.payment_cancel', '',
_("Cancel the selected payment")),
('app.payable.payment_set_not_paid', '',
_("Mark the selected payment as not paid")),
('app.payable.payment_change_due_date', '',
_("Change the selected payment due date")),
('app.payable.payment_comments', '',
_("Add comments to the selected payment")),
('app.payable.payment_print_receipt', '<Primary>r',
_("Print a receipt for the selected payment")),
('app.payable.search_payment_categories', '',
_("Search for payment categories")),
('app.payable.search_bills', '',
_("Search for paid bills")),
# Pos application
('app.pos.new_trade', '<Primary>t',
_("Start a new trade")),
('app.pos.till_open', '<Primary>F6',
_("Open the till")),
('app.pos.till_close', '<Primary>F7',
_("Close the till")),
('app.pos.till_verify', '<Primary>F8',
_("Verify the till")),
('app.pos.order_confirm', '<Primary>F10',
_("Confirm the current order")),
('app.pos.order_cancel', '<Primary><Alt>o',
_("Cancel the current order")),
('app.pos.order_create_delivery', '<Primary>F5',
_("Create a delivery for the current order")),
('app.pos.search_sales', '<Primary><Alt>a',
_("Search for sales ")),
('app.pos.search_sold_items', '<Primary><Alt>a',
_("Search for sold items")),
('app.pos.search_clients', '<Primary><Alt>c',
_("Search for clients")),
('app.pos.search_products', '<Primary><Alt>p',
_("Search for products")),
('app.pos.search_services', '<Primary><Alt>s',
_("Search for services")),
('app.pos.search_deliveries', '<Primary><Alt>e',
_("Search for deliveries")),
('app.pos.payment_receive', '',
_("Receive payment")),
('app.pos.toggle_details_viewer', '',
_("Toggle the details viewer")),
# ecf till read memory: <Primary>F9
# ecf till summarize: <Primary>F11
# books search books: <Primary><Alt>B
# books search publishers: <Primary><Alt>P
# Production application
('app.production.new_production_order', '<Primary>o',
_("Create a new production order")),
('app.production.new_production_quote', '<Primary>p',
_("Create a new production quote")),
('app.production.production_details', '',
_("Show details for the selected production")),
('app.production.production_start', '<Primary>t',
_("Start the selected production")),
('app.production.production_edit', '',
_("Edit the selected production")),
('app.production.search_production_products', '<Primary>d',
_("Search for production products")),
('app.production.search_services', '<Primary>s',
_("Search for services")),
('app.production.search_production_items', '<Primary>r',
_("Search for production items")),
('app.production.search_production_history', '<Primary>h',
_("Search for production history")),
# Purchase application
('app.purchase.new_order', '<control>o',
_("Create a new purchase order")),
('app.purchase.new_quote', '<control>e',
_("Create a new purchase quote")),
('app.purchase.new_consignment', '',
_("Create a new consignment")),
('app.purchase.new_product', '',
_("Create a new product")),
('app.purchase.search_categories', '<Primary>c',
_("Search for categories")),
('app.purchase.search_products', '<Primary>d',
_("Search for products")),
('app.purchase.search_product_units', '<Primary>u',
_("Search for product units")),
('app.purchase.search_product_manufacturers', '',
_("Search for product manufacturers")),
('app.purchase.search_services', '<Primary>s',
_("Search for services")),
('app.purchase.search_stock_items', '<Primary>i',
_("Search for stock items")),
('app.purchase.search_closed_stock_items', '<Primary><Alt>c',
_("Search for closed stock items")),
('app.purchase.search_suppliers', '<Primary>u',
_("Search for suppliers")),
('app.purchase.search_transporters', '<Primary>t',
_("Search for transporters")),
('app.purchase.search_quotes', '<Primary>e',
_("Search for quotes")),
('app.purchase.search_purchased_items', '<Primary>p',
_("Search for purchased items")),
('app.purchase.search_products_sold', '',
_("Search for sold products")),
('app.purchase.search_prices', '',
_("Search for prices")),
('app.purchase.search_consignment_items', '',
_("Search for consignment items")),
('app.purchase.order_confirm', '',
_("Confirm the selected purchase order")),
('app.purchase.order_cancel', '',
_("Cancel the selected purchase order")),
('app.purchase.order_edit', '',
_("Edit the selected purchase order")),
('app.purchase.order_details', '',
_("Show details for the selected purchase order")),
('app.purchase.order_finish', '',
_("Finish the selected purchase order")),
# books search books: <Primary><Alt>B
# books search publishers: <Primary><Alt>P
# Receivable application
('app.receivable.add_receiving', '',
_("Create a new account receivable")),
('app.receivable.payment_flow_history', '<Primary>f',
_('Show a report of payment expected to receive grouped by day')),
('app.receivable.payment_details', '',
_("Show details for the selected payment")),
('app.receivable.payment_receive', '',
_("Receive the selected payment")),
('app.receivable.payment_cancel', '',
_("Cancel the selected payment")),
('app.receivable.payment_set_not_paid', '',
_("Mark the selected payment as not paid")),
('app.receivable.payment_change_due_date', '',
_("Change the selected payment due date")),
('app.receivable.payment_renegotiate', '',
_("Renegotiate the selected payment")),
('app.receivable.payment_edit_installments', '',
_("Edit the selected payment installments")),
('app.receivable.payment_comments', '',
_("Add comments to the selected payment")),
('app.receivable.payment_print_bill', '',
_("Print a bill for the selected payment")),
('app.receivable.payment_print_receipt', '<Primary>r',
_("Print a receipt for the selected payment")),
('app.receivable.search_payment_categories', '',
_("Search for payment categories")),
('app.receivable.search_bills', '',
_("Search for bills")),
('app.receivable.search_card_payments', '',
_("Search for card payments")),
# Sales application
('app.sales.search_sold_items_by_branch', '<Primary><Alt>a',
_("Search for sold items by branch")),
('app.sales.search_sales_by_payment', '',
_("Search for sales by payment method")),
('app.sales.search_salesperson_sales', '',
_("Search for the total sales made by a salesperson")),
('app.sales.search_products', '<Primary><Alt>p',
_("Search for products")),
('app.sales.search_services', '<Primary><Alt>s',
_("Search for services")),
('app.sales.search_deliveries', '<Primary><Alt>e',
_("Search for deliveries")),
('app.sales.search_clients', '<Primary><Alt>c',
_("Search for clients")),
('app.sales.search_commissions', '<Primary><Alt>o',
_("Search for commissions")),
('app.sales.search_loans', '',
_("Search for loans")),
('app.sales.search_loan_items', '',
_("Search for loan items")),
('app.sales.returned_sales', '',
_("Search for returned sales")),
('app.sales.sale_cancel', '',
_("Cancel the selected sale")),
('app.sales.sale_print_invoice', '',
_("Print an invoice for the selected sale")),
('app.sales.sale_return', '',
_("Return the selected sale")),
('app.sales.sale_edit', '',
_("Edit the selected sale")),
('app.sales.sale_details', '',
_("Show details for the selected sale")),
('app.sales.search_client_calls', '',
_("Search for client calls")),
('app.sales.search_credit_check_history', '',
_("Search for client credit check history")),
('app.sales.search_reserved_product', '',
_("Search for Reserved Products")),
('app.sales.search_clients', '',
_("Search for Reserved Products")),
# books search books: <Primary><Alt>B
# books search publishers: <Primary><Alt>P
# Stock application
('app.stock.stock_decrease', '<Primary>m',
_("Create a stock decrease")),
('app.stock.new_receiving', '<Primary>r',
_("Create a new receiving")),
('app.stock.transfer_product', '<Primary>t',
_("Create a new product transfer")),
('app.stock.search_receiving', '<Primary><Alt>u',
_("Search for receivings")),
('app.stock.search_product_history', "<Primary><Alt>p",
_("Search for product history")),
('app.stock.search_purchased_stock_items', '',
_("Search for purchased stock items")),
('app.stock.search_stock_items', "<Primary><Alt>s",
_("Search for stock items")),
('app.stock.search_brand_items', "",
_("Search for brand items")),
('app.stock.search_brand_by_branch', "",
_("Search for brand items by branch")),
('app.stock.search_batch_items', "",
_("Search for Batch items")),
('app.stock.search_transfers', "<Primary><Alt>t",
_("Search for transfers")),
('app.stock.search_closed_stock_items', "<Primary><Alt>c",
_("Search for closed stock items")),
('app.stock.edit_product', '',
_("Edit the selected product")),
('app.stock.history', '',
_("Show the selected product history")),
('app.stock.toggle_picture_viewer', '<Primary><Alt>v',
_("Toggle the picture viewer")),
# Till application
('app.till.open_till', '<Primary>F6',
_("Open the till")),
('app.till.close_till', '<Primary>F7',
_("Close the till")),
('app.till.verify_till', '<Primary>F8',
_("Verify the till")),
('app.till.search_clients', '<Primary><Alt>c',
_("Search for clients")),
('app.till.search_sale', '<Primary><Alt>a',
_("Search for sales")),
('app.till.search_sold_items_by_branch', '<Primary><Alt>d',
_("Search for sold items by branch")),
('app.till.search_till_history', '<Primary><Alt>t',
_("Search for till entry history")),
('app.till.search_fiscal_till_operations', '<Primary><Alt>f',
_("Search for fiscal till operations")),
('app.till.search_closed_till', '',
_("Search for all closed tills")),
('app.till.confirm_sale', '',
_("Confirm the sale")),
('app.till.return_sale', '',
_("Return the sale")),
('app.till.sale_details', '',
_("Show details of the sale")),
('app.till.payment_receive', '',
_("Receive payment")),
('app.till.daily_movement', '',
_("Print daily movement report")),
# ecf till read memory: <Primary>F9
# ecf till summarize: <Primary>F11
]
[docs]class KeyBinding(object):
def __init__(self, item):
self.name = item[0]
self.shortcut = _user_bindings.get(self.name, item[1])
self.category = get_category_label(item[0])
self.description = self._parse_description(item)
def _parse_description(self, item):
if len(item) > 2:
return item[2]
else:
n = self.name.rsplit('.')[-1]
n = n.replace('_', ' ')
return n.capitalize()
[docs]class KeyBindingCategory(object):
def __init__(self, name, label):
self.name = name
self.label = label
_pre_gtk_2_24_9 = gtk.gtk_version < (2, 24, 9)
[docs]class KeyBindingGroup(object):
def __init__(self, bindings):
self._bindings = bindings
[docs] def get(self, name):
if not name in self._bindings:
raise AttributeError(name)
binding = self._bindings[name]
if _pre_gtk_2_24_9:
binding = binding.replace('<Primary>', '<Control>')
if platform.system() == 'Darwin':
binding = binding.replace('<Alt>', '<Control>')
return binding
[docs]def add_bindings(bindings):
_bindings.extend(bindings)
[docs]def load_user_keybindings():
from stoqlib.lib.settings import get_settings
settings = get_settings()
d = settings.get('shortcuts', {})
for key, value in d.items():
set_user_binding(key, value)
[docs]def set_user_binding(binding, value):
_user_bindings[binding] = value
[docs]def remove_user_binding(binding):
try:
del _user_bindings[binding]
except KeyError:
pass
[docs]def remove_user_bindings():
global _user_bindings
_user_bindings = {}
[docs]def get_bindings(category=None):
for binding in _bindings:
if category is not None and not binding[0].startswith(category):
continue
yield KeyBinding(binding)
[docs]def get_category_label(name):
if name.startswith('app.common'):
return _("General")
elif name.startswith('app'):
app_name = name.split('.', 2)[1]
app_list = get_utility(IApplicationDescriptions)
for item in app_list.get_descriptions():
if item[0] == app_name:
return item[1] # the label
elif name.startswith('plugin'):
return _('%s plugin') % (name.split('.', 2)[1], )
else:
raise AssertionError(name)
[docs]def get_binding_categories():
categories = set()
for binding in _bindings:
name = binding[0]
category = '.'.join(name.split('.', 2)[:2])
categories.add((category, get_category_label(name)))
for name, label in categories:
yield KeyBindingCategory(name, label)
[docs]def get_accels(prefix=''):
d = {}
if prefix and not prefix.endswith('.'):
prefix += '.'
for item in _bindings:
name = item[0]
if not name.startswith(prefix):
continue
key = name[len(prefix):]
d[key] = _user_bindings.get(name, item[1])
return KeyBindingGroup(d)
[docs]def get_accel(accel_name):
for item in _bindings:
if item[0] == accel_name:
return item[1]
raise AttributeError(accel_name)