using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace SourceGit.UI { /// /// Main window for this app. /// public partial class Launcher : Window { /// /// Tab data. /// public class Tab { public string Title { get; set; } public string Tooltip { get; set; } public bool AllowDragDrop { get; set; } public bool IsActive { get; set; } public Git.Repository Repo { get; set; } public object Page { get; set; } } /// /// Alerts. /// public ObservableCollection Errors { get; set; } = new ObservableCollection(); /// /// Opened tabs. /// public ObservableCollection Tabs { get; set; } = new ObservableCollection(); /// /// Constructor /// public Launcher() { Tabs.Add(new Tab() { Title = "HOME", Tooltip = "Repositories Manager", AllowDragDrop = false, Page = new Manager(), }); InitializeComponent(); openedTabs.SelectedItem = Tabs[0]; } /// /// Open repository /// /// public void Open(Git.Repository repo) { for (int i = 1; i < Tabs.Count; i++) { var opened = Tabs[i]; if (opened.Repo.Path == repo.Path) { openedTabs.SelectedItem = opened; return; } } repo.Open(); var page = new Dashboard(repo); var tab = new Tab() { Title = repo.Parent == null ? repo.Name : $"{repo.Parent.Name} : {repo.Name}", Tooltip = repo.Path, AllowDragDrop = true, Repo = repo, Page = page, }; repo.SetPopupManager(page.popupManager); Tabs.Add(tab); openedTabs.SelectedItem = tab; } #region LAYOUT_CONTENT /// /// Context menu for tab items. /// /// /// private void TabsContextMenuOpening(object sender, ContextMenuEventArgs ev) { var tab = (sender as TabItem).DataContext as Tab; if (tab == null) { ev.Handled = true; return; } var repo = tab.Repo; if (repo == null) { ev.Handled = true; return; } var close = new MenuItem(); close.Header = "Close"; close.Click += (o, e) => { Tabs.Remove(tab); tab.Page = null; tab.Repo.RemovePopup(); tab.Repo.Close(); tab.Repo = null; }; var copyPath = new MenuItem(); copyPath.Header = "Copy Path"; copyPath.Click += (o, e) => { Clipboard.SetText(repo.Path); e.Handled = true; }; var refresh = new MenuItem(); refresh.Header = "Refresh"; refresh.Click += (o, e) => { repo.AssertCommand(null); e.Handled = true; }; var menu = new ContextMenu(); menu.Items.Add(close); menu.Items.Add(new Separator()); menu.Items.Add(copyPath); menu.Items.Add(refresh); menu.IsOpen = true; ev.Handled = true; } /// /// Open preference dialog. /// /// /// private void ShowPreference(object sender, RoutedEventArgs e) { var dialog = new Preference(); dialog.Owner = this; dialog.ShowDialog(); } /// /// Open about dialog. /// /// /// private void ShowAbout(object sender, RoutedEventArgs e) { var about = new About(); about.Owner = this; about.ShowDialog(); } /// /// Remove an alert. /// /// /// private void RemoveError(object sender, RoutedEventArgs e) { var alert = (sender as Button).DataContext as string; Errors.Remove(alert); } #endregion #region WINDOW_COMMANDS /// /// Minimize /// private void Minimize(object sender, RoutedEventArgs e) { SystemCommands.MinimizeWindow(this); } /// /// Maximize/Restore /// private void MaximizeOrRestore(object sender, RoutedEventArgs e) { if (WindowState == WindowState.Normal) { SystemCommands.MaximizeWindow(this); } else { SystemCommands.RestoreWindow(this); } } /// /// Quit /// private void Quit(object sender, RoutedEventArgs e) { App.Current.Shutdown(); } #endregion #region DRAG_DROP private void TabsMouseMove(object sender, MouseEventArgs e) { var tab = e.Source as TabItem; if (tab == null || (tab.DataContext as Tab).Repo == null) return; if (Mouse.LeftButton == MouseButtonState.Pressed) { DragDrop.DoDragDrop(tab, tab, DragDropEffects.All); e.Handled = true; } } private void TabsDrop(object sender, DragEventArgs e) { var tabItemSrc = e.Data.GetData(typeof(TabItem)) as TabItem; var tabItemDst = e.Source as TabItem; if (tabItemSrc.Equals(tabItemDst)) return; var tabSrc = tabItemSrc.DataContext as Tab; var tabDst = tabItemDst.DataContext as Tab; if (tabDst.Repo == null) { Tabs.Remove(tabSrc); Tabs.Insert(1, tabSrc); } else { int dstIdx = Tabs.IndexOf(tabDst); Tabs.Remove(tabSrc); Tabs.Insert(dstIdx, tabSrc); } } #endregion #region TAB_SCROLL private void OpenedTabsSizeChanged(object sender, SizeChangedEventArgs e) { if (openedTabs.ActualWidth > openedTabsColumn.ActualWidth) { openedTabsOpts.Visibility = Visibility.Visible; } else { openedTabsOpts.Visibility = Visibility.Collapsed; } } private void ScrollToLeft(object sender, RoutedEventArgs e) { openedTabsScroller.LineLeft(); } private void ScrollToRight(object sender, RoutedEventArgs e) { openedTabsScroller.LineRight(); } #endregion } }