change button image - image
I have created a new custom button, can I set a different background image instead of 'circle' or 'triangle' ?
thanks
Chanan
exporting: {
enabled: true,
buttons: {
'realTimeButton': {
id: 'realTimeButton',
symbol: 'diamond',
x: -88,
symbolFill: realTimeColor,
hoverSymbolFill: realTimeColor,
_titleKey: "realTimeButtonTitle",
onclick: function(event) {
// handle change to real time
if ( enable_lastRoundsChart_realtime )
{
// disable real time flag
enable_lastRoundsChart_realtime = 0;
// re-create detail in real time mode disabled
createDetail(cache_last_rounds.last_rounds_data, window.show_top_round_ids);
// enable plotBand
if ( pb_master_chart )
{
pb_master_chart.options.chart.events.selection.enabled = 'true';
pb_master_chart.options.chart.zoomType = 'x';
}
}
else
{
// enable real time flag
enable_lastRoundsChart_realtime = 1;
// re-create detail in real time mode enabled
createDetail(cache_last_rounds.last_rounds_data, window.show_top_round_ids);
// update title
this.setTitle({text:"Players/Drops Per Round"}, {text:"Real Time"});
// if master found, remove plotBand and disable master selection
if ( pb_master_chart )
{
// remove plotBand
pb_master_chart.xAxis[0].removePlotBand('mask-before');
pb_master_chart.xAxis[0].removePlotBand('mask-after');
pb_master_chart.xAxis[0].addPlotBand({
id: 'mask-before',
from: -1,
to: 99999,
color: 'rgba(0, 0, 0, 0.2)'
})
// disable selection
pb_master_chart.options.chart.events.selection.enabled = 'false';
pb_master_chart.options.chart.zoomType = null;
}
}
}
},
According to the docs, the shapes are defined in the Highcharts.Renderer.symbols collection. Inspecting this object reveals the following available shapes:
Highcharts.Renderer.prototype.symbols:
arc: function (a,b,c,d,e){var f=e.start,c=e.r||c||d,g=e.end-1.0E-6,d=e.innerR,h=e.open,i=W(f),j=Z(f),k=W(g),g=Z(g),e=e.end-f<Aa?0:1;return["M",a+c*i,b+c*j,"A",c,c,
circle: function (a,b,c,d){var e=0.166*c;return["M",a+c/2,b,"C",a+c+e,b,a+c+e,b+d,
diamond: function (a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d/2,a+c/2,b+d,a,b+d/2,"Z"]}
exportIcon: function (a,b,c,d){return y(["M",a,b+c,"L",a+c,b+d,a+c,b+d*0.8,a,b+d*0.8,"Z","M",a+c*0.5,b+d*0.8,"L",a+c*0.8,b+d*0.4,a+c*0.4,b+d*0.4,a+c*0.4,b,a+c*0.6,b,a+c*0.6,b+d*0.4,a+c*0.2,b+d*0.4,"Z"])}
printIcon: function (a,b,c,d){return y(["M",a,b+d*0.7,"L",a+c,b+d*0.7,a+c,b+d*0.4,a,b+d*0.4,"Z","M",a+c*0.2,b+d*0.4,"L",a+c*0.2,b,a+c*0.8,b,a+c*0.8,b+d*0.4,"Z","M",a+c*0.2,b+d*0.7,"L",a,b+d,a+
square: function (a,b,c,d){return["M",a,b,"L",a+c,b,a+c,b+d,a,b+d,"Z"]}
triangle: function (a,b,c,d){return["M",a+c/2,b,"L",a+c,b+d,a,b+d,"Z"]}
triangle-down: function (a,b,c,d){return["M",a,b,"L",a+c,b,a+c/2,b+d,"Z"]}
You can also add your own symbol by extending the collection. For example, drawing a simple X:
$.extend(Highcharts.Renderer.prototype.symbols, {
anX: function (a,b,c,d){return["M",a,b,"L",a+c,b+d,"M",a+c,b,"L",a,b+d]}
});
Produces:
Fiddle here.
You have ability to set image as icon
http://jsfiddle.net/Udgb3/
symbol: 'url(http://highcharts.com/demo/gfx/sun.png)',
symbolX:5,
symbolY:0
Related
Gnome Shell Extension: Resize and position a window on creation
I am trying to write a Gnome Shell extension that resizes and positions a window when it is created. I am using the move_resize_frame method provided by the Meta.Window object to set the window's size and position, and I've also tried move and move_resize_frame. However, while the window is sized correctly, it is not being positioned correctly, and it seems that the window manager is applying some constraints on the window position. The window is not maximized. Here is the code I am using: let windowCreatedId, sizeChangedId; function init() { } function enable() { windowCreatedId = global.display.connect('window-created', onWindowCreated); } function disable() { global.display.disconnect(windowCreatedId); if (sizeChangedId) global.display.disconnect(sizeChangedId); } function onWindowCreated(display, win) { sizeChangedId = win.connect('size-changed', onSizeChanged); resizeWindow(win); } function onSizeChanged(win) { resizeWindow(win); } function resizeWindow(win) { win.move_resize_frame(false, 20, 20, 2000, 2000); } What am I missing or what should I change to make this extension work properly?
Instead of the size-changed signal, you need to connect to the first-frame signal, which is triggered when the frame is first drawn on the screen. Here's a full implementation: const Meta = imports.gi.Meta; let windowCreatedId; function init() { } function enable() { windowCreatedId = global.display.connect('window-created', onWindowCreated); } function disable() { global.display.disconnect(windowCreatedId); } function onWindowCreated(display, win) { const act = win.get_compositor_private(); const id = act.connect('first-frame', _ => { resizeWindow(win); act.disconnect(id); }); } function resizeWindow(win) { win.move_resize_frame(false, 20, 20, 2000, 2000); } It uses the window's get_compositor_private() method, which feels a little iffy, but it works (and Material Shell uses it too...)
ckeditor balloonpanel not staying attached to an element when scrolling
UPDATE balloon panels are staying attached in below code. We still have an issue where when we close a balloon panel, and then scroll afterward, the balloon panel that was just closed reappears. Here’s the updated code. HERE WAS THE ORIGINAL QUESTION I am trying to get the ckeditor balloonpanel to stay attached to the element it was initially attached to; currently, when I scroll in the editor, the balloonpanels do not stay in place. The problem is that the balloonpanels shift when the user scrolls in the editor -- they do not remain attached to their initial element they were attached to when I scroll in the editor. Here is the code for the ckeditor plugin. It creates a balloonpanel in a for loop on return of an web service Ajax call and stores the panel in a global array called panels : ( function() { var arr = new Array(); var panels = []; var saveCmd = { readOnly: 1, modes: { wysiwyg: 1,source: 1 }, exec: function( editor ) { if ( editor.fire( 'grade_level_score' ) ) { var $form = editor.element.$.form; /** * Destroys the balloon panel by removing it from DOM and purging * all associated event listeners. */ // https://github.com/ckeditor/ckeditor-dev/blob/64749bb245d1e91f6a4ac4e97c9648ec47acda91/plugins/balloonpanel/plugin.js#L743-L745 var panel; while ( ( panel = panels.pop() ) ) { panel.destroy(); } arr = []; // clear the array of user-editable areas panels = []; // clear the array of panels // https://stackoverflow.com/a/48022658 var ele = $(editor.editable().$); var elementOfClass; var i = 1; // class "ice-ice-editable" is in a span $('span',ele).each(function(){ // https://stackoverflow.com/a/35866999 var iceIceEditableClass = "ice-ice-editable"; var hasClassIceIceEditable = $(this).hasClass(iceIceEditableClass); if( hasClassIceIceEditable ) { console.log($(this).text()); console.log($(this).attr('class')); console.log($(this).attr('id')); var userEditable = "user-editable-" + i; // If the specified attribute already exists, only the value is set/changed. this.setAttribute("id","user-editable-" + i); var record1 = { id : userEditable , userEditableArea : $(this).text() }; arr.push(record1); i++; } }); var gradeLevelObject = new Object(); gradeLevelObject.textAreas = arr; // var responseGradeLevelScoreWS = gradeLevelScore(gradeLevelObject); // BEGIN for testing var result = '{"textAreas":[{"id":"user-editable-1","userEditableArea":"[Insert information specific to what is being addressed (a brief description of request(s) and/or concern(s). Specific training resource document for letter writing assistance will be referenced here.] ","score":22.24,"readingGrade":7,"issues":["asdf","zxcv"]},{"id":"user-editable-2","userEditableArea":"[Insert information specific to what is being addressed (a brief description of request(s) and/or concern(s). Specific training resource document for letter writing assistance will be referenced here.] ","score":22.24,"readingGrade":0,"issues":[]},{"id":"user-editable-3","userEditableArea":"[Insert information specific to what is being addressed (a brief description of request(s) and/or concern(s). Specific training resource document for letter writing assistance will be referenced here.] ","score":22.24,"readingGrade":0,"issues":[]},{"id":"user-editable-4","userEditableArea":"[Insert information specific to what is being addressed (a brief description of request(s) and/or concern(s). Specific training resource document for letter writing assistance will be referenced here.] ","score":22.24,"readingGrade":0,"issues":[]}]}'; var responseGradeLevelScoreWS = JSON.parse(result); // END for testing console.log(responseGradeLevelScoreWS); var i; for (i = 0; i < responseGradeLevelScoreWS.textAreas.length; i++){ if ( responseGradeLevelScoreWS.textAreas[i].readingGrade > 6 ) { var j; var issues = ''; for (j = 0; j < responseGradeLevelScoreWS.textAreas[i].issues.length; j++) { issues += '<p>' + responseGradeLevelScoreWS.textAreas[i].issues[j] + '</p>'; } panel = new CKEDITOR.ui.balloonPanel( editor, { title: 'Grade: ' + responseGradeLevelScoreWS.textAreas[i].readingGrade + '. Score: ' + responseGradeLevelScoreWS.textAreas[i].score, content: ( (typeof issues === 'undefined' || issues == null) ? 'There are no suggestions in order to descrease the grade level score' : issues ), width: 500, height: 120 }); var element = editor.document.getById(responseGradeLevelScoreWS.textAreas[i].id); panel.attach( element ); panel.registerFocusable(element); panels.push( panel ); issues = ''; } } // We'll use throttling for scroll listener to reduce performance impact. var scrollListener = CKEDITOR.tools.eventsBuffer( 100, function() { for (i = 0; i < panels.length; i++) { panels[i].attach( editor.document.getById( responseGradeLevelScoreWS.textAreas[i].id ), { focusElement: false, show: false } ); } } ); editor.window.on( 'scroll', scrollListener.input ); if ( $form ) { try { //$form.submit(); } catch ( e ) { // If there's a button named "submit" then the form.submit // function is masked and can't be called in IE/FF, so we // call the click() method of that button. if ( $form.submit.click ) $form.submit.click(); } } } } }; var pluginName = 'grade_level_score'; // Register a plugin named "save". CKEDITOR.plugins.add( pluginName, { // jscs:disable maximumLineLength lang: 'en,en-au,en-ca,en-gb,es,es-mx', // %REMOVE_LINE_CORE% // jscs:enable maximumLineLength icons: 'grade_level_score', // %REMOVE_LINE_CORE% hidpi: true, // %REMOVE_LINE_CORE% init: function( editor ) { // Save plugin is for replace mode only. if ( editor.elementMode != CKEDITOR.ELEMENT_MODE_REPLACE ) return; var command = editor.addCommand( pluginName, saveCmd ); command.startDisabled = !( editor.element.$.form ); editor.ui.addButton && editor.ui.addButton( 'Grade_Level_Score', { //label: editor.lang.save.toolbar, label: "Grade Level Score", command: pluginName, toolbar: 'custom,100' } ); } } ); } )();
Only Balloon Toolbar has built-in functionality for automatic reposition on scroll. Balloon Panel itself is a static element. However, it can be easily achieved by attaching scroll listener and repositioning visible panels on scroll: // We'll use throttling for scroll listener to reduce performance impact. var scrollListener = CKEDITOR.tools.eventsBuffer( 100, function() { for (i = 0; i < panels.length; i++) { panels[i].attach( editor.document.getById(ids[i]), { focusElement: false, show: false } ); } } ); editor.window.on( 'scroll', scrollListener.input ); See this codepen for the full code (reusing some parts of your original code).
I want change scrollview rolling speed in react native
Now I use interval make it come true, but it is very incoherence. If I can just change the method (scroll) speed, it well be nice. this.interval = setInterval(()=>{ if(!_scroll){ _this.interval && clearInterval(_this.interval); } if(totalWide+ScreenWidth >= width ){ _scroll.scrollWithoutAnimationTo(); totalWide=0; i=0; }else{ _scroll.scrollTo({x:eachWide*i,animate:true}); totalWide = totalWide + eachWide; i= i+1; } },250)
use decelerationRate property of ScrollView <ScrollView decelerationRate={0.5}> </ScrollView>
I got this working by having setInterval call a function(in which you define the logic or the pace at which the scroll should move). this.interval= setInterval(this.scrollwithSpeed, 100); // Set the function to this timer scrollwithSpeed() { position = this.state.currentPosition + x; // x decides the speed and currentPosition is set to 0 initially. this.scrollObject.scrollTo( { y: position, animated: true } ); this.setState({ currentPosition: position }); } Make sure you call clearInterval(this.interval) after it is done.
I would suggest to attach to js requestAnimationFrame (from how far I know it is supported in React Native). Bellow example will scroll linearly from top to bottom. If You need to scoll to different offset just change distance variable. startingPoint variable is redundant in scrolling from top to bottom but will stay in example. scroll() { if (this.scrollAnimationFrame) { cancelAnimationFrame(this.scrollAnimationFrame); } this.listRef.scrollToOffset({offset: 0, animated: false}); // remove if You don't start scroll from top const duration = this.scrollTime, startingPoint = 0, // change if You don't start scroll from top distance = Scrolling.LINE_HEIGHT * Scrolling.ITEMS_COUNT; let startTimestamp, progress; const frameCallback = (timestamp) => { if (!startTimestamp) { startTimestamp = timestamp; } progress = timestamp - startTimestamp; this.listRef.scrollToOffset({ offset: distance * (progress / duration) + startingPoint, animated: false, }); if (progress < duration) { this.scrollAnimationFrame = requestAnimationFrame(frameCallback); } }; this.scrollAnimationFrame = requestAnimationFrame(frameCallback); }
You can use reanimated to make it work. const offsetY = useSharedValue(0); const animatedProps = useAnimatedProps<FlatListProps<unknown>>(() => { return { contentOffset: { x: 0, y: offsetY.value, }, }; }); const handleScroll = () => { offsetY.value = withTiming(targetIndex * CARD_HEIGHT, { duration: YOUR_DURATION_HERE, }); } return <Animated.FlatList animatedProps={animatedProps} ... />
Actionscript MouseScroll / MouseDrag
Is there a "MouseScroll" or "MouseDrag" Event in Actionscript, I could not find something properly. I have this: resultPumpVolCalcBoxQv.addEventListener(MouseEvent.CLICK, getPumpVolumenQv); resultPumpVolCalcBoxQn.addEventListener(MouseEvent.CLICK, getPumpVolumenn); resultPumpVolCalcBoxQvng.addEventListener(MouseEvent.CLICK, getPumpVolumenng); function getPumpVolumenQv(e:MouseEvent):void { pumpeVolQv = Number(pumpeVolumenstromTextFieldqv.text); pumpeVolN = Number(pumpeVolumenstromTextFieldn.text); pumpeVolNg = Number(pumpeVolumenstromTextFieldng.text); if(pumpeVolumenstromTextFieldng.text != null && pumpeVolumenstromTextFieldn.text != null) { totalqv = (pumpeVolNg * pumpeVolN)/1000 pumpeVolumenstromTextFieldqv.text = " " + totalqv; } else { // } } Currently this works with a click event. I want to make this calculation happen if I drag something like a scrollbar.
You have to combine the usage of MouseDown and MouseOut to create a drag outcome obj.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); obj.addEventListener(MouseEvent.MOUSE_UP, mouseUp); function mouseDown($e:MouseEvent):void{ MovieClip($e.currentTarget).startDrag(); } function mouseUp($e:MouseEvent):void{ MovieClip($.currentTarget).stopDrag(); } If you want it to constrain to an X or Y position, add a rectangular box paraments in the startDrag() functions
You will have to use the Mouse up and Mouse down events to achieve this. However, be careful to add and then remove the event listeners when they are not needed. This way you will ensure that the event listeners are properly removed and not added multiple times causing memory issues. private var yourObject:MovieClip; private function addDragListeners():void { yourObject.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown, false, 0, true); yourObject.addEventListener(MouseEvent.MOUSE_DOWN, onMouseUp, false, 0, true); } private function removeDragListeners():void { yourObject.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); yourObject.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseUp); } protected function onMouseDown(e:MouseEvent):void { yourObject.startDrag(); } protected function onMouseUp(e:MouseEvent):void { yourObject.stopDrag(); } You can look into the startDrag() method in case you need to add some bounds for the dragging.
set an id at "Raphaeljs set"
i want to set an id to Raphael set because i want to display it after an event click. this is my set: var divResult = document.getElementById('printResult'); var space2Draw = Raphael(divResult, 1600, 900); var st = space2Draw.set(); st.push( space2Draw.circle(newXCoordinates, newYCoordinates, 20).click((function (valore) { return function () { window.open("index-point.html?id=" + (valore) + "&type=" + type + "&description=" + description + "&name=" + name); } }(valore))).mouseover(function () { this.attr({ 'cursor': 'pointer' }); this.attr({ 'opacity': '.50' }); }).mouseout(function () { this.attr({ 'opacity': '1' }); }) ); in my page i have a button: function show(){ var element = space2Draw.getById(-1); element.show(); } } Is not possible to set an id in this way : set.id = -1? How can I set an id and then I find the set? Thanks in advance for the help.
You can try using setAttribute() to add a CLASS for the elements you want to access later, and then modify their CSS propperties. The first step would be to change the CLASS of each element: myElement.node.setAttribute("class", "class_name"); Unfortunately, Raphael does not allow you to handle sets as unique HTML objects, so you cannot do this for the entire set at once. Instead, you might have to do this for each element in your set, possibly with a for cycle, something like this: for (var i=0; i<st.length; i++) { st[i].node.setAttribute("class", "class_name"); } Then, using JQuery, you can modify the CSS properties of the CLASS you created in order to display the elements in your set. function show(){ $('.class_name').css('display', 'block'); } I hope this helps.
Maybe you can use Raphael data() function to assign any data to your element/set. Example: // you can keep global var for your id and increment it within your code var id = 0; var p = Raphael(100, 100, 500, 500), r = p.rect(150, 150, 80, 40, 5).attr({fill: 'red'}), c = p.circle(200, 200, 70).attr({fill: 'blue'}); var set = p.set(r,c).data("id", id); id++; // then in your click event to get the id you can do var whichSet = this.data("id"); // data("id") will return you the global id variable Good Luck