[education/kstars] /: Focus Advisor v4 Results Table

John Evans null at kde.org
Fri Aug 2 12:21:45 BST 2024


Git commit 1b939a3df096f17bde200ef29f36d6244f9a0475 by John Evans.
Committed on 02/08/2024 at 11:21.
Pushed by johnevans into branch 'master'.

Focus Advisor v4 Results Table

Added a results table to Focus Advisor version 4. The purpose of this is to allow the user to see progress towards solution of the various runs: Coarse Adjustment, Fine Adjustment, etc.

Updated KStars Handbook for latest Focus Advisor version.

Fixed an issue where overscan variability can cause excessive reruns.

M  +135  -46   doc/ekos-focus.docbook
M  +-    --    doc/focus_advisor.png
A  +-    --    doc/focus_advisor_coarse_adj.png
A  +-    --    doc/focus_advisor_find_stars.png
A  +-    --    doc/focus_advisor_fine_adj.png
A  +-    --    doc/focus_advisor_help.png
M  +-    --    doc/focus_process.png
M  +2    -2    doc/index.docbook
M  +3    -3    kstars/ekos/focus/curvefit.cpp
M  +167  -69   kstars/ekos/focus/focusadvisor.cpp
M  +42   -2    kstars/ekos/focus/focusadvisor.h
M  +41   -11   kstars/ekos/focus/focusadvisor.ui

https://invent.kde.org/education/kstars/-/commit/1b939a3df096f17bde200ef29f36d6244f9a0475

diff --git a/doc/ekos-focus.docbook b/doc/ekos-focus.docbook
index 976ab2f61e..8d5771c87a 100644
--- a/doc/ekos-focus.docbook
+++ b/doc/ekos-focus.docbook
@@ -1041,8 +1041,7 @@
       </listitem>
 
       <listitem>
-        <para><guilabel>Donut Buster</guilabel>: This is an experimental feature and should be used with caution. The
-        intention of Donut Buster is to improve focusing for telescopes with central obstructions that create donut shaped
+        <para><guilabel>Donut Buster</guilabel>: The intention of Donut Buster is to improve focusing for telescopes with central obstructions that create donut shaped
         stars when defocused, e.g. Newtonians, SCTs, RASAs, Ritchey-Cretiens, etc.</para>
 
         <para> <guilabel>Donut Buster</guilabel> is only available for Linear 1 Pass, walks of Fixed and CFZ Shuffle,
@@ -1071,22 +1070,30 @@
             algorithm when <guilabel>Refine Curve Fit</guilabel> is checked. The higher the value the more outliers will be
             excluded from the curve fitting process. The default value is 0.2.</para>
           </listitem>
+        </itemizedlist>
+      </listitem>
+
+      <listitem>
+        <para> <guilabel>Scan for Start Position</guilabel> is only available for Linear 1 Pass, walks of Fixed and CFZ Shuffle,
+        curves fits of Hyperbola and Parabola, and focus measures of: HFR, HFR Adj and FWHM.</para>
 
+        <para> Check this option to have Focus scan around the current focuser position to find an approximate optimum
+        focus position. The purpose of this is to ensure that Autofocus starts near to the focus position. The
+        following sub-options are available:</para>
+
+        <itemizedlist>
           <listitem>
-            <para> <guilabel>Scan for Start Position</guilabel>: Check this option to have Focus scan around the current
-            focuser position to find an approximate optimum focus position. The purpose of this is to ensure that Autofocus starts
-            near to the focus position. The following sub-options are available:</para>
+            <para> <guilabel>Always On</guilabel>: When checked Scan for Start Position is always run at the start of
+            Autofocus. When unchecked, it is only run when Autofocus fails and is rerun.</para>
+          </listitem>
 
-            <itemizedlist>
-              <listitem>
-                <para> <guilabel>Num Datapoints</guilabel>: The number of datapoints to use in each scan. 5 is a good place to start.</para>
-              </listitem>
+          <listitem>
+            <para> <guilabel>Num Datapoints</guilabel>: The number of datapoints to use in each scan. 5 is a good place to start.</para>
+          </listitem>
 
-              <listitem>
-                <para> <guilabel>Initial Step size x</guilabel>: A multiplicative factor to apply to the <guilabel>Initial
-                Step size</guilabel> for use in the Scan for Start Position. Default is 1.0.</para>
-              </listitem>
-            </itemizedlist>
+          <listitem>
+            <para> <guilabel>Initial Step size x</guilabel>: A multiplicative factor to apply to the <guilabel>Initial
+            Step size</guilabel> for use in the Scan for Start Position. Default is 1.0.</para>
           </listitem>
         </itemizedlist>
       </listitem>
@@ -1474,70 +1481,152 @@
       </mediaobject>
     </screenshot>
 
-    <para> This is the Focus Advisor dialog. It is a feature to assist with management of focus parameters.</para>
-
-    <para> The purpose of Focus Advisor is to help people struggling to use the Focus module within Ekos. The Focus module is
+    <para>The Focus Advisor dialog is a feature to assist with setting up of focus parameters. To use, select the
+    required options and press <guilabel>Run</guilabel>. This is currently an <emphasis role="bold">experimental feature.</emphasis></para>
+    <para> The purpose of Focus Advisor is to help people to use the Focus module within Ekos. The Focus module is
     functionally rich and contains a lot of parameters that need to be set self-consistently to achieve good results. Focus
     Advisor is designed to help with basic parameter setup that should achieve focus. It is not designed to achieve the best possible
     focus for your equipment; you will have to experiment with your setup to achieve that. But Focus Advisor provides a place to
     start that experimentation.</para>
-
-    <para> So Focus Advisor is aimed towards the less experienced users.</para>
+    <para> Focus Advisor is aimed towards the less experienced users.</para>
     <para> If Focus Advisor does not appear to give good results on your setup why not start a discussion on the forum so it can
     be enhanced to give better results in the future. This way it will build over time to be more useful.</para>
     <para> When you click on Focus Advisor it works out a series of parameter recommendations based on the Optical
     Train you are using in Focus.</para>
-    <para> At the top of the dialog it displays information about the connected Optical Train. Then it displays 6 lines relating
-    to various sets of parameters used within Focus. Against each line is a checkbox to update the associated Focus fields
-    with Focus Advisor's recommendations.</para>
-    <para> Focus parameters are broken into the following groupings:</para>
-
+    <para> There are 4 checkboxes on display that by default are all checked. Some can be toggled off if required. For
+    example, Update Parameters will reset most parameters to standard settings. Once run, it is not necessary to repeatedly
+    run this option so the associated checkbox can be toggled off for subsequent runs.</para>
+    <para>The following buttons are available:</para>
     <itemizedlist>
     <listitem>
-    <para> <guilabel>Step Size</guilabel>: This is the suggested focus step size to use. This is a critical parameter. It can
-    be defaulted from the Critical Focus Zone (CFZ) dialog if you know how to set that up. Alternatively, if you know a reasonable
-    value for your equipment from other sources you can just enter that.</para>
+    <para> <guilabel>Help</guilabel>: Press this button to launch the Focus Advisor Help dialog:</para>
+    <screenshot>
+      <screeninfo> Focus Advisor - Help</screeninfo>
+      <mediaobject>
+        <imageobject><imagedata fileref="focus_advisor_help.png" format="PNG" width="50%"/></imageobject>
+        <textobject><phrase>Focus Advisor - Help</phrase></textobject>
+      </mediaobject>
+    </screenshot>
+    <para> The Help dialog shows details of the current Optical Train at the top. Then comes a table comparison of the value of
+    each Focus parameter in <link linkend="focus-settings">Focus Settings</link> versus the value suggested by Focus
+    Advisor. This allows you to see what Focus Advisor would update if Update Parameters were checked and Focus Advisor run.</para>
+    <para>The <guilabel>Show Only Changes</guilabel> checkbox determines whether all parameters are listed or only those that differ
+    from the Focus Advisor recommendation. The <guilabel>Close</guilabel> button closes the Help dialog.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>Camera & Filter Wheel Parameters</guilabel>: This sets the parameters in the
-    <link linkend="focus-ccd-filter-wheel">CCD & Filter Wheel</link> section of the Focus screen. By hovering the mouse over this
-    label you can see in the tooltip what values Focus Advisor is recommending.</para>
+    <para> <guilabel>Run</guilabel>: Press this button to run Focus Advisor for the checked options. The V-Curve will be
+    dynamically updated with progress, as will the Focus Advisor dialog.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>Settings Parameters</guilabel>: This sets the parameters in
-    <link linkend="focus-settings">Focus Settings</link>. By hovering the mouse over this
-    label you can see in the tooltip what values Focus Advisor is recommending.</para>
+    <para> <guilabel>Stop</guilabel>: Press this button to stop Focus Advisor. Note that the <guilabel>Stop</guilabel>
+    button on the main Focus panel does the same thing.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>Process Parameters</guilabel>: This sets the parameters in
-    <link linkend="focus-process">Focus Process</link>. By hovering the mouse over this
-    label you can see in the tooltip what values Focus Advisor is recommending.</para>
+    <para> <guilabel>Close</guilabel>: Press this button to close the Focus Advisor dialog.</para>
     </listitem>
+    </itemizedlist>
 
+    <para> The following checkbox options are available:</para>
+    <itemizedlist>
     <listitem>
-    <para> <guilabel>Mechanics Parameters</guilabel>: This sets the parameters in
-    <link linkend="focus-mechanics">Focus Mechanics</link>. By hovering the mouse over this
-    label you can see in the tooltip what values Focus Advisor is recommending.</para>
+    <para> <emphasis role="bold">Update Parameters</emphasis>: This sets the parameters in
+    <link linkend="focus-settings">Focus Settings</link> to standard values that
+    should enable Autofocus to successfully complete. Note that parameters are stored per Optical Train so it is a good
+    idea to set this option when starting. Note that some parameters, e.g. step size are better defaulted from a trial and error
+    approach by running Autofocus. So these parameters can be better set by some other options below.</para>
+    <para>Note that when a new Optical Train is created, Focus Advisor will setup default parameters when the Optical Train
+    is used for the first time in Focus.</para>
+    <para>A way to check whether parameters are set appropriately for Focus Advisor is to hit the <guilabel>Help
+    </guilabel> button. See the Focus Advisor Help section for more details.</para>
+    <para>Also note that subsequent Focus Advisor functions depend on certain parameters being selected, for example the
+    Linear 1 Pass focus algorithm, so it is recommended to run Update Parameters at the start of using Focus Advisor.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>SEP Parameters</guilabel>: This sets the SEP parameter profile appropriate
-    for the scope type attached in the selected Optical Train. By hovering the mouse over this
-    label you can see in the tooltip what values Focus Advisor is recommending.</para>
+    <para> <emphasis role="bold">Find Stars</emphasis>: This function is designed to search the range of motion of the focuser to
+    locate stars. If stars are already visible in subframes then there is no need to run this function.</para>
+    <para>The algorithm will start at the current focuser position and search an area outward then inward of the
+    starting position looking for stars. If no stars are found it will continue expending the search area whilst staying
+    within the allowed range of motion of the focuser.</para>
+    <para>Eventually either stars will be located or the whole range of motion of the focuser will have been
+    searched without locating any stars. In this latter case, the step size will be halved and the search restarted from
+    the beginning.</para>
+    <para>The search process uses a series of jumps of 10 x step size to try and locate stars.</para>
+    <para>To use this function start the focuser as near to where stars are likely to be found as possible. If you have
+    no idea then the algorithm will locate stars but the search will likely take longer. In addition, use a step size
+    as close as possible to a good value for your equipment. If a value too small is chosen then the number of steps
+    will be larger and the search will take longer. If a value too large is chosen then its possible that the range of
+    focus positions where stars are visible will be "jumped over" in the search and it will appear that there are no stars
+    visible anywhere. If you have no idea what a good starting value is then use the default and let Focus Advisor try to
+    figure it out.</para>
+    <para>Here is an example run of Find Stars:</para>
+    <screenshot>
+      <screeninfo> Focus Advisor - Find Stars</screeninfo>
+      <mediaobject>
+        <imageobject><imagedata fileref="focus_advisor_find_stars.png" format="PNG" width="50%"/></imageobject>
+        <textobject><phrase>Focus Advisor - Find Stars</phrase></textobject>
+      </mediaobject>
+    </screenshot>
+    <para>The results table in the Focus Advisor dialog shows a single line for Find Stars. In this case, Find Stars
+    was started at position 70,000 and the Step Size was 250 (giving a Jump Size of 2,500).</para>
+    <para>No stars were found at 70,000 (point 1 on the V-Curve) so an outward sweep started at 95,000 and moved in 2,500
+    jump by jump until 70,000 was reached (points 2-11) when the inward sweep started. Stars were first detected at 60,000
+    (point 15).</para>
+    <para>The algorithm then continues to Jump inwards until no stars are found (point 34). This gives the range of positions where
+    stars were located as 15,000 (point 33) to 60,000 (point 15) with a centre at 37,500.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>Help</guilabel>: Press this button to get help on using Focus Advisor.</para>
+    <para> <emphasis role="bold">Coarse Adjustment (without Autofocus)</emphasis>: This function is designed to provide coarse
+    adjustment to the start position, Step Size and AF Overscan (or backlash) fields. The purpose is to provide "good
+    enough" values for these parameters in order for the next stage, Fine Adjustment to work. An iterative process is used
+    to home in on acceptable values.</para>
+    <para>Here is an example to describe how it works:</para>
+    <screenshot>
+      <screeninfo> Focus Advisor - Coarse Adjustment</screeninfo>
+      <mediaobject>
+        <imageobject><imagedata fileref="focus_advisor_coarse_adj.png" format="PNG" width="50%"/></imageobject>
+        <textobject><phrase>Focus Advisor - Coarse Adjustment</phrase></textobject>
+      </mediaobject>
+    </screenshot>
+    <para>Coarse Adjustment was run from a starting position of 37,500 with a Step Size of 250 and AF Overscan of 0.
+    This is recorded in Run 1 in the results table in the Focus Advisor dialog. The comment column says that the Max/Min Ratio = 0.9
+    which means that the "Max HFR" / "Min HFR" of the datapoints is 0.9 which is too low. So Focus Advisor starts Run 2
+    from position 38,875 with an increased Step Size of 803 and Overscan of 250.</para>
+    <para>Run 2 again had a Max/Min ratio too low, so Run 3 was started.</para>
+    <para>Run 3 (which is shown in the V-Curve) started from 35548 with Step Size of 2544 and Overscan of 7477. This
+    resulted in a Max/Min of 2.0 which is good enough at this stage. The datapoints form a V-Curve with no obvious
+    uncorrected backlash (this would show as a flat spot on the right hand side of the curve if there was any). So
+    the Coarse Adjustment completes after Run 3.</para>
     </listitem>
 
     <listitem>
-    <para> <guilabel>Update Params</guilabel>: Press this button to accept the Focus Advisor recommendations and update
-    the Focus parameters where the associated <guilabel>Update</guilabel> checkbox is checked..</para>
+    <para> <emphasis role="bold">Fine Adjustment (with Autofocus)</emphasis>: : This function is designed to provide fine
+    adjustment to the start position, Step Size and AF Overscan (or backlash) fields. Fine Adjustment runs Autofocus
+    including curve fitting and analyses the result to determine whether or not it can be improved. If so, it adjusts
+    parameters and re-runs. An iterative process is used to home in on parameter values.</para>
+    <para>Here is an example to describe how it works:</para>
+    <screenshot>
+      <screeninfo> Focus Advisor - Fine Adjustment</screeninfo>
+      <mediaobject>
+        <imageobject><imagedata fileref="focus_advisor_fine_adj.png" format="PNG" width="50%"/></imageobject>
+        <textobject><phrase>Focus Advisor - Fine Adjustment</phrase></textobject>
+      </mediaobject>
+    </screenshot>
+    <para>Fine Adjustment was run from a starting position of 35,548 with a Step Size of 2544 and AF Overscan of 7477.
+    This is recorded in Run 1 in the results table in the Focus Advisor dialog. The comment column says that the Max/Min Ratio = 1.9
+    which means that the "Max HFR" / "Min HFR" of the datapoints is 1.9 which could be improved. So Focus Advisor starts Run 2
+    from position 38,092 with an increased Step Size of 4888 and Overscan of 3738. The Overscan value is reduced here to see
+    if a smaller number would adequately compensate backlash.</para>
+    <para>Run 2 had a Max/Min ratio of 4 which is a little high, and calculated an Overscan value of 8626 so Run 3 was started.</para>
+    <para>Run 3 (which is shown in the V-Curve) started from 38092 with Step Size of 4254 and Overscan of 8626. This
+    resulted in a Max/Min of 3.1 which is good. The datapoints form a V-Curve with no obvious
+    uncorrected backlash (this would show as a flat spot on the right hand side of the curve if there was any). The R2 of the
+    curve fit is 0.999 which is also good so the Fine Adjustment completes after Run 3.</para>
     </listitem>
-
   </itemizedlist>
   </sect2>
 
diff --git a/doc/focus_advisor.png b/doc/focus_advisor.png
index 61b10d41b1..605ce45eb7 100644
Binary files a/doc/focus_advisor.png and b/doc/focus_advisor.png differ
diff --git a/doc/focus_advisor_coarse_adj.png b/doc/focus_advisor_coarse_adj.png
new file mode 100644
index 0000000000..54cdc3977e
Binary files /dev/null and b/doc/focus_advisor_coarse_adj.png differ
diff --git a/doc/focus_advisor_find_stars.png b/doc/focus_advisor_find_stars.png
new file mode 100644
index 0000000000..0b565c5da5
Binary files /dev/null and b/doc/focus_advisor_find_stars.png differ
diff --git a/doc/focus_advisor_fine_adj.png b/doc/focus_advisor_fine_adj.png
new file mode 100644
index 0000000000..9b52c67dbe
Binary files /dev/null and b/doc/focus_advisor_fine_adj.png differ
diff --git a/doc/focus_advisor_help.png b/doc/focus_advisor_help.png
new file mode 100644
index 0000000000..6a80f7328b
Binary files /dev/null and b/doc/focus_advisor_help.png differ
diff --git a/doc/focus_process.png b/doc/focus_process.png
index 0b6e5526bf..f610b2962f 100644
Binary files a/doc/focus_process.png and b/doc/focus_process.png differ
diff --git a/doc/index.docbook b/doc/index.docbook
index 8a2ccfbcc1..a63579023a 100644
--- a/doc/index.docbook
+++ b/doc/index.docbook
@@ -226,8 +226,8 @@
 
 <legalnotice>&FDLNotice;</legalnotice>
 
-<date>2024-06-01</date>
-<releaseinfo>3.7.1</releaseinfo>
+<date>2024-08-01</date>
+<releaseinfo>3.7.2</releaseinfo>
 
 <abstract>
 <para>
diff --git a/kstars/ekos/focus/curvefit.cpp b/kstars/ekos/focus/curvefit.cpp
index 9f767869a8..9f3ae212df 100644
--- a/kstars/ekos/focus/curvefit.cpp
+++ b/kstars/ekos/focus/curvefit.cpp
@@ -284,11 +284,11 @@ double hypfx(double x, double a, double b, double c, double d)
 // Function to calculate x for the passed in y and hyperbola parameters
 // y = b * sqrt(1 + ((x - c) / a) ^ 2) + d
 // ((y - d) / b) ^ 2 - 1 = ((x - c) / a) ^ 2
-// x = c + a.sqrt(((y - d) / b) ^ 2 - 1)
+// x = c +/- a.sqrt(((y - d) / b) ^ 2 - 1)
 // Note the larger x solution is returned
 double hypfy(double y, double a, double b, double c, double d)
 {
-    return c + a * sqrt(std::pow(((y - d) / b), 2.0) - 1);
+    return c + std::abs(a) * sqrt(std::pow(((y - d) / b), 2.0) - 1);
 }
 
 // Calculates F(x) for each data point on the hyperbola
@@ -411,7 +411,7 @@ double parfx(double x, double a, double b, double c)
 
 // Function to calculate x for passed in t and parabola parameters
 // y = a + b.(x - c) ^ 2
-// x = c + sqrt((y - a) / b)
+// x = c +/- sqrt((y - a) / b)
 // Note: the larger x solution is returned
 double parfy(double y, double a, double b, double c)
 {
diff --git a/kstars/ekos/focus/focusadvisor.cpp b/kstars/ekos/focus/focusadvisor.cpp
index 599d3b507e..8cec585b8f 100644
--- a/kstars/ekos/focus/focusadvisor.cpp
+++ b/kstars/ekos/focus/focusadvisor.cpp
@@ -67,12 +67,45 @@ void FocusAdvisor::processUI()
     // Initialise buttons
     setButtons(false);
 
-    // Display an initial message in the status bar
-    // Connect message
-    connect(focusAdvStatusBar, &QStatusBar::messageChanged, this, &FocusAdvisor::newMessage);
-    focusAdvStatusBar->showMessage(i18n("Idle."));
+    // Setup the results table
+    setupResultsTable();
 }
 
+void FocusAdvisor::setupResultsTable()
+{
+    focusAdvTable->setColumnCount(RESULTS_MAX_COLS);
+    focusAdvTable->setRowCount(0);
+
+    QTableWidgetItem *itemSection = new QTableWidgetItem(i18n ("Section"));
+    itemSection->setToolTip(i18n("Section"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_SECTION, itemSection);
+
+    QTableWidgetItem *itemRunNumber = new QTableWidgetItem(i18n ("Run"));
+    itemRunNumber->setToolTip(i18n("Run number"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_RUN_NUMBER, itemRunNumber);
+
+    QTableWidgetItem *itemStartPosition = new QTableWidgetItem(i18n ("Start Pos"));
+    itemStartPosition->setToolTip(i18n("Start position"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_START_POSITION, itemStartPosition);
+
+    QTableWidgetItem *itemStepSize = new QTableWidgetItem(i18n ("Step/Jump Size"));
+    itemStepSize->setToolTip(i18n("Step Size"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_STEP_SIZE, itemStepSize);
+
+    QTableWidgetItem *itemAFOverscan = new QTableWidgetItem(i18n ("Overscan"));
+    itemAFOverscan->setToolTip(i18n("AF Overscan"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_AFOVERSCAN, itemAFOverscan);
+
+    QTableWidgetItem *itemText = new QTableWidgetItem(i18n ("Comments"));
+    itemText->setToolTip(i18n("Additional Text"));
+    focusAdvTable->setHorizontalHeaderItem(RESULTS_TEXT, itemText);
+
+    focusAdvTable->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
+    focusAdvTable->hide();
+    resizeDialog();
+}
+
+
 void FocusAdvisor::setupHelpTable()
 {
     QTableWidgetItem *itemParameter = new QTableWidgetItem(i18n ("Parameter"));
@@ -114,10 +147,17 @@ bool FocusAdvisor::canFocusAdvisorRun()
 
 bool FocusAdvisor::start()
 {
-    if (!m_focus || m_focus->inFocusLoop || m_focus->inAdjustFocus || m_focus->inAutoFocus || m_focus->inBuildOffsets
+    // Reset the results table
+    focusAdvTable->setRowCount(0);
+    focusAdvTable->sizePolicy();
+
+    if (!m_focus)
+        return false;
+
+    if (m_focus->inFocusLoop || m_focus->inAdjustFocus || m_focus->inAutoFocus || m_focus->inBuildOffsets
             || m_focus->inScanStartPos || inFocusAdvisor())
     {
-        focusAdvStatusBar->showMessage(i18n("Another focus action in progress. Please try again."));
+        m_focus->appendLogText(i18n("Focus Advisor: another focus action in progress. Please try again."));
         return false;
     }
 
@@ -142,7 +182,7 @@ bool FocusAdvisor::start()
         }
         else
         {
-            focusAdvStatusBar->showMessage(i18n("Focus Advisor cannot run with current params."));
+            m_focus->appendLogText(i18n("Focus Advisor cannot run with current params."));
             return false;
         }
     }
@@ -224,7 +264,7 @@ void FocusAdvisor::resizeHelpDialog()
 void FocusAdvisor::updateParams()
 {
     m_focus->setAllSettings(m_map);
-    focusAdvStatusBar->showMessage(i18n("Updated base parameters"));
+    addResultsTable(i18n("Update Parameters"), -1, -1, -1, -1, "Done");
 }
 
 // Load up the Focus Advisor recommendations
@@ -638,8 +678,8 @@ void FocusAdvisor::initFindStars(const int startPos)
     m_focus->m_OpsFocusMechanics->focusBacklash->setValue(0);
     m_focus->m_OpsFocusMechanics->focusAFOverscan->setValue(0);
 
-    m_focus->appendLogText(i18n("Find Stars: Starting scan for stars..."));
-    focusAdvStatusBar->showMessage(i18n("Find Stars: Jump size %1", m_jumpSize));
+    addResultsTable(i18n("Find Stars"), m_findStarsRunNum, startPos, m_jumpSize,
+                    m_focus->m_OpsFocusMechanics->focusAFOverscan->value(), "");
     emit m_focus->setTitle(QString(i18n("Find Stars: Scanning for stars...")), true);
     if (!m_focus->changeFocus(startPos - m_focus->currentPosition))
         abort(i18n("Find Stars: Failed"));
@@ -709,6 +749,7 @@ void FocusAdvisor::findStars()
                 m_findStarsOutRange = m_focus->currentPosition;
             const int zoneCentre = (m_findStarsInRange + m_findStarsOutRange) / 2;
             focusAdvFindStarsLabel->setText(i18n("Done"));
+            updateResultsTable(i18n("Stars detected, range center %1", QString::number(zoneCentre)));
             // Now move onto the next stage or stop if nothing more to do
             if (m_inPreAFAdj)
                 initPreAFAdj(zoneCentre);
@@ -718,7 +759,7 @@ void FocusAdvisor::findStars()
             {
                 m_focus->absTicksSpin->setValue(zoneCentre);
                 emit m_focus->setTitle(QString(i18n("Stars detected, range centre %1", zoneCentre)), true);
-                complete(false, i18n("Find Stars: Completed"));
+                complete(false, i18n("Focus Advisor Find Stars completed"));
             }
             return;
         }
@@ -736,7 +777,6 @@ void FocusAdvisor::findStars()
         if (!m_findStarsRange)
         {
             m_findStarsRange = true;
-            m_focus->appendLogText(i18n("Detected %1 stars at %2", m_focus->currentNumStars, m_focus->currentPosition));
 
             // If stars found first position we don't know where we are in the zone so explore both ends
             // Otherwise we know where 1 boundary is so we only need to expore the other
@@ -775,8 +815,8 @@ void FocusAdvisor::findStars()
     if (m_findStarsRange)
     {
         // Collect more data to find the range of focuser motion with stars
-        emit m_focus->setTitle(QString(i18n("Stars detected, centring range", m_focus->currentPosition)), true);
-        focusAdvStatusBar->showMessage(i18n("Find Stars: Stars detected, centring range"));
+        emit m_focus->setTitle(QString(i18n("Stars detected, centering range", m_focus->currentPosition)), true);
+        updateResultsTable(i18n("Stars detected, centering range"));
         int nextPos;
         if (m_findStarsRangeIn)
             nextPos = std::max(m_focus->currentPosition + offset - m_jumpSize, static_cast<int>(m_focus->absMotionMin));
@@ -805,7 +845,7 @@ void FocusAdvisor::findStars()
         // Collect more data in the current sweep
         emit m_focus->setTitle(QString(i18n("Find Stars Run %1 Sector %2: Scanning %3/%4", m_findStarsRunNum, m_findStarsSector,
                                             m_jumpsToGo, m_findStarsJumpsInSector)), true);
-        focusAdvStatusBar->showMessage(i18n("Find Stars Run %1: Scanning Sector %2", m_findStarsRunNum, m_findStarsSector));
+        updateResultsTable(i18n("Find Stars Run %1: Scanning Sector %2", m_findStarsRunNum, m_findStarsSector));
         int nextPos = std::max(m_focus->currentPosition - m_jumpSize, static_cast<int>(m_focus->absMotionMin));
         deltaPos = nextPos - m_focus->currentPosition;
     }
@@ -816,6 +856,7 @@ void FocusAdvisor::findStars()
         {
             // We're out of road... covered the entire focuser range of motion but couldn't find any stars
             // halve the step size and go again
+            updateResultsTable(i18n("No stars detected"));
             int newStepSize = m_focus->m_OpsFocusMechanics->focusTicks->value() / 2;
             if (newStepSize > 1)
             {
@@ -895,7 +936,7 @@ void FocusAdvisor::findStars()
         m_jumpsToGo--;
     m_focus->linearRequestedPosition = m_focus->currentPosition + deltaPos;
     if (!m_focus->changeFocus(deltaPos))
-        abort(i18n("Find Stars Run %1: Failed", m_findStarsRunNum));
+        abort(i18n("Focus Advisor Find Stars run %1: failed to move focuser", m_findStarsRunNum));
 }
 
 bool FocusAdvisor::starsFound()
@@ -934,8 +975,6 @@ void FocusAdvisor::initPreAFAdj(const int startPos)
 
     // Reset the v-curve - otherwise there's too much data to see what's going on
     m_focus->clearDataPoints();
-    m_focus->appendLogText(i18n("Coarse Adjustment Scan..."));
-    focusAdvStatusBar->showMessage(i18n("Coarse Adjustment Scan..."));
     emit m_focus->setTitle(QString(i18n("Coarse Adjustment Scan...")), true);
 
     // Setup a sweep of m_jumpSize either side of startPos
@@ -964,9 +1003,13 @@ void FocusAdvisor::initPreAFAdj(const int startPos)
         m_focus->m_OpsFocusProcess->focusUseWeights->setChecked(m_initialUseWeights);
     }
 
+    addResultsTable(i18n("Coarse Adjustment"), m_preAFRunNum, startPos,
+                    m_focus->m_OpsFocusMechanics->focusTicks->value(),
+                    m_focus->m_OpsFocusMechanics->focusAFOverscan->value(), "");
+
     m_focus->linearRequestedPosition = m_focus->currentPosition + deltaPos;
     if (!m_focus->changeFocus(deltaPos))
-        abort(i18n("Pre Autofocus: Failed"));
+        abort(i18n("Focus Advisor Coarse Adjustment failed to move focuser"));
 }
 
 // Pre Autofocus coarse adjustment algorithm.
@@ -976,7 +1019,7 @@ void FocusAdvisor::preAFAdj()
     // Cap the maximum number of iterations before failing
     if (++m_focus->absIterations > MAXIMUM_FOCUS_ADVISOR_ITERATIONS)
     {
-        abort(i18n("Pre Autofocus: exceeded max iterations %1", MAXIMUM_FOCUS_ADVISOR_ITERATIONS));
+        abort(i18n("Focus Advisor Coarse Adjustment: exceeded max iterations %1", MAXIMUM_FOCUS_ADVISOR_ITERATIONS));
         return;
     }
 
@@ -1033,8 +1076,6 @@ void FocusAdvisor::preAFAdj()
     if (m_focus->currentPosition - step >= m_preAFInner)
     {
         // Collect more data in the current sweep
-        focusAdvStatusBar->showMessage(i18n("Coarse Adjustment Run: %1 Start: %2 Overscan: %3 Step Size: %4", m_preAFRunNum,
-                                            m_focus->initialFocuserAbsPosition, m_focus->m_OpsFocusMechanics->focusAFOverscan->value(), step));
         emit m_focus->setTitle(QString(i18n("Coarse Adjustment Run %1 scan...", m_preAFRunNum)), true);
         deltaPos = -step;
     }
@@ -1043,7 +1084,7 @@ void FocusAdvisor::preAFAdj()
         // We've completed the current sweep, so analyse the data...
         if (m_position.size() < 5)
         {
-            abort(i18n("Coarse Adjustment Run %1: insufficient data to proceed", m_preAFRunNum));
+            abort(i18n("Focus Advisor Coarse Adjustment Run %1: insufficient data to proceed", m_preAFRunNum));
             return;
         }
         else
@@ -1093,13 +1134,14 @@ void FocusAdvisor::preAFAdj()
             }
             overscan = std::max(overscan, step);
             m_focus->m_OpsFocusMechanics->focusAFOverscan->setValue(overscan);
-            m_focus->appendLogText(i18n("Overscan estimate: %1 ticks", overscan));
 
             const bool hitNoStarsRegion = m_preAFNoStarsIn || m_preAFNoStarsOut;
+
             // Is everything good enough to proceed, or do we need to run again?
             if (nearCenter && maxMinRatioOK(INITIAL_MAXMIN_HFR_RATIO, measureRatio) && !hitNoStarsRegion)
             {
                 // We're done with the coarse adjustment step so prepare for the next step
+                updateResultsTable(i18n("Max/Min Ratio: %1", QString::number(measureRatio, 'f', 1)));
                 m_inPreAFAdj = false;
                 focusAdvCoarseAdjLabel->setText(i18n("Done"));
                 m_focus->absIterations = 0;
@@ -1116,8 +1158,7 @@ void FocusAdvisor::preAFAdj()
                 else
                 {
                     m_focus->absTicksSpin->setValue(minPos);
-                    complete(false, i18n("Coarse Adjustment Run: %1 Start: %2 Overscan: %3 Step Size: %4", m_preAFRunNum,
-                                         m_focus->initialFocuserAbsPosition, m_focus->m_OpsFocusMechanics->focusAFOverscan->value(), step));
+                    complete(false, i18n("Focus Advisor Coarse Adjustment completed."));
                 }
                 return;
             }
@@ -1138,7 +1179,7 @@ void FocusAdvisor::preAFAdj()
                     if (newStepSize < 1)
                     {
                         // Looks like data is inconsistent so stop here
-                        abort(i18n("Coarse Adj: data quality too poor to continue"));
+                        abort(i18n("Focus Advisor Coarse Adjustment: data quality too poor to continue"));
                         return;
                     }
                 }
@@ -1172,6 +1213,8 @@ void FocusAdvisor::preAFAdj()
                     // Set the start position to the previous minimum
                     startPosition = minPos;
 
+                updateResultsTable(i18n("Max/Min Ratio: %1, Next Step Size: %2, Next Overscan: %3", QString::number(measureRatio, 'f', 1),
+                                        QString::number(newStepSize), QString::number(overscan)));
                 m_focus->m_OpsFocusMechanics->focusTicks->setValue(newStepSize);
                 initPreAFAdj(startPosition);
                 return;
@@ -1180,7 +1223,7 @@ void FocusAdvisor::preAFAdj()
     }
     m_focus->linearRequestedPosition = m_focus->currentPosition + deltaPos;
     if (!m_focus->changeFocus(deltaPos))
-        abort(i18n("Coarse Adj: Failed"));
+        abort(i18n("Focus Advisor Coarse Adjustment failed to move focuser"));
 }
 
 // Check whether the Max / Min star measure ratio is good enough
@@ -1231,7 +1274,10 @@ void FocusAdvisor::initAFAdj(const int startPos, const bool retryOverscan)
     // Reset useWeights setting
     m_focus->m_OpsFocusProcess->focusUseWeights->setChecked(m_initialUseWeights);
 
-    focusAdvStatusBar->showMessage(i18n("Autofocus parameter adjustment"));
+    addResultsTable(i18n("Fine Adjustment"), ++m_AFRunCount, startPos,
+                    m_focus->m_OpsFocusMechanics->focusTicks->value(),
+                    m_focus->m_OpsFocusMechanics->focusAFOverscan->value(), "");
+
     startAF(startPos);
 }
 
@@ -1288,57 +1334,56 @@ bool FocusAdvisor::analyseAF()
 
     // Look at the backlash
     // So assume flatness of curve at the outward point is all due to backlash.
-    double backlashPoints = 0.0;
-    for (int i = 0; i < positions.size() / 2; i++)
+    if (!m_overscanFound)
     {
-        double deltaAct = measures[i] - measures[i + 1];
-        double deltaExp = m_focus->curveFitting->f(positions[i]) - m_focus->curveFitting->f(positions[i + 1]);
-        double delta = std::abs(deltaAct / deltaExp);
-        // May have to play around with this threshold
-        if (delta > 0.75)
-            break;
-        if (delta > 0.5)
-            backlashPoints += 0.5;
-        else
-            backlashPoints++;
-    }
-
-    const int overscan = m_focus->m_OpsFocusMechanics->focusAFOverscan->value();
-    int newOverscan = overscan;
+        double backlashPoints = 0.0;
+        for (int i = 0; i < positions.size() / 2; i++)
+        {
+            double deltaAct = measures[i] - measures[i + 1];
+            double deltaExp = m_focus->curveFitting->f(positions[i]) - m_focus->curveFitting->f(positions[i + 1]);
+            double delta = std::abs(deltaAct / deltaExp);
+            // May have to play around with this threshold
+            if (delta > 0.75)
+                break;
+            if (delta > 0.5)
+                backlashPoints += 0.5;
+            else
+                backlashPoints++;
+        }
 
-    if (backlashPoints > 0.0)
-    {
-        // We've found some additional Overscan so we know the current value is too low and now have a reasonable estimate
-        newOverscan = overscan + (stepSize * backlashPoints);
-        m_minOverscan = true;
-    }
-    else if (overscan == 0)
-        m_minOverscan = true;
-    else if (!m_minOverscan)
-        // No additional Overscan was detected so the current Overscan estimate may be too high so try reducing it
-        newOverscan = overscan <= 2 * stepSize ? 0 : overscan / 2;
+        const int overscan = m_focus->m_OpsFocusMechanics->focusAFOverscan->value();
+        int newOverscan = overscan;
 
-    // run again until backlash values stabilises
-    bool runAgainOverscan = (newOverscan != overscan);
+        if (backlashPoints > 0.0)
+        {
+            // We've found some additional Overscan so we know the current value is too low and now have a reasonable estimate
+            newOverscan = overscan + (stepSize * backlashPoints);
+            m_overscanFound = true;
+        }
+        else if (overscan == 0)
+            m_overscanFound = true;
+        else if (!m_overscanFound)
+            // No additional Overscan was detected so the current Overscan estimate may be too high so try reducing it
+            newOverscan = overscan <= 2 * stepSize ? 0 : overscan / 2;
 
-    m_focus->m_OpsFocusMechanics->focusAFOverscan->setValue(newOverscan);
-    m_focus->appendLogText(i18n("Focus Advisor adjusting Step Size: %1->%2 AF Overscan: %3->%4", stepSize, newStepSize,
-                                overscan, newOverscan));
+        m_focus->m_OpsFocusMechanics->focusAFOverscan->setValue(newOverscan);
+    }
 
     // Try again for a poor R2 - but retry just once (unless something else changes so we don't get stuck in a loop
     if (m_runAgainR2)
         m_runAgainR2 = false;
     else
         m_runAgainR2 = m_focus->R2 < m_focus->m_OpsFocusProcess->focusR2Limit->value();
-    bool runAgain = runAgainRatio || m_runAgainR2 || runAgainOverscan;
+    bool runAgain = runAgainRatio || m_runAgainR2 || !m_overscanFound;
 
-    if (runAgain)
-        focusAdvStatusBar->showMessage(i18n("Autofocus retrying: Step Size %1 AF Overscan %2", newStepSize, newOverscan));
-    else
+    updateResultsTable(i18n("Max/Min Ratio: %1, R2: %2, Step Size: %3, Overscan: %4", QString::number(measureRatio, 'f', 1),
+                            QString::number(m_focus->R2, 'f', 3), QString::number(newStepSize),
+                            QString::number(m_focus->m_OpsFocusMechanics->focusAFOverscan->value())));
+    if (!runAgain)
     {
         m_inAFAdj = false;
         focusAdvFineAdjLabel->setText(i18n("Done"));
-        complete(true, i18n("Autofocus complete: Step Size %1 AF Overscan %2", newStepSize, newOverscan));
+        complete(true, i18n("Focus Advisor Fine Adjustment completed"));
         emit newStage(Idle);
     }
     return runAgain;
@@ -1375,9 +1420,10 @@ void FocusAdvisor::reset()
     m_preAFNoStarsIn = false;
     m_preAFMaxRange = false;
     m_preAFRunNum = 0;
-    m_minOverscan = false;
+    m_overscanFound = false;
     m_runAgainR2 = false;
     m_nearFocus = false;
+    m_AFRunCount = 0;
     setButtons(false);
     focusAdvUpdateParamsLabel->setText("");
     focusAdvFindStarsLabel->setText("");
@@ -1389,7 +1435,6 @@ void FocusAdvisor::reset()
 void FocusAdvisor::abort(const QString &msg)
 {
     m_focus->appendLogText(msg);
-    focusAdvStatusBar->showMessage(msg);
 
     // Restore settings to initial value
     resetSavedSettings(false);
@@ -1401,7 +1446,6 @@ void FocusAdvisor::abort(const QString &msg)
 void FocusAdvisor::complete(const bool autofocus, const QString &msg)
 {
     m_focus->appendLogText(msg);
-    focusAdvStatusBar->showMessage(msg);
     // Restore settings to initial value
     resetSavedSettings(true);
 
@@ -1427,4 +1471,58 @@ void FocusAdvisor::resetSavedSettings(const bool success)
     }
 }
 
+// Add a new row to the results table
+void FocusAdvisor::addResultsTable(QString section, int run, int startPos, int stepSize, int overscan, QString text)
+{
+    focusAdvTable->insertRow(0);
+    QTableWidgetItem *itemSection = new QTableWidgetItem(section);
+    focusAdvTable->setItem(0, RESULTS_SECTION, itemSection);
+    QString runStr = (run >= 0) ? QString("%1").arg(run) : "N/A";
+    QTableWidgetItem *itemRunNumber = new QTableWidgetItem(runStr);
+    itemRunNumber->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+    focusAdvTable->setItem(0, RESULTS_RUN_NUMBER, itemRunNumber);
+    QString startPosStr = (startPos >= 0) ? QString("%1").arg(startPos) : "N/A";
+    QTableWidgetItem *itemStartPos = new QTableWidgetItem(startPosStr);
+    itemStartPos->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+    focusAdvTable->setItem(0, RESULTS_START_POSITION, itemStartPos);
+    QString stepSizeStr = (stepSize >= 0) ? QString("%1").arg(stepSize) : "N/A";
+    QTableWidgetItem *itemStepSize = new QTableWidgetItem(stepSizeStr);
+    itemStepSize->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+    focusAdvTable->setItem(0, RESULTS_STEP_SIZE, itemStepSize);
+    QString overscanStr = (stepSize >= 0) ? QString("%1").arg(overscan) : "N/A";
+    QTableWidgetItem *itemAFOverscan = new QTableWidgetItem(overscanStr);
+    itemAFOverscan->setTextAlignment(Qt::AlignRight | Qt::AlignVCenter);
+    focusAdvTable->setItem(0, RESULTS_AFOVERSCAN, itemAFOverscan);
+    QTableWidgetItem *itemText = new QTableWidgetItem(text);
+    focusAdvTable->setItem(0, RESULTS_TEXT, itemText);
+
+    if (focusAdvTable->rowCount() == 1)
+    {
+        focusAdvTable->show();
+        resizeDialog();
+    }
+}
+
+// Update text for current row (0) in the results table with the passed in value
+void FocusAdvisor::updateResultsTable(QString text)
+{
+    QTableWidgetItem *itemText = new QTableWidgetItem(text);
+    focusAdvTable->setItem(0, RESULTS_TEXT, itemText);
+    focusAdvTable->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
+}
+
+void FocusAdvisor::resizeDialog()
+{
+    focusAdvTable->horizontalHeader()->resizeSections(QHeaderView::ResizeToContents);
+    int left, right, top, bottom;
+    this->verticalLayout->layout()->getContentsMargins(&left, &top, &right, &bottom);
+
+    int width = left + right;
+    for (int i = 0; i < focusAdvTable->horizontalHeader()->count(); i++)
+        width += focusAdvTable->columnWidth(i);
+    const int height = focusAdvGroupBox->height() + focusAdvTable->height() + focusAdvButtonBox->height();
+    focusAdvTable->horizontalHeader()->height() + focusAdvTable->rowHeight(0);
+    // JEE what if no rows
+    this->resize(width, height);
+}
 }
diff --git a/kstars/ekos/focus/focusadvisor.h b/kstars/ekos/focus/focusadvisor.h
index 1c860dee44..6518521f49 100644
--- a/kstars/ekos/focus/focusadvisor.h
+++ b/kstars/ekos/focus/focusadvisor.h
@@ -126,6 +126,11 @@ class FocusAdvisor : public QDialog, public Ui::focusAdvisorDialog
          */
         void processUI();
 
+        /**
+         * @brief setup the results table
+         */
+        void setupResultsTable();
+
         /**
          * @brief setup the help dialog table
          */
@@ -325,6 +330,28 @@ class FocusAdvisor : public QDialog, public Ui::focusAdvisorDialog
          */
         void resetSavedSettings(const bool success);
 
+        /**
+         * @brief Add a row to the results table
+         * @param section of Focus Advisor being run, e.g. find stars
+         * @param run number
+         * @param startPos of the focuser
+         * @param stepSize being used
+         * @param overscan value being used
+         * @param additional text for the row
+         */
+        void addResultsTable(QString section, int run, int startPos, int stepSize, int overscan, QString text);
+
+        /**
+         * @brief Update the text of the current row in the results table
+         * @param text to update
+         */
+        void updateResultsTable(QString text);
+
+        /**
+         * @brief Resize the dialog box
+         */
+        void resizeDialog();
+
         Focus *m_focus { nullptr };
         QVariantMap m_map;
 
@@ -381,9 +408,22 @@ class FocusAdvisor : public QDialog, public Ui::focusAdvisorDialog
         int m_jumpSize = 0;
 
         // Autofocus algorithm analysis
-        bool m_minOverscan = false;
+        bool m_overscanFound = false;
         bool m_runAgainR2 = false;
         bool m_nearFocus = false;
+        int m_AFRunCount = 0;
+
+        // Results table Cols
+        typedef enum
+        {
+            RESULTS_SECTION = 0,
+            RESULTS_RUN_NUMBER,
+            RESULTS_START_POSITION,
+            RESULTS_STEP_SIZE,
+            RESULTS_AFOVERSCAN,
+            RESULTS_TEXT,
+            RESULTS_MAX_COLS
+        } ResultsColID;
 
         // Help table Cols
         typedef enum
@@ -394,7 +434,7 @@ class FocusAdvisor : public QDialog, public Ui::focusAdvisorDialog
             HELP_MAX_COLS
         } HelpColID;
 
-      signals:
+    signals:
         void newMessage(QString);
         void newStage(Stage);
 };
diff --git a/kstars/ekos/focus/focusadvisor.ui b/kstars/ekos/focus/focusadvisor.ui
index 9cfc882f2e..8f025d31c1 100644
--- a/kstars/ekos/focus/focusadvisor.ui
+++ b/kstars/ekos/focus/focusadvisor.ui
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>383</width>
-    <height>214</height>
+    <width>457</width>
+    <height>298</height>
    </rect>
   </property>
   <property name="windowTitle">
@@ -149,32 +149,62 @@
     </widget>
    </item>
    <item>
-    <widget class="QDialogButtonBox" name="focusAdvButtonBox">
+    <widget class="QTableWidget" name="focusAdvTable">
+     <property name="enabled">
+      <bool>true</bool>
+     </property>
      <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+      <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
-     <property name="toolTip">
-      <string>Close Focus Advisor</string>
+     <property name="minimumSize">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
      </property>
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
+     <property name="editTriggers">
+      <set>QAbstractItemView::NoEditTriggers</set>
      </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
      </property>
+     <property name="selectionMode">
+      <enum>QAbstractItemView::NoSelection</enum>
+     </property>
+     <property name="rowCount">
+      <number>0</number>
+     </property>
+     <property name="columnCount">
+      <number>0</number>
+     </property>
+     <attribute name="horizontalHeaderCascadingSectionResizes">
+      <bool>false</bool>
+     </attribute>
+     <attribute name="verticalHeaderVisible">
+      <bool>false</bool>
+     </attribute>
     </widget>
    </item>
    <item>
-    <widget class="QStatusBar" name="focusAdvStatusBar">
+    <widget class="QDialogButtonBox" name="focusAdvButtonBox">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
+     <property name="toolTip">
+      <string>Close Focus Advisor</string>
+     </property>
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Close</set>
+     </property>
     </widget>
    </item>
    <item>


More information about the kde-doc-english mailing list