retold-remote 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/README.md +181 -0
- package/docs/_cover.md +14 -0
- package/docs/_sidebar.md +10 -0
- package/docs/_topbar.md +3 -0
- package/docs/audio-viewer.md +133 -0
- package/docs/ebook-reader.md +90 -0
- package/docs/image-viewer.md +90 -0
- package/docs/server-setup.md +262 -0
- package/docs/video-viewer.md +134 -0
- package/html/docs.html +59 -0
- package/package.json +21 -7
- package/source/Pict-Application-RetoldRemote.js +143 -2
- package/source/RetoldRemote-ExtensionMaps.js +33 -0
- package/source/cli/RetoldRemote-Server-Setup.js +82 -67
- package/source/cli/commands/RetoldRemote-Command-Serve.js +5 -26
- package/source/providers/Pict-Provider-CollectionManager.js +934 -0
- package/source/providers/Pict-Provider-FormattingUtilities.js +109 -0
- package/source/providers/Pict-Provider-GalleryFilterSort.js +2 -11
- package/source/providers/Pict-Provider-GalleryNavigation.js +270 -353
- package/source/providers/Pict-Provider-RetoldRemoteIcons.js +52 -0
- package/source/providers/Pict-Provider-ToastNotification.js +96 -0
- package/source/providers/keyboard-handlers/KeyHandler-AudioExplorer.js +88 -0
- package/source/providers/keyboard-handlers/KeyHandler-Gallery.js +190 -0
- package/source/providers/keyboard-handlers/KeyHandler-Sidebar.js +65 -0
- package/source/providers/keyboard-handlers/KeyHandler-VideoExplorer.js +57 -0
- package/source/providers/keyboard-handlers/KeyHandler-Viewer.js +197 -0
- package/source/server/RetoldRemote-ArchiveService.js +2 -12
- package/source/server/RetoldRemote-AudioWaveformService.js +7 -16
- package/source/server/RetoldRemote-CollectionService.js +684 -0
- package/source/server/RetoldRemote-EbookService.js +7 -16
- package/source/server/RetoldRemote-MediaService.js +3 -14
- package/source/server/RetoldRemote-ParimeCache.js +349 -0
- package/source/server/RetoldRemote-ThumbnailCache.js +52 -20
- package/source/server/RetoldRemote-VideoFrameService.js +7 -15
- package/source/views/PictView-Remote-AudioExplorer.js +10 -43
- package/source/views/PictView-Remote-CollectionsPanel.js +1087 -0
- package/source/views/PictView-Remote-Gallery.js +237 -44
- package/source/views/PictView-Remote-ImageViewer.js +1 -34
- package/source/views/PictView-Remote-Layout.js +410 -20
- package/source/views/PictView-Remote-MediaViewer.js +338 -51
- package/source/views/PictView-Remote-SettingsPanel.js +155 -138
- package/source/views/PictView-Remote-TopBar.js +615 -14
- package/source/views/PictView-Remote-VLCSetup.js +766 -0
- package/source/views/PictView-Remote-VideoExplorer.js +20 -54
- package/web-application/css/docuserve.css +73 -0
- package/web-application/docs/README.md +181 -0
- package/web-application/docs/_cover.md +14 -0
- package/web-application/docs/_sidebar.md +10 -0
- package/web-application/docs/_topbar.md +3 -0
- package/web-application/docs/audio-viewer.md +133 -0
- package/web-application/docs/ebook-reader.md +90 -0
- package/web-application/docs/image-viewer.md +90 -0
- package/web-application/docs/server-setup.md +262 -0
- package/web-application/docs/video-viewer.md +134 -0
- package/web-application/docs.html +59 -0
- package/web-application/js/pict-docuserve.min.js +58 -0
- package/web-application/js/pict.min.js +2 -2
- package/web-application/js/pict.min.js.map +1 -1
- package/web-application/retold-remote.js +2558 -439
- package/web-application/retold-remote.js.map +1 -1
- package/web-application/retold-remote.min.js +41 -11
- package/web-application/retold-remote.min.js.map +1 -1
- package/server.js +0 -43
|
@@ -145,6 +145,34 @@ const _ViewConfiguration =
|
|
|
145
145
|
{
|
|
146
146
|
display: none;
|
|
147
147
|
}
|
|
148
|
+
/* Hide the ugly white + button from the breadcrumb bar */
|
|
149
|
+
#ContentEditor-Sidebar-Container .pict-fb-breadcrumb-addfolder
|
|
150
|
+
{
|
|
151
|
+
display: none;
|
|
152
|
+
}
|
|
153
|
+
/* Subtle add-folder button at bottom of file list */
|
|
154
|
+
.retold-remote-sidebar-addfolder
|
|
155
|
+
{
|
|
156
|
+
display: block;
|
|
157
|
+
width: 100%;
|
|
158
|
+
padding: 8px 12px;
|
|
159
|
+
margin-top: 4px;
|
|
160
|
+
border: 1px dashed var(--retold-border);
|
|
161
|
+
border-radius: 4px;
|
|
162
|
+
background: transparent;
|
|
163
|
+
color: var(--retold-text-dim);
|
|
164
|
+
font-size: 0.72rem;
|
|
165
|
+
font-family: inherit;
|
|
166
|
+
cursor: pointer;
|
|
167
|
+
text-align: center;
|
|
168
|
+
transition: color 0.15s, border-color 0.15s, background 0.15s;
|
|
169
|
+
}
|
|
170
|
+
.retold-remote-sidebar-addfolder:hover
|
|
171
|
+
{
|
|
172
|
+
color: var(--retold-text-muted);
|
|
173
|
+
border-color: var(--retold-text-dim);
|
|
174
|
+
background: rgba(128, 128, 128, 0.06);
|
|
175
|
+
}
|
|
148
176
|
#ContentEditor-Sidebar-Container .pict-fb-detail-row
|
|
149
177
|
{
|
|
150
178
|
color: var(--retold-text-secondary);
|
|
@@ -171,16 +199,42 @@ const _ViewConfiguration =
|
|
|
171
199
|
{
|
|
172
200
|
box-shadow: inset 0 0 0 1px var(--retold-accent);
|
|
173
201
|
}
|
|
174
|
-
#ContentEditor-Sidebar-Container .pict-fb-
|
|
202
|
+
#ContentEditor-Sidebar-Container .pict-fb-breadcrumb-bar
|
|
175
203
|
{
|
|
176
|
-
color: var(--retold-text-muted);
|
|
177
204
|
background: var(--retold-bg-secondary);
|
|
178
205
|
border-bottom-color: var(--retold-border);
|
|
179
206
|
}
|
|
207
|
+
#ContentEditor-Sidebar-Container .pict-fb-breadcrumbs
|
|
208
|
+
{
|
|
209
|
+
color: var(--retold-text-muted);
|
|
210
|
+
background: transparent;
|
|
211
|
+
border-bottom: none;
|
|
212
|
+
}
|
|
180
213
|
#ContentEditor-Sidebar-Container .pict-fb-breadcrumb-link
|
|
181
214
|
{
|
|
182
215
|
color: var(--retold-accent);
|
|
183
216
|
}
|
|
217
|
+
/* Insert button: hidden by default, visible on row hover for ALL files */
|
|
218
|
+
#ContentEditor-Sidebar-Container .pict-fb-insert-btn
|
|
219
|
+
{
|
|
220
|
+
display: none;
|
|
221
|
+
background: var(--retold-bg-hover);
|
|
222
|
+
color: var(--retold-text-muted);
|
|
223
|
+
border: 1px solid var(--retold-border);
|
|
224
|
+
border-radius: 3px;
|
|
225
|
+
font-size: 0.72rem;
|
|
226
|
+
padding: 1px 6px;
|
|
227
|
+
}
|
|
228
|
+
#ContentEditor-Sidebar-Container .pict-fb-insert-btn:hover
|
|
229
|
+
{
|
|
230
|
+
background: var(--retold-accent);
|
|
231
|
+
color: var(--retold-bg-primary);
|
|
232
|
+
border-color: var(--retold-accent);
|
|
233
|
+
}
|
|
234
|
+
#ContentEditor-Sidebar-Container .pict-fb-detail-row:hover .pict-fb-insert-btn
|
|
235
|
+
{
|
|
236
|
+
display: inline-block;
|
|
237
|
+
}
|
|
184
238
|
/* Main content area */
|
|
185
239
|
#RetoldRemote-Content-Container
|
|
186
240
|
{
|
|
@@ -208,6 +262,134 @@ const _ViewConfiguration =
|
|
|
208
262
|
{
|
|
209
263
|
display: none;
|
|
210
264
|
}
|
|
265
|
+
|
|
266
|
+
/* ============================================================
|
|
267
|
+
MOBILE: Sidebar becomes a top drawer
|
|
268
|
+
============================================================ */
|
|
269
|
+
@media (max-width: 600px)
|
|
270
|
+
{
|
|
271
|
+
.content-editor-body
|
|
272
|
+
{
|
|
273
|
+
flex-direction: column;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* Sidebar becomes a top section with a height instead of width */
|
|
277
|
+
.content-editor-sidebar-wrap
|
|
278
|
+
{
|
|
279
|
+
width: 100% !important;
|
|
280
|
+
height: 33vh;
|
|
281
|
+
transition: height 0.2s ease;
|
|
282
|
+
flex-direction: column;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
.content-editor-sidebar-wrap.collapsed
|
|
286
|
+
{
|
|
287
|
+
width: 100% !important;
|
|
288
|
+
height: 0 !important;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/* Resize handle becomes horizontal bar at the bottom of the drawer */
|
|
292
|
+
.content-editor-resize-handle
|
|
293
|
+
{
|
|
294
|
+
width: 100%;
|
|
295
|
+
height: 8px;
|
|
296
|
+
cursor: row-resize;
|
|
297
|
+
border-right: none;
|
|
298
|
+
border-bottom: 1px solid var(--retold-border);
|
|
299
|
+
display: flex;
|
|
300
|
+
align-items: center;
|
|
301
|
+
justify-content: center;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
.content-editor-resize-handle::after
|
|
305
|
+
{
|
|
306
|
+
content: '';
|
|
307
|
+
display: block;
|
|
308
|
+
width: 36px;
|
|
309
|
+
height: 3px;
|
|
310
|
+
border-radius: 2px;
|
|
311
|
+
background: var(--retold-text-placeholder);
|
|
312
|
+
opacity: 0.5;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.content-editor-resize-handle:hover::after,
|
|
316
|
+
.content-editor-resize-handle.dragging::after
|
|
317
|
+
{
|
|
318
|
+
background: var(--retold-accent);
|
|
319
|
+
opacity: 1;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/* Sidebar inner fills the drawer */
|
|
323
|
+
.content-editor-sidebar-inner
|
|
324
|
+
{
|
|
325
|
+
flex: 1;
|
|
326
|
+
min-height: 0;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/* Content takes remaining space */
|
|
330
|
+
#RetoldRemote-Content-Container
|
|
331
|
+
{
|
|
332
|
+
flex: 1;
|
|
333
|
+
min-height: 0;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/* Collections panel: hide in mobile */
|
|
337
|
+
.retold-remote-collections-wrap
|
|
338
|
+
{
|
|
339
|
+
display: none;
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/* ---- Right-side Collections Panel ---- */
|
|
344
|
+
.retold-remote-collections-wrap
|
|
345
|
+
{
|
|
346
|
+
display: flex;
|
|
347
|
+
flex-shrink: 0;
|
|
348
|
+
position: relative;
|
|
349
|
+
transition: width 0.2s ease;
|
|
350
|
+
border-left: 1px solid var(--retold-border);
|
|
351
|
+
}
|
|
352
|
+
.retold-remote-collections-wrap.collapsed
|
|
353
|
+
{
|
|
354
|
+
width: 0 !important;
|
|
355
|
+
border-left: none;
|
|
356
|
+
}
|
|
357
|
+
.retold-remote-collections-wrap.collapsed .retold-remote-collections-inner
|
|
358
|
+
{
|
|
359
|
+
visibility: hidden;
|
|
360
|
+
}
|
|
361
|
+
.retold-remote-collections-wrap.collapsed .retold-remote-collections-resize-handle
|
|
362
|
+
{
|
|
363
|
+
display: none;
|
|
364
|
+
}
|
|
365
|
+
.retold-remote-collections-inner
|
|
366
|
+
{
|
|
367
|
+
display: flex;
|
|
368
|
+
flex-direction: column;
|
|
369
|
+
flex: 1;
|
|
370
|
+
min-width: 0;
|
|
371
|
+
min-height: 0;
|
|
372
|
+
overflow: hidden;
|
|
373
|
+
background: var(--retold-bg-primary);
|
|
374
|
+
}
|
|
375
|
+
.retold-remote-collections-resize-handle
|
|
376
|
+
{
|
|
377
|
+
position: absolute;
|
|
378
|
+
left: 0;
|
|
379
|
+
top: 0;
|
|
380
|
+
bottom: 0;
|
|
381
|
+
width: 5px;
|
|
382
|
+
cursor: col-resize;
|
|
383
|
+
z-index: 10;
|
|
384
|
+
display: flex;
|
|
385
|
+
align-items: center;
|
|
386
|
+
justify-content: center;
|
|
387
|
+
}
|
|
388
|
+
.retold-remote-collections-resize-handle:hover
|
|
389
|
+
{
|
|
390
|
+
background: var(--retold-accent);
|
|
391
|
+
opacity: 0.3;
|
|
392
|
+
}
|
|
211
393
|
`,
|
|
212
394
|
|
|
213
395
|
Templates:
|
|
@@ -232,6 +414,12 @@ const _ViewConfiguration =
|
|
|
232
414
|
<div id="RetoldRemote-Gallery-Container"></div>
|
|
233
415
|
<div id="RetoldRemote-Viewer-Container"></div>
|
|
234
416
|
</div>
|
|
417
|
+
<div class="retold-remote-collections-wrap collapsed" id="RetoldRemote-Collections-Wrap" style="width: 300px;">
|
|
418
|
+
<div class="retold-remote-collections-resize-handle"></div>
|
|
419
|
+
<div class="retold-remote-collections-inner">
|
|
420
|
+
<div id="RetoldRemote-Collections-Container"></div>
|
|
421
|
+
</div>
|
|
422
|
+
</div>
|
|
235
423
|
</div>
|
|
236
424
|
`
|
|
237
425
|
}
|
|
@@ -254,6 +442,7 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
254
442
|
super(pFable, pOptions, pServiceHash);
|
|
255
443
|
|
|
256
444
|
this._sidebarDragging = false;
|
|
445
|
+
this._collectionsDragging = false;
|
|
257
446
|
}
|
|
258
447
|
|
|
259
448
|
onAfterRender()
|
|
@@ -276,7 +465,7 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
276
465
|
tmpWrap.classList.add('collapsed');
|
|
277
466
|
}
|
|
278
467
|
}
|
|
279
|
-
if (tmpRemote && tmpRemote.SidebarWidth)
|
|
468
|
+
if (!this.isMobileDrawer() && tmpRemote && tmpRemote.SidebarWidth)
|
|
280
469
|
{
|
|
281
470
|
let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
|
|
282
471
|
if (tmpWrap && !tmpWrap.classList.contains('collapsed'))
|
|
@@ -284,6 +473,31 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
284
473
|
tmpWrap.style.width = tmpRemote.SidebarWidth + 'px';
|
|
285
474
|
}
|
|
286
475
|
}
|
|
476
|
+
if (this.isMobileDrawer() && tmpRemote && tmpRemote.SidebarDrawerHeight)
|
|
477
|
+
{
|
|
478
|
+
let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
|
|
479
|
+
if (tmpWrap && !tmpWrap.classList.contains('collapsed'))
|
|
480
|
+
{
|
|
481
|
+
tmpWrap.style.height = tmpRemote.SidebarDrawerHeight + 'px';
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
// Restore collections panel state from settings
|
|
486
|
+
if (tmpRemote && tmpRemote.CollectionsPanelOpen)
|
|
487
|
+
{
|
|
488
|
+
let tmpCollWrap = document.getElementById('RetoldRemote-Collections-Wrap');
|
|
489
|
+
if (tmpCollWrap)
|
|
490
|
+
{
|
|
491
|
+
tmpCollWrap.classList.remove('collapsed');
|
|
492
|
+
if (tmpRemote.CollectionsPanelWidth)
|
|
493
|
+
{
|
|
494
|
+
tmpCollWrap.style.width = tmpRemote.CollectionsPanelWidth + 'px';
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
// Set up collections panel resize handle
|
|
500
|
+
this._setupCollectionsResizeHandle();
|
|
287
501
|
|
|
288
502
|
// Listen for hash changes (browser back/forward)
|
|
289
503
|
let tmpSelf = this;
|
|
@@ -293,6 +507,14 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
293
507
|
});
|
|
294
508
|
}
|
|
295
509
|
|
|
510
|
+
/**
|
|
511
|
+
* Detect if we are in mobile drawer mode (narrow viewport).
|
|
512
|
+
*/
|
|
513
|
+
isMobileDrawer()
|
|
514
|
+
{
|
|
515
|
+
return window.innerWidth <= 600;
|
|
516
|
+
}
|
|
517
|
+
|
|
296
518
|
toggleSidebar()
|
|
297
519
|
{
|
|
298
520
|
let tmpWrap = document.querySelector('.content-editor-sidebar-wrap');
|
|
@@ -304,7 +526,23 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
304
526
|
tmpWrap.classList.toggle('collapsed');
|
|
305
527
|
|
|
306
528
|
let tmpRemote = this.pict.AppData.RetoldRemote;
|
|
307
|
-
|
|
529
|
+
let tmpIsCollapsed = tmpWrap.classList.contains('collapsed');
|
|
530
|
+
tmpRemote.SidebarCollapsed = tmpIsCollapsed;
|
|
531
|
+
|
|
532
|
+
// Restore saved dimensions when opening
|
|
533
|
+
if (!tmpIsCollapsed)
|
|
534
|
+
{
|
|
535
|
+
if (this.isMobileDrawer())
|
|
536
|
+
{
|
|
537
|
+
let tmpHeight = tmpRemote.SidebarDrawerHeight || Math.round(window.innerHeight * 0.33);
|
|
538
|
+
tmpWrap.style.height = tmpHeight + 'px';
|
|
539
|
+
}
|
|
540
|
+
else if (tmpRemote.SidebarWidth)
|
|
541
|
+
{
|
|
542
|
+
tmpWrap.style.width = tmpRemote.SidebarWidth + 'px';
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
308
546
|
this.pict.PictApplication.saveSettings();
|
|
309
547
|
|
|
310
548
|
// Recalculate gallery columns after sidebar resize
|
|
@@ -340,6 +578,7 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
340
578
|
tmpSettingsView.render();
|
|
341
579
|
}
|
|
342
580
|
}
|
|
581
|
+
|
|
343
582
|
}
|
|
344
583
|
|
|
345
584
|
_setupResizeHandle()
|
|
@@ -354,37 +593,84 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
354
593
|
}
|
|
355
594
|
|
|
356
595
|
let tmpStartX = 0;
|
|
596
|
+
let tmpStartY = 0;
|
|
357
597
|
let tmpStartWidth = 0;
|
|
598
|
+
let tmpStartHeight = 0;
|
|
599
|
+
|
|
600
|
+
function getClientPos(pEvent)
|
|
601
|
+
{
|
|
602
|
+
if (pEvent.touches && pEvent.touches.length > 0)
|
|
603
|
+
{
|
|
604
|
+
return { x: pEvent.touches[0].clientX, y: pEvent.touches[0].clientY };
|
|
605
|
+
}
|
|
606
|
+
return { x: pEvent.clientX, y: pEvent.clientY };
|
|
607
|
+
}
|
|
358
608
|
|
|
359
|
-
function
|
|
609
|
+
function onDragStart(pEvent)
|
|
360
610
|
{
|
|
361
611
|
tmpSelf._sidebarDragging = true;
|
|
362
|
-
|
|
612
|
+
let tmpPos = getClientPos(pEvent);
|
|
613
|
+
tmpStartX = tmpPos.x;
|
|
614
|
+
tmpStartY = tmpPos.y;
|
|
363
615
|
tmpStartWidth = tmpWrap.offsetWidth;
|
|
616
|
+
tmpStartHeight = tmpWrap.offsetHeight;
|
|
364
617
|
tmpHandle.classList.add('dragging');
|
|
365
|
-
|
|
366
|
-
document.addEventListener('
|
|
618
|
+
|
|
619
|
+
document.addEventListener('mousemove', onDragMove);
|
|
620
|
+
document.addEventListener('mouseup', onDragEnd);
|
|
621
|
+
document.addEventListener('touchmove', onDragMove, { passive: false });
|
|
622
|
+
document.addEventListener('touchend', onDragEnd);
|
|
367
623
|
pEvent.preventDefault();
|
|
368
624
|
}
|
|
369
625
|
|
|
370
|
-
function
|
|
626
|
+
function onDragMove(pEvent)
|
|
371
627
|
{
|
|
372
|
-
if (!tmpSelf._sidebarDragging)
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
628
|
+
if (!tmpSelf._sidebarDragging)
|
|
629
|
+
{
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
let tmpPos = getClientPos(pEvent);
|
|
634
|
+
|
|
635
|
+
if (tmpSelf.isMobileDrawer())
|
|
636
|
+
{
|
|
637
|
+
// Vertical resize (top drawer)
|
|
638
|
+
let tmpNewHeight = tmpStartHeight + (tmpPos.y - tmpStartY);
|
|
639
|
+
let tmpMaxHeight = Math.round(window.innerHeight * 0.7);
|
|
640
|
+
tmpNewHeight = Math.max(80, Math.min(tmpNewHeight, tmpMaxHeight));
|
|
641
|
+
tmpWrap.style.height = tmpNewHeight + 'px';
|
|
642
|
+
}
|
|
643
|
+
else
|
|
644
|
+
{
|
|
645
|
+
// Horizontal resize (sidebar)
|
|
646
|
+
let tmpNewWidth = tmpStartWidth + (tmpPos.x - tmpStartX);
|
|
647
|
+
tmpNewWidth = Math.max(150, Math.min(tmpNewWidth, 600));
|
|
648
|
+
tmpWrap.style.width = tmpNewWidth + 'px';
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
pEvent.preventDefault();
|
|
376
652
|
}
|
|
377
653
|
|
|
378
|
-
function
|
|
654
|
+
function onDragEnd()
|
|
379
655
|
{
|
|
380
656
|
tmpSelf._sidebarDragging = false;
|
|
381
657
|
tmpHandle.classList.remove('dragging');
|
|
382
|
-
document.removeEventListener('mousemove', onMouseMove);
|
|
383
|
-
document.removeEventListener('mouseup', onMouseUp);
|
|
384
658
|
|
|
385
|
-
|
|
659
|
+
document.removeEventListener('mousemove', onDragMove);
|
|
660
|
+
document.removeEventListener('mouseup', onDragEnd);
|
|
661
|
+
document.removeEventListener('touchmove', onDragMove);
|
|
662
|
+
document.removeEventListener('touchend', onDragEnd);
|
|
663
|
+
|
|
664
|
+
// Persist dimensions
|
|
386
665
|
let tmpRemote = tmpSelf.pict.AppData.RetoldRemote;
|
|
387
|
-
|
|
666
|
+
if (tmpSelf.isMobileDrawer())
|
|
667
|
+
{
|
|
668
|
+
tmpRemote.SidebarDrawerHeight = tmpWrap.offsetHeight;
|
|
669
|
+
}
|
|
670
|
+
else
|
|
671
|
+
{
|
|
672
|
+
tmpRemote.SidebarWidth = tmpWrap.offsetWidth;
|
|
673
|
+
}
|
|
388
674
|
tmpSelf.pict.PictApplication.saveSettings();
|
|
389
675
|
|
|
390
676
|
// Recalculate gallery columns
|
|
@@ -395,15 +681,119 @@ class RetoldRemoteLayoutView extends libPictView
|
|
|
395
681
|
}
|
|
396
682
|
}
|
|
397
683
|
|
|
398
|
-
tmpHandle.addEventListener('mousedown',
|
|
684
|
+
tmpHandle.addEventListener('mousedown', onDragStart);
|
|
685
|
+
tmpHandle.addEventListener('touchstart', onDragStart, { passive: false });
|
|
399
686
|
|
|
400
|
-
// Double-click on resize handle collapses the sidebar
|
|
687
|
+
// Double-click/tap on resize handle collapses the sidebar
|
|
401
688
|
tmpHandle.addEventListener('dblclick', function (pEvent)
|
|
402
689
|
{
|
|
403
690
|
pEvent.preventDefault();
|
|
404
691
|
tmpSelf.toggleSidebar();
|
|
405
692
|
});
|
|
406
693
|
}
|
|
694
|
+
|
|
695
|
+
/**
|
|
696
|
+
* Toggle the right-side collections panel open/closed.
|
|
697
|
+
*/
|
|
698
|
+
toggleCollectionsPanel()
|
|
699
|
+
{
|
|
700
|
+
let tmpManager = this.pict.providers['RetoldRemote-CollectionManager'];
|
|
701
|
+
if (tmpManager)
|
|
702
|
+
{
|
|
703
|
+
tmpManager.togglePanel();
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
/**
|
|
708
|
+
* Set up the resize handle for the collections panel (right side).
|
|
709
|
+
* Dragging LEFT increases width, dragging RIGHT decreases width.
|
|
710
|
+
*/
|
|
711
|
+
_setupCollectionsResizeHandle()
|
|
712
|
+
{
|
|
713
|
+
let tmpHandle = document.querySelector('.retold-remote-collections-resize-handle');
|
|
714
|
+
let tmpWrap = document.getElementById('RetoldRemote-Collections-Wrap');
|
|
715
|
+
if (!tmpHandle || !tmpWrap)
|
|
716
|
+
{
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
let tmpSelf = this;
|
|
721
|
+
let tmpStartX = 0;
|
|
722
|
+
let tmpStartWidth = 0;
|
|
723
|
+
|
|
724
|
+
function onDragStart(pEvent)
|
|
725
|
+
{
|
|
726
|
+
if (tmpWrap.classList.contains('collapsed'))
|
|
727
|
+
{
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
pEvent.preventDefault();
|
|
732
|
+
tmpSelf._collectionsDragging = true;
|
|
733
|
+
tmpHandle.classList.add('dragging');
|
|
734
|
+
|
|
735
|
+
let tmpClientX = pEvent.touches ? pEvent.touches[0].clientX : pEvent.clientX;
|
|
736
|
+
tmpStartX = tmpClientX;
|
|
737
|
+
tmpStartWidth = tmpWrap.getBoundingClientRect().width;
|
|
738
|
+
|
|
739
|
+
document.addEventListener('mousemove', onDragMove);
|
|
740
|
+
document.addEventListener('mouseup', onDragEnd);
|
|
741
|
+
document.addEventListener('touchmove', onDragMove, { passive: false });
|
|
742
|
+
document.addEventListener('touchend', onDragEnd);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
function onDragMove(pEvent)
|
|
746
|
+
{
|
|
747
|
+
if (!tmpSelf._collectionsDragging)
|
|
748
|
+
{
|
|
749
|
+
return;
|
|
750
|
+
}
|
|
751
|
+
pEvent.preventDefault();
|
|
752
|
+
|
|
753
|
+
let tmpClientX = pEvent.touches ? pEvent.touches[0].clientX : pEvent.clientX;
|
|
754
|
+
// Dragging left (negative deltaX) increases width
|
|
755
|
+
let tmpDelta = tmpStartX - tmpClientX;
|
|
756
|
+
let tmpNewWidth = Math.max(150, Math.min(600, tmpStartWidth + tmpDelta));
|
|
757
|
+
tmpWrap.style.width = tmpNewWidth + 'px';
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
function onDragEnd()
|
|
761
|
+
{
|
|
762
|
+
if (!tmpSelf._collectionsDragging)
|
|
763
|
+
{
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
tmpSelf._collectionsDragging = false;
|
|
768
|
+
tmpHandle.classList.remove('dragging');
|
|
769
|
+
|
|
770
|
+
let tmpRemote = tmpSelf.pict.AppData.RetoldRemote;
|
|
771
|
+
tmpRemote.CollectionsPanelWidth = tmpWrap.getBoundingClientRect().width;
|
|
772
|
+
tmpSelf.pict.PictApplication.saveSettings();
|
|
773
|
+
|
|
774
|
+
document.removeEventListener('mousemove', onDragMove);
|
|
775
|
+
document.removeEventListener('mouseup', onDragEnd);
|
|
776
|
+
document.removeEventListener('touchmove', onDragMove);
|
|
777
|
+
document.removeEventListener('touchend', onDragEnd);
|
|
778
|
+
|
|
779
|
+
// Recalculate gallery columns
|
|
780
|
+
let tmpGalleryNav = tmpSelf.pict.providers['RetoldRemote-GalleryNavigation'];
|
|
781
|
+
if (tmpGalleryNav && typeof tmpGalleryNav.recalculateColumns === 'function')
|
|
782
|
+
{
|
|
783
|
+
tmpGalleryNav.recalculateColumns();
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
tmpHandle.addEventListener('mousedown', onDragStart);
|
|
788
|
+
tmpHandle.addEventListener('touchstart', onDragStart, { passive: false });
|
|
789
|
+
|
|
790
|
+
// Double-click collapses the collections panel
|
|
791
|
+
tmpHandle.addEventListener('dblclick', function (pEvent)
|
|
792
|
+
{
|
|
793
|
+
pEvent.preventDefault();
|
|
794
|
+
tmpSelf.toggleCollectionsPanel();
|
|
795
|
+
});
|
|
796
|
+
}
|
|
407
797
|
}
|
|
408
798
|
|
|
409
799
|
RetoldRemoteLayoutView.default_configuration = _ViewConfiguration;
|