def run(procedure, run_mode, image, n_layers, layers, args, data): gio_file = args.index(0) bucket_size = args.index(1) sample_average = args.index(2) output_format = args.index(3) progress_bar = None config = None if run_mode == Gimp.RunMode.INTERACTIVE: config = procedure.create_config() # Set properties from arguments. These properties will be changed by the UI. #config.set_property("file", gio_file) #config.set_property("bucket_size", bucket_size) #config.set_property("sample_average", sample_average) #config.set_property("output_format", output_format) config.begin_run(image, run_mode, args) GimpUi.init("histogram-export.py") use_header_bar = Gtk.Settings.get_default().get_property( "gtk-dialogs-use-header") dialog = GimpUi.Dialog(use_header_bar=use_header_bar, title=_("Histogram Export...")) dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL) dialog.add_button("_OK", Gtk.ResponseType.OK) vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=10) dialog.get_content_area().add(vbox) vbox.show() # Create grid to set all the properties inside. grid = Gtk.Grid() grid.set_column_homogeneous(False) grid.set_border_width(10) grid.set_column_spacing(10) grid.set_row_spacing(10) vbox.add(grid) grid.show() # UI for the file parameter def choose_file(widget): if file_chooser_dialog.run() == Gtk.ResponseType.OK: if file_chooser_dialog.get_file() is not None: config.set_property("file", file_chooser_dialog.get_file()) file_entry.set_text( file_chooser_dialog.get_file().get_path()) file_chooser_dialog.hide() file_chooser_button = Gtk.Button.new_with_mnemonic(label=_("_File...")) grid.attach(file_chooser_button, 0, 0, 1, 1) file_chooser_button.show() file_chooser_button.connect("clicked", choose_file) file_entry = Gtk.Entry.new() grid.attach(file_entry, 1, 0, 1, 1) file_entry.set_width_chars(40) file_entry.set_placeholder_text(_("Choose export file...")) if gio_file is not None: file_entry.set_text(gio_file.get_path()) file_entry.show() file_chooser_dialog = Gtk.FileChooserDialog( use_header_bar=use_header_bar, title=_("Histogram Export file..."), action=Gtk.FileChooserAction.SAVE) file_chooser_dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL) file_chooser_dialog.add_button("_OK", Gtk.ResponseType.OK) # Bucket size parameter label = Gtk.Label.new_with_mnemonic(_("_Bucket Size")) grid.attach(label, 0, 1, 1, 1) label.show() spin = GimpUi.prop_spin_button_new(config, "bucket_size", step_increment=0.001, page_increment=0.1, digits=3) grid.attach(spin, 1, 1, 1, 1) spin.show() # Sample average parameter spin = GimpUi.prop_check_button_new(config, "sample_average", _("Sample _Average")) spin.set_tooltip_text( _("If checked, the histogram is generated from merging all visible layers." " Otherwise, the histogram is only for the current layer.")) grid.attach(spin, 1, 2, 1, 1) spin.show() # Output format parameter label = Gtk.Label.new_with_mnemonic(_("_Output Format")) grid.attach(label, 0, 3, 1, 1) label.show() combo = GimpUi.prop_string_combo_box_new( config, "output_format", output_format_enum.get_tree_model(), 0, 1) grid.attach(combo, 1, 3, 1, 1) combo.show() progress_bar = Gtk.ProgressBar() vbox.add(progress_bar) progress_bar.show() dialog.show() if dialog.run() != Gtk.ResponseType.OK: return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error()) # Extract values from UI gio_file = Gio.file_new_for_path( file_entry.get_text()) # config.get_property("file") bucket_size = config.get_property("bucket_size") sample_average = config.get_property("sample_average") output_format = config.get_property("output_format") if gio_file is None: error = 'No file given' return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR, GLib.Error(error)) result = histogram_export(procedure, image, layers, gio_file, bucket_size, sample_average, output_format, progress_bar) # If the execution was successful, save parameters so they will be restored next time we show dialog. if result.index(0) == Gimp.PDBStatusType.SUCCESS and config is not None: config.end_run(Gimp.PDBStatusType.SUCCESS) return result
def run(self, procedure, args, data): palette = None amount = 1 # Get the parameters if args.length() < 1: error = 'No parameters given' return procedure.new_return_values( Gimp.PDBStatusType.CALLING_ERROR, GLib.Error(error)) runmode = args.index(0) if args.length() > 1: palette = args.index(1) if palette == '' or palette is None: palette = Gimp.context_get_palette() (exists, num_colors) = Gimp.palette_get_info(palette) if not exists: error = 'Unknown palette: {}'.format(palette) return procedure.new_return_values( Gimp.PDBStatusType.CALLING_ERROR, GLib.Error(error)) if args.length() > 2: amount = args.index(2) if runmode == Gimp.RunMode.INTERACTIVE: gi.require_version('Gtk', '3.0') from gi.repository import Gtk GimpUi.ui_init("palette-offset.py") use_header_bar = Gtk.Settings.get_default().get_property( "gtk-dialogs-use-header") dialog = GimpUi.Dialog(use_header_bar=use_header_bar, title=_("Offset Palette...")) dialog.add_button("_Cancel", Gtk.ResponseType.CANCEL) dialog.add_button("_OK", Gtk.ResponseType.OK) box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, homogeneous=False, spacing=12) dialog.get_content_area().add(box) box.show() label = Gtk.Label.new_with_mnemonic("Off_set") box.pack_start(label, False, False, 1) label.show() amount = self.set_property("amount", amount) spin = GimpUi.prop_spin_button_new(self, "amount", 1.0, 5.0, 0) spin.set_activates_default(True) box.pack_end(spin, False, False, 1) spin.show() dialog.show() if dialog.run() != Gtk.ResponseType.OK: return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error()) amount = self.get_property("amount") #If palette is read only, work on a copy: editable = Gimp.palette_is_editable(palette) if not editable: palette = Gimp.palette_duplicate(palette) tmp_entry_array = [] for i in range(num_colors): tmp_entry_array.append((Gimp.palette_entry_get_name(palette, i)[1], Gimp.palette_entry_get_color(palette, i)[1])) for i in range(num_colors): target_index = i + amount if target_index >= num_colors: target_index -= num_colors elif target_index < 0: target_index += num_colors Gimp.palette_entry_set_name(palette, target_index, tmp_entry_array[i][0]) Gimp.palette_entry_set_color(palette, target_index, tmp_entry_array[i][1]) retval = procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error()) value = GObject.Value(GObject.TYPE_STRING, palette) retval.remove(1) retval.insert(1, value) return retval