From 9095ef993ce1a37d9e6faa4b1e0831d313e03f58 Mon Sep 17 00:00:00 2001
From: guinux <nuxgui@gmail.com>
Date: Mon, 31 Dec 2012 15:41:51 +0100
Subject: [PATCH] another try

---
 backend/transaction.py | 114 +----------------------------
 backend/update.py      | 107 +++++++++++++++++++++++++--
 gui/dialogs.glade      | 115 -----------------------------
 gui/pamac.glade        | 160 +++++++++++++++++++++++++++++++++++++++--
 gui/pamac_update.glade | 152 ++++++++++++++++++++++++++++++++++++++-
 pamac                  | 125 +++++++++++++++++++++-----------
 6 files changed, 491 insertions(+), 282 deletions(-)

diff --git a/backend/transaction.py b/backend/transaction.py
index 08aa98ab..437821f9 100755
--- a/backend/transaction.py
+++ b/backend/transaction.py
@@ -18,9 +18,6 @@ action_icon = interface.get_object('action_icon')
 ErrorDialog = interface.get_object('ErrorDialog')
 WarningDialog = interface.get_object('WarningDialog')
 QuestionDialog = interface.get_object('QuestionDialog')
-ConfDialog = interface.get_object('ConfDialog')
-transaction_desc = interface.get_object('transaction_desc')
-down_label = interface.get_object('down_label')
 
 t = None
 t_lock = False
@@ -105,74 +102,7 @@ def do_refresh():
 	progress_label.set_text('')
 	progress_bar.set_text('')
 
-def do_sysupgrade():
-	"""Upgrade a system like pacman -Su"""
-	global t
-	global t_lock
-	global to_remove
-	global to_add
-	global to_update
-	if t_lock is False:
-		if do_syncfirst is True:
-			t = init_transaction(config.handle, recurse = True)
-			for pkg in list_first:
-				t.add_pkg(pkg)
-			to_remove = t.to_remove
-			to_add = t.to_add
-			set_transaction_desc('update')
-			response = ConfDialog.run()
-			if response == Gtk.ResponseType.OK:
-				t_finalize(t)
-			if response == Gtk.ResponseType.CANCEL or Gtk.ResponseType.CLOSE or Gtk.ResponseType.DELETE_EVENT:
-				ProgressWindow.hide()
-				ConfDialog.hide()
-				t.release()
-				t_lock = False
-		else:
-			try:
-				t = init_transaction(config.handle)
-				t.sysupgrade(downgrade=False)
-			except pyalpm.error:
-				ErrorDialog.format_secondary_text(traceback.format_exc())
-				response = ErrorDialog.run()
-				if response:
-					ErrorDialog.hide()
-				t.release()
-				t_lock = False
-			check_conflicts()
-			to_add = t.to_add
-			to_remove = []
-			for pkg in conflict_to_remove.values():
-				to_remove.append(pkg)
-			if len(to_add) + len(to_remove) == 0:
-				t.release()
-				print("Nothing to update")
-			else:
-				t.release()
-				t = init_transaction(config.handle, noconflicts = True, nodeps = True)
-				for pkg in to_add:
-					t.add_pkg(pkg)
-				for pkg in conflict_to_remove.values():
-					t.remove_pkg(pkg)
-				to_remove = t.to_remove
-				to_add = t.to_add
-				set_transaction_desc('update')
-				if len(transaction_desc) != 0:
-					response = ConfDialog.run()
-					if response == Gtk.ResponseType.OK:
-								t_finalize(t)
-					if response == Gtk.ResponseType.CANCEL or Gtk.ResponseType.CLOSE or Gtk.ResponseType.DELETE_EVENT:
-						ProgressWindow.hide()
-						ConfDialog.hide()
-						t.release()
-						t_lock = False
-				else:
-					t_finalize(t)
-					t.release()
-					t_lock = False
-
 def t_finalize(t):
-	ConfDialog.hide()
 	ProgressWindow.show_all()
 	try:
 		t.prepare()
@@ -181,8 +111,6 @@ def t_finalize(t):
 		response = ErrorDialog.run()
 		if response:
 			ErrorDialog.hide()
-		t.release()
-		t_lock = False
 	try:
 		t.commit()
 	except pyalpm.error:
@@ -190,7 +118,9 @@ def t_finalize(t):
 		response = ErrorDialog.run()
 		if response:
 			ErrorDialog.hide()
+	t_lock = False
 	ProgressWindow.hide()
+	t.release()
 
 def get_updates():
 	"""Return a list of package objects in local db which can be updated"""
@@ -229,46 +159,6 @@ def format_size(size):
 		size_string = '%.2f MiB' % (KiB_size / 1024)
 		return size_string
 
-def set_transaction_desc(mode):
-	global transaction_desc
-	global down_label
-	global to_add
-	global to_remove
-	global to_update
-	transaction_desc.clear()
-	if to_remove:
-		transaction_desc.append(['To remove:', to_remove[0].name])
-		i = 1
-		while i < len(to_remove):
-			transaction_desc.append([' ', to_remove[i].name])
-			i += 1
-		down_label.set_markup('')
-	if to_add:
-		installed_name = []
-		for pkg_object in config.handle.get_localdb().pkgcache:
-			installed_name.append(pkg_object.name)
-		to_add_name = []
-		for pkg_object in to_add:
-			to_add_name.append(pkg_object.name)
-		to_update = sorted(set(installed_name).intersection(to_add_name))
-		to_remove_from_add_name = sorted(set(to_update).intersection(to_add_name))
-		for name in to_remove_from_add_name:
-			to_add_name.remove(name)
-		if to_add_name:
-			transaction_desc.append(['To install:', to_add_name[0]])
-			i = 1
-			while i < len(to_add_name):
-				transaction_desc.append([' ', to_add_name[i]])
-				i += 1
-		if mode == 'normal':
-			if to_update:
-				transaction_desc.append(['To update:', to_update[0]])
-				i = 1
-				while i < len(to_update):
-					transaction_desc.append([' ', to_update[i]])
-					i += 1
-		down_label.set_markup('')
-	#	down_label.set_markup('<b>Total Download size: </b>'+format_size(totaldlcb))
 
 # Callbacks
 event_text = ' '
diff --git a/backend/update.py b/backend/update.py
index 5321bb8c..506c7b55 100755
--- a/backend/update.py
+++ b/backend/update.py
@@ -6,22 +6,26 @@ from gi.repository import Gtk
 import pyalpm
 from os import geteuid
 
-from backend import transaction
+from backend import config, transaction
 
 interface = Gtk.Builder()
 interface.add_from_file('/usr/share/pamac/pamac_update.glade')
 interface.add_from_file('/usr/share/pamac/dialogs.glade')
 
-update_listore = interface.get_object('update_list')
+ConfDialog = interface.get_object('ConfDialog')
+transaction_add = interface.get_object('transaction_add')
 top_label = interface.get_object('top_label')
+bottom_label = interface.get_object('bottom_label')
+update_listore = interface.get_object('update_list')
+update_label = interface.get_object('update_label')
 
 def have_updates():
 	available_updates = transaction.get_updates()
 	update_listore.clear()
-	top_label.set_justify(Gtk.Justification.CENTER)
+	update_label.set_justify(Gtk.Justification.CENTER)
 	if not available_updates:
 		update_listore.append(["", ""])
-		top_label.set_markup("<big><b>No update available</b></big>")
+		update_label.set_markup("<big><b>No update available</b></big>")
 		return False
 	else:
 		for pkg in available_updates:
@@ -29,9 +33,91 @@ def have_updates():
 			newversion = transaction.get_new_version_available(pkgname)
 			pkgname = pkg.name+" "+newversion
 			update_listore.append([pkgname, transaction.format_size(pkg.size)])
-		top_label.set_markup("<big><b>Available updates</b></big>")
+		update_label.set_markup("<big><b>Available updates</b></big>")
 		return True
 
+def set_transaction_add():
+	transaction_add.clear()
+	if transaction.to_remove:
+		transaction_add.append(['To remove:', transaction.to_remove[0].name])
+		i = 1
+		while i < len(transaction.to_remove):
+			transaction_add.append([' ', transaction.to_remove[i].name])
+			i += 1
+		bottom_label.set_markup('')
+	if transaction.to_add:
+		installed_name = []
+		for pkg_object in config.handle.get_localdb().pkgcache:
+			installed_name.append(pkg_object.name)
+		to_add_name = []
+		for pkg_object in transaction.to_add:
+			to_add_name.append(pkg_object.name)
+		transaction.to_update = sorted(set(installed_name).intersection(to_add_name))
+		to_remove_from_add_name = sorted(set(transaction.to_update).intersection(to_add_name))
+		for name in to_remove_from_add_name:
+			to_add_name.remove(name)
+		if to_add_name:
+			transaction_add.append(['To install:', to_add_name[0]])
+			i = 1
+			while i < len(to_add_name):
+				transaction_add.append([' ', to_add_name[i]])
+				i += 1
+		if transaction.to_update:
+			transaction_add.append(['To update:', transaction.to_update[0]])
+			i = 1
+			while i < len(transaction.to_update):
+				transaction_add.append([' ', transaction.to_update[i]])
+				i += 1
+		bottom_label.set_markup('')
+		#bottom_label.set_markup('<b>Total Download size: </b>'+format_size(totaldlcb))
+		top_label.set_markup('<big><b>Additionnal Transaction(s)</b></big>')
+
+def do_sysupgrade():
+	"""Upgrade a system like pacman -Su"""
+	if transaction.t_lock is False:
+		if transaction.do_syncfirst is True:
+			transaction.t = transaction.init_transaction(config.handle, recurse = True)
+			for pkg in list_first:
+				transaction.t.add_pkg(pkg)
+			transaction.to_remove = transaction.t.to_remove
+			transaction.to_add = transaction.t.to_add
+			set_transaction_add()
+			ConfDialog.show_all()
+		else:
+			try:
+				transaction.t = transaction.init_transaction(config.handle)
+				transaction.t.sysupgrade(downgrade=False)
+			except pyalpm.error:
+				ErrorDialog.format_secondary_text(traceback.format_exc())
+				response = ErrorDialog.run()
+				if response:
+					ErrorDialog.hide()
+				transaction.t.release()
+				transaction.t_lock = False
+			transaction.check_conflicts()
+			transaction.to_add = transaction.t.to_add
+			transaction.to_remove = []
+			for pkg in transaction.conflict_to_remove.values():
+				transaction.to_remove.append(pkg)
+			if len(transaction.to_add) + len(transaction.to_remove) == 0:
+				transaction.t.release()
+				transaction.t_lock = False
+				print("Nothing to update")
+			else:
+				transaction.t.release()
+				transaction.t = transaction.init_transaction(config.handle, noconflicts = True, nodeps = True)
+				for pkg in transaction.to_add:
+					transaction.t.add_pkg(pkg)
+				for pkg in transaction.conflict_to_remove.values():
+					transaction.t.remove_pkg(pkg)
+				transaction.to_remove = transaction.t.to_remove
+				transaction.to_add = transaction.t.to_add
+				set_transaction_add()
+				if len(transaction.to_update) + len(transaction.to_remove) != 0:
+					ConfDialog.show_all()
+				else:
+					transaction.t_finalize(t)
+
 class Handler:
 	def on_UpdateWindow_delete_event(self, *arg):
 		Gtk.main_quit()
@@ -40,13 +126,22 @@ class Handler:
 		Gtk.main_quit()
 
 	def on_ApplyButton_clicked(self, *arg):
-		transaction.do_sysupgrade()
+		do_sysupgrade()
 		have_updates()
 
 	def on_RefreshButton_clicked(self, *arg):
 		transaction.do_refresh()
 		have_updates()
 
+	def on_TransCancelButton_clicked(self, *arg):
+		ConfDialog.hide()
+		transaction.t_lock = False
+		transaction.t.release()
+
+	def on_TransValidButton_clicked(self, *arg):
+		ConfDialog.hide()
+		transaction.t_finalize(t)
+
 def main():
 	have_updates()
 	interface.connect_signals(Handler())
diff --git a/gui/dialogs.glade b/gui/dialogs.glade
index 955e61f2..4dda61e8 100644
--- a/gui/dialogs.glade
+++ b/gui/dialogs.glade
@@ -1,113 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkMessageDialog" id="ConfDialog">
-    <property name="width_request">250</property>
-    <property name="height_request">150</property>
-    <property name="can_focus">False</property>
-    <property name="hexpand">True</property>
-    <property name="vexpand">True</property>
-    <property name="border_width">5</property>
-    <property name="window_position">center-on-parent</property>
-    <property name="default_width">200</property>
-    <property name="default_height">100</property>
-    <property name="icon">/usr/share/icons/hicolor/22x22/status/package-info.png</property>
-    <property name="type_hint">dialog</property>
-    <property name="skip_taskbar_hint">True</property>
-    <property name="deletable">False</property>
-    <property name="message_type">other</property>
-    <property name="buttons">ok-cancel</property>
-    <property name="text" translatable="yes">&lt;b&gt;Transaction summary&lt;/b&gt;</property>
-    <property name="use_markup">True</property>
-    <child internal-child="vbox">
-      <object class="GtkBox" id="messagedialog-vbox3">
-        <property name="can_focus">False</property>
-        <property name="hexpand">True</property>
-        <property name="vexpand">True</property>
-        <property name="orientation">vertical</property>
-        <child internal-child="action_area">
-          <object class="GtkButtonBox" id="messagedialog-action_area3">
-            <property name="can_focus">False</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="pack_type">end</property>
-            <property name="position">0</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkScrolledWindow" id="scrolledwindow4">
-            <property name="width_request">200</property>
-            <property name="height_request">120</property>
-            <property name="visible">True</property>
-            <property name="can_focus">True</property>
-            <property name="hexpand">True</property>
-            <property name="vexpand">True</property>
-            <property name="shadow_type">in</property>
-            <child>
-              <object class="GtkTreeView" id="treeview4">
-                <property name="visible">True</property>
-                <property name="can_focus">True</property>
-                <property name="hexpand">True</property>
-                <property name="vexpand">True</property>
-                <property name="model">transaction_desc</property>
-                <property name="headers_visible">False</property>
-                <property name="headers_clickable">False</property>
-                <property name="enable_search">False</property>
-                <property name="search_column">0</property>
-                <child internal-child="selection">
-                  <object class="GtkTreeSelection" id="treeview-selection"/>
-                </child>
-                <child>
-                  <object class="GtkTreeViewColumn" id="_action">
-                    <property name="title" translatable="yes">column</property>
-                    <child>
-                      <object class="GtkCellRendererText" id="cellrenderertext5">
-                        <property name="yalign">0</property>
-                        <property name="weight">600</property>
-                      </object>
-                      <attributes>
-                        <attribute name="text">0</attribute>
-                      </attributes>
-                    </child>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkTreeViewColumn" id="_packages">
-                    <property name="title" translatable="yes">column</property>
-                    <child>
-                      <object class="GtkCellRendererText" id="cellrenderertext6"/>
-                      <attributes>
-                        <attribute name="text">1</attribute>
-                      </attributes>
-                    </child>
-                  </object>
-                </child>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="expand">True</property>
-            <property name="fill">True</property>
-            <property name="position">2</property>
-          </packing>
-        </child>
-        <child>
-          <object class="GtkLabel" id="down_label">
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="label" translatable="yes">label</property>
-          </object>
-          <packing>
-            <property name="expand">False</property>
-            <property name="fill">True</property>
-            <property name="position">4</property>
-          </packing>
-        </child>
-      </object>
-    </child>
-  </object>
   <object class="GtkMessageDialog" id="ErrorDialog">
     <property name="can_focus">False</property>
     <property name="border_width">5</property>
@@ -279,12 +172,4 @@
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="transaction_desc">
-    <columns>
-      <!-- column-name action -->
-      <column type="gchararray"/>
-      <!-- column-name packages -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
 </interface>
diff --git a/gui/pamac.glade b/gui/pamac.glade
index 04f55ee8..2ed31b4a 100644
--- a/gui/pamac.glade
+++ b/gui/pamac.glade
@@ -1,11 +1,147 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
-  <object class="GtkListStore" id="groups_list">
-    <columns>
-      <!-- column-name name -->
-      <column type="gchararray"/>
-    </columns>
+  <object class="GtkWindow" id="ConfDialog">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes"> </property>
+    <property name="window_position">center</property>
+    <property name="default_width">350</property>
+    <property name="default_height">250</property>
+    <property name="icon">/usr/share/icons/hicolor/22x22/status/package-info.png</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="deletable">False</property>
+    <child>
+      <object class="GtkBox" id="box7">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="top_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">label</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow4">
+            <property name="width_request">200</property>
+            <property name="height_request">120</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="treeview4">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="model">transaction_sum</property>
+                <property name="headers_visible">False</property>
+                <property name="headers_clickable">False</property>
+                <property name="enable_search">False</property>
+                <property name="search_column">0</property>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="treeview-selection"/>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="_action">
+                    <property name="title" translatable="yes">column</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="cellrenderertext5">
+                        <property name="yalign">0</property>
+                        <property name="weight">600</property>
+                      </object>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="_packages">
+                    <property name="title" translatable="yes">column</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="cellrenderertext6"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="bottom_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">label</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="buttonbox1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">6</property>
+            <property name="homogeneous">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="TransCancelButton">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="on_TransCancelButton_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="TransValidButton">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="on_TransValidButton_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
   </object>
   <object class="GtkWindow" id="MainWindow">
     <property name="width_request">800</property>
@@ -366,6 +502,12 @@
       </object>
     </child>
   </object>
+  <object class="GtkListStore" id="groups_list">
+    <columns>
+      <!-- column-name name -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkListStore" id="package_desc">
     <columns>
       <!-- column-name info_type -->
@@ -397,4 +539,12 @@
       </row>
     </data>
   </object>
+  <object class="GtkListStore" id="transaction_sum">
+    <columns>
+      <!-- column-name action -->
+      <column type="gchararray"/>
+      <!-- column-name packages -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
 </interface>
diff --git a/gui/pamac_update.glade b/gui/pamac_update.glade
index 47bba445..a456eacd 100644
--- a/gui/pamac_update.glade
+++ b/gui/pamac_update.glade
@@ -1,6 +1,148 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkWindow" id="ConfDialog">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes"> </property>
+    <property name="window_position">center</property>
+    <property name="default_width">350</property>
+    <property name="default_height">250</property>
+    <property name="icon">/usr/share/icons/hicolor/22x22/status/package-info.png</property>
+    <property name="skip_taskbar_hint">True</property>
+    <property name="deletable">False</property>
+    <child>
+      <object class="GtkBox" id="box7">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkLabel" id="top_label1">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">label</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkScrolledWindow" id="scrolledwindow4">
+            <property name="width_request">200</property>
+            <property name="height_request">120</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="hexpand">True</property>
+            <property name="vexpand">True</property>
+            <property name="shadow_type">in</property>
+            <child>
+              <object class="GtkTreeView" id="treeview4">
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="hexpand">True</property>
+                <property name="vexpand">True</property>
+                <property name="model">transaction_add</property>
+                <property name="headers_visible">False</property>
+                <property name="headers_clickable">False</property>
+                <property name="enable_search">False</property>
+                <property name="search_column">0</property>
+                <child internal-child="selection">
+                  <object class="GtkTreeSelection" id="treeview-selection6"/>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="_action">
+                    <property name="title" translatable="yes">column</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="cellrenderertext5">
+                        <property name="yalign">0</property>
+                        <property name="weight">600</property>
+                      </object>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkTreeViewColumn" id="_packages">
+                    <property name="title" translatable="yes">column</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="cellrenderertext6"/>
+                      <attributes>
+                        <attribute name="text">1</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="bottom_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">label</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="buttonbox2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="spacing">6</property>
+            <property name="homogeneous">True</property>
+            <property name="layout_style">end</property>
+            <child>
+              <object class="GtkButton" id="TransCancelButton">
+                <property name="label">gtk-cancel</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="on_TransCancelButton_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="TransValidButton">
+                <property name="label">gtk-ok</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <property name="use_stock">True</property>
+                <signal name="clicked" handler="on_TransValidButton_clicked" swapped="no"/>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">3</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
   <object class="GtkWindow" id="UpdateWindow">
     <property name="can_focus">False</property>
     <property name="title" translatable="yes">Update Manager</property>
@@ -77,7 +219,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="top_label">
+              <object class="GtkLabel" id="update_label">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
                 <property name="label" translatable="yes">label</property>
@@ -150,6 +292,14 @@
       </object>
     </child>
   </object>
+  <object class="GtkListStore" id="transaction_add">
+    <columns>
+      <!-- column-name action -->
+      <column type="gchararray"/>
+      <!-- column-name packages -->
+      <column type="gchararray"/>
+    </columns>
+  </object>
   <object class="GtkListStore" id="update_list">
     <columns>
       <!-- column-name name -->
diff --git a/pamac b/pamac
index 19f4c4e9..b2f33b0a 100755
--- a/pamac
+++ b/pamac
@@ -25,6 +25,11 @@ tree2 = interface.get_object('treeview2_selection')
 tree1 = interface.get_object('treeview1_selection')
 installed_column = interface.get_object('installed_column')
 name_column = interface.get_object('name_column')
+ConfDialog = interface.get_object('ConfDialog')
+transaction_sum = interface.get_object('transaction_sum')
+top_label = interface.get_object('top_label')
+bottom_label = interface.get_object('bottom_label')
+
 installed_column.set_sort_column_id(1)
 name_column.set_sort_column_id(0)
 
@@ -186,6 +191,42 @@ def set_desc(pkg, style):
 		else:
 			package_desc.append(['Backup files:', '\n'.join(["%s %s" % (md5, file) for (file, md5) in pkg.backup])])
 
+def set_transaction_sum():
+	transaction_sum.clear()
+	if transaction.to_remove:
+		transaction_sum.append(['To remove:', transaction.to_remove[0].name])
+		i = 1
+		while i < len(transaction.to_remove):
+			transaction_sum.append([' ', transaction.to_remove[i].name])
+			i += 1
+		bottom_label.set_markup('')
+	if transaction.to_add:
+		installed_name = []
+		for pkg_object in config.handle.get_localdb().pkgcache:
+			installed_name.append(pkg_object.name)
+		to_add_name = []
+		for pkg_object in transaction.to_add:
+			to_add_name.append(pkg_object.name)
+		transaction.to_update = sorted(set(installed_name).intersection(to_add_name))
+		to_remove_from_add_name = sorted(set(transaction.to_update).intersection(to_add_name))
+		for name in to_remove_from_add_name:
+			to_add_name.remove(name)
+		if to_add_name:
+			transaction_sum.append(['To install:', to_add_name[0]])
+			i = 1
+			while i < len(to_add_name):
+				transaction_sum.append([' ', to_add_name[i]])
+				i += 1
+		if transaction.to_update:
+			transaction_sum.append(['To update:', transaction.to_update[0]])
+			i = 1
+			while i < len(transaction.to_update):
+				transaction_sum.append([' ', transaction.to_update[i]])
+				i += 1
+		bottom_label.set_markup('')
+		#bottom_label.set_markup('<b>Total Download size: </b>'+format_size(totaldlcb))
+		top_label.set_markup('<big><b>Transaction Summary</b></big>')
+
 class Handler:
 	def on_MainWindow_delete_event(self, *arg):
 		Gtk.main_quit()
@@ -209,7 +250,7 @@ class Handler:
 				transaction.ErrorDialog.hide()
 		else:
 			if transaction.t_lock is True:
-				pass
+				print('Transaction locked')
 			else:
 				if transaction_type is "remove":
 					transaction.t = transaction.init_transaction(config.handle, cascade = True)
@@ -226,27 +267,8 @@ class Handler:
 						transaction.t_lock = False
 					transaction.to_remove = transaction.t.to_remove
 					transaction.to_add = transaction.t.to_add
-					transaction.set_transaction_desc('normal')
-					response = transaction.ConfDialog.run()
-					if response == Gtk.ResponseType.OK:
-						transaction.ConfDialog.hide()
-						transaction.ProgressWindow.show_all()
-						try:
-							transaction.t.commit()
-						except pyalpm.error:
-							transaction.ErrorDialog.format_secondary_text(traceback.format_exc())
-							response = transaction.ErrorDialog.run()
-							if response:
-								transaction.ErrorDialog.hide()
-						transaction_dict.clear()
-						transaction_type = None
-						set_packages_list()
-						transaction.ProgressWindow.hide()
-					if response == Gtk.ResponseType.CANCEL or Gtk.ResponseType.CLOSE or Gtk.ResponseType.DELETE_EVENT:
-						transaction.ProgressWindow.hide()
-						transaction.ConfDialog.hide()
-						transaction.t.release()
-						transaction.t_lock = False
+					set_transaction_sum()
+					ConfDialog.show_all()
 				if transaction_type is "install":
 					transaction.t = transaction.init_transaction(config.handle, noconflicts = True)
 					for pkg in transaction_dict.values():
@@ -267,27 +289,8 @@ class Handler:
 						for pkg in transaction.conflict_to_remove.values():
 							transaction.to_remove.append(pkg)
 					transaction.t.release()
-					transaction.set_transaction_desc('normal')
-					response = transaction.ConfDialog.run()
-					if response == Gtk.ResponseType.OK:
-						transaction.ConfDialog.hide()
-						transaction.t = transaction.init_transaction(config.handle, noconflicts = True, nodeps = True)
-						print(transaction.to_add, transaction.to_remove)
-						for pkg in transaction.to_add:
-							print(pkg)
-							transaction.t.add_pkg(pkg)
-						for pkg in transaction.to_remove:
-							print(pkg)
-							transaction.t.remove_pkg(pkg)
-						transaction.t_finalize(transaction.t)
-						transaction_dict.clear()
-						transaction_type = None
-						set_packages_list()
-					if response == Gtk.ResponseType.CANCEL or Gtk.ResponseType.CLOSE or Gtk.ResponseType.DELETE_EVENT:
-						transaction.ProgressWindow.hide()
-						transaction.ConfDialog.hide()
-						transaction.t.release()
-						transaction.t_lock = False
+					set_transaction_sum()
+					ConfDialog.show_all()
 
 	def on_EraseButton_clicked(self, *arg):
 		global transaction_type
@@ -300,6 +303,42 @@ class Handler:
 		transaction.do_refresh()
 		refresh_packages_list()
 
+	def on_TransCancelButton_clicked(self, *arg):
+		ConfDialog.hide()
+		transaction.t_lock = False
+		try:
+			transaction.t.release()
+		except:
+			pass
+
+	def on_TransValidButton_clicked(self, *arg):
+		global transaction_type
+		ConfDialog.hide()
+		if transaction_type is "remove":
+			transaction.ProgressWindow.show_all()
+			try:
+				transaction.t.commit()
+			except pyalpm.error:
+				transaction.ErrorDialog.format_secondary_text(traceback.format_exc())
+				response = transaction.ErrorDialog.run()
+				if response:
+					transaction.ErrorDialog.hide()
+			transaction_dict.clear()
+			transaction_type = None
+			set_packages_list()
+			transaction.ProgressWindow.hide()
+		if transaction_type is "install":
+			transaction.t = transaction.init_transaction(config.handle, noconflicts = True, nodeps = True)
+			for pkg in transaction.to_add:
+				transaction.t.add_pkg(pkg)
+			for pkg in transaction.to_remove:
+				transaction.t.remove_pkg(pkg)
+			transaction.t_finalize(transaction.t)
+			transaction_dict.clear()
+			transaction_type = None
+			set_packages_list()
+		transaction.t_lock = False
+
 	def on_search_button_clicked(self, widget):
 		global list_dict
 		list_dict = "search"
-- 
GitLab