Class: Alexandria::UI::PreferencesDialog

Inherits:
BuilderBase show all
Includes:
Logging, GetText
Defined in:
lib/alexandria/ui/preferences_dialog.rb

Instance Method Summary collapse

Methods included from Logging

included, #log

Constructor Details

#initialize(parent, &changed_block) ⇒ PreferencesDialog

Returns a new instance of PreferencesDialog.



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
# File 'lib/alexandria/ui/preferences_dialog.rb', line 20

def initialize(parent, &changed_block)
  super("preferences_dialog__builder.glade", widget_names)
  @preferences_dialog.transient_for = parent
  @changed_block = changed_block

  @cols = {
    @checkbutton_col_authors      => "col_authors_visible",
    @checkbutton_col_isbn         => "col_isbn_visible",
    @checkbutton_col_publisher    => "col_publisher_visible",
    @checkbutton_col_publish_date => "col_publish_date_visible",
    @checkbutton_col_edition      => "col_edition_visible",
    @checkbutton_col_redd         => "col_redd_visible",
    @checkbutton_col_own          => "col_own_visible",
    @checkbutton_col_want         => "col_want_visible",
    @checkbutton_col_rating       => "col_rating_visible",
    @checkbutton_col_tags         => "col_tags_visible",
    @checkbutton_col_loaned_to    => "col_loaned_to_visible"
  }
  @cols.each_pair do |checkbutton, pref_name|
    if checkbutton
      checkbutton.active = Preferences.instance.get_variable(pref_name)
    else
      log.warn do
        "no CheckButton for property #{pref_name} " \
        "(probably conflicting versions of GUI and lib code)"
      end
    end
  end

  model = Gtk::ListStore.new(String, String, TrueClass, Integer)
  @treeview_providers.model = model
  reload_providers
  model.signal_connect_after("row-changed") { update_priority }

  renderer = Gtk::CellRendererToggle.new
  renderer.activatable = true
  renderer.signal_connect("toggled") do |_rndrr, path|
    tree_path = Gtk::TreePath.new(path)
    @treeview_providers.selection.select_path(tree_path)
    prov = selected_provider
    if prov
      prov.toggle_enabled
      adjust_selected_provider(prov)
      # reload_providers
    end
  end

  # renderer.active = true
  column = Gtk::TreeViewColumn.new("Enabled", renderer)
  column.set_cell_data_func(renderer) do |_col, rndr, _mod, iter|
    value = iter[2]
    rndr.active = value
  end

  @treeview_providers.append_column(column)

  renderer = Gtk::CellRendererText.new
  column = Gtk::TreeViewColumn.new("Providers",
                                   renderer)
  column.set_cell_data_func(renderer) do |_col, rndr, _mod, iter|
    rndr.markup = iter[0]
  end
  @treeview_providers.append_column(column)
  @treeview_providers.selection
    .signal_connect("changed") { sensitize_providers }

  @button_prov_setup.sensitive = false

  @button_prov_up.sensitive =
    @button_prov_down.sensitive = BookProviders.list.length > 1

  @buttonbox_prov.set_child_secondary(@button_prov_add, true)
  @buttonbox_prov.set_child_secondary(@button_prov_remove, true)

  if BookProviders.abstract_classes.empty?
    @checkbutton_prov_advanced.sensitive = false
  else
    view_advanced = Preferences.instance.view_advanced_settings
    @checkbutton_prov_advanced.active = true if view_advanced
  end

  sensitize_providers
  setup_barcode_scanner_tab
end

Instance Method Details

#event_is_right_click(event) ⇒ Object



143
144
145
# File 'lib/alexandria/ui/preferences_dialog.rb', line 143

def event_is_right_click(event)
  (event.event_type == :button_press) && (event.button == 3)
end

#on_closeObject



241
242
243
244
# File 'lib/alexandria/ui/preferences_dialog.rb', line 241

def on_close
  @preferences_dialog.destroy
  Alexandria::Preferences.instance.save!
end

#on_column_toggled(checkbutton) ⇒ Object



228
229
230
231
232
233
234
# File 'lib/alexandria/ui/preferences_dialog.rb', line 228

def on_column_toggled(checkbutton)
  raise if @cols[checkbutton].nil?

  Preferences.instance.set_variable(@cols[checkbutton], checkbutton.active?)

  @changed_block.call
end

#on_helpObject



246
247
248
249
# File 'lib/alexandria/ui/preferences_dialog.rb', line 246

def on_help
  Alexandria::UI.display_help(@preferences_dialog,
                              "alexandria-preferences")
end

#on_provider_addObject



183
184
185
186
187
188
189
# File 'lib/alexandria/ui/preferences_dialog.rb', line 183

def on_provider_add
  provider = NewProviderDialog.new(@preferences_dialog).acquire
  return unless provider

  BookProviders.instance.update_priority
  reload_providers
end

#on_provider_advanced_toggled(checkbutton) ⇒ Object



177
178
179
180
181
# File 'lib/alexandria/ui/preferences_dialog.rb', line 177

def on_provider_advanced_toggled(checkbutton)
  on = checkbutton.active?
  Preferences.instance.view_advanced_settings = on
  @button_prov_add.visible = @button_prov_remove.visible = on
end

#on_provider_downObject



168
169
170
171
172
173
174
175
# File 'lib/alexandria/ui/preferences_dialog.rb', line 168

def on_provider_down
  iter = @treeview_providers.selection.selected
  next_iter = iter.dup
  next_iter.next!
  @treeview_providers.model.move_after(iter, next_iter)
  sensitize_providers
  update_priority
end

#on_provider_removeObject



204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/alexandria/ui/preferences_dialog.rb', line 204

def on_provider_remove
  provider = selected_provider
  dialog = AlertDialog.new(@main_app,
                           _("Are you sure you want to " \
                             "permanently delete the provider " \
                             "'%s'?") % provider.fullname,
                           Gtk::Stock::DIALOG_QUESTION,
                           [[Gtk::Stock::CANCEL,
                             Gtk::ResponseType::CANCEL],
                            [Gtk::Stock::DELETE,
                             Gtk::ResponseType::OK]],
                           _("If you continue, the provider and " \
                             "all of its preferences will be " \
                             "permanently deleted."))
  dialog.default_response = Gtk::ResponseType::CANCEL
  dialog.show_all
  if dialog.run == Gtk::ResponseType::OK
    provider.remove
    BookProviders.instance.update_priority
    reload_providers
  end
  dialog.destroy
end

#on_provider_setupObject



151
152
153
154
155
156
# File 'lib/alexandria/ui/preferences_dialog.rb', line 151

def on_provider_setup
  provider = selected_provider
  unless prefs_empty(provider.prefs)
    ProviderPreferencesDialog.new(@preferences_dialog, provider).acquire
  end
end

#on_provider_upObject



158
159
160
161
162
163
164
165
166
# File 'lib/alexandria/ui/preferences_dialog.rb', line 158

def on_provider_up
  iter = @treeview_providers.selection.selected
  previous_path = iter.path
  previous_path.prev!
  model = @treeview_providers.model
  model.move_after(model.get_iter(previous_path), iter)
  sensitize_providers
  update_priority
end

#on_providers_button_press_event(_widget, event) ⇒ Object



236
237
238
239
# File 'lib/alexandria/ui/preferences_dialog.rb', line 236

def on_providers_button_press_event(_widget, event)
  # double left click
  on_provider_setup if (event.event_type == :'2button_press') && (event.button == 1)
end

#on_scanner_device_type(_combo) ⇒ Object



191
192
193
194
# File 'lib/alexandria/ui/preferences_dialog.rb', line 191

def on_scanner_device_type(_combo)
  iter = @scanner_device_type.active_iter
  Preferences.instance.barcode_scanner = iter[1] if iter && iter[1]
end

#on_use_scan_sound(checkbox) ⇒ Object



200
201
202
# File 'lib/alexandria/ui/preferences_dialog.rb', line 200

def on_use_scan_sound(checkbox)
  Preferences.instance.play_scan_sound = checkbox.active?
end

#on_use_scanning_sound(checkbox) ⇒ Object



196
197
198
# File 'lib/alexandria/ui/preferences_dialog.rb', line 196

def on_use_scanning_sound(checkbox)
  Preferences.instance.play_scanning_sound = checkbox.active?
end

#prefs_empty(prefs) ⇒ Object



147
148
149
# File 'lib/alexandria/ui/preferences_dialog.rb', line 147

def prefs_empty(prefs)
  prefs.empty? || ((prefs.size == 1) && (prefs.first.name == "enabled"))
end

#setup_barcode_scanner_tabObject



122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/alexandria/ui/preferences_dialog.rb', line 122

def setup_barcode_scanner_tab
  @scanner_device_model = Gtk::ListStore.new(String, String)
  chosen_scanner_name = Preferences.instance.barcode_scanner
  index = 0
  @scanner_device_type.model = @scanner_device_model
  renderer = Gtk::CellRendererText.new
  @scanner_device_type.pack_start(renderer, true)
  @scanner_device_type.add_attribute(renderer, "text", 0)

  Alexandria::Scanners.each_scanner do |scanner|
    iter = @scanner_device_model.append
    iter[0] = scanner.display_name
    iter[1] = scanner.name
    @scanner_device_type.active = index if chosen_scanner_name == scanner.name
    index += 1
  end

  @use_scanning_sound.active = Preferences.instance.play_scanning_sound
  @use_scan_sound.active = Preferences.instance.play_scan_sound
end

#showObject



105
106
107
# File 'lib/alexandria/ui/preferences_dialog.rb', line 105

def show
  @preferences_dialog.show
end

#widget_namesObject



109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/alexandria/ui/preferences_dialog.rb', line 109

def widget_names
  [:button_prov_add, :button_prov_down, :button_prov_remove,
   :button_prov_setup, :button_prov_up, :buttonbox_prov,
   :checkbutton_col_authors, :checkbutton_col_edition,
   :checkbutton_col_isbn, :checkbutton_col_loaned_to,
   :checkbutton_col_own, :checkbutton_col_publish_date,
   :checkbutton_col_publisher, :checkbutton_col_rating,
   :checkbutton_col_redd, :checkbutton_col_tags,
   :checkbutton_col_want, :checkbutton_prov_advanced,
   :preferences_dialog, :treeview_providers,
   :scanner_device_type, :use_scanning_sound, :use_scan_sound]
end