lib/alexandria/ui/ui_manager.rb in alexandria-book-collection-manager-0.6.9 vs lib/alexandria/ui/ui_manager.rb in alexandria-book-collection-manager-0.7.0

- old
+ new

@@ -1,8 +1,8 @@ # Copyright (C) 2004-2006 Laurent Sansonetti # Copyright (C) 2008 Joseph Method -# Copyright (C) 2011 Matijs van Zuijlen +# Copyright (C) 2011, 2016 Matijs van Zuijlen # # Alexandria is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as # published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. @@ -36,11 +36,11 @@ # The maximum number of rating stars displayed. MAX_RATING_STARS = 5 def initialize(parent) - super('main_app__builder.glade', widget_names) + super('main_app__builder.glade', widget_names) @parent = parent @library_separator_iter = nil @libraries = nil @move_mid = nil @@ -58,11 +58,10 @@ setup_active_model setup_dependents setup_accel_group setup_popups setup_window_events - setup_dialog_hooks setup_books_iconview_sorting on_books_selection_changed restore_preferences log.debug { "UI Manager initialized: #{@iconview.model.inspect}" } @clicking_on_sidepane = true @@ -87,12 +86,12 @@ @uimanager = Gtk::UIManager.new @uimanager.insert_action_group(@actiongroup, 0) end def setup_dependents - @listview_model = Gtk::TreeModelSort.new(@filtered_model) - @iconview_model = Gtk::TreeModelSort.new(@filtered_model) + @listview_model = Gtk::TreeModelSort.new(model: @filtered_model) + @iconview_model = Gtk::TreeModelSort.new(model: @filtered_model) @listview_manager = ListViewManager.new @listview, self @iconview_manager = IconViewManager.new @iconview, self @sidepane_manager = SidePaneManager.new @library_listview, self @library_listview = @sidepane_manager.library_listview @listview_manager.setup_listview_columns_visibility @@ -113,64 +112,60 @@ log.debug { 'setup_toolbar' } setup_book_providers add_main_toolbar_items @toolbar = @uimanager.get_widget('/MainToolbar') @toolbar.show_arrow = true - @toolbar.insert(-1, Gtk::SeparatorToolItem.new) + @toolbar.insert(Gtk::SeparatorToolItem.new, -1) setup_toolbar_combobox setup_toolbar_filter_entry - @toolbar.insert(-1, Gtk::SeparatorToolItem.new) + @toolbar.insert(Gtk::SeparatorToolItem.new, -1) setup_toolbar_viewas @toolbar.show_all @actiongroup['Undo'].sensitive = @actiongroup['Redo'].sensitive = false UndoManager.instance.add_observer(self) - @vbox1.add(@toolbar, position: 1, expand: false, fill: false) + @vbox1.add(@toolbar, position: 1, expand: false, fill: false) end def add_main_toolbar_items mid = @uimanager.new_merge_id @uimanager.add_ui(mid, 'ui/', 'MainToolbar', 'MainToolbar', - Gtk::UIManager::TOOLBAR, false) + :toolbar, false) @uimanager.add_ui(mid, 'ui/MainToolbar/', 'New', 'New', - Gtk::UIManager::TOOLITEM, false) + :toolitem, false) @uimanager.add_ui(mid, 'ui/MainToolbar/', 'AddBook', 'AddBook', - Gtk::UIManager::TOOLITEM, false) + :toolitem, false) # @uimanager.add_ui(mid, "ui/MainToolbar/", "sep", "sep", - # Gtk::UIManager::SEPARATOR, false) + # :separator, false) # @uimanager.add_ui(mid, "ui/MainToolbar/", "Refresh", "Refresh", - # Gtk::UIManager::TOOLITEM, false) + # :toolitem, false) end def setup_toolbar_filter_entry @filter_entry = Gtk::Entry.new @filter_entry.signal_connect('changed', &method(:on_toolbar_filter_entry_changed)) @toolitem = Gtk::ToolItem.new @toolitem.expand = true @toolitem.border_width = 5 - @tooltips.set_tip(@filter_entry, - _('Type here the search criterion'), nil) + @filter_entry.set_tooltip_text _('Type here the search criterion') @toolitem << @filter_entry - @toolbar.insert(-1, @toolitem) + @toolbar.insert(@toolitem, -1) end def setup_toolbar_combobox - @tooltips = Gtk::Tooltips.new - - cb = Gtk::ComboBox.new - cb.set_row_separator_func do |_model, iter| + cb = Gtk::ComboBoxText.new + cb.set_row_separator_func do |model, iter| # log.debug { "row_separator" } - iter[0] == '-' + model.get_value(iter, 0) == '-' end [_('Match everything'), '-', _('Title contains'), _('Authors contain'), _('ISBN contains'), _('Publisher contains'), _('Notes contain'), - _('Tags contain') - ].each do |item| + _('Tags contain')].each do |item| cb.append_text(item) end cb.active = 0 cb.signal_connect('changed', &method(:on_criterion_combobox_changed)) @@ -179,16 +174,16 @@ eb = Gtk::EventBox.new eb << cb @toolitem = Gtk::ToolItem.new @toolitem.border_width = 5 @toolitem << eb - @toolbar.insert(-1, @toolitem) - @tooltips.set_tip(eb, _('Change the search type'), nil) + @toolbar.insert(@toolitem, -1) + eb.set_tooltip_text _('Change the search type') end def setup_toolbar_viewas - @toolbar_view_as = Gtk::ComboBox.new + @toolbar_view_as = Gtk::ComboBoxText.new @toolbar_view_as.append_text(_('View as Icons')) @toolbar_view_as.append_text(_('View as List')) @toolbar_view_as.active = 0 @toolbar_view_as_signal_hid = \ @toolbar_view_as.signal_connect('changed', &method(:on_toolbar_view_as_changed)) @@ -198,12 +193,12 @@ eb = Gtk::EventBox.new eb << @toolbar_view_as @toolitem = Gtk::ToolItem.new @toolitem.border_width = 5 @toolitem << eb - @toolbar.insert(-1, @toolitem) - @tooltips.set_tip(eb, _('Choose how to show books'), nil) + @toolbar.insert(@toolitem, -1) + eb.set_tooltip_text _('Choose how to show books') end def setup_book_providers log.debug { 'setup_book_providers' } mid = @uimanager.new_merge_id @@ -212,11 +207,11 @@ ['ui/MainMenubar/ViewMenu/OnlineInformation/', 'ui/BookPopup/OnlineInformation/', 'ui/NoBookPopup/OnlineInformation/'].each do |path| log.debug { "Adding #{name} to #{path}" } @uimanager.add_ui(mid, path, name, name, - Gtk::UIManager::MENUITEM, false) + :menuitem, false) end end end def add_menus_and_popups_from_xml @@ -232,25 +227,13 @@ @main_app.add_accel_group(@uimanager.accel_group) end def setup_menus @menubar = @uimanager.get_widget('/MainMenubar') - @vbox1.add(@menubar, position: 0, expand: false, fill: false) + @vbox1.add(@menubar, position: 0, expand: false, fill: false) end - def setup_dialog_hooks - log.debug { 'setup_dialog_hooks' } - Gtk::AboutDialog.set_url_hook do |_about, link| - log.debug { 'set_url_hook' } - open_web_browser(link) - end - Gtk::AboutDialog.set_email_hook do |_about, link| - log.debug { 'set_email_hook' } - open_email_client('mailto:' + link) - end - end - def setup_popups log.debug { 'setup_popups' } @library_popup = @uimanager.get_widget('/LibraryPopup') @smart_library_popup = @uimanager.get_widget('/SmartLibraryPopup') @nolibrary_popup = @uimanager.get_widget('/NoLibraryPopup') @@ -267,12 +250,12 @@ def setup_active_model log.debug { 'setting up active model' } # The active model. list = [ - Gdk::Pixbuf, # COVER_LIST - Gdk::Pixbuf, # COVER_ICON + GdkPixbuf::Pixbuf, # COVER_LIST + GdkPixbuf::Pixbuf, # COVER_ICON String, # TITLE String, # TITLE_REDUCED String, # AUTHORS String, # ISBN String, # PUBLISHER @@ -299,24 +282,24 @@ if filter.empty? true else data = case @filter_books_mode when 0 then - (iter[Columns::TITLE] or '') + - (iter[Columns::AUTHORS] or '') + - (iter[Columns::ISBN] or '') + - (iter[Columns::PUBLISHER] or '') + - (iter[Columns::NOTES] or '') + - (iter[Columns::TAGS] or '') + (iter[Columns::TITLE] || '') + + (iter[Columns::AUTHORS] || '') + + (iter[Columns::ISBN] || '') + + (iter[Columns::PUBLISHER] || '') + + (iter[Columns::NOTES] || '') + + (iter[Columns::TAGS] || '') when 2 then iter[Columns::TITLE] when 3 then iter[Columns::AUTHORS] when 4 then iter[Columns::ISBN] when 5 then iter[Columns::PUBLISHER] when 6 then iter[Columns::NOTES] when 7 then iter[Columns::TAGS] end - !data.nil? and data.downcase.include?(filter.downcase) + !data.nil? && data.downcase.include?(filter.downcase) end end # Give filter entry the initial keyboard focus. @filter_entry.grab_focus @@ -342,11 +325,11 @@ widget.unselect_all obj.select_path(path) sensitize_library selected_library if widget.is_a?(Gtk::TreeView) - Gtk.idle_add do + GLib::Idle.add do # cur_path, focus_col = widget.cursor widget.focus = true widget.set_cursor(path, nil, false) @@ -375,17 +358,17 @@ # Then we wait a while and only *then* pop up the menu. if library_already_selected sensitize_library selected_library - Gtk.idle_add do + GLib::Idle.add do menu.popup(nil, nil, event.button, event.time) # @clicking_on_sidepane = false false end else - Gtk.idle_add do + GLib::Idle.add do menu.popup(nil, nil, event.button, event.time) # @clicking_on_sidepane = false false end @@ -408,11 +391,11 @@ # widget.grab_focus widget.get_path_at_pos(event.x, event.y).nil? ? @nolibrary_popup : selected_library.is_a?(SmartLibrary) ? @smart_library_popup : @library_popup end def event_is_right_click(event) - event.event_type == Gdk::Event::BUTTON_PRESS and event.button == 3 + (event.event_type == :button_press) && (event.button == 3) end def on_books_button_press_event(widget, event) log.debug { 'books_button_press_event' } if event_is_right_click event @@ -428,11 +411,11 @@ end else widget.unselect_all end - menu = (selected_books.empty?) ? @nobook_popup : @book_popup + menu = selected_books.empty? ? @nobook_popup : @book_popup menu.popup(nil, nil, event.button, event.time) end end def get_library_selection_text(library) @@ -445,11 +428,11 @@ if n_unrated == library.length n_("Library '%s' selected, %d unrated book", "Library '%s' selected, %d unrated books", library.length) % [library.name, library.length] - elsif n_unrated == 0 + elsif n_unrated.zero? n_("Library '%s' selected, %d book", "Library '%s' selected, %d books", library.length) % [library.name, library.length] else @@ -485,11 +468,11 @@ books = selected_books set_status_label(get_appbar_status(library, books)) # selection = @library_listview.selection.selected ? @library_listview.selection.selected.has_focus? : false # Focus is the wrong idiom here. - unless @clicking_on_sidepane or (@main_app.focus == @library_listview) + unless @clicking_on_sidepane || (@main_app.focus == @library_listview) # unless @main_app.focus == @library_listview log.debug { "Currently focused widget: #{@main_app.focus.inspect}" } log.debug { "#{@library_listview} : #{@library_popup} : #{@listview}" } log.debug { "@library_listview: #{@library_listview.has_focus?} or @library_popup:#{@library_popup.has_focus?}" } # or selection: #{selection}"} @@ -519,11 +502,11 @@ # FIXME: Clean up endless negation in this logic no_urls = true BookProviders.each do |provider| has_no_url = true begin - has_no_url = (b.isbn.nil? or b.isbn.strip.empty? or provider.url(b).nil?) + has_no_url = (b.isbn.nil? || b.isbn.strip.empty? || provider.url(b).nil?) rescue => ex log.warn { "Error determining URL from #{provider.name}; #{ex.message}" } end @actiongroup[provider.action_name].sensitive = !has_no_url no_urls = false unless has_no_url @@ -534,20 +517,20 @@ end end @clicking_on_sidepane = false end - def on_switch_page + def on_switch_page(_notebook, _page, page_num) log.debug { 'on_switch_page' } - @actiongroup['ArrangeIcons'].sensitive = @notebook.page == 0 + @actiongroup['ArrangeIcons'].sensitive = page_num.zero? on_books_selection_changed end def on_focus(widget, _event_focus) - if @clicking_on_sidepane or widget == @library_listview + if @clicking_on_sidepane || (widget == @library_listview) log.debug { 'on_focus: @library_listview' } - Gtk.idle_add do + GLib::Idle.add do %w(OnlineInformation SelectAll DeselectAll).each do |action| @actiongroup[action].sensitive = false end @actiongroup['Properties'].sensitive = selected_library.is_a?(SmartLibrary) @actiongroup['Delete'].sensitive = determine_delete_option @@ -557,11 +540,11 @@ on_books_selection_changed end end def determine_delete_option - sensitive = (@libraries.all_regular_libraries.length > 1 or selected_library.is_a?(SmartLibrary)) + sensitive = (@libraries.all_regular_libraries.length > 1 || selected_library.is_a?(SmartLibrary)) sensitive end def on_close_sidepane log.debug { 'on_close_sidepane' } @@ -570,19 +553,14 @@ def select_a_book(book) select_this_book = proc do |bk, view| @filtered_model.refilter iter = iter_from_book bk - unless iter - next - end + next unless iter path = iter.path - unless view.model - next - end - path = view.model.convert_path_to_child_path(path) - path = @filtered_model.convert_path_to_child_path(path) + next unless view.model + path = view_path_to_model_path(view, path) log.debug { "Path for #{bk.ident} is #{path}" } selection = view.respond_to?(:selection) ? @listview.selection : @iconview selection.unselect_all selection.select_path(path) end @@ -604,13 +582,11 @@ if caller.is_a?(UndoManager) @actiongroup['Undo'].sensitive = caller.can_undo? @actiongroup['Redo'].sensitive = caller.can_redo? elsif caller.is_a?(Library) unless caller.updating? - Gtk.queue do - handle_update_caller_library ary - end + handle_update_caller_library ary end else raise 'unrecognized update event' end end @@ -623,13 +599,11 @@ case kind when Library::BOOK_ADDED append_book(book) when Library::BOOK_UPDATED iter = iter_from_ident(book.saved_ident) - if iter - fill_iter_with_book(iter, book) - end + fill_iter_with_book(iter, book) if iter when Library::BOOK_REMOVED @model.remove(iter_from_book(book)) end @iconview.unfreeze @listview.unfreeze # NEW @@ -644,47 +618,13 @@ def open_web_browser(url) if url.nil? log.warn('Attempt to open browser with nil url') return end - if (cmd = Preferences.instance.www_browser) - launch_command = cmd - if cmd.downcase.index('%u') - launch_command = cmd.gsub(/%U/i, "\"" + url + "\"") - else - launch_command = cmd + " \"" + url + "\"" - end - Thread.new { system(launch_command) } - else - ErrorDialog.new(@main_app, - _('Unable to launch the web browser'), - _('Check out that a web browser is ' \ - 'configured as default (Desktop ' \ - 'Preferences -> Advanced -> Preferred ' \ - 'Applications) and try again.')) - end + Gtk.show_uri url end - def open_email_client(url) - if (cmd = Preferences.instance.email_client) - launch_command = cmd - if cmd.downcase.index('%u') - launch_command = cmd.gsub(/%u/i, "\"" + url + "\"") - else - launch_command = cmd + " \"" + url + "\"" - end - Thread.new { system(launch_command) } - else - ErrorDialog.new(@main_app, - _('Unable to launch the mail reader'), - _('Check out that a mail reader is ' \ - 'configured as default (Desktop ' \ - 'Preferences -> Advanced -> Preferred ' \ - 'Applications) and try again.')) - end - end - def detach_old_libraries log.debug { 'Un-observing old libraries' } @libraries.all_regular_libraries.each do |library| if library.is_a?(Library) library.delete_observer(self) @@ -717,38 +657,38 @@ # standard. We will attempt to replace them from the book # providers. Otherwise, we will turn them into manual # entries.\n" ) @libraries.ruined_books.each { |bi| - new_message += "\n#{bi[1] or bi[1].inspect}" + new_message += "\n#{bi[1] || bi[1].inspect}" } recovery_dialog = Gtk::MessageDialog.new(@main_app, Gtk::Dialog::MODAL, Gtk::MessageDialog::WARNING, Gtk::MessageDialog::BUTTONS_OK_CANCEL, new_message).show recovery_dialog.signal_connect('response') do |_dialog, response_type| recovery_dialog.destroy - if response_type == Gtk::Dialog::RESPONSE_OK + if response_type == :ok # progress indicator... @progressbar.fraction = 0 - @appbar.children.first.visible = true # show the progress bar + @appbar.children.first.visible = true # show the progress bar total_book_count = @libraries.ruined_books.size fraction_per_book = 1.0 / total_book_count prog_percentage = 0 @libraries.ruined_books.reverse! - Gtk.idle_add do + GLib::Idle.add do ruined_book = @libraries.ruined_books.pop if ruined_book book, isbn, library = ruined_book begin book_rslt = Alexandria::BookProviders.isbn_search(isbn.to_s) book = book_rslt[0] cover_uri = book_rslt[1] - # TODO if the book was saved okay, make sure the old + # TODO: if the book was saved okay, make sure the old # empty yaml file doesn't stick around esp if doing # isbn-10 --> isbn-13 conversion... if isbn.size == 10 filename = library.yaml(isbn) log.debug { "removing old file #{filename}" } @@ -816,22 +756,22 @@ iter[Columns::AUTHORS] = book.authors.join(', ') iter[Columns::ISBN] = book.isbn.to_s iter[Columns::PUBLISHER] = book.publisher iter[Columns::PUBLISH_DATE] = book.publishing_year.to_s iter[Columns::EDITION] = book.edition - iter[Columns::NOTES] = (book.notes or '') - iter[Columns::LOANED_TO] = (book.loaned_to or '') - rating = (book.rating or Book::DEFAULT_RATING) + iter[Columns::NOTES] = (book.notes || '') + iter[Columns::LOANED_TO] = (book.loaned_to || '') + rating = (book.rating || Book::DEFAULT_RATING) iter[Columns::RATING] = MAX_RATING_STARS - rating # ascending order is the default iter[Columns::OWN] = book.own? iter[Columns::REDD] = book.redd? iter[Columns::WANT] = book.want? - if book.tags - iter[Columns::TAGS] = book.tags.join(',') - else - iter[Columns::TAGS] = '' - end + iter[Columns::TAGS] = if book.tags + book.tags.join(',') + else + '' + end icon = Icons.cover(selected_library, book) log.debug { "Setting icon #{icon} for book #{book.title}" } iter[Columns::COVER_LIST] = cache_scaled_icon(icon, 20, 25) @@ -914,49 +854,42 @@ library = selected_library @model.clear @iconview.freeze @listview.freeze # NEW / bdewey @progressbar.fraction = 0 - @appbar.children.first.visible = true # show the progress bar + @appbar.children.first.visible = true # show the progress bar set_status_label(_("Loading '%s'...") % library.name) total = library.length log.debug { "library #{library.name} length #{library.length}" } n = 0 - Gtk.idle_add do + GLib::Idle.add do block_return = true book = library[n] if book - Gtk.queue do - begin - append_book(book) - rescue => ex - trace = ex.backtrace.join("\n > ") - log.error { "append_books failed #{ex.message} #{trace}" } - end - # convert to percents - coeff = total / 100.0 - percent = n / coeff - fraction = percent / 100 - log.debug { "#index #{n} percent #{percent} fraction #{fraction}" } - @progressbar.fraction = fraction - n += 1 + begin + append_book(book) + rescue => ex + trace = ex.backtrace.join("\n > ") + log.error { "append_books failed #{ex.message} #{trace}" } end + fraction = n * 1.0 / total + log.debug { "#index #{n} fraction #{fraction}" } + @progressbar.fraction = fraction + n += 1 else - Gtk.queue do - @iconview.unfreeze - @listview.unfreeze # NEW / bdewey - @filtered_model.refilter - @listview.columns_autosize - @progressbar.fraction = 1 - # Hide the progress bar. - @appbar.children.first.visible = false - # Refresh the status bar. - on_books_selection_changed - @library_listview.set_sensitive(true) - block_return = false - end + @iconview.unfreeze + @listview.unfreeze # NEW / bdewey + @filtered_model.refilter + @listview.columns_autosize + @progressbar.fraction = 1 + # Hide the progress bar. + @appbar.children.first.visible = false + # Refresh the status bar. + on_books_selection_changed + @library_listview.set_sensitive(true) + block_return = false end block_return end end @@ -987,61 +920,48 @@ log.debug { "Book from iter: #{library} #{iter}" } library.find { |x| x.ident == iter[Columns::IDENT] } end def iter_from_ident(ident) - log.debug { "#{ident}" } + log.debug { ident.to_s } iter = @model.iter_first ok = true while ok - if iter[Columns::IDENT] == ident - return iter - end + return iter if iter[Columns::IDENT] == ident ok = iter.next! end nil end def iter_from_book(book) - log.debug { "#{book}" } + log.debug { book.to_s } iter_from_ident(book.ident) end def collate_selected_books(page) - a = [] + result = [] library = selected_library - view = page == 0 ? @iconview : @listview - selection = page == 0 ? @iconview : @listview.selection - selection.selected_each do |_the_view, path| - # don't use the_view which is passed in by this block - # as it doesn't consider the filtering for some reason - # see bug #24568 - unless view.model - next + if page.zero? + result = @iconview.selected_items.map do |path| + path = view_path_to_model_path(@iconview, path) + book_from_iter(library, @model.get_iter(path)) end - path = view.model.convert_path_to_child_path(path) - if path - path = @filtered_model.convert_path_to_child_path(path) - # FIX this sometimes returns a nil path for iconview... - if path - iter = @model.get_iter(path) - if iter - a << book_from_iter(library, iter) - end - end - # This used to cause a crash when manually adding the first - # book to a Library displayed in an Iconview - # TODO find root cause of this + else + selection = @listview.selection + rows, _model = selection.selected_rows + result = rows.map do |path| + path = view_path_to_model_path(@listview, path) + book_from_iter(library, @model.get_iter(path)) end end - a + + result end def selected_books - a = collate_selected_books(@notebook.page) - selected = a.select { |x| !x.nil? } + selected = collate_selected_books(@notebook.page).compact log.debug { "Selected books = #{selected.inspect}" } selected end def refresh_libraries @@ -1052,21 +972,19 @@ @main_app.title = library.name + ' - ' + TITLE # Disable the selected library in the move libraries actions. @libraries.all_regular_libraries.each do |i_library| action = @actiongroup[i_library.action_name] - if action - action.sensitive = i_library != library - end + action.sensitive = i_library != library if action end sensitize_library library end def sensitize_library(library) smart = library.is_a?(SmartLibrary) log.debug { "sensitize_library: smartlibrary = #{smart}" } - Gtk.idle_add do + GLib::Idle.add do @actiongroup['AddBook'].sensitive = !smart @actiongroup['AddBookManual'].sensitive = !smart @actiongroup['Properties'].sensitive = smart can_delete = smart || (@libraries.all_regular_libraries.length > 1) @actiongroup['Delete'].sensitive = can_delete ## true #(@libraries.all_regular_libraries.length > 1) @@ -1130,11 +1048,11 @@ @prefs.statusbar_visible = @actiongroup['Statusbar'].active? @prefs.view_as = @notebook.page @prefs.selected_library = selected_library.name cols_width = {} @listview.columns.each do |c| - cols_width[c.title] = [c.widget.size_request.first, c.width].max + cols_width[c.title] = c.width end @prefs.cols_width = '{' + cols_width.to_a.map do |t, v| '"' + t + '": ' + v.to_s end.join(', ') + '}' log.debug { "cols_width: #{@prefs.cols_width} " } @@ -1147,21 +1065,21 @@ UndoManager.instance.push { undoable_move(dest, source, books) } end def move_selected_books_to_library(library) books = selected_books.select do |book| - !library.include?(book) or + !library.include?(book) || ConflictWhileCopyingDialog.new(@main_app, library, book).replace? end undoable_move(selected_library, library, books) end def setup_move_actions @actiongroup.actions.each do |action| - next unless /^MoveIn/.match(action.name) + next unless /^MoveIn/ =~ action.name @actiongroup.remove_action(action) end actions = [] @libraries.all_regular_libraries.each do |library| actions << [ @@ -1176,11 +1094,11 @@ @libraries.all_regular_libraries.each do |library| name = library.action_name ['ui/MainMenubar/EditMenu/Move/', 'ui/BookPopup/Move/'].each do |path| @uimanager.add_ui(@move_mid, path, name, name, - Gtk::UIManager::MENUITEM, false) + :menuitem, false) end end end def current_view @@ -1194,15 +1112,12 @@ # Gets the sort order of the current library, for use by export def library_sort_order # added by Cathal Mc Ginley, 23 Oct 2007 log.debug { "library_sort_order #{@notebook.page}: #{@iconview.model.inspect} #{@listview.model.inspect}" } - sorted_on = current_view.model.sort_column_id - if sorted_on - sort_column = sorted_on[0] - sort_order = sorted_on[1] - + result, sort_column, sort_order = current_view.model.sort_column_id + if result column_ids_to_attributes = { 2 => :title, 4 => :authors, 5 => :isbn, 6 => :publisher, 7 => :publishing_year, @@ -1210,12 +1125,12 @@ 12 => :redd, 13 => :own, 14 => :want, 9 => :rating } - sort_attribute = column_ids_to_attributes[sort_column] - ascending = (sort_order == Gtk::SORT_ASCENDING) + sort_attribute = column_ids_to_attributes.fetch sort_column + ascending = (sort_order == :ascending) LibrarySortOrder.new(sort_attribute, ascending) else LibrarySortOrder::Unsorted.new end end @@ -1258,11 +1173,11 @@ end UndoManager.instance.push { undoable_undelete(library, books) } end def remove_library_separator - if !@library_separator_iter.nil? and @libraries.all_smart_libraries.empty? + if !@library_separator_iter.nil? && @libraries.all_smart_libraries.empty? @library_listview.model.remove(@library_separator_iter) @library_separator_iter = nil end end @@ -1289,16 +1204,23 @@ end ICONS_SORTS = [ Columns::TITLE, Columns::AUTHORS, Columns::ISBN, Columns::PUBLISHER, Columns::EDITION, Columns::RATING, Columns::REDD, Columns::OWN, Columns::WANT - ] + ].freeze def setup_books_iconview_sorting - sort_order = @prefs.reverse_icons ? Gtk::SORT_DESCENDING : Gtk::SORT_ASCENDING + sort_order = @prefs.reverse_icons ? :descending : :ascending mode = ICONS_SORTS[@prefs.arrange_icons_mode] @iconview_model.set_sort_column_id(mode, sort_order) @filtered_model.refilter # force redraw + end + + private + + def view_path_to_model_path(view, path) + path = view.model.convert_path_to_child_path(path) + @filtered_model.convert_path_to_child_path(path) if path end end end end