File 0001-Make-ArkViewer-a-KPart-mainwindow.patch of Package ark

From 15d53106e184d7cb0fa08a8cf3588fea10715647 Mon Sep 17 00:00:00 2001
From: Elvis Angelaccio <elvis.angelaccio@kde.org>
Date: Sun, 4 Jun 2017 17:23:51 +0200
Subject: [PATCH] Make ArkViewer a KPart mainwindow

Summary:
This allows us to call createGUI() on the KPart we are embedding. As a
side effect, we are now able to show the popup menu of the ArkPart,
which is a stand-alone popup menu created by kxmlgui, when previewing a
nested archive in the ArkViewer.

By using a KMainWindow (instead of a QDialog) we also gain some
features, for example we get size restoring for free (thanks to
setAutoSaveSettings()), without the need of manually using
KWindowConfig.

BUG: 380439
FIXED-IN: 17.07.80

Reviewers: #ark, fvogt

Subscribers: kde-utils-devel

Tags: #ark

Differential Revision: https://phabricator.kde.org/D6075
---
 part/CMakeLists.txt |   1 +
 part/ark_viewer.rc  |   6 +++
 part/arkviewer.cpp  |  43 ++++++---------
 part/arkviewer.h    |  10 ++--
 part/arkviewer.ui   | 153 +++++++++++++++++++++-------------------------------
 part/part.cpp       |   1 +
 6 files changed, 89 insertions(+), 125 deletions(-)
 create mode 100644 part/ark_viewer.rc

diff --git a/part/CMakeLists.txt b/part/CMakeLists.txt
index 47c33489..efa5cb3a 100644
--- a/part/CMakeLists.txt
+++ b/part/CMakeLists.txt
@@ -38,3 +38,4 @@ install(TARGETS arkpart DESTINATION ${KDE_INSTALL_PLUGINDIR})
 
 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ark_part.desktop DESTINATION ${KDE_INSTALL_KSERVICES5DIR})
 install(FILES ark_part.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/ark)
+install(FILES ark_viewer.rc DESTINATION ${KDE_INSTALL_KXMLGUI5DIR}/ark)
diff --git a/part/ark_viewer.rc b/part/ark_viewer.rc
new file mode 100644
index 00000000..e439a3a9
--- /dev/null
+++ b/part/ark_viewer.rc
@@ -0,0 +1,6 @@
+<!DOCTYPE gui SYSTEM "kpartgui.dtd">
+<gui name="ark_viewer" version="1">
+<MenuBar>
+    <Merge/>
+</MenuBar>
+</gui>
diff --git a/part/arkviewer.cpp b/part/arkviewer.cpp
index 89a198d5..9155fc32 100644
--- a/part/arkviewer.cpp
+++ b/part/arkviewer.cpp
@@ -26,42 +26,34 @@
 #include <KMimeTypeTrader>
 #include <KIconLoader>
 #include <KMessageBox>
+#include <KParts/ReadOnlyPart>
+#include <KParts/OpenUrlArguments>
 #include <KRun>
-#include <KSharedConfig>
-#include <KWindowConfig>
+#include <KXMLGUIFactory>
 
-#include <QDebug>
 #include <QFile>
 #include <QMimeDatabase>
 #include <QProgressDialog>
 #include <QPushButton>
 
 ArkViewer::ArkViewer()
-        : QDialog()
+        : KParts::MainWindow()
 {
     qCDebug(ARK) << "ArkViewer opened";
 
-    setAttribute(Qt::WA_DeleteOnClose);
-
     setupUi(this);
 
-    // Bug 369390: This prevents the Enter key from closing the dialog.
+    // Bug 369390: This prevents the Enter key from closing the window.
     m_buttonBox->button(QDialogButtonBox::Close)->setAutoDefault(false);
 
-    connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
-    connect(this, &ArkViewer::finished, this, &ArkViewer::dialogClosed);
-}
+    connect(m_buttonBox, &QDialogButtonBox::rejected, this, &QMainWindow::close);
 
-ArkViewer::~ArkViewer()
-{
+    setXMLFile(QStringLiteral("ark_viewer.rc"));
+    setupGUI(ToolBar);
 }
 
-void ArkViewer::dialogClosed()
+ArkViewer::~ArkViewer()
 {
-    // Save viewer dialog window size
-    KConfigGroup group(KSharedConfig::openConfig(), "Viewer");
-    KWindowConfig::saveWindowSize(windowHandle(), group, KConfigBase::Persistent);
-
     if (m_part) {
         QProgressDialog progressDialog(this);
         progressDialog.setWindowTitle(i18n("Closing preview"));
@@ -74,8 +66,6 @@ void ArkViewer::dialogClosed()
 
         // #261785: this preview dialog is not modal, so we need to delete
         //          the previewed file ourselves when the dialog is closed;
-        //          we used to remove it at the end of ArkViewer::view() when
-        //          QDialog::exec() was called instead of QDialog::show().
         const QString previewedFilePath(m_part.data()->url().toDisplayString(QUrl::PreferLocalFile));
 
         m_part.data()->closeUrl();
@@ -84,6 +74,9 @@ void ArkViewer::dialogClosed()
             QFile::remove(previewedFilePath);
         }
     }
+
+    guiFactory()->removeClient(m_part);
+    delete m_part;
 }
 
 void ArkViewer::view(const QString& fileName)
@@ -157,7 +150,7 @@ void ArkViewer::view(const QString& fileName)
         internalViewer->show();
         if (internalViewer->viewInInternalViewer(fileName, mimeType)) {
             // The internal viewer is showing the file, and will
-            // remove the temporary file in dialogClosed().  So there
+            // remove the temporary file in its destructor.  So there
             // is no more to do here.
             return;
         }
@@ -178,11 +171,6 @@ bool ArkViewer::viewInInternalViewer(const QString& fileName, const QMimeType &m
 {
     setWindowFilePath(fileName);
 
-    // Load viewer dialog window size from config file
-    KConfigGroup group(KSharedConfig::openConfig(), "Viewer");
-    KWindowConfig::restoreWindowSize(windowHandle(), group);
-
-
     // Set icon and comment for the mimetype.
     m_iconLabel->setPixmap(QIcon::fromTheme(mimeType.iconName()).pixmap(IconSize(KIconLoader::Desktop), IconSize(KIconLoader::Desktop)));
     m_commentLabel->setText(mimeType.comment());
@@ -205,7 +193,10 @@ bool ArkViewer::viewInInternalViewer(const QString& fileName, const QMimeType &m
     }
 
     // Insert the KPart into its placeholder.
-    layout()->replaceWidget(m_partPlaceholder, m_part.data()->widget());
+    centralWidget()->layout()->replaceWidget(m_partPlaceholder, m_part.data()->widget());
+
+    createGUI(m_part.data());
+    setAutoSaveSettings(QStringLiteral("Viewer"), true);
 
     m_part.data()->openUrl(QUrl::fromLocalFile(fileName));
     m_part.data()->widget()->setFocus();
diff --git a/part/arkviewer.h b/part/arkviewer.h
index dc01a76d..8d29f5e4 100644
--- a/part/arkviewer.h
+++ b/part/arkviewer.h
@@ -24,15 +24,14 @@
 
 #include "ui_arkviewer.h"
 
-#include <KParts/BrowserExtension>
+#include <KParts/MainWindow>
 #include <KParts/ReadOnlyPart>
 #include <KService>
 
-#include <QDialog>
-#include <QWeakPointer>
 #include <QMimeType>
+#include <QPointer>
 
-class ArkViewer : public QDialog, public Ui::ArkViewer
+class ArkViewer : public KParts::MainWindow, public Ui::ArkViewer
 {
     Q_OBJECT
 
@@ -41,9 +40,6 @@ public:
 
     static void view(const QString& fileName);
 
-private slots:
-    void dialogClosed();
-
 private:
     explicit ArkViewer();
 
diff --git a/part/arkviewer.ui b/part/arkviewer.ui
index 4476ad6b..eea8248d 100644
--- a/part/arkviewer.ui
+++ b/part/arkviewer.ui
@@ -1,106 +1,75 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
  <class>ArkViewer</class>
- <widget class="QDialog" name="ArkViewer">
+ <widget class="QMainWindow" name="ArkViewer">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>640</width>
-    <height>480</height>
+    <width>800</width>
+    <height>600</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string notr="true"/>
+   <string notr="true">MainWindow</string>
   </property>
-  <layout class="QVBoxLayout" name="verticalLayout">
-   <item>
-    <widget class="QWidget" name="m_mimeWidget" native="true">
-     <property name="sizePolicy">
-      <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
-       <horstretch>0</horstretch>
-       <verstretch>0</verstretch>
-      </sizepolicy>
-     </property>
-     <layout class="QHBoxLayout" name="horizontalLayout">
-      <item>
-       <widget class="QLabel" name="m_iconLabel">
-        <property name="text">
-         <string notr="true">mime icon</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QLabel" name="m_commentLabel">
-        <property name="text">
-         <string notr="true">mime comment</string>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <spacer name="horizontalSpacer">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
-        </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
-        </property>
-       </spacer>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
-    <widget class="QWidget" name="m_partPlaceholder" native="true"/>
-   </item>
-   <item>
-    <widget class="QDialogButtonBox" name="m_buttonBox">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="standardButtons">
-      <set>QDialogButtonBox::Close</set>
-     </property>
-    </widget>
-   </item>
-  </layout>
+  <widget class="QWidget" name="centralwidget">
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <item>
+     <widget class="QWidget" name="m_mimeWidget" native="true">
+      <property name="sizePolicy">
+       <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
+        <horstretch>0</horstretch>
+        <verstretch>0</verstretch>
+       </sizepolicy>
+      </property>
+      <layout class="QHBoxLayout" name="horizontalLayout">
+       <item>
+        <widget class="QLabel" name="m_iconLabel">
+         <property name="text">
+          <string notr="true">mime icon</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <widget class="QLabel" name="m_commentLabel">
+         <property name="text">
+          <string notr="true">mime comment</string>
+         </property>
+        </widget>
+       </item>
+       <item>
+        <spacer name="horizontalSpacer">
+         <property name="orientation">
+          <enum>Qt::Horizontal</enum>
+         </property>
+         <property name="sizeHint" stdset="0">
+          <size>
+           <width>40</width>
+           <height>20</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+      </layout>
+     </widget>
+    </item>
+    <item>
+     <widget class="QWidget" name="m_partPlaceholder" native="true"/>
+    </item>
+    <item>
+     <widget class="QDialogButtonBox" name="m_buttonBox">
+      <property name="orientation">
+       <enum>Qt::Horizontal</enum>
+      </property>
+      <property name="standardButtons">
+       <set>QDialogButtonBox::Close</set>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
  </widget>
  <resources/>
- <connections>
-  <connection>
-   <sender>m_buttonBox</sender>
-   <signal>accepted()</signal>
-   <receiver>ArkViewer</receiver>
-   <slot>accept()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>157</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
-  <connection>
-   <sender>m_buttonBox</sender>
-   <signal>rejected()</signal>
-   <receiver>ArkViewer</receiver>
-   <slot>reject()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>286</x>
-     <y>274</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
+ <connections/>
 </ui>
diff --git a/part/part.cpp b/part/part.cpp
index 4b9d0aeb..041312dc 100644
--- a/part/part.cpp
+++ b/part/part.cpp
@@ -52,6 +52,7 @@
 #include <KJobWidgets>
 #include <KIO/StatJob>
 #include <KMessageBox>
+#include <KParts/OpenUrlArguments>
 #include <KPluginFactory>
 #include <KRun>
 #include <KSelectAction>
-- 
2.13.0