Added restore gadgets

svn: r9607
This commit is contained in:
Doug Blank 2007-12-28 06:23:50 +00:00
parent 455a481dc6
commit ca5e9f80c8

View File

@ -33,6 +33,7 @@ import traceback
import time
import pango
import os
from gettext import gettext as _
import Errors
import const
@ -107,7 +108,7 @@ class LinkTag(gtk.TextTag):
gtk.TextTag.__init__(self, str(LinkTag.lid))
tag_table = buffer.get_tag_table()
self.set_property('foreground', "#0000ff")
self.set_property('underline', pango.UNDERLINE_SINGLE)
#self.set_property('underline', pango.UNDERLINE_SINGLE)
tag_table.add(self)
class GadgetWindow(ManagedWindow.ManagedWindow):
@ -137,7 +138,7 @@ class GadgetWindow(ManagedWindow.ManagedWindow):
self.gadget.gvclose.show()
self.gadget.gvstate.show()
self.gadget.gvproperties.show()
self.gadget.viewpage.detached_frames.remove(self.gadget)
self.gadget.viewpage.detached_gadgets.remove(self.gadget)
self.gadget.state = "maximized"
self.gadget.mainframe.reparent(self.gadget.parent)
# FIXME: need to pack as it was, not just stick it in
@ -166,6 +167,9 @@ class Gadget(object):
self.on_button_press)
self.gui.textview.connect('motion-notify-event',
self.on_motion)
if self.dbstate.active: # already changed
self._db_changed(self.dbstate.db)
self.active_changed(self.dbstate.active.handle)
def init(self): # once, constructor
pass
@ -303,11 +307,14 @@ class Gadget(object):
int(event.x),
int(event.y))
iter = view.get_iter_at_location(*buffer_location)
cursor = self.standard_cursor
for (tag, person_handle) in self._tags:
if iter.has_tag(tag):
view.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(self.link_cursor)
return False # handle event further, if necessary
view.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(self.standard_cursor)
tag.set_property('underline', pango.UNDERLINE_SINGLE)
cursor = self.link_cursor
else:
tag.set_property('underline', pango.UNDERLINE_NONE)
view.get_window(gtk.TEXT_WINDOW_TEXT).set_cursor(cursor)
return False # handle event further, if necessary
def on_button_press(self, view, event):
@ -396,12 +403,12 @@ class GuiGadget:
[GuiGadget.LOCAL_DRAG_TARGET],
gtk.gdk.ACTION_COPY)
def close(self, obj):
def close(self, *obj):
if self.state == "windowed":
return
del self.viewpage.gadget_map[self.title]
del self.viewpage.frame_map[str(self.mainframe)]
self.mainframe.destroy()
self.state = "closed"
self.viewpage.closed_gadgets.append(self)
self.mainframe.get_parent().remove(self.mainframe)
def detach(self):
# hide buttons:
@ -411,7 +418,7 @@ class GuiGadget:
self.gvproperties.hide()
# keep a pointer to old parent frame:
self.parent = self.mainframe.get_parent()
self.viewpage.detached_frames.append(self)
self.viewpage.detached_gadgets.append(self)
# make a window, and attach it there
self.detached_window = GadgetWindow(self)
self.state = "windowed"
@ -479,7 +486,7 @@ class MyScrolledWindow(gtk.ScrolledWindow):
# Hack to get around show_all that shows hidden items
# do once, the first time showing
if self.viewpage:
gadgets = [g for g in self.viewpage.gadget_map.values()]
gadgets = [g for g in self.viewpage.gadget_map.values() if g != None]
self.viewpage = None
for gadget in gadgets:
if gadget.state == "minimized":
@ -537,7 +544,9 @@ class MyGrampsView(PageView.PageView):
# Load the gadgets
self.gadget_map = {} # title->gadget
self.frame_map = {} # frame->gadget
self.detached_frames = [] # list of detached mainframes
self.detached_gadgets = [] # list of detached gadgets
self.closed_gadgets = [] # list of closed gadgets
self.closed_opts = [] # list of closed options from ini file
# get the user's gadgets from ~/.gramps/gadgets.ini
# Load the user's gadgets:
for (name, opts) in user_gadgets:
@ -551,7 +560,10 @@ class MyGrampsView(PageView.PageView):
unique = all_opts["title"] + ("-%d" % cnt)
cnt += 1
all_opts["title"] = unique
if all_opts["title"] not in self.gadget_map:
if all_opts["state"] == "closed":
self.gadget_map[all_opts["title"]] = None # save closed name
self.closed_opts.append(all_opts)
continue
g = make_requested_gadget(self, name, all_opts,
self.dbstate, self.uistate)
if g:
@ -559,8 +571,6 @@ class MyGrampsView(PageView.PageView):
self.frame_map[str(g.mainframe)] = g
else:
print "Can't make gadget of type '%s'." % name
else:
print "Ignoring duplicate named gadget '%s'." % all_opts["title"]
self.place_gadgets()
return frame
@ -568,7 +578,7 @@ class MyGrampsView(PageView.PageView):
"""
Detach all of the mainframe gadgets from the columns.
"""
gadgets = [g for g in self.gadget_map.values()]
gadgets = [g for g in self.gadget_map.values() if g != None]
for gadget in gadgets:
column = gadget.mainframe.get_parent()
column.remove(gadget.mainframe)
@ -577,7 +587,7 @@ class MyGrampsView(PageView.PageView):
"""
Place the gadget mainframes in the columns.
"""
gadgets = [g for g in self.gadget_map.values()]
gadgets = [g for g in self.gadget_map.values() if g != None]
# put the gadgets where they go:
# sort by row
gadgets.sort(lambda a, b: cmp(a.row, b.row))
@ -599,6 +609,8 @@ class MyGrampsView(PageView.PageView):
# gadget.set_state("minimized") # minimize it
if gadget.state == "windowed":
gadget.detach()
elif gadget.state == "closed":
gadget.close()
cnt += 1
def load_gadgets(self):
@ -643,6 +655,7 @@ class MyGrampsView(PageView.PageView):
fp.write((";; Automatically created at %s" % time.strftime("%Y/%m/%d %H:%M:%S")) + NL + NL)
fp.write("[My Gramps View Options]" + NL)
fp.write(("column_count=%d" + NL + NL) % self.column_count)
# showing gadgets:
for col in range(self.column_count):
row = 0
for gframe in self.columns[col]:
@ -656,10 +669,10 @@ class MyGrampsView(PageView.PageView):
fp.write(("[%s]" + NL) % gadget.title)
for key in base_opts:
if key == "content": continue
if key == "title": continue
if key == "column": continue
if key == "row": continue
if key == "data":
elif key == "title": continue
elif key == "column": continue
elif key == "row": continue
elif key == "data":
cnt = 0
for item in base_opts["data"]:
fp.write(("data[%d]=%s" + NL) % (cnt, item))
@ -670,7 +683,7 @@ class MyGrampsView(PageView.PageView):
fp.write(("row=%d" + NL) % row)
fp.write(NL)
row += 1
for gadget in self.detached_frames:
for gadget in self.detached_gadgets + self.closed_gadgets:
opts = get_gadget_options_by_name(gadget.name)
if opts != None:
base_opts = opts.copy()
@ -680,9 +693,28 @@ class MyGrampsView(PageView.PageView):
fp.write(("[%s]" + NL) % gadget.title)
for key in base_opts:
if key == "content": continue
if key == "title": continue
elif key == "title": continue
elif key == "data":
cnt = 0
for item in base_opts["data"]:
fp.write(("data[%d]=%s" + NL) % (cnt, item))
cnt += 1
else:
fp.write(("%s=%s" + NL)% (key, base_opts[key]))
fp.write(NL)
for opts in self.closed_opts:
fp.write(("[%s]" + NL) % opts["title"])
for key in opts:
if key == "content": continue
elif key == "title": continue
elif key == "data":
cnt = 0
for item in opts["data"]:
fp.write(("data[%d]=%s" + NL) % (cnt, item))
cnt += 1
else:
fp.write(("%s=%s" + NL)% (key, opts[key]))
fp.write(NL)
fp.close()
def drop_widget(self, source, context, x, y, timedata):
@ -702,6 +734,7 @@ class MyGrampsView(PageView.PageView):
col = i
break
fromcol = mainframe.get_parent()
if fromcol:
fromcol.remove(mainframe)
# now find where to insert in column:
stack = []
@ -710,7 +743,7 @@ class MyGrampsView(PageView.PageView):
if y < (rect.y + 15): # starts at 0, this allows insert before
self.columns[col].remove(gframe)
stack.append(gframe)
maingadget = self.frame_map[str(mainframe)]
maingadget = self.frame_map.get(str(mainframe), None)
maingadget.column = col
if maingadget.state == "maximized":
expand = maingadget.expand
@ -734,6 +767,7 @@ class MyGrampsView(PageView.PageView):
"""
self.action = gtk.ActionGroup(self.title + "/Gadgets")
self.action.add_actions([('AddGadget',gtk.STOCK_ADD,_("_Add a gadget")),
('RestoreGadget',None,_("_Restore a gadget")),
('Columns1',None,_("Set columns to 1"),
None,None,
lambda obj:self.set_columns(1)),
@ -765,6 +799,47 @@ class MyGrampsView(PageView.PageView):
self.place_gadgets()
self.widget.show()
def restore_gadget(self, obj):
name = obj.get_child().get_label()
############### First kind: from current session
for gadget in self.closed_gadgets:
if gadget.title == name:
gadget.state = "maximized"
self.closed_gadgets.remove(gadget)
if self._popup_xy != None:
self.drop_widget(self.widget, gadget,
self._popup_xy[0], self._popup_xy[1], 0)
else:
self.drop_widget(self.widget, gadget, 0, 0, 0)
return
################ Second kind: from options
for opts in self.closed_opts:
if opts["title"] == name:
self.closed_opts.remove(opts)
g = make_requested_gadget(self, opts["name"], opts,
self.dbstate, self.uistate)
if g:
self.gadget_map[opts["title"]] = g
self.frame_map[str(g.mainframe)] = g
else:
print "Can't make gadget of type '%s'." % name
if g:
gadget = g
gadget.state = "maximized"
if gadget.column >= 0 and gadget.column < len(self.columns):
pos = gadget.column
else:
pos = 0
self.columns[pos].pack_start(gadget.mainframe, expand=gadget.expand)
# set height on gadget.scrolledwindow here:
gadget.scrolledwindow.set_size_request(-1, gadget.height)
## now drop it in right place
if self._popup_xy != None:
self.drop_widget(self.widget, gadget,
self._popup_xy[0], self._popup_xy[1], 0)
else:
self.drop_widget(self.widget, gadget, 0, 0, 0)
def add_gadget(self, obj):
name = obj.get_child().get_label()
all_opts = get_gadget_options_by_name(name)
@ -783,12 +858,6 @@ class MyGrampsView(PageView.PageView):
if g:
self.gadget_map[all_opts["title"]] = g
self.frame_map[str(g.mainframe)] = g
else:
print "Can't make gadget of type '%s'." % name
else:
print "Ignoring duplicate named gadget '%s'." % all_opts["title"]
if g:
gadget = g
if gadget.column >= 0 and gadget.column < len(self.columns):
pos = gadget.column
@ -801,6 +870,10 @@ class MyGrampsView(PageView.PageView):
if self._popup_xy != None:
self.drop_widget(self.widget, gadget,
self._popup_xy[0], self._popup_xy[1], 0)
else:
self.drop_widget(self.widget, gadget, 0, 0, 0)
else:
print "Can't make gadget of type '%s'." % name
def get_stock(self):
"""
@ -818,6 +891,7 @@ class MyGrampsView(PageView.PageView):
<menubar name="MenuBar">
<menu action="ViewMenu">
<menuitem action="AddGadget"/>
<menuitem action="RestoreGadget"/>
<separator/>
<menuitem action="Columns1"/>
<menuitem action="Columns2"/>
@ -826,6 +900,7 @@ class MyGrampsView(PageView.PageView):
</menubar>
<popup name="Popup">
<menuitem action="AddGadget"/>
<menuitem action="RestoreGadget"/>
<separator/>
<menuitem action="Columns1"/>
<menuitem action="Columns2"/>
@ -835,24 +910,7 @@ class MyGrampsView(PageView.PageView):
"""
def _button_press(self, obj, event):
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
self._popup_xy = None
menu = self.uistate.uimanager.get_widget('/ViewMenu')
ag_menu = self.uistate.uimanager.get_widget('/ViewMenu/AddGadget')
if ag_menu:
qr_menu = ag_menu.get_submenu()
if qr_menu == None:
qr_menu = gtk.Menu()
names = AVAILABLE_GADGETS.keys()
names.sort()
for name in names:
Utils.add_menuitem(qr_menu, name,
None, self.add_gadget)
self.uistate.uimanager.get_widget('/ViewMenu/AddGadget').set_submenu(qr_menu)
#if menu:
# menu.popup(None, None, None, event.button, event.time)
return True
elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
self._popup_xy = (event.x, event.y)
menu = self.uistate.uimanager.get_widget('/Popup')
ag_menu = self.uistate.uimanager.get_widget('/Popup/AddGadget')
@ -866,13 +924,30 @@ class MyGrampsView(PageView.PageView):
Utils.add_menuitem(qr_menu, name,
None, self.add_gadget)
self.uistate.uimanager.get_widget('/Popup/AddGadget').set_submenu(qr_menu)
rg_menu = self.uistate.uimanager.get_widget('/Popup/RestoreGadget')
if rg_menu:
qr_menu = rg_menu.get_submenu()
if qr_menu != None:
rg_menu.remove_submenu()
names = []
for gadget in self.closed_gadgets:
names.append(gadget.title)
for opts in self.closed_opts:
names.append(opts["title"])
names.sort()
if len(names) > 0:
qr_menu = gtk.Menu()
for name in names:
Utils.add_menuitem(qr_menu, name,
None, self.restore_gadget)
self.uistate.uimanager.get_widget('/Popup/RestoreGadget').set_submenu(qr_menu)
if menu:
menu.popup(None, None, None, event.button, event.time)
return True
return False
def on_delete(self):
gadgets = [g for g in self.gadget_map.values()]
gadgets = [g for g in self.gadget_map.values() if g != None]
for gadget in gadgets:
# this is the only place where the gui runs user code directly
if gadget.pui: