2024年4月13日土曜日

GIMP 2.99.19 Python 奮闘記 其の弐 色と選択項目

GIMP 2.99.19 Python 奮闘記 其の壱 基本的なもの に続きます。
暗中模索のトライ を、またもや。
最近更新された 色 と、利用頻度が高いと思われる 選択項目 と、を。
Disalog 表示って、... 難しい。


前回 は、
基本的な GUI (Dialog) を出す為の トレーニング で、
文字列、実数、整数、真偽 の4項目を受け入れるものを。
でしたね。

今回は、其れに 色と選択項目とを増やします。
参考にしたのは、標準添付される foggify.py と palette-sort.py とです。
選択項目の書き方は 試行錯誤 の上で、です。
一応、動く様になったので、公開しましょう。

色に関しては、
foogify.py の 最新版 を参考にすれば OK です。
選択項目に関しては、先にも述べた様に、梃子摺りました。

因みに、選択項目の利用は頻度が高いと思いますので、
今後、サンプルが増えれば、別の記述方法も出て来る気がします。
きっと、色々な書き方があると思っています。
まぁ、参考と言う事で。


今回の件は、後述の Code をご覧戴きたいのですが、
留意点を。

前回の4項目と同様に、
Code 最後に出て来る コメント行 # Args Order In Dialog
に続く procedure.add_argument_from_property() 
の順序で、
Dialog での表示の上下が決まる(と思う)のですが、
int_combo (Integer ComboBox) がある状態で、
最初辺りの コメント行 # Procedure 関数(関数名・引数・処理)
に続く部分で、 dialog.fill(None) とやって仕舞うと、
同じ変数 (此処では int_opt) に対して、二重に表示されます。
そう、普通の int 項目と 選択項目と です。
此の場合、項目の最後に 選択項目 (ComboBox Style) が追加表示されます。
なので、
dialog.fill(None) とは書かず、
各変数名を順番に .fill しています。
面倒ですが、止むを得ない、です。


さて、code を。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Python for GIMP 2.99.19 +

import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
gi.require_version('Gegl', '0.4')
from gi.repository import Gegl
from gi.repository import GObject
from gi.repository import GLib
from gi.repository import Gio

def N_(message): return message
def _(message): return GLib.dgettext(None, message)

# Define Int Store Items
ITEM_OPTIONS =("ITEM0", "ITEM1", "ITEM2", "ITEM3")
# ITEM0 = 0
# ITEM1 = 1
# ITEM2 = 2
# ITEM3 = 3

import sys

# Procedure 関数(関数名・引数・処理)
# #def shiro_dialog_args6_test2_api3(procedure, run_mode, image, n_drawables, drawables, args, data):
def shiro_dialog_args6_test2_api3(procedure, run_mode, image, n_drawables, drawables, config, data):
    Gegl.init(None)    # for Color Handling

    _color = Gegl.Color.new("black")
    _color.set_rgba(0.94, 0, 0, 1.0)

    # Work around not being able to set default color by only setting it
    # when color in our config is None. This won't help when resetting to
    # factory default. This also fixes a critical when running without
    # changing the color away from None.
    color = config.get_property('color')
    if color is None:
        config.set_property('color', _color)

    # Pre-Start of proc for GIMP3
    if run_mode == Gimp.RunMode.INTERACTIVE:
       GimpUi.init('python-fu-shiro-dialog-args6-test2-api3')
       dialog = GimpUi.ProcedureDialog.new(procedure, config)

       # dialog.fill(None)    # Not Use, int_opt Is Duplicate Displayed
       dialog.fill(["lyr_name1"])
       dialog.fill(["float_val"])
       dialog.fill(["int_val"])
       dialog.fill(["is_ok"])
       # Get color Setting
       dialog.get_color_widget('color', True, GimpUi.ColorAreaType.FLAT)
       dialog.fill(["color"])
       # Get int combo
       dialog.get_int_combo("int_opt", GimpUi.IntStore.new (ITEM_OPTIONS))
       dialog.fill(["int_opt"])

    if not dialog.run():
      dialog.destroy()
      return procedure.new_return_values(Gimp.PDBStatusType.CANCEL, GLib.Error())
    else:
      dialog.destroy()

    lyr_name1  = config.get_property('lyr_name1')
    float_val  = config.get_property('float_val')
    int_val    = config.get_property('int_val')
    is_ok      = config.get_property('is_ok')
    color      = config.get_property('color')
    int_opt    = config.get_property('int_opt')

    # Start
    img = image
    lyr = drawables[0]

    # Message EndWith ¥n : Dialog, WithOut ¥n : ErrorConsole/StatusBar
    Gimp.message("Dialog Args ---------   ¥n" + ¥
               "   image : (id#" + str(img.get_id()) + ")  " + img.get_name() + "     ¥n" + ¥
               "   drawables count : " + str(n_drawables) + "     ¥n" + ¥
               "   layer : (id#" + str(lyr.get_id()) + ")  " + lyr.get_name() + "     ¥n" + ¥
               "   -------------   ¥n" + ¥
               "   lyr_name1 : " + str(type(lyr_name1)) + "  " + lyr_name1 + "     ¥n" + ¥
               "   float_val : " + str(type(float_val)) + "  " + str(float_val) + "     ¥n" + ¥
               "   int_val : " + str(type(int_val)) + "  " + str(int_val) + "     ¥n" + ¥
               "   is_ok : " + str(type(is_ok)) + "  " + str(is_ok) + "     ¥n" + ¥
               "   color : " + str(type(color)) + "  " + str(color.get_rgba()) + "     ¥n" + ¥

               "   int_opt : " + str(type(int_opt)) + "  " + str(int_opt) +
                                                  "    = " + str(ITEM_OPTIONS[int_opt]) +  "     ¥n" + ¥
               ""
              )    
   
    # End of proc for GIMP3
    return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())

class ShiroDialogArgs6Test2Api3 (Gimp.PlugIn):
    ## Parameters ##
    __gproperties__ = {
        "lyr_name1": (str,
                 _("Add Layer Name"),
                 _("Add Layer Name Tooltip"),
                 _("_Test"),
                 GObject.ParamFlags.READWRITE),
        "float_val" : (float,
                 _("Set Double : "),
                 _("Set Double Value Tooltip"),
                 0.0, 100.0, 50.0,
                 GObject.ParamFlags.READWRITE),
        "int_val" : (int,
                 _("Set Integer : "),
                 _("Set Integer Value Tooltip"),
                 0, 100, 30,
                 GObject.ParamFlags.READWRITE),
        "is_ok": (bool,
                 _("  :  Is OK ? "),
                 _("Is OK ?  Tooltip"),
                 False,
                 GObject.ParamFlags.READWRITE),
        "int_opt" : (int,
                 _("Select Item : " + str(ITEM_OPTIONS)),
                 _("Select Item , Get Int Value Tooltip"),
                 0, len(ITEM_OPTIONS), 1,
                 GObject.ParamFlags.READWRITE),
    }

    color = GObject.Property(type =Gegl.Color, default=None,
                              nick =_("Set Color : "),
                              blurb=_("Set Color Tooltip"))

    ## GimpPlugIn virtual methods ##
    def do_set_i18n(self, procname):
           return True, 'gimp30-python', None

    def do_query_procedures(self):
        return [ 'python-fu-shiro-dialog-args6-test2-api3' ]

    def do_create_procedure(self, name):
        procedure = Gimp.ImageProcedure.new(self, name,
                                          Gimp.PDBProcType.PLUGIN,
                                          shiro_dialog_args6_test2_api3, None)            
        procedure.set_image_types("RGB*");
        procedure.set_sensitivity_mask (Gimp.ProcedureSensitivityMask.DRAWABLE |
                                        Gimp.ProcedureSensitivityMask.DRAWABLES)
        procedure.set_documentation (_("Args In Dialog Test2 6-Args"),
                                     _("Args In Dialog Test2 For GIMP 2.99.19 +"),
                                     name)
        procedure.set_menu_label(_("Dialog Args6 Test2 Api3"))
        procedure.set_attribution("ShiroYuki_Mot",
                                  "Copyright 2024- ShiroYuki_Mot",
                                  "2024/03/21")
        procedure.add_menu_path ("<Image>/Script-Py/Test/")

        # procedure.add_argument_from_property(self, "<<arg_name_n>>") ...
        # Args Order In Dialog
        procedure.add_argument_from_property(self, "lyr_name1")
        procedure.add_argument_from_property(self, "float_val")
        procedure.add_argument_from_property(self, "int_val")
        procedure.add_argument_from_property(self, "is_ok")
        procedure.add_argument_from_property(self, "color")
        procedure.add_argument_from_property(self, "int_opt")

        return procedure

Gimp.main(ShiroDialogArgs6Test2Api3.__gtype__, sys.argv)



ざっと、こんな感じ です。


因みに、Dialog と 実行結果 との表示を例示します。



次回 は また2項目を増やします。 同じ書き方で5項目がいける筈です。



0 件のコメント:

コメントを投稿