# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline 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 3 of the License, or
# (at your option) any later version.
#
# Timeline 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 Timeline. If not, see <http://www.gnu.org/licenses/>.
from sys import version as python_version
import platform
import sys
import traceback
import wx
from timelinelib.meta.version import get_full_version
from timelinelib.wxgui.frames.mainframe.mainframe import MainFrame
from timelinelib.wxgui.dialogs.feedback.view import show_feedback_dialog
[docs]def setup_humblewx():
import timelinelib.wxgui.components
import humblewx
humblewx.COMPONENT_MODULES.insert(0, timelinelib.wxgui.components)
[docs]def start_wx_application(before_main_loop_hook=None):
"""
This function creates the wx.App object,
the :doc:`MainFrame <timelinelib_wxgui_frames_mainframe_mainframe>`
object and starts the application event loop.
"""
app = wx.App(False)
main_frame = MainFrame()
main_frame.Show()
sys.excepthook = unhandled_exception_hook
if before_main_loop_hook:
before_main_loop_hook()
app.MainLoop()
[docs]def unhandled_exception_hook(exception_type, value, tb):
show_feedback_dialog(
parent=None,
info=create_info_message(),
subject=create_subject(exception_type, value),
body=create_error_message(exception_type, value, tb))
[docs]def create_info_message():
return ("An unexpected error has occurred. Help us fix it by reporting "
"the error through this form. ")
[docs]def create_subject(exception_type, value):
return "".join(traceback.format_exception_only(exception_type, value)).strip()
[docs]def create_error_message(exception_type, value, tb):
return "\n".join([
"Stacktrace:",
"",
indent(("".join(traceback.format_exception(exception_type, value, tb))).strip()),
"",
"Environment:",
"",
indent(create_versions_message()),
indent(create_locale_message()),
])
[docs]def create_versions_message():
return "\n".join([
"Timeline version: %s" % get_full_version(),
"System version: %s" % ", ".join(platform.uname()),
"Python version: %s" % python_version.replace("\n", ""),
"wxPython version: %s" % wx.version(),
])
[docs]def create_locale_message():
loc = wx.Locale()
language_name = loc.GetLanguageName(loc.GetSystemLanguage())
encoding_name = loc.GetSystemEncodingName()
locale_info = '%s %s' % (language_name, encoding_name)
return "\n".join([
"Locale setting: %s" % locale_info,
"Locale sample date: 3333-11-22",
])
[docs]def indent(text):
return "\n".join(" " + x for x in text.split("\n"))