diff --git a/resources/library/interactivities/Contraste.wgt/css/basic.css b/resources/library/interactivities/Contraste.wgt/css/basic.css index 451e6ce0..64323d60 100644 --- a/resources/library/interactivities/Contraste.wgt/css/basic.css +++ b/resources/library/interactivities/Contraste.wgt/css/basic.css @@ -144,9 +144,13 @@ body{ font-family: Verdana,Arial,Helvetica,sans-serif; font-weight: bold; font-size:24px; + word-wrap: break-word; } .editContainer{ + min-width: 200px; + max-width: 240px; + height: auto; position: absolute; border: 5px solid #c7c7c7; -webkit-border-radius: 5px; diff --git a/resources/library/interactivities/Contraste.wgt/locales/fr/scripts/blackYellow.js b/resources/library/interactivities/Contraste.wgt/locales/fr/scripts/blackYellow.js index 7cfdea27..34de0859 100644 --- a/resources/library/interactivities/Contraste.wgt/locales/fr/scripts/blackYellow.js +++ b/resources/library/interactivities/Contraste.wgt/locales/fr/scripts/blackYellow.js @@ -81,16 +81,19 @@ function init(){ .css("top",importArray[i].top) .css("left",importArray[i].left); tmpReadyTask.appendTo("#data"); - } - $(document).disableTextSelect(); - } + } + } + $(document).disableTextSelect(); } /* ------------- BUTTONS -------------*/ - if(sankore.preference("by_style","")){ - changeStyle(sankore.preference("by_style","")); - $(".style_select").val(sankore.preference("by_style","")); + if(window.sankore){ + if(sankore.preference("by_style","")){ + changeStyle(sankore.preference("by_style","")); + $(".style_select").val(sankore.preference("by_style","")); + } else + changeStyle("3") } else changeStyle("3") @@ -106,7 +109,7 @@ function init(){ mode = false; $(".leftDiv, .rightDiv").animate({ "opacity":"1" - },"slow",function(){ + },"fast",function(){ if(opacityChanged){ if($(".editContainer").size() != 0){ $(".editContainer").each(function(index, domElem){ @@ -139,14 +142,17 @@ function init(){ $(document).enableTextSelect(); $(".leftDiv, .rightDiv").animate({ "opacity":"0.4" - },"slow",function(){ + },"fast",function(){ if(!opacityChanged){ if($(".readyTask").size() != 0){ + var tmp_arr = []; + $(".readyTask").each(function(){ + tmp_arr.push($(this)); + }) + orderItems(tmp_arr); $(".readyTask").each(function(index, domElem){ var editContent = $("
").width($(domElem).width() + 10).height($(domElem) + 10).appendTo("#data"); var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); editContent.css("top", $(domElem).position().top).css("left", $(domElem).position().left); $(domElem).css("position","static") .width("100%") @@ -161,7 +167,7 @@ function init(){ } } }); - + $("#wgt_help").click(function(){ var tmp = $(this); if($(this).hasClass("open")){ @@ -178,7 +184,7 @@ function init(){ }); $("#wgt_reload").click(function(){ - window.location.reload(); + reloadItems(); }); $("#wgt_add").click(function(){ @@ -188,10 +194,9 @@ function init(){ $("#data").show(); }); } - shadowDiv.show() + shadowDiv.show(); shadowOver = true; - popupBack.show("slow"); - + popupBack.show("slow"); $(document).disableTextSelect(); }); @@ -241,7 +246,6 @@ function init(){ shadowOver = false; $(document).enableTextSelect(); }); - }); okButton.click(function(){ @@ -256,7 +260,6 @@ function init(){ $(document).enableTextSelect(); }) } - }); /* -------------- THE END OF WORK WITH POPUP BUTTONS AND FIELDS ---------------*/ @@ -271,42 +274,33 @@ function init(){ }); $(".readyTask, .editContainer").live("mousedown",function(event){ - if(!shadowOver){ - dragElement = $(this); - coords.left = event.pageX - $(this).position().left; - coords.top = event.pageY - $(this).position().top; - resizeObj.width = $(this).width(); - resizeObj.height = $(this).height(); - } - if($("#wgt_display").hasClass("selected")) + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + dragElement = $(this); + coords.left = event.pageX - $(this).position().left; + coords.top = event.pageY - $(this).position().top; + resizeObj.width = $(this).width(); + resizeObj.height = $(this).height(); + } $(document).disableTextSelect(); - }); - - $(".rightResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.x = true; - } - }); - - $(".bottomResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.y = true; } }); $("body").mouseup(function(event){ - if(!shadowOver){ - if (dragElement) { - exportToSankore(); + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + if (dragElement) { + exportToSankore(); + } + dragElement = null; + resizeObj.x = false; + resizeObj.y = false; } - dragElement = null; - resizeObj.x = false; - resizeObj.y = false; } }); $("body").mousemove(function(event){ - if(dragElement && !shadowOver){ + if(dragElement && !shadowOver && $("#wgt_display").hasClass("selected")){ var top = event.pageY - coords.top; var left = event.pageX - coords.left; var bottom = top + dragElement.height(); @@ -335,6 +329,36 @@ function init(){ } }); + $(".taskContainer").live("keyup", function(){ + if($(".editContainer").size() > 1){ + var prev = $(".editContainer:first"), + prevBottom = prev.position().top + prev.height(), + prevLeft = prev.position().left; + recursionCall(prevBottom, prevLeft, prev.next()); + } + }) + + function recursionCall(prevBottom, prevLeft, curr){ + var curTop = curr.position().top, + curHeight = curr.height(), + curLeft = curr.position().left; + if(prevLeft == curLeft){ + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px"); + else + curr.css("top", "60px").css("left", prevLeft + 255 + "px"); + } else { + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px").css("left", prevLeft + "px"); + else + curr.css("top", "60px"); + } + prevBottom = curr.position().top + curr.height(), + prevLeft = curr.position().left; + if(curr.next().length) + recursionCall(prevBottom, prevLeft, curr.next()); + } + //$("#leftDiv,#rightDiv,#shadowDiv").css("height", $(window).height()); popupBack.css("top", ($(window).height() - 138)*50/$(window).height() + "%"); popupBack.css("left", ($(window).width() - 360)*50/$(window).width() + "%"); @@ -347,7 +371,7 @@ function init(){ if (window.widget) { window.widget.onleave = function(){ - //exportToSankore(); + exportToSankore(); sankore.setPreference("by_style", $(".style_select").find("option:selected").val()); } } @@ -397,7 +421,8 @@ function init(){ }); } } - sankore.setPreference("blackYellowData", JSON.stringify(arrayToExport)); + if(window.sankore) + sankore.setPreference("blackYellowData", JSON.stringify(arrayToExport)); } } @@ -412,18 +437,70 @@ function checkEmptyFields(field){ } } +//reload +function reloadItems(){ + if($("#wgt_edit").hasClass("selected")) + $("#wgt_display").trigger("click"); + else{ + var tmp_array = []; + $(".readyTask").each(function(){ + tmp_array.push($(this)); + }); + tmp_array = shuffle(tmp_array); + orderItems(tmp_array); + } + +} + +//order items +function orderItems(items){ + var bottom = 45, + lastItemLeft = 54; + for (var i in items){ + if((bottom + items[i].height()) < ($(window).height() - 54)){ + items[i].css("top", bottom + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height() + 15; + } else { + bottom = 60; + lastItemLeft += 255; + items[i].css("top", bottom + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height(); + } + } +} + +//shuffles an array +function shuffle( arr ) +{ + var pos, tmp; + for( var i = 0; i < arr.length; i++ ) + { + pos = Math.round( Math.random() * ( arr.length - 1 ) ); + tmp = arr[pos]; + arr[pos] = arr[i]; + arr[i] = tmp; + } + return arr; +} + //adding a new task to the page function addTask(expression, result){ var lastItem = $(".editContainer:last"), lastItemPos = lastItem.length ? lastItem.position().top : 45, - lastItemHeight = lastItem.length ? lastItem.height() : 0; - var editContent = $("
").width(240).height(70).css("top", lastItemPos + lastItemHeight + 15 + "px").appendTo("#data"); - var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); + lastItemHeight = lastItem.length ? lastItem.height() : 0, + lastItemLeft = lastItem.length ? lastItem.position().left : 54; + var bottom = lastItemPos + lastItemHeight + 85; + var editContent = $("
"); + $("
").appendTo(editContent); var main = $("
"); - var exprContainer = $("
" + expression + "
").appendTo(main); - var resContainer = $("
"+ result + "
").appendTo(main); + $("
" + expression + "
").appendTo(main); + $("
"+ result + "
").appendTo(main); + if(bottom < ($(window).height() - 54)){ + editContent.css("top", lastItemPos + lastItemHeight + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + } else { + lastItemPos = 45; + editContent.css("top", lastItemPos + 15 + "px").css("left", lastItemLeft + 255 + "px").appendTo("#data"); + } main.appendTo(editContent); } diff --git a/resources/library/interactivities/Contraste.wgt/locales/ru/scripts/blackYellow.js b/resources/library/interactivities/Contraste.wgt/locales/ru/scripts/blackYellow.js index ab7ad61a..fce0a9af 100644 --- a/resources/library/interactivities/Contraste.wgt/locales/ru/scripts/blackYellow.js +++ b/resources/library/interactivities/Contraste.wgt/locales/ru/scripts/blackYellow.js @@ -88,9 +88,12 @@ function init(){ /* ------------- BUTTONS -------------*/ - if(sankore.preference("by_style","")){ - changeStyle(sankore.preference("by_style","")); - $(".style_select").val(sankore.preference("by_style","")); + if(window.sankore){ + if(sankore.preference("by_style","")){ + changeStyle(sankore.preference("by_style","")); + $(".style_select").val(sankore.preference("by_style","")); + } else + changeStyle("3") } else changeStyle("3") @@ -106,7 +109,7 @@ function init(){ mode = false; $(".leftDiv, .rightDiv").animate({ "opacity":"1" - },"slow",function(){ + },"fast",function(){ if(opacityChanged){ if($(".editContainer").size() != 0){ $(".editContainer").each(function(index, domElem){ @@ -139,14 +142,17 @@ function init(){ $(document).enableTextSelect(); $(".leftDiv, .rightDiv").animate({ "opacity":"0.4" - },"slow",function(){ + },"fast",function(){ if(!opacityChanged){ if($(".readyTask").size() != 0){ + var tmp_arr = []; + $(".readyTask").each(function(){ + tmp_arr.push($(this)); + }) + orderItems(tmp_arr); $(".readyTask").each(function(index, domElem){ var editContent = $("
").width($(domElem).width() + 10).height($(domElem) + 10).appendTo("#data"); var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); editContent.css("top", $(domElem).position().top).css("left", $(domElem).position().left); $(domElem).css("position","static") .width("100%") @@ -161,7 +167,7 @@ function init(){ } } }); - + $("#wgt_help").click(function(){ var tmp = $(this); if($(this).hasClass("open")){ @@ -178,7 +184,7 @@ function init(){ }); $("#wgt_reload").click(function(){ - window.location.reload(); + reloadItems(); }); $("#wgt_add").click(function(){ @@ -188,10 +194,9 @@ function init(){ $("#data").show(); }); } - shadowDiv.show() + shadowDiv.show(); shadowOver = true; - popupBack.show("slow"); - + popupBack.show("slow"); $(document).disableTextSelect(); }); @@ -241,7 +246,6 @@ function init(){ shadowOver = false; $(document).enableTextSelect(); }); - }); okButton.click(function(){ @@ -256,7 +260,6 @@ function init(){ $(document).enableTextSelect(); }) } - }); /* -------------- THE END OF WORK WITH POPUP BUTTONS AND FIELDS ---------------*/ @@ -271,42 +274,33 @@ function init(){ }); $(".readyTask, .editContainer").live("mousedown",function(event){ - if(!shadowOver){ - dragElement = $(this); - coords.left = event.pageX - $(this).position().left; - coords.top = event.pageY - $(this).position().top; - resizeObj.width = $(this).width(); - resizeObj.height = $(this).height(); - } - if($("#wgt_display").hasClass("selected")) + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + dragElement = $(this); + coords.left = event.pageX - $(this).position().left; + coords.top = event.pageY - $(this).position().top; + resizeObj.width = $(this).width(); + resizeObj.height = $(this).height(); + } $(document).disableTextSelect(); - }); - - $(".rightResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.x = true; - } - }); - - $(".bottomResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.y = true; } }); $("body").mouseup(function(event){ - if(!shadowOver){ - if (dragElement) { - exportToSankore(); + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + if (dragElement) { + exportToSankore(); + } + dragElement = null; + resizeObj.x = false; + resizeObj.y = false; } - dragElement = null; - resizeObj.x = false; - resizeObj.y = false; } }); $("body").mousemove(function(event){ - if(dragElement && !shadowOver){ + if(dragElement && !shadowOver && $("#wgt_display").hasClass("selected")){ var top = event.pageY - coords.top; var left = event.pageX - coords.left; var bottom = top + dragElement.height(); @@ -335,6 +329,36 @@ function init(){ } }); + $(".taskContainer").live("keyup", function(){ + if($(".editContainer").size() > 1){ + var prev = $(".editContainer:first"), + prevBottom = prev.position().top + prev.height(), + prevLeft = prev.position().left; + recursionCall(prevBottom, prevLeft, prev.next()); + } + }) + + function recursionCall(prevBottom, prevLeft, curr){ + var curTop = curr.position().top, + curHeight = curr.height(), + curLeft = curr.position().left; + if(prevLeft == curLeft){ + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px"); + else + curr.css("top", "60px").css("left", prevLeft + 255 + "px"); + } else { + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px").css("left", prevLeft + "px"); + else + curr.css("top", "60px"); + } + prevBottom = curr.position().top + curr.height(), + prevLeft = curr.position().left; + if(curr.next().length) + recursionCall(prevBottom, prevLeft, curr.next()); + } + //$("#leftDiv,#rightDiv,#shadowDiv").css("height", $(window).height()); popupBack.css("top", ($(window).height() - 138)*50/$(window).height() + "%"); popupBack.css("left", ($(window).width() - 360)*50/$(window).width() + "%"); @@ -347,7 +371,7 @@ function init(){ if (window.widget) { window.widget.onleave = function(){ - //exportToSankore(); + exportToSankore(); sankore.setPreference("by_style", $(".style_select").find("option:selected").val()); } } @@ -397,7 +421,8 @@ function init(){ }); } } - sankore.setPreference("blackYellowData", JSON.stringify(arrayToExport)); + if(window.sankore) + sankore.setPreference("blackYellowData", JSON.stringify(arrayToExport)); } } @@ -412,18 +437,70 @@ function checkEmptyFields(field){ } } +//reload +function reloadItems(){ + if($("#wgt_edit").hasClass("selected")) + $("#wgt_display").trigger("click"); + else{ + var tmp_array = []; + $(".readyTask").each(function(){ + tmp_array.push($(this)); + }); + tmp_array = shuffle(tmp_array); + orderItems(tmp_array); + } + +} + +//order items +function orderItems(items){ + var bottom = 45, + lastItemLeft = 54; + for (var i in items){ + if((bottom + items[i].height()) < ($(window).height() - 54)){ + items[i].css("top", bottom + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height() + 15; + } else { + bottom = 60; + lastItemLeft += 255; + items[i].css("top", bottom + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height(); + } + } +} + +//shuffles an array +function shuffle( arr ) +{ + var pos, tmp; + for( var i = 0; i < arr.length; i++ ) + { + pos = Math.round( Math.random() * ( arr.length - 1 ) ); + tmp = arr[pos]; + arr[pos] = arr[i]; + arr[i] = tmp; + } + return arr; +} + //adding a new task to the page function addTask(expression, result){ var lastItem = $(".editContainer:last"), lastItemPos = lastItem.length ? lastItem.position().top : 45, - lastItemHeight = lastItem.length ? lastItem.height() : 0; - var editContent = $("
").width(240).height(70).css("top", lastItemPos + lastItemHeight + 15 + "px").appendTo("#data"); - var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); + lastItemHeight = lastItem.length ? lastItem.height() : 0, + lastItemLeft = lastItem.length ? lastItem.position().left : 54; + var bottom = lastItemPos + lastItemHeight + 85; + var editContent = $("
"); + $("
").appendTo(editContent); var main = $("
"); - var exprContainer = $("
" + expression + "
").appendTo(main); - var resContainer = $("
"+ result + "
").appendTo(main); + $("
" + expression + "
").appendTo(main); + $("
"+ result + "
").appendTo(main); + if(bottom < ($(window).height() - 54)){ + editContent.css("top", lastItemPos + lastItemHeight + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + } else { + lastItemPos = 45; + editContent.css("top", lastItemPos + 15 + "px").css("left", lastItemLeft + 255 + "px").appendTo("#data"); + } main.appendTo(editContent); } diff --git a/resources/library/interactivities/Contraste.wgt/scripts/blackYellow.js b/resources/library/interactivities/Contraste.wgt/scripts/blackYellow.js index 33687d4d..27035aaf 100644 --- a/resources/library/interactivities/Contraste.wgt/scripts/blackYellow.js +++ b/resources/library/interactivities/Contraste.wgt/scripts/blackYellow.js @@ -109,7 +109,7 @@ function init(){ mode = false; $(".leftDiv, .rightDiv").animate({ "opacity":"1" - },"slow",function(){ + },"fast",function(){ if(opacityChanged){ if($(".editContainer").size() != 0){ $(".editContainer").each(function(index, domElem){ @@ -142,14 +142,17 @@ function init(){ $(document).enableTextSelect(); $(".leftDiv, .rightDiv").animate({ "opacity":"0.4" - },"slow",function(){ + },"fast",function(){ if(!opacityChanged){ if($(".readyTask").size() != 0){ + var tmp_arr = []; + $(".readyTask").each(function(){ + tmp_arr.push($(this)); + }) + orderItems(tmp_arr); $(".readyTask").each(function(index, domElem){ var editContent = $("
").width($(domElem).width() + 10).height($(domElem) + 10).appendTo("#data"); var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); editContent.css("top", $(domElem).position().top).css("left", $(domElem).position().left); $(domElem).css("position","static") .width("100%") @@ -181,7 +184,7 @@ function init(){ }); $("#wgt_reload").click(function(){ - window.location.reload(); + reloadItems(); }); $("#wgt_add").click(function(){ @@ -271,42 +274,33 @@ function init(){ }); $(".readyTask, .editContainer").live("mousedown",function(event){ - if(!shadowOver){ - dragElement = $(this); - coords.left = event.pageX - $(this).position().left; - coords.top = event.pageY - $(this).position().top; - resizeObj.width = $(this).width(); - resizeObj.height = $(this).height(); - } - if($("#wgt_display").hasClass("selected")) + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + dragElement = $(this); + coords.left = event.pageX - $(this).position().left; + coords.top = event.pageY - $(this).position().top; + resizeObj.width = $(this).width(); + resizeObj.height = $(this).height(); + } $(document).disableTextSelect(); - }); - - $(".rightResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.x = true; - } - }); - - $(".bottomResize").live("mousedown",function(event){ - if(!shadowOver){ - resizeObj.y = true; } }); $("body").mouseup(function(event){ - if(!shadowOver){ - if (dragElement) { - exportToSankore(); + if($("#wgt_display").hasClass("selected")){ + if(!shadowOver){ + if (dragElement) { + exportToSankore(); + } + dragElement = null; + resizeObj.x = false; + resizeObj.y = false; } - dragElement = null; - resizeObj.x = false; - resizeObj.y = false; } }); $("body").mousemove(function(event){ - if(dragElement && !shadowOver){ + if(dragElement && !shadowOver && $("#wgt_display").hasClass("selected")){ var top = event.pageY - coords.top; var left = event.pageX - coords.left; var bottom = top + dragElement.height(); @@ -335,6 +329,36 @@ function init(){ } }); + $(".taskContainer").live("keyup", function(){ + if($(".editContainer").size() > 1){ + var prev = $(".editContainer:first"), + prevBottom = prev.position().top + prev.height(), + prevLeft = prev.position().left; + recursionCall(prevBottom, prevLeft, prev.next()); + } + }) + + function recursionCall(prevBottom, prevLeft, curr){ + var curTop = curr.position().top, + curHeight = curr.height(), + curLeft = curr.position().left; + if(prevLeft == curLeft){ + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px"); + else + curr.css("top", "60px").css("left", prevLeft + 255 + "px"); + } else { + if((prevBottom + 15 + curHeight) < ($(window).height() - 54)) + curr.css("top", prevBottom + 15 + "px").css("left", prevLeft + "px"); + else + curr.css("top", "60px"); + } + prevBottom = curr.position().top + curr.height(), + prevLeft = curr.position().left; + if(curr.next().length) + recursionCall(prevBottom, prevLeft, curr.next()); + } + //$("#leftDiv,#rightDiv,#shadowDiv").css("height", $(window).height()); popupBack.css("top", ($(window).height() - 138)*50/$(window).height() + "%"); popupBack.css("left", ($(window).width() - 360)*50/$(window).width() + "%"); @@ -347,7 +371,7 @@ function init(){ if (window.widget) { window.widget.onleave = function(){ - //exportToSankore(); + exportToSankore(); sankore.setPreference("by_style", $(".style_select").find("option:selected").val()); } } @@ -413,18 +437,70 @@ function checkEmptyFields(field){ } } +//reload +function reloadItems(){ + if($("#wgt_edit").hasClass("selected")) + $("#wgt_display").trigger("click"); + else{ + var tmp_array = []; + $(".readyTask").each(function(){ + tmp_array.push($(this)); + }); + tmp_array = shuffle(tmp_array); + orderItems(tmp_array); + } + +} + +//order items +function orderItems(items){ + var bottom = 45, + lastItemLeft = 54; + for (var i in items){ + if((bottom + items[i].height()) < ($(window).height() - 54)){ + items[i].css("top", bottom + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height() + 15; + } else { + bottom = 60; + lastItemLeft += 255; + items[i].css("top", bottom + "px").css("left", lastItemLeft + "px").appendTo("#data"); + bottom += items[i].height(); + } + } +} + +//shuffles an array +function shuffle( arr ) +{ + var pos, tmp; + for( var i = 0; i < arr.length; i++ ) + { + pos = Math.round( Math.random() * ( arr.length - 1 ) ); + tmp = arr[pos]; + arr[pos] = arr[i]; + arr[i] = tmp; + } + return arr; +} + //adding a new task to the page function addTask(expression, result){ var lastItem = $(".editContainer:last"), lastItemPos = lastItem.length ? lastItem.position().top : 45, - lastItemHeight = lastItem.length ? lastItem.height() : 0; - var editContent = $("
").width(240).height(70).css("top", lastItemPos + lastItemHeight + 15 + "px").appendTo("#data"); - var closeItem = $("
").appendTo(editContent); - var rightResize = $("
").appendTo(editContent); - var bottomResize = $("
").appendTo(editContent); + lastItemHeight = lastItem.length ? lastItem.height() : 0, + lastItemLeft = lastItem.length ? lastItem.position().left : 54; + var bottom = lastItemPos + lastItemHeight + 85; + var editContent = $("
"); + $("
").appendTo(editContent); var main = $("
"); - var exprContainer = $("
" + expression + "
").appendTo(main); - var resContainer = $("
"+ result + "
").appendTo(main); + $("
" + expression + "
").appendTo(main); + $("
"+ result + "
").appendTo(main); + if(bottom < ($(window).height() - 54)){ + editContent.css("top", lastItemPos + lastItemHeight + 15 + "px").css("left", lastItemLeft + "px").appendTo("#data"); + } else { + lastItemPos = 45; + editContent.css("top", lastItemPos + 15 + "px").css("left", lastItemLeft + 255 + "px").appendTo("#data"); + } main.appendTo(editContent); } diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp index d5a383df..713f015c 100644 --- a/src/board/UBBoardController.cpp +++ b/src/board/UBBoardController.cpp @@ -54,6 +54,8 @@ #include "domain/UBGraphicsGroupContainerItem.h" #include "domain/UBItem.h" #include "board/UBFeaturesController.h" +#include "domain/UBGraphicsStrokesGroup.h" + #include "gui/UBFeaturesWidget.h" #include "tools/UBToolsManager.h" @@ -158,7 +160,7 @@ void UBBoardController::setupViews() mControlLayout = new QHBoxLayout(mControlContainer); mControlLayout->setContentsMargins(0, 0, 0, 0); - mControlView = new UBBoardView(this, mControlContainer); + mControlView = new UBBoardView(this, mControlContainer, true); mControlView->setInteractive(true); mControlView->setMouseTracking(true); @@ -536,6 +538,8 @@ void UBBoardController::duplicateItem(UBItem *item) if (!item) return; + mLastCreatedItem = NULL; + QUrl sourceUrl; QByteArray pData; @@ -551,9 +555,13 @@ void UBBoardController::duplicateItem(UBItem *item) itemSize = commonItem->boundingRect().size(); } + UBMimeType::Enum itemMimeType; QString contentTypeHeader = UBFileSystemUtils::mimeTypeFromFileName(item->sourceUrl().toLocalFile()); - - UBMimeType::Enum itemMimeType = UBFileSystemUtils::mimeTypeFromString(contentTypeHeader); + if(NULL != qgraphicsitem_cast(commonItem)){ + itemMimeType = UBMimeType::Group; + }else{ + itemMimeType = UBFileSystemUtils::mimeTypeFromString(contentTypeHeader); + } switch(static_cast(itemMimeType)) { @@ -598,13 +606,37 @@ void UBBoardController::duplicateItem(UBItem *item) pixitem->pixmap().save(&buffer, format.toLatin1()); } }break; + + case UBMimeType::Group: + { + UBGraphicsGroupContainerItem* groupItem = dynamic_cast(item); + if(groupItem){ + QList children = groupItem->childItems(); + foreach(QGraphicsItem* pIt, children){ + UBItem* pItem = dynamic_cast(pIt); + if(NULL != pItem){ + duplicateItem(pItem); // The duplication already copies the item parameters + if(NULL != mLastCreatedItem){ + mLastCreatedItem->setSelected(true); + } + } + } + groupItem->setSelected(false); + UBApplication::mainWindow->actionGroupItems->trigger(); + } + return; + break; + } + case UBMimeType::UNKNOWN: { QGraphicsItem *gitem = dynamic_cast(item->deepCopy()); if (gitem) { + qDebug() << "Adding a stroke: " << gitem; mActiveScene->addItem(gitem); gitem->setPos(itemPos); + mLastCreatedItem = gitem; } return; }break; @@ -619,12 +651,13 @@ void UBBoardController::duplicateItem(UBItem *item) QGraphicsItem *createdGitem = dynamic_cast(createdItem); if (createdGitem) createdGitem->setPos(itemPos); - } + mLastCreatedItem = dynamic_cast(createdItem); + } } void UBBoardController::deleteScene(int nIndex) { - if (selectedDocument()->pageCount()>2) + if (selectedDocument()->pageCount()>=2) { QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); persistCurrentScene(); @@ -1466,12 +1499,13 @@ void UBBoardController::ClearUndoStack() while (itUniq.hasNext()) { QGraphicsItem* item = itUniq.next(); + UBGraphicsScene *scene = NULL; if (item->scene()) { - UBGraphicsScene *scene = dynamic_cast(item->scene()); - if(!scene) - { - mActiveScene->deleteItem(item); - } + scene = dynamic_cast(item->scene()); + } + if(!scene) + { + mActiveScene->deleteItem(item); } } diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h index 8f100c73..042ba24a 100644 --- a/src/board/UBBoardController.h +++ b/src/board/UBBoardController.h @@ -279,6 +279,7 @@ class UBBoardController : public UBDocumentContainer bool mCleanupDone; QMap > mActionTexts; bool mCacheWidgetIsEnabled; + QGraphicsItem* mLastCreatedItem; private slots: void stylusToolDoubleClicked(int tool); diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp index 4786c9d0..4fcca179 100644 --- a/src/board/UBBoardView.cpp +++ b/src/board/UBBoardView.cpp @@ -62,7 +62,7 @@ #include "core/memcheck.h" -UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent) +UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent, bool pIsControl) : QGraphicsView (pParent) , mController (pController) , mIsCreatingTextZone (false) @@ -72,6 +72,7 @@ UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent) , mLongPressInterval(1000) , mIsDragInProgress(false) , mMultipleSelectionIsEnabled(false) +, isControl(pIsControl) { init (); @@ -81,13 +82,14 @@ UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent) mLongPressTimer.setSingleShot(true); } -UBBoardView::UBBoardView (UBBoardController* pController, int pStartLayer, int pEndLayer, QWidget* pParent) +UBBoardView::UBBoardView (UBBoardController* pController, int pStartLayer, int pEndLayer, QWidget* pParent, bool pIscontrol) : QGraphicsView (pParent) , mController (pController) , suspendedMousePressEvent(NULL) , mLongPressInterval(1000) , mIsDragInProgress(false) , mMultipleSelectionIsEnabled(false) +, isControl(pIscontrol) { init (); @@ -124,6 +126,8 @@ void UBBoardView::init () setHorizontalScrollBarPolicy (Qt::ScrollBarAlwaysOff); setAcceptDrops (true); + setOptimizationFlag (QGraphicsView::IndirectPainting); // enable UBBoardView::drawItems filter + mTabletStylusIsPressed = false; mMouseButtonIsPressed = false; mPendingStylusReleaseEvent = false; @@ -532,11 +536,11 @@ bool UBBoardView::itemShouldBeMoved(QGraphicsItem *item) if (movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) return false; + if (movingItem->parentItem() && UBGraphicsGroupContainerItem::Type == movingItem->parentItem()->type() && !movingItem->isSelected() && movingItem->parentItem()->isSelected()) + return false; + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); - if (movingItem->parentItem() && !movingItem->isSelected() && movingItem->parentItem()->isSelected()) - return false; - switch(item->type()) { case UBGraphicsGroupContainerItem::Type: @@ -557,6 +561,7 @@ bool UBBoardView::itemShouldBeMoved(QGraphicsItem *item) case UBGraphicsTextItem::Type: return !item->isSelected(); } + return false; } @@ -566,24 +571,33 @@ QGraphicsItem* UBBoardView::determineItemToMove(QGraphicsItem *item) if(item) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); + + //W3C widgets should take mouse move events from play tool. if ((UBStylusTool::Play == currentTool) && (UBGraphicsW3CWidgetItem::Type == item->type())) return item; + // if item is in group if(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type()) { + // play tool should move groups by any element if (UBStylusTool::Play == currentTool && item->parentItem()->isSelected()) return item->parentItem(); - + + // groups should should be moved instead of strokes groups + if (UBGraphicsStrokesGroup::Type == item->type()) + return item->parentItem(); + + // selected groups should be moved by moving any element if (item->parentItem()->isSelected()) return item; - - + if (item->isSelected()) return NULL; return item->parentItem(); } + // items like polygons placed in two groups nested, so we need to recursive call. if(item->parentItem() && UBGraphicsStrokesGroup::Type == item->parentItem()->type()) return determineItemToMove(item->parentItem()); } @@ -595,14 +609,20 @@ void UBBoardView::handleItemMousePress(QMouseEvent *event) { mLastPressedMousePos = mapToScene(event->pos()); - - if (movingItem && QGraphicsSvgItem::Type != movingItem->type() - && UBGraphicsDelegateFrame::Type != movingItem->type() + // Determining item who will take mouse press event + //all other items will be deselected and if all item will be deselected, then + // wrong item can catch mouse press. because selected items placed on the top + QGraphicsItem *pressedItem = determineItemToMove(movingItem); + + if (movingItem + && !(movingItem->parentItem() && UBGraphicsGroupContainerItem::Type == movingItem->parentItem()->type()) + && QGraphicsSvgItem::Type != movingItem->type() + && UBGraphicsDelegateFrame::Type != movingItem->type() && !mMultipleSelectionIsEnabled) { foreach(QGraphicsItem *item, scene()->selectedItems()) { - if (item != movingItem) + if (item != pressedItem) { item->setSelected(false); } @@ -634,9 +654,10 @@ void UBBoardView::handleItemMousePress(QMouseEvent *event) void UBBoardView::handleItemMouseMove(QMouseEvent *event) { - if (movingItem) - movingItem = determineItemToMove(movingItem); + // determine item to move (maybee we need to move group of item or his parent. + movingItem = determineItemToMove(movingItem); + // items should be moved not every mouse move. if (movingItem && itemShouldBeMoved(movingItem) && (mMouseButtonIsPressed || mTabletStylusIsPressed)) { QPointF scenePos = mapToScene(event->pos()); @@ -662,6 +683,8 @@ void UBBoardView::handleItemMouseMove(QMouseEvent *event) mWidgetMoved = ((posAfterMove-posBeforeMove).manhattanLength() != 0); // a cludge for terminate moving of w3c widgets. + // in some cases w3c widgets catches mouse move and doesn't sends that events to web page, + // at simple - in google map widget - mouse move events doesn't comes to web page from rectangle of wearch bar on bottom right corner of widget. if (mWidgetMoved && UBGraphicsW3CWidgetItem::Type == movingItem->type()) movingItem->setPos(posBeforeMove); @@ -729,6 +752,11 @@ void UBBoardView::longPressEvent() void UBBoardView::mousePressEvent (QMouseEvent *event) { + if (!isControl) { + event->ignore(); + return; + } + mIsDragInProgress = false; if (isAbsurdPoint (event->pos ())) @@ -990,7 +1018,8 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) if (QGraphicsSvgItem::Type != movingItem->type() && UBGraphicsDelegateFrame::Type != movingItem->type() && UBToolWidget::Type != movingItem->type() && - QGraphicsWidget::Type != movingItem->type()) + QGraphicsWidget::Type != movingItem->type() && + !(movingItem->parentItem() && UBGraphicsW3CWidgetItem::Type == movingItem->type() && UBGraphicsGroupContainerItem::Type == movingItem->parentItem()->type())) { bReleaseIsNeed = false; if (movingItem->isSelected() && mMultipleSelectionIsEnabled) @@ -1405,3 +1434,13 @@ UBBoardView::setToolCursor (int tool) controlViewport->setCursor (UBResources::resources ()->penCursor); } } + + +bool UBBoardView::hasSelectedParents(QGraphicsItem * item) +{ + if (item->isSelected()) + return true; + if (item->parentItem()==NULL) + return false; + return hasSelectedParents(item->parentItem()); +} diff --git a/src/board/UBBoardView.h b/src/board/UBBoardView.h index 34cf7fc7..310ec2ec 100644 --- a/src/board/UBBoardView.h +++ b/src/board/UBBoardView.h @@ -31,8 +31,8 @@ class UBBoardView : public QGraphicsView public: - UBBoardView(UBBoardController* pController, QWidget* pParent = 0); - UBBoardView(UBBoardController* pController, int pStartLayer, int pEndLayer, QWidget* pParent = 0); + UBBoardView(UBBoardController* pController, QWidget* pParent = 0, bool pIsControl = false); + UBBoardView(UBBoardController* pController, int pStartLayer, int pEndLayer, QWidget* pParent = 0, bool pIscontrol = false); virtual ~UBBoardView(); UBGraphicsScene* scene(); @@ -147,6 +147,9 @@ class UBBoardView : public QGraphicsView bool mIsDragInProgress; bool mMultipleSelectionIsEnabled; + bool isControl; + + static bool hasSelectedParents(QGraphicsItem * item); private slots: diff --git a/src/core/UB.h b/src/core/UB.h index afc0f91e..02e2ba18 100644 --- a/src/core/UB.h +++ b/src/core/UB.h @@ -33,6 +33,7 @@ struct UBMimeType Flash, PDF, UniboardTool, + Group, UNKNOWN }; }; diff --git a/src/desktop/UBDesktopPalette.cpp b/src/desktop/UBDesktopPalette.cpp index 2ac196f9..2b3902b2 100644 --- a/src/desktop/UBDesktopPalette.cpp +++ b/src/desktop/UBDesktopPalette.cpp @@ -57,9 +57,7 @@ UBDesktopPalette::UBDesktopPalette(QWidget *parent) mShowHideAction->setCheckable(true); connect(mShowHideAction, SIGNAL(triggered(bool)), this, SLOT(showHideClick(bool))); -#ifndef Q_WS_X11 actions << mShowHideAction; -#endif setActions(actions); setButtonIconSize(QSize(42, 42)); diff --git a/src/domain/UBAbstractUndoCommand.h b/src/domain/UBAbstractUndoCommand.h index da451769..a0c3d187 100644 --- a/src/domain/UBAbstractUndoCommand.h +++ b/src/domain/UBAbstractUndoCommand.h @@ -32,7 +32,8 @@ class UBAbstractUndoCommand : public QUndoCommand undotype_GRAPHICITEMTRANSFORM = 2, undotype_GRAPHICITEM = 3, undotype_GRAPHICTEXTITEM = 4, - undotype_PAGESIZE = 5 + undotype_PAGESIZE = 5, + undotype_GRAPHICSGROUPITEM = 6 }; virtual UndoType getType() { return undotype_UNKNOWN; } diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp index e2181020..a2da072a 100644 --- a/src/domain/UBGraphicsDelegateFrame.cpp +++ b/src/domain/UBGraphicsDelegateFrame.cpp @@ -228,6 +228,9 @@ void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event) mCurrentTool = toolFromPos(event->pos()); setCursorFromAngle(QString("")); event->accept(); + + prepareFramesToMove(getLinkedFrames()); + } void UBGraphicsDelegateFrame::setCursorFromAngle(QString angle) @@ -469,33 +472,25 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { mTranslateX = move.dx(); mTranslateY = move.dy(); + moveLinkedItems(move); } QTransform tr = buildTransform(); - //TODO UB 4.x: Could find a better solution ? if (resizingRight() || resizingBottom() || resizingBottomRight()) { QPointF ref; - if(!mMirrorX && !mMirrorY){ - ref = delegated()->boundingRect().topLeft(); - }else if(mMirrorX && !mMirrorY){ - ref = delegated()->boundingRect().topLeft(); - }else if(!mMirrorX && mMirrorY){ - ref = delegated()->boundingRect().topLeft(); - }else if(mMirrorX && mMirrorY){ - ref = delegated()->boundingRect().topRight(); - } - // Map the item topleft point to the current mouse move transform - QPointF topLeft = tr.map(ref); - - // Map the item topleft point to the mouse press transform - QPointF fixedPoint = mInitialTransform.map(ref); + // we just detects coordinates of corner before and after scaling and then moves object at diff between them. + if (resizingBottomRight() && mMirrorX) + mTranslateX += mInitialTransform.map(delegated()->boundingRect().bottomRight()).x() - tr.map(delegated()->boundingRect().bottomRight()).x(); + else + mTranslateX += mInitialTransform.map(delegated()->boundingRect().topLeft()).x() - tr.map(delegated()->boundingRect().topLeft()).x(); - // Update the translation coordinates - mTranslateX += fixedPoint.x() - topLeft.x(); - mTranslateY += fixedPoint.y() - topLeft.y(); + if (resizingBottomRight() && mMirrorY) + mTranslateY += mInitialTransform.map(delegated()->boundingRect().bottomRight()).y() - tr.map(delegated()->boundingRect().bottomRight()).y(); + else + mTranslateY += mInitialTransform.map(delegated()->boundingRect().topLeft()).y() - tr.map(delegated()->boundingRect().topLeft()).y(); // Update the transform tr = buildTransform(); @@ -534,6 +529,71 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) event->accept(); } +QList UBGraphicsDelegateFrame::getLinkedFrames() +{ + QList linkedFrames; + QList sItems = mDelegate->delegated()->scene()->selectedItems(); + if (sItems.count()) + { + sItems.removeAll(delegated()); + + foreach(QGraphicsItem *item, sItems) + { + UBGraphicsItem *gitem = dynamic_cast(item); + if (gitem) + linkedFrames << gitem->Delegate()->frame(); + } + } + return linkedFrames; +} + +void UBGraphicsDelegateFrame::prepareFramesToMove(QList framesToMove) +{ + mLinkedFrames = framesToMove; + foreach (UBGraphicsDelegateFrame *frame, mLinkedFrames) + { + frame->prepareLinkedFrameToMove(); + } +} + +void UBGraphicsDelegateFrame::prepareLinkedFrameToMove() +{ + mDelegate->startUndoStep(); + + mStartingPoint = QPointF(0,0); + + initializeTransform(); + + mScaleX = 1; + mScaleY = 1; + mTranslateX = 0; + mTranslateY = 0; + mAngleOffset = 0; + + mInitialTransform = buildTransform(); + + mCurrentTool = Move; +} + +void UBGraphicsDelegateFrame::moveLinkedItems(QLineF movingVector, bool bLinked) +{ + if (bLinked) + { + mCurrentTool = Move; + + mTranslateX = movingVector.dx(); + mTranslateY = movingVector.dy(); + + delegated()->setTransform(buildTransform(), false); + } + else + { + foreach(UBGraphicsDelegateFrame* frame, mLinkedFrames) + { + frame->moveLinkedItems(movingVector, true); + } + } +} QTransform UBGraphicsDelegateFrame::buildTransform() { diff --git a/src/domain/UBGraphicsDelegateFrame.h b/src/domain/UBGraphicsDelegateFrame.h index b08ae219..142766fe 100644 --- a/src/domain/UBGraphicsDelegateFrame.h +++ b/src/domain/UBGraphicsDelegateFrame.h @@ -48,6 +48,10 @@ class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject enum OperationMode {Scaling, Resizing, ResizingHorizontally}; void setOperationMode(OperationMode pMode) {mOperationMode = pMode;} bool isResizing(){return mResizing;} + void moveLinkedItems(QLineF movingVector, bool bLinked = false); + void prepareFramesToMove(QList framesToMove); + void prepareLinkedFrameToMove(); + QList getLinkedFrames(); private: QRectF bottomRightResizeGripRect() const; @@ -120,5 +124,7 @@ class UBGraphicsDelegateFrame: public QGraphicsRectItem, public QObject bool mResizing; bool mMirroredXAtStart; bool mMirroredYAtStart; + + QList mLinkedFrames; }; #endif /* UBGRAPHICSDELEGATEFRAME_H_ */ diff --git a/src/domain/UBGraphicsGroupContainerItem.cpp b/src/domain/UBGraphicsGroupContainerItem.cpp index 75e57711..bed3b219 100644 --- a/src/domain/UBGraphicsGroupContainerItem.cpp +++ b/src/domain/UBGraphicsGroupContainerItem.cpp @@ -32,6 +32,16 @@ UBGraphicsGroupContainerItem::UBGraphicsGroupContainerItem(QGraphicsItem *parent } +UBGraphicsGroupContainerItem::~UBGraphicsGroupContainerItem() +{ + foreach (QGraphicsItem *item, childItems()) + { + removeFromGroup(item); + if (item && item->scene()) + item->scene()->removeItem(item); + } +} + void UBGraphicsGroupContainerItem::addToGroup(QGraphicsItem *item) { if (!item) { diff --git a/src/domain/UBGraphicsGroupContainerItem.h b/src/domain/UBGraphicsGroupContainerItem.h index 1eca384a..535627eb 100644 --- a/src/domain/UBGraphicsGroupContainerItem.h +++ b/src/domain/UBGraphicsGroupContainerItem.h @@ -10,6 +10,7 @@ class UBGraphicsGroupContainerItem : public QGraphicsItem, public UBItem, public public: UBGraphicsGroupContainerItem (QGraphicsItem *parent = 0); + virtual ~UBGraphicsGroupContainerItem(); void addToGroup(QGraphicsItem *item); void removeFromGroup(QGraphicsItem *item); diff --git a/src/domain/UBGraphicsGroupContainerItemDelegate.cpp b/src/domain/UBGraphicsGroupContainerItemDelegate.cpp index 6d753cd8..8a24f8f0 100644 --- a/src/domain/UBGraphicsGroupContainerItemDelegate.cpp +++ b/src/domain/UBGraphicsGroupContainerItemDelegate.cpp @@ -19,6 +19,7 @@ UBGraphicsGroupContainerItemDelegate::UBGraphicsGroupContainerItemDelegate(QGrap //Wrapper function. Use it to set correct data() to QGraphicsItem as well setFlippable(false); setRotatable(false); + setCanDuplicate(true); } UBGraphicsGroupContainerItem *UBGraphicsGroupContainerItemDelegate::delegated() diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index 962121a9..e0cfcc33 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -195,10 +195,10 @@ QVariant UBGraphicsItemDelegate::itemChange(QGraphicsItem::GraphicsItemChange ch if ((change == QGraphicsItem::ItemSelectedHasChanged || change == QGraphicsItem::ItemPositionHasChanged || change == QGraphicsItem::ItemTransformHasChanged) - && mDelegated->scene()) - { + && mDelegated->scene() + && UBApplication::boardController) + { mAntiScaleRatio = 1 / (UBApplication::boardController->systemScaleFactor() * UBApplication::boardController->currentZoom()); - positionHandles(); } @@ -471,18 +471,18 @@ void UBGraphicsItemDelegate::lock(bool locked) mFrame->positionHandles(); } - -void UBGraphicsItemDelegate::showHide(bool show) +void UBGraphicsItemDelegate::showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem) { - if (show) - { - mDelegated->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Object)); - } - else - { - mDelegated->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control)); + pItem->setData(UBGraphicsItemData::ItemLayerType, pShow); + foreach (QGraphicsItem *insideItem, pItem->childItems()) { + showHideRecurs(pShow, insideItem); } +} +void UBGraphicsItemDelegate::showHide(bool show) +{ + QVariant showFlag = QVariant(show ? UBItemLayerType::Object : UBItemLayerType::Control); + showHideRecurs(showFlag, mDelegated); mDelegated->update(); emit showOnDisplayChanged(show); diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h index fc5c460c..099dd06d 100644 --- a/src/domain/UBGraphicsItemDelegate.h +++ b/src/domain/UBGraphicsItemDelegate.h @@ -297,6 +297,7 @@ protected slots: private: void updateFrame(); void updateButtons(bool showUpdated = false); + inline void showHideRecurs(const QVariant &pShow, QGraphicsItem *pItem); QPointF mOffset; QTransform mPreviousTransform; diff --git a/src/domain/UBGraphicsItemGroupUndoCommand.cpp b/src/domain/UBGraphicsItemGroupUndoCommand.cpp new file mode 100644 index 00000000..9b58dc1d --- /dev/null +++ b/src/domain/UBGraphicsItemGroupUndoCommand.cpp @@ -0,0 +1,58 @@ +#include "UBGraphicsItemGroupUndoCommand.h" + +#include "UBGraphicsGroupContainerItem.h" +#include "UBGraphicsScene.h" +#include "core/memcheck.h" + + +UBGraphicsItemGroupUndoCommand::UBGraphicsItemGroupUndoCommand(UBGraphicsScene *pScene, UBGraphicsGroupContainerItem *pGroupCreated) : + mScene (pScene), mGroup(pGroupCreated), mFirstRedo(true) + +{ + if (pGroupCreated->childItems().count()) { + foreach (QGraphicsItem *item, pGroupCreated->childItems()) { + mItems << item; + } + } +} + +UBGraphicsItemGroupUndoCommand::~UBGraphicsItemGroupUndoCommand() +{ +} + +void UBGraphicsItemGroupUndoCommand::undo() +{ + mGroup->destroy(); + foreach(QGraphicsItem *item, mItems) { + item->setSelected(true); + } +} + +void UBGraphicsItemGroupUndoCommand::redo() +{ + if (mFirstRedo) { + //Work around. TODO determine why does Qt call the redo function on pushing to undo + mFirstRedo = false; + return; + } + + foreach (QGraphicsItem *item, mItems) { + if (item->type() == UBGraphicsGroupContainerItem::Type) { + QList childItems = item->childItems(); + UBGraphicsGroupContainerItem *currentGroup = dynamic_cast(item); + if (currentGroup) { + currentGroup->destroy(); + } + foreach (QGraphicsItem *chItem, childItems) { + mGroup->addToGroup(chItem); + } + } else { + mGroup->addToGroup(item); + } + } + + mScene->addItem(mGroup); + mGroup->setVisible(true); + mGroup->setFocus(); + mGroup->setSelected(true); +} diff --git a/src/domain/UBGraphicsItemGroupUndoCommand.h b/src/domain/UBGraphicsItemGroupUndoCommand.h new file mode 100644 index 00000000..bbc0a022 --- /dev/null +++ b/src/domain/UBGraphicsItemGroupUndoCommand.h @@ -0,0 +1,30 @@ +#ifndef UBGRAPHICSITEMGROUPUNDOCOMMAND_H +#define UBGRAPHICSITEMGROUPUNDOCOMMAND_H + +#include +#include "UBAbstractUndoCommand.h" + +class UBGraphicsScene; +class UBGraphicsGroupContainerItem; + +class UBGraphicsItemGroupUndoCommand : public UBAbstractUndoCommand +{ +public: + UBGraphicsItemGroupUndoCommand(UBGraphicsScene *pScene, UBGraphicsGroupContainerItem *pGroupCreated); + virtual ~UBGraphicsItemGroupUndoCommand(); + + virtual UndoType getType() { return undotype_GRAPHICSGROUPITEM; } + +protected: + virtual void undo(); + virtual void redo(); + +private: + UBGraphicsScene *mScene; + UBGraphicsGroupContainerItem *mGroup; + QList mItems; + + bool mFirstRedo; +}; + +#endif // UBGRAPHICSITEMGROUPUNDOCOMMAND_H diff --git a/src/domain/UBGraphicsItemTransformUndoCommand.h b/src/domain/UBGraphicsItemTransformUndoCommand.h index 0f6b405d..07d8e0c3 100644 --- a/src/domain/UBGraphicsItemTransformUndoCommand.h +++ b/src/domain/UBGraphicsItemTransformUndoCommand.h @@ -32,7 +32,7 @@ class UBGraphicsItemTransformUndoCommand : public UBAbstractUndoCommand const QSizeF& prevSize = QSizeF()); virtual ~UBGraphicsItemTransformUndoCommand(); - virtual UndoType getType() { return undotype_GRAPHICITEMTRANSFORM; }; + virtual UndoType getType() { return undotype_GRAPHICITEMTRANSFORM; } protected: virtual void undo(); diff --git a/src/domain/UBGraphicsItemUndoCommand.cpp b/src/domain/UBGraphicsItemUndoCommand.cpp index 8d4ebf52..d9961fa0 100644 --- a/src/domain/UBGraphicsItemUndoCommand.cpp +++ b/src/domain/UBGraphicsItemUndoCommand.cpp @@ -24,6 +24,7 @@ #include "board/UBBoardController.h" #include "core/memcheck.h" +#include "domain/UBGraphicsGroupContainerItem.h" UBGraphicsItemUndoCommand::UBGraphicsItemUndoCommand(UBGraphicsScene* pScene, const QSet& pRemovedItems, const QSet& pAddedItems) @@ -81,6 +82,14 @@ void UBGraphicsItemUndoCommand::undo() { QGraphicsItem* item = itAdded.next(); + //if removing group + if (item->type() == UBGraphicsGroupContainerItem::Type) { + UBGraphicsGroupContainerItem *curGroup = qgraphicsitem_cast(item); + if (curGroup) { + curGroup->destroy(); + } + } + UBApplication::boardController->freezeW3CWidget(item, true); item->setSelected(false); mScene->removeItem(item); diff --git a/src/domain/UBGraphicsItemUndoCommand.h b/src/domain/UBGraphicsItemUndoCommand.h index 113c421e..78e7ec9a 100644 --- a/src/domain/UBGraphicsItemUndoCommand.h +++ b/src/domain/UBGraphicsItemUndoCommand.h @@ -34,10 +34,10 @@ class UBGraphicsItemUndoCommand : public UBAbstractUndoCommand virtual ~UBGraphicsItemUndoCommand(); - QSet GetAddedList() { return mAddedItems; }; - QSet GetRemovedList() { return mRemovedItems; }; + QSet GetAddedList() { return mAddedItems; } + QSet GetRemovedList() { return mRemovedItems; } - virtual UndoType getType() { return undotype_GRAPHICITEM; }; + virtual UndoType getType() { return undotype_GRAPHICITEM; } protected: virtual void undo(); diff --git a/src/domain/UBGraphicsPolygonItem.cpp b/src/domain/UBGraphicsPolygonItem.cpp index 256f8143..f00bf42b 100644 --- a/src/domain/UBGraphicsPolygonItem.cpp +++ b/src/domain/UBGraphicsPolygonItem.cpp @@ -154,7 +154,12 @@ UBItem* UBGraphicsPolygonItem::deepCopy() const UBGraphicsPolygonItem* UBGraphicsPolygonItem::deepCopy(const QPolygonF& pol) const { - UBGraphicsPolygonItem* copy = new UBGraphicsPolygonItem(pol); + QPolygonF p(pol); + if (parentItem()!=NULL) + { + p = mapToItem(parentItem(), p); + } + UBGraphicsPolygonItem* copy = new UBGraphicsPolygonItem(p, parentItem()); copyItemParameters(copy); diff --git a/src/domain/UBGraphicsPolygonItem.h b/src/domain/UBGraphicsPolygonItem.h index 6ee1cc7e..1917e731 100644 --- a/src/domain/UBGraphicsPolygonItem.h +++ b/src/domain/UBGraphicsPolygonItem.h @@ -20,6 +20,7 @@ #include "core/UB.h" #include "UBItem.h" #include "UBGraphicsStrokesGroup.h" +#include "domain/UBGraphicsGroupContainerItem.h" class UBItem; class UBGraphicsScene; diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 19a7e851..540ce297 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -47,6 +47,7 @@ #include "board/UBBoardView.h" #include "UBGraphicsItemUndoCommand.h" +#include "UBGraphicsItemGroupUndoCommand.h" #include "UBGraphicsTextItemUndoCommand.h" #include "UBGraphicsProxyWidget.h" #include "UBGraphicsPixmapItem.h" @@ -843,14 +844,18 @@ void UBGraphicsScene::eraseLineTo(const QPointF &pEndPoint, const qreal &pWidth) // UBGraphicsPolygonItems and added to the scene foreach(const QPolygonF &pol, croppedPathSimplified.toFillPolygons()) { - UBGraphicsPolygonItem* croppedPolygonItem = collidingPolygonItem->deepCopy(pol); + UBGraphicsPolygonItem* croppedPolygonItem; #pragma omp critical - if(NULL != pGroup){ - croppedPolygonItem->setStrokesGroup(pGroup); - //pGroup->addToGroup(croppedPolygonItem); + { + croppedPolygonItem = collidingPolygonItem->deepCopy(pol); + + if(NULL != pGroup){ + croppedPolygonItem->setStrokesGroup(pGroup); + //pGroup->addToGroup(croppedPolygonItem); + } + // Add this new polygon to the 'added' list + toBeAddedItems << croppedPolygonItem; } - // Add this new polygon to the 'added' list - toBeAddedItems << croppedPolygonItem; } #pragma omp critical // Remove the original polygonitem because it has been replaced by many smaller polygons @@ -1521,7 +1526,7 @@ UBGraphicsGroupContainerItem *UBGraphicsScene::createGroup(QListsetFocus(); if (enableUndoRedoStack) { //should be deleted after scene own undo stack implemented - UBGraphicsItemUndoCommand* uc = new UBGraphicsItemUndoCommand(this, 0, groupItem); + UBGraphicsItemGroupUndoCommand* uc = new UBGraphicsItemGroupUndoCommand(this, groupItem); UBApplication::undoStack->push(uc); } diff --git a/src/domain/UBGraphicsStrokesGroup.cpp b/src/domain/UBGraphicsStrokesGroup.cpp index 4f1be91f..a5320924 100644 --- a/src/domain/UBGraphicsStrokesGroup.cpp +++ b/src/domain/UBGraphicsStrokesGroup.cpp @@ -115,3 +115,23 @@ QVariant UBGraphicsStrokesGroup::itemChange(GraphicsItemChange change, const QVa QVariant newValue = mDelegate->itemChange(change, value); return QGraphicsItemGroup::itemChange(change, newValue); } + + +QPainterPath UBGraphicsStrokesGroup::shape () const +{ + QPainterPath path; + + if (isSelected()) + { + path.addRect(boundingRect()); + } + else + { + foreach(QGraphicsItem* item, childItems()) + { + path.addPath(item->shape()); + } + } + + return path; +} diff --git a/src/domain/UBGraphicsStrokesGroup.h b/src/domain/UBGraphicsStrokesGroup.h index 8339e1c2..b2310773 100644 --- a/src/domain/UBGraphicsStrokesGroup.h +++ b/src/domain/UBGraphicsStrokesGroup.h @@ -25,6 +25,9 @@ public: virtual void setUuid(const QUuid &pUuid); protected: + + virtual QPainterPath shape () const; + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event); virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); diff --git a/src/domain/domain.pri b/src/domain/domain.pri index d66c72ec..1111106f 100644 --- a/src/domain/domain.pri +++ b/src/domain/domain.pri @@ -1,61 +1,58 @@ - -HEADERS += src/domain/UBGraphicsScene.h \ - src/domain/UBGraphicsItemUndoCommand.h \ - src/domain/UBGraphicsTextItemUndoCommand.h \ - src/domain/UBGraphicsItemTransformUndoCommand.h \ - src/domain/UBGraphicsPixmapItem.h \ - src/domain/UBDocumentUndoCommand.h \ - src/domain/UBPageSizeUndoCommand.h \ - src/domain/UBGraphicsProxyWidget.h \ - src/domain/UBGraphicsWebView.h \ - src/domain/UBGraphicsSvgItem.h \ - src/domain/UBGraphicsPolygonItem.h \ - src/domain/UBItem.h \ - src/domain/UBGraphicsWidgetItem.h \ - src/domain/UBGraphicsPDFItem.h \ - src/domain/UBGraphicsTextItem.h \ - src/domain/UBResizableGraphicsItem.h \ - src/domain/UBGraphicsStroke.h \ - src/domain/UBGraphicsMediaItem.h \ - src/domain/UBAbstractUndoCommand.h\ - src/domain/UBGraphicsGroupContainerItem.h \ - src/domain/UBGraphicsGroupContainerItemDelegate.h \ - src/domain/UBGraphicsStrokesGroup.h - -HEADERS += src/domain/UBGraphicsItemDelegate.h \ - src/domain/UBGraphicsTextItemDelegate.h \ - src/domain/UBGraphicsDelegateFrame.h \ - src/domain/UBGraphicsWidgetItemDelegate.h \ - src/domain/UBGraphicsMediaItemDelegate.h - - -SOURCES += src/domain/UBGraphicsScene.cpp \ - src/domain/UBGraphicsItemUndoCommand.cpp \ - src/domain/UBGraphicsTextItemUndoCommand.cpp \ - src/domain/UBGraphicsItemTransformUndoCommand.cpp \ - src/domain/UBGraphicsPixmapItem.cpp \ - src/domain/UBDocumentUndoCommand.cpp \ - src/domain/UBPageSizeUndoCommand.cpp \ - src/domain/UBGraphicsProxyWidget.cpp \ - src/domain/UBGraphicsWebView.cpp \ - src/domain/UBGraphicsSvgItem.cpp \ - src/domain/UBGraphicsPolygonItem.cpp \ - src/domain/UBItem.cpp \ - src/domain/UBGraphicsVideoItem.cpp \ - src/domain/UBGraphicsWidgetItem.cpp \ - src/domain/UBGraphicsPDFItem.cpp \ - src/domain/UBGraphicsTextItem.cpp \ - src/domain/UBResizableGraphicsItem.cpp \ - src/domain/UBGraphicsStroke.cpp \ - src/domain/UBGraphicsMediaItem.cpp \ - src/domain/UBAbstractUndoCommand.cpp \ - src/domain/ubgraphicsgroupcontaineritem.cpp \ - src/domain/ubgraphicsgroupcontaineritemdelegate.cpp \ - src/domain/UBGraphicsStrokesGroup.cpp - -SOURCES += src/domain/UBGraphicsItemDelegate.cpp \ - src/domain/UBGraphicsTextItemDelegate.cpp \ - src/domain/UBGraphicsMediaItemDelegate.cpp \ - src/domain/UBGraphicsDelegateFrame.cpp \ - src/domain/UBGraphicsWidgetItemDelegate.cpp \ - +HEADERS += src/domain/UBGraphicsScene.h \ + src/domain/UBGraphicsItemUndoCommand.h \ + src/domain/UBGraphicsTextItemUndoCommand.h \ + src/domain/UBGraphicsItemTransformUndoCommand.h \ + src/domain/UBGraphicsPixmapItem.h \ + src/domain/UBDocumentUndoCommand.h \ + src/domain/UBPageSizeUndoCommand.h \ + src/domain/UBGraphicsProxyWidget.h \ + src/domain/UBGraphicsWebView.h \ + src/domain/UBGraphicsSvgItem.h \ + src/domain/UBGraphicsPolygonItem.h \ + src/domain/UBItem.h \ + src/domain/UBGraphicsWidgetItem.h \ + src/domain/UBGraphicsPDFItem.h \ + src/domain/UBGraphicsTextItem.h \ + src/domain/UBResizableGraphicsItem.h \ + src/domain/UBGraphicsStroke.h \ + src/domain/UBGraphicsMediaItem.h \ + src/domain/UBAbstractUndoCommand.h \ + src/domain/UBGraphicsGroupContainerItem.h \ + src/domain/UBGraphicsGroupContainerItemDelegate.h \ + src/domain/UBGraphicsStrokesGroup.h \ + src/domain/UBGraphicsItemGroupUndoCommand.h \ + src/domain/UBGraphicsItemDelegate.h \ + src/domain/UBGraphicsTextItemDelegate.h \ + src/domain/UBGraphicsDelegateFrame.h \ + src/domain/UBGraphicsWidgetItemDelegate.h \ + src/domain/UBGraphicsMediaItemDelegate.h + +SOURCES += src/domain/UBGraphicsScene.cpp \ + src/domain/UBGraphicsItemUndoCommand.cpp \ + src/domain/UBGraphicsTextItemUndoCommand.cpp \ + src/domain/UBGraphicsItemTransformUndoCommand.cpp \ + src/domain/UBGraphicsPixmapItem.cpp \ + src/domain/UBDocumentUndoCommand.cpp \ + src/domain/UBPageSizeUndoCommand.cpp \ + src/domain/UBGraphicsProxyWidget.cpp \ + src/domain/UBGraphicsWebView.cpp \ + src/domain/UBGraphicsSvgItem.cpp \ + src/domain/UBGraphicsPolygonItem.cpp \ + src/domain/UBItem.cpp \ + src/domain/UBGraphicsVideoItem.cpp \ + src/domain/UBGraphicsWidgetItem.cpp \ + src/domain/UBGraphicsPDFItem.cpp \ + src/domain/UBGraphicsTextItem.cpp \ + src/domain/UBResizableGraphicsItem.cpp \ + src/domain/UBGraphicsStroke.cpp \ + src/domain/UBGraphicsMediaItem.cpp \ + src/domain/UBAbstractUndoCommand.cpp \ + src/domain/ubgraphicsgroupcontaineritem.cpp \ + src/domain/ubgraphicsgroupcontaineritemdelegate.cpp \ + src/domain/UBGraphicsStrokesGroup.cpp \ + src/domain/UBGraphicsItemGroupUndoCommand.cpp \ + src/domain/UBGraphicsItemDelegate.cpp \ + src/domain/UBGraphicsTextItemDelegate.cpp \ + src/domain/UBGraphicsMediaItemDelegate.cpp \ + src/domain/UBGraphicsDelegateFrame.cpp \ + src/domain/UBGraphicsWidgetItemDelegate.cpp diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp index 85a41cad..78b4725e 100644 --- a/src/gui/UBFeaturesWidget.cpp +++ b/src/gui/UBFeaturesWidget.cpp @@ -379,6 +379,12 @@ void UBFeaturesListView::dragMoveEvent( QDragMoveEvent *event ) event->ignore(); return; } + foreach (UBFeature curFeature, fMimeData->features()) { + if (curFeature == onFeature) { + event->ignore(); + return; + } + } } if ( event->mimeData()->hasUrls() || event->mimeData()->hasImage() ) { diff --git a/src/gui/UBTeacherGuideWidget.cpp b/src/gui/UBTeacherGuideWidget.cpp index 2bec3d15..5322919a 100644 --- a/src/gui/UBTeacherGuideWidget.cpp +++ b/src/gui/UBTeacherGuideWidget.cpp @@ -879,17 +879,21 @@ void UBTeacherGuidePageZeroWidget::fillComboBoxes() parametersFile.close(); QStringList licences; - licences << tr("Attribution CC BY") << tr("Attribution-NoDerivs CC BY-ND") + licences << tr("Attribution CC BY") + << tr("Attribution-NoDerivs CC BY-ND") << tr("Attribution-ShareAlike CC BY-SA") << tr("Attribution-NonCommercial CC BY-NC") << tr("Attribution-NonCommercial-NoDerivs CC BY-NC-ND") << tr("Attribution-NonCommercial-ShareAlike CC BY-NC-SA") - << tr("Public domain") << tr("Copyright"); + << tr("Public domain") + << tr("Copyright"); mpLicenceBox->addItems(licences); QStringList licenceIconList; licenceIconList << ":images/licenses/ccby.png" - << ":images/licenses/ccbynd.png" << ":images/licenses/ccbysa.png" - << ":images/licenses/ccbync.png" << ":images/licenses/ccbyncnd.png" + << ":images/licenses/ccbynd.png" + << ":images/licenses/ccbysa.png" + << ":images/licenses/ccbync.png" + << ":images/licenses/ccbyncnd.png" << ":images/licenses/ccbyncsa.png"; for (int i = 0; i < licenceIconList.count(); i += 1) mpLicenceBox->setItemData(i, licenceIconList.at(i)); @@ -945,7 +949,7 @@ void UBTeacherGuidePageZeroWidget::loadData() currentIndex = mpSchoolTypeBox->findText(documentProxy->metaData(UBSettings::sessionType).toString()); mpSchoolTypeBox->setCurrentIndex((currentIndex != -1) ? currentIndex : 0); - currentIndex = mpLicenceBox->findText(documentProxy->metaData(UBSettings::sessionLicence).toString()); + currentIndex = documentProxy->metaData(UBSettings::sessionLicence).toInt(); mpLicenceBox->setCurrentIndex((currentIndex != -1) ? currentIndex : 0); } @@ -962,7 +966,7 @@ void UBTeacherGuidePageZeroWidget::persistData() documentProxy->setMetaData(UBSettings::sessionGradeLevel, mpSchoolLevelBox->currentText()); documentProxy->setMetaData(UBSettings::sessionSubjects, mpSchoolSubjectsBox->currentText()); documentProxy->setMetaData(UBSettings::sessionType, mpSchoolTypeBox->currentText()); - documentProxy->setMetaData(UBSettings::sessionLicence, mpLicenceBox->currentText()); + documentProxy->setMetaData(UBSettings::sessionLicence, mpLicenceBox->currentIndex()); } } @@ -1087,7 +1091,7 @@ QVector UBTeacherGuidePageZeroWidget::getData() elementNode = new tUBGEElementNode(); elementNode->name = "licence"; - elementNode->attributes.insert("value", mpLicenceBox->currentText()); + elementNode->attributes.insert("value", QString("%1").arg(mpLicenceBox->currentIndex())); result << elementNode; return result; }