def complete(manga_data, server): if server != self.server or manga_data['slug'] != self.manga_slug: return False self.manga_data = manga_data # Populate manga card try: cover_data = self.server.get_manga_cover_image( self.manga_data.get('cover')) except Exception as e: cover_data = None user_error_message = log_error_traceback(e) if user_error_message: self.show_notification(user_error_message) if cover_data is not None: cover_stream = Gio.MemoryInputStream.new_from_data( cover_data, None) pixbuf = Pixbuf.new_from_stream_at_scale( cover_stream, 174, -1, True, None) else: pixbuf = Pixbuf.new_from_resource_at_scale( '/info/febvre/Komikku/images/missing_file.png', 174, -1, True) self.builder.get_object('cover_image').set_from_pixbuf(pixbuf) self.builder.get_object('authors_value_label').set_markup( '<span size="small">{0}</span>'.format( ', '.join(self.manga_data['authors'] ) if self.manga_data['authors'] else '-')) self.builder.get_object('genres_value_label').set_markup( '<span size="small">{0}</span>'.format( ', '.join(self.manga_data['genres'] ) if self.manga_data['genres'] else '-')) self.builder.get_object('status_value_label').set_markup( '<span size="small">{0}</span>'. format(_(Manga.STATUSES[self.manga_data['status']]) ) if self.manga_data['status'] else '-') self.builder.get_object('scanlators_value_label').set_markup( '<span size="small">{0}</span>'.format( ', '.join(self.manga_data['scanlators'] ) if self.manga_data['scanlators'] else '-')) self.builder.get_object('server_value_label').set_markup( '<span size="small"><a href="{0}">{1} [{2}]</a>\n{3} chapters</span>' .format( self.server.get_manga_url(self.manga_data['slug'], self.manga_data.get('url')), html.escape(self.server.name), self.server.lang.upper(), len(self.manga_data['chapters']))) self.builder.get_object('synopsis_value_label').set_text( self.manga_data['synopsis'] or '-') self.activity_indicator.stop() self.show_page('manga') return False
def _build_widgets(self): self._coin_name.set_text(self.coin_model.name) self._coin_price.set_text(self.coin_model.price) pix = Pixbuf.new_from_resource_at_scale(self.coin_model.logo, 75, 75, True) self._coin_icon.set_from_pixbuf(pix)
def assemble_window(self): # Default size window_size = Settings.get_default().window_size self.set_default_size(window_size[0], window_size[1]) # Min size geom = Gdk.Geometry() geom.min_width = 360 geom.min_height = 288 self.set_geometry_hints(None, geom, Gdk.WindowHints.MIN_SIZE) # Titlebar self.titlebar = self.builder.get_object('titlebar') self.headerbar = self.builder.get_object('headerbar') self.left_button = self.builder.get_object('left_button') self.left_button.connect('clicked', self.on_left_button_clicked, None) self.builder.get_object('fullscreen_button').connect( 'clicked', self.toggle_fullscreen, None) self.set_titlebar(self.titlebar) # Fisrt start grid self.first_start_grid = self.builder.get_object('first_start_grid') pix = Pixbuf.new_from_resource_at_scale( '/info/febvre/Komikku/images/logo.png', 256, 256, True) self.builder.get_object('app_logo').set_from_pixbuf(pix) # Init pages self.library = Library(self) self.card = Card(self) self.reader = Reader(self) # Window self.connect('check-resize', self.on_resize) self.connect('delete-event', self.on_application_quit) self.connect('key-press-event', self.on_key_press_event) self.connect('window-state-event', self.on_window_state_event) # Custom CSS screen = Gdk.Screen.get_default() css_provider = Gtk.CssProvider() css_provider_resource = Gio.File.new_for_uri( 'resource:///info/febvre/Komikku/css/style.css') css_provider.load_from_file(css_provider_resource) context = Gtk.StyleContext() context.add_provider_for_screen(screen, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) if Gio.Application.get_default().development_mode is True: self.get_style_context().add_class('devel') # Theme (light or dark) self.init_theme() self.library.show()
def on_settings_clear_recents_clicked(self, widget): passwordsafe.config_manager.set_last_opened_list([]) if self.window.container is not NotImplemented and self.window.container.get_n_pages() is 0 or self.window.container is NotImplemented: builder = Gtk.Builder() builder.add_from_resource( "/org/gnome/PasswordSafe/main_window.ui") self.window.remove(self.window.first_start_grid) pix = Pixbuf.new_from_resource_at_scale("/org/gnome/PasswordSafe/images/welcome.png", 256, 256, True) app_logo = builder.get_object("app_logo") app_logo.set_from_pixbuf(pix) self.window.first_start_grid = builder.get_object("first_start_grid") self.window.add(self.window.first_start_grid) widget.set_sensitive(False)
def populate(self): manga = self.card.manga if manga.cover_fs_path is None: pixbuf = Pixbuf.new_from_resource_at_scale('/info/febvre/Komikku/images/missing_file.png', 174, -1, True) else: if get_file_mime_type(manga.cover_fs_path) != 'image/gif': pixbuf = Pixbuf.new_from_file_at_scale(manga.cover_fs_path, 174, -1, True) else: pixbuf = scale_pixbuf_animation(PixbufAnimation.new_from_file(manga.cover_fs_path), 174, -1, True, True) if isinstance(pixbuf, PixbufAnimation): self.cover_image.set_from_animation(pixbuf) else: self.cover_image.set_from_pixbuf(pixbuf) authors = html_escape(', '.join(manga.authors)) if manga.authors else '-' self.authors_value_label.set_markup('<span size="small">{0}</span>'.format(authors)) genres = html_escape(', '.join(manga.genres)) if manga.genres else '-' self.genres_value_label.set_markup('<span size="small">{0}</span>'.format(genres)) status = _(manga.STATUSES[manga.status]) if manga.status else '-' self.status_value_label.set_markup('<span size="small">{0}</span>'.format(status)) scanlators = html_escape(', '.join(manga.scanlators)) if manga.scanlators else '-' self.scanlators_value_label.set_markup('<span size="small">{0}</span>'.format(scanlators)) self.server_value_label.set_markup( '<span size="small">{0} [{1}] - {2} chapters</span>'.format( html_escape(manga.server.name), manga.server.lang.upper(), len(manga.chapters) ) ) self.last_update_value_label.set_markup( '<span size="small">{0}</span>'.format(manga.last_update.strftime('%m/%d/%Y')) if manga.last_update else '-') self.synopsis_value_label.set_text(manga.synopsis or '-') self.set_disk_usage()
def draw_cover_server_logo(self, da, ctx, manga): size = 75 ctx.save() # Draw triangle gradient = cairo.LinearGradient(0, 0, size / 2, size / 2) gradient.add_color_stop_rgba(0, 0, 0, 0, 0.75) gradient.add_color_stop_rgba(1, 0, 0, 0, 0) ctx.set_source(gradient) ctx.new_path() ctx.move_to(0, 0) ctx.rel_line_to(0, size) ctx.rel_line_to(size, -size) ctx.close_path() ctx.fill() # Draw server logo pixbuf = Pixbuf.new_from_resource_at_scale(manga.server.logo_resource_path, 20, 20, True) Gdk.cairo_set_source_pixbuf(ctx, pixbuf, 4, 4) ctx.paint() ctx.restore()
def populate(self): manga = self.card.manga if manga.cover_fs_path is not None: pixbuf = Pixbuf.new_from_file_at_scale(manga.cover_fs_path, 174, -1, True) else: pixbuf = Pixbuf.new_from_resource_at_scale( '/info/febvre/Komikku/images/missing_file.png', 174, -1, True) self.cover_image.set_from_pixbuf(pixbuf) self.authors_value_label.set_markup( '<span size="small">{0}</span>'.format( ', '.join(manga.authors) if manga.authors else '-')) self.genres_value_label.set_markup( '<span size="small">{0}</span>'.format( ', '.join(manga.genres) if manga.genres else '-')) self.status_value_label.set_markup( '<span size="small">{0}</span>'. format(_(manga.STATUSES[manga.status])) if manga.status else '-') self.scanlators_value_label.set_markup( '<span size="small">{0}</span>'.format( ', '.join(manga.scanlators) if manga.scanlators else '-')) self.server_value_label.set_markup( '<span size="small">{0} [{1}] - {2} chapters</span>'.format( html.escape(manga.server.name), manga.server.lang.upper(), len(manga.chapters))) self.last_update_value_label.set_markup( '<span size="small">{0}</span>'. format(manga.last_update.strftime('%m/%d/%Y') ) if manga.last_update else '-') self.synopsis_value_label.set_text(manga.synopsis or '-') self.set_disk_usage()
def __init__(self, settings: Gio.Settings, **kwargs): super().__init__(**kwargs) self.set_default_icon(Pixbuf.new_from_resource_at_scale( '/com/github/tenderowl/norka/icons/com.github.tenderowl.norka.svg', 128, 128, True )) self.settings = settings self._configure_timeout_id = None self.preview = None self.apply_styling() self.current_size = (786, 520) self.resize(*self.settings.get_value('window-size')) self.connect('configure-event', self.on_configure_event) self.connect('destroy', self.on_window_delete_event) # Export clients self.medium_client = Medium() self.writeas_client = Writeas() self.uri_to_open = None # Make a header self.header = Header(self.settings) self.set_titlebar(self.header) self.header.show() # Init screens self.welcome_grid = Welcome() self.welcome_grid.connect('activated', self.on_welcome_activated) self.welcome_grid.connect('document-import', self.on_document_import) self.document_grid = DocumentGrid() self.document_grid.connect('document-create', self.on_document_create_activated) self.document_grid.connect('document-import', self.on_document_import) self.document_grid.view.connect('item-activated', self.on_document_item_activated) self.editor = Editor() self.screens = Gtk.Stack() self.screens.set_transition_duration(400) self.screens.set_transition_type(Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.screens.add_named(self.welcome_grid, 'welcome-grid') self.screens.add_named(self.document_grid, 'document-grid') self.screens.add_named(self.editor, 'editor-grid') self.screens.show_all() self.toast = Granite.WidgetsToast() self.overlay = Gtk.Overlay() self.overlay.add_overlay(self.screens) self.overlay.add_overlay(self.toast) self.overlay.show_all() self.add(self.overlay) # Init actions self.init_actions() # If here's at least one document in storage # then show documents grid self.check_documents_count() # Pull the Settings self.toggle_spellcheck(self.settings.get_boolean('spellcheck')) self.autosave = self.settings.get_boolean('autosave') self.set_autoindent(self.settings.get_boolean('autoindent')) self.set_tabs_spaces(self.settings.get_boolean('spaces-instead-of-tabs')) self.set_indent_width(self.settings.get_int('indent-width')) self.set_style_scheme(self.settings.get_string('stylescheme')) self.editor.update_font(self.settings.get_string('font'))
def __init__(self, window): self.window = window self.builder = Gtk.Builder() self.builder.add_from_resource('/info/febvre/Komikku/ui/add_dialog.ui') self.dialog = self.builder.get_object('dialog') self.dialog.get_children()[0].set_border_width(0) # Header bar self.builder.get_object('back_button').connect('clicked', self.on_back_button_clicked) self.custom_title_stack = self.builder.get_object('custom_title_stack') # Make title centered self.builder.get_object('custom_title_servers_page_label').set_margin_end(38) self.overlay = self.builder.get_object('overlay') self.stack = self.builder.get_object('stack') self.activity_indicator = ActivityIndicator() self.overlay.add_overlay(self.activity_indicator) self.overlay.set_overlay_pass_through(self.activity_indicator, True) self.activity_indicator.show_all() # Servers page listbox = self.builder.get_object('servers_page_listbox') listbox.get_style_context().add_class('list-bordered') listbox.connect('row-activated', self.on_server_clicked) servers_settings = Settings.get_default().servers_settings servers_languages = Settings.get_default().servers_languages for server_data in get_servers_list(): if servers_languages and server_data['lang'] not in servers_languages: continue server_settings = servers_settings.get(get_server_main_id_by_id(server_data['id'])) if server_settings is not None and (not server_settings['enabled'] or server_settings['langs'].get(server_data['lang']) is False): continue row = Gtk.ListBoxRow() row.get_style_context().add_class('add-dialog-server-listboxrow') row.server_data = server_data box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6) row.add(box) # Server logo pixbuf = Pixbuf.new_from_resource_at_scale(get_server_logo_resource_path_by_id(server_data['id']), 24, 24, True) logo = Gtk.Image() logo.set_from_pixbuf(pixbuf) box.pack_start(logo, False, True, 0) # Server title label = Gtk.Label(xalign=0) label.set_text(server_data['name']) box.pack_start(label, True, True, 0) # Server language label = Gtk.Label() label.set_text(LANGUAGES[server_data['lang']]) label.get_style_context().add_class('add-dialog-server-language-label') box.pack_start(label, False, True, 0) listbox.add(row) listbox.show_all() # Search page self.custom_title_search_page_searchentry = self.builder.get_object('custom_title_search_page_searchentry') self.custom_title_search_page_searchentry.connect('activate', self.search) self.search_page_listbox = self.builder.get_object('search_page_listbox') self.search_page_listbox.get_style_context().add_class('list-bordered') self.search_page_listbox.connect('row-activated', self.on_manga_clicked) # Manga page grid = self.builder.get_object('manga_page_grid') grid.set_margin_top(6) grid.set_margin_end(6) grid.set_margin_bottom(6) grid.set_margin_start(6) self.custom_title_manga_page_label = self.builder.get_object('custom_title_manga_page_label') self.add_button = self.builder.get_object('add_button') self.add_button.connect('clicked', self.on_add_button_clicked) self.read_button = self.builder.get_object('read_button') self.read_button.connect('clicked', self.on_read_button_clicked) self.show_page('servers')
def __init__(self, settings: Gio.Settings, storage: Storage, **kwargs): super().__init__(**kwargs) self.set_default_icon( Pixbuf.new_from_resource_at_scale( f'{RESOURCE_PREFIX}/icons/com.github.tenderowl.norka.svg', 128, 128, True)) self.settings = settings self.storage = storage self._configure_timeout_id = None self.preview = None self.extended_stats_dialog = None self.apply_styling() self.current_size = (786, 520) self.resize(*self.settings.get_value('window-size')) hints = Gdk.Geometry() hints.min_width = 554 hints.min_height = 435 self.set_geometry_hints(None, hints, Gdk.WindowHints.MIN_SIZE) self.connect('configure-event', self.on_configure_event) self.connect('destroy', self.on_window_delete_event) # Export clients self.medium_client = Medium() self.writeas_client = Writeas() self.uri_to_open = None # Make a header self.header = Header(self.settings) # self.set_titlebar(self.header) self.header.show() # Init screens self.welcome_grid = Welcome() # self.welcome_grid.connect('activated', self.on_welcome_activated) self.welcome_grid.connect('document-import', self.on_document_import) self.document_grid = DocumentGrid(self.settings, storage=self.storage) self.document_grid.connect('path-changed', self.on_path_changed) self.document_grid.connect('document-create', self.on_document_create_activated) self.document_grid.connect('document-import', self.on_document_import) self.document_grid.connect('rename-folder', self.on_folder_rename_activated) self.document_grid.view.connect('item-activated', self.on_document_item_activated) self.editor = Editor(self.storage, self.settings) self.editor.connect('update-document-stats', self.update_document_stats) self.screens = Gtk.Stack() self.screens.set_transition_duration(400) self.screens.set_transition_type( Gtk.StackTransitionType.SLIDE_LEFT_RIGHT) self.screens.add_named(self.welcome_grid, 'welcome-grid') self.screens.add_named(self.document_grid, 'document-grid') self.screens.add_named(self.editor, 'editor-grid') self.screens.show_all() self.toast = Granite.WidgetsToast() self.overlay = Gtk.Overlay() self.overlay.add_overlay(self.screens) self.overlay.add_overlay(self.toast) self.overlay.show_all() self.content_box.pack_start(self.header, False, False, 0) self.content_box.pack_end(self.overlay, True, True, 0) # Init actions self.init_actions() # If here's at least one document in storage # then show documents grid self.check_grid_items() # Pull the Settings self.toggle_spellcheck(self.settings.get_boolean('spellcheck')) self.autosave = self.settings.get_boolean('autosave') self.set_autoindent(self.settings.get_boolean('autoindent')) self.set_tabs_spaces( self.settings.get_boolean('spaces-instead-of-tabs')) self.set_indent_width(self.settings.get_int('indent-width')) self.set_style_scheme(self.settings.get_string('stylescheme')) self.editor.update_font(self.settings.get_string('font'))