GEPS008: Remove deprecated Assistant class
svn: r19757
This commit is contained in:
parent
d62afc815f
commit
c2de30e2de
352
src/Assistant.py
352
src/Assistant.py
@ -1,352 +0,0 @@
|
||||
#
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2006 Donald N. Allingham
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
|
||||
# $Id$
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Standard python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gen.ggettext import gettext as _
|
||||
import os
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# GTK modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import gtk
|
||||
import gobject
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import const
|
||||
import ManagedWindow
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Constants
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
_gramps_png = os.path.join(const.IMAGE_DIR, "gramps.png")
|
||||
_splash_jpg = os.path.join(const.IMAGE_DIR, "splash.jpg")
|
||||
_format = '<span weight="bold" size="xx-large">%s</span>'
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Assistant class
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class Assistant(gtk.Object, ManagedWindow.ManagedWindow):
|
||||
""" A tabbed dialog box used to implement Assistant interfaces.
|
||||
Deprecated. Please use gtk.Assistant class from now on.
|
||||
See eg. example use in ExportAssistant
|
||||
"""
|
||||
|
||||
__gproperties__ = {}
|
||||
|
||||
__gsignals__ = {
|
||||
'page-changed' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
(gobject.TYPE_INT, )),
|
||||
'before-page-next' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
(gobject.TYPE_INT, )),
|
||||
'after-page-next' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
(gobject.TYPE_INT, )),
|
||||
'before-page-back' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
(gobject.TYPE_INT, )),
|
||||
'after-page-back' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
(gobject.TYPE_INT, )),
|
||||
'complete' : (gobject.SIGNAL_RUN_LAST,
|
||||
gobject.TYPE_NONE,
|
||||
())
|
||||
}
|
||||
|
||||
def __init__(self, uistate, parent_class, complete, top_title=''):
|
||||
gobject.GObject.__init__(self)
|
||||
|
||||
self.top_title = top_title
|
||||
if uistate:
|
||||
ManagedWindow.ManagedWindow.__init__(self, uistate, [],
|
||||
parent_class)
|
||||
else:
|
||||
self.uistate = None
|
||||
|
||||
self.complete = complete
|
||||
self.fg_color = gtk.gdk.color_parse('#7d684a')
|
||||
self.bg_color = gtk.gdk.color_parse('#e1dbc5')
|
||||
self.logo = gtk.gdk.pixbuf_new_from_file(_gramps_png)
|
||||
self.splash = gtk.gdk.pixbuf_new_from_file(_splash_jpg)
|
||||
|
||||
self.current_page = -1
|
||||
|
||||
if uistate:
|
||||
self.set_window(gtk.Window(), None, self.top_title)
|
||||
else:
|
||||
self.window = gtk.Window()
|
||||
self.close = self.destroy
|
||||
|
||||
titlebox = gtk.HBox()
|
||||
self.title_text = []
|
||||
|
||||
self.title = gtk.Label('')
|
||||
self.title.set_alignment(0, 0.5)
|
||||
self.title.set_use_markup(True)
|
||||
|
||||
titlebox.pack_start(self.title, True)
|
||||
image = gtk.Image()
|
||||
image.set_from_file(_gramps_png)
|
||||
titlebox.pack_end(image, False)
|
||||
|
||||
self.notebook = gtk.Notebook()
|
||||
self.notebook.set_show_border(False)
|
||||
self.notebook.set_show_tabs(False)
|
||||
|
||||
vbox = gtk.VBox(spacing=6)
|
||||
vbox.set_border_width(6)
|
||||
hbox = gtk.HButtonBox()
|
||||
hbox.set_spacing(6)
|
||||
hbox.set_layout(gtk.BUTTONBOX_END)
|
||||
|
||||
self.cancel = gtk.Button(stock=gtk.STOCK_CANCEL)
|
||||
self.cancel.connect('clicked', self.close)
|
||||
self.back = gtk.Button(stock=gtk.STOCK_GO_BACK)
|
||||
self.back.set_sensitive(False)
|
||||
self.back.connect('clicked', self.back_clicked)
|
||||
self.next = gtk.Button(stock=gtk.STOCK_GO_FORWARD)
|
||||
self.next.connect('clicked', self.next_clicked)
|
||||
self.ok = gtk.Button(stock=gtk.STOCK_OK)
|
||||
self.ok.connect('clicked', self.next_clicked)
|
||||
self.ok.set_sensitive(False)
|
||||
|
||||
hbox.add(self.cancel)
|
||||
hbox.add(self.back)
|
||||
hbox.add(self.next)
|
||||
hbox.add(self.ok)
|
||||
|
||||
vbox.pack_start(titlebox, False)
|
||||
vbox.pack_start(self.notebook, True)
|
||||
vbox.pack_start(hbox, False)
|
||||
|
||||
self.window.add(vbox)
|
||||
|
||||
def build_menu_names(self, obj):
|
||||
return (self.top_title, None)
|
||||
|
||||
def set_busy_cursor(self, value):
|
||||
if value:
|
||||
self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
|
||||
self.window.set_sensitive(0)
|
||||
else:
|
||||
self.window.window.set_cursor(None)
|
||||
self.window.set_sensitive(1)
|
||||
|
||||
while gtk.events_pending():
|
||||
gtk.main_iteration()
|
||||
|
||||
def destroy(self, *obj):
|
||||
self.window.emit('delete-event', None)
|
||||
self.window.destroy()
|
||||
|
||||
def do_get_property(self, prop):
|
||||
"""Return the gproperty's value."""
|
||||
raise AttributeError, 'unknown property %s' % prop.name
|
||||
|
||||
def do_set_property(self, prop, value):
|
||||
"""Set the property of writable properties."""
|
||||
raise AttributeError, 'unknown or read only property %s' % prop.name
|
||||
|
||||
def get_number_of_pages(self):
|
||||
return self.notebook.get_n_pages()
|
||||
|
||||
def update_title(self):
|
||||
self.title.set_label(self.title_text[self.current_page])
|
||||
self.title.set_use_markup(True)
|
||||
|
||||
def set_buttons(self):
|
||||
max_page = self.notebook.get_n_pages()
|
||||
if self.current_page == max_page-2:
|
||||
self.next.show()
|
||||
self.back.show()
|
||||
self.cancel.show()
|
||||
self.ok.set_sensitive(True)
|
||||
self.next.set_sensitive(False)
|
||||
self.back.set_sensitive(True)
|
||||
elif self.current_page == max_page-1:
|
||||
self.next.hide()
|
||||
self.back.hide()
|
||||
self.cancel.hide()
|
||||
elif self.current_page == 0:
|
||||
self.next.show()
|
||||
self.back.show()
|
||||
self.cancel.show()
|
||||
self.back.set_sensitive(False)
|
||||
self.next.set_sensitive(True)
|
||||
self.ok.set_sensitive(False)
|
||||
else:
|
||||
self.next.show()
|
||||
self.back.show()
|
||||
self.back.set_sensitive(True)
|
||||
self.next.set_sensitive(True)
|
||||
self.ok.set_sensitive(False)
|
||||
self.cancel.show()
|
||||
|
||||
def back_clicked(self, obj):
|
||||
self.emit('before-page-back', self.notebook.get_current_page())
|
||||
self.current_page -= 1
|
||||
self.notebook.set_current_page(self.current_page)
|
||||
self.update_title()
|
||||
self.set_buttons()
|
||||
|
||||
self.emit('after-page-back', self.notebook.get_current_page())
|
||||
self.emit('page-changed', self.notebook.get_current_page())
|
||||
|
||||
def next_clicked(self, obj):
|
||||
self.emit('before-page-next', self.notebook.get_current_page())
|
||||
if self.current_page == self.notebook.get_n_pages()-1:
|
||||
self.emit('complete')
|
||||
self.complete()
|
||||
self.close()
|
||||
else:
|
||||
self.current_page += 1
|
||||
self.notebook.set_current_page(self.current_page)
|
||||
self.update_title()
|
||||
self.set_buttons()
|
||||
|
||||
self.emit('after-page-next', self.notebook.get_current_page())
|
||||
self.emit('page-changed', self.notebook.get_current_page())
|
||||
|
||||
def add_text_page(self, title, text):
|
||||
"""
|
||||
Add page with Gramps logo and given text and title.
|
||||
Usually, first page (introduction) and last page (conclusion)
|
||||
use this method.
|
||||
"""
|
||||
hbox = self.prepare_text_page(text)
|
||||
return self.add_page(title, hbox)
|
||||
|
||||
def insert_text_page(self, title, text, position):
|
||||
"""
|
||||
Add page with Gramps logo and given text and title.
|
||||
Usually, first page (introduction) and last page (conclusion)
|
||||
use this method.
|
||||
"""
|
||||
hbox = self.prepare_text_page(text)
|
||||
return self.insert_page(title, hbox, position)
|
||||
|
||||
def prepare_text_page(self, text):
|
||||
hbox = gtk.HBox(spacing=12)
|
||||
image = gtk.Image()
|
||||
image.set_from_file(_splash_jpg)
|
||||
hbox.pack_start(image, False)
|
||||
label = gtk.Label(text)
|
||||
label.set_line_wrap(True)
|
||||
label.set_use_markup(True)
|
||||
hbox.add(label)
|
||||
hbox.show_all()
|
||||
return hbox
|
||||
|
||||
def add_page(self, title, child):
|
||||
"""
|
||||
Add page with the title and child widget.
|
||||
Return index number of the new page.
|
||||
"""
|
||||
self.title_text.append(_format % title)
|
||||
return self.notebook.append_page(child)
|
||||
|
||||
def insert_page(self, title, child, position):
|
||||
"""
|
||||
Insert page at a given position.
|
||||
Returns index number of the new page.
|
||||
"""
|
||||
self.title_text.insert(position, _format % title)
|
||||
return self.notebook.insert_page(child, None, position)
|
||||
|
||||
def remove_page(self, position):
|
||||
"""
|
||||
Remove page from a given position.
|
||||
"""
|
||||
self.title_text.pop(position)
|
||||
self.notebook.remove_page(position)
|
||||
|
||||
def show(self):
|
||||
self.window.show_all()
|
||||
self.current_page = 0
|
||||
self.notebook.set_current_page(self.current_page)
|
||||
self.update_title()
|
||||
self.set_buttons()
|
||||
self.emit('page-changed', self.notebook.get_current_page())
|
||||
if self.uistate:
|
||||
ManagedWindow.ManagedWindow.show(self)
|
||||
|
||||
if gtk.pygtk_version < (2, 8, 0):
|
||||
gobject.type_register(Assistant)
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
def complete():
|
||||
gtk.main_quit()
|
||||
|
||||
def make_label(table, val, y, x1, x2, x3, x4):
|
||||
label = gtk.Label(val)
|
||||
label.set_alignment(0, 0.5)
|
||||
text = gtk.Entry()
|
||||
table.attach(label, x1, x2, y, y+1, gtk.SHRINK|gtk.FILL)
|
||||
table.attach(text, x3, x4, y, y+1, gtk.EXPAND|gtk.FILL)
|
||||
return text
|
||||
|
||||
a = Assistant(complete)
|
||||
a.add_text_page('Getting started',
|
||||
'Welcome to Gramps, the Genealogical Research '
|
||||
'and Analysis Management Programming System.\n'
|
||||
'Several options and information need to be gathered '
|
||||
'before Gramps is ready to be used. Any of this '
|
||||
'information can be changed in the future in the '
|
||||
'Preferences dialog under the Settings menu.')
|
||||
|
||||
box = gtk.VBox()
|
||||
box.set_spacing(12)
|
||||
table = gtk.Table(8, 4)
|
||||
table.set_row_spacings(6)
|
||||
table.set_col_spacings(6)
|
||||
|
||||
make_label(table, _('Name:'), 0, 0, 1, 1, 4)
|
||||
make_label(table, _('Address:'), 1, 0, 1, 1, 4)
|
||||
make_label(table, _('City:'), 2, 0, 1, 1, 2)
|
||||
make_label(table, _('State/Province:'), 2, 2, 3, 3, 4)
|
||||
make_label(table, _('Country:'), 3, 0, 1, 1, 2)
|
||||
make_label(table, _('ZIP/Postal code:'), 3, 2, 3, 3, 4)
|
||||
make_label(table, _('Phone:'), 4, 0, 1, 1, 4)
|
||||
make_label(table, _('Email:'), 5, 0, 1, 1, 4)
|
||||
box.add(table)
|
||||
a.add_page('Researcher information', box)
|
||||
|
||||
a.add_text_page('Conclusion title', 'Very long conclusion text here')
|
||||
a.show()
|
||||
|
||||
gtk.main()
|
@ -2,6 +2,7 @@
|
||||
# Gramps - a GTK+/GNOME based genealogy program
|
||||
#
|
||||
# Copyright (C) 2000-2007 Donald N. Allingham
|
||||
# Copyright (C) 2012 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -20,11 +21,13 @@
|
||||
|
||||
# $Id$
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Python modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
from gen.ggettext import gettext as _
|
||||
import Assistant
|
||||
import const
|
||||
import gtk
|
||||
import pygtk
|
||||
import gobject
|
||||
import cairo
|
||||
import sys, os
|
||||
@ -35,9 +38,35 @@ if config.get('preferences.use-bsddb3'):
|
||||
else:
|
||||
import bsddb
|
||||
|
||||
class ErrorReportAssistant(object):
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Gramps modules
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
import const
|
||||
import GrampsDisplay
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# Constants
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
GRAMPS_PNG = os.path.join(const.IMAGE_DIR, "gramps.png")
|
||||
SPLASH_JPG = os.path.join(const.IMAGE_DIR, "splash.jpg")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# ErrorReportAssistant
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class ErrorReportAssistant(gtk.Assistant):
|
||||
"""
|
||||
Give the user an opportunity to report an error on the Gramps bug
|
||||
reporting system.
|
||||
"""
|
||||
def __init__(self, error_detail, rotate_handler, ownthread=False):
|
||||
gtk.Assistant.__init__(self)
|
||||
|
||||
self._error_detail = error_detail
|
||||
self._rotate_handler = rotate_handler
|
||||
|
||||
@ -46,63 +75,47 @@ class ErrorReportAssistant(object):
|
||||
self._error_details_text_buffer = None
|
||||
self._final_report_text_buffer = None
|
||||
|
||||
self.w = Assistant.Assistant(None,None,self.complete)
|
||||
#connect our extra close to close by x, and close by cancel click
|
||||
self.w.window.connect('delete-event', self.close)
|
||||
self.w.cancel.connect('clicked', self.close)
|
||||
self.logo = gtk.gdk.pixbuf_new_from_file(GRAMPS_PNG)
|
||||
self.splash = gtk.gdk.pixbuf_new_from_file(SPLASH_JPG)
|
||||
|
||||
self.w.add_text_page(
|
||||
_('Report a bug'),
|
||||
_("This is the Bug Reporting Assistant. It will "\
|
||||
"help you to make a bug report to the Gramps "\
|
||||
"developers that will be as detailed as possible.\n\n"\
|
||||
"The assistant will ask you a few questions and will "\
|
||||
"gather some information about the error that has "\
|
||||
"occured and the operating environment. "\
|
||||
"At the end of the assistant you will be asked to "\
|
||||
"file a bug report on the Gramps bug tracking system. "\
|
||||
"The assistant will place the bug report on the clip board so "\
|
||||
"that you can paste it into the form on the bug tracking "\
|
||||
"website and review exactly what information you want to include."))
|
||||
self.set_title(_("Error Report Assistant"))
|
||||
self.connect('close', self.close)
|
||||
self.connect('cancel', self.close)
|
||||
self.connect('prepare', self.prepare)
|
||||
|
||||
|
||||
self.w.add_page(_("Report a bug: Step 1 of 5"), self.build_page1())
|
||||
self.w.add_page(_("Report a bug: Step 2 of 5"), self.build_page2())
|
||||
self.w.add_page(_("Report a bug: Step 3 of 5"), self.build_page3())
|
||||
|
||||
page4 = self.build_page4()
|
||||
self.w.add_page(_("Report a bug: Step 4 of 5"), page4)
|
||||
self.cb = {4:self.page4_update}
|
||||
self.w.add_page(_("Report a bug: Step 5 of 5"), self.build_page5())
|
||||
|
||||
self.w.add_text_page(
|
||||
_('Complete'),
|
||||
_('Gramps is an Open Source project. Its success '
|
||||
'depends on its users. User feedback is important. '
|
||||
'Thank you for taking the time to submit a bug report.'))
|
||||
|
||||
self.w.connect('page-changed',self.on_page_changed)
|
||||
|
||||
self.w.show()
|
||||
#create the assistant pages
|
||||
self.create_page_intro()
|
||||
self.build_page1()
|
||||
self.build_page2()
|
||||
self.build_page3()
|
||||
self.build_page4()
|
||||
self.build_page5()
|
||||
self.create_page_summary()
|
||||
self.show_all()
|
||||
|
||||
self.ownthread = ownthread
|
||||
if self.ownthread:
|
||||
gtk.main()
|
||||
|
||||
def close(self, *obj):
|
||||
"""
|
||||
Close the assistant.
|
||||
"""
|
||||
self.hide()
|
||||
if self.ownthread:
|
||||
gtk.main_quit()
|
||||
|
||||
def on_page_changed(self, obj,page,data=None):
|
||||
if page in self.cb:
|
||||
self.cb[page]()
|
||||
|
||||
def complete(self):
|
||||
if self.ownthread:
|
||||
#stop the thread we started
|
||||
gtk.main_quit()
|
||||
def prepare(self, assistant, page):
|
||||
"""
|
||||
Prepare pages prior to display.
|
||||
"""
|
||||
self.page4_update()
|
||||
self.set_page_complete(page, True)
|
||||
|
||||
def _copy_to_clipboard(self, obj=None):
|
||||
"""
|
||||
Copy the bug report to the clipboard.
|
||||
"""
|
||||
clipboard = gtk.Clipboard()
|
||||
clipboard.set_text(
|
||||
self._final_report_text_buffer.get_text(
|
||||
@ -116,7 +129,9 @@ class ErrorReportAssistant(object):
|
||||
self._final_report_text_buffer.get_end_iter()))
|
||||
|
||||
def _start_email_client(self, obj=None):
|
||||
import GrampsDisplay
|
||||
"""
|
||||
Start an email client to send the report.
|
||||
"""
|
||||
GrampsDisplay.url('mailto:gramps-bugs@lists.sourceforge.net?subject='
|
||||
'"bug report"&body="%s"' \
|
||||
% self._final_report_text_buffer.get_text(
|
||||
@ -124,10 +139,15 @@ class ErrorReportAssistant(object):
|
||||
self._final_report_text_buffer.get_end_iter()))
|
||||
|
||||
def _start_gramps_bts_in_browser(self, obj=None):
|
||||
import GrampsDisplay
|
||||
"""
|
||||
Start a web browser to report the bug.
|
||||
"""
|
||||
GrampsDisplay.url('http://bugs.gramps-project.org/bug_report_page.php')
|
||||
|
||||
def _get_sys_information(self):
|
||||
"""
|
||||
Get relevant system information.
|
||||
"""
|
||||
if hasattr(os, "uname"):
|
||||
operatingsystem = os.uname()[0]
|
||||
distribution = os.uname()[2]
|
||||
@ -156,58 +176,116 @@ class ErrorReportAssistant(object):
|
||||
gobject.pygobject_version,
|
||||
cairo.version_info)
|
||||
|
||||
def _reset_error_details_text_buffer(self, obj=None):
|
||||
def _reset_error_details(self, obj=None):
|
||||
"""
|
||||
Reset the error details buffer to its original contents.
|
||||
"""
|
||||
self._error_details_text_buffer.set_text(
|
||||
"\n".join(self._rotate_handler.get_formatted_log(
|
||||
self._error_detail.get_record()))
|
||||
+ self._error_detail.get_formatted_log())
|
||||
|
||||
def _clear_error_details_text_buffer(self, obj=None):
|
||||
def _clear_error_details(self, obj=None):
|
||||
"""
|
||||
Clear the error details buffer.
|
||||
"""
|
||||
self._error_details_text_buffer.delete(
|
||||
self._error_details_text_buffer.get_start_iter(),
|
||||
self._error_details_text_buffer.get_end_iter())
|
||||
|
||||
def _reset_sys_information_text_buffer(self, obj=None):
|
||||
def _reset_sys_information(self, obj=None):
|
||||
"""
|
||||
Reset the system information buffer to its original contents.
|
||||
"""
|
||||
self._sys_information_text_buffer.set_text(
|
||||
self._get_sys_information())
|
||||
|
||||
def _clear_sys_information_text_buffer(self, obj=None):
|
||||
def _clear_sys_information(self, obj=None):
|
||||
"""
|
||||
Clear the system information buffer.
|
||||
"""
|
||||
self._sys_information_text_buffer.delete(
|
||||
self._sys_information_text_buffer.get_start_iter(),
|
||||
self._sys_information_text_buffer.get_end_iter())
|
||||
|
||||
def _clear_user_information_text_buffer(self, obj=None):
|
||||
def _clear_user_information(self, obj=None):
|
||||
"""
|
||||
Clear the user information buffer.
|
||||
"""
|
||||
self._user_information_text_buffer.delete(
|
||||
self._user_information_text_buffer.get_start_iter(),
|
||||
self._user_information_text_buffer.get_end_iter())
|
||||
|
||||
def create_page_intro(self):
|
||||
"""
|
||||
Create the introduction page.
|
||||
"""
|
||||
label = gtk.Label(self.get_intro_text())
|
||||
label.set_line_wrap(True)
|
||||
|
||||
# Using set_page_side_image causes window sizing problems, so put the
|
||||
# image in the main page instead.
|
||||
image = gtk.Image()
|
||||
image.set_from_file(SPLASH_JPG)
|
||||
|
||||
hbox = gtk.HBox()
|
||||
hbox.pack_start(image, False, False, 0)
|
||||
hbox.pack_start(label, True, True, 0)
|
||||
|
||||
page = hbox
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
#self.set_page_side_image(page, self.splash)
|
||||
self.set_page_title(page, _('Report a bug'))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_INTRO)
|
||||
|
||||
def get_intro_text(self):
|
||||
"""
|
||||
Return the text of the introduction page.
|
||||
"""
|
||||
return _("This is the Bug Reporting Assistant. It will "
|
||||
"help you to make a bug report to the Gramps "
|
||||
"developers that will be as detailed as possible.\n\n"
|
||||
"The assistant will ask you a few questions and will "
|
||||
"gather some information about the error that has "
|
||||
"occured and the operating environment. "
|
||||
"At the end of the assistant you will be asked to "
|
||||
"file a bug report on the Gramps bug tracking system. "
|
||||
"The assistant will place the bug report on the clip board so "
|
||||
"that you can paste it into the form on the bug tracking "
|
||||
"website and review exactly what information you want to "
|
||||
"include.")
|
||||
|
||||
def build_page1(self):
|
||||
label = gtk.Label(_("If you can see that there is any personal "\
|
||||
"information included in the error please remove it."))
|
||||
"""
|
||||
Build the error details page.
|
||||
"""
|
||||
label = gtk.Label(_("If you can see that there is any personal "
|
||||
"information included in the error please remove "
|
||||
"it."))
|
||||
label.set_alignment(0.01, 0.5)
|
||||
label.set_padding(0, 4)
|
||||
label.set_line_wrap(True)
|
||||
|
||||
sw = gtk.ScrolledWindow()
|
||||
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
swin = gtk.ScrolledWindow()
|
||||
swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
|
||||
textview = gtk.TextView()
|
||||
|
||||
self._error_details_text_buffer = textview.get_buffer()
|
||||
self._reset_error_details_text_buffer()
|
||||
self._reset_error_details()
|
||||
|
||||
sw.add(textview)
|
||||
sw.show()
|
||||
textview.show()
|
||||
swin.add(textview)
|
||||
|
||||
sw_frame = gtk.Frame()
|
||||
sw_frame.add(sw)
|
||||
sw_frame.add(swin)
|
||||
|
||||
reset = gtk.Button("Reset")
|
||||
reset.connect('clicked', self._reset_error_details_text_buffer)
|
||||
reset.connect('clicked', self._reset_error_details)
|
||||
clear = gtk.Button("Clear")
|
||||
clear.connect('clicked', self._clear_error_details_text_buffer)
|
||||
clear.connect('clicked', self._clear_error_details)
|
||||
|
||||
button_box = gtk.HButtonBox()
|
||||
button_box.set_border_width(6)
|
||||
@ -233,50 +311,56 @@ class ErrorReportAssistant(object):
|
||||
|
||||
error_details_frame.add(error_details_align)
|
||||
|
||||
side_label = gtk.Label(_("This is the detailed Gramps error information, don't worry if you "\
|
||||
"do not understand it. You "\
|
||||
"will have the opportunity to add further detail about the error "\
|
||||
side_label = gtk.Label(_("This is the detailed Gramps error "
|
||||
"information, don't worry if you do not "
|
||||
"understand it. You will have the opportunity "
|
||||
"to add further detail about the error "
|
||||
"in the following pages of the assistant."))
|
||||
|
||||
side_label.set_line_wrap(True)
|
||||
side_label.set_size_request(124, -1)
|
||||
|
||||
box = gtk.HBox()
|
||||
|
||||
box.pack_start(side_label, False, False, 5)
|
||||
|
||||
box.pack_start(error_details_frame)
|
||||
box.show_all()
|
||||
|
||||
return box
|
||||
page = box
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
self.set_page_title(page, _("Report a bug: Step 1 of 5"))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
|
||||
def build_page2(self):
|
||||
label = gtk.Label(_("Please check the information below and correct anything that "\
|
||||
"you know to be wrong or remove anything that you would rather not "\
|
||||
"have included in the bug report."))
|
||||
"""
|
||||
Build the system information page.
|
||||
"""
|
||||
label = gtk.Label(_("Please check the information below and correct "
|
||||
"anything that you know to be wrong or remove "
|
||||
"anything that you would rather not have included "
|
||||
"in the bug report."))
|
||||
label.set_alignment(0.01, 0.5)
|
||||
label.set_padding(0, 4)
|
||||
label.set_line_wrap(True)
|
||||
|
||||
sw = gtk.ScrolledWindow()
|
||||
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
swin = gtk.ScrolledWindow()
|
||||
swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
|
||||
textview = gtk.TextView()
|
||||
|
||||
self._sys_information_text_buffer = textview.get_buffer()
|
||||
self._reset_sys_information_text_buffer()
|
||||
self._reset_sys_information()
|
||||
|
||||
sw.add(textview)
|
||||
sw.show()
|
||||
textview.show()
|
||||
swin.add(textview)
|
||||
|
||||
sw_frame = gtk.Frame()
|
||||
sw_frame.add(sw)
|
||||
sw_frame.add(swin)
|
||||
|
||||
reset = gtk.Button("Reset")
|
||||
reset.connect('clicked', self._reset_sys_information_text_buffer)
|
||||
reset.connect('clicked', self._reset_sys_information)
|
||||
clear = gtk.Button("Clear")
|
||||
clear.connect('clicked', self._clear_sys_information_text_buffer)
|
||||
clear.connect('clicked', self._clear_sys_information)
|
||||
|
||||
|
||||
button_box = gtk.HButtonBox()
|
||||
@ -303,44 +387,50 @@ class ErrorReportAssistant(object):
|
||||
|
||||
sys_information_frame.add(sys_information_align)
|
||||
|
||||
side_label = gtk.Label(_("This is the information about your system that "\
|
||||
"will help the developers to fix the bug."))
|
||||
side_label = gtk.Label(_("This is the information about your system "
|
||||
"that will help the developers to fix the "
|
||||
"bug."))
|
||||
|
||||
side_label.set_line_wrap(True)
|
||||
side_label.set_size_request(124, -1)
|
||||
|
||||
box = gtk.HBox()
|
||||
|
||||
box.pack_start(side_label, False, False, 5)
|
||||
|
||||
box.pack_start(sys_information_frame)
|
||||
box.show_all()
|
||||
|
||||
return box
|
||||
page = box
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
self.set_page_title(page, _("Report a bug: Step 2 of 5"))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
|
||||
def build_page3(self):
|
||||
label = gtk.Label(_("Please provide as much information as you can "\
|
||||
"about what you were doing when the error occured. "))
|
||||
"""
|
||||
Build the further information page.
|
||||
"""
|
||||
label = gtk.Label(_("Please provide as much information as you can "
|
||||
"about what you were doing when the error "
|
||||
"occured."))
|
||||
label.set_alignment(0.01, 0.5)
|
||||
label.set_padding(0, 4)
|
||||
label.set_line_wrap(True)
|
||||
|
||||
sw = gtk.ScrolledWindow()
|
||||
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
swin = gtk.ScrolledWindow()
|
||||
swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
|
||||
textview = gtk.TextView()
|
||||
|
||||
self._user_information_text_buffer = textview.get_buffer()
|
||||
|
||||
sw.add(textview)
|
||||
sw.show()
|
||||
textview.show()
|
||||
swin.add(textview)
|
||||
|
||||
sw_frame = gtk.Frame()
|
||||
sw_frame.add(sw)
|
||||
sw_frame.add(swin)
|
||||
|
||||
clear = gtk.Button("Clear")
|
||||
clear.connect('clicked',self._clear_user_information_text_buffer)
|
||||
clear.connect('clicked', self._clear_user_information)
|
||||
|
||||
button_box = gtk.HButtonBox()
|
||||
button_box.set_border_width(6)
|
||||
@ -365,33 +455,39 @@ class ErrorReportAssistant(object):
|
||||
|
||||
user_information_frame.add(user_information_align)
|
||||
|
||||
side_label = gtk.Label(_("This is your opportunity to describe what you were "\
|
||||
"doing when the error occured."))
|
||||
side_label = gtk.Label(_("This is your opportunity to describe what "
|
||||
"you were doing when the error occured."))
|
||||
|
||||
side_label.set_line_wrap(True)
|
||||
side_label.set_size_request(124, -1)
|
||||
|
||||
box = gtk.HBox()
|
||||
|
||||
box.pack_start(side_label, False, False, 5)
|
||||
|
||||
box.pack_start(user_information_frame)
|
||||
box.show_all()
|
||||
|
||||
return box
|
||||
page = box
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
self.set_page_title(page, _("Report a bug: Step 3 of 5"))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
|
||||
def build_page4(self):
|
||||
label = gtk.Label(_("Please check that the information is correct, do not worry if you "\
|
||||
"don't understand the detail of the error information. Just make sure "\
|
||||
"that it does not contain anything that you do not want to be sent "\
|
||||
"to the developers."))
|
||||
"""
|
||||
Build the bug report summary page.
|
||||
"""
|
||||
label = gtk.Label(_("Please check that the information is correct, "
|
||||
"do not worry if you don't understand the detail "
|
||||
"of the error information. Just make sure that it "
|
||||
"does not contain anything that you do not want "
|
||||
"to be sent to the developers."))
|
||||
label.set_alignment(0.01, 0.5)
|
||||
label.set_padding(0, 4)
|
||||
label.set_line_wrap(True)
|
||||
|
||||
sw = gtk.ScrolledWindow()
|
||||
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
swin = gtk.ScrolledWindow()
|
||||
swin.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
|
||||
textview = gtk.TextView()
|
||||
textview.set_editable(False)
|
||||
@ -399,12 +495,10 @@ class ErrorReportAssistant(object):
|
||||
|
||||
self._final_report_text_buffer = textview.get_buffer()
|
||||
|
||||
sw.add(textview)
|
||||
sw.show()
|
||||
textview.show()
|
||||
swin.add(textview)
|
||||
|
||||
sw_frame = gtk.Frame()
|
||||
sw_frame.add(sw)
|
||||
sw_frame.add(swin)
|
||||
|
||||
summary_box = gtk.VBox()
|
||||
summary_box.pack_start(label, False, False)
|
||||
@ -421,33 +515,30 @@ class ErrorReportAssistant(object):
|
||||
|
||||
summary_frame.add(summary_align)
|
||||
|
||||
# side_label = gtk.Label(_("This is the completed bug report. The next page "\
|
||||
# "of the assistant will help you to send the report "\
|
||||
# "to the bug report mailing list."))
|
||||
|
||||
side_label = gtk.Label(_("This is the completed bug report. The next page "\
|
||||
"of the assistant will help you to file a bug "\
|
||||
" on the Gramps bug tracking system website."))
|
||||
side_label = gtk.Label(_("This is the completed bug report. The next "
|
||||
"page of the assistant will help you to file "
|
||||
"a bug on the Gramps bug tracking system "
|
||||
"website."))
|
||||
|
||||
side_label.set_line_wrap(True)
|
||||
side_label.set_size_request(124, -1)
|
||||
|
||||
box = gtk.HBox()
|
||||
|
||||
box.pack_start(side_label, False, False, 5)
|
||||
|
||||
box.pack_start(summary_frame)
|
||||
box.show_all()
|
||||
|
||||
return box
|
||||
page = box
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
self.set_page_title(page, _("Report a bug: Step 4 of 5"))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
|
||||
def build_page5(self):
|
||||
# label = gtk.Label(
|
||||
# "%s <i>%s</i>" %
|
||||
# (_("Use one of the two methods below to send the "\
|
||||
# "bug report to the GRAMPS bug reporting mailing "\
|
||||
# "list at "),
|
||||
# "gramps-bugs@lists.sourceforge.net."))
|
||||
"""
|
||||
Build the send bug report page.
|
||||
"""
|
||||
label = gtk.Label(
|
||||
"%s <i>%s</i>" %
|
||||
(_("Use the two buttons below to first copy the bug report to the "
|
||||
@ -459,9 +550,6 @@ class ErrorReportAssistant(object):
|
||||
label.set_use_markup(True)
|
||||
|
||||
|
||||
# url_label = gtk.Label(_("If your email client is configured correctly you may be able "\
|
||||
# "to use this button to start it with the bug report ready to send. "\
|
||||
# "(This will probably only work if you are running Gnome)"))
|
||||
url_label = gtk.Label(_("Use this button to start a web browser and "
|
||||
"file a bug report on the Gramps bug tracking "
|
||||
"system."))
|
||||
@ -470,8 +558,6 @@ class ErrorReportAssistant(object):
|
||||
url_label.set_line_wrap(True)
|
||||
|
||||
url_button = gtk.Button("File bug report")
|
||||
# url_button = gtk.Button("Start email client")
|
||||
# url_button.connect('clicked', self._start_email_client)
|
||||
url_button.connect('clicked', self._start_gramps_bts_in_browser)
|
||||
url_button_vbox = gtk.VBox()
|
||||
url_button_vbox.pack_start(url_button, True, False)
|
||||
@ -488,10 +574,6 @@ class ErrorReportAssistant(object):
|
||||
url_frame = gtk.Frame()
|
||||
url_frame.add(url_align)
|
||||
|
||||
# clip_label = gtk.Label(_("If your email program fails to start you can use this button "
|
||||
# "to copy the bug report onto the clipboard. Then start your "
|
||||
# "email client, paste the report and send it to the address "
|
||||
# "above."))
|
||||
clip_label = gtk.Label(_("Use this button "
|
||||
"to copy the bug report onto the clipboard. "
|
||||
"Then go to the bug tracking website by using "
|
||||
@ -521,8 +603,6 @@ class ErrorReportAssistant(object):
|
||||
|
||||
inner_box = gtk.VBox()
|
||||
inner_box.pack_start(label, False, False)
|
||||
# inner_box.pack_start(url_frame,False,False)
|
||||
# inner_box.pack_start(clip_frame,False,False)
|
||||
inner_box.pack_start(clip_frame, False, False)
|
||||
inner_box.pack_start(url_frame, False, False)
|
||||
|
||||
@ -537,28 +617,58 @@ class ErrorReportAssistant(object):
|
||||
|
||||
outer_frame.add(inner_align)
|
||||
|
||||
# side_label = gtk.Label(_("This is the final step. Use the buttons on this "
|
||||
# "page to transfer the bug report to your email client."))
|
||||
|
||||
side_label = gtk.Label(_("This is the final step. Use the buttons on this "
|
||||
"page to start a web browser and file a bug "
|
||||
"report on the Gramps bug tracking system."))
|
||||
side_label = gtk.Label(_("This is the final step. Use the buttons on "
|
||||
"this page to start a web browser and file a "
|
||||
"bug report on the Gramps bug tracking "
|
||||
"system."))
|
||||
|
||||
side_label.set_line_wrap(True)
|
||||
side_label.set_size_request(124, -1)
|
||||
|
||||
box = gtk.HBox()
|
||||
|
||||
box.pack_start(side_label, False, False, 5)
|
||||
|
||||
box.pack_start(outer_frame)
|
||||
box.show_all()
|
||||
|
||||
return box
|
||||
page = box
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
self.set_page_title(page, _("Report a bug: Step 5 of 5"))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
|
||||
def create_page_summary(self):
|
||||
"""
|
||||
Create the summary page.
|
||||
"""
|
||||
text = _('Gramps is an Open Source project. Its success '
|
||||
'depends on its users. User feedback is important. '
|
||||
'Thank you for taking the time to submit a bug report.')
|
||||
label = gtk.Label(text)
|
||||
label.set_line_wrap(True)
|
||||
|
||||
# Using set_page_side_image causes window sizing problems, so put the
|
||||
# image in the main page instead.
|
||||
image = gtk.Image()
|
||||
image.set_from_file(SPLASH_JPG)
|
||||
|
||||
hbox = gtk.HBox()
|
||||
hbox.pack_start(image, False, False, 0)
|
||||
hbox.pack_start(label, True, True, 0)
|
||||
|
||||
page = hbox
|
||||
|
||||
page.show_all()
|
||||
self.append_page(page)
|
||||
self.set_page_header_image(page, self.logo)
|
||||
#self.set_page_side_image(page, self.splash)
|
||||
self.set_page_title(page, _('Complete'))
|
||||
self.set_page_type(page, gtk.ASSISTANT_PAGE_SUMMARY)
|
||||
|
||||
def page4_update(self):
|
||||
|
||||
"""
|
||||
Update the contents of page 4 with any changes made.
|
||||
"""
|
||||
self._final_report_text_buffer.set_text(
|
||||
"User Information: \n" +
|
||||
"===================\n\n" +
|
||||
|
@ -5,6 +5,7 @@
|
||||
# Copyright (C) 2008 B. Malengier
|
||||
# Copyright (C) 2008 Brian G. Matherly
|
||||
# Copyright (C) 2010 Jakim Friant
|
||||
# Copyright (C) 2012 Nick Hall
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
@ -50,8 +51,6 @@ import gobject
|
||||
#------------------------------------------------------------------------
|
||||
import const
|
||||
import GrampsDisplay
|
||||
import Assistant
|
||||
import Errors
|
||||
from gen.lib import MediaObject
|
||||
from gen.db import DbTxn
|
||||
from gen.updatecallback import UpdateCallback
|
||||
@ -67,6 +66,8 @@ import gen.mime
|
||||
#-------------------------------------------------------------------------
|
||||
WIKI_HELP_PAGE = '%s_-_Tools' % const.URL_MANUAL_PAGE
|
||||
WIKI_HELP_SEC = _('manual|Media_Manager...')
|
||||
GRAMPS_PNG = os.path.join(const.IMAGE_DIR, "gramps.png")
|
||||
SPLASH_JPG = os.path.join(const.IMAGE_DIR, "splash.jpg")
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
@ -81,40 +82,145 @@ class MediaMan(tool.Tool):
|
||||
self.uistate = uistate
|
||||
self.callback = uistate.pulse_progressbar
|
||||
|
||||
self.batch_ops = []
|
||||
self.build_batch_ops()
|
||||
self.batch_settings = None
|
||||
self.settings_page = None
|
||||
|
||||
try:
|
||||
self.w = Assistant.Assistant(uistate,self.__class__,self.complete,
|
||||
_("Media Manager"))
|
||||
except Errors.WindowActiveError:
|
||||
return
|
||||
self.assistant = gtk.Assistant()
|
||||
self.logo = gtk.gdk.pixbuf_new_from_file(GRAMPS_PNG)
|
||||
self.splash = gtk.gdk.pixbuf_new_from_file(SPLASH_JPG)
|
||||
|
||||
self.welcome_page = self.w.add_text_page(_('Gramps Media Manager'),
|
||||
self.get_info_text())
|
||||
self.selection_page = self.w.add_page(_('Selecting operation'),
|
||||
self.build_selection_page())
|
||||
self.confirm_page = self.w.add_text_page('','')
|
||||
self.conclusion_page = self.w.add_text_page('','')
|
||||
self.assistant.set_title(_('Gramps Media Manager'))
|
||||
self.assistant.connect('close', self.close)
|
||||
self.assistant.connect('cancel', self.close)
|
||||
self.assistant.connect('apply', self.run)
|
||||
self.assistant.connect('prepare', self.prepare)
|
||||
self.assistant.set_forward_page_func(self.forward_page)
|
||||
|
||||
self.w.connect('before-page-next',self.on_before_page_next)
|
||||
intro = IntroductionPage()
|
||||
self.add_page(intro, gtk.ASSISTANT_PAGE_INTRO, _('Introduction'))
|
||||
self.selection = SelectionPage(self.batch_ops)
|
||||
self.add_page(self.selection, gtk.ASSISTANT_PAGE_CONTENT,
|
||||
_('Selection'))
|
||||
self.settings = SettingsPage(self.batch_ops, self.assistant)
|
||||
self.add_page(self.settings, gtk.ASSISTANT_PAGE_CONTENT)
|
||||
self.confirmation = ConfirmationPage(self.batch_ops)
|
||||
self.add_page(self.confirmation, gtk.ASSISTANT_PAGE_CONFIRM,
|
||||
_('Final confirmation'))
|
||||
self.conclusion = ConclusionPage(self.assistant)
|
||||
self.add_page(self.conclusion, gtk.ASSISTANT_PAGE_SUMMARY)
|
||||
|
||||
self.w.show()
|
||||
self.assistant.show()
|
||||
|
||||
def complete(self):
|
||||
pass
|
||||
def close(self, assistant):
|
||||
"""
|
||||
Close the assistant.
|
||||
"""
|
||||
self.assistant.hide()
|
||||
|
||||
def on_before_page_next(self, obj,page,data=None):
|
||||
if page == self.selection_page:
|
||||
self.build_settings_page()
|
||||
elif page == self.settings_page:
|
||||
self.build_confirmation()
|
||||
elif page == self.confirm_page:
|
||||
success = self.run()
|
||||
self.build_conclusion(success)
|
||||
def forward_page(self, page):
|
||||
"""
|
||||
Specify the next page to be displayed.
|
||||
"""
|
||||
if page == 1: # selection page
|
||||
index = self.selection.get_index()
|
||||
if self.settings.prepare(index):
|
||||
return page + 1
|
||||
else:
|
||||
return page + 2
|
||||
else:
|
||||
return page + 1
|
||||
|
||||
def get_info_text(self):
|
||||
def prepare(self, assistant, page):
|
||||
"""
|
||||
Run page preparation code.
|
||||
"""
|
||||
if self.assistant.get_current_page() == 3:
|
||||
index = self.selection.get_index()
|
||||
self.confirmation.prepare(index)
|
||||
self.assistant.set_page_complete(page, True)
|
||||
|
||||
def add_page(self, page, page_type, title=''):
|
||||
"""
|
||||
Add a page to the assistant.
|
||||
"""
|
||||
page.show_all()
|
||||
self.assistant.append_page(page)
|
||||
self.assistant.set_page_header_image(page, self.logo)
|
||||
self.assistant.set_page_title(page, title)
|
||||
self.assistant.set_page_type(page, page_type)
|
||||
|
||||
def on_help_clicked(self, obj):
|
||||
"""
|
||||
Display the relevant portion of Gramps manual.
|
||||
"""
|
||||
GrampsDisplay.help(webpage=WIKI_HELP_PAGE, section=WIKI_HELP_SEC)
|
||||
|
||||
def build_batch_ops(self):
|
||||
"""
|
||||
Define the batch operations available.
|
||||
"""
|
||||
batches_to_use = [
|
||||
PathChange,
|
||||
Convert2Abs,
|
||||
Convert2Rel,
|
||||
ImagesNotIncluded,
|
||||
]
|
||||
|
||||
for batch_class in batches_to_use:
|
||||
self.batch_ops.append(batch_class(self.db, self.callback))
|
||||
|
||||
def run(self, assistant):
|
||||
"""
|
||||
Run selected batch op with selected settings.
|
||||
"""
|
||||
index = self.selection.get_index()
|
||||
self.pre_run()
|
||||
success = self.batch_ops[index].run_tool()
|
||||
self.conclusion.set_result(success)
|
||||
self.post_run()
|
||||
|
||||
def pre_run(self):
|
||||
"""
|
||||
Code to run prior to the batch op.
|
||||
"""
|
||||
self.uistate.set_busy_cursor(1)
|
||||
self.uistate.progress.show()
|
||||
|
||||
def post_run(self):
|
||||
"""
|
||||
Code to run after to the batch op.
|
||||
"""
|
||||
self.uistate.set_busy_cursor(0)
|
||||
self.uistate.progress.hide()
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Assistant pages
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
class IntroductionPage(gtk.HBox):
|
||||
"""
|
||||
A page containing introductory text.
|
||||
"""
|
||||
def __init__(self):
|
||||
gtk.HBox.__init__(self)
|
||||
|
||||
# Using set_page_side_image causes window sizing problems, so put the
|
||||
# image in the main page instead.
|
||||
image = gtk.Image()
|
||||
image.set_from_file(SPLASH_JPG)
|
||||
|
||||
label = gtk.Label(self.__get_intro_text())
|
||||
label.set_line_wrap(True)
|
||||
label.set_use_markup(True)
|
||||
|
||||
self.pack_start(image, False, False, 0)
|
||||
self.pack_start(label, True, True, 0)
|
||||
|
||||
def __get_intro_text(self):
|
||||
"""
|
||||
Return the introductory text.
|
||||
"""
|
||||
return _("This tool allows batch operations on media objects "
|
||||
"stored in Gramps. "
|
||||
"An important distinction must be made between a Gramps "
|
||||
@ -134,181 +240,154 @@ class MediaMan(tool.Tool):
|
||||
"Gramps. Then you can adjust the paths using this tool so "
|
||||
"that the media objects store the correct file locations.")
|
||||
|
||||
def build_selection_page(self):
|
||||
class SelectionPage(gtk.VBox):
|
||||
"""
|
||||
Build a page with the radio buttons for every available batch op.
|
||||
A page with the radio buttons for every available batch op.
|
||||
"""
|
||||
def __init__(self, batch_ops):
|
||||
gtk.VBox.__init__(self)
|
||||
|
||||
self.batch_op_buttons = []
|
||||
|
||||
box = gtk.VBox()
|
||||
box.set_spacing(12)
|
||||
self.set_spacing(12)
|
||||
|
||||
table = gtk.Table(2*len(self.batch_ops),2)
|
||||
table = gtk.Table(2 * len(batch_ops), 2)
|
||||
table.set_row_spacings(6)
|
||||
table.set_col_spacings(6)
|
||||
|
||||
group = None
|
||||
for ix in range(len(self.batch_ops)):
|
||||
title = self.batch_ops[ix].title
|
||||
description= self.batch_ops[ix].description
|
||||
for index in range(len(batch_ops)):
|
||||
title = batch_ops[index].title
|
||||
description = batch_ops[index].description
|
||||
|
||||
button = gtk.RadioButton(group, title)
|
||||
button.set_tooltip_text(description)
|
||||
if not group:
|
||||
group = button
|
||||
self.batch_op_buttons.append(button)
|
||||
table.attach(button,0,2,2*ix,2*ix+1,yoptions=0)
|
||||
table.attach(button, 0, 2, 2 * index, 2 * index + 1, yoptions=0)
|
||||
|
||||
box.add(table)
|
||||
return box
|
||||
self.add(table)
|
||||
|
||||
def on_help_clicked(self, obj):
|
||||
"""Display the relevant portion of GRAMPS manual"""
|
||||
GrampsDisplay.help(webpage=WIKI_HELP_PAGE, section=WIKI_HELP_SEC)
|
||||
|
||||
def build_batch_ops(self):
|
||||
self.batch_ops = []
|
||||
batches_to_use = [
|
||||
PathChange,
|
||||
Convert2Abs,
|
||||
Convert2Rel,
|
||||
ImagesNotIncluded,
|
||||
]
|
||||
|
||||
for batch_class in batches_to_use:
|
||||
self.batch_ops.append(batch_class(self.db,self.callback))
|
||||
|
||||
def get_selected_op_index(self):
|
||||
def get_index(self):
|
||||
"""
|
||||
Query the selection radiobuttons and return the index number
|
||||
of the selected batch op.
|
||||
"""
|
||||
for ix in range(len(self.batch_op_buttons)):
|
||||
button = self.batch_op_buttons[ix]
|
||||
for index in range(len(self.batch_op_buttons)):
|
||||
button = self.batch_op_buttons[index]
|
||||
if button.get_active():
|
||||
return ix
|
||||
return index
|
||||
else:
|
||||
return 0
|
||||
|
||||
def build_settings_page(self):
|
||||
class SettingsPage(gtk.VBox):
|
||||
"""
|
||||
Build an extra page with the settings specific for the chosen batch-op.
|
||||
If there's already an entry for this batch-op then do nothing,
|
||||
otherwise add a page.
|
||||
An extra page with the settings specific for the chosen batch-op.
|
||||
"""
|
||||
def __init__(self, batch_ops, assistant):
|
||||
gtk.VBox.__init__(self)
|
||||
self.assistant = assistant
|
||||
self.batch_ops = batch_ops
|
||||
|
||||
If the chosen batch-op does not have settings then remove the
|
||||
settings page that is already there (from previous user passes
|
||||
through the assistant).
|
||||
def prepare(self, index):
|
||||
"""
|
||||
ix = self.get_selected_op_index()
|
||||
config = self.batch_ops[ix].build_config()
|
||||
Build the settings for the batch op.
|
||||
"""
|
||||
config = self.batch_ops[index].build_config()
|
||||
if config:
|
||||
if ix == self.batch_settings:
|
||||
return
|
||||
elif self.batch_settings:
|
||||
self.w.remove_page(self.settings_page)
|
||||
self.settings_page = None
|
||||
self.confirm_page -= 1
|
||||
self.conclusion_page -= 1
|
||||
self.batch_settings = None
|
||||
self.build_confirmation()
|
||||
title,box = config
|
||||
self.settings_page = self.w.insert_page(title,box,
|
||||
self.selection_page+1)
|
||||
self.confirm_page += 1
|
||||
self.conclusion_page += 1
|
||||
self.batch_settings = ix
|
||||
box.show_all()
|
||||
title, contents = config
|
||||
self.assistant.set_page_title(self, title)
|
||||
map(self.remove, self.get_children())
|
||||
self.pack_start(contents)
|
||||
self.show_all()
|
||||
return True
|
||||
else:
|
||||
if self.batch_settings is not None:
|
||||
self.w.remove_page(self.settings_page)
|
||||
self.settings_page = None
|
||||
self.confirm_page -= 1
|
||||
self.conclusion_page -= 1
|
||||
self.batch_settings = None
|
||||
self.build_confirmation()
|
||||
return False
|
||||
|
||||
def build_confirmation(self):
|
||||
class ConfirmationPage(gtk.VBox):
|
||||
"""
|
||||
Build the confirmation page.
|
||||
|
||||
This should query the selected settings and present the summary
|
||||
of the proposed action, as well as the list of affected paths.
|
||||
A page to display the summary of the proposed action, as well as the
|
||||
list of affected paths.
|
||||
"""
|
||||
def __init__(self, batch_ops):
|
||||
gtk.VBox.__init__(self)
|
||||
|
||||
ix = self.get_selected_op_index()
|
||||
confirm_text = self.batch_ops[ix].build_confirm_text()
|
||||
path_list = self.batch_ops[ix].build_path_list()
|
||||
self.batch_ops = batch_ops
|
||||
|
||||
box = gtk.VBox()
|
||||
box.set_spacing(12)
|
||||
box.set_border_width(12)
|
||||
self.set_spacing(12)
|
||||
self.set_border_width(12)
|
||||
|
||||
label1 = gtk.Label(confirm_text)
|
||||
label1.set_line_wrap(True)
|
||||
label1.set_use_markup(True)
|
||||
label1.set_alignment(0,0.5)
|
||||
box.pack_start(label1,expand=False)
|
||||
self.confirm = gtk.Label()
|
||||
self.confirm.set_line_wrap(True)
|
||||
self.confirm.set_use_markup(True)
|
||||
self.confirm.set_alignment(0, 0.5)
|
||||
self.pack_start(self.confirm, expand=False)
|
||||
|
||||
scrolled_window = gtk.ScrolledWindow()
|
||||
scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
|
||||
scrolled_window.set_shadow_type(gtk.SHADOW_IN)
|
||||
tree = gtk.TreeView()
|
||||
model = gtk.ListStore(gobject.TYPE_STRING)
|
||||
tree.set_model(model)
|
||||
self.path_model = gtk.ListStore(gobject.TYPE_STRING)
|
||||
tree.set_model(self.path_model)
|
||||
tree_view_column = gtk.TreeViewColumn(_('Affected path'),
|
||||
gtk.CellRendererText(), text=0)
|
||||
tree_view_column.set_sort_column_id(0)
|
||||
tree.append_column(tree_view_column)
|
||||
for path in path_list:
|
||||
model.append(row=[path])
|
||||
scrolled_window.add(tree)
|
||||
box.pack_start(scrolled_window,expand=True,fill=True)
|
||||
self.pack_start(scrolled_window, expand=True, fill=True)
|
||||
|
||||
label3 = gtk.Label(_('Press OK to proceed, Cancel to abort, '
|
||||
label3 = gtk.Label(_('Press Apply to proceed, Cancel to abort, '
|
||||
'or Back to revisit your options.'))
|
||||
box.pack_start(label3,expand=False)
|
||||
box.show_all()
|
||||
self.pack_start(label3, expand=False)
|
||||
|
||||
self.w.remove_page(self.confirm_page)
|
||||
self.confirm_page = self.w.insert_page(_('Final confirmation'),
|
||||
box,self.confirm_page)
|
||||
|
||||
def run(self):
|
||||
def prepare(self, index):
|
||||
"""
|
||||
Run selected batch op with selected settings.
|
||||
Display a list of changes to be made.
|
||||
"""
|
||||
ix = self.get_selected_op_index()
|
||||
self.pre_run()
|
||||
success = self.batch_ops[ix].run_tool()
|
||||
self.post_run()
|
||||
return success
|
||||
confirm_text = self.batch_ops[index].build_confirm_text()
|
||||
path_list = self.batch_ops[index].build_path_list()
|
||||
|
||||
def pre_run(self):
|
||||
self.uistate.set_busy_cursor(1)
|
||||
self.w.set_busy_cursor(1)
|
||||
self.uistate.progress.show()
|
||||
self.confirm.set_text(confirm_text)
|
||||
|
||||
def post_run(self):
|
||||
self.uistate.set_busy_cursor(0)
|
||||
self.w.set_busy_cursor(0)
|
||||
self.uistate.progress.hide()
|
||||
self.path_model.clear()
|
||||
for path in path_list:
|
||||
self.path_model.append(row=[path])
|
||||
|
||||
def build_conclusion(self,success):
|
||||
class ConclusionPage(gtk.HBox):
|
||||
"""
|
||||
A page to display the summary of the proposed action, as well as the
|
||||
list of affected paths.
|
||||
"""
|
||||
def __init__(self, assistant):
|
||||
gtk.HBox.__init__(self)
|
||||
|
||||
self.assistant = assistant
|
||||
|
||||
# Using set_page_side_image causes window sizing problems, so put the
|
||||
# image in the main page instead.
|
||||
image = gtk.Image()
|
||||
image.set_from_file(SPLASH_JPG)
|
||||
|
||||
self.label = gtk.Label()
|
||||
self.label.set_line_wrap(True)
|
||||
|
||||
self.pack_start(image, False, False, 0)
|
||||
self.pack_start(self.label, True, True, 0)
|
||||
|
||||
def set_result(self, success):
|
||||
if success:
|
||||
conclusion_title = _('Operation successfully finished.')
|
||||
conclusion_title = _('Operation successfully finished')
|
||||
conclusion_text = _(
|
||||
'The operation you requested has finished successfully. '
|
||||
'You may press OK button now to continue.')
|
||||
'You may press Close now to continue.')
|
||||
else:
|
||||
conclusion_title = _('Operation failed'),
|
||||
conclusion_title = _('Operation failed')
|
||||
conclusion_text = _(
|
||||
'There was an error while performing the requested '
|
||||
'operation. You may try starting the tool again.')
|
||||
self.w.remove_page(self.conclusion_page)
|
||||
self.conclusion_page = self.w.insert_text_page(conclusion_title,
|
||||
conclusion_text,
|
||||
self.conclusion_page)
|
||||
self.label.set_text(conclusion_text)
|
||||
self.assistant.set_page_title(self, conclusion_title)
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -392,7 +471,6 @@ class BatchOp(UpdateCallback):
|
||||
def _prepare(self):
|
||||
print "This method needs to be written."
|
||||
print "Preparing BatchOp tool... done."
|
||||
pass
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
# Simple op to replace substrings in the paths
|
||||
@ -441,8 +519,12 @@ class PathChange(BatchOp):
|
||||
to_text = unicode(self.to_entry.get_text())
|
||||
text = _(
|
||||
'The following action is to be performed:\n\n'
|
||||
'Operation:\t%(title)s\nReplace:\t\t%(src_fname)s\nWith:\t\t%(dest_fname)s') % {
|
||||
'title' : self.title.replace('_',''), 'src_fname' : from_text, 'dest_fname' : to_text }
|
||||
'Operation:\t%(title)s\n'
|
||||
'Replace:\t\t%(src_fname)s\n'
|
||||
'With:\t\t%(dest_fname)s') % {
|
||||
'title' : self.title.replace('_',''),
|
||||
'src_fname' : from_text,
|
||||
'dest_fname' : to_text }
|
||||
return text
|
||||
|
||||
def _prepare(self):
|
||||
|
Loading…
x
Reference in New Issue
Block a user