summaryrefslogtreecommitdiff
path: root/invest-applet/invest/preferences.py
diff options
context:
space:
mode:
Diffstat (limited to 'invest-applet/invest/preferences.py')
-rw-r--r--invest-applet/invest/preferences.py290
1 files changed, 0 insertions, 290 deletions
diff --git a/invest-applet/invest/preferences.py b/invest-applet/invest/preferences.py
deleted file mode 100644
index 40cd72f3..00000000
--- a/invest-applet/invest/preferences.py
+++ /dev/null
@@ -1,290 +0,0 @@
-from gettext import gettext as _
-import locale
-from os.path import join
-
-import gi
-gi.require_version("Gtk", "3.0")
-from gi.repository import Gtk
-from gi.repository import GObject
-import mate_invest
-import currencies
-import cPickle
-
-class PrefsDialog:
- def __init__(self, applet):
- self.ui = Gtk.Builder()
- self.ui.add_from_file(join(mate_invest.BUILDER_DATA_DIR, "prefs-dialog.ui"))
-
- self.dialog = self.ui.get_object("preferences")
- self.treeview = self.ui.get_object("stocks")
- self.currency = self.ui.get_object("currency")
- self.currency_code = None
- self.currencies = currencies.Currencies.currencies
-
- self.ui.get_object("add").connect('clicked', self.on_add_stock)
- self.ui.get_object("add").connect('activate', self.on_add_stock)
- self.ui.get_object("remove").connect('clicked', self.on_remove_stock)
- self.ui.get_object("remove").connect('activate', self.on_remove_stock)
- self.ui.get_object("help").connect('clicked', self.on_help)
- self.treeview.connect('key-press-event', self.on_tree_keypress)
- self.currency.connect('key-press-event', self.on_entry_keypress)
- self.currency.connect('activate', self.on_activate_entry)
- self.currency.connect('focus-out-event', self.on_focus_out_entry)
-
- self.typs = (str, str, float, float, float, float)
- self.names = (_("Symbol"), _("Label"), _("Amount"), _("Price"), _("Commission"), _("Currency Rate"))
- store = Gtk.ListStore(*self.typs)
- store.set_sort_column_id(0, Gtk.SortType.ASCENDING)
- self.treeview.set_model(store)
- self.model = store
-
- completion = Gtk.EntryCompletion()
- self.currency.set_completion(completion)
- liststore = Gtk.ListStore(GObject.TYPE_STRING, GObject.TYPE_STRING)
- completion.set_model(liststore)
- completion.set_text_column(0)
- for code, label in self.currencies.items():
- liststore.append([self.format_currency(label, code), code])
- completion.set_match_func(self.match_func, 0)
- completion.connect("match-selected", self.on_completion_selection, 1)
-
- if mate_invest.CONFIG.has_key("currency"):
- code = mate_invest.CONFIG["currency"];
- if self.currencies.has_key(code):
- self.currency_code = code;
- currency = self.format_currency(self.currencies[self.currency_code], self.currency_code)
- self.currency.set_text(currency)
-
- for n in xrange (0, 5):
- self.create_cell (self.treeview, n, self.names[n], self.typs[n])
- if self.currency_code != None:
- self.add_exchange_column()
-
- stock_items = mate_invest.STOCKS.items ()
- stock_items.sort ()
- for key, data in stock_items:
- label = data["label"]
- purchases = data["purchases"]
- for purchase in purchases:
- if purchase.has_key("exchange"):
- exchange = purchase["exchange"]
- else:
- exchange = 0.0
- store.append([key, label, float(purchase["amount"]), float(purchase["bought"]), float(purchase["comission"]), float(exchange)])
-
- self.sync_ui()
-
- def on_cell_edited(self, cell, path, new_text, col, typ):
- try:
- if col == 0: # stock symbols must be uppercase
- new_text = str.upper(new_text)
- if col < 2:
- self.model[path][col] = new_text
- else:
- value = locale.atof(new_text)
- self.model[path][col] = value
- except Exception, msg:
- mate_invest.error('Exception while processing cell change: %s' % msg)
- pass
-
- def format(self, fmt, value):
- return locale.format(fmt, value, True)
-
- def get_cell_data(self, column, cell, model, iter, data):
- typ, col = data
- val = model[iter][col]
- if typ == int:
- cell.set_property('text', "%d" % typ(val))
- elif typ == float:
- # provide float numbers with at least 2 fractional digits
- digits = self.fraction_digits(val)
- fmt = "%%.%df" % max(digits, 2)
- cell.set_property('text', self.format(fmt, val))
- else:
- cell.set_property('text', typ(val))
-
- # determine the number of non zero digits in the fraction of the value
- def fraction_digits(self, value):
- text = "%g" % value # do not use locale here, so that %g always is rendered to a number with . as decimal separator
- if text.find(".") < 0:
- return 0
- return len(text) - text.find(".") - 1
-
- def create_cell (self, view, column, name, typ):
- cell_description = Gtk.CellRendererText ()
- if typ == float:
- cell_description.set_property("xalign", 1.0)
- cell_description.set_property("editable", True)
- cell_description.connect("edited", self.on_cell_edited, column, typ)
- column_description = Gtk.TreeViewColumn (name, cell_description)
- if typ == str:
- #column_description.add_attribute (cell_description, column, 0)
- column_description.set_sort_column_id(column)
- column_description.set_cell_data_func(cell_description, self.get_cell_data, (typ, column))
- view.append_column(column_description)
-
- def add_exchange_column(self):
- self.create_cell (self.treeview, 5, self.names[5], self.typs[5])
-
- def remove_exchange_column(self):
- column = self.treeview.get_column(5)
- self.treeview.remove_column(column)
-
- def show_run_hide(self, explanation = ""):
- expl = self.ui.get_object("explanation")
- expl.set_markup(explanation)
- self.dialog.show_all()
- if explanation == "":
- expl.hide()
- # returns 1 if help is clicked
- while self.dialog.run() == 1:
- pass
- self.dialog.destroy()
-
- mate_invest.STOCKS = {}
-
- def save_symbol(model, path, iter, data):
- #if int(model[iter][1]) == 0 or float(model[iter][2]) < 0.0001:
- # return
-
- if not model[iter][0] in mate_invest.STOCKS:
- mate_invest.STOCKS[model[iter][0]] = { 'label': model[iter][1], 'purchases': [] }
-
- mate_invest.STOCKS[model[iter][0]]["purchases"].append({
- "amount": float(model[iter][2]),
- "bought": float(model[iter][3]),
- "comission": float(model[iter][4]),
- "exchange": float(model[iter][5])
- })
- self.model.foreach(save_symbol, None)
- try:
- cPickle.dump(mate_invest.STOCKS, file(mate_invest.STOCKS_FILE, 'w'))
- mate_invest.debug('Stocks written to file')
- except Exception, msg:
- mate_invest.error('Could not save stocks file: %s' % msg)
-
- mate_invest.CONFIG = {}
- if self.currency_code != None and len(self.currency_code) == 3:
- mate_invest.CONFIG['currency'] = self.currency_code
- try:
- cPickle.dump(mate_invest.CONFIG, file(mate_invest.CONFIG_FILE, 'w'))
- mate_invest.debug('Configuration written to file')
- except Exception, msg:
- mate_invest.debug('Could not save configuration file: %s' % msg)
-
- def sync_ui(self):
- pass
-
- def on_add_stock(self, w):
- iter = self.model.append(["GOOG", "Google Inc.", 0.0, 0.0, 0.0, 0.0])
- path = self.model.get_path(iter)
- self.treeview.set_cursor(path, self.treeview.get_column(0), True)
-
- def on_remove_stock(self, w):
- model, paths = self.treeview.get_selection().get_selected_rows()
- for path in paths:
- model.remove(model.get_iter(path))
-
- def on_help(self, w):
- mate_invest.help.show_help_section("invest-applet-usage")
-
- def on_tree_keypress(self, w, event):
- if event.keyval == 65535:
- self.on_remove_stock(w)
-
- return False
-
- def format_currency(self, label, code):
- if code == None:
- return label
- return label + " (" + code + ")"
-
- def on_entry_keypress(self, w, event):
- # enter key was pressed
- if event.keyval == 65293:
- self.match_currency()
- return False
-
- # entry was activated (Enter)
- def on_activate_entry(self, entry):
- self.match_currency()
-
- # entry left focus
- def on_focus_out_entry(self, w, event):
- self.match_currency()
- return False
-
- # tries to find a currency for the text in the currency entry
- def match_currency(self):
- # get the text
- text = self.currency.get_text().upper()
-
- # if there is none, finish
- if len(text) == 0:
- self.currency_code = None
- self.pick_currency(None)
- return
-
- # if it is a currency code, take that one
- if len(text) == 3:
- # try to find the string as code
- if self.currencies.has_key(text):
- self.pick_currency(text)
- return
- else:
- # try to find the code for the string
- for code, label in self.currencies.items():
- # if the entry equals to the full label,
- # or the entry equals to the label+code concat
- if label.upper() == text or self.format_currency(label.upper(), code) == text:
- # then we take that code
- self.pick_currency(code)
- return
-
- # the entry is not valid, reuse the old one
- self.pick_currency(self.currency_code)
-
- # pick this currency, stores it and sets the entry text
- def pick_currency(self, code):
- if code == None:
- label = ""
- if len(self.treeview.get_columns()) == 6:
- self.remove_exchange_column()
- else:
- label = self.currencies[code]
- if len(self.treeview.get_columns()) == 5:
- self.add_exchange_column()
- self.currency.set_text(self.format_currency(label, code))
- self.currency_code = code
-
- # finds matches by testing candidate strings to have tokens starting with the entered text's tokens
- def match_func(self, completion, key, iter, column):
- keys = key.split()
- model = completion.get_model()
- text = model.get_value(iter, column).lower()
- tokens = text.split()
-
- # each key must have a match
- for key in keys:
- found_key = False
- # check any token of the completions start with the key
- for token in tokens:
- # remove the ( from the currency code
- if token.startswith("("):
- token = token[1:]
- if token.startswith(key):
- found_key = True
- break
- # this key does not have a match, this is not a completion
- if not found_key:
- return False
- # all keys matched, this is a completion
- return True
-
- # stores the selected currency code
- def on_completion_selection(self, completion, model, iter, column):
- self.pick_currency(model.get_value(iter, column))
-
-
-def show_preferences(applet, explanation = ""):
- PrefsDialog(applet).show_run_hide(explanation)