Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/registerscreen.py
diff options
context:
space:
mode:
authorWade Brainerd <wadetb@gmail.com>2008-11-15 03:18:29 (GMT)
committer Wade Brainerd <wadetb@gmail.com>2008-11-15 03:18:29 (GMT)
commit05529d5acaac833964ec0328733baed474195954 (patch)
tree1de0054edc995de0b5a284b444073609d8f44b4e /registerscreen.py
parent35b1d7e83825d430745026f69fbabd2217c098b4 (diff)
Add help text bar with toggle button.
Split into multiple source files. Ability to change period from Month to Day, Week, Year, Forever. Format currency using locale.
Diffstat (limited to 'registerscreen.py')
-rw-r--r--registerscreen.py226
1 files changed, 226 insertions, 0 deletions
diff --git a/registerscreen.py b/registerscreen.py
new file mode 100644
index 0000000..afa2426
--- /dev/null
+++ b/registerscreen.py
@@ -0,0 +1,226 @@
+# Copyright 2008 by Wade Brainerd.
+# This file is part of Finance.
+#
+# Finance 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 3 of the License, or
+# (at your option) any later version.
+#
+# Finance 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 Finance. If not, see <http://www.gnu.org/licenses/>.
+
+# Import standard Python modules.
+import logging, os, math, time, copy, json, time, datetime, locale
+from gettext import gettext as _
+
+# Set up localization.
+locale.setlocale(locale.LC_ALL, '')
+
+# Import PyGTK.
+import gobject, pygtk, gtk, pango, cairo
+
+# Import Sugar UI modules.
+import sugar.activity.activity
+from sugar.graphics import *
+
+# Import activity module
+import finance
+
+REGISTER_HELP = _('<b>Welcome to Finance!</b> This activity keeps track of income and expenses for anything that earns\nor spends money, like a school club. To get started, use the Transaction box to add credits and debits.\nOnce you have entered some transactions, visit the Chart and Budget views to see more.')
+
+class RegisterScreen(gtk.VBox):
+ def __init__(self, activity):
+ gtk.VBox.__init__(self)
+
+ self.activity = activity
+
+ # Build the transaction list.
+ self.treeview = gtk.TreeView()
+ self.treeview.set_rules_hint(True)
+ self.treeview.set_enable_search(False)
+
+ # Note that the only thing we store in our liststore is the transaction id.
+ # All the actual data is in the activity database.
+ self.liststore = gtk.ListStore(gobject.TYPE_INT)
+ self.treeview.set_model(self.liststore)
+
+ # Construct the columns.
+ renderer = gtk.CellRendererText()
+ renderer.props.editable = True
+ renderer.connect('editing-started', self.description_editing_started_cb)
+ renderer.connect('edited', self.description_edit_cb)
+ col = gtk.TreeViewColumn(_('Description'), renderer)
+ col.set_cell_data_func(renderer, self.description_render_cb)
+ col.set_expand(True)
+ self.treeview.append_column(col)
+
+ renderer = gtk.CellRendererText()
+ renderer.props.editable = True
+ renderer.connect('edited', self.amount_edit_cb)
+ col = gtk.TreeViewColumn(_('Amount'), renderer)
+ col.set_cell_data_func(renderer, self.amount_render_cb)
+ col.set_alignment(0.5)
+ col.set_min_width(120)
+ self.treeview.append_column(col)
+
+ renderer = gtk.CellRendererText()
+ renderer.props.editable = True
+ renderer.connect('edited', self.date_edit_cb)
+ col = gtk.TreeViewColumn(_('Date'), renderer)
+ col.set_alignment(0.5)
+ col.set_cell_data_func(renderer, self.date_render_cb)
+ col.set_min_width(150)
+ self.treeview.append_column(col)
+
+ renderer = gtk.CellRendererText()
+ renderer.props.editable = True
+ renderer.connect('editing-started', self.category_editing_started_cb)
+ renderer.connect('edited', self.category_edit_cb)
+ col = gtk.TreeViewColumn(_('Category'), renderer)
+ col.set_cell_data_func(renderer, self.category_render_cb)
+ col.set_alignment(0.5)
+ col.set_min_width(300)
+ self.treeview.append_column(col)
+
+ scroll = gtk.ScrolledWindow()
+ scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+ scroll.add(self.treeview)
+
+ self.pack_start(scroll, True, True, 0)
+
+ def build(self):
+ # Build liststore.
+ self.liststore.clear()
+ for t in self.activity.visible_transactions:
+ self.liststore.append((t['id'],))
+
+ # Update the help text.
+ self.activity.set_help(REGISTER_HELP)
+
+ def description_render_cb(self, column, cell_renderer, model, iter):
+ id = model.get_value(iter, 0)
+ t = self.activity.transaction_map[id]
+ cell_renderer.set_property('text', t['name'])
+
+ def description_editing_started_cb(self, cell_renderer, editable, path):
+ completion = gtk.EntryCompletion()
+ completion.set_inline_completion(True)
+ completion.set_popup_completion(True)
+ completion.set_minimum_key_length(0)
+ store = gtk.ListStore(str)
+ for c in self.activity.transaction_names.keys():
+ store.append([c])
+ completion.set_model(store)
+ completion.set_text_column(0)
+ editable.set_completion(completion)
+
+ def description_edit_cb(self, cell_renderer, path, new_text):
+ id = self.liststore[path][0]
+ t = self.activity.transaction_map[id]
+ t['name'] = new_text
+
+ # Automatically fill in category if empty, and if transaction name is known.
+ if t['category'] == '' and self.activity.transaction_names.has_key(new_text):
+ for ct in self.activity.data['transactions']:
+ if ct['name'] == new_text and ct['category'] != '':
+ t['category'] = ct['category']
+
+ def amount_render_cb(self, column, cell_renderer, model, iter):
+ id = model.get_value(iter, 0)
+ t = self.activity.transaction_map[id]
+ cell_renderer.set_property('xalign', 1.0)
+ if t['type'] == 'credit':
+ cell_renderer.set_property('foreground', '#4040ff')
+ cell_renderer.set_property('text', locale.currency(t['amount'], False))
+ else:
+ cell_renderer.set_property('foreground', '#ff4040')
+ cell_renderer.set_property('text', locale.currency(-t['amount'], False))
+
+ def amount_edit_cb(self, cell_renderer, path, new_text):
+ id = self.liststore[path][0]
+ t = self.activity.transaction_map[id]
+ amount = locale.atof(new_text)
+ if amount > 0 and t['type'] == 'debit':
+ t['type'] = 'credit'
+ if amount < 0 and t['type'] == 'credit':
+ t['type'] = 'debit'
+ t['amount'] = abs(float(new_text))
+ self.activity.update_summary()
+
+ def date_render_cb(self, column, cell_renderer, model, iter):
+ id = model.get_value(iter, 0)
+ t = self.activity.transaction_map[id]
+ when = datetime.date.fromordinal(t['date'])
+ cell_renderer.set_property('text', when.isoformat())
+ cell_renderer.set_property('xalign', 0.5)
+
+ def date_edit_cb(self, cell_renderer, path, new_text):
+ id = self.liststore[path][0]
+ t = self.activity.transaction_map[id]
+ when = time.strptime(new_text, "%Y-%m-%d")
+ when = datetime.date(when[0], when[1], when[2])
+ t['date'] = when.toordinal()
+ self.activity.build_screen()
+
+ def category_render_cb(self, column, cell_renderer, model, iter):
+ id = model.get_value(iter, 0)
+ t = self.activity.transaction_map[id]
+ cell_renderer.set_property('text', t['category'])
+ cell_renderer.set_property('background', finance.get_category_color_str(t['category']))
+
+ def category_editing_started_cb(self, cell_renderer, editable, path):
+ completion = gtk.EntryCompletion()
+ completion.set_inline_completion(True)
+ completion.set_popup_completion(True)
+ completion.set_minimum_key_length(0)
+ store = gtk.ListStore(str)
+ for c in self.activity.category_names.keys():
+ store.append([c])
+ completion.set_model(store)
+ completion.set_text_column(0)
+ editable.set_completion(completion)
+
+ def category_edit_cb(self, cell_renderer, path, new_text):
+ id = self.liststore[path][0]
+ t = self.activity.transaction_map[id]
+ t['category'] = new_text
+ if new_text != '':
+ self.activity.category_names[new_text] = 1
+
+ def newitem_cb(self, widget):
+ # Automatically display the register screen.
+ if self.activity.screens[-1] != self.activity.register:
+ self.activity.pop_screen()
+ self.activity.push_screen(self)
+
+ id = self.activity.create_transaction(_('New Transaction'), 'credit', 0)
+ iter = self.liststore.append((id,))
+ # Set cursor and begin editing the description.
+ self.treeview.set_cursor(self.liststore.get_path(iter), self.treeview.get_column(0), True)
+
+ def eraseitem_cb(self, widget):
+ # Ignore unless on the register screen.
+ if self.activity.screens[-1] != self.activity.register:
+ return
+
+ sel = self.treeview.get_selection()
+ model, iter = sel.get_selected()
+ if iter:
+ id = model.get_value(iter, 0)
+ self.activity.destroy_transaction(id)
+ self.activity.update_summary()
+
+ path = model.get_path(iter)
+ model.remove(iter)
+
+ # Select the next item, or else the last item.
+ sel.select_path(path)
+ if not sel.path_is_selected(path):
+ row = path[0]-1
+ if row >= 0:
+ sel.select_path((row,))