experimental-accounting-api/accounting/gtkclient.py

157 lines
4.7 KiB
Python
Raw Normal View History

import sys
import logging
import threading
from datetime import datetime
from gi.repository import Gtk
from gi.repository import GLib
from gi.repository import GObject
from accounting.client import Client
_log = logging.getLogger(__name__)
class Accounting(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title='Accounting Client')
self.client = Client()
2013-12-17 05:00:21 +00:00
self.set_border_width(0)
2013-12-17 05:00:21 +00:00
self.set_default_geometry(640, 360)
2013-12-17 05:00:21 +00:00
# Controls
self.btn_load_transactions = Gtk.Button(label='Load transactions')
self.btn_load_transactions.connect('clicked', self.on_button_clicked)
self.spinner = Gtk.Spinner()
2013-12-17 05:00:21 +00:00
renderer = Gtk.CellRendererText()
# Transaction stuff
2013-12-17 05:00:21 +00:00
self.transaction_data = None
self.transaction_store = Gtk.ListStore(str, str, str)
self.transaction_view = Gtk.TreeView(self.transaction_store)
2013-12-17 05:00:21 +00:00
self.id_column = Gtk.TreeViewColumn('ID', renderer, text=0)
self.date_column = Gtk.TreeViewColumn('Date', renderer, text=1)
self.payee_column = Gtk.TreeViewColumn('Payee', renderer, text=2)
self.transaction_view.append_column(self.date_column)
self.transaction_view.append_column(self.payee_column)
self.transaction_view.connect('cursor-changed',
self.on_transaction_selected)
# Postings
self.posting_store = Gtk.ListStore(str, str, str)
self.posting_view = Gtk.TreeView(self.posting_store)
self.account_column = Gtk.TreeViewColumn('Account', renderer, text=0)
self.amount_column = Gtk.TreeViewColumn('Amount', renderer, text=1)
self.symbol_column = Gtk.TreeViewColumn('Symbol', renderer, text=2)
self.posting_view.append_column(self.account_column)
self.posting_view.append_column(self.amount_column)
self.posting_view.append_column(self.symbol_column)
# The transaction detail view
2013-12-17 05:00:21 +00:00
self.lbl_payee = Gtk.Label()
2013-12-17 05:00:21 +00:00
# Layout setting
self.menu = Gtk.MenuBar.new()
self.ctrl_box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
self.ctrl_box.pack_start(self.btn_load_transactions, False, False, 0)
self.ctrl_box.pack_start(self.spinner, False, False, 5)
self.detail_view = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
self.detail_view.pack_start(self.lbl_payee, False, True, 0)
self.detail_view.pack_start(self.posting_view, True, True, 0)
self.vertical = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
self.vertical.pack_start(self.ctrl_box, False, True, 0)
self.vertical.pack_start(self.transaction_view, True, True, 0)
self.paned = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL)
self.add(self.paned)
self.paned.add1(self.vertical)
self.paned.add2(self.detail_view)
# Show
2013-12-17 05:00:21 +00:00
self.show_all()
self.spinner.hide()
2013-12-17 05:00:21 +00:00
self.detail_view.hide()
def on_transaction_selected(self, widget):
selection = self.transaction_view.get_selection()
selection.set_mode(Gtk.SelectionMode.SINGLE)
xact_store, xact_iter = selection.get_selected()
xact_id = xact_store.get_value(xact_iter, 0)
_log.debug('selection: %s', xact_id)
for transaction in self.transaction_data:
if transaction.id == xact_id:
self.lbl_payee.set_text(transaction.payee)
self.posting_store.clear()
for posting in transaction.postings:
self.posting_store.append([
posting.account,
str(posting.amount.amount),
posting.amount.symbol
])
2013-12-17 05:00:21 +00:00
self.detail_view.show()
break
def on_button_clicked(self, widget):
def load_transactions():
transactions = self.client.get_register()
GLib.idle_add(self.on_transactions_loaded, transactions)
self.spinner.show()
self.spinner.start()
threading.Thread(target=load_transactions).start()
def on_transactions_loaded(self, transactions):
self.spinner.stop()
self.spinner.hide()
_log.debug('transactions: %s', transactions)
2013-12-17 05:00:21 +00:00
self.transaction_data = transactions
self.transaction_store.clear()
for transaction in transactions:
self.transaction_store.append([
2013-12-17 05:00:21 +00:00
transaction.id,
transaction.date.strftime('%Y-%m-%d'),
transaction.payee
])
def main(argv=None):
logging.basicConfig(level=logging.DEBUG)
GObject.threads_init()
accounting_win = Accounting()
accounting_win.connect('delete-event', Gtk.main_quit)
Gtk.main()
if __name__ == '__main__':
sys.exit(main())