@@ -3,16 +3,17 @@ import { config } from "../../package.json";
3
3
import { getString } from "../utils/locale" ;
4
4
import { getPref } from "../utils/prefs" ;
5
5
import { ActionData } from "../utils/actions" ;
6
+ import { getCurrentItems } from "../utils/items" ;
6
7
7
8
export { initMenu , buildItemMenu } ;
8
9
9
- function initMenu ( ) {
10
+ function initMenu ( win : Window ) {
10
11
ztoolkit . Menu . register ( "item" , {
11
12
tag : "menu" ,
12
- popupId : `${ config . addonRef } -itemPopup ` ,
13
+ popupId : `${ config . addonRef } -item-popup ` ,
13
14
label : getString ( "menupopup-label" ) ,
14
15
icon : `chrome://${ config . addonRef } /content/icons/favicon.png` ,
15
- onpopupshowing : `Zotero.${ config . addonInstance } .hooks.onMenuEvent("showing", { window })` ,
16
+ onpopupshowing : `Zotero.${ config . addonInstance } .hooks.onMenuEvent("showing", { window, target: "item" })` ,
16
17
children : [
17
18
{
18
19
tag : "menuitem" ,
@@ -21,12 +22,86 @@ function initMenu() {
21
22
} ,
22
23
] ,
23
24
} ) ;
25
+
26
+ ztoolkit . UI . appendElement (
27
+ {
28
+ tag : "menupopup" ,
29
+ id : `${ config . addonRef } -reader-popup` ,
30
+ listeners : [
31
+ {
32
+ type : "popupshowing" ,
33
+ listener : ( ev ) => {
34
+ addon . hooks . onMenuEvent ( "showing" , { window, target : "reader" } ) ;
35
+ } ,
36
+ } ,
37
+ ] ,
38
+ } ,
39
+ win . document . querySelector ( "popupset" ) !
40
+ ) ;
41
+ const image =
42
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsSAAALEgHS3X78AAAA40lEQVRYCWP8//8/AyFwJL/hjsbXJ8oEFSKBG9wyd20mNqgQUsdESMGCypkppFoOAiA924s711PsAOmfb2NItRwGWP7/FaTYAbQGow4YdcCoA0YdMOqAUQcMuANYCCm4yS394AWboD05hn9k5XrgSqkDjgloPiDHcih4kENAwWgaGHXAqAModcBFKB4QB4AsdoBish1BrgPAli8rNvsAwpQ4ghwHLIRZDhNAcsRCUg0jWBSjW76s2CwBmwTUEQlRvadA3HhiDSQlBHBajuYQkBqiQ4JYBxQSYzmaIwoJKmRgYAAAgCNBYXH3oBUAAAAASUVORK5CYII=" ;
43
+ const readerButtonCSS = `
44
+ .actions-tags-reader-menu::before {
45
+ background-image: url(${ image } );
46
+ background-size: 100%;
47
+ content: "";
48
+ display: inline-block;
49
+ height: 16px;
50
+ vertical-align: top;
51
+ width: 16px;
52
+ }` ;
53
+ Zotero . Reader . registerEventListener ( "renderToolbar" , ( event ) => {
54
+ const { append, doc } = event ;
55
+ append (
56
+ ztoolkit . UI . createElement ( doc , "button" , {
57
+ namespace : "html" ,
58
+ classList : [ "toolbarButton" , "actions-tags-reader-menu" ] ,
59
+ properties : {
60
+ tabIndex : - 1 ,
61
+ title : "Actions" ,
62
+ } ,
63
+ listeners : [
64
+ {
65
+ type : "click" ,
66
+ listener : ( ev : Event ) => {
67
+ const _ev = ev as MouseEvent ;
68
+ const target = ev . target as HTMLElement ;
69
+ const elemRect = target . getBoundingClientRect ( ) ;
70
+
71
+ const x = _ev . screenX - _ev . offsetX ;
72
+ const y =
73
+ _ev . screenY - _ev . offsetY + elemRect . bottom - elemRect . top ;
74
+
75
+ win . document
76
+ . querySelector ( `#${ config . addonRef } -reader-popup` )
77
+ // @ts -ignore XUL.MenuPopup
78
+ ?. openPopupAtScreen ( x + 1 , y + 1 , true ) ;
79
+ } ,
80
+ } ,
81
+ ] ,
82
+ children : [
83
+ {
84
+ tag : "span" ,
85
+ classList : [ "button-background" ] ,
86
+ } ,
87
+ ] ,
88
+ } )
89
+ ) ;
90
+ append (
91
+ ztoolkit . UI . createElement ( doc , "style" , {
92
+ id : `${ config . addonRef } -reader-button` ,
93
+ properties : {
94
+ textContent : readerButtonCSS ,
95
+ } ,
96
+ } )
97
+ ) ;
98
+ } ) ;
24
99
}
25
100
26
- function buildItemMenu ( win : Window ) {
101
+ function buildItemMenu ( win : Window , target : "item" | "reader" ) {
27
102
const doc = win . document ;
28
103
const popup = doc . querySelector (
29
- `#${ config . addonRef } -itemPopup `
104
+ `#${ config . addonRef } -${ target } -popup `
30
105
) as XUL . MenuPopup ;
31
106
// Remove all children in popup
32
107
while ( popup . firstChild ) {
@@ -93,7 +168,7 @@ function getActionsByMenu() {
93
168
}
94
169
95
170
async function triggerMenuCommand ( key : string ) {
96
- const items = Zotero . getActiveZoteroPane ( ) . getSelectedItems ( ) ;
171
+ const items = getCurrentItems ( ) ;
97
172
// Trigger action for all items
98
173
await addon . api . actionManager . dispatchActionByKey ( key , {
99
174
itemIDs : items . map ( ( item ) => item . id ) ,
0 commit comments