File: edit_window.rb

package info (click to toggle)
mikutter 3.5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 10,256 kB
  • ctags: 2,165
  • sloc: ruby: 19,079; sh: 205; makefile: 20
file content (135 lines) | stat: -rwxr-xr-x 3,723 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -*- coding: utf-8 -*-
require 'observer'
miquire :mui, 'hierarchycal_selectbox'

module Plugin::Extract
end

class Plugin::Extract::EditWindow < Gtk::Window

  def initialize(extract, plugin)
    @plugin = plugin
    @extract = extract.dup.freeze
    super(_('%{name} - 抽出タブ - %{application_name}') % {name: name, application_name: Environment::NAME})
    add(Gtk::VBox.new().
        add(Gtk::Notebook.new.
            append_page(source_widget, Gtk::Label.new(_('データソース'))).
            append_page(condition_widget, Gtk::Label.new(_('絞り込み条件'))).
            append_page(option_widget, Gtk::Label.new(_('オプション')))).
        closeup(Gtk::EventBox.new().
                add(Gtk::HBox.new().
                    closeup(ok_button).right)))
    ssc(:destroy) do
      Plugin.call :extract_tab_update, self.to_h end
    set_size_request 480, 320
    show_all end

  def name
    @extract[:name] || "".freeze end

  def sexp
    @extract[:sexp] end

  def id
    @extract[:id] end

  def sources
    @extract[:sources] || [] end

  def slug
    @extract[:slug] end

  def sound
    @extract[:sound] end

  def popup
    @extract[:popup] end

  def icon
    @extract[:icon] end

  # extract の内容を返す
  # ==== Return
  # @extract の内容(Hash)
  def to_h
    { name: name,
      sexp: sexp,
      id: id,
      slug: slug,
      sources: sources,
      sound: sound,
      popup: popup,
      icon: icon }.freeze end

  # 名前入力ウィジェットを返す
  # ==== Return
  # Gtk::HBox.new
  def name_widget
    @name_widget ||= Gtk::HBox.new().
      closeup(Gtk::Label.new(_('名前'))).
      add(name_entry) end

  # 名前入力ボックス
  # ==== Return
  # Gtk::Entry
  def name_entry
    @name_entry ||= Gtk::Entry.new().tap { |name_entry|
      name_entry.set_text name
      name_entry.ssc(:changed){ |widget|

        false } } end

  def source_widget
    datasources = (Plugin.filtering(:extract_datasources, {}) || [{}]).first.map do |id, name|
      [id, name.is_a?(String) ? name.split('/'.freeze) : name] end
    datasources_box = Gtk::HierarchycalSelectBox.new(datasources, sources.map(&:to_sym)){
      modify_value sources: datasources_box.selected.to_a }
    scrollbar = ::Gtk::VScrollbar.new(datasources_box.vadjustment)
    @source_widget ||= Gtk::HBox.new().
      add(datasources_box).
      closeup(scrollbar) end

  def condition_widget
    @condition_widget ||= Gtk::VBox.new().
      add(condition_form) end

  def condition_form
    @condition_form = Gtk::MessagePicker.new(sexp.freeze){
      modify_value sexp: @condition_form.to_a
    } end

  def generate_modifier(method)
    Plugin::Settings::Listener.new.get {
      __send__(method)
    }.set { |v|
      modify_value method => v } end

  def option_widget
    name_modifier = generate_modifier :name
    icon_modifier = generate_modifier :icon
    sound_modifier = generate_modifier :sound
    popup_modifier = generate_modifier :popup
    Plugin::Settings.new(Plugin[:extract]) do
      input _('名前'), name_modifier
      fileselect _('アイコン'), icon_modifier, Skin.path
      settings _('通知') do
        fileselect _('サウンド'), sound_modifier
        boolean _('ポップアップ'), popup_modifier end end end

  def ok_button
    Gtk::Button.new(_('閉じる')).tap{ |button|
      button.ssc(:clicked){
        self.destroy } } end

  private

  def modify_value(new_values)
    @extract = @extract.merge(new_values).freeze
    set_title _('%{name} - 抽出タブ - %{application_name}') % {name: name, application_name: Environment::NAME}
    Plugin.call :extract_tab_update, self.to_h
    self end

  def _(message)
    @plugin._(message) end

end