/// <summary> /// Delete current widget from grid. /// Then widgets are realigned, if deleted widget was alone on its row. /// </summary> public void DeleteTile(TileWrapper tile) { _tiles.Remove(tile); _tilesCanvas.DeleteElement(tile); RealignTiles(); WriteTilesSettings(); }
/// <summary> /// add widget to internal collection /// and calc widget screen coordinates /// </summary> protected TileWrapper AddTile(TileWrapper tile, bool doRealign) { // draw tile when adding tile.Draw(null); _tiles.Add(tile); _tilesCanvas.AddElement(tile); if (doRealign) { RealignTiles(); } tile.TapHandler = p => TileClickAt(p, tile); tile.HoldHandler = p => TileHoldAt(p, tile); return tile; }
/// <summary> /// move selected tile to new location /// </summary> /// <param name="movingTile"> </param> /// <param name="location"> </param> private void MoveTileTo(TileWrapper movingTile, Point location) { var targetCell = GetTileCell(location); // if widget doesn't fit to new position by width, do not do anything if (targetCell.X + movingTile.GridSize.Width > _gridWidth) targetCell.X = _gridWidth - movingTile.GridSize.Width; //return; var targetCellIsEmpty = false; while (!targetCellIsEmpty) { object[,] cells = new object[_gridHeight, _gridWidth]; foreach (TileWrapper wsInfo in _tiles) { if (wsInfo != movingTile) for (int y = 0; y < wsInfo.GridSize.Height; y++) for (int x = 0; x < wsInfo.GridSize.Width; x++) cells[wsInfo.GridPosition.Y + y, wsInfo.GridPosition.X + x] = wsInfo; } targetCellIsEmpty = true; for (int y = targetCell.Y; y < Math.Min(targetCell.Y + movingTile.GridSize.Height, 100); y++) for (int x = targetCell.X; x < Math.Min(targetCell.X + movingTile.GridSize.Width, _gridWidth); x++) if ((cells[y, x] != null) && (!cells[y, x].Equals(movingTile))) { targetCellIsEmpty = false; break; } if (!targetCellIsEmpty) { foreach (TileWrapper wsInfo in _tiles) { if ((wsInfo.GridPosition.Y + wsInfo.GridSize.Height - 1) >= targetCell.Y) wsInfo.GridPosition = new Point(wsInfo.GridPosition.X, wsInfo.GridPosition.Y + 1); } } } movingTile.GridPosition = targetCell; RealignTiles(); }
private IAnimation GetExitAnimation(TileWrapper target) { var random = new Random(); return new FunctionBasedAnimation(FunctionBasedAnimation.Functions.Linear) { Duration = AnimationDuration, To = -target.Size.Width - random.Next(1000), From = target.Location.X, OnAnimation = v => target.Location = new Point(v, target.Location.Y), OnAnimationStop = () => { target.ExitAnimation = null; }, }; }
private IAnimation GetEntranceAnimation(TileWrapper target) { var random = new Random(); var x = target.GetScreenRect().Left; // here use GetScreenRect instead Bounds because real coords are wrong return new FunctionBasedAnimation(FunctionBasedAnimation.Functions.Linear) { Duration = AnimationDuration, From = x - 1000 + random.Next(1000 - x - 173), To = x, OnAnimation = v => target.Location = new Point(v, target.Location.Y), OnAnimationStop = () => { target.EntranceAnimation = null; }, }; }
/// <summary> /// Click at tile handler /// </summary> /// <param name="location"></param> /// <param name="tile"> </param> private bool TileClickAt(Point location, TileWrapper tile) { // if Move mode is enabled, place selected widget to the new position // if we click at moving widget, exit from move mode if (SelectionMode) { // if click at moving tile - exit from moving mode // if click at another tile - change moving tile to selected SelectedTile = (tile == SelectedTile) ? null : tile; return true; } // if tile launches external program, start exit animation for visible tiles if (tile.Tile.DoExitAnimation) { Active = false; _launching = true; _tilesCanvas.AnimateExit(); } var clickResult = tile.OnClick(location); // if tile's onClick action failed, play back entrance animation if ((tile.Tile.DoExitAnimation) && (!clickResult)) { // when page activate it plays entrance animation Active = true; } return true; }
/// <summary> /// Long tap handler - entering to customizing mode /// </summary> private bool TileHoldAt(Point location, TileWrapper tile) { if (ParentControl == null) return false; SelectedTile = null; var tileMenu = new ContextMenu(); var menuTileEdit = new MenuItem { Text = "Edit".Localize() }; menuTileEdit.Click += (s, e) => ShowTileSettings(tile); tileMenu.MenuItems.Add(menuTileEdit); var menuTileMove = new MenuItem { Text = "Move".Localize() }; menuTileMove.Click += (s, e) => { SelectedTile = tile; }; tileMenu.MenuItems.Add(menuTileMove); var menuTileDelete = new MenuItem { Text = "Delete".Localize() }; menuTileDelete.Click += (s, e) => DeleteTile(tile); tileMenu.MenuItems.Add(menuTileDelete); var position = ScreenRoutines.ScreenLocaton(tile); position.Offset(location.X, location.Y); tileMenu.Show(ParentControl, position.ToPixels()); return true; }