Example #1
0
        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;
        }
Example #2
0
        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;
        }
Example #3
0
        /// <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);
                }
            }
        }