Kaynağa Gözat

Fix autofocus issue for the goto line dialog and support also columns (#19003)

Signed-off-by: Yaakuro <[email protected]>
Yaakuro 1 ay önce
ebeveyn
işleme
51c4534e8c

+ 53 - 9
Code/Tools/LuaIDE/Source/LUA/LUAEditorGoToLineDialog.cpp

@@ -7,12 +7,20 @@
  */
 
 #include "LUAEditorGoToLineDialog.hxx"
-#include <Source/LUA/moc_LUAEditorGoToLineDialog.cpp>
 
+#include <Source/LUA/moc_LUAEditorGoToLineDialog.cpp>
 #include <Source/LUA/ui_LUAEditorGoToLineDialog.h>
 
+#include <QDialogButtonBox>
+#include <QLineEdit>
+#include <QPushButton>
+#include <QRegExp>
+#include <QRegExpValidator>
+
 namespace LUAEditor
 {
+    static constexpr const char* GotoLineDialogRegEx = "(^\\d+(:\\d+)?$)";
+
     LUAEditorGoToLineDialog::LUAEditorGoToLineDialog(QWidget* parent)
         : QDialog(parent)
     {
@@ -20,7 +28,14 @@ namespace LUAEditor
         m_gui = azcreate(Ui::goToLineDlg, ());
         m_gui->setupUi(this);
         this->setWindowFlags(Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowTitleHint | Qt::WindowCloseButtonHint);
-        connect(m_gui->lineNumberSpinBox, SIGNAL(valueChanged (int)), this, SLOT(spinBoxLineNumberChanged(int)));
+
+        const QRegExp rx(GotoLineDialogRegEx);
+        QRegExpValidator* const validator = new QRegExpValidator(rx, this);
+        m_gui->lineNumber->setValidator(validator);
+
+        connect(m_gui->lineNumber, &QLineEdit::textChanged, this, &LUAEditorGoToLineDialog::handleLineNumberInput);
+        connect(m_gui->buttonBox, &QDialogButtonBox::accepted, this, &LUAEditorGoToLineDialog::validateAndAccept);
+        connect(m_gui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
     }
 
     LUAEditorGoToLineDialog::~LUAEditorGoToLineDialog()
@@ -28,16 +43,45 @@ namespace LUAEditor
         azdestroy(m_gui);
     }
 
-    void LUAEditorGoToLineDialog::setLineNumber(int newNumber)
+    void LUAEditorGoToLineDialog::setLineNumber(int line, int newColumn) const
+    {
+        const QString text = QString::number(line) + QString(":") + QString::number(newColumn);
+        m_gui->lineNumber->setText(text);
+        m_gui->lineNumber->setFocus();
+        m_gui->lineNumber->selectAll();
+    }
+
+    void LUAEditorGoToLineDialog::handleLineNumberInput(const QString& input)
     {
-        m_gui->lineNumberSpinBox->setValue(newNumber);
-        m_gui->lineNumberSpinBox->setFocus();
-        m_gui->lineNumberSpinBox->selectAll();
+        const QRegularExpression re(GotoLineDialogRegEx);
+        QPushButton* const button = m_gui->buttonBox->button(QDialogButtonBox::StandardButton::Ok);
+        button->setEnabled(re.match(input).hasMatch());
     }
 
-    void LUAEditorGoToLineDialog::spinBoxLineNumberChanged(int newNumber)
+    void LUAEditorGoToLineDialog::validateAndAccept()
     {
-        m_lineNumber = newNumber;
-        emit lineNumberChanged(newNumber);
+        m_columnNumber = 0;
+
+        const QString input = m_gui->lineNumber->text();
+        const QStringList parts = input.split(':');
+
+        if (parts.size() < 1) {
+            return;
+        }
+
+        bool lineValid = false;
+        bool columnValid = false;
+
+        const int lineNumber = parts[0].toInt(&lineValid);
+        if (lineValid && !parts[0].isEmpty()) {
+            m_lineNumber = AZStd::max(lineNumber, 1);
+        }
+
+        if (parts.size() == 2) {
+            const int columnNumber = parts[1].toInt(&columnValid);
+            if (columnValid && !parts[1].isEmpty()) {
+                m_columnNumber = AZStd::max(columnNumber, 0);
+            }
+        }
     }
 }

+ 10 - 11
Code/Tools/LuaIDE/Source/LUA/LUAEditorGoToLineDialog.hxx

@@ -32,23 +32,22 @@ namespace LUAEditor
     {
         Q_OBJECT
     public:
-        LUAEditorGoToLineDialog(QWidget *parent = 0);
-        ~LUAEditorGoToLineDialog();
+        explicit LUAEditorGoToLineDialog(QWidget *parent = nullptr);
+        ~LUAEditorGoToLineDialog() override;
         
-        int getLineNumber() { return m_lineNumber; }
+        int getLineNumber() const { return m_lineNumber; }
+        int getColumnNumber() const { return m_columnNumber; }
     
-    signals:
-        void lineNumberChanged(int newNumber);        
-
     public slots:
-        void setLineNumber(int number);
+
+        void setLineNumber(int line, int column) const;
+        void handleLineNumberInput(const QString& input);
+        void validateAndAccept();
 
     private:
         Ui::goToLineDlg* m_gui;
-        int m_lineNumber;
-    private slots:
-        void spinBoxLineNumberChanged(int newNumber);
-        
+        int m_lineNumber = 0;
+        int m_columnNumber = 0;
     };
 
 }

+ 14 - 32
Code/Tools/LuaIDE/Source/LUA/LUAEditorGoToLineDialog.ui

@@ -9,28 +9,16 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>180</width>
-    <height>86</height>
+    <width>292</width>
+    <height>97</height>
    </rect>
   </property>
   <property name="sizePolicy">
-   <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+   <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
     <horstretch>0</horstretch>
     <verstretch>0</verstretch>
    </sizepolicy>
   </property>
-  <property name="minimumSize">
-   <size>
-    <width>180</width>
-    <height>86</height>
-   </size>
-  </property>
-  <property name="maximumSize">
-   <size>
-    <width>180</width>
-    <height>86</height>
-   </size>
-  </property>
   <property name="windowTitle">
    <string>Go to line...</string>
   </property>
@@ -44,16 +32,6 @@
    <property name="sizeConstraint">
     <enum>QLayout::SetFixedSize</enum>
    </property>
-   <item row="2" column="1">
-    <widget class="QDialogButtonBox" name="buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
-     </property>
-    </widget>
-   </item>
    <item row="0" column="0" colspan="2">
     <widget class="QLabel" name="label">
      <property name="text">
@@ -62,15 +40,19 @@
     </widget>
    </item>
    <item row="1" column="0" colspan="2">
-    <widget class="QSpinBox" name="lineNumberSpinBox">
-     <property name="prefix">
-      <string/>
+    <widget class="QLineEdit" name="lineNumber">
+     <property name="placeholderText">
+      <string>line number[:column]</string>
      </property>
-     <property name="minimum">
-      <number>1</number>
+    </widget>
+   </item>
+   <item row="2" column="1">
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
      </property>
-     <property name="maximum">
-      <number>99999</number>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
      </property>
     </widget>
    </item>

+ 5 - 5
Code/Tools/LuaIDE/Source/LUA/LUAEditorMainWindow.cpp

@@ -1393,16 +1393,16 @@ namespace LUAEditor
 
         LUAEditorGoToLineDialog dlg(this);
 
-        int lineNumber = 0, cursorColumn = 0;
-        currentView->GetCursorPosition(lineNumber, cursorColumn);
-        dlg.setLineNumber(lineNumber + 1);
+        int lineNumber = 0, lineColumn = 0;
+        currentView->GetCursorPosition(lineNumber, lineColumn);
+        dlg.setLineNumber(lineNumber, lineColumn);
 
         if (dlg.exec() != QDialog::Rejected)
         {
-            // go to that line of the selected file.
             lineNumber = dlg.getLineNumber();
+            lineColumn = dlg.getColumnNumber();
 
-            currentView->SetCursorPosition(lineNumber, 0);
+            currentView->SetCursorPosition(lineNumber, lineColumn);
         }
     }