diff --git a/gui/manager.glade b/gui/manager.glade index e93f92a931df6db8d0b10d678cdc60b809a7b53e..3c7c45c9d2c2e2a7263f1c036286a8f31a5541eb 100644 --- a/gui/manager.glade +++ b/gui/manager.glade @@ -274,23 +274,20 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="GtkBox" id="box2"> + <object class="GtkPaned" id="paned1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> + <property name="can_focus">True</property> + <property name="margin_left">5</property> + <property name="margin_right">5</property> <child> - <object class="GtkBox" id="box3"> + <object class="GtkNotebook" id="notebook1"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="vexpand">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">True</property> <child> - <object class="GtkBox" id="box4"> + <object class="GtkBox" id="box2"> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="margin_bottom">3</property> - <property name="spacing">5</property> + <property name="orientation">vertical</property> <child> <object class="GtkEntry" id="search_entry"> <property name="visible">True</property> @@ -299,6 +296,7 @@ <property name="is_focus">True</property> <property name="invisible_char">•</property> <property name="width_chars">25</property> + <property name="invisible_char_set">True</property> <property name="primary_icon_stock">gtk-find</property> <signal name="activate" handler="on_search_entry_activate" swapped="no"/> <signal name="icon-press" handler="on_search_entry_icon_press" swapped="no"/> @@ -306,51 +304,82 @@ <packing> <property name="expand">False</property> <property name="fill">True</property> + <property name="padding">2</property> <property name="position">0</property> </packing> </child> <child> - <object class="GtkButton" id="search_button"> - <property name="label">gtk-find</property> + <object class="GtkScrolledWindow" id="scrolledwindow3"> <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_search_button_clicked" swapped="no"/> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="search_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="model">search_list</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="search_treeview_selection"> + <property name="mode">browse</property> + <signal name="changed" handler="on_search_treeview_selection_changed" swapped="no"/> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="Terms"> + <property name="title" translatable="yes">column</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext8"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> <property name="position">1</property> </packing> </child> </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="tab1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Search</property> + </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">0</property> + <property name="tab_fill">False</property> </packing> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow3"> + <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="shadow_type">in</property> <child> - <object class="GtkTreeView" id="treeview1"> + <object class="GtkTreeView" id="groups_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="model">groups_list</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="treeview1_selection"> - <signal name="changed" handler="on_treeview1_selection_changed" swapped="no"/> + <object class="GtkTreeSelection" id="groups_treeview_selection"> + <property name="mode">browse</property> + <signal name="changed" handler="on_groups_treeview_selection_changed" swapped="no"/> </object> </child> <child> <object class="GtkTreeViewColumn" id="Groups"> - <property name="title" translatable="yes">Groups</property> <child> <object class="GtkCellRendererText" id="cellrenderertext2"/> <attributes> @@ -363,36 +392,134 @@ </child> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="tab2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Groups</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="state_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="model">state_list</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="state_treeview_selection"> + <property name="mode">browse</property> + <signal name="changed" handler="on_state_treeview_selection_changed" swapped="no"/> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="State"> + <property name="title" translatable="yes">column</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext9"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> <property name="position">2</property> </packing> </child> + <child type="tab"> + <object class="GtkLabel" id="tab3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">State</property> + </object> + <packing> + <property name="position">2</property> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow8"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="shadow_type">in</property> + <child> + <object class="GtkTreeView" id="repos_treeview"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="model">repos_list</property> + <property name="headers_visible">False</property> + <property name="headers_clickable">False</property> + <child internal-child="selection"> + <object class="GtkTreeSelection" id="repos_treeview_selection"> + <property name="mode">browse</property> + <signal name="changed" handler="on_repos_treeview_selection_changed" swapped="no"/> + </object> + </child> + <child> + <object class="GtkTreeViewColumn" id="Repos"> + <property name="title" translatable="yes">column</property> + <child> + <object class="GtkCellRendererText" id="cellrenderertext10"/> + <attributes> + <attribute name="text">0</attribute> + </attributes> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="tab4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Repos</property> + </object> + <packing> + <property name="position">3</property> + <property name="tab_fill">False</property> + </packing> + </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="padding">6</property> - <property name="position">0</property> + <property name="resize">False</property> + <property name="shrink">False</property> </packing> </child> <child> - <object class="GtkBox" id="box6"> + <object class="GtkPaned" id="paned2"> <property name="visible">True</property> - <property name="can_focus">False</property> - <property name="hexpand">True</property> - <property name="vexpand">True</property> + <property name="can_focus">True</property> <property name="orientation">vertical</property> - <property name="spacing">6</property> <child> - <object class="GtkScrolledWindow" id="scrolledwindow1"> + <object class="GtkScrolledWindow" id="scrolledwindow6"> <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="treeview2"> + <object class="GtkTreeView" id="list_treeview"> <property name="width_request">500</property> <property name="visible">True</property> <property name="can_focus">True</property> @@ -404,8 +531,8 @@ <property name="search_column">0</property> <property name="show_expanders">False</property> <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview2_selection"> - <signal name="changed" handler="on_treeview2_selection_changed" swapped="no"/> + <object class="GtkTreeSelection" id="list_treeview_selection"> + <signal name="changed" handler="on_list_treeview_selection_changed" swapped="no"/> </object> </child> <child> @@ -417,29 +544,37 @@ <signal name="clicked" handler="on_installed_column_clicked" swapped="no"/> <child> <object class="GtkCellRendererToggle" id="cellrenderertoggle1"> - <property name="cell_background_gdk">#000000000000</property> - <property name="cell_background_rgba">rgba(0,0,0,0)</property> - <property name="xpad">2</property> - <property name="ypad">2</property> + <property name="xpad">15</property> + <property name="xalign">0</property> <signal name="toggled" handler="on_cellrenderertoggle1_toggled" swapped="no"/> </object> <attributes> - <attribute name="activatable">2</attribute> - <attribute name="active">1</attribute> + <attribute name="visible">2</attribute> + <attribute name="active">3</attribute> + </attributes> + </child> + <child> + <object class="GtkCellRendererPixbuf" id="cellrendererpixbuf1"> + <property name="xpad">15</property> + <property name="xalign">1</property> + </object> + <attributes> + <attribute name="pixbuf">4</attribute> </attributes> </child> </object> </child> <child> <object class="GtkTreeViewColumn" id="name_column"> - <property name="resizable">True</property> <property name="sizing">autosize</property> <property name="title" translatable="yes">Name</property> <property name="clickable">True</property> <property name="sort_indicator">True</property> <signal name="clicked" handler="on_name_column_clicked" swapped="no"/> <child> - <object class="GtkCellRendererText" id="cellrenderertext3"/> + <object class="GtkCellRendererText" id="cellrenderertext3"> + <property name="xalign">0</property> + </object> <attributes> <attribute name="text">0</attribute> </attributes> @@ -450,20 +585,19 @@ </child> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="position">0</property> + <property name="resize">True</property> + <property name="shrink">False</property> </packing> </child> <child> - <object class="GtkScrolledWindow" id="scrolledwindow2"> + <object class="GtkScrolledWindow" id="scrolledwindow7"> <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="treeview3"> + <object class="GtkTreeView" id="details_treeview"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="model">package_desc</property> @@ -471,10 +605,9 @@ <property name="headers_clickable">False</property> <property name="rules_hint">True</property> <property name="enable_search">False</property> + <property name="search_column">0</property> <child internal-child="selection"> - <object class="GtkTreeSelection" id="treeview-selection3"> - <property name="mode">none</property> - </object> + <object class="GtkTreeSelection" id="details_treeview_selection"/> </child> <child> <object class="GtkTreeViewColumn" id="infotype"> @@ -508,24 +641,21 @@ </child> </object> <packing> - <property name="expand">False</property> - <property name="fill">True</property> - <property name="position">1</property> + <property name="resize">True</property> + <property name="shrink">False</property> </packing> </child> </object> <packing> - <property name="expand">True</property> - <property name="fill">True</property> - <property name="padding">6</property> - <property name="position">1</property> + <property name="resize">True</property> + <property name="shrink">False</property> </packing> </child> </object> <packing> - <property name="expand">False</property> + <property name="expand">True</property> <property name="fill">True</property> - <property name="padding">6</property> + <property name="padding">5</property> <property name="position">0</property> </packing> </child> @@ -760,18 +890,33 @@ <columns> <!-- column-name name --> <column type="gchararray"/> - <!-- column-name is_installed --> + <!-- column-name installed --> <column type="gboolean"/> <!-- column-name visible --> <column type="gboolean"/> + <!-- column-name active --> + <column type="gboolean"/> + <!-- column-name icon --> + <column type="GdkPixbuf"/> + </columns> + </object> + <object class="GtkListStore" id="repos_list"> + <columns> + <!-- column-name name --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkListStore" id="search_list"> + <columns> + <!-- column-name terms --> + <column type="gchararray"/> + </columns> + </object> + <object class="GtkListStore" id="state_list"> + <columns> + <!-- column-name state --> + <column type="gchararray"/> </columns> - <data> - <row> - <col id="0" translatable="yes"> </col> - <col id="1">False</col> - <col id="2">False</col> - </row> - </data> </object> <object class="GtkListStore" id="transaction_sum"> <columns> diff --git a/pamac-tray b/pamac-tray index 1e219e10a0a5d9d5811b83bf2738d2aa521674fe..d9ac06cdac59a5d28b53b6bdc704cff5c024d862 100755 --- a/pamac-tray +++ b/pamac-tray @@ -2,7 +2,7 @@ # -*-coding:utf-8-*- from gi.repository import Gtk, GObject -from subprocess import call +from subprocess import Popen from pamac import common, transaction import dbus import threading @@ -37,10 +37,10 @@ class Tray: self.statusIcon.connect('activate', self.activate_cb, self.menu) def execute_update(self, widget, event, data = None): - call(['/usr/bin/pamac-updater']) + Popen(['/usr/bin/pamac-updater']) def execute_manager(self, widget, event, data = None): - call(['/usr/bin/pamac-manager']) + Popen(['/usr/bin/pamac-manager']) def quit_tray(self, widget, data = None): t.shutdown() @@ -53,7 +53,7 @@ class Tray: data.popup(None, None, Gtk.StatusIcon.position_menu, self.statusIcon, 3, time) def activate_cb(self, widget, data = None): - call(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) + Popen(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) def update_icon(self, icon, info): self.statusIcon.set_from_file(icon) @@ -83,7 +83,7 @@ class PeriodicTask(threading.Thread): self._finished.wait(self._interval) def task(self): - call(['/usr/bin/pamac-refresh']) + Popen(['/usr/bin/pamac-refresh']) def set_icon(updates): global icon @@ -91,7 +91,7 @@ def set_icon(updates): if updates: icon = update_icon info = update_info.format(updates) - call(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) + Popen(['notify-send', '-i', icon, '-u', 'normal', 'Pamac', info]) else: icon = noupdate_icon info = noupdate_info diff --git a/pamac/main.py b/pamac/main.py index 9d9425ecfdef887cf9e04000a567e761fede0a71..f32bee4e2641fa623d68617be690fb423025f85a 100644 --- a/pamac/main.py +++ b/pamac/main.py @@ -2,7 +2,7 @@ # -*-coding:utf-8 -*- from gi.repository import Gtk - +from gi.repository.GdkPixbuf import Pixbuf import pyalpm import dbus from collections import OrderedDict @@ -20,15 +20,21 @@ interface = Gtk.Builder() interface.add_from_file('/usr/share/pamac/gui/manager.glade') ManagerWindow = interface.get_object("ManagerWindow") -packages_list = interface.get_object('packages_list') -groups_list = interface.get_object('groups_list') package_desc = interface.get_object('package_desc') -toggle = interface.get_object('cellrenderertoggle1') +#select_toggle = interface.get_object('cellrenderertoggle1') search_entry = interface.get_object('search_entry') -tree2 = interface.get_object('treeview2_selection') -tree1 = interface.get_object('treeview1_selection') +search_list = interface.get_object('search_list') +search_selection = interface.get_object('search_treeview_selection') +packages_list = interface.get_object('packages_list') +list_selection = interface.get_object('list_treeview_selection') installed_column = interface.get_object('installed_column') name_column = interface.get_object('name_column') +groups_list = interface.get_object('groups_list') +groups_selection = interface.get_object('groups_treeview_selection') +state_list = interface.get_object('state_list') +state_selection = interface.get_object('state_treeview_selection') +repos_list = interface.get_object('repos_list') +repos_selection = interface.get_object('repos_treeview_selection') ConfDialog = interface.get_object('ConfDialog') transaction_sum = interface.get_object('transaction_sum') sum_top_label = interface.get_object('sum_top_label') @@ -50,10 +56,10 @@ update_label = interface.get_object('update_label') def action_signal_handler(action): if action: progress_label.set_text(action) - if ('Refreshing' in action) or ('Preparing' in action) or ('Downloading' in action) or ('Checking' in action) or ('Resolving' in action) or ('Loading' in action): - ProgressCancelButton.set_visible(True) - else: + if ('Installing' in action) or ('Removing' in action) or ('Updating' in action): ProgressCancelButton.set_visible(False) + else: + ProgressCancelButton.set_visible(True) def icon_signal_handler(icon): action_icon.set_from_file(icon) @@ -76,14 +82,23 @@ bus.add_signal_receiver(percent_signal_handler, dbus_interface = "org.manjaro.pa installed_column.set_sort_column_id(1) name_column.set_sort_column_id(0) +installed_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-installed.png') +uninstalled_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-available.png') +to_install_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-add.png') +to_remove_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-delete.png') +locked_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-blocked.png') +search_icon = Pixbuf.new_from_file('/usr/share/pamac/icons/22x22/status/package-search.png') + pkg_name_list = [] pkg_object_dict = {} pkg_installed_dict = {} -list_dict = None -current_group = None +current_filter = (None, None) transaction_type = None transaction_dict = {} mode = None +states = ['Installed', 'Uninstalled', 'Orphans', 'To install', 'To remove'] +for state in states: + state_list.append([state]) def get_groups(): tmp_list = [] @@ -95,6 +110,11 @@ def get_groups(): for name in tmp_list: groups_list.append([name]) +def get_repos(): + for repo in transaction.handle.get_syncdbs(): + repos_list.append([repo.name]) + repos_list.append(['local']) + def set_list_dict_search(*patterns): global pkg_name_list global pkg_object_dict @@ -114,6 +134,17 @@ def set_list_dict_search(*patterns): pkg_installed_dict[pkg_object.name] = True pkg_object_dict[pkg_object.name] = pkg_object pkg_name_list = sorted(pkg_name_list) + if pkg_name_list: + joined = '' + for term in patterns: + joined += term + already_in_list = False + if len(search_list) != 0: + for line in search_list: + if joined == line[0]: + already_in_list = True + if not already_in_list: + search_list.append([joined]) def set_list_dict_group(group): global pkg_name_list @@ -142,39 +173,153 @@ def set_list_dict_group(group): pkg_object_dict[pkg_object.name] = pkg_object pkg_name_list = sorted(pkg_name_list) +def set_list_dict_installed(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + for pkg_object in transaction.localpkgs.values(): + if not pkg_object.name in pkg_name_list: + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = True + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_uninstalled(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + for pkg_object in transaction.syncpkgs.values(): + if not pkg_object.name in transaction.localpkgs.keys(): + if not pkg_object.name in pkg_name_list: + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = False + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_local(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + for pkg_object in transaction.localpkgs.values(): + if (not pkg_object.name in pkg_name_list) and (not pkg_object.name in transaction.syncpkgs.keys()): + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = True + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_orphans(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + for pkg_object in transaction.localpkgs.values(): + if (pkg_object.reason == 1) and (not pkg_object.compute_requiredby()): + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = True + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_to_install(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + if transaction_type == "install": + for pkg_object in transaction_dict.values(): + if not pkg_object.name in pkg_name_list: + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = False + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_to_remove(): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + if transaction_type == "remove": + for pkg_object in transaction_dict.values(): + if not pkg_object.name in pkg_name_list: + pkg_name_list.append(pkg_object.name) + pkg_installed_dict[pkg_object.name] = True + pkg_object_dict[pkg_object.name] = pkg_object + +def set_list_dict_repos(repo): + global pkg_name_list + global pkg_object_dict + global pkg_installed_dict + pkg_name_list = [] + pkg_object_dict = {} + pkg_installed_dict = {} + for db in transaction.handle.get_syncdbs(): + if db.name == repo: + for pkg_object in db.pkgcache: + if not pkg_object.name in pkg_name_list: + pkg_name_list.append(pkg_object.name) + if pkg_object.name in transaction.localpkgs.keys(): + pkg_installed_dict[pkg_object.name] = True + pkg_object_dict[pkg_object.name] = transaction.localpkgs[pkg_object.name] + else: + pkg_installed_dict[pkg_object.name] = False + pkg_object_dict[pkg_object.name] = pkg_object + def refresh_packages_list(): - global packages_list packages_list.clear() if not pkg_name_list: - packages_list.append(["No package found", False, False]) + packages_list.append(["No package found", False, False, False, search_icon]) else: for name in pkg_name_list: if name in config.holdpkg: - packages_list.append([name, pkg_installed_dict[name], False]) + packages_list.append([name, True, False, True, locked_icon]) elif transaction_type is "install": if pkg_installed_dict[name] is True: - packages_list.append([name, pkg_installed_dict[name], False]) + packages_list.append([name, True, False, True, installed_icon]) elif name in transaction_dict.keys(): - packages_list.append([name, True, True]) + packages_list.append([name, False, True, True, to_install_icon]) else: - packages_list.append([name, pkg_installed_dict[name], True]) + packages_list.append([name, False, True, False, uninstalled_icon]) elif transaction_type is "remove": if pkg_installed_dict[name] is False: - packages_list.append([name, pkg_installed_dict[name], False]) + packages_list.append([name, False, False, False, uninstalled_icon]) elif name in transaction_dict.keys(): - packages_list.append([name, False, True]) + packages_list.append([name, True, True, False, to_remove_icon]) else: - packages_list.append([name, pkg_installed_dict[name], True]) + packages_list.append([name, True, True, True, installed_icon]) + elif pkg_installed_dict[name] is True: + packages_list.append([name, True, True, True, installed_icon]) else: - packages_list.append([name, pkg_installed_dict[name], True]) + packages_list.append([name, False, True, False, uninstalled_icon]) def set_packages_list(): - global list_dict - if list_dict == "search": - search_strings_list = search_entry.get_text().split() - set_list_dict_search(*search_strings_list) - if list_dict == "group": - set_list_dict_group(current_group) + if current_filter[0] == 'search': + print(current_filter[1]) + set_list_dict_search(*current_filter[1]) + if current_filter[0] == 'group': + set_list_dict_group(current_filter[1]) + if current_filter[0] == 'installed': + set_list_dict_installed() + if current_filter[0] == 'uninstalled': + set_list_dict_uninstalled() + if current_filter[0] == 'orphans': + set_list_dict_orphans() + if current_filter[0] == 'local': + set_list_dict_local() + if current_filter[0] == 'to_install': + set_list_dict_to_install() + if current_filter[0] == 'to_remove': + set_list_dict_to_remove() + if current_filter[0] == 'repo': + set_list_dict_repos(current_filter[1]) refresh_packages_list() def set_desc(pkg, style): @@ -292,6 +437,7 @@ def handle_error(error): transaction_dict.clear() transaction_type = None transaction.update_db() + get_repos() get_groups() set_packages_list() if mode == 'updater': @@ -317,6 +463,7 @@ def handle_reply(reply): transaction.to_remove = [] transaction_dict.clear() transaction.update_db() + get_repos() get_groups() if (transaction_type == "install") or (transaction_type == "remove"): transaction_type = None @@ -491,7 +638,6 @@ def check_conflicts(mode, pkg_list): already_provided = False for pkgname in transaction.to_add: _pkg = transaction.syncpkgs[pkgname] - print('test',transaction.to_add) provide = pyalpm.find_satisfier([_pkg], depend) if provide: already_provided = True @@ -517,23 +663,24 @@ def check_conflicts(mode, pkg_list): provide = pyalpm.find_satisfier(transaction.localpkgs.values(), conflict) if provide: if provide.name != pkg.name: - new_provide = pyalpm.find_satisfier([transaction.syncpkgs[provide.name]], conflict) - if new_provide: - required = pkg.compute_requiredby() - if required: - str_required = '' - for item in required: - if str_required: - str_required += ', ' - str_required += item - if error: - error += '\n' - error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) - elif not provide.name in transaction.to_remove: - transaction.to_remove.append(provide.name) - if warning: - warning += '\n' - warning += pkg.name+' conflicts with '+provide.name + if transaction.syncpkgs.__contains__(provide.name): + new_provide = pyalpm.find_satisfier([transaction.syncpkgs[provide.name]], conflict) + if new_provide: + required = pkg.compute_requiredby() + if required: + str_required = '' + for item in required: + if str_required: + str_required += ', ' + str_required += item + if error: + error += '\n' + error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) + elif not provide.name in transaction.to_remove: + transaction.to_remove.append(provide.name) + if warning: + warning += '\n' + warning += pkg.name+' conflicts with '+provide.name provide = pyalpm.find_satisfier(depends[0], conflict) if provide: if not common.format_pkg_name(conflict) == pkg.name: @@ -550,23 +697,24 @@ def check_conflicts(mode, pkg_list): provide = pyalpm.find_satisfier(depends[0], conflict) if provide: if provide.name != pkg.name: - new_provide = pyalpm.find_satisfier([transaction.syncpkgs[pkg.name]], conflict) - if new_provide: - required = pkg.compute_requiredby() - if required: - str_required = '' - for item in required: - if str_required: - str_required += ', ' - str_required += item - if error: - error += '\n' - error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) - elif not provide.name in transaction.to_remove: - transaction.to_remove.append(pkg.name) - if warning: - warning += '\n' - warning += provide.name+' conflicts with '+pkg.name + if transaction.syncpkgs.__contains__(pkg.name): + new_provide = pyalpm.find_satisfier([transaction.syncpkgs[pkg.name]], conflict) + if new_provide: + required = pkg.compute_requiredby() + if required: + str_required = '' + for item in required: + if str_required: + str_required += ', ' + str_required += item + if error: + error += '\n' + error += '{} conflicts with {} but cannot be removed because it is needed by {}'.format(provide.name, pkg.name, str_required) + elif not provide.name in transaction.to_remove: + transaction.to_remove.append(pkg.name) + if warning: + warning += '\n' + warning += provide.name+' conflicts with '+pkg.name if mode == 'updating': for pkg in transaction.syncpkgs.values(): for replace in pkg.replaces: @@ -684,7 +832,6 @@ class Handler: def on_Manager_RefreshButton_clicked(self, *arg): do_refresh() - #set_packages_list() def on_TransCancelButton_clicked(self, *arg): global transaction_type @@ -699,23 +846,18 @@ class Handler: ConfDialog.hide() finalize() - def on_search_button_clicked(self, widget): - global list_dict - list_dict = "search" - set_packages_list() - def on_search_entry_icon_press(self, *arg): - global list_dict - list_dict = "search" + global current_filter + current_filter = ('search', search_entry.get_text().split()) set_packages_list() def on_search_entry_activate(self, widget): - global list_dict - list_dict = "search" + global current_filter + current_filter = ('search', search_entry.get_text().split()) set_packages_list() - def on_treeview2_selection_changed(self, widget): - liste, line = tree2.get_selected() + def on_list_treeview_selection_changed(self, widget): + liste, line = list_selection.get_selected() if line is not None: if packages_list[line][0] in pkg_object_dict.keys(): pkg_object = pkg_object_dict[packages_list[line][0]] @@ -725,13 +867,44 @@ class Handler: style = "sync" set_desc(pkg_object, style) - def on_treeview1_selection_changed(self, widget): - global list_dict - global current_group - liste, line = tree1.get_selected() + def on_search_treeview_selection_changed(self, widget): + global current_filter + liste, line = search_selection.get_selected() + if line is not None: + current_filter = ('search', search_list[line][0].split()) + set_packages_list() + + def on_groups_treeview_selection_changed(self, widget): + global current_filter + liste, line = groups_selection.get_selected() if line is not None: - list_dict = "group" - current_group = groups_list[line][0] + current_filter = ('group', groups_list[line][0]) + set_packages_list() + + def on_state_treeview_selection_changed(self, widget): + global current_filter + liste, line = state_selection.get_selected() + if line is not None: + if state_list[line][0] == 'Installed': + current_filter = ('installed', None) + if state_list[line][0] == 'Uninstalled': + current_filter = ('uninstalled', None) + if state_list[line][0] == 'Orphans': + current_filter = ('orphans', None) + if state_list[line][0] == 'To install': + current_filter = ('to_install', None) + if state_list[line][0] == 'To remove': + current_filter = ('to_remove', None) + set_packages_list() + + def on_repos_treeview_selection_changed(self, widget): + global current_filter + liste, line = repos_selection.get_selected() + if line is not None: + if repos_list[line][0] == 'local': + current_filter = ('local', None) + else: + current_filter = ('repo', repos_list[line][0]) set_packages_list() def on_installed_column_clicked(self, widget): @@ -745,6 +918,10 @@ class Handler: global transaction_dict global pkg_object_dict if packages_list[line][0] in transaction_dict.keys(): + if transaction_type == "remove": + packages_list[line][4] = installed_icon + if transaction_type == "install": + packages_list[line][4] = uninstalled_icon transaction_dict.pop(packages_list[line][0]) if not transaction_dict: transaction_type = None @@ -755,11 +932,11 @@ class Handler: else: packages_list[lin][2] = True lin += 1 - pass else: if packages_list[line][1] is True: transaction_type = "remove" transaction_dict[packages_list[line][0]] = pkg_object_dict[packages_list[line][0]] + packages_list[line][4] = to_remove_icon lin = 0 while lin < len(packages_list): if not packages_list[lin][0] in transaction_dict.keys(): @@ -769,13 +946,14 @@ class Handler: if packages_list[line][1] is False: transaction_type = "install" transaction_dict[packages_list[line][0]] = pkg_object_dict[packages_list[line][0]] + packages_list[line][4] = to_install_icon lin = 0 while lin < len(packages_list): if not packages_list[lin][0] in transaction_dict.keys(): if packages_list[lin][1] is True: packages_list[lin][2] = False lin += 1 - packages_list[line][1] = not packages_list[line][1] + packages_list[line][3] = not packages_list[line][3] packages_list[line][2] = True def on_cellrenderertoggle2_toggled(self, widget, line): diff --git a/pamac/transaction.py b/pamac/transaction.py index 641d8d4e06a96e0530df46a580c3ab4bda0c1d3e..e13ed3912300a36e3e3b0c4d7d31da77e5d8ef02 100644 --- a/pamac/transaction.py +++ b/pamac/transaction.py @@ -29,7 +29,7 @@ InfoDialog = interface.get_object('InfoDialog') def get_handle(): global handle - handle = config.pacman_conf.initialize_alpm() + handle = config.handle() print('get handle') def update_db():