summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2014-01-05 15:45:43 +0100
committerThomas Bruederli <thomas@roundcube.net>2014-01-05 15:45:43 +0100
commit72975e14970ec4eeac927b80754ee3a5c6ada58e (patch)
treee6cf0a6d5123a01f9cf06aaf678cf66307d8c723
parent81297785e1e0cd0cfb5bbee2e44a3e6da3c363dd (diff)
Move folder/directory list auto-scrolling functionality to treelist widget (same as auto-expand) and make it work without list header/footer blocks
-rw-r--r--program/js/treelist.js60
-rw-r--r--skins/classic/functions.js5
-rw-r--r--skins/larry/mail.css6
-rw-r--r--skins/larry/templates/mail.html1
-rw-r--r--skins/larry/ui.js4
5 files changed, 58 insertions, 18 deletions
diff --git a/program/js/treelist.js b/program/js/treelist.js
index 5913f44b4..d940e396c 100644
--- a/program/js/treelist.js
+++ b/program/js/treelist.js
@@ -28,6 +28,9 @@ function rcube_treelist_widget(node, p)
id_prefix: '',
autoexpand: 1000,
selectable: false,
+ scroll_delay: 500,
+ scroll_step: 5,
+ scroll_speed: 20,
check_droptarget: function(node){ return !node.virtual }
}, p || {});
@@ -42,6 +45,7 @@ function rcube_treelist_widget(node, p)
autoexpand_item,
body_scroll_top = 0,
list_scroll_top = 0,
+ scroll_timer,
me = this;
@@ -461,6 +465,7 @@ function rcube_treelist_widget(node, p)
body_scroll_top = bw.ie ? 0 : window.pageYOffset;
list_scroll_top = container.parent().scrollTop();
+ pos.top += list_scroll_top;
drag_active = true;
box_coords = {
@@ -476,6 +481,7 @@ function rcube_treelist_widget(node, p)
item = li.children().first().get(0);
if (height = item.offsetHeight) {
pos = $(item).offset();
+ pos.top += list_scroll_top;
item_coords[id] = {
x1: pos.left,
y1: pos.top,
@@ -485,6 +491,38 @@ function rcube_treelist_widget(node, p)
};
}
}
+
+ // enable auto-scrolling of list container
+ if (container.height() > container.parent().height()) {
+ container.parent()
+ .mousemove(function(e) {
+ var scroll = 0,
+ mouse = rcube_event.get_mouse_pos(e);
+ mouse.y -= container.parent().offset().top;
+
+ if (mouse.y < 25 && list_scroll_top > 0) {
+ scroll = -1; // up
+ }
+ else if (mouse.y > container.parent().height() - 25) {
+ scroll = 1; // down
+ }
+
+ if (drag_active && scroll != 0) {
+ if (!scroll_timer)
+ scroll_timer = window.setTimeout(function(){ drag_scroll(scroll); }, p.scroll_delay);
+ }
+ else if (scroll_timer) {
+ window.clearTimeout(scroll_timer);
+ scroll_timer = null;
+ }
+ })
+ .mouseleave(function() {
+ if (scroll_timer) {
+ window.clearTimeout(scroll_timer);
+ scroll_timer = null;
+ }
+ });
+ }
}
/**
@@ -493,6 +531,7 @@ function rcube_treelist_widget(node, p)
function drag_end()
{
drag_active = false;
+ scroll_timer = null;
if (autoexpand_timer) {
clearTimeout(autoexpand_timer);
@@ -504,16 +543,33 @@ function rcube_treelist_widget(node, p)
}
/**
+ * Scroll list container in the given direction
+ */
+ function drag_scroll(dir)
+ {
+ if (!drag_active)
+ return;
+
+ var old_top = list_scroll_top;
+ container.parent().get(0).scrollTop += p.scroll_step * dir;
+ list_scroll_top = container.parent().scrollTop();
+ scroll_timer = null;
+
+ if (list_scroll_top != old_top)
+ scroll_timer = window.setTimeout(function(){ drag_scroll(dir); }, p.scroll_speed);
+ }
+
+ /**
* Determine if the given mouse coords intersect the list and one if its items
*/
function intersects(mouse, highlight)
{
// offsets to compensate for scrolling while dragging a message
var boffset = bw.ie ? -document.documentElement.scrollTop : body_scroll_top,
- moffset = list_scroll_top - container.parent().scrollTop(),
+ moffset = container.parent().scrollTop(),
result = null;
- mouse.top = mouse.y + -moffset - boffset;
+ mouse.top = mouse.y + moffset - boffset;
// no intersection with list bounding box
if (mouse.x < box_coords.x1 || mouse.x >= box_coords.x2 || mouse.top < box_coords.y1 || mouse.top >= box_coords.y2) {
diff --git a/skins/classic/functions.js b/skins/classic/functions.js
index 4312d57bc..049e4d5d4 100644
--- a/skins/classic/functions.js
+++ b/skins/classic/functions.js
@@ -976,8 +976,6 @@ function rcube_init_mail_ui()
rcmail.addEventListener('responseaftercheck-recent', rcube_render_mailboxlist);
rcmail.addEventListener('responseafterrefresh', rcube_render_mailboxlist);
rcmail.addEventListener('afterimport-messages', function(){ rcmail_ui.show_popup('uploadform', false); });
-
- new rcmail_scroller('#mailboxlist-content', '#mailboxlist-title', '#mailboxlist-footer');
}
if (rcmail.env.action == 'compose')
@@ -991,9 +989,6 @@ function rcube_init_mail_ui()
else if (rcmail.env.task == 'addressbook') {
rcmail.addEventListener('afterupload-photo', function(){ rcmail_ui.show_popup('uploadform', false); });
- if (rcmail.gui_objects.folderlist)
- new rcmail_scroller('#directorylist-content', '#directorylist-title', '#directorylist-footer');
-
rcmail.gui_object('dragmenu', 'dragmenu');
}
else if (rcmail.env.task == 'settings') {
diff --git a/skins/larry/mail.css b/skins/larry/mail.css
index d3b09c087..8e6e78e77 100644
--- a/skins/larry/mail.css
+++ b/skins/larry/mail.css
@@ -55,12 +55,6 @@
border-radius: 0 0 4px 4px;
}
-#folderlist-header {
- width: 100%;
- height: 12px;
- top: 32px;
-}
-
#mailboxcontainer,
#messagelistcontainer {
position: absolute;
diff --git a/skins/larry/templates/mail.html b/skins/larry/templates/mail.html
index 8f19b9f7f..ff5f7549c 100644
--- a/skins/larry/templates/mail.html
+++ b/skins/larry/templates/mail.html
@@ -27,7 +27,6 @@
<div id="mailview-left">
<!-- folders list -->
-<div id="folderlist-header"></div>
<div id="mailboxcontainer" class="uibox listbox">
<div id="folderlist-content" class="scroller withfooter">
<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" />
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index add691054..44fc727f6 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -216,8 +216,6 @@ function rcube_mail_ui()
if (previewframe)
mailviewsplit.init();
- new rcube_scroller('#folderlist-content', '#folderlist-header', '#folderlist-footer');
-
rcmail.addEventListener('setquota', update_quota)
.addEventListener('enable-command', enable_command)
.addEventListener('afterimport-messages', show_uploadform);
@@ -284,8 +282,6 @@ function rcube_mail_ui()
orientation:'v', relative:true, start:226, min:150, size:12, render:resize_leftcol }).init();
new rcube_splitter({ id:'addressviewsplitter', p1:'#addresslist', p2:'#contacts-box',
orientation:'v', relative:true, start:286, min:270, size:12 }).init();
-
- new rcube_scroller('#directorylist-content', '#directorylist-header', '#directorylist-footer');
}
var dragmenu = $('#dragcontactmenu');