class Alexandria::UI::PreferencesDialog

Public Class Methods

new(parent, &changed_block) click to toggle source
Calls superclass method Alexandria::UI::BuilderBase::new
# 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

Public Instance Methods

event_is_right_click(event) click to toggle source
# 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_close() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 241
def on_close
  @preferences_dialog.destroy
  Alexandria::Preferences.instance.save!
end
on_column_toggled(checkbutton) click to toggle source
# 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_help() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 246
def on_help
  Alexandria::UI.display_help(@preferences_dialog,
                              "alexandria-preferences")
end
on_provider_add() click to toggle source
# 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) click to toggle source
# 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_down() click to toggle source
# 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_remove() click to toggle source
# 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_setup() click to toggle source
# 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_up() click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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_tab() click to toggle source
# 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
show() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 105
def show
  @preferences_dialog.show
end
widget_names() click to toggle source
# 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

Private Instance Methods

adjust_selected_provider(prov) click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 274
def adjust_selected_provider(prov)
  iter = @treeview_providers.selection.selected
  iter[0] = if prov.enabled
              prov.fullname
            else
              "<i>#{prov.fullname}</i>"
            end
  iter[2] = prov.enabled
end
reload_providers() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 253
def reload_providers
  model = @treeview_providers.model
  model.clear
  BookProviders.list.each_with_index do |x, index|
    iter = model.append
    iter[0] = if x.enabled
                x.fullname
              else
                "<i>#{x.fullname}</i>"
              end
    iter[1] = x.name
    iter[2] = x.enabled
    iter[3] = index
  end
end
selected_provider() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 269
def selected_provider
  iter = @treeview_providers.selection.selected
  BookProviders.list.find { |x| x.name == iter[1] } unless iter.nil?
end
sensitize_providers() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 284
def sensitize_providers
  model = @treeview_providers.model
  sel_iter = @treeview_providers.selection.selected
  if sel_iter.nil?
    # No selection, we are probably called by ListStore#clear
    @button_prov_up.sensitive = false
    @button_prov_down.sensitive = false
    @button_prov_setup.sensitive = false
    @button_prov_remove.sensitive = false
  else
    last_iter = model.get_iter((BookProviders.list.length - 1).to_s)
    @button_prov_up.sensitive = sel_iter != model.iter_first
    @button_prov_down.sensitive = sel_iter != last_iter
    provider = BookProviders.list.find { |x| x.name == sel_iter[1] }
    @button_prov_setup.sensitive = !prefs_empty(provider.prefs)
    @button_prov_remove.sensitive = provider.abstract?
  end
end
update_priority() click to toggle source
# File lib/alexandria/ui/preferences_dialog.rb, line 303
def update_priority
  priority = []
  @treeview_providers.model.each do |_model, _path, iter|
    priority << iter[1]
  end
  Preferences.instance.providers_priority = priority
  BookProviders.instance.update_priority
end