def run_error_dialogs(exc_info, sentry_error): error_text = u"%s: %s" % (exc_info[0].__name__, (text_type(exc_info[1]).strip() or u"\n").splitlines()[0]) error_text += u"\n------\n" error_text += u"\n".join(format_exception(*exc_info)) # Don't reshow the error dialog in case the user wanted to quit the app # but due to the error state more errors pile up.. if app.is_quitting: return window = find_active_window() if window is None: return # XXX: This does blocking IO and uses nested event loops... but it's simple dialog = ErrorDialog(window, error_text, show_bug_report=(sentry_error is None)) while 1: response = dialog.run() if response == ErrorDialog.RESPONSE_QUIT: dialog.destroy() app.quit() elif response == ErrorDialog.RESPONSE_SUBMIT: dialog.hide() submit_dialog = SubmitErrorDialog(window, sentry_error.get_report()) submit_response = submit_dialog.run() if submit_response == SubmitErrorDialog.RESPONSE_SUBMIT: sentry_error.set_comment(submit_dialog.get_comment()) timeout_seconds = 5 try: sentry_error.send(timeout_seconds) except SentryError: print_exc() submit_dialog.destroy() dialog.destroy() else: submit_dialog.destroy() dialog.show() continue elif response == ErrorDialog.RESPONSE_BUGREPORT: url = get_github_issue_url(exc_info) website(url) dialog.destroy() else: dialog.destroy() break
def run_error_dialogs(exc_info, sentry_error): assert sentry_error is not None error_text = u"%s: %s" % ( exc_info[0].__name__, (text_type(exc_info[1]).strip() or u"\n").splitlines()[0]) error_text += u"\n------\n" error_text += u"\n".join(format_exception(*exc_info)) # Don't reshow the error dialog in case the user wanted to quit the app # but due to the error state more errors pile up.. if app.is_quitting: return window = find_active_window() if window is None: return # XXX: This does blocking IO and uses nested event loops... but it's simple dialog = ErrorDialog(window, error_text) while 1: response = dialog.run() if response == ErrorDialog.RESPONSE_QUIT: dialog.destroy() app.quit() elif response == ErrorDialog.RESPONSE_SUBMIT: dialog.hide() submit_dialog = SubmitErrorDialog( window, sentry_error.get_report()) submit_response = submit_dialog.run() if submit_response == SubmitErrorDialog.RESPONSE_SUBMIT: sentry_error.set_comment(submit_dialog.get_comment()) timeout_seconds = 5 try: sentry_error.send(timeout_seconds) except SentryError: print_exc() submit_dialog.destroy() dialog.destroy() else: submit_dialog.destroy() dialog.show() continue else: dialog.destroy() break
def run_error_dialogs(exc_info, sentry_error): error_text = u"%s: %s" % ( exc_info[0].__name__, (text_type(exc_info[1]).strip() or u"\n").splitlines()[0]) error_text += u"\n------\n" error_text += u"\n".join(format_exception(*exc_info)) window = find_active_window() if window is None: return # XXX: This does blocking IO and uses nested event loops... but it's simple dialog = ErrorDialog( window, error_text, show_bug_report=(sentry_error is None)) while 1: response = dialog.run() if response == ErrorDialog.RESPONSE_QUIT: dialog.destroy() app.quit() elif response == ErrorDialog.RESPONSE_SUBMIT: dialog.hide() submit_dialog = SubmitErrorDialog( window, sentry_error.get_report()) submit_response = submit_dialog.run() if submit_response == SubmitErrorDialog.RESPONSE_SUBMIT: sentry_error.set_comment(submit_dialog.get_comment()) timeout_seconds = 5 try: sentry_error.send(timeout_seconds) except SentryError: print_exc() submit_dialog.destroy() dialog.destroy() else: submit_dialog.destroy() dialog.show() continue elif response == ErrorDialog.RESPONSE_BUGREPORT: url = get_github_issue_url(exc_info) website(url) dialog.destroy() else: dialog.destroy() break
def init(app_id): try: import gnome, gnome.ui except ImportError: return gnome.init(app_id, const.VERSION) client = gnome.ui.master_client() client.set_restart_style(gnome.ui.RESTART_IF_RUNNING) command = os.path.normpath(os.path.join(os.getcwd(), sys.argv[0])) try: client.set_restart_command([command] + sys.argv[1:]) except TypeError: # Fedora systems have a broken gnome-python wrapper for this function. # http://www.sacredchao.net/quodlibet/ticket/591 # http://trac.gajim.org/ticket/929 client.set_restart_command(len(sys.argv), [command] + sys.argv[1:]) client.connect('die', lambda *x: app.quit())
def __create_window(self, Kind, value, traceback, dump, minidump): window = gtk.Window() window.set_default_size(400, 400) window.set_border_width(12) window.set_title(_("Error Occurred")) label = gtk.Label(_("""\ An exception has occured in Quod Libet. A dump file has been saved to <b>%s</b> that will help us debug the crash. Please file a new issue at http://code.google.com/p/quodlibet/issues/list and attach this file or include its contents. This file may contain some identifying information about you or your system, such as a list of recent files played. If this is unacceptable, send <b>%s</b> instead with a description of what you were doing. Quod Libet may now be unstable. Closing it and restarting is recommended. Your library will be saved.""") % (util.unexpand(dump), util.unexpand(minidump))) label.set_selectable(True) label.set_use_markup(True) label.set_line_wrap(True) box = gtk.VBox(spacing=6) buttons = gtk.HButtonBox() view = gtk.TreeView() sw = gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) sw.set_shadow_type(gtk.SHADOW_IN) sw.add(view) model = gtk.ListStore(str, str, int) self.__fill_list(view, model, value, traceback) view.set_model(model) cancel = gtk.Button(stock=gtk.STOCK_CANCEL) close = gtk.Button(stock=gtk.STOCK_QUIT) buttons.pack_start(close) buttons.pack_start(cancel) box.pack_start(label, expand=False) box.pack_start(sw) box.pack_start(buttons, expand=False) window.add(box) window.connect('destroy', self.__destroy) cancel.connect_object('clicked', gtk.Window.destroy, window) close.connect('clicked', lambda *x: app.quit()) window.show_all() filename = util.unexpand(dump) offset = label.get_text().decode("utf-8").find(filename) label.select_region(offset, offset + len(filename)) return window
def _quit(self, library, window, player): from quodlibet import app app.quit()
def Quit(self): app.quit()
def _popup_menu(self, icon, button, time): if self.__destroy_win32_menu(): return self.__menu = menu = Gtk.Menu() player = app.player window = app.window if player.paused: playpause = MenuItem(_("_Play"), Icons.MEDIA_PLAYBACK_START) else: playpause = MenuItem(_("P_ause"), Icons.MEDIA_PLAYBACK_PAUSE) playpause.connect('activate', self.__play_pause) previous = MenuItem(_("Pre_vious"), Icons.MEDIA_SKIP_BACKWARD) previous.connect('activate', lambda *args: player.previous()) next = MenuItem(_("_Next"), Icons.MEDIA_SKIP_FORWARD) next.connect('activate', lambda *args: player.next()) orders = Gtk.MenuItem(label=_("Play _Order"), use_underline=True) repeat = Gtk.CheckMenuItem(label=_("_Repeat"), use_underline=True) repeat.set_active(window.repeat.get_active()) repeat.connect('toggled', lambda s: window.repeat.set_active(s.get_active())) def set_safter(widget, safter_action): safter_action.set_active(widget.get_active()) safter_action = app.window.stop_after safter = Gtk.CheckMenuItem(label=_("Stop _after this song"), use_underline=True) safter.set_active(safter_action.get_active()) safter.connect('toggled', set_safter, safter_action) def set_order(widget, order): name = order.name try: window.order.set_active_by_name(name) except ValueError: pass order_items = [] item = None active_order = window.order.get_active() for Kind in ORDERS: item = RadioMenuItem( group=item, label=Kind.accelerated_name, use_underline=True) order_items.append(item) if Kind is active_order: item.set_active(True) item.connect('toggled', set_order, Kind) order_sub = Gtk.Menu() order_sub.append(repeat) order_sub.append(safter) order_sub.append(SeparatorMenuItem()) for item in order_items: order_sub.append(item) orders.set_submenu(order_sub) browse = qltk.MenuItem(_("_Browse Library"), Icons.EDIT_FIND) browse_sub = Gtk.Menu() for Kind in browsers.browsers: if Kind.is_empty: continue i = Gtk.MenuItem(label=Kind.accelerated_name, use_underline=True) connect_obj(i, 'activate', LibraryBrowser.open, Kind, app.library, app.player) browse_sub.append(i) browse.set_submenu(browse_sub) props = qltk.MenuItem(_("Edit _Tags"), Icons.DOCUMENT_PROPERTIES) props.connect('activate', self.__properties) info = MenuItem(_("_Information"), Icons.DIALOG_INFORMATION) info.connect('activate', self.__information) def set_rating(value): song = player.song if song is None: return else: song["~#rating"] = value app.librarian.changed([song]) rating = Gtk.MenuItem(label=_("_Rating"), use_underline=True) rating_sub = Gtk.Menu() for r in RATINGS.all: item = Gtk.MenuItem(label="%0.2f\t%s" % (r, util.format_rating(r))) connect_obj(item, 'activate', set_rating, r) rating_sub.append(item) rating.set_submenu(rating_sub) quit = MenuItem(_("_Quit"), Icons.APPLICATION_EXIT) quit.connect('activate', lambda *x: app.quit()) menu.append(playpause) menu.append(SeparatorMenuItem()) menu.append(previous) menu.append(next) menu.append(orders) menu.append(SeparatorMenuItem()) menu.append(browse) menu.append(SeparatorMenuItem()) menu.append(props) menu.append(info) menu.append(rating) menu.append(SeparatorMenuItem()) menu.append(quit) menu.show_all() if sys.platform in ("win32", "darwin"): pos_func = pos_arg = None else: pos_func = Gtk.StatusIcon.position_menu pos_arg = self._icon menu.popup(None, None, pos_func, pos_arg, button, time)
def _popup_menu(self, icon, button, time): if self.__destroy_win32_menu(): return self.__menu = menu = Gtk.Menu() player = app.player window = app.window pp_icon = [Gtk.STOCK_MEDIA_PAUSE, Gtk.STOCK_MEDIA_PLAY][player.paused] playpause = Gtk.ImageMenuItem.new_from_stock(pp_icon, None) playpause.connect('activate', self.__play_pause) previous = Gtk.ImageMenuItem.new_from_stock( Gtk.STOCK_MEDIA_PREVIOUS, None) previous.connect('activate', lambda *args: player.previous()) next = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_MEDIA_NEXT, None) next.connect('activate', lambda *args: player.next()) orders = Gtk.MenuItem(label=_("Play _Order"), use_underline=True) repeat = Gtk.CheckMenuItem(label=_("_Repeat"), use_underline=True) repeat.set_active(window.repeat.get_active()) repeat.connect('toggled', lambda s: window.repeat.set_active(s.get_active())) def set_safter(widget, safter_action): safter_action.set_active(widget.get_active()) safter_action = app.window.stop_after safter = Gtk.CheckMenuItem(label=_("Stop _after this song"), use_underline=True) safter.set_active(safter_action.get_active()) safter.connect('toggled', set_safter, safter_action) def set_order(widget, num): window.order.set_active(num) order_items = [] item = None for i, Kind in enumerate(ORDERS): item = RadioMenuItem( group=item, label=Kind.accelerated_name, use_underline=True) order_items.append(item) item.connect('toggled', set_order, i) order_items[window.order.get_active()].set_active(True) order_sub = Gtk.Menu() order_sub.append(repeat) order_sub.append(safter) order_sub.append(SeparatorMenuItem()) for item in order_items: order_sub.append(item) orders.set_submenu(order_sub) browse = qltk.MenuItem(_("_Browse Library"), Gtk.STOCK_FIND) browse_sub = Gtk.Menu() for Kind in browsers.browsers: if not Kind.in_menu: continue i = Gtk.MenuItem(label=Kind.accelerated_name, use_underline=True) i.connect_object( 'activate', LibraryBrowser.open, Kind, app.library) browse_sub.append(i) browse.set_submenu(browse_sub) props = qltk.MenuItem(_("Edit _Tags"), Gtk.STOCK_PROPERTIES) props.connect('activate', self.__properties) info = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_INFO, None) info.connect('activate', self.__information) def set_rating(value): song = player.song if song is None: return else: song["~#rating"] = value app.librarian.changed([song]) rating = Gtk.MenuItem(label=_("_Rating"), use_underline=True) rating_sub = Gtk.Menu() for r in RATINGS.all: item = Gtk.MenuItem("%0.2f\t%s" % (r, util.format_rating(r))) item.connect_object('activate', set_rating, r) rating_sub.append(item) rating.set_submenu(rating_sub) quit = Gtk.ImageMenuItem.new_from_stock(Gtk.STOCK_QUIT, None) quit.connect('activate', lambda *x: app.quit()) menu.append(playpause) menu.append(SeparatorMenuItem()) menu.append(previous) menu.append(next) menu.append(orders) menu.append(SeparatorMenuItem()) menu.append(browse) menu.append(SeparatorMenuItem()) menu.append(props) menu.append(info) menu.append(rating) menu.append(SeparatorMenuItem()) menu.append(quit) menu.show_all() if sys.platform != "win32": pos_func = Gtk.StatusIcon.position_menu pos_arg = self._icon else: pos_func = pos_arg = None menu.popup(None, None, pos_func, pos_arg, button, time)
def end_session_cb(*args): print_d("GSM sent EndSession: going down") client_priv.EndSessionResponse(True, "") app.quit()