Reorganize View menu, add checkmarks, introduce Go menu

Fixes #2037
Fixes #1997
This commit is contained in:
Martynas Bagdonas 2021-05-21 15:44:56 +03:00
parent 39b56a66dc
commit eb085f2bbe
7 changed files with 267 additions and 50 deletions

View file

@ -39,6 +39,11 @@
oncommand="document.getElementById('zotero-tb-search').select()"/>
</commandset>
<keyset id="mainKeyset">
<key id="key_back"/>
<key id="key_forward"/>
</keyset>
<!-- TODO: Localize -->
<tooltip id="iframeTooltip" onpopupshowing="if (tooltipTitleNode = document.tooltipNode.closest('*[title]')) {this.setAttribute('label', tooltipTitleNode.getAttribute('title')); return true; } return false"/>
<menubar>
@ -65,7 +70,7 @@
<menuitem id="menu_delete"/>
</menupopup>
</menu>
<menu label="View">
<menu label="View" onpopupshowing="onViewMenuOpen()">
<menupopup>
<!--
To make presentation mode work it's necessary to set
@ -75,29 +80,88 @@
-->
<!-- <menuitem label="Switch to Presentation Mode" oncommand="menuCmd('presentationmode')"/>-->
<!-- <menuseparator/>-->
<menuitem label="&zotero.pdfReader.goToFirstPage;" oncommand="menuCmd('firstpage')"/>
<menuitem label="&zotero.pdfReader.goToLastPage;" oncommand="menuCmd('lastpage')"/>
<menuitem
label="&zotero.pdfReader.rotateClockwise;"
oncommand="menuCmd('rotatecw')"
/>
<menuitem
label="&zotero.pdfReader.rotateCounterclockwise;"
oncommand="menuCmd('rotateccw')"
/>
<menuseparator/>
<menuitem label="&zotero.pdfReader.rotateClockwise;" oncommand="menuCmd('rotatecw')"/>
<menuitem label="&zotero.pdfReader.rotateCounterclockwise;" oncommand="menuCmd('rotateccw')"/>
<menuitem
id="view-menuitem-hand-tool"
label="&zotero.pdfReader.handTool;"
oncommand="menuCmd('switchcursortool_hand')"
/>
<menuseparator/>
<menuitem label="&zotero.pdfReader.textSelectionTool;" oncommand="menuCmd('switchcursortool_select')"/>
<menuitem label="&zotero.pdfReader.handTool;" oncommand="menuCmd('switchcursortool_hand')"/>
<menuitem
id="view-menuitem-vertical-scrolling"
label="&zotero.pdfReader.verticalScrolling;"
oncommand="menuCmd('switchscrollmode_vertical')"
/>
<menuitem
id="view-menuitem-horizontal-scrolling"
label="&zotero.pdfReader.horizontalScrolling;"
oncommand="menuCmd('switchscrollmode_horizontal')"
/>
<menuitem
id="view-menuitem-wrapped-scrolling"
label="&zotero.pdfReader.wrappedScrolling;"
oncommand="menuCmd('switchscrollmode_wrapped')"
/>
<menuseparator/>
<menuitem label="&zotero.pdfReader.verticalScrolling;" oncommand="menuCmd('switchscrollmode_vertical')"/>
<menuitem label="&zotero.pdfReader.horizontalScrolling;" oncommand="menuCmd('switchscrollmode_horizontal')"/>
<menuitem label="&zotero.pdfReader.wrappedScrolling;" oncommand="menuCmd('switchscrollmode_wrapped')"/>
<menuseparator/>
<menuitem label="&zotero.pdfReader.noSpreads;" oncommand="menuCmd('switchspreadmode_none')"/>
<menuitem label="&zotero.pdfReader.oddSpreads;" oncommand="menuCmd('switchspreadmode_odd')"/>
<menuitem label="&zotero.pdfReader.evenSpreads;" oncommand="menuCmd('switchspreadmode_even')"/>
<menuitem
id="view-menuitem-no-spreads"
label="&zotero.pdfReader.noSpreads;"
oncommand="menuCmd('switchspreadmode_none')"
/>
<menuitem
id="view-menuitem-odd-spreads"
label="&zotero.pdfReader.oddSpreads;"
oncommand="menuCmd('switchspreadmode_odd')"
/>
<menuitem
id="view-menuitem-even-spreads"
label="&zotero.pdfReader.evenSpreads;"
oncommand="menuCmd('switchspreadmode_even')"
/>
</menupopup>
</menu>
<menu
id="go-menu"
class="menu-type-reader"
label="&goMenu.label;"
onpopupshowing="onGoMenuOpen()"
>
<menupopup id="menu_goPopup">
<menuitem
id="go-menuitem-first-page"
class="menu-type-reader"
label="&zotero.pdfReader.firstPage;"
oncommand="menuCmd('firstpage')"
/>
<menuitem
id="go-menuitem-last-page"
class="menu-type-reader"
label="&zotero.pdfReader.lastPage;"
oncommand="menuCmd('lastpage')"
/>
<menuseparator class="menu-type-reader"/>
<menuitem
id="go-menuitem-back"
class="menu-type-reader"
label="&zotero.pdfReader.back;"
oncommand="menuCmd('back')"
/>
<menuitem
id="go-menuitem-forward"
class="menu-type-reader"
label="&zotero.pdfReader.forward;"
oncommand="menuCmd('forward')"
/>
</menupopup>
</menu>
<!-- <menu label="Tools">-->
<!-- <menupopup>-->
<!-- <menuitem label="Remove password (not implemented)" oncommand="menuCmd('remove_password')"/>-->
<!-- </menupopup>-->
<!-- </menu>-->
<menu id="windowMenu"
label="&windowMenu.label;"
onpopupshowing="macWindowMenuDidShow();"

View file

@ -310,7 +310,54 @@ const ZoteroStandalone = new function() {
};
this.onGoMenuOpen = function () {
var keyBack = document.getElementById('key_back');
var keyForward = document.getElementById('key_forward');
if (Zotero.isMac) {
keyBack.setAttribute('key', '[');
keyBack.setAttribute('modifiers', 'meta');
keyForward.setAttribute('key', ']');
keyForward.setAttribute('modifiers', 'meta');
}
else {
keyBack.setAttribute('keycode', 'VK_LEFT');
keyBack.setAttribute('modifiers', 'alt');
keyForward.setAttribute('keycode', 'VK_RIGHT');
keyForward.setAttribute('modifiers', 'alt');
}
// `key` attribute needs to be dynamically set for `menuitem` when
// the key changes after DOM initialization
var menuItemBack = document.getElementById('go-menuitem-back');
var menuItemForward = document.getElementById('go-menuitem-forward');
menuItemBack.setAttribute('key', 'key_back');
menuItemForward.setAttribute('key', 'key_forward');
var reader = Zotero.Reader.getByTabID(Zotero_Tabs.selectedID);
if (reader) {
this.updateMenuItemEnabled('go-menuitem-first-page', reader.allowNavigateFirstPage());
this.updateMenuItemEnabled('go-menuitem-last-page', reader.allowNavigateLastPage());
this.updateMenuItemEnabled('go-menuitem-back', reader.allowNavigateBack());
this.updateMenuItemEnabled('go-menuitem-forward', reader.allowNavigateForward());
}
};
this.onViewMenuOpen = function () {
// PDF Reader
var reader = Zotero.Reader.getByTabID(Zotero_Tabs.selectedID);
if (reader) {
var { state } = reader;
this.updateMenuItemCheckmark('view-menuitem-vertical-scrolling', state.scrollMode == 0);
this.updateMenuItemCheckmark('view-menuitem-horizontal-scrolling', state.scrollMode == 1);
this.updateMenuItemCheckmark('view-menuitem-wrapped-scrolling', state.scrollMode == 2);
this.updateMenuItemCheckmark('view-menuitem-no-spreads', state.spreadMode == 0);
this.updateMenuItemCheckmark('view-menuitem-odd-spreads', state.spreadMode == 1);
this.updateMenuItemCheckmark('view-menuitem-even-spreads', state.spreadMode == 2);
this.updateMenuItemCheckmark('view-menuitem-hand-tool', reader.isHandToolActive());
}
// Layout mode
var mode = Zotero.Prefs.get('layout');
this.updateMenuItemCheckmark('view-menuitem-standard', mode != 'stacked');

View file

@ -81,6 +81,8 @@
<key id="key_copyBibliography"
command="cmd_zotero_copyBibliography"
modifiers="accel shift"/>
<key id="key_back"/>
<key id="key_forward"/>
</keyset>
<keyset id="editMenuKeys"/>
@ -216,28 +218,11 @@
hidden="true"/>
</menupopup>
</menu>
<menu id="view-menu"
label="&viewMenu.label;"
onpopupshowing="ZoteroStandalone.onViewMenuOpen()">
<menupopup id="menu_viewPopup">
<!-- <menuitem-->
<!-- class="menu-type-reader"-->
<!-- label="Switch to Presentation Mode"-->
<!-- oncommand="ZoteroStandalone.onReaderCmd('presentationmode')"-->
<!-- />-->
<menuseparator class="menu-type-reader"/>
<menuitem
class="menu-type-reader"
label="&zotero.pdfReader.goToFirstPage;"
oncommand="ZoteroStandalone.onReaderCmd('firstpage')"
/>
<menuitem
class="menu-type-reader"
label="&zotero.pdfReader.goToLastPage;"
oncommand="ZoteroStandalone.onReaderCmd('lastpage')"
/>
<menuseparator class="menu-type-reader"/>
<menuitem
class="menu-type-reader"
label="&zotero.pdfReader.rotateClockwise;"
@ -250,43 +235,45 @@
/>
<menuseparator class="menu-type-reader"/>
<menuitem
class="menu-type-reader"
label="&zotero.pdfReader.textSelectionTool;"
oncommand="ZoteroStandalone.onReaderCmd('switchcursortool_select')"
/>
<menuitem
id="view-menuitem-hand-tool"
class="menu-type-reader"
label="&zotero.pdfReader.handTool;"
oncommand="ZoteroStandalone.onReaderCmd('switchcursortool_hand')"
/>
<menuseparator class="menu-type-reader"/>
<menuitem
id="view-menuitem-vertical-scrolling"
class="menu-type-reader"
label="&zotero.pdfReader.verticalScrolling;"
oncommand="ZoteroStandalone.onReaderCmd('switchscrollmode_vertical')"
/>
<menuitem
id="view-menuitem-horizontal-scrolling"
class="menu-type-reader"
label="&zotero.pdfReader.horizontalScrolling;"
oncommand="ZoteroStandalone.onReaderCmd('switchscrollmode_horizontal')"
/>
<menuitem
<menuitem
id="view-menuitem-wrapped-scrolling"
class="menu-type-reader"
label="&zotero.pdfReader.wrappedScrolling;"
oncommand="ZoteroStandalone.onReaderCmd('switchscrollmode_wrapped')"
/>
<menuseparator class="menu-type-reader"/>
<menuitem
id="view-menuitem-no-spreads"
class="menu-type-reader"
label="&zotero.pdfReader.noSpreads;"
oncommand="ZoteroStandalone.onReaderCmd('switchspreadmode_none')"
/>
<menuitem
id="view-menuitem-odd-spreads"
class="menu-type-reader"
label="&zotero.pdfReader.oddSpreads;"
oncommand="ZoteroStandalone.onReaderCmd('switchspreadmode_odd')"
/>
<menuitem
id="view-menuitem-even-spreads"
class="menu-type-reader"
label="&zotero.pdfReader.evenSpreads;"
oncommand="ZoteroStandalone.onReaderCmd('switchspreadmode_even')"
@ -369,6 +356,41 @@
</menupopup>
</menu>
<menu
id="go-menu"
class="menu-type-reader"
label="&goMenu.label;"
onpopupshowing="ZoteroStandalone.onGoMenuOpen()"
>
<menupopup id="menu_goPopup">
<menuitem
id="go-menuitem-first-page"
class="menu-type-reader"
label="&zotero.pdfReader.firstPage;"
oncommand="ZoteroStandalone.onReaderCmd('firstpage')"
/>
<menuitem
id="go-menuitem-last-page"
class="menu-type-reader"
label="&zotero.pdfReader.lastPage;"
oncommand="ZoteroStandalone.onReaderCmd('lastpage')"
/>
<menuseparator class="menu-type-reader"/>
<menuitem
id="go-menuitem-back"
class="menu-type-reader"
label="&zotero.pdfReader.back;"
oncommand="ZoteroStandalone.onReaderCmd('back')"
/>
<menuitem
id="go-menuitem-forward"
class="menu-type-reader"
label="&zotero.pdfReader.forward;"
oncommand="ZoteroStandalone.onReaderCmd('forward')"
/>
</menupopup>
</menu>
<menu id="toolsMenu" label="&toolsMenu.label;" accesskey="&toolsMenu.accesskey;">
<menupopup id="menu_ToolsPopup">
<menuitem id="menu_createTimeline" class="menu-type-library" label="&zotero.toolbar.timeline.label;"

View file

@ -28,6 +28,7 @@ class ReaderInstance {
this.pdfStateFileName = '.zotero-pdf-state';
this.annotationItemIDs = [];
this.onChangeSidebarWidth = null;
this.state = null;
this._instanceID = Zotero.Utilities.randomString();
this._window = null;
this._iframeWindow = null;
@ -53,6 +54,7 @@ class ReaderInstance {
if (!item) {
return false;
}
this.state = state;
this._itemID = item.id;
this.updateTitle();
let path = await item.getFilePathAsync();
@ -140,6 +142,43 @@ class ReaderInstance {
this._postMessage({ action: 'setToolbarPlaceholderWidth', width });
}
isHandToolActive() {
return this._iframeWindow.eval('PDFViewerApplication.pdfCursorTools.handTool.active');
}
allowNavigateFirstPage() {
return this._iframeWindow.eval('PDFViewerApplication.pdfViewer.currentPageNumber > 1');
}
allowNavigateLastPage() {
return this._iframeWindow.eval('PDFViewerApplication.pdfViewer.currentPageNumber < PDFViewerApplication.pdfViewer.pagesCount');
}
allowNavigateBack() {
try {
let { uid } = this._iframeWindow.history.state;
if (uid == 0) {
return false;
}
}
catch (e) {
}
return true;
}
allowNavigateForward() {
try {
let { uid } = this._iframeWindow.history.state;
let length = this._iframeWindow.history.length;
if (uid == length - 1) {
return false;
}
}
catch (e) {
}
return true;
}
menuCmd(cmd) {
if (cmd === 'export') {
let zp = Zotero.getActiveZoteroPane();
@ -169,6 +208,7 @@ class ReaderInstance {
}
async _setState(state) {
this.state = state;
let item = Zotero.Items.get(this._itemID);
if (item) {
item.setAttachmentLastPageIndex(state.pageIndex);
@ -322,7 +362,7 @@ class ReaderInstance {
// Add to note
menuitem = this._window.document.createElement('menuitem');
menuitem.setAttribute('label', Zotero.getString('pdfReader.addToNote'));
let hasActiveEditor = this._window.ZoteroContextPane.getActiveEditor();
let hasActiveEditor = this._window.ZoteroContextPane && this._window.ZoteroContextPane.getActiveEditor();
menuitem.setAttribute('disabled', !hasActiveEditor);
menuitem.addEventListener('command', () => {
let data = {
@ -643,7 +683,7 @@ class ReaderTab extends ReaderInstance {
}
_addToNote(annotations) {
let noteEditor = this._window.ZoteroContextPane.getActiveEditor();
let noteEditor = this._window.ZoteroContextPane && this._window.ZoteroContextPane.getActiveEditor();
if (!noteEditor) {
return;
}
@ -661,7 +701,7 @@ class ReaderWindow extends ReaderInstance {
super();
this._sidebarWidth = sidebarWidth;
this._sidebarOpen = sidebarOpen;
this._bottomPlaceholderHeight = bottomPlaceholderHeight;
this._bottomPlaceholderHeight = 0;
this.init();
}
@ -678,6 +718,8 @@ class ReaderWindow extends ReaderInstance {
this._window.addEventListener('keypress', this._handleKeyPress);
this._popupset = this._window.document.getElementById('zotero-reader-popupset');
this._window.menuCmd = this.menuCmd.bind(this);
this._window.onGoMenuOpen = this._onGoMenuOpen.bind(this);
this._window.onViewMenuOpen = this._onViewMenuOpen.bind(this);
this._iframe = this._window.document.getElementById('reader');
}
@ -702,6 +744,44 @@ class ReaderWindow extends ReaderInstance {
this._window.close();
}
}
_onViewMenuOpen() {
this._window.document.getElementById('view-menuitem-vertical-scrolling').setAttribute('checked', this.state.scrollMode == 0);
this._window.document.getElementById('view-menuitem-horizontal-scrolling').setAttribute('checked', this.state.scrollMode == 1);
this._window.document.getElementById('view-menuitem-wrapped-scrolling').setAttribute('checked', this.state.scrollMode == 2);
this._window.document.getElementById('view-menuitem-no-spreads').setAttribute('checked', this.state.spreadMode == 0);
this._window.document.getElementById('view-menuitem-odd-spreads').setAttribute('checked', this.state.spreadMode == 1);
this._window.document.getElementById('view-menuitem-even-spreads').setAttribute('checked', this.state.spreadMode == 2);
this._window.document.getElementById('view-menuitem-hand-tool').setAttribute('checked', this.isHandToolActive());
}
_onGoMenuOpen() {
let keyBack = this._window.document.getElementById('key_back');
let keyForward = this._window.document.getElementById('key_forward');
if (Zotero.isMac) {
keyBack.setAttribute('key', '[');
keyBack.setAttribute('modifiers', 'meta');
keyForward.setAttribute('key', ']');
keyForward.setAttribute('modifiers', 'meta');
}
else {
keyBack.setAttribute('keycode', 'VK_LEFT');
keyBack.setAttribute('modifiers', 'alt');
keyForward.setAttribute('keycode', 'VK_RIGHT');
keyForward.setAttribute('modifiers', 'alt');
}
let menuItemBack = this._window.document.getElementById('go-menuitem-back');
let menuItemForward = this._window.document.getElementById('go-menuitem-forward');
menuItemBack.setAttribute('key', 'key_back');
menuItemForward.setAttribute('key', 'key_forward');
this._window.document.getElementById('go-menuitem-first-page').setAttribute('disabled', !this.allowNavigateFirstPage());
this._window.document.getElementById('go-menuitem-last-page').setAttribute('disabled', !this.allowNavigateLastPage());
this._window.document.getElementById('go-menuitem-back').setAttribute('disabled', !this.allowNavigateBack());
this._window.document.getElementById('go-menuitem-forward').setAttribute('disabled', !this.allowNavigateForward());
}
}

View file

@ -44,6 +44,9 @@
<!ENTITY bidiSwitchTextDirectionItem.accesskey "w">
<!ENTITY bidiSwitchTextDirectionItem.commandkey "X">
<!--GO MENU-->
<!ENTITY goMenu.label "Go">
<!--VIEW MENU-->
<!ENTITY viewMenu.label "View">
<!ENTITY layout.label "Layout">

View file

@ -336,11 +336,12 @@
<!ENTITY zotero.context.addStandaloneNoteFromAnnotations "Add Standalone Note from Annotations">
<!ENTITY zotero.context.editInWindow "Edit in a Separate Window">
<!ENTITY zotero.pdfReader.goToFirstPage "Go to First Page">
<!ENTITY zotero.pdfReader.goToLastPage "Go to Last Page">
<!ENTITY zotero.pdfReader.firstPage "First Page">
<!ENTITY zotero.pdfReader.lastPage "Last Page">
<!ENTITY zotero.pdfReader.back "Back">
<!ENTITY zotero.pdfReader.forward "Forward">
<!ENTITY zotero.pdfReader.rotateClockwise "Rotate Clockwise">
<!ENTITY zotero.pdfReader.rotateCounterclockwise "Rotate Counterclockwise">
<!ENTITY zotero.pdfReader.textSelectionTool "Text Selection Tool">
<!ENTITY zotero.pdfReader.handTool "Hand Tool">
<!ENTITY zotero.pdfReader.verticalScrolling "Vertical Scrolling">
<!ENTITY zotero.pdfReader.horizontalScrolling "Horizontal Scrolling">

@ -1 +1 @@
Subproject commit 521570fba3302b35ce9984469c579c21c1eace86
Subproject commit dc81445206934f78c98a6d27e09fcd631d559988