import os, time
from os.path import *
import mate_invest.defs
import gi
gi.require_version("Gtk", mate_invest.defs.GTK_API_VERSION)
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 mate_invest, mate_invest.about, mate_invest.chart, mate_invest.preferences
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"))
class InvestApplet(MatePanelApplet.Applet):
def __init__(self, applet):
self.applet = applet
# 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.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 == Gdk.EventType.BUTTON_PRESS and event.button == 1:
# Three cases...
if len (mate_invest.STOCKS) == 0:
# a) We aren't configured yet
mate_invest.preferences.show_preferences(self, _("You have not entered any stock information yet"))
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.ButtonsType.CLOSE)
alert.set_markup(_("No stock quotes are currently available"))
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, action):
mate_invest.about.show_about()
def on_help(self, action):
mate_invest.help.show_help()
def on_preferences(self, action):
mate_invest.preferences.show_preferences(self)
self.reload_ilw()
def on_refresh(self, action):
self.quotes_updater.refresh()
def set_applet_icon(self, change):
if change == 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 = GdkPixbuf.Pixbuf.new_from_file_at_size(join(mate_invest.ART_DATA_DIR, "invest-22_neutral.png"), -1,-1)
else:
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):
def __init__(self, applet, list):
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)
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_all()
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()
window = self.applet.get_window()
if GTK_API_VERSION == '3.0':
screen = window.get_screen()
monitor = screen.get_monitor_geometry (screen.get_monitor_at_window (window))
(ret, ax, ay) = window.get_origin()
(ignored, ignored, aw, ah) = window.get_geometry()
else:
screen = self.applet.get_screen()
monitor = Gdk.Rectangle(0, 0, 0, 0)
ax = ay = 0
self.applet.window.get_origin(ax, ay)
(aw, ah) = self.applet.window.get_size ()
screen.get_monitor_geometry (screen.get_monitor_at_window (self.applet.window), monitor)
(ww, wh) = self.get_size()
if self.alignment == MatePanelApplet.AppletOrient.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 = Gdk.Gravity.SOUTH_WEST
else:
gravity = Gdk.Gravity.NORTH_WEST
elif self.alignment == MatePanelApplet.AppletOrient.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 = Gdk.Gravity.SOUTH_EAST
else:
gravity = Gdk.Gravity.NORTH_EAST
elif self.alignment == MatePanelApplet.AppletOrient.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 = Gdk.Gravity.NORTH_WEST
elif self.alignment == MatePanelApplet.AppletOrient.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 = Gdk.Gravity.SOUTH_WEST
self.move(x, y)
self.set_gravity(gravity)