%PDF- %PDF-
Direktori : /lib/python3/dist-packages/softwareproperties/gtk/ |
Current File : //lib/python3/dist-packages/softwareproperties/gtk/DialogEditDeb822.py |
# Copyright (c) 2023 Canonical # # 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 import os import gi gi.require_version("Gtk", "3.0") from gi.repository import Gtk from aptsources.sourceslist import Deb822SourceEntry from softwareproperties.gtk.utils import ( setup_ui, ) class _CustomSourceEntryField(Gtk.Grid): def __init__(self, window, input_changed_callback, key=None, value=None): super(Gtk.Grid, self).__init__() self.window = window self.entry_key = Gtk.Entry(name='field_key', placeholder_text='Key') self.entry_val = Gtk.Entry(name='field_value', placeholder_text='Value') self.button_delete = Gtk.Button.new_from_stock('gtk-delete') if key is not None: self.entry_key.set_text(key) if value is not None: self.entry_val.set_text(value) self.set_column_spacing(12) self.attach(self.entry_key, 0, 0, 1, 1) self.attach(self.entry_val, 1, 0, 1, 1) self.attach(self.button_delete, 2, 0, 1, 1) self.connect('destroy', input_changed_callback) self.entry_key.connect('changed', input_changed_callback) self.entry_val.connect('changed', input_changed_callback) self.button_delete.connect('clicked', self._button_del_field_clicked_callback) def _button_del_field_clicked_callback(self, *data): parent = self.get_parent() parent.get_parent().remove(parent) # Shrink the height back to size after deleting items. width = self.window.get_default_size()[0] self.window.resize(width, 1) def get_key(self): return self.entry_key.get_text() def get_val(self): return self.entry_val.get_text() class DialogEditDeb822: def __init__(self, parent, sourceslist, source_entry, datadir): self.sourceslist = sourceslist self.source_entry = source_entry self.new_source_entry = None setup_ui( self, os.path.join(datadir, 'gtkbuilder', 'dialog-edit-deb822-source.ui'), domain='software-properties' ) self.main = self.dialog_edit_deb822 self.main.set_transient_for(parent) self._populate_with_existing_source_entry() self._connect_signal_callbacks() def _populate_with_existing_source_entry(self): self.entry_types.set_text(" ".join(self.source_entry.types)) self.entry_uris.set_text(" ".join(self.source_entry.uris)) self.entry_suites.set_text(" ".join(self.source_entry.suites)) self.entry_comps.set_text(" ".join(self.source_entry.comps)) self.entry_comment.set_text(self.source_entry.comment.rstrip()) for key, value in self.source_entry.section.tags.items(): if key not in ['Types', 'URIs', 'Suites', 'Components']: self._append_custom_source_entry_field(key=key, value=value) def _append_custom_source_entry_field(self, key=None, value=None): row = Gtk.ListBoxRow(selectable=False, activatable=False) field = _CustomSourceEntryField( self.main, self._input_changed_callback, key, value ) row.add(field) self.list_box_additional_fields.insert(row, -1) self.list_box_additional_fields.show_all() def _get_custom_source_entry_fields(self): rows = self.list_box_additional_fields.get_children() fields = [r.get_children()[0] for r in rows] return [f for f in fields if any((f.get_key(), f.get_val()))] def _is_current_input_valid(self): if '' in (self.entry_types.get_text(), self.entry_uris.get_text(), self.entry_suites.get_text(), self.entry_comps.get_text()): return False for field in self._get_custom_source_entry_fields(): if '' in (field.get_key(), field.get_val()): return False return True def _connect_signal_callbacks(self): for entry in (self.entry_types, self.entry_uris, self.entry_suites, self.entry_comps, self.entry_comment): entry.connect('changed', self._input_changed_callback) self.button_add_field.connect('clicked', self._button_add_field_clicked_callback) def _input_changed_callback(self, *data): self.button_edit_ok.set_sensitive(self._is_current_input_valid()) def _button_add_field_clicked_callback(self, *data): self._append_custom_source_entry_field() def _source_entry_from_input(self): source_entry = Deb822SourceEntry(None, self.source_entry.file) source_entry.types = self.entry_types.get_text().split() source_entry.uris = self.entry_uris.get_text().split() source_entry.suites = self.entry_suites.get_text().split() source_entry.comps = self.entry_comps.get_text().split() source_entry.comment = self.entry_comment.get_text() for field in self._get_custom_source_entry_fields(): source_entry.section[field.get_key()] = field.get_val() return source_entry def run(self): res = self.main.run() if res == Gtk.ResponseType.OK: self.new_source_entry = self._source_entry_from_input() self.main.hide() return res