mirror of
https://github.com/flynx/ImageGrid.git
synced 2025-10-29 10:20:08 +00:00
added a basic drawer widget...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
174fe34e13
commit
e29b2143ae
54
ui (gen4)/css/widget/drawer.css
Executable file
54
ui (gen4)/css/widget/drawer.css
Executable file
@ -0,0 +1,54 @@
|
||||
|
||||
.drawer-widget {
|
||||
position: absolute;
|
||||
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
|
||||
overflow: auto;
|
||||
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
|
||||
-webkit-transform-style: preserve-3d;
|
||||
-moz-transform-style: preserve-3d;
|
||||
transform-style: preserve-3d;
|
||||
}
|
||||
.drawer-widget~.drawer-widget {
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
|
||||
.drawer-widget .content {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
|
||||
top: 100%;
|
||||
left: 0px;
|
||||
|
||||
width: 100%;
|
||||
height: auto;
|
||||
|
||||
overflow: hidden;
|
||||
|
||||
|
||||
box-shadow: rgba(0, 0, 0, 0.1) 0.3em 0.3em 5em;
|
||||
}
|
||||
.drawer-widget~.drawer-widget .content {
|
||||
box-shadow: rgba(0, 0, 0, 0.05) 0.1em 0.1em 3em;
|
||||
}
|
||||
|
||||
/* NOTE: this does not include text...
|
||||
...need a way to go around this...
|
||||
*/
|
||||
.blur>* {
|
||||
-webkit-filter: blur(2px) saturate(0.3);
|
||||
filter: blur(2px) saturate(0.3);
|
||||
}
|
||||
.blur>.drawer-widget {
|
||||
-webkit-filter: none;
|
||||
filter: none;
|
||||
}
|
||||
|
||||
|
||||
118
ui (gen4)/lib/widget/drawer.html
Executable file
118
ui (gen4)/lib/widget/drawer.html
Executable file
@ -0,0 +1,118 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<link rel="stylesheet" href="../../css/widget/drawer.css">
|
||||
<style>
|
||||
|
||||
|
||||
.container {
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
|
||||
width: 50vw;
|
||||
height: 50vh;
|
||||
top: 10vh;
|
||||
right: 10vw;
|
||||
|
||||
border: solid 1px black;
|
||||
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
|
||||
.drawer-content {
|
||||
padding: 5px;
|
||||
}
|
||||
body>.drawer-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
||||
.drawer-widget .content {
|
||||
background: white;
|
||||
}
|
||||
|
||||
/* theaming... */
|
||||
|
||||
body.dark {
|
||||
background: black;
|
||||
color: white;
|
||||
}
|
||||
.dark ::-webkit-scrollbar-track-piece {
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
}
|
||||
.dark ::-webkit-scrollbar-thumb {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
}
|
||||
.dark ::-webkit-scrollbar-thumb:hover {
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
.dark .container {
|
||||
border: solid 1px rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
|
||||
<script src="../../ext-lib/jquery.js"></script>
|
||||
<script src="../../ext-lib/jquery-ui.js"></script>
|
||||
|
||||
<script src="../jli.js"></script>
|
||||
<script src="../toggler.js"></script>
|
||||
|
||||
<script src="../../ext-lib/require.js"></script>
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
requirejs(['../keyboard', '../../object', './drawer'], function(kbd, obj, d){
|
||||
keyboard = kbd
|
||||
drawer = d
|
||||
object = obj
|
||||
})
|
||||
|
||||
$(function(){
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
var themeToggler = CSSClassToggler('body',
|
||||
[
|
||||
'none',
|
||||
'light',
|
||||
'dark',
|
||||
],
|
||||
function(state){
|
||||
$('#theme').text(state)
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<body>
|
||||
|
||||
Theme: <button id="theme" onclick="themeToggler()">none</button>
|
||||
|
||||
<br>
|
||||
|
||||
<button onclick="drawer.Overlay('body', $('body>.drawer-content').clone())">Global drawer (default)</button>
|
||||
<button onclick="drawer.Overlay('.container', $('body>.drawer-content').clone())">Local drawer</button>
|
||||
|
||||
|
||||
<div class="container">
|
||||
<h4>A context for an drawer...<h4>
|
||||
<button onclick="drawer.Overlay('.container', $('body>.drawer-content').clone())">Local drawer</button>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="drawer-content">
|
||||
<h3>Overlay</h3>
|
||||
<button>Sub drawer</button>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<!-- vim:set ts=4 sw=4 : -->
|
||||
171
ui (gen4)/lib/widget/drawer.js
Executable file
171
ui (gen4)/lib/widget/drawer.js
Executable file
@ -0,0 +1,171 @@
|
||||
/**********************************************************************
|
||||
*
|
||||
*
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
define(function(require){ var module = {}
|
||||
console.log('>>> overlay')
|
||||
|
||||
//var DEBUG = DEBUG != null ? DEBUG : true
|
||||
|
||||
var keyboard = require('../keyboard')
|
||||
var object = require('../../object')
|
||||
var widget = require('./widget')
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
|
||||
var OverlayClassPrototype = {
|
||||
make: function(client, options){
|
||||
var that = this
|
||||
var overlay = $('<div>')
|
||||
.addClass('drawer-widget')
|
||||
.on(options.nonPropagatedEvents.join(' '), function(){
|
||||
event.stopPropagation()
|
||||
})
|
||||
.append($('<div>')
|
||||
.addClass('content')
|
||||
.click(function(){
|
||||
event.stopPropagation()
|
||||
})
|
||||
.append(client))
|
||||
|
||||
return overlay
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
var OverlayPrototype = {
|
||||
dom: null,
|
||||
client: null,
|
||||
|
||||
options: {
|
||||
nonPropagatedEvents: [
|
||||
'click',
|
||||
'keydown',
|
||||
],
|
||||
},
|
||||
|
||||
keyboard: {
|
||||
General: {
|
||||
pattern: '.browse-widget',
|
||||
|
||||
Esc: 'close',
|
||||
},
|
||||
},
|
||||
|
||||
// XXX triggering events from here and from jQuery/dom has a
|
||||
// different effect...
|
||||
trigger: widget.triggerEventWithSource,
|
||||
|
||||
// proxy event api...
|
||||
on: widget.proxyToDom('on'),
|
||||
one: widget.proxyToDom('one'),
|
||||
off: widget.proxyToDom('off'),
|
||||
bind: widget.proxyToDom('bind'),
|
||||
unbind: widget.proxyToDom('unbind'),
|
||||
deligate: widget.proxyToDom('deligate'),
|
||||
undeligate: widget.proxyToDom('undeligate'),
|
||||
|
||||
// custom events...
|
||||
close: function(handler){
|
||||
// trigger the event...
|
||||
if(handler == null){
|
||||
var that = this
|
||||
this.dom.animate({
|
||||
scrollTop: 0,
|
||||
opacity: 0,
|
||||
filter: 'none',
|
||||
},
|
||||
120,
|
||||
function(){
|
||||
that.dom.detach()
|
||||
if(that.parent.children('.overlay-widget').length == 0){
|
||||
that.parent.removeClass('blur')
|
||||
}
|
||||
that.trigger('close')
|
||||
})
|
||||
|
||||
// register a handler...
|
||||
} else {
|
||||
this.on('close', handler)
|
||||
}
|
||||
},
|
||||
|
||||
__init__: function(parent, client, options){
|
||||
var that = this
|
||||
parent = this.parent = $(parent || 'body')
|
||||
options = options || {}
|
||||
|
||||
this.client = client
|
||||
var client_dom = client.dom || client
|
||||
|
||||
// merge options...
|
||||
var opts = Object.create(this.options)
|
||||
Object.keys(options).forEach(function(n){ opts[n] = options[n] })
|
||||
options = this.options = opts
|
||||
|
||||
var dom = this.dom = this.constructor.make(client_dom, options)
|
||||
.click(function(){
|
||||
that.close()
|
||||
})
|
||||
|
||||
parent
|
||||
.addClass('blur')
|
||||
.append(dom)
|
||||
|
||||
// add keyboard handler...
|
||||
dom.keydown(
|
||||
keyboard.makeKeyboardHandler(
|
||||
this.keyboard,
|
||||
options.logKeys,
|
||||
this))
|
||||
.css({opacity: 0})
|
||||
.animate({
|
||||
scrollTop: Math.min(
|
||||
client_dom.outerHeight(),
|
||||
// do not scroll more than the container height and
|
||||
// keep a bit on top...
|
||||
(parent.is('body') ? $(document) : parent).outerHeight()-100)+'px',
|
||||
opacity: 1,
|
||||
},
|
||||
120,
|
||||
function(){
|
||||
dom.scroll(function(){
|
||||
var st = $(this).scrollTop()
|
||||
var h = Math.min(100, client_dom.outerHeight())
|
||||
// start fading...
|
||||
if(st < h){
|
||||
dom.css({ opacity: Math.min(1, st/h) })
|
||||
} else if(dom.css('opacity') < 1){
|
||||
dom.css('opacity', 1)
|
||||
}
|
||||
// close drawer when scrolling to the top...
|
||||
if(st < 10){
|
||||
that.close()
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
// focus the client...
|
||||
if(client.focus){
|
||||
client.focus()
|
||||
}
|
||||
|
||||
return this
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
var Overlay =
|
||||
module.Overlay =
|
||||
object.makeConstructor('Drawer',
|
||||
OverlayClassPrototype,
|
||||
OverlayPrototype)
|
||||
|
||||
|
||||
|
||||
/**********************************************************************
|
||||
* vim:set ts=4 sw=4 : */
|
||||
return module })
|
||||
Loading…
x
Reference in New Issue
Block a user