Viewer: Allow skipping the confirmation when using the remove highlight button in the popup bar. Fixes #1897415 [[Feature Request] Delete text highlight without confirmation box](https://bugs.launchpad.net/calibre/+bug/1897415)

This commit is contained in:
Kovid Goyal 2020-10-01 15:02:53 +05:30
parent 5e524df4dc
commit bea311405a
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 38 additions and 4 deletions

View File

@ -11,6 +11,7 @@ from dom import add_extra_css, build_rule, clear, set_css, svgicon, unique_id
from popups import MODAL_Z_INDEX from popups import MODAL_Z_INDEX
from utils import safe_set_inner_html from utils import safe_set_inner_html
from widgets import create_button from widgets import create_button
from book_list.globals import get_session_data
modal_container = None modal_container = None
modal_count = 0 modal_count = 0
@ -236,7 +237,11 @@ def get_text_dialog(title, callback, initial_text=None, msg=None, rows=12):
) )
def question_dialog(title, msg, callback, yes_text=None, no_text=None): def question_dialog(
title, msg, callback, yes_text=None, no_text=None,
skip_dialog_name=None, skip_dialog_msg=None,
skip_dialog_skipped_value=True, skip_dialog_skip_precheck=True,
):
yes_text = yes_text or _('Yes') yes_text = yes_text or _('Yes')
no_text = no_text or _('No') no_text = no_text or _('No')
called = {} called = {}
@ -245,6 +250,12 @@ def question_dialog(title, msg, callback, yes_text=None, no_text=None):
if called.done: if called.done:
return return
called.done = True called.done = True
if skip_dialog_name:
if not skip_box.querySelector('input').checked:
sd = get_session_data()
skipped_dialogs = Object.assign(v'{}', sd.get('skipped_dialogs', v'{}'))
skipped_dialogs[skip_dialog_name] = Date().toISOString()
sd.set('skipped_dialogs', skipped_dialogs)
if close_modal: if close_modal:
close_modal() close_modal()
callback(yes) callback(yes)
@ -259,10 +270,24 @@ def question_dialog(title, msg, callback, yes_text=None, no_text=None):
event.preventDefault(), event.stopPropagation() event.preventDefault(), event.stopPropagation()
keyaction(True, close_modal) keyaction(True, close_modal)
skip_box = E.div(style='margin-top: 2ex;')
if skip_dialog_name:
sd = get_session_data()
skipped_dialogs = sd.get('skipped_dialogs', v'{}')
if skipped_dialogs[skip_dialog_name]:
return callback(skip_dialog_skipped_value)
skip_dialog_msg = skip_dialog_msg or _('Show this confirmation again')
skip_box.appendChild(E.label(E.input(type='checkbox', name='skip_dialog'), '\xa0', skip_dialog_msg))
if skip_dialog_skip_precheck:
skip_box.querySelector('input').checked = True
else:
skip_box.style.display = 'none'
create_custom_dialog( create_custom_dialog(
title, def(parent, close_modal): title, def(parent, close_modal):
parent.appendChild(E.div( parent.appendChild(E.div(
E.div(msg), E.div(msg),
skip_box,
E.div(class_='button-box', E.div(class_='button-box',
create_button(yes_text, 'check', keyaction.bind(None, True, close_modal), highlight=True), create_button(yes_text, 'check', keyaction.bind(None, True, close_modal), highlight=True),
'\xa0', '\xa0',

View File

@ -27,7 +27,7 @@ from read_book.prefs.font_size import create_font_size_panel
from read_book.prefs.main import create_prefs_panel from read_book.prefs.main import create_prefs_panel
from read_book.toc import create_toc_panel from read_book.toc import create_toc_panel
from read_book.word_actions import create_word_actions_panel from read_book.word_actions import create_word_actions_panel
from session import get_device_uuid from session import get_device_uuid, defaults as session_defaults
from utils import ( from utils import (
default_context_menu_should_be_allowed, full_screen_element, default_context_menu_should_be_allowed, full_screen_element,
full_screen_supported, is_ios, safe_set_inner_html full_screen_supported, is_ios, safe_set_inner_html
@ -360,7 +360,12 @@ class MainOverlay: # {{{
ac(_('Inspector'), _('Show the content inspector'), ac(_('Inspector'), _('Show the content inspector'),
def(): self.overlay.hide(), ui_operations.toggle_inspector();, 'bug'), def(): self.overlay.hide(), ui_operations.toggle_inspector();, 'bug'),
ac(_('Reset interface'), _('Reset viewer panels, toolbars and scrollbars to defaults'), ac(_('Reset interface'), _('Reset viewer panels, toolbars and scrollbars to defaults'),
def(): self.overlay.hide(), ui_operations.reset_interface();, 'window-restore'), def():
self.overlay.hide()
ui_operations.reset_interface()
sd = get_session_data()
sd.set('skipped_dialogs', session_defaults.skipped_dialogs)
, 'window-restore'),
ac(_('Quit'), _('Close the viewer'), ac(_('Quit'), _('Close the viewer'),
def(): self.overlay.hide(), ui_operations.quit();, 'remove'), def(): self.overlay.hide(), ui_operations.quit();, 'remove'),
)) ))

View File

@ -935,10 +935,12 @@ class SelectionBar:
def remove_highlight(self): def remove_highlight(self):
annot_id = self.view.currently_showing.selection.annot_id annot_id = self.view.currently_showing.selection.annot_id
if annot_id: if annot_id:
question_dialog(_('Are you sure?'), _('Are you sure you want to delete this highlight permanently?'), question_dialog(
_('Are you sure?'), _('Are you sure you want to delete this highlight permanently?'),
def (yes): def (yes):
if yes: if yes:
self.remove_highlight_with_id(annot_id) self.remove_highlight_with_id(annot_id)
, skip_dialog_name='confirm_remove_highlight'
) )
def remove_highlight_with_id(self, annot_id): def remove_highlight_with_id(self, annot_id):

View File

@ -68,9 +68,11 @@ defaults = {
'net_search_url': 'https://google.com/search?q={q}', 'net_search_url': 'https://google.com/search?q={q}',
'selection_bar_actions': v"['copy', 'lookup', 'highlight', 'remove_highlight', 'search_net', 'clear']", 'selection_bar_actions': v"['copy', 'lookup', 'highlight', 'remove_highlight', 'search_net', 'clear']",
'selection_bar_quick_highlights': v"[]", 'selection_bar_quick_highlights': v"[]",
'skipped_dialogs': v'{}',
} }
is_local_setting = { is_local_setting = {
'skipped_dialogs': True,
'background_image_fade': True, 'background_image_fade': True,
'background_image_style': True, 'background_image_style': True,
'background_image': True, 'background_image': True,