private void InitializeColorComboBox(Gtk.ComboBox colorChooser, ObservableCollection <FileNodeColorViewModel> colors, MenuLayoutViewModel dataContext) { colorChooser.SetValue(IFakeDependencyObjectHelpers.DataContextPropertyName, dataContext); colorChooser.TooltipText = MenuLayoutViewModel.ColorTip; foreach (var color in colors) { var pixbufColor = new Gdk.Pixbuf(Gdk.Colorspace.Rgb, true, 8, 14, 14); var uintColor = (uint)((color.Fill.Red & 0xFF) << 24) | (uint)((color.Fill.Green & 0xFF) << 16) | (uint)((color.Fill.Blue & 0xFF) << 8) | 0xFF; pixbufColor.Fill(uintColor); var pixbuf = new Gdk.Pixbuf(Gdk.Colorspace.Rgb, true, 8, 16, 16); pixbuf.Fill(0xFF); // black background pixbufColor.CopyArea(0, 0, 14, 14, pixbuf, 1, 1); ColorPixbufs[color.IntvColor] = pixbuf; } Gtk.CellRenderer cellRenderer = new Gtk.CellRendererPixbuf() { Xalign = 0 }; colorChooser.PackStart(cellRenderer, false); colorChooser.SetCellDataFunc(cellRenderer, (l, e, m, i) => VisualHelpers.CellImageRenderer <FileNodeColorViewModel>(l, e, m, i, c => ColorPixbufs[c.IntvColor])); cellRenderer = new Gtk.CellRendererCombo() { Xalign = 0, Xpad = 4 }; colorChooser.PackEnd(cellRenderer, true); colorChooser.SetCellDataFunc(cellRenderer, (l, e, m, i) => VisualHelpers.CellTextRenderer <FileNodeColorViewModel>(l, e, m, i, c => c.Name)); var colorListStore = new Gtk.ListStore(typeof(FileNodeColorViewModel)); colorListStore.SynchronizeCollection(colors); colorChooser.Model = colorListStore; MenuLayoutCommandGroup.SetColorCommand.CanExecuteChanged += HandleCanExecuteSetColorChanged; }
private void InitializeMenuLayout(Gtk.TreeView menuLayout, MenuLayoutViewModel dataContext) { menuLayout.SetValue(IFakeDependencyObjectHelpers.DataContextPropertyName, dataContext); var column = new Gtk.TreeViewColumn(); Gtk.CellRenderer cellRenderer = new Gtk.CellRendererPixbuf(); column.PackStart(cellRenderer, true); column.SetCellDataFunc(cellRenderer, (l, c, m, i) => VisualHelpers.CellImageColumnRenderer <FileNodeViewModel>(l, c, m, i, p => p.Icon)); ////column.Sizing = Gtk.TreeViewColumnSizing.Fixed; ////column.FixedWidth = 20; menuLayout.AppendColumn(column); column = new Gtk.TreeViewColumn() { Title = MenuLayoutViewModel.LongNameHeader }; cellRenderer = new Gtk.CellRendererText(); _longNameEditor = new TextCellInPlaceEditor(menuLayout, column, cellRenderer as Gtk.CellRendererText, FileSystemConstants.MaxLongNameLength) { IsValidCharacter = INTV.Core.Model.Grom.Characters.Contains }; _longNameEditor.EditorClosed += HandleInPlaceEditorClosed; column.PackStart(cellRenderer, true); column.SetCellDataFunc(cellRenderer, (l, c, m, i) => VisualHelpers.CellTextColumnRenderer <FileNodeViewModel>(l, c, m, i, p => p.LongName.SafeString())); column.Sizing = Gtk.TreeViewColumnSizing.Fixed; column.FixedWidth = Properties.Settings.Default.MenuLayoutLongNameColWidth; column.Resizable = true; menuLayout.AppendColumn(column); column = new Gtk.TreeViewColumn() { Title = MenuLayoutViewModel.ShortNameHeader }; cellRenderer = new Gtk.CellRendererText(); _shortNameEditor = new TextCellInPlaceEditor(menuLayout, column, cellRenderer as Gtk.CellRendererText, FileSystemConstants.MaxShortNameLength) { IsValidCharacter = INTV.Core.Model.Grom.Characters.Contains }; _shortNameEditor.EditorClosed += HandleInPlaceEditorClosed; column.PackStart(cellRenderer, true); column.SetCellDataFunc(cellRenderer, (l, c, m, i) => VisualHelpers.CellTextColumnRenderer <FileNodeViewModel>(l, c, m, i, p => p.ShortName.SafeString())); column.Sizing = Gtk.TreeViewColumnSizing.Fixed; column.FixedWidth = Properties.Settings.Default.MenuLayoutShortNameColWidth; column.Resizable = true; menuLayout.AppendColumn(column); column = new Gtk.TreeViewColumn() { Title = MenuLayoutViewModel.ManualHeader }; cellRenderer = new Gtk.CellRendererText(); column.PackStart(cellRenderer, true); column.SetCellDataFunc(cellRenderer, (l, c, m, i) => VisualHelpers.CellTextColumnRenderer <FileNodeViewModel>(l, c, m, i, GetManualColumnStringValue)); column.Sizing = Gtk.TreeViewColumnSizing.Fixed; column.FixedWidth = Properties.Settings.Default.MenuLayoutManualColWidth; column.Resizable = true; menuLayout.AppendColumn(column); column = new Gtk.TreeViewColumn() { Title = MenuLayoutViewModel.SaveDataHeader }; cellRenderer = new Gtk.CellRendererText(); column.PackStart(cellRenderer, true); ////column.SetCellDataFunc(cellRenderer, (l,c,m,i) => VisualHelpers.CellTextColumnRenderer<ProgramDescriptionViewModel>(l,c,m,i, p => p.Name)); ////column.Sizing = Gtk.TreeViewColumnSizing.Fixed; ////column.FixedWidth = Properties.Settings.Default.MenuLayoutSaveDataColWidth; column.Resizable = true; column.Visible = Properties.Settings.Default.ShowAdvancedFeatures; menuLayout.AppendColumn(column); menuLayout.HasTooltip = true; menuLayout.QueryTooltip += HandleMenuLayoutQueryTooltip; var menuLayoutStore = new Gtk.TreeStore(typeof(FileNodeViewModel)); dataContext.SynchronizeToTreeStore(menuLayoutStore); menuLayout.Model = menuLayoutStore; menuLayout.EnableModelDragSource(Gdk.ModifierType.Button1Mask, DragDropSourceEntries, Gdk.DragAction.Move); menuLayout.EnableModelDragDest(DragDropTargetEntries, Gdk.DragAction.Copy | Gdk.DragAction.Move); menuLayout.Selection.Changed += HandleSelectionChanged; dataContext.PropertyChanged += HandleMenuLayoutPropertyChanged; }
/// <summary> /// Handles the drag data received event. /// </summary> /// <param name="o">The menu layout Gtk.TreeView.</param> /// <param name="args">The event data.</param> protected void HandleDragDataReceived(object o, Gtk.DragDataReceivedArgs args) { DebugDragDrop("HandleDragDataReceived"); var treeView = o as Gtk.TreeView; Gtk.TreePath path; Gtk.TreeViewDropPosition pos; if (treeView.GetDestRowAtPos(args.X, args.Y, out path, out pos)) { DebugDragDrop("HandleDragDataReceived: path: " + path + " pos: " + pos); } Folder dropTarget = null; int insertLocation = -1; Gtk.TreeIter droppedOnItemIter; if (treeView.Model.GetIter(out droppedOnItemIter, path)) { var droppedOnItem = treeView.Model.GetValue(droppedOnItemIter, 0) as FileNodeViewModel; dropTarget = droppedOnItem.Model as Folder; if (dropTarget == null) { // Dropped on an item. dropTarget = droppedOnItem.Parent as Folder; switch (pos) { case Gtk.TreeViewDropPosition.Before: case Gtk.TreeViewDropPosition.IntoOrBefore: insertLocation = path.Indices.Last(); // insert before break; case Gtk.TreeViewDropPosition.After: case Gtk.TreeViewDropPosition.IntoOrAfter: insertLocation = path.Indices.Last() + 1; // insert after if (insertLocation >= dropTarget.Items.Count()) { insertLocation = -1; } break; } } else { // Dropped on a folder. switch (pos) { case Gtk.TreeViewDropPosition.Before: dropTarget = dropTarget.Parent as Folder; insertLocation = path.Indices.Last(); // insert before folder break; case Gtk.TreeViewDropPosition.After: dropTarget = dropTarget.Parent as Folder; insertLocation = path.Indices.Last() + 1; // insert after folder if (insertLocation >= dropTarget.Items.Count()) { insertLocation = -1; } break; case Gtk.TreeViewDropPosition.IntoOrBefore: insertLocation = 0; // insert at beginning of folder break; case Gtk.TreeViewDropPosition.IntoOrAfter: insertLocation = -1; // append at end of folder break; } } } else { // Append to end of root. pos = Gtk.TreeViewDropPosition.After; dropTarget = ViewModel.HostPCMenuLayout.Model as Folder; } if (dropTarget != null) { var menuLayout = ViewModel.HostPCMenuLayout; if (args.Info == RomListViewModel.DragDropSourceDataIdentifier) { DebugDragDrop("HandleDragDataReceived: Data from ROM list"); var itemsToAdd = new List <ProgramDescription>(); var stringIndices = System.Text.Encoding.UTF8.GetString(args.SelectionData.Data).Split('\n'); foreach (var stringIndex in stringIndices) { int index; if (int.TryParse(stringIndex, out index)) { var program = INTV.Shared.Model.Program.ProgramCollection.Roms[index]; if (program != null) { itemsToAdd.Add(program); } } } MenuLayoutViewModel.AddItems(menuLayout, dropTarget, itemsToAdd, insertLocation); } else if (args.Info == MenuLayoutViewModel.DragDataFormatIdentifier) { DebugDragDrop("HandleDragDataReceived: Rearrange drop"); var itemsToMove = new List <FileNodeViewModel>(); var stringPaths = System.Text.Encoding.UTF8.GetString(args.SelectionData.Data).Split('\n'); foreach (var stringPath in stringPaths) { var itemToMovePath = new Gtk.TreePath(stringPath); Gtk.TreeIter itemIter; if (treeView.Model.GetIter(out itemIter, itemToMovePath)) { var fileNode = treeView.Model.GetValue(itemIter, 0) as FileNodeViewModel; itemsToMove.Add(fileNode); DebugDragDrop("HandleDragDataReceived: Plan to move: " + fileNode.LongName + " : " + itemToMovePath.ToString()); } } var newParent = menuLayout.FindViewModelForModel(dropTarget); newParent.MoveItems(menuLayout, newParent, insertLocation, itemsToMove); } } }