[gnome-subtitles/gtk3] Shift dialog improvements



commit ab426f6b0a1f93b718c7886daae3133ded4402a8
Author: Pedro Castro <pedro gnomesubtitles org>
Date:   Sat May 12 14:24:42 2018 +0100

    Shift dialog improvements
    
    Allow to keep the Shift dialog open while applying changes (it's not a
    modal dialog anymore). Setting the shift amount based on the video
    position is now done via a specific action/button instead of
    automatically doing it when showing the dialog (which could be something
    the user wasn't expecting). The dialog is destroyed when closing the
    subtitle file. Don't set radio button sensitivity unnecessarily. They're
    now enabled by default, although some actions may not work in some
    contexts (ex: applying Shift to selected subtitles produces nothing if
    no subtitles are selected).

 .../Core/Command/ShiftTimingsCommand.cs            |   63 ++++++--
 src/GnomeSubtitles/Dialog/TimingsShiftDialog.cs    |  161 ++++++++++++--------
 src/GnomeSubtitles/Ui/Menus.cs                     |    5 +-
 src/GnomeSubtitles/Ui/WidgetStyles.cs              |    2 +
 4 files changed, 152 insertions(+), 79 deletions(-)
---
diff --git a/src/GnomeSubtitles/Core/Command/ShiftTimingsCommand.cs 
b/src/GnomeSubtitles/Core/Command/ShiftTimingsCommand.cs
index b434854..a71078f 100644
--- a/src/GnomeSubtitles/Core/Command/ShiftTimingsCommand.cs
+++ b/src/GnomeSubtitles/Core/Command/ShiftTimingsCommand.cs
@@ -1,6 +1,6 @@
 /*
  * This file is part of Gnome Subtitles.
- * Copyright (C) 2006-2009,2011 Pedro Castro
+ * Copyright (C) 2006-2018 Pedro Castro
  *
  * Gnome Subtitles is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -45,21 +45,20 @@ public class ShiftTimingsCommand : FixedMultipleSelectionCommand {
        protected override bool ChangeValues () {
                if (useTimes) {
                        if (ApplyToAll)
-                               ShiftTimesAll();
+                               return ShiftTimesAll();
                        else if (ApplyToSimple)
-                               ShiftTimesSimple();
+                               return ShiftTimesSimple();
                        else
-                               ShiftTimesRange();
+                               return ShiftTimesRange();
                }
                else {
                        if (ApplyToAll)
-                               ShiftFramesAll();
+                               return ShiftFramesAll();
                        else if (ApplyToSimple)
-                               ShiftFramesSimple();
+                               return ShiftFramesSimple();
                        else
-                               ShiftFramesRange();
+                               return ShiftFramesRange();
                }
-               return true;
        }
 
        protected override void PostProcess () {
@@ -68,50 +67,86 @@ public class ShiftTimingsCommand : FixedMultipleSelectionCommand {
 
        /* Private Members */
 
-       private void ShiftTimesAll () {
+       private Boolean ShiftTimesAll () {
+               if (Base.Document.Subtitles.Count == 0) {
+                       return false;
+               }
+       
                ShiftOperator shiftOp = new ShiftOperator(Base.Document.Subtitles);
                shiftOp.Shift(time);
                time = time.Negate();
+
+               return true;
        }
 
-       private void ShiftFramesAll () {
+       private Boolean ShiftFramesAll () {
+               if (Base.Document.Subtitles.Count == 0) {
+                       return false;
+               }
+               
                ShiftOperator shiftOp = new ShiftOperator(Base.Document.Subtitles);
                shiftOp.Shift(frames);
                frames = -frames;
+               
+               return true;
        }
 
-       private void ShiftTimesSimple () {
+       private Boolean ShiftTimesSimple () {
+               if (Paths.Length == 0) {
+                       return false;
+               }
+       
                foreach (TreePath path in Paths) {
                        Subtitle subtitle = Base.Document.Subtitles[path];
                        subtitle.Times.Shift(time);
                }
                time = time.Negate();
+               
+               return true;
        }
 
-       private void ShiftFramesSimple () {
+       private Boolean ShiftFramesSimple () {
+               if (Paths.Length == 0) {
+                       return false;
+               }
+               
                foreach (TreePath path in Paths) {
                        Subtitle subtitle = Base.Document.Subtitles[path];
                        subtitle.Frames.Shift(frames);
                }
                frames = -frames;
+               
+               return true;
        }
 
-       private void ShiftTimesRange () {
+       private Boolean ShiftTimesRange () {
+               if ((Paths == null) || (Paths.Length == 0)) {
+                       return false;
+               }
+       
                int firstSubtitle = Util.PathToInt(FirstPath);
                int lastSubtitle = Util.PathToInt(LastPath);
 
                ShiftOperator shiftOp = new ShiftOperator(Base.Document.Subtitles);
                shiftOp.Shift(time, firstSubtitle, lastSubtitle);
                time = time.Negate();
+               
+               return true;
        }
 
-       private void ShiftFramesRange () {
+       private Boolean ShiftFramesRange () {
+               if ((Paths == null) || (Paths.Length == 0)) {
+                       return false;
+               }
+       
                int firstSubtitle = Util.PathToInt(FirstPath);
                int lastSubtitle = Util.PathToInt(LastPath);
 
                ShiftOperator shiftOp = new ShiftOperator(Base.Document.Subtitles);
                shiftOp.Shift(frames, firstSubtitle, lastSubtitle);
                frames = -frames;
+               
+               return true;
        }
 }
 
diff --git a/src/GnomeSubtitles/Dialog/TimingsShiftDialog.cs b/src/GnomeSubtitles/Dialog/TimingsShiftDialog.cs
index 521cde5..c82fe0f 100644
--- a/src/GnomeSubtitles/Dialog/TimingsShiftDialog.cs
+++ b/src/GnomeSubtitles/Dialog/TimingsShiftDialog.cs
@@ -24,6 +24,7 @@ using GnomeSubtitles.Ui.View;
 using Gtk;
 using Mono.Unix;
 using SubLib.Core.Domain;
+using SubLib.Core.Timing;
 using System;
 
 namespace GnomeSubtitles.Dialog {
@@ -31,7 +32,7 @@ namespace GnomeSubtitles.Dialog {
 //TODO set spinButton limits according to selection type
 //TODO show informative message about the Ctrl+Shift++ shortcuts
 public class TimingsShiftDialog : BaseDialog {
-       private TimingMode timingMode = TimingMode.Frames;
+       private TimingMode timingMode;
 
        /* Widgets */
        private Frame timingModeFrame;
@@ -40,17 +41,29 @@ public class TimingsShiftDialog : BaseDialog {
        private RadioButton selectedSubtitlesRadioButton = null;
        private RadioButton fromFirstSubtitleToSelectionRadioButton = null;
        private RadioButton fromSelectionToLastSubtitleRadioButton = null;
+       private Button videoButton = null;
 
        public TimingsShiftDialog () : base(){
                Init(BuildDialog());
        }
+       
+       /* Overriden members */
+
+       public override DialogScope Scope {
+               get { return DialogScope.Document; }
+       }
+
+       public override void Show () {
+               UpdateFromSelection();
+               base.Show();
+       }
 
 
        /* Methods */
-       
+
        private Gtk.Dialog BuildDialog () {
-               Gtk.Dialog dialog = new Gtk.Dialog(Catalog.GetString("Shift Timings"), Base.Ui.Window, 
DialogFlags.Modal | DialogFlagsUseHeaderBar,
-                       Util.GetStockLabel("gtk-cancel"), ResponseType.Cancel, Catalog.GetString("_Shift"), 
ResponseType.Ok);
+               Gtk.Dialog dialog = new Gtk.Dialog(Catalog.GetString("Shift Timings"), Base.Ui.Window, 
DialogFlags.DestroyWithParent,
+                       Util.GetStockLabel("gtk-close"), ResponseType.Cancel, Catalog.GetString("Apply"), 
ResponseType.Ok);
 
                dialog.DefaultResponse = ResponseType.Ok;
                dialog.DefaultWidth = 1; //Needed otherwise the tip label will be displayed in a single line 
making the dialog have a huge width
@@ -68,14 +81,18 @@ public class TimingsShiftDialog : BaseDialog {
                spinButton = new SpinButton(new Adjustment(0, 0, 0, 1, 10, 0), 0, 0);
                spinButton.WidthChars = Core.Util.SpinButtonTimeWidthChars;
                spinButton.Alignment = 0.5f;
-               Button button = new Button("gtk-clear");
-               button.Clicked += OnClear;
+               Button clearButton = new Button(Catalog.GetString("Reset"));
+               clearButton.Clicked += OnClear;
+               videoButton = new Button(Catalog.GetString("Set From Video"));
+               videoButton.TooltipText = Catalog.GetString("Sets the shift amount in order for the selected 
subtitles to start at the current video position.");
+               videoButton.Clicked += OnSetFromVideo;
 
                Box timingModeHBox = new Box(Orientation.Horizontal, WidgetStyles.BoxSpacingMedium);
                timingModeHBox.BorderWidth = WidgetStyles.BorderWidthMedium;
-               timingModeHBox.MarginLeft = 10;
+               timingModeHBox.MarginLeft = WidgetStyles.FrameContentSpacingMedium;
                timingModeHBox.Add(spinButton);
-               timingModeHBox.Add(button);
+               timingModeHBox.Add(clearButton);
+               timingModeHBox.Add(videoButton);
                
                timingModeFrame.Add(timingModeHBox);
                box.Add(timingModeFrame);
@@ -96,7 +113,7 @@ public class TimingsShiftDialog : BaseDialog {
 
                Box applyToFrameVBox = new Box(Orientation.Vertical, WidgetStyles.BoxSpacingMedium);
                applyToFrameVBox.BorderWidth = WidgetStyles.BorderWidthMedium;
-               applyToFrameVBox.MarginLeft = 10;
+               applyToFrameVBox.MarginLeft = WidgetStyles.FrameContentSpacingMedium;
                applyToFrameVBox.Add(allSubtitlesRadioButton);
                applyToFrameVBox.Add(selectedSubtitlesRadioButton);
                applyToFrameVBox.Add(fromFirstSubtitleToSelectionRadioButton);
@@ -108,36 +125,30 @@ public class TimingsShiftDialog : BaseDialog {
                
                //Tips label
                
-               Label label = new Label("<small><i>" + Catalog.GetString("Tip: use Shift+Plus/Minus (on the 
numpad) to shift timings directly from the main window.") + "</i></small>");
+               Label label = new Label("<small><i>" + Catalog.GetString("Tip: alternatively use Shift + 
Numpad Plus/Minus to shift timings directly from the main window.") + "</i></small>");
                label.UseMarkup = true;
                label.Wrap = true;
                box.Add(label);
 
                dialog.ContentArea.Add(box);
-               UpdateContents(true);
+       
+               timingMode = Base.TimingMode;   
+               UpdateFromTimingMode();
+               UpdateFromSelection();
+               UpdateVideoButtonSensitivity();
+               
+               Base.TimingModeChanged += OnBaseTimingModeChanged;
+               Base.VideoLoaded += OnBaseVideoLoaded;
+               Base.VideoUnloaded += OnBaseVideoUnloaded;
+               
                dialog.ContentArea.ShowAll();
 
                return dialog;
        }
 
-       public override void Show () {
-               UpdateContents(false);
-               base.Show();
-       }
-
        /* Private methods */
 
-       private void UpdateContents (bool initializing) {
-               UpdateFromTimingMode(Base.TimingMode, initializing);
-               UpdateFromSelection();
-               UpdateSpinButtonValue(initializing);
-       }
-
-       private void UpdateFromTimingMode (TimingMode newTimingMode, bool initializing) {
-               if ((!initializing) && (newTimingMode == timingMode))
-                       return;
-
-               timingMode = newTimingMode;
+       private void UpdateFromTimingMode () {
                Core.Util.SetSpinButtonTimingMode(spinButton, timingMode);
                Core.Util.SetSpinButtonMaxAdjustment(spinButton, timingMode, true);
 
@@ -145,21 +156,39 @@ public class TimingsShiftDialog : BaseDialog {
                string markup = "<b>" + label + "</b>";
                (timingModeFrame.LabelWidget as Label).Markup = markup;
        }
+       
+       private void UpdateVideoButtonSensitivity () {
+               videoButton.Sensitive = Core.Base.Ui.Video.IsLoaded;
+       }
 
        private void UpdateFromSelection () {
                int selectionCount = Core.Base.Ui.View.Selection.Count;
-               fromFirstSubtitleToSelectionRadioButton.Sensitive = (selectionCount == 1);
-               fromSelectionToLastSubtitleRadioButton.Sensitive = (selectionCount == 1);
-
-               if (selectionCount > 0)
+               if (selectionCount > 1)
                        selectedSubtitlesRadioButton.Active = true;
                else
-                       selectedSubtitlesRadioButton.Sensitive = false;
+                       allSubtitlesRadioButton.Active = true;
+       }
+
+       private SelectionIntended GetSelectionIntended () {
+               if (allSubtitlesRadioButton.Active)
+                       return SelectionIntended.All;
+               else if (selectedSubtitlesRadioButton.Active)
+                       return SelectionIntended.Simple;
+               else if (fromFirstSubtitleToSelectionRadioButton.Active)
+                       return SelectionIntended.SimpleToFirst;
+               else
+                       return SelectionIntended.SimpleToLast;
        }
 
-       private void UpdateSpinButtonValue (bool initializing) {
+
+       /* Event Members */
+       
+       private void OnClear (object o, EventArgs args) {
+               spinButton.Value = 0;
+       }
+       
+       private void OnSetFromVideo (object o, EventArgs args) {
                if (!Core.Base.Ui.Video.IsLoaded) {
-                       SetSpinButtonValue(0);
                        return;
                }
 
@@ -168,7 +197,7 @@ public class TimingsShiftDialog : BaseDialog {
 
                double subtitlePosition = 0;
                double videoPosition = 0;
-               if (Base.TimingModeIsTimes) {
+               if (timingMode == TimingMode.Times) {
                        subtitlePosition = subtitle.Times.Start.TotalMilliseconds;
                        videoPosition = Core.Base.Ui.Video.Position.CurrentTime.TotalMilliseconds;
                }
@@ -178,41 +207,51 @@ public class TimingsShiftDialog : BaseDialog {
                }
 
                double difference = videoPosition - subtitlePosition;
-               SetSpinButtonValue(difference);
+               spinButton.Value = difference;
        }
-
-       private void SetSpinButtonValue (double newValue) {
+       
+       private void OnBaseTimingModeChanged (TimingMode newTimingMode) {
+       if (timingMode == newTimingMode) {
+                       return;
+               }
+               
+               int oldValue = (int)spinButton.Value; //contains frames or ms, depending on the old timing 
mode
+               float frameRate = Base.Document.Subtitles.Properties.CurrentFrameRate;
+               double newValue = (newTimingMode == TimingMode.Times ?
+                               TimingUtil.FramesToTime(oldValue, frameRate).TotalMilliseconds :
+                               TimingUtil.TimeMillisecondsToFrames(oldValue, frameRate));
+                               
+               timingMode = newTimingMode;
+               UpdateFromTimingMode();
                spinButton.Value = newValue;
+    }
+    
+    private void OnBaseVideoLoaded (Uri videoUri) {
+       UpdateVideoButtonSensitivity();
        }
 
-       private SelectionIntended GetSelectionIntended () {
-               if (allSubtitlesRadioButton.Active)
-                       return SelectionIntended.All;
-               else if (selectedSubtitlesRadioButton.Active)
-                       return SelectionIntended.Simple;
-               else if (fromFirstSubtitleToSelectionRadioButton.Active)
-                       return SelectionIntended.SimpleToFirst;
-               else
-                       return SelectionIntended.SimpleToLast;
-       }
-
-       private void OnClear (object o, EventArgs args) {
-               SetSpinButtonValue(0);
+       private void OnBaseVideoUnloaded () {
+               UpdateVideoButtonSensitivity();
        }
 
        protected override bool ProcessResponse (ResponseType response) {
-               if ((response == ResponseType.Ok) && (Math.Abs(spinButton.Value) > float.Epsilon)) {
-                       SelectionIntended selectionIntended = GetSelectionIntended();
-
-                       if (timingMode == TimingMode.Times) {
-                               TimeSpan time = TimeSpan.FromMilliseconds(spinButton.Value);
-                               Base.CommandManager.Execute(new ShiftTimingsCommand(time, selectionIntended));
-                       }
-                       else {
-                               int frames = (int)spinButton.Value;
-                               Base.CommandManager.Execute(new ShiftTimingsCommand(frames, 
selectionIntended));
+               if (response == ResponseType.Ok) {
+                       if (Math.Abs(spinButton.Value) > float.Epsilon) {
+                               SelectionIntended selectionIntended = GetSelectionIntended();
+       
+                               if (timingMode == TimingMode.Times) {
+                                       TimeSpan time = TimeSpan.FromMilliseconds(spinButton.Value);
+                                       Base.CommandManager.Execute(new ShiftTimingsCommand(time, 
selectionIntended));
+                               }
+                               else {
+                                       int frames = (int)spinButton.Value;
+                                       Base.CommandManager.Execute(new ShiftTimingsCommand(frames, 
selectionIntended));
+                               }
                        }
+
+                       return true;
                }
+               
                return false;
        }
 
diff --git a/src/GnomeSubtitles/Ui/Menus.cs b/src/GnomeSubtitles/Ui/Menus.cs
index 66b7cf0..a53d7f5 100644
--- a/src/GnomeSubtitles/Ui/Menus.cs
+++ b/src/GnomeSubtitles/Ui/Menus.cs
@@ -147,15 +147,12 @@ public class Menus {
        private void SetSubtitleCountDependentSensitivity (int count) {
                if (count == 0) {
                        SetSensitivity(WidgetNames.TimingsAdjust, false);
-                       SetSensitivity(WidgetNames.TimingsShift, false);
                }
                else if (count == 1) {
                        SetSensitivity(WidgetNames.TimingsAdjust, false);
-                       SetSensitivity(WidgetNames.TimingsShift, true);
                }
                else {
                        SetSensitivity(WidgetNames.TimingsAdjust, true);
-                       SetSensitivity(WidgetNames.TimingsShift, true);
                }
        }
 
@@ -190,6 +187,7 @@ public class Menus {
                SetSensitivity(WidgetNames.SearchReplace, documentLoaded);
                /* Timings Menu */
                SetSensitivity(WidgetNames.TimingsSynchronize, documentLoaded);
+               SetSensitivity(WidgetNames.TimingsShift, documentLoaded);
                /* Video Menu */
                SetVideoDocumentLoadedSensitivity(documentLoaded);
                /* Tools Menu */
@@ -216,7 +214,6 @@ public class Menus {
                        SetSensitivity(WidgetNames.SearchFindPrevious, false);
                        /* Timings Menu */
                        SetSensitivity(WidgetNames.TimingsAdjust, false);
-                       SetSensitivity(WidgetNames.TimingsShift, false);
                        /* Toolbar */
                        SetSensitivity(WidgetNames.DeleteSubtitlesButton, false);
                        SetSensitivity(WidgetNames.UndoButton, false);
diff --git a/src/GnomeSubtitles/Ui/WidgetStyles.cs b/src/GnomeSubtitles/Ui/WidgetStyles.cs
index a356a7b..3f979b1 100644
--- a/src/GnomeSubtitles/Ui/WidgetStyles.cs
+++ b/src/GnomeSubtitles/Ui/WidgetStyles.cs
@@ -45,6 +45,8 @@ public class WidgetStyles {
 
        public const int BoxSpacingMedium = 6;
        public const int BoxSpacingLarge = 12;
+       
+       public const int FrameContentSpacingMedium = 10;
 
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]