summaryrefslogtreecommitdiff
path: root/invest-applet/invest/applet.py
diff options
context:
space:
mode:
Diffstat (limited to 'invest-applet/invest/applet.py')
-rw-r--r--invest-applet/invest/applet.py185
1 files changed, 185 insertions, 0 deletions
diff --git a/invest-applet/invest/applet.py b/invest-applet/invest/applet.py
new file mode 100644
index 00000000..c1689586
--- /dev/null
+++ b/invest-applet/invest/applet.py
@@ -0,0 +1,185 @@
+import os, time
+from os.path import *
+import mateapplet, gtk, gtk.gdk, mateconf, gobject
+gobject.threads_init()
+from gettext import gettext as _
+import mateconf
+
+import invest, invest.about, invest.chart, invest.preferences, invest.defs
+from invest.quotes import QuoteUpdater
+from invest.widgets import *
+
+gtk.window_set_default_icon_from_file(join(invest.ART_DATA_DIR, "invest_neutral.svg"))
+
+class InvestApplet:
+ 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()
+ 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.show_all()
+ self.new_ilw()
+
+ def new_ilw(self):
+ self.quotes_updater = QuoteUpdater(self.set_applet_icon,
+ self.set_applet_tooltip)
+ self.investwidget = InvestWidget(self.quotes_updater)
+ self.ilw = InvestmentsListWindow(self.applet, self.investwidget)
+
+ def reload_ilw(self):
+ self.ilw.destroy()
+ self.new_ilw()
+
+ def button_clicked(self, widget,event):
+ if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
+ # Three cases...
+ if len (invest.STOCKS) == 0:
+ # a) We aren't configured yet
+ invest.preferences.show_preferences(self, _("<b>You have not entered any stock information yet</b>"))
+ 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.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()
+ alert.destroy()
+ else:
+ # c) Everything is normal: pop-up the window
+ self.ilw.toggle_show()
+
+ def on_about(self, component, verb):
+ invest.about.show_about()
+
+ def on_help(self, component, verb):
+ invest.help.show_help()
+
+ def on_preferences(self, component, verb):
+ invest.preferences.show_preferences(self)
+ self.reload_ilw()
+
+ def on_refresh(self, component, verb):
+ self.quotes_updater.refresh()
+
+ def set_applet_icon(self, change):
+ if change == 1:
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(invest.ART_DATA_DIR, "invest-22_up.png"), -1,-1)
+ elif change == 0:
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(invest.ART_DATA_DIR, "invest-22_neutral.png"), -1,-1)
+ else:
+ pixbuf = gtk.gdk.pixbuf_new_from_file_at_size(join(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):
+ def __init__(self, applet, list):
+ gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL)
+ self.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DOCK)
+ self.stick()
+ self.set_resizable(False)
+ self.set_border_width(6)
+
+ self.applet = applet # this is the widget we want to align with
+ self.alignment = self.applet.get_orient ()
+
+ self.add(list)
+ list.show()
+
+ # boolean variable that identifies if the window is visible
+ # show/hide is triggered by left-clicking on the applet
+ self.hidden = True
+
+ def toggle_show(self):
+ if self.hidden == True:
+ self.update_position()
+ self.show()
+ self.hidden = False
+ elif self.hidden == False:
+ self.hide()
+ self.hidden = True
+
+ def update_position (self):
+ """
+ Calculates the position and moves the window to it.
+ """
+ self.realize()
+
+ # Get our own dimensions & position
+ #(wx, wy) = self.get_origin()
+ (ax, ay) = self.applet.window.get_origin()
+
+ (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))
+
+ if self.alignment == mateapplet.ORIENT_LEFT:
+ x = ax - ww
+ y = ay
+
+ if (y + wh > monitor.y + monitor.height):
+ y = monitor.y + monitor.height - wh
+
+ if (y < 0):
+ y = 0
+
+ if (y + wh > monitor.height / 2):
+ gravity = gtk.gdk.GRAVITY_SOUTH_WEST
+ else:
+ gravity = gtk.gdk.GRAVITY_NORTH_WEST
+
+ elif self.alignment == mateapplet.ORIENT_RIGHT:
+ x = ax + aw
+ y = ay
+
+ if (y + wh > monitor.y + monitor.height):
+ y = monitor.y + monitor.height - wh
+
+ if (y < 0):
+ y = 0
+
+ if (y + wh > monitor.height / 2):
+ gravity = gtk.gdk.GRAVITY_SOUTH_EAST
+ else:
+ gravity = gtk.gdk.GRAVITY_NORTH_EAST
+
+ elif self.alignment == mateapplet.ORIENT_DOWN:
+ x = ax
+ y = ay + ah
+
+ if (x + ww > monitor.x + monitor.width):
+ x = monitor.x + monitor.width - ww
+
+ if (x < 0):
+ x = 0
+
+ gravity = gtk.gdk.GRAVITY_NORTH_WEST
+ elif self.alignment == mateapplet.ORIENT_UP:
+ x = ax
+ y = ay - wh
+
+ if (x + ww > monitor.x + monitor.width):
+ x = monitor.x + monitor.width - ww
+
+ if (x < 0):
+ x = 0
+
+ gravity = gtk.gdk.GRAVITY_SOUTH_WEST
+
+ self.move(x, y)
+ self.set_gravity(gravity)