File: datasource_select_box.rb

package info (click to toggle)
mikutter 5.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,780 kB
  • sloc: ruby: 22,912; sh: 186; makefile: 21
file content (47 lines) | stat: -rw-r--r-- 1,311 bytes parent folder | download
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
# frozen_string_literal: true

class Plugin::ExtractGtk::DatasourceSelectBox < Gtk::HierarchycalSelectBox
  def initialize(sources, &)
    super(datasources, sources, &)
  end

  def datasources
    (Plugin.filtering(:extract_datasources, {}) || [{}]).first.map do |id, source_name|
      [id, source_name.is_a?(String) ? source_name.split('/') : source_name]
    end
  end

  def menu_pop(widget, _event)
    datasource = selected_datasource_names.first
    if datasource
      contextmenu = Gtk::ContextMenu.new
      contextmenu.register(Plugin[:extract]._('データソース slugをコピー'), &copy_slug(datasource))
      contextmenu.register(Plugin[:extract]._('subscriberをコピー'), &copy_subscriber(datasource))
      contextmenu.popup(widget, widget)
    end
  end

  def copy_slug(datasource)
    ->(_optional=nil, _widget=nil) do
      Gtk::Clipboard.copy(datasource.to_s)
    end
  end

  def copy_subscriber(datasource)
    ->(_optional=nil, _widget=nil) do
      Gtk::Clipboard.copy(<<~CODE % { ds: datasource.to_sym.inspect })
        subscribe(:extract_receive_message, %{ds}).each do |message|
        #{'  '}
        end
      CODE
    end
  end

  private

  def selected_datasource_names
    selection.to_enum(:selected_each).map do |_, _, iter|
      iter[ITER_ID]
    end
  end
end