summaryrefslogtreecommitdiff
path: root/invest-applet/invest
diff options
context:
space:
mode:
Diffstat (limited to 'invest-applet/invest')
-rw-r--r--invest-applet/invest/__init__.py63
-rw-r--r--invest-applet/invest/about.py13
-rw-r--r--invest-applet/invest/applet.py100
-rw-r--r--invest-applet/invest/chart.py34
-rw-r--r--invest-applet/invest/defs.py.in1
-rw-r--r--invest-applet/invest/help.py10
-rwxr-xr-xinvest-applet/invest/invest-applet.py31
-rwxr-xr-xinvest-applet/invest/mate-invest-chart10
-rw-r--r--invest-applet/invest/preferences.py40
-rw-r--r--invest-applet/invest/quotes.py47
-rw-r--r--invest-applet/invest/widgets.py67
11 files changed, 229 insertions, 187 deletions
diff --git a/invest-applet/invest/__init__.py b/invest-applet/invest/__init__.py
index 101881f5..beb299c1 100644
--- a/invest-applet/invest/__init__.py
+++ b/invest-applet/invest/__init__.py
@@ -3,7 +3,13 @@ from os.path import join, exists, isdir, isfile, dirname, abspath, expanduser
from types import ListType
import datetime
-import gtk, gtk.gdk, mateconf, gobject
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GObject
+from gi.repository import Gio
+
import cPickle
import networkmanager
@@ -54,19 +60,6 @@ if not exists(USER_INVEST_DIR):
# when presenting save/open dialogs
os.chdir(expanduser("~"))
-#Gconf client
-MATECONF_CLIENT = mateconf.client_get_default()
-
-# MateConf directory for invest in window mode and shared settings
-MATECONF_DIR = "/apps/invest"
-
-# MateConf key for list of enabled handlers, when uninstalled, use a debug key to not conflict
-# with development version
-#MATECONF_ENABLED_HANDLERS = MATECONF_DIR + "/enabled_handlers"
-
-# Preload mateconf directories
-#MATECONF_CLIENT.add_dir(MATECONF_DIR, mateconf.CLIENT_PRELOAD_RECURSIVE)
-
# tests whether the given stocks are in the old labelless format
def labelless_stock_format(stocks):
if len(stocks) == 0:
@@ -161,32 +154,30 @@ PROXY = None
# borrowed from Ross Burton
# http://burtonini.com/blog/computers/postr
# extended by exception handling and retry scheduling
-def get_mate_proxy(client):
- sleep = 10 # sleep between attempts for 10 seconds
- attempts = 3 # try to get configuration from mateconf at most three times
- get_mate_proxy_retry(client, attempts, sleep)
-
-def get_mate_proxy_retry(client, attempts, sleep):
- # decrease attempts counter
- attempts -= 1
+def get_gnome_proxy():
# sanity check if we still need to look for proxy configuration
global PROXY
if PROXY != None:
return
- # try to get config from mateconfd
+ # try to get config from gsettings
try:
- if client.get_bool("/system/http_proxy/use_http_proxy"):
- host = client.get_string("/system/http_proxy/host")
- port = client.get_int("/system/http_proxy/port")
+ proxy_settings = Gio.Settings.new("org.gnome.system.proxy")
+ proxy_http_settings = Gio.Settings.new("org.gnome.system.proxy.http")
+
+ proxy_mode = proxy_settings.get_enum("mode")
+
+ if proxy_mode == 1:
+ host = proxy_http_settings.get_string("host")
+ port = proxy_http_settings.get_int("port")
if host is None or host == "" or port == 0:
- # mate proxy is not valid, stop here
+ # system proxy is not valid, stop here
return
- if client.get_bool("/system/http_proxy/use_authentication"):
- user = client.get_string("/system/http_proxy/authentication_user")
- password = client.get_string("/system/http_proxy/authentication_password")
+ if proxy_http_settings.get_boolean("use-authentication"):
+ user = proxy_http_settings.get_string("authentication-user")
+ password = proxy_http_settings.get_string("authentication-password")
if user and user != "":
url = "http://%s:%s@%s:%d" % (user, password, host, port)
else:
@@ -198,15 +189,9 @@ def get_mate_proxy_retry(client, attempts, sleep):
PROXY = {'http': url}
except Exception, msg:
- error("Failed to get proxy configuration from MateConfd:\n%s" % msg)
- # we did not succeed, schedule retry
- if attempts > 0:
- error("Retrying to contact MateConfd in %d seconds" % sleep)
- gobject.timeout_add(sleep * 1000, get_mate_proxy_retry, client, attempts, sleep)
-
-# use mateconf to get proxy config
-client = mateconf.client_get_default()
-get_mate_proxy(client)
+ error("Failed to get proxy configuration from GSettings:\n%s" % msg)
+
+get_gnome_proxy()
# connect to Network Manager to identify current network connectivity
diff --git a/invest-applet/invest/about.py b/invest-applet/invest/about.py
index 2b7293f4..9599c687 100644
--- a/invest-applet/invest/about.py
+++ b/invest-applet/invest/about.py
@@ -3,16 +3,21 @@ from os.path import join
from gettext import gettext as _
from mate_invest.defs import VERSION
import mate_invest
-import gtk, gtk.gdk
+
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
invest_logo = None
try:
- invest_logo = gtk.gdk.pixbuf_new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"), 96, 96)
+ invest_logo = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"), 96, 96)
except Exception, msg:
pass
def show_about():
- about = gtk.AboutDialog()
+ about = Gtk.AboutDialog()
infos = {
"program-name" : _("Invest"),
"logo" : invest_logo,
@@ -21,7 +26,7 @@ def show_about():
"copyright" : "Copyright © 2004-2005 Raphael Slinckx.\nCopyright © 2009-2010 Enrico Minack."
}
- about.set_authors(["Raphael Slinckx <[email protected]>", "Enrico Minack <[email protected]>"])
+# about.set_authors("Raphael Slinckx <[email protected]>\nEnrico Minack <[email protected]>")
# about.set_artists([])
# about.set_documenters([])
diff --git a/invest-applet/invest/applet.py b/invest-applet/invest/applet.py
index 8b134e67..1a7cbc90 100644
--- a/invest-applet/invest/applet.py
+++ b/invest-applet/invest/applet.py
@@ -1,34 +1,46 @@
import os, time
from os.path import *
-import mateapplet, gtk, gtk.gdk, mateconf, gobject
-gobject.threads_init()
+
+import gi
+gi.require_version("Gtk", "2.0")
+
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
+from gi.repository import MatePanelApplet
+
+GObject.threads_init()
from gettext import gettext as _
-import mateconf
import mate_invest, mate_invest.about, mate_invest.chart, mate_invest.preferences, mate_invest.defs
from mate_invest.quotes import QuoteUpdater
from mate_invest.widgets import *
-gtk.window_set_default_icon_from_file(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"))
+Gtk.Window.set_default_icon_from_file(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"))
-class InvestApplet:
+class InvestApplet(MatePanelApplet.Applet):
def __init__(self, applet):
self.applet = applet
- self.applet.setup_menu_from_file (
- None, "Invest_Applet.xml",
- None, [("About", self.on_about),
- ("Help", self.on_help),
- ("Prefs", self.on_preferences),
- ("Refresh", self.on_refresh)
- ])
-
- evbox = gtk.HBox()
- self.applet_icon = gtk.Image()
+
+ # name, stock_id, label, accellerator, tooltip, callback
+ menu_actions = [("About", Gtk.STOCK_HELP, _("About"), None, None, self.on_about),
+ ("Help", Gtk.STOCK_HELP, _("Help"), None, None, self.on_help),
+ ("Prefs", Gtk.STOCK_PREFERENCES, _("Preferences"), None, None, self.on_preferences),
+ ("Refresh", Gtk.STOCK_REFRESH, _("Refresh"), None, None, self.on_refresh)
+ ]
+ actiongroup = Gtk.ActionGroup.new("InvestAppletActions")
+ actiongroup.set_translation_domain(mate_invest.defs.GETTEXT_PACKAGE)
+ actiongroup.add_actions(menu_actions, None)
+ self.applet.setup_menu_from_file (join(mate_invest.defs.PKGDATADIR, "Invest_Applet.xml"), actiongroup)
+
+ evbox = Gtk.HBox()
+ self.applet_icon = Gtk.Image()
self.set_applet_icon(0)
self.applet_icon.show()
evbox.add(self.applet_icon)
self.applet.add(evbox)
- self.applet.connect("button-press-event",self.button_clicked)
+ self.applet.connect("button-press-event", self.button_clicked)
self.applet.show_all()
self.new_ilw()
@@ -43,7 +55,7 @@ class InvestApplet:
self.new_ilw()
def button_clicked(self, widget,event):
- if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
+ if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 1:
# Three cases...
if len (mate_invest.STOCKS) == 0:
# a) We aren't configured yet
@@ -51,7 +63,7 @@ class InvestApplet:
self.reload_ilw()
elif not self.quotes_updater.quotes_valid:
# b) We can't get the data (e.g. offline)
- alert = gtk.MessageDialog(buttons=gtk.BUTTONS_CLOSE)
+ alert = Gtk.MessageDialog(buttons=Gtk.ButtonsType.CLOSE)
alert.set_markup(_("<b>No stock quotes are currently available</b>"))
alert.format_secondary_text(_("The server could not be contacted. The computer is either offline or the servers are down. Try again later."))
alert.run()
@@ -60,35 +72,35 @@ class InvestApplet:
# c) Everything is normal: pop-up the window
self.ilw.toggle_show()
- def on_about(self, component, verb):
+ def on_about(self, action):
mate_invest.about.show_about()
- def on_help(self, component, verb):
+ def on_help(self, action):
mate_invest.help.show_help()
- def on_preferences(self, component, verb):
+ def on_preferences(self, action):
mate_invest.preferences.show_preferences(self)
self.reload_ilw()
- def on_refresh(self, component, verb):
+ def on_refresh(self, action):
self.quotes_updater.refresh()
def set_applet_icon(self, change):
if change == 1:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_up.png"), -1,-1)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_up.png"), -1,-1)
elif change == 0:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_neutral.png"), -1,-1)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_neutral.png"), -1,-1)
else:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_down.png"), -1,-1)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_down.png"), -1,-1)
self.applet_icon.set_from_pixbuf(pixbuf)
def set_applet_tooltip(self, text):
self.applet_icon.set_tooltip_text(text)
-class InvestmentsListWindow(gtk.Window):
+class InvestmentsListWindow(Gtk.Window):
def __init__(self, applet, list):
- gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
- self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
+ Gtk.Window.__init__(self, type=Gtk.WindowType.TOPLEVEL)
+ self.set_type_hint(Gdk.WindowTypeHint.DOCK)
self.stick()
self.set_resizable(False)
self.set_border_width(6)
@@ -106,7 +118,7 @@ class InvestmentsListWindow(gtk.Window):
def toggle_show(self):
if self.hidden == True:
self.update_position()
- self.show()
+ self.show_all()
self.hidden = False
elif self.hidden == False:
self.hide()
@@ -120,15 +132,19 @@ class InvestmentsListWindow(gtk.Window):
# Get our own dimensions & position
#(wx, wy) = self.get_origin()
- (ax, ay) = self.applet.window.get_origin()
+ ax=0
+ ay=0
+ #FIXME this doesnt work with gir
+ self.applet.window.get_origin(ax, ay)
(ww, wh) = self.get_size ()
(aw, ah) = self.applet.window.get_size ()
- screen = self.applet.window.get_screen()
- monitor = screen.get_monitor_geometry (screen.get_monitor_at_window (self.applet.window))
+ screen = self.applet.get_screen()
+ monitor = Gdk.Rectangle(0, 0, 0, 0)
+ screen.get_monitor_geometry (screen.get_monitor_at_window (self.applet.window), monitor)
- if self.alignment == mateapplet.ORIENT_LEFT:
+ if self.alignment == MatePanelApplet.AppletOrient.LEFT:
x = ax - ww
y = ay
@@ -139,11 +155,11 @@ class InvestmentsListWindow(gtk.Window):
y = 0
if (y + wh > monitor.height / 2):
- gravity = gtk.gdk.GRAVITY_SOUTH_WEST
+ gravity = Gdk.Gravity.SOUTH_WEST
else:
- gravity = gtk.gdk.GRAVITY_NORTH_WEST
+ gravity = Gdk.Gravity.NORTH_WEST
- elif self.alignment == mateapplet.ORIENT_RIGHT:
+ elif self.alignment == MatePanelApplet.AppletOrient.RIGHT:
x = ax + aw
y = ay
@@ -154,11 +170,11 @@ class InvestmentsListWindow(gtk.Window):
y = 0
if (y + wh > monitor.height / 2):
- gravity = gtk.gdk.GRAVITY_SOUTH_EAST
+ gravity = Gdk.Gravity.SOUTH_EAST
else:
- gravity = gtk.gdk.GRAVITY_NORTH_EAST
+ gravity = Gdk.Gravity.NORTH_EAST
- elif self.alignment == mateapplet.ORIENT_DOWN:
+ elif self.alignment == MatePanelApplet.AppletOrient.DOWN:
x = ax
y = ay + ah
@@ -168,8 +184,8 @@ class InvestmentsListWindow(gtk.Window):
if (x < 0):
x = 0
- gravity = gtk.gdk.GRAVITY_NORTH_WEST
- elif self.alignment == mateapplet.ORIENT_UP:
+ gravity = Gdk.Gravity.NORTH_WEST
+ elif self.alignment == MatePanelApplet.AppletOrient.UP:
x = ax
y = ay - wh
@@ -179,7 +195,7 @@ class InvestmentsListWindow(gtk.Window):
if (x < 0):
x = 0
- gravity = gtk.gdk.GRAVITY_SOUTH_WEST
+ gravity = Gdk.Gravity.SOUTH_WEST
self.move(x, y)
self.set_gravity(gravity)
diff --git a/invest-applet/invest/chart.py b/invest-applet/invest/chart.py
index 358c51df..e13e0686 100644
--- a/invest-applet/invest/chart.py
+++ b/invest-applet/invest/chart.py
@@ -1,7 +1,11 @@
#!/usr/bin/env python
-import gtk, gtk.gdk
-import gobject
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
import os
import mate_invest
from gettext import gettext as _
@@ -15,16 +19,16 @@ import time
AUTOREFRESH_TIMEOUT = 20*60*1000 # 15 minutes
# based on http://www.johnstowers.co.nz/blog/index.php/2007/03/12/threading-and-pygtk/
-class _IdleObject(gobject.GObject):
+class _IdleObject(GObject.GObject):
"""
- Override gobject.GObject to always emit signals in the main thread
+ Override GObject.GObject to always emit signals in the main thread
by emmitting on an idle handler
"""
def __init__(self):
- gobject.GObject.__init__(self)
+ GObject.GObject.__init__(self)
def emit(self, *args):
- gobject.idle_add(gobject.GObject.emit,self,*args)
+ GObject.idle_add(GObject.GObject.emit,self,*args)
class ImageRetriever(Thread, _IdleObject):
"""
@@ -33,11 +37,11 @@ class ImageRetriever(Thread, _IdleObject):
"""
__gsignals__ = {
"completed": (
- gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, []),
+ GObject.SignalFlags.RUN_LAST, None, []),
# FIXME: should we be making use of this?
#"progress": (
- # gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [
- # gobject.TYPE_FLOAT]) #percent complete
+ # GObject.SignalFlags.RUN_LAST, None, [
+ # GObject.TYPE_FLOAT]) #percent complete
}
def __init__(self, image_url):
@@ -47,12 +51,12 @@ class ImageRetriever(Thread, _IdleObject):
self.retrieved = False
def run(self):
- self.image = gtk.Image()
+ self.image = Gtk.Image()
try: sock = urllib.urlopen(self.image_url, proxies = mate_invest.PROXY)
except Exception, msg:
mate_invest.debug("Error while opening %s: %s" % (self.image_url, msg))
else:
- loader = gtk.gdk.PixbufLoader()
+ loader = GdkPixbuf.PixbufLoader()
loader.connect("closed", lambda loader: self.image.set_from_pixbuf(loader.get_pixbuf()))
loader.write(sock.read())
sock.close()
@@ -107,7 +111,7 @@ class FinancialChart:
win.set_title(_("Financial Chart"))
try:
- pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"), 96,96)
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest_neutral.svg"), 96,96)
self.ui.get_object("plot").set_from_pixbuf(pixbuf)
except Exception, msg:
mate_invest.debug("Could not load 'invest-neutral.svg' file: %s" % msg)
@@ -241,14 +245,14 @@ class FinancialChart:
def on_autorefresh_toggled(self, autorefresh):
if self.autorefresh_id != 0:
- gobject.source_remove(self.autorefresh_id)
+ GObject.source_remove(self.autorefresh_id)
self.autorefresh_id = 0
if autorefresh.get_active():
- self.autorefresh_id = gobject.timeout_add(AUTOREFRESH_TIMEOUT, self.on_refresh_chart, True)
+ self.autorefresh_id = GObject.timeout_add(AUTOREFRESH_TIMEOUT, self.on_refresh_chart, True)
def show_chart(tickers):
- ui = gtk.Builder();
+ ui = Gtk.Builder();
ui.add_from_file(os.path.join(mate_invest.BUILDER_DATA_DIR, "financialchart.ui"))
chart = FinancialChart(ui)
ui.get_object("s").set_text(' '.join(tickers))
diff --git a/invest-applet/invest/defs.py.in b/invest-applet/invest/defs.py.in
index 769e957c..3985ea38 100644
--- a/invest-applet/invest/defs.py.in
+++ b/invest-applet/invest/defs.py.in
@@ -7,3 +7,4 @@ GETTEXT_PACKAGE = "@GETTEXT_PACKAGE@"
MATELOCALEDIR = "@MATELOCALEDIR@"
BUILDERDIR = "@BUILDERDIR@"
NETWORKMANAGER_VERSION = "@NETWORKMANAGER_VERSION@"
+PKGDATADIR = "@PKGDATADIR@"
diff --git a/invest-applet/invest/help.py b/invest-applet/invest/help.py
index 7dfaabf0..a283a230 100644
--- a/invest-applet/invest/help.py
+++ b/invest-applet/invest/help.py
@@ -1,8 +1,12 @@
# -*- coding: utf-8 -*-
-import gtk, gtk.gdk
+
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
def show_help():
- gtk.show_uri(None, "ghelp:invest-applet", gtk.gdk.CURRENT_TIME)
+ Gtk.show_uri(None, "ghelp:invest-applet", Gdk.CURRENT_TIME)
def show_help_section(id):
- gtk.show_uri(None, "ghelp:invest-applet?%s" % id, gtk.gdk.CURRENT_TIME)
+ Gtk.show_uri(None, "ghelp:invest-applet?%s" % id, Gdk.CURRENT_TIME)
diff --git a/invest-applet/invest/invest-applet.py b/invest-applet/invest/invest-applet.py
index 92a2b960..4fa883fc 100755
--- a/invest-applet/invest/invest-applet.py
+++ b/invest-applet/invest/invest-applet.py
@@ -1,8 +1,11 @@
#!/usr/bin/env python
#
-import gobject
-import gtk, mateapplet
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import GObject
+from gi.repository import MatePanelApplet
import getopt, sys
from os.path import *
@@ -30,20 +33,20 @@ locale.textdomain(mate_invest.defs.GETTEXT_PACKAGE)
from gettext import gettext as _
-def applet_factory(applet, iid):
+def applet_factory(applet, iid, data):
mate_invest.debug('Starting invest instance: %s %s'% ( applet, iid ))
mate_invest.applet.InvestApplet(applet)
return True
# Return a standalone window that holds the applet
def build_window():
- app = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ app = Gtk.Window(Gtk.WindowType.TOPLEVEL)
app.set_title(_("Invest Applet"))
- app.connect("destroy", gtk.main_quit)
+ app.connect("destroy", Gtk.main_quit)
app.set_property('resizable', False)
- applet = mateapplet.Applet()
- applet_factory(applet, None)
+ applet = MatePanelApplet.Applet()
+ applet_factory(applet, None, None)
applet.reparent(app)
app.show_all()
@@ -88,11 +91,11 @@ if __name__ == "__main__":
if standalone:
build_window()
- gtk.main()
+ Gtk.main()
else:
- mateapplet.matecomponent_factory(
- "OAFIID:Invest_Applet_Factory",
- mateapplet.Applet.__gtype__,
- mate_invest.defs.PACKAGE,
- mate_invest.defs.VERSION,
- applet_factory)
+ MatePanelApplet.Applet.factory_main(
+ "InvestAppletFactory",
+ True,
+ MatePanelApplet.Applet.__gtype__,
+ applet_factory,
+ None)
diff --git a/invest-applet/invest/mate-invest-chart b/invest-applet/invest/mate-invest-chart
index ea025de8..5c8ed9d3 100755
--- a/invest-applet/invest/mate-invest-chart
+++ b/invest-applet/invest/mate-invest-chart
@@ -1,6 +1,10 @@
#!/usr/bin/env python
-import sys, mate_invest.chart, gtk
+import sys, mate_invest.chart
+
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
# Prepare i18n
import gettext, locale
@@ -11,5 +15,5 @@ locale.textdomain(mate_invest.defs.GETTEXT_PACKAGE)
if __name__ == "__main__":
win = mate_invest.chart.show_chart(sys.argv[1:])
- win.connect("destroy", lambda x: gtk.main_quit())
- gtk.main()
+ win.connect("destroy", lambda x: Gtk.main_quit())
+ Gtk.main()
diff --git a/invest-applet/invest/preferences.py b/invest-applet/invest/preferences.py
index 03a9147f..f531a51e 100644
--- a/invest-applet/invest/preferences.py
+++ b/invest-applet/invest/preferences.py
@@ -1,14 +1,17 @@
from gettext import gettext as _
import locale
from os.path import join
-import gtk, gobject, mateconf
+import gi
+gi.require_version("Gtk", "2.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 = Gtk.Builder()
self.ui.add_from_file(join(mate_invest.BUILDER_DATA_DIR, "prefs-dialog.ui"))
self.dialog = self.ui.get_object("preferences")
@@ -29,14 +32,14 @@ class PrefsDialog:
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.SORT_ASCENDING)
+ 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()
+ completion = Gtk.EntryCompletion()
self.currency.set_completion(completion)
- liststore = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+ 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():
@@ -66,7 +69,7 @@ class PrefsDialog:
exchange = purchase["exchange"]
else:
exchange = 0.0
- store.append([key, label, purchase["amount"], purchase["bought"], purchase["comission"], exchange])
+ store.append([key, label, float(purchase["amount"]), float(purchase["bought"]), float(purchase["comission"]), float(exchange)])
self.sync_ui()
@@ -88,16 +91,16 @@ class PrefsDialog:
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(model[iter][col]))
+ cell.set_property('text', "%d" % typ(val))
elif typ == float:
# provide float numbers with at least 2 fractional digits
- val = model[iter][col]
digits = self.fraction_digits(val)
fmt = "%%.%df" % max(digits, 2)
cell.set_property('text', self.format(fmt, val))
else:
- cell.set_property('text', typ(model[iter][col]))
+ cell.set_property('text', typ(val))
# determine the number of non zero digits in the fraction of the value
def fraction_digits(self, value):
@@ -107,17 +110,16 @@ class PrefsDialog:
return len(text) - text.find(".") - 1
def create_cell (self, view, column, name, typ):
- cell_description = gtk.CellRendererText ()
+ 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)
+ column_description = Gtk.TreeViewColumn (name, cell_description)
if typ == str:
- column_description.set_attributes (cell_description, text=column)
+ #column_description.add_attribute (cell_description, column, 0)
column_description.set_sort_column_id(column)
- if typ == float:
- column_description.set_cell_data_func(cell_description, self.get_cell_data, (float, 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):
@@ -140,7 +142,7 @@ class PrefsDialog:
mate_invest.STOCKS = {}
- def save_symbol(model, path, iter):
+ def save_symbol(model, path, iter, data):
#if int(model[iter][1]) == 0 or float(model[iter][2]) < 0.0001:
# return
@@ -153,7 +155,7 @@ class PrefsDialog:
"comission": float(model[iter][4]),
"exchange": float(model[iter][5])
})
- self.model.foreach(save_symbol)
+ 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')
@@ -164,7 +166,7 @@ class PrefsDialog:
if self.currency_code != None and len(self.currency_code) == 3:
mate_invest.CONFIG['currency'] = self.currency_code
try:
- cPickle.dump(invest.CONFIG, file(mate_invest.CONFIG_FILE, 'w'))
+ 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)
@@ -173,7 +175,7 @@ class PrefsDialog:
pass
def on_add_stock(self, w):
- iter = self.model.append(["GOOG", "Google Inc.", 0, 0, 0, 0])
+ 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)
diff --git a/invest-applet/invest/quotes.py b/invest-applet/invest/quotes.py
index 9f916eb1..44943b1d 100644
--- a/invest-applet/invest/quotes.py
+++ b/invest-applet/invest/quotes.py
@@ -1,5 +1,10 @@
from os.path import join
-import mateapplet, gtk, gtk.gdk, mateconf, gobject
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GdkPixbuf
+from gi.repository import GObject
from gettext import gettext as _
import csv
import locale
@@ -19,16 +24,16 @@ QUOTES_URL="http://finance.yahoo.com/d/quotes.csv?s=%(s)s&f=snc4l1d1t1c1ohgv&e=.
QUOTES_CSV_FIELDS=["ticker", "label", "currency", ("trade", float), "date", "time", ("variation", float), ("open", float), ("high", float), ("low", float), ("volume", int)]
# based on http://www.johnstowers.co.nz/blog/index.php/2007/03/12/threading-and-pygtk/
-class _IdleObject(gobject.GObject):
+class _IdleObject(GObject.GObject):
"""
- Override gobject.GObject to always emit signals in the main thread
+ Override GObject.GObject to always emit signals in the main thread
by emmitting on an idle handler
"""
def __init__(self):
- gobject.GObject.__init__(self)
+ GObject.GObject.__init__(self)
def emit(self, *args):
- gobject.idle_add(gobject.GObject.emit,self,*args)
+ GObject.idle_add(GObject.GObject.emit,self,*args)
class QuotesRetriever(Thread, _IdleObject):
"""
@@ -37,11 +42,11 @@ class QuotesRetriever(Thread, _IdleObject):
"""
__gsignals__ = {
"completed": (
- gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, []),
+ GObject.SignalFlags.RUN_LAST, None, []),
# FIXME: We don't monitor progress, yet ...
#"progress": (
- # gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, [
- # gobject.TYPE_FLOAT]) #percent complete
+ # GObject.SignalFlags.RUN_LAST, None, [
+ # GObject.TYPE_FLOAT]) #percent complete
}
def __init__(self, tickers):
@@ -65,18 +70,18 @@ class QuotesRetriever(Thread, _IdleObject):
self.emit("completed")
-class QuoteUpdater(gtk.ListStore):
+class QuoteUpdater(Gtk.ListStore):
updated = False
last_updated = None
quotes_valid = False
timeout_id = None
SYMBOL, LABEL, CURRENCY, TICKER_ONLY, BALANCE, BALANCE_PCT, VALUE, VARIATION_PCT, PB = range(9)
def __init__ (self, change_icon_callback, set_tooltip_callback):
- gtk.ListStore.__init__ (self, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, bool, float, float, float, float, gtk.gdk.Pixbuf)
+ Gtk.ListStore.__init__ (self, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, bool, float, float, float, float, GdkPixbuf.Pixbuf)
self.set_update_interval(AUTOREFRESH_TIMEOUT)
self.change_icon_callback = change_icon_callback
self.set_tooltip_callback = set_tooltip_callback
- self.set_sort_column_id(1, gtk.SORT_ASCENDING)
+ self.set_sort_column_id(1, Gtk.SortType.ASCENDING)
self.refresh()
# tell the network manager to notify me when network status changes
@@ -85,11 +90,11 @@ class QuoteUpdater(gtk.ListStore):
def set_update_interval(self, interval):
if self.timeout_id != None:
mate_invest.debug("Canceling refresh timer")
- gobject.source_remove(self.timeout_id)
+ GObject.source_remove(self.timeout_id)
self.timeout_id = None
if interval > 0:
mate_invest.debug("Setting refresh timer to %s:%02d.%03d" % ( interval / 60000, interval % 60000 / 1000, interval % 1000) )
- self.timeout_id = gobject.timeout_add(interval, self.refresh)
+ self.timeout_id = GObject.timeout_add(interval, self.refresh)
def nm_state_changed(self):
# when nm is online but we do not have an update timer, create it and refresh
@@ -275,10 +280,10 @@ class QuoteUpdater(gtk.ListStore):
break
if is_simple_quote:
- row = self.insert(0, [ticker, label, val["currency"], True, 0, 0, val["trade"], val["variation_pct"], pb])
+ row = self.insert(0, [ticker, label, val["currency"], True, 0.0, 0.0, val["trade"], val["variation_pct"], pb])
else:
(balance, change) = self.balance(mate_invest.STOCKS[ticker]["purchases"], val["trade"])
- row = self.insert(0, [ticker, label, val["currency"], False, balance, change, val["trade"], val["variation_pct"], pb])
+ row = self.insert(0, [ticker, label, val["currency"], False, float(balance), float(change), val["trade"], val["variation_pct"], pb])
self.add_balance_change(balance, change, val["currency"])
if len(ticker.split('.')) == 2:
@@ -364,15 +369,15 @@ class QuoteUpdater(gtk.ListStore):
ticker = self.get_value(iter, self.SYMBOL)
value = self.get_value(iter, self.VALUE)
(balance, change) = self.balance(mate_invest.STOCKS[ticker]["purchases"], value, rates[currency])
- self.set(iter, self.BALANCE, balance)
- self.set(iter, self.BALANCE_PCT, change)
+ self.set_value(iter, self.BALANCE, balance)
+ self.set_value(iter, self.BALANCE_PCT, change)
self.add_balance_change(balance, change, target_currency)
# now, convert the value
value = self.get_value(iter, self.VALUE)
value *= rates[currency]
- self.set(iter, self.VALUE, value)
- self.set(iter, self.CURRENCY, target_currency)
+ self.set_value(iter, self.VALUE, value)
+ self.set_value(iter, self.CURRENCY, target_currency)
else:
# consider non-converted stocks here
@@ -406,5 +411,5 @@ class QuoteUpdater(gtk.ListStore):
break
return res
-if gtk.pygtk_version < (2,8,0):
- gobject.type_register(QuoteUpdater)
+#if Gtk.pygtk_version < (2,8,0):
+# GObject.type_register(QuoteUpdater)
diff --git a/invest-applet/invest/widgets.py b/invest-applet/invest/widgets.py
index 0a897e30..d7ff9228 100644
--- a/invest-applet/invest/widgets.py
+++ b/invest-applet/invest/widgets.py
@@ -1,6 +1,13 @@
import os, time
from os.path import *
-import mateapplet, gtk, gtk.gdk, mateconf, gobject, pango
+
+import gi
+gi.require_version("Gtk", "2.0")
+from gi.repository import Gtk
+from gi.repository import Gdk
+from gi.repository import GObject
+from gi.repository import Pango
+
from gettext import gettext as _
import locale
import csv
@@ -35,12 +42,12 @@ MEDIUM = -1
TICKER_TIMEOUT = 10000#3*60*1000#
-class InvestWidget(gtk.TreeView):
+class InvestWidget(Gtk.TreeView):
def __init__(self, quotes_updater):
- gtk.TreeView.__init__(self)
+ Gtk.TreeView.__init__(self)
self.set_property("rules-hint", True)
- self.set_reorderable(True)
- self.set_hover_selection(True)
+# self.set_property("reorderable", True)
+ self.set_property("hover-selection", True)
simple_quotes_only = quotes_updater.simple_quotes_only()
@@ -54,10 +61,10 @@ class InvestWidget(gtk.TreeView):
self._getcelldata_balancepct]
for i, col_name in enumerate(col_names):
if i < 3:
- cell = gtk.CellRendererText()
+ cell = Gtk.CellRendererText()
if i > 0:
cell.set_property("xalign", 1.0)
- column = gtk.TreeViewColumn (col_name, cell)
+ column = Gtk.TreeViewColumn (col_name, cell)
if i == 0:
column.set_sort_column_id(quotes_updater.LABEL)
elif i == 2:
@@ -65,15 +72,15 @@ class InvestWidget(gtk.TreeView):
column.set_cell_data_func(cell, col_cellgetdata_functions[i])
self.append_column(column)
elif i == 3:
- cell_pb = gtk.CellRendererPixbuf()
- column = gtk.TreeViewColumn (col_name, cell_pb, pixbuf=quotes_updater.PB)
+ cell_pb = Gtk.CellRendererPixbuf()
+ column = Gtk.TreeViewColumn (col_name, cell_pb, pixbuf=quotes_updater.PB)
self.append_column(column)
else:
# add the last two column only if we have any positions
if simple_quotes_only == False:
- cell = gtk.CellRendererText()
+ cell = Gtk.CellRendererText()
cell.set_property("xalign", 1.0)
- column = gtk.TreeViewColumn (col_name, cell)
+ column = Gtk.TreeViewColumn (col_name, cell)
if i == 4:
column.set_sort_column_id(quotes_updater.BALANCE)
elif i == 5:
@@ -101,11 +108,17 @@ class InvestWidget(gtk.TreeView):
return locale.format("%+.2f", value, True, True) + " " + currency
- def _getcelldata_label(self, column, cell, model, iter):
- cell.set_property('text', model[iter][model.LABEL])
+ def _getcelldata_label(self, column, cell, model, iter, userdata):
+ label = model[iter][model.LABEL]
+ cell.set_property('text', label)
- def _getcelldata_value(self, column, cell, model, iter):
- cell.set_property('text', self.format_currency(model[iter][model.VALUE], model[iter][model.CURRENCY]))
+ def _getcelldata_value(self, column, cell, model, iter, userdata):
+ value = model[iter][model.VALUE];
+ currency = model[iter][model.CURRENCY];
+ if value == None or currency == None:
+ cell.set_property('text', "")
+ else:
+ cell.set_property('text', self.format_currency(value, currency))
def is_selected(self, model, iter):
m, it = self.get_selection().get_selected()
@@ -120,14 +133,14 @@ class InvestWidget(gtk.TreeView):
intensity = LIGHT
return palette[intensity]
- def _getcelldata_variation(self, column, cell, model, iter):
+ def _getcelldata_variation(self, column, cell, model, iter, userdata):
color = self.get_color(model, iter, model.VARIATION_PCT)
change_pct = self.format_percent(model[iter][model.VARIATION_PCT])
cell.set_property('markup',
"<span foreground='%s'>%s</span>" %
(color, change_pct))
- def _getcelldata_balance(self, column, cell, model, iter):
+ def _getcelldata_balance(self, column, cell, model, iter, userdata):
is_ticker_only = model[iter][model.TICKER_ONLY]
color = self.get_color(model, iter, model.BALANCE)
if is_ticker_only:
@@ -138,7 +151,7 @@ class InvestWidget(gtk.TreeView):
"<span foreground='%s'>%s</span>" %
(color, balance))
- def _getcelldata_balancepct(self, column, cell, model, iter):
+ def _getcelldata_balancepct(self, column, cell, model, iter, userdata):
is_ticker_only = model[iter][model.TICKER_ONLY]
color = self.get_color(model, iter, model.BALANCE_PCT)
if is_ticker_only:
@@ -156,12 +169,12 @@ class InvestWidget(gtk.TreeView):
mate_invest.chart.show_chart([ticker])
-#class InvestTicker(gtk.Label):
+#class InvestTicker(Gtk.Label):
# def __init__(self):
-# gtk.Label.__init__(self, _("Waiting..."))
+# Gtk.Label.__init__(self, _("Waiting..."))
#
# self.quotes = []
-# gobject.timeout_add(TICKER_TIMEOUT, self.scroll_quotes)
+# GObject.timeout_add(TICKER_TIMEOUT, self.scroll_quotes)
#
# get_quotes_updater().connect('quotes-updated', self.on_quotes_update)
#
@@ -188,11 +201,11 @@ class InvestWidget(gtk.TreeView):
#
# return True
#
-#gobject.type_register(InvestTicker)
+#GObject.type_register(InvestTicker)
-class InvestTrend(gtk.Image):
+class InvestTrend(Gtk.Image):
def __init__(self):
- gtk.Image.__init__(self)
+ Gtk.Image.__init__(self)
self.pixbuf = None
self.previous_allocation = (0,0)
self.connect('size-allocate', self.on_size_allocate)
@@ -202,14 +215,14 @@ class InvestTrend(gtk.Image):
if self.previous_allocation == (allocation.width, allocation.height):
return
- self.pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, allocation.height, allocation.height)
+ self.pixbuf = GdkPixbuf.Pixbuf(GdkPixbuf.Colorspace.RGB, True, 8, allocation.height, allocation.height)
self.set_color("grey")
self.previous_allocation = (allocation.width, allocation.height)
def set_color(self, color, opacity=0xFF):
if self.pixbuf != None:
try:
- color = pango.Color(color)
+ color = Pango.Color(color)
factor = float(0xFF)/0xFFFF
self.pixbuf.fill(
int(color.red*factor)<<24|int(color.green*factor)<<16|int(color.blue*factor)<<8|opacity)
@@ -247,4 +260,4 @@ class InvestTrend(gtk.Image):
self.set_color(color, opacity)
-gobject.type_register(InvestTrend)
+GObject.type_register(InvestTrend)