added stuff
authorAndrew <andrew@admin.liquid.me.uk>
Thu, 1 Jul 2021 04:20:22 +0000 (05:20 +0100)
committerAndrew <andrew@admin.liquid.me.uk>
Thu, 1 Jul 2021 04:20:22 +0000 (05:20 +0100)
ui/Ui_mainwindow.py [new file with mode: 0644]
ui/emerge_tab.ui [new file with mode: 0644]
ui/mainwindow.py [new file with mode: 0644]
ui/mainwindow.ui [new file with mode: 0644]

diff --git a/ui/Ui_mainwindow.py b/ui/Ui_mainwindow.py
new file mode 100644 (file)
index 0000000..399f726
--- /dev/null
@@ -0,0 +1,391 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file '/home/andrew/Projects/qtgentools/ui/mainwindow.ui'
+#
+# Created by: PyQt5 UI code generator 5.15.1
+#
+# WARNING: Any manual changes made to this file will be lost when pyuic5 is
+# run again.  Do not edit this file unless you know what you are doing.
+
+
+from PyQt5 import QtCore, QtGui, QtWidgets
+
+
+class Ui_MainWindow(object):
+    def setupUi(self, MainWindow):
+        MainWindow.setObjectName("MainWindow")
+        MainWindow.resize(714, 450)
+        self.centralWidget = QtWidgets.QWidget(MainWindow)
+        self.centralWidget.setObjectName("centralWidget")
+        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralWidget)
+        self.gridLayout_2.setObjectName("gridLayout_2")
+        self.tw_1 = QtWidgets.QTabWidget(self.centralWidget)
+        self.tw_1.setObjectName("tw_1")
+        self.tab_search = QtWidgets.QWidget()
+        self.tab_search.setObjectName("tab_search")
+        self.gridLayout = QtWidgets.QGridLayout(self.tab_search)
+        self.gridLayout.setObjectName("gridLayout")
+        self.s_pb_expand_pkg = QtWidgets.QPushButton(self.tab_search)
+        self.s_pb_expand_pkg.setObjectName("s_pb_expand_pkg")
+        self.gridLayout.addWidget(self.s_pb_expand_pkg, 5, 1, 1, 2)
+        self.s_pb_updatedb = QtWidgets.QPushButton(self.tab_search)
+        self.s_pb_updatedb.setObjectName("s_pb_updatedb")
+        self.gridLayout.addWidget(self.s_pb_updatedb, 5, 5, 1, 2)
+        self.s_le_search = QtWidgets.QLineEdit(self.tab_search)
+        self.s_le_search.setText("")
+        self.s_le_search.setObjectName("s_le_search")
+        self.gridLayout.addWidget(self.s_le_search, 0, 8, 1, 2)
+        self.s_le_command = QtWidgets.QLineEdit(self.tab_search)
+        self.s_le_command.setEnabled(False)
+        self.s_le_command.setObjectName("s_le_command")
+        self.gridLayout.addWidget(self.s_le_command, 5, 7, 1, 4)
+        self.s_pb_search = QtWidgets.QPushButton(self.tab_search)
+        self.s_pb_search.setObjectName("s_pb_search")
+        self.gridLayout.addWidget(self.s_pb_search, 0, 10, 1, 1)
+        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout.addItem(spacerItem, 2, 9, 1, 1)
+        self.s_pb_expand_all = QtWidgets.QPushButton(self.tab_search)
+        self.s_pb_expand_all.setObjectName("s_pb_expand_all")
+        self.gridLayout.addWidget(self.s_pb_expand_all, 5, 0, 1, 1)
+        self.s_pb_collapse = QtWidgets.QPushButton(self.tab_search)
+        self.s_pb_collapse.setObjectName("s_pb_collapse")
+        self.gridLayout.addWidget(self.s_pb_collapse, 5, 3, 1, 2)
+        spacerItem1 = QtWidgets.QSpacerItem(81, 48, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout.addItem(spacerItem1, 1, 10, 2, 1)
+        self.s_tv_results = QtWidgets.QTreeView(self.tab_search)
+        self.s_tv_results.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
+        self.s_tv_results.setProperty("showDropIndicator", False)
+        self.s_tv_results.setAlternatingRowColors(True)
+        self.s_tv_results.setSelectionMode(QtWidgets.QAbstractItemView.NoSelection)
+        self.s_tv_results.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems)
+        self.s_tv_results.setSortingEnabled(True)
+        self.s_tv_results.setWordWrap(False)
+        self.s_tv_results.setObjectName("s_tv_results")
+        self.s_tv_results.header().setSortIndicatorShown(True)
+        self.gridLayout.addWidget(self.s_tv_results, 3, 0, 1, 11)
+        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_4.setObjectName("verticalLayout_4")
+        self.s_cb_stable = QtWidgets.QCheckBox(self.tab_search)
+        self.s_cb_stable.setObjectName("s_cb_stable")
+        self.verticalLayout_4.addWidget(self.s_cb_stable)
+        self.s_rb_any = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_any.setCheckable(True)
+        self.s_rb_any.setObjectName("s_rb_any")
+        self.verticalLayout_4.addWidget(self.s_rb_any)
+        self.s_rb_iuse = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_iuse.setObjectName("s_rb_iuse")
+        self.verticalLayout_4.addWidget(self.s_rb_iuse)
+        self.gridLayout.addLayout(self.verticalLayout_4, 0, 0, 3, 1)
+        self.s_pbar = QtWidgets.QProgressBar(self.tab_search)
+        self.s_pbar.setProperty("value", 0)
+        self.s_pbar.setTextVisible(True)
+        self.s_pbar.setFormat("")
+        self.s_pbar.setObjectName("s_pbar")
+        self.gridLayout.addWidget(self.s_pbar, 4, 0, 1, 11)
+        self.s_lcd_results = QtWidgets.QLCDNumber(self.tab_search)
+        self.s_lcd_results.setDigitCount(5)
+        self.s_lcd_results.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
+        self.s_lcd_results.setObjectName("s_lcd_results")
+        self.gridLayout.addWidget(self.s_lcd_results, 2, 8, 1, 1)
+        spacerItem2 = QtWidgets.QSpacerItem(101, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout.addItem(spacerItem2, 1, 8, 1, 2)
+        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_3.setObjectName("verticalLayout_3")
+        self.s_cb_testing = QtWidgets.QCheckBox(self.tab_search)
+        self.s_cb_testing.setObjectName("s_cb_testing")
+        self.verticalLayout_3.addWidget(self.s_cb_testing)
+        self.s_rb_decription = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_decription.setObjectName("s_rb_decription")
+        self.verticalLayout_3.addWidget(self.s_rb_decription)
+        self.s_rb_use_enabled = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_use_enabled.setObjectName("s_rb_use_enabled")
+        self.verticalLayout_3.addWidget(self.s_rb_use_enabled)
+        self.gridLayout.addLayout(self.verticalLayout_3, 0, 1, 3, 2)
+        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
+        self.verticalLayout_2.setObjectName("verticalLayout_2")
+        self.s_cb_installed = QtWidgets.QCheckBox(self.tab_search)
+        self.s_cb_installed.setObjectName("s_cb_installed")
+        self.verticalLayout_2.addWidget(self.s_cb_installed)
+        self.s_rb_category = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_category.setObjectName("s_rb_category")
+        self.verticalLayout_2.addWidget(self.s_rb_category)
+        self.s_rb_use_disabled = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_use_disabled.setObjectName("s_rb_use_disabled")
+        self.verticalLayout_2.addWidget(self.s_rb_use_disabled)
+        self.gridLayout.addLayout(self.verticalLayout_2, 0, 3, 3, 2)
+        self.verticalLayout = QtWidgets.QVBoxLayout()
+        self.verticalLayout.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint)
+        self.verticalLayout.setObjectName("verticalLayout")
+        self.s_cb_overlay = QtWidgets.QCheckBox(self.tab_search)
+        self.s_cb_overlay.setTristate(False)
+        self.s_cb_overlay.setObjectName("s_cb_overlay")
+        self.verticalLayout.addWidget(self.s_cb_overlay)
+        self.s_rb_name = QtWidgets.QRadioButton(self.tab_search)
+        self.s_rb_name.setObjectName("s_rb_name")
+        self.verticalLayout.addWidget(self.s_rb_name)
+        self.s_l_results = QtWidgets.QLabel(self.tab_search)
+        self.s_l_results.setAlignment(QtCore.Qt.AlignCenter)
+        self.s_l_results.setObjectName("s_l_results")
+        self.verticalLayout.addWidget(self.s_l_results)
+        self.gridLayout.addLayout(self.verticalLayout, 0, 5, 3, 3)
+        self.tw_1.addTab(self.tab_search, "")
+        self.tab_depgraph = QtWidgets.QWidget()
+        self.tab_depgraph.setObjectName("tab_depgraph")
+        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_depgraph)
+        self.gridLayout_3.setObjectName("gridLayout_3")
+        self.d_rb_select = QtWidgets.QRadioButton(self.tab_depgraph)
+        self.d_rb_select.setChecked(True)
+        self.d_rb_select.setObjectName("d_rb_select")
+        self.gridLayout_3.addWidget(self.d_rb_select, 0, 0, 1, 1)
+        self.d_cb_category = QtWidgets.QComboBox(self.tab_depgraph)
+        self.d_cb_category.setObjectName("d_cb_category")
+        self.d_cb_category.addItem("")
+        self.gridLayout_3.addWidget(self.d_cb_category, 0, 1, 1, 2)
+        self.d_cb_package = QtWidgets.QComboBox(self.tab_depgraph)
+        self.d_cb_package.setObjectName("d_cb_package")
+        self.d_cb_package.addItem("")
+        self.gridLayout_3.addWidget(self.d_cb_package, 0, 3, 1, 1)
+        self.d_cb_version = QtWidgets.QComboBox(self.tab_depgraph)
+        self.d_cb_version.setObjectName("d_cb_version")
+        self.d_cb_version.addItem("")
+        self.gridLayout_3.addWidget(self.d_cb_version, 0, 4, 1, 1)
+        self.d_label_depth = QtWidgets.QLabel(self.tab_depgraph)
+        self.d_label_depth.setMaximumSize(QtCore.QSize(60, 16777215))
+        font = QtGui.QFont()
+        font.setBold(True)
+        font.setWeight(75)
+        self.d_label_depth.setFont(font)
+        self.d_label_depth.setLayoutDirection(QtCore.Qt.LeftToRight)
+        self.d_label_depth.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
+        self.d_label_depth.setObjectName("d_label_depth")
+        self.gridLayout_3.addWidget(self.d_label_depth, 0, 5, 1, 1)
+        self.d_le_depth = QtWidgets.QLineEdit(self.tab_depgraph)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.d_le_depth.sizePolicy().hasHeightForWidth())
+        self.d_le_depth.setSizePolicy(sizePolicy)
+        self.d_le_depth.setMaximumSize(QtCore.QSize(80, 16777215))
+        self.d_le_depth.setSizeIncrement(QtCore.QSize(5, 0))
+        self.d_le_depth.setBaseSize(QtCore.QSize(30, 0))
+        self.d_le_depth.setInputMask("")
+        self.d_le_depth.setObjectName("d_le_depth")
+        self.gridLayout_3.addWidget(self.d_le_depth, 0, 6, 1, 1)
+        spacerItem3 = QtWidgets.QSpacerItem(50, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_3.addItem(spacerItem3, 0, 7, 1, 1)
+        self.d_pb_calculate = QtWidgets.QPushButton(self.tab_depgraph)
+        self.d_pb_calculate.setObjectName("d_pb_calculate")
+        self.gridLayout_3.addWidget(self.d_pb_calculate, 0, 8, 1, 2)
+        self.d_rb_manual = QtWidgets.QRadioButton(self.tab_depgraph)
+        self.d_rb_manual.setObjectName("d_rb_manual")
+        self.gridLayout_3.addWidget(self.d_rb_manual, 1, 0, 1, 1)
+        self.d_le_package = QtWidgets.QLineEdit(self.tab_depgraph)
+        self.d_le_package.setEnabled(False)
+        self.d_le_package.setObjectName("d_le_package")
+        self.gridLayout_3.addWidget(self.d_le_package, 1, 1, 1, 4)
+        self.d_ckb_installed = QtWidgets.QCheckBox(self.tab_depgraph)
+        self.d_ckb_installed.setObjectName("d_ckb_installed")
+        self.gridLayout_3.addWidget(self.d_ckb_installed, 1, 5, 1, 4)
+        self.d_tv_results = QtWidgets.QTreeView(self.tab_depgraph)
+        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Expanding)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.d_tv_results.sizePolicy().hasHeightForWidth())
+        self.d_tv_results.setSizePolicy(sizePolicy)
+        self.d_tv_results.setMinimumSize(QtCore.QSize(0, 250))
+        self.d_tv_results.setObjectName("d_tv_results")
+        self.gridLayout_3.addWidget(self.d_tv_results, 2, 0, 1, 10)
+        self.d_pbar = QtWidgets.QProgressBar(self.tab_depgraph)
+        self.d_pbar.setProperty("value", 0)
+        self.d_pbar.setTextVisible(True)
+        self.d_pbar.setFormat("")
+        self.d_pbar.setObjectName("d_pbar")
+        self.gridLayout_3.addWidget(self.d_pbar, 3, 0, 1, 10)
+        self.d_pb_expand = QtWidgets.QPushButton(self.tab_depgraph)
+        self.d_pb_expand.setObjectName("d_pb_expand")
+        self.gridLayout_3.addWidget(self.d_pb_expand, 4, 0, 1, 1)
+        self.d_pb_collapse = QtWidgets.QPushButton(self.tab_depgraph)
+        self.d_pb_collapse.setObjectName("d_pb_collapse")
+        self.gridLayout_3.addWidget(self.d_pb_collapse, 4, 1, 1, 1)
+        spacerItem4 = QtWidgets.QSpacerItem(372, 27, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_3.addItem(spacerItem4, 4, 2, 1, 8)
+        self.tw_1.addTab(self.tab_depgraph, "")
+        self.tab_update = QtWidgets.QWidget()
+        self.tab_update.setObjectName("tab_update")
+        self.gridLayout_5 = QtWidgets.QGridLayout(self.tab_update)
+        self.gridLayout_5.setObjectName("gridLayout_5")
+        self.e_rb_new_use = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_new_use.setCheckable(True)
+        self.e_rb_new_use.setChecked(False)
+        self.e_rb_new_use.setObjectName("e_rb_new_use")
+        self.use_buttongroup = QtWidgets.QButtonGroup(MainWindow)
+        self.use_buttongroup.setObjectName("use_buttongroup")
+        self.use_buttongroup.addButton(self.e_rb_new_use)
+        self.gridLayout_5.addWidget(self.e_rb_new_use, 0, 0, 1, 1)
+        self.e_rb_update = QtWidgets.QRadioButton(self.tab_update)
+        font = QtGui.QFont()
+        font.setBold(False)
+        font.setUnderline(False)
+        font.setWeight(50)
+        self.e_rb_update.setFont(font)
+        self.e_rb_update.setCheckable(True)
+        self.e_rb_update.setChecked(False)
+        self.e_rb_update.setObjectName("e_rb_update")
+        self.tree_buttongroup = QtWidgets.QButtonGroup(MainWindow)
+        self.tree_buttongroup.setObjectName("tree_buttongroup")
+        self.tree_buttongroup.addButton(self.e_rb_update)
+        self.gridLayout_5.addWidget(self.e_rb_update, 0, 1, 1, 1)
+        self.e_cb_deep = QtWidgets.QCheckBox(self.tab_update)
+        self.e_cb_deep.setChecked(True)
+        self.e_cb_deep.setObjectName("e_cb_deep")
+        self.gridLayout_5.addWidget(self.e_cb_deep, 0, 2, 1, 1)
+        self.e_rb_world = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_world.setChecked(True)
+        self.e_rb_world.setObjectName("e_rb_world")
+        self.atom_buttongroup = QtWidgets.QButtonGroup(MainWindow)
+        self.atom_buttongroup.setObjectName("atom_buttongroup")
+        self.atom_buttongroup.addButton(self.e_rb_world)
+        self.gridLayout_5.addWidget(self.e_rb_world, 0, 3, 1, 1)
+        self.e_rb_atom = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_atom.setObjectName("e_rb_atom")
+        self.atom_buttongroup.addButton(self.e_rb_atom)
+        self.gridLayout_5.addWidget(self.e_rb_atom, 0, 4, 1, 1)
+        spacerItem5 = QtWidgets.QSpacerItem(44, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
+        self.gridLayout_5.addItem(spacerItem5, 0, 5, 1, 1)
+        self.e_pb_go = QtWidgets.QPushButton(self.tab_update)
+        self.e_pb_go.setObjectName("e_pb_go")
+        self.gridLayout_5.addWidget(self.e_pb_go, 0, 6, 1, 1)
+        self.e_rb_ch_use = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_ch_use.setObjectName("e_rb_ch_use")
+        self.use_buttongroup.addButton(self.e_rb_ch_use)
+        self.gridLayout_5.addWidget(self.e_rb_ch_use, 1, 0, 1, 1)
+        self.e_rb_emptytree = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_emptytree.setAutoExclusive(True)
+        self.e_rb_emptytree.setObjectName("e_rb_emptytree")
+        self.tree_buttongroup.addButton(self.e_rb_emptytree)
+        self.gridLayout_5.addWidget(self.e_rb_emptytree, 1, 1, 1, 1)
+        self.e_cb_nodeps = QtWidgets.QCheckBox(self.tab_update)
+        self.e_cb_nodeps.setObjectName("e_cb_nodeps")
+        self.gridLayout_5.addWidget(self.e_cb_nodeps, 1, 2, 1, 1)
+        self.e_rb_system = QtWidgets.QRadioButton(self.tab_update)
+        self.e_rb_system.setObjectName("e_rb_system")
+        self.atom_buttongroup.addButton(self.e_rb_system)
+        self.gridLayout_5.addWidget(self.e_rb_system, 1, 3, 1, 1)
+        self.e_le_atom = QtWidgets.QLineEdit(self.tab_update)
+        self.e_le_atom.setObjectName("e_le_atom")
+        self.gridLayout_5.addWidget(self.e_le_atom, 1, 4, 1, 3)
+        self.e_lv_results = QtWidgets.QListView(self.tab_update)
+        self.e_lv_results.setObjectName("e_lv_results")
+        self.gridLayout_5.addWidget(self.e_lv_results, 2, 0, 1, 7)
+        self.e_pbar = QtWidgets.QProgressBar(self.tab_update)
+        self.e_pbar.setProperty("value", 0)
+        self.e_pbar.setTextVisible(True)
+        self.e_pbar.setFormat("")
+        self.e_pbar.setObjectName("e_pbar")
+        self.gridLayout_5.addWidget(self.e_pbar, 3, 0, 1, 7)
+        self.u_le_cmd = QtWidgets.QLineEdit(self.tab_update)
+        self.u_le_cmd.setObjectName("u_le_cmd")
+        self.gridLayout_5.addWidget(self.u_le_cmd, 4, 0, 1, 7)
+        self.tw_1.addTab(self.tab_update, "")
+        self.gridLayout_2.addWidget(self.tw_1, 0, 1, 1, 1)
+        MainWindow.setCentralWidget(self.centralWidget)
+
+        self.retranslateUi(MainWindow)
+        self.tw_1.setCurrentIndex(1)
+        QtCore.QMetaObject.connectSlotsByName(MainWindow)
+
+    def retranslateUi(self, MainWindow):
+        _translate = QtCore.QCoreApplication.translate
+        MainWindow.setWindowTitle(_translate("MainWindow", "PyGentools"))
+        self.s_pb_expand_pkg.setToolTip(_translate("MainWindow", "<html><head/><body><p>Expand all categories to show packages</p></body></html>"))
+        self.s_pb_expand_pkg.setText(_translate("MainWindow", "Expand Pkgs"))
+        self.s_pb_updatedb.setToolTip(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
+"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
+"p, li { white-space: pre-wrap; }\n"
+"</style></head><body style=\" font-family:\'Noto Sans\'; font-size:8pt; font-weight:400; font-style:normal;\">\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">Update eix\'s database, runs:</p>\n"
+"<p style=\" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\">sudo eix-update</p></body></html>"))
+        self.s_pb_updatedb.setText(_translate("MainWindow", "Update DB"))
+        self.s_le_search.setPlaceholderText(_translate("MainWindow", "Enter search term"))
+        self.s_le_command.setText(_translate("MainWindow", "eix"))
+        self.s_pb_search.setToolTip(_translate("MainWindow", "<html><head/><body><p>Starts searching with the specified parameters</p></body></html>"))
+        self.s_pb_search.setText(_translate("MainWindow", "Search"))
+        self.s_pb_expand_all.setToolTip(_translate("MainWindow", "<html><head/><body><p>Expand all tree entries</p></body></html>"))
+        self.s_pb_expand_all.setText(_translate("MainWindow", "Expand All"))
+        self.s_pb_collapse.setToolTip(_translate("MainWindow", "<html><head/><body><p>Collapse tree</p></body></html>"))
+        self.s_pb_collapse.setText(_translate("MainWindow", "Collapse"))
+        self.s_tv_results.setToolTip(_translate("MainWindow", "<html><head/><body><p>Results show here</p></body></html>"))
+        self.s_cb_stable.setToolTip(_translate("MainWindow", "<html><head/><body><p>Include only packages with a stable version</p></body></html>"))
+        self.s_cb_stable.setText(_translate("MainWindow", "Stable"))
+        self.s_rb_any.setToolTip(_translate("MainWindow", "Search any field"))
+        self.s_rb_any.setText(_translate("MainWindow", "Any"))
+        self.s_rb_iuse.setToolTip(_translate("MainWindow", "<html><head/><body><p>Search for packages that support a specific use flag(s)</p></body></html>"))
+        self.s_rb_iuse.setText(_translate("MainWindow", "Use Support"))
+        self.s_cb_testing.setToolTip(_translate("MainWindow", "<html><head/><body><p>Include only packages with a testing version</p></body></html>"))
+        self.s_cb_testing.setText(_translate("MainWindow", "Testing"))
+        self.s_rb_decription.setToolTip(_translate("MainWindow", "Search the description field"))
+        self.s_rb_decription.setText(_translate("MainWindow", "Description"))
+        self.s_rb_use_enabled.setToolTip(_translate("MainWindow", "<html><head/><body><p>Search for packages installed with a specific use flag enabled</p></body></html>"))
+        self.s_rb_use_enabled.setText(_translate("MainWindow", "Use Enabled"))
+        self.s_cb_installed.setToolTip(_translate("MainWindow", "<html><head/><body><p>Include only installed packages</p></body></html>"))
+        self.s_cb_installed.setText(_translate("MainWindow", "Installed"))
+        self.s_rb_category.setToolTip(_translate("MainWindow", "Search the category field"))
+        self.s_rb_category.setText(_translate("MainWindow", "Category"))
+        self.s_rb_use_disabled.setToolTip(_translate("MainWindow", "<html><head/><body><p>Search for packages instealled with a specific use flag disabled</p></body></html>"))
+        self.s_rb_use_disabled.setText(_translate("MainWindow", "Use Disabled"))
+        self.s_cb_overlay.setToolTip(_translate("MainWindow", "<html><head/><body><p>Include only packages with at least one version in an overlay</p></body></html>"))
+        self.s_cb_overlay.setText(_translate("MainWindow", "Overlay"))
+        self.s_rb_name.setToolTip(_translate("MainWindow", "Search the name field"))
+        self.s_rb_name.setText(_translate("MainWindow", "Name"))
+        self.s_l_results.setText(_translate("MainWindow", "Results: "))
+        self.tw_1.setTabText(self.tw_1.indexOf(self.tab_search), _translate("MainWindow", "Search"))
+        self.d_rb_select.setText(_translate("MainWindow", "Select Package"))
+        self.d_cb_category.setToolTip(_translate("MainWindow", "<html><head/><body><p>Select a package category from the list</p></body></html>"))
+        self.d_cb_category.setItemText(0, _translate("MainWindow", "Select Category"))
+        self.d_cb_package.setToolTip(_translate("MainWindow", "<html><head/><body><p>Select a package from the list</p></body></html>"))
+        self.d_cb_package.setItemText(0, _translate("MainWindow", "Select Package"))
+        self.d_cb_version.setToolTip(_translate("MainWindow", "<html><head/><body><p>Select a package version from the list</p></body></html>"))
+        self.d_cb_version.setItemText(0, _translate("MainWindow", "Select Version"))
+        self.d_label_depth.setToolTip(_translate("MainWindow", "Max depgrah depth (0=no max)"))
+        self.d_label_depth.setText(_translate("MainWindow", "Depth:"))
+        self.d_le_depth.setToolTip(_translate("MainWindow", "<html><head/><body><p>Set the depth to which the dependencies are calculated (0 = full depth)</p></body></html>"))
+        self.d_le_depth.setText(_translate("MainWindow", "1"))
+        self.d_pb_calculate.setToolTip(_translate("MainWindow", "<html><head/><body><p>Click to do stuff</p></body></html>"))
+        self.d_pb_calculate.setText(_translate("MainWindow", "Calculate"))
+        self.d_rb_manual.setText(_translate("MainWindow", "Enter Package"))
+        self.d_le_package.setPlaceholderText(_translate("MainWindow", "=category/package-version"))
+        self.d_ckb_installed.setToolTip(_translate("MainWindow", "<html><head/><body><p>Experimental feature:</p><p>May result in spurious parent/child relationships in depgraph</p><p>The packages listed are still the correct dependencies.</p></body></html>"))
+        self.d_ckb_installed.setText(_translate("MainWindow", "Do Not Include Installed Packages"))
+        self.d_pb_expand.setText(_translate("MainWindow", "Expand All"))
+        self.d_pb_collapse.setText(_translate("MainWindow", "Collapse All"))
+        self.tw_1.setTabText(self.tw_1.indexOf(self.tab_depgraph), _translate("MainWindow", "Dep Graph"))
+        self.e_rb_new_use.setToolTip(_translate("MainWindow", "<html><head/><body><p>Adds the --newuse (-N) option to the emerge command</p></body></html>"))
+        self.e_rb_new_use.setText(_translate("MainWindow", "New Use"))
+        self.e_rb_update.setToolTip(_translate("MainWindow", "<html><head/><body><p>Adds the --update (-u) option to the emerge command</p></body></html>"))
+        self.e_rb_update.setText(_translate("MainWindow", "Update"))
+        self.e_cb_deep.setText(_translate("MainWindow", "Deep"))
+        self.e_rb_world.setText(_translate("MainWindow", "@World"))
+        self.e_rb_atom.setToolTip(_translate("MainWindow", "<html><head/><body><p>Enter a specific atom or set in the box below to use this option</p></body></html>"))
+        self.e_rb_atom.setText(_translate("MainWindow", "Atom Below"))
+        self.e_pb_go.setToolTip(_translate("MainWindow", "<html><head/><body><p>Executes the command with the set parameters</p><p>All command run with \'--pretend\' set. </p><p>\'--pretend\' is substituted for \'--ask\' on the displayed command, for quick copy and pasting.</p></body></html>"))
+        self.e_pb_go.setText(_translate("MainWindow", "Execute"))
+        self.e_rb_ch_use.setToolTip(_translate("MainWindow", "<html><head/><body><p>Adds the --changed-use (-U) option to the emerge command</p></body></html>"))
+        self.e_rb_ch_use.setText(_translate("MainWindow", "Changed Use"))
+        self.e_rb_emptytree.setToolTip(_translate("MainWindow", "<html><head/><body><p>Adds the --emptytree (-e) option to the emerge command</p></body></html>"))
+        self.e_rb_emptytree.setText(_translate("MainWindow", "Empty Tree"))
+        self.e_cb_nodeps.setToolTip(_translate("MainWindow", "<html><head/><body><p>Adds the --nodeps option to the emerge command (speeds up checking for use changes on a single package)</p></body></html>"))
+        self.e_cb_nodeps.setText(_translate("MainWindow", "No Deps"))
+        self.e_rb_system.setText(_translate("MainWindow", "@System"))
+        self.e_le_atom.setPlaceholderText(_translate("MainWindow", "Enter atom or set here"))
+        self.u_le_cmd.setToolTip(_translate("MainWindow", "<html><head/><body><p>Command to run in a terminal to make proposed changes</p></body></html>"))
+        self.tw_1.setTabText(self.tw_1.indexOf(self.tab_update), _translate("MainWindow", "Emerge"))
+
+
+if __name__ == "__main__":
+    import sys
+    app = QtWidgets.QApplication(sys.argv)
+    MainWindow = QtWidgets.QMainWindow()
+    ui = Ui_MainWindow()
+    ui.setupUi(MainWindow)
+    MainWindow.show()
+    sys.exit(app.exec_())
diff --git a/ui/emerge_tab.ui b/ui/emerge_tab.ui
new file mode 100644 (file)
index 0000000..0d6d18f
--- /dev/null
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>848</width>
+    <height>506</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <widget class="QLineEdit" name="u_le_cmd">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>420</y>
+      <width>671</width>
+      <height>28</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QWidget" name="layoutWidget_2">
+    <property name="geometry">
+     <rect>
+      <x>120</x>
+      <y>10</y>
+      <width>100</width>
+      <height>54</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout_2">
+     <item>
+      <widget class="QRadioButton" name="e_rb_new_use">
+       <property name="text">
+        <string>New Use</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="e_rb_ch_use">
+       <property name="text">
+        <string>Changed Use</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+   <widget class="QListView" name="e_lv_results">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>110</y>
+      <width>671</width>
+      <height>231</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QProgressBar" name="e_pbar">
+    <property name="geometry">
+     <rect>
+      <x>30</x>
+      <y>350</y>
+      <width>671</width>
+      <height>23</height>
+     </rect>
+    </property>
+    <property name="value">
+     <number>24</number>
+    </property>
+   </widget>
+   <widget class="QWidget" name="">
+    <property name="geometry">
+     <rect>
+      <x>370</x>
+      <y>15</y>
+      <width>321</width>
+      <height>71</height>
+     </rect>
+    </property>
+    <layout class="QGridLayout" name="gridLayout_2">
+     <item row="0" column="0">
+      <widget class="QRadioButton" name="e_rb_world">
+       <property name="text">
+        <string>@World</string>
+       </property>
+      </widget>
+     </item>
+     <item row="0" column="1">
+      <widget class="QRadioButton" name="e_rb_atom">
+       <property name="text">
+        <string>Atom Below</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="0">
+      <widget class="QRadioButton" name="e_rb_system">
+       <property name="text">
+        <string>@System</string>
+       </property>
+      </widget>
+     </item>
+     <item row="1" column="1" colspan="2">
+      <widget class="QLineEdit" name="e_le_atom"/>
+     </item>
+     <item row="0" column="2">
+      <widget class="QPushButton" name="e_pb_go">
+       <property name="text">
+        <string>Execute</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+   <widget class="QWidget" name="">
+    <property name="geometry">
+     <rect>
+      <x>227</x>
+      <y>10</y>
+      <width>91</width>
+      <height>54</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout_4">
+     <item>
+      <widget class="QCheckBox" name="e_cb_deep">
+       <property name="text">
+        <string>Deep</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QCheckBox" name="e_cb_nodeps">
+       <property name="text">
+        <string>No Deps</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+   <widget class="QWidget" name="">
+    <property name="geometry">
+     <rect>
+      <x>20</x>
+      <y>10</y>
+      <width>90</width>
+      <height>54</height>
+     </rect>
+    </property>
+    <layout class="QVBoxLayout" name="verticalLayout_3">
+     <item>
+      <widget class="QRadioButton" name="e_rb_update">
+       <property name="text">
+        <string>Update</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QRadioButton" name="e_rb_emptytree">
+       <property name="text">
+        <string>Empty Tree</string>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </widget>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>848</width>
+     <height>26</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui/mainwindow.py b/ui/mainwindow.py
new file mode 100644 (file)
index 0000000..5e82f0a
--- /dev/null
@@ -0,0 +1,622 @@
+# -*- coding: utf-8 -*-
+
+from PyQt5.QtWidgets import QApplication,QMainWindow
+from .Ui_mainwindow import Ui_MainWindow
+from subprocess import PIPE,Popen,TimeoutExpired
+import re
+from PyQt5.QtGui import QStandardItemModel,QStandardItem
+
+class d_Category:
+    def __init__(self):
+        self.Name=''
+        self.Packages=[]
+
+class d_Package:
+    def __init__(self):
+        self.Name=''
+        self.Versions=[]
+
+class s_Category:
+    def __init__(self):
+        self.UID=1
+        self.PUID=0
+        self.Name=''
+        self.Packages=[]
+
+class s_Package:
+    def __init__(self):
+        self.UID=0
+        self.PUID=0
+        self.Name=''
+        self.Description=''
+        self.Homepage=''
+        self.Installed=[]
+        self.Available=[]
+
+class s_Installed:
+    def __init__(self):
+        self.UID=0
+        self.PUID=0
+        self.Version=''
+        self.Use=''
+        self.Homepage='Installed ->'
+
+class s_Available:
+    def __init__(self):
+        self.UID=0
+        self.PUID=0
+        self.Version=''
+        self.Use=''
+        self.Homepage='Available ->'
+
+class s_Result:
+    def __init__(self):
+        self.UID=0 
+        self.PUID=0
+        self.Category=''
+        self.Name='' 
+        self.Description=''
+        self.Homepage='' 
+        self.Version='' 
+        self.Use=''
+
+class MainWindow(QMainWindow, Ui_MainWindow):
+    def __init__(self, parent=None):
+        super(MainWindow, self).__init__(parent)
+        self.setupUi(self)
+        self.d_catsupop=True
+        self.s_cb_option={
+            's_cb_stable':[self.s_cb_stable,'--stable'],
+            's_cb_testing':[self.s_cb_testing,'--testing'],
+            's_cb_installed':[self.s_cb_installed,'--installed'],
+            's_cb_overlay':[self.s_cb_overlay,'--overlay'],
+            }
+        self.s_rb_option={
+            's_rb_decription':[self.s_rb_decription,'--description'], 
+            's_rb_use_disabled':[self.s_rb_use_disabled,'--installed-without-use'],  
+            's_rb_any':[self.s_rb_any,'--any'], 
+            's_rb_name':[self.s_rb_name,'--name'], 
+            's_rb_category':[self.s_rb_category,'--category'], 
+            's_rb_iuse':[self.s_rb_iuse,'--use'], 
+            's_rb_use_enabled':[self.s_rb_use_enabled,'--installed-with-use'], 
+            }
+        self.s_cats=0
+        self.s_find={
+            'Category':[re.compile('^\[[0-9I]\] [A-z0-9]|^\* [A-z]'),self.s_getCat,0], 
+            'Name':[re.compile('^\[[0-9I]\] [A-z0-9]|^\* [A-z0-9]'),self.s_getName,1], 
+            'Description':[re.compile('Description:'),self.s_getDesc,2], 
+            'Homepage':[re.compile('Homepage:'),self.s_getHome,3], 
+            'Installed':[re.compile('Installed versions:'),self.s_getInstVers,4],
+            'Installed_use':re.compile('\)\([A-z3\-]'), 
+            'Available':[re.compile('Available versions:'),self.s_getAvailVers,6],
+            'Available_use':re.compile(' \[[A-z0-9="+_ \(\)-]*\]'),
+            'avail_ver':re.compile(' *(\*\*|[0-9]|\(~\)|\[[Mm]\])'),
+            'inst_ver':re.compile('([0-9]|c|a)\('),
+            }
+        self.resize(952, 492)
+
+#global class functions
+    def redraw_window(self):
+        self.update()
+        QApplication.processEvents()
+
+    def fold_use(self,use,trim):
+        if len(use)>trim:
+            uselist=use.split(' ')
+            nbp=trim
+            use=''
+            for usept in uselist:
+                usept=uselist.pop(0)
+                if len(use)+len(usept)>nbp:
+                    use='%s\n'%use
+                    trim+=2
+                    nbp+=trim
+                use='%s %s'%(use,usept)
+        return use
+
+#section depgraph tab section
+    def on_d_rb_select_toggled(self,p0):
+        self.d_cb_category.setEnabled(p0)
+        self.d_cb_package.setEnabled(p0)
+        self.d_cb_version.setEnabled(p0)
+        self.d_le_package.setEnabled(not p0)
+
+    def on_d_le_depth_returnPressed(self):
+        self.d_on_pb_calculate_released()
+        
+    def on_d_le_depth_textChanged(self, p0):
+        if p0=='':return
+        try:
+            int(p0)
+        except:
+            self.d_le_depth.setText('1')
+
+    def on_d_pb_calculate_released(self):
+        pkg=self.d_sanity_check()
+        if pkg:
+            self.d_gen_results(pkg)
+
+    def on_d_tv_results_expanded(self, index):
+        pass
+
+    def on_d_pbar_valueChanged(self, value):
+        pass
+    def on_d_pb_expand_released(self):
+        self.d_tv_results.expandAll()
+
+
+    def on_d_cb_category_currentTextChanged(self, p0):
+        if self.d_catsupop:return
+        self.d_pkgs=[]
+        self.d_cb_package.clear()
+        self.d_cb_package.addItem('Select Package')
+        if p0=='Select Category':return
+        for cat in self.d_cats:
+            if cat.Name==p0:
+                break
+        for pkg in cat.Packages:
+            self.d_cb_package.addItem(pkg.Name)
+            self.d_pkgs.append(pkg)
+
+    def on_d_cb_package_currentTextChanged(self, p0):
+        if not p0 or p0=='Select Package':return
+        cat=self.d_cb_category.currentText()
+        if cat=='Select Category':return
+        self.d_cb_version.clear()
+        self.d_cb_version.addItem('Select version')
+        str='%s/%s'%(cat,p0)
+        cmd=['eix','-n','-e','--versionlines',str]
+        process=Popen(cmd,encoding='utf-8',stdout=PIPE)
+        enders=re.compile('Installed versions:|Homepage:|Description:')
+        in_results=False
+        while True:
+            output = process.stdout.readline()
+            if output == '' and process.poll() is not None:
+                break
+            output=output.strip()
+            if not in_results and output!='Available versions:':
+                continue
+            if output=='Available versions:':
+                in_results=True
+                continue
+            if enders.match(output):
+                break
+            if in_results:
+                output=re.sub('\(~\)','~',output)
+                output=re.sub('~ {1,9}','~',output)
+                output=re.sub('\*\*',' ',output)
+                output=output.split()[0]
+                if output[0]=='(':continue
+                self.d_cb_version.addItem(output)
+    
+    def on_tw_1_currentChanged(self,p0):
+        if p0==1 and self.d_catsupop:
+            cmd=['eix','-n','--non-masked','--only-names']
+            process=Popen(cmd,encoding='utf-8',stdout=PIPE)
+            cats=[]
+            cat=d_Category()
+            while True:
+                output = process.stdout.readline()
+                if output == '' and process.poll() is not None:
+                    break
+                cat_name,pkg_name=output.split('/')
+                if cat.Name!=cat_name:
+                    cat=d_Category()
+                    cat.Name=cat_name
+                    cats.append(cat)
+                pkg=d_Package()
+                pkg.Name=pkg_name.strip()
+                cat.Packages.append(pkg)
+            self.d_cb_category.clear()
+            self.d_cb_category.addItem('Select version')
+            for cat in cats:
+                self.d_cb_category.addItem(cat.Name)
+                self.d_cats=cats
+            self.d_catsupop=False
+
+    def on_d_cb_version_currentTextChanged(self, p0):
+        pass
+
+    def on_d_pb_collapse_released(self):
+        self.d_tv_results.collapseAll()
+
+    def d_sanity_check(self):
+        if self.d_rb_select.isChecked():
+            cat=self.d_cb_category.currentText()
+            pkg=self.d_cb_package.currentText()
+            ver=self.d_cb_version.currentText()
+            for a in cat,pkg,ver:
+                if a.split(' ')[0]=='Select':return False
+            if ver[0]=='~':ver=ver[1:]
+            package='=%s/%s-%s'%(cat,pkg,ver)
+        else:
+            package=self.d_le_package.text()
+        return package
+
+    def d_gen_results(self,pkg):
+        self.d_pbar.setValue(0)
+        self.d_pbar.setFormat('Running equery g %s...'%pkg)
+        self.update()
+        QApplication.processEvents()
+        try:
+            depth=int(self.d_le_depth.text())
+        except:
+            depth=1
+        cmd=['equery','-C','g',pkg,'--depth=%s'%depth]
+        process=Popen(cmd,encoding='utf-8',stdout=PIPE)
+        re_depth=re.compile('\[ {0,2}[0-9]{1,3}\]')
+        uid=0
+        pdict={}
+        items={}
+        model = QStandardItemModel()
+        model.setHorizontalHeaderLabels(['Package Name'])
+        results=[]
+        while True:
+            output = process.stdout.readline()
+            if output == '' and process.poll() is not None:
+                break
+            results.append(output)
+        self.d_pbar.setMaximum(len(results)-2)
+        self.d_pbar.setFormat('Processing dependancy tree...')
+        self.update()
+        for output in results:       
+            if output.find('[')<0:continue
+            deploc=re_depth.search(output)
+            depth=int(output[deploc.start()+1:deploc.end()-1])
+            pkg=output[deploc.end()+2:].strip()
+            self.d_pbar.setValue(uid+1)
+            self.update()
+            QApplication.processEvents()
+            if depth==0:
+                items[uid]=pkg
+                parent=model.invisibleRootItem()
+                pdict[depth]=uid
+                parent.appendRow([QStandardItem(pkg)])
+                items[uid]=parent.child(parent.rowCount()-1)
+                uid+=1
+            else:
+                items[uid]=pkg
+                parent=items[pdict[depth-1]]
+                pdict[depth]=uid
+                parent.appendRow([QStandardItem(pkg)])
+                items[uid]=parent.child(parent.rowCount()-1)
+                uid+=1
+        self.d_tv_results.setModel(model)
+#endsection
+
+
+
+#search tab section ##
+    def on_s_pb_expand_pkg_released(self):
+        model=self.s_tv_results.model()
+        if not model:return
+        for a in range(0,self.s_cats+1):
+            self.s_tv_results.expand(model.createIndex(a,1))
+    def on_s_pb_updatedb_released(self):
+        child=Popen(['sudo','eix-update'])
+        child.wait()
+
+    def on_s_pb_search_released(self):
+        options=['eix','-l','-n']
+        for rb in self.s_rb_option:
+            if self.s_rb_option[rb][0].isChecked():
+                options.append(self.s_rb_option[rb][1])
+                break
+        for cb in self.s_cb_option:
+            if self.s_cb_option[cb][0].isChecked():
+                options.append(self.s_cb_option[cb][1])
+        terms=re.sub(' ','|',self.s_le_search.text())
+        options.append(terms)
+        self.s_le_command.setText(' '.join(options))
+        self.s_doSearch(options)
+
+    def on_s_pb_expand_all_released(self):
+        self.s_tv_results.expandAll()
+
+    def on_s_pb_collapse_released(self):
+        self.s_tv_results.collapseAll()
+        self.s_le_search.setText=('gecko')
+
+    def on_s_le_search_returnPressed(self):
+        self.on_s_pb_search_released()
+    
+    def on_s_tv_results_doubleClicked(self,p0):
+        url=p0.model().data(p0)
+        match=re.match('^https?://.*?( |$)',url)
+        if match:
+            url=url[:match.end()]
+            helpers=['xdg-open','kde-open5',]
+            for helper in helpers:
+                try:
+                    child=Popen([helper,url])
+                    if child.wait(timeout=5)==0:
+                        return
+                except FileNotFoundError:
+                    continue
+                except TimeoutExpired:
+                    child.kill()
+                    continue
+
+    def s_doSearch(self,options):
+        self.s_pbar.setValue(0)
+        results=[]
+        result=[]
+        in_result=False
+        starter=re.compile('^\[[0-9I]\] [A-z0-9]|^\* [A-z0-9]')
+        overlay=re.compile('^\[[0-9]\] "')
+        process=Popen(options,encoding='utf-8',stdout=PIPE)
+        self.s_pbar.setFormat('Running command: %s'%' '.join(options))
+        self.s_pbar.setTextVisible(True)
+        self.redraw_window()
+        counter=nudp=0
+        while True:
+            output=re.sub('\t',' ',process.stdout.readline())
+            if output=='' and process.poll() is not None:
+                break
+            if starter.match(output):
+                in_result=True
+                counter+=1        
+                self.s_lcd_results.display(counter)
+                if counter>nudp:
+                    self.redraw_window()
+                    nudp=counter+int(counter/10)
+            elif output=='\n':
+                in_result=False
+            elif overlay.match(output) and not in_result:
+                list=output.split(' ')
+                result=['* Overlays/%s: %s'%(list[1][1:-1],list[0]),'Description: %s'%list[2]]
+                in_result=False
+            if output and in_result:
+                while output.find('  ')>=0:
+                    output=re.sub('  ',' ',output)
+                result.append(output.strip())
+            elif result and not in_result:
+                results.append(result)
+                result=[]
+        self.s_lcd_results.display(counter)
+        self.s_pbar.setMaximum(len(results))
+        self.s_pbar.setFormat('Processing Data: Pass 1/2...')
+        self.redraw_window()
+        model=self.s_createResultsModel(self)
+        uid=1
+        prog=1
+        cats=[]
+        for result in results:
+            cats,uid=self.s_formatResult(cats,uid,result)
+            self.s_pbar.setValue(prog)
+            prog+=1
+        ex_cats=self.s_sortResults(cats)
+        self.s_addResults(model,ex_cats) 
+        self.s_cats=len(cats)
+        self.s_tv_results.setModel(model)
+        self.s_pbar.setFormat('Done')
+
+    def s_createResultsModel(self,parent):
+        headers=['Category','Name','Description','Homepage' ]
+        model=QStandardItemModel()
+        model.setHorizontalHeaderLabels(headers)
+        return model
+
+    def s_formatResult(self,cats,uid,result):
+        cat=None
+        in_avail=False
+        in_inst=False
+        for field in result:
+            if self.s_find['Category'][0].search(field):
+                cat_name=self.s_find['Category'][1](field)
+                for pcat in cats:
+                    if pcat.Name==cat_name:
+                        cat=pcat
+                        break
+                if not cat:
+                    cat=s_Category()
+                    cat.Name=cat_name
+                    cat.UID=uid
+                    cats.append(cat)
+                    uid+=1
+                pkg=s_Package()
+                pkg.Name=self.s_find['Name'][1](field)
+                pkg.UID=uid
+                uid+=1
+                pkg.PUID=cat.UID
+                cat.Packages.append(pkg)
+                continue
+            if self.s_find['Description'][0].search(field):
+                in_avail=in_inst=False
+                pkg.Description=self.s_find['Description'][1](field)
+                continue
+            if self.s_find['Homepage'][0].search(field):
+                in_avail=in_inst=False              
+                pkg.Homepage=self.s_find['Homepage'][1](field)
+                continue
+            if self.s_find['Installed'][0].search(field) or in_inst:
+                in_avail=False
+                in_inst=True
+                installed,use=self.s_find['Installed'][1](field)
+                inst=s_Installed()
+                inst.Version=installed
+                inst.Use=use
+                inst.PUID=pkg.UID
+                inst.UID=uid
+                uid+=1
+                pkg.Installed.append(inst)
+                continue
+            if self.s_find['Available'][0].search(field):
+                in_avail=True
+                continue
+            if in_avail:
+                version,use=self.s_find['Available'][1](field)
+                if version:
+                    avail=s_Available()
+                    avail.Version=version
+                    avail.PUID=pkg.UID
+                    avail.UID=uid
+                    avail.Use=use
+                    uid+=1 
+                    pkg.Available.append(avail)
+        return cats,uid    
+
+    def s_getName(self,str):
+        return str.split('/')[1].strip()
+
+    def s_getCat(self,str):
+        return str.split(' ')[1].split('/')[0].strip()
+    
+    def s_getAvailVers(self,str):
+        if str.strip()[0]=='(':return None,None
+        poppers=('[P]')
+        use,ind=self.s_getAuse(str)
+        ver=''
+        str=str[:ind].strip()
+        fields=str.split(' ')
+        if fields[0].find('~')>=0:
+            ver='~'
+            fields.pop(0)
+        if fields[0].find('*')>=0:
+            ver='**'
+            fields.pop(0)
+        if fields[0] in poppers:
+            fields.pop(0)
+        ver='%s%s'%(ver,fields[0])
+        return ver,use   
+
+    def s_getAuse(self,str):
+        t=self.s_find['Available_use'].search(str)
+        use=''
+        ind=None
+        if t:use,ind=str[t.start()+2:t.end()-1],t.start()+1
+        if use:use=self.fold_use('Available use flags: %s'%use,120)
+        return use,ind 
+
+    def s_getInstVers(self,str):
+        str=self.s_sanitise(str)
+        ver=None
+        use,ind=self.s_getIuse(str)
+        str=str[:ind].strip()
+        m=self.s_find['inst_ver'].search(str)
+        if m:
+            ver=str[:m.start()+1]
+            ver=self.s_clean(ver)
+        return ver,use
+
+    def s_getIuse(self,str):
+        m=self.s_find['Installed_use'].search(str)
+        iuse=''
+        ind=None
+        if m:iuse,ind=str[m.end()-1:str.rfind(')')],m.end()
+        if iuse:iuse=self.fold_use('Installed use flags: %s'%iuse,120)
+        return iuse,ind
+
+    def s_getHome(self,str):
+        t=self.s_find['Homepage'][0].match(str)
+        home=str[t.end()+1:].strip()
+        return home
+
+    def s_getDesc(self,str):
+        t=self.s_find['Description'][0].match(str)
+        desc=str[t.end()+1:].strip()
+        return desc
+    
+    def s_sanitise(self,str):
+        strippers={ '\^[a-z]{1,3}':'','\*l':'','\(~\)':'~','\[.\]':'','Installed versions: *':''}
+        for stripper in strippers:
+            str=re.sub(stripper,strippers[stripper],str)
+        return str
+
+    def s_clean(self,str):
+        strippers={ '\^[a-z]{1,3}':'','\*l':'','\(~\)':'~','\(([0-9]{2}:){2}[0-9]{2} ([0-9]{2}/){2}[0-9]{2}\)':''}
+        for stripper in strippers:
+            str=re.sub(stripper,strippers[stripper],str)
+        return str
+
+    def s_sortResults(self,results):
+        sorted=[]
+        for cat in results:
+            result=s_Result()
+            result.UID=cat.UID
+            result.Category=cat.Name
+            sorted.append(result)
+            for pkg in cat.Packages:
+                result=s_Result()
+                result.Name=pkg.Name
+                result.UID=pkg.UID
+                result.PUID=pkg.PUID
+                result.Description=pkg.Description
+                result.Homepage=pkg.Homepage
+                sorted.append(result)
+                for inst in pkg.Installed:
+                    result=s_Result()
+                    result.UID=inst.UID
+                    result.PUID=inst.PUID
+                    result.Name=inst.Homepage
+                    result.Description=inst.Version
+                    result.Homepage=inst.Use
+                    sorted.append(result)
+                for avail in pkg.Available:
+                    result=s_Result()
+                    result.UID=avail.UID
+                    result.PUID=avail.PUID
+                    result.Name=avail.Homepage
+                    result.Description=avail.Version
+                    result.Homepage=avail.Use
+                    sorted.append(result)
+        return sorted
+    def s_addResults(self,model,results):
+        prog=1
+        self.s_pbar.setMaximum(len(results))
+        self.s_pbar.setFormat('Processing Data: Pass 2/2...')
+        items={}
+        for result in results:
+            if result.PUID==0:
+                parent=model.invisibleRootItem()
+            else:
+                parent=items[result.PUID]
+            parent.appendRow([  QStandardItem(result.Category), 
+                                QStandardItem(result.Name), 
+                                QStandardItem(result.Description), 
+                                QStandardItem(result.Homepage),
+                            ])
+            items[result.UID] = parent.child(parent.rowCount()-1)
+            self.s_pbar.setValue(prog)
+            prog+=1
+        return model
+#endsection
+
+
+#emerge tab section ##
+    def on_e_rb_new_use_toggled(self, checked):
+        pass
+
+    def on_e_rb_update_toggled(self, checked):
+        pass
+
+    def on_e_cb_deep_toggled(self, checked):
+        pass
+
+    def on_e_rb_world_toggled(self, checked):
+        pass
+
+    def on_e_rb_atom_toggled(self, checked):
+        pass
+
+    def on_e_pb_go_released(self):
+        pass
+
+    def on_e_rb_ch_use_toggled(self, checked):
+        pass
+
+    def on_e_rb_emptytree_toggled(self, checked):
+        pass
+
+    def on_e_cb_nodeps_toggled(self, checked):
+        pass
+
+    def on_e_rb_system_toggled(self, checked):
+        pass
+
+    def on_e_pbar_valueChanged(self, value):
+        pass
+#endsection
diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui
new file mode 100644 (file)
index 0000000..8f14625
--- /dev/null
@@ -0,0 +1,779 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>714</width>
+    <height>450</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>PyGentools</string>
+  </property>
+  <widget class="QWidget" name="centralWidget">
+   <layout class="QGridLayout" name="gridLayout_2">
+    <item row="0" column="1">
+     <widget class="QTabWidget" name="tw_1">
+      <property name="currentIndex">
+       <number>0</number>
+      </property>
+      <widget class="QWidget" name="tab_search">
+       <attribute name="title">
+        <string>Search</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout">
+        <item row="5" column="1" colspan="2">
+         <widget class="QPushButton" name="s_pb_expand_pkg">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expand all categories to show packages&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Expand Pkgs</string>
+          </property>
+         </widget>
+        </item>
+        <item row="5" column="5" colspan="2">
+         <widget class="QPushButton" name="s_pb_updatedb">
+          <property name="toolTip">
+           <string>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
+&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
+p, li { white-space: pre-wrap; }
+&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:'Noto Sans'; font-size:8pt; font-weight:400; font-style:normal;&quot;&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;Update eix's database, runs:&lt;/p&gt;
+&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;sudo eix-update&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Update DB</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="8" colspan="2">
+         <widget class="QLineEdit" name="s_le_search">
+          <property name="text">
+           <string/>
+          </property>
+          <property name="placeholderText">
+           <string>Enter search term</string>
+          </property>
+         </widget>
+        </item>
+        <item row="5" column="7" colspan="4">
+         <widget class="QLineEdit" name="s_le_command">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="text">
+           <string>eix</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="10">
+         <widget class="QPushButton" name="s_pb_search">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Starts searching with the specified parameters&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Search</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="9">
+         <spacer name="horizontalSpacer_4">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::MinimumExpanding</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>40</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="5" column="0">
+         <widget class="QPushButton" name="s_pb_expand_all">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Expand all tree entries&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Expand All</string>
+          </property>
+         </widget>
+        </item>
+        <item row="5" column="3" colspan="2">
+         <widget class="QPushButton" name="s_pb_collapse">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Collapse tree&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Collapse</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="10" rowspan="2">
+         <spacer name="horizontalSpacer_6">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Preferred</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>81</width>
+            <height>48</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="3" column="0" colspan="11">
+         <widget class="QTreeView" name="s_tv_results">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Results show here&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="editTriggers">
+           <set>QAbstractItemView::NoEditTriggers</set>
+          </property>
+          <property name="showDropIndicator" stdset="0">
+           <bool>false</bool>
+          </property>
+          <property name="alternatingRowColors">
+           <bool>true</bool>
+          </property>
+          <property name="selectionMode">
+           <enum>QAbstractItemView::NoSelection</enum>
+          </property>
+          <property name="selectionBehavior">
+           <enum>QAbstractItemView::SelectItems</enum>
+          </property>
+          <property name="sortingEnabled">
+           <bool>true</bool>
+          </property>
+          <property name="wordWrap">
+           <bool>false</bool>
+          </property>
+          <attribute name="headerShowSortIndicator" stdset="0">
+           <bool>true</bool>
+          </attribute>
+         </widget>
+        </item>
+        <item row="0" column="0" rowspan="3">
+         <layout class="QVBoxLayout" name="verticalLayout_4">
+          <item>
+           <widget class="QCheckBox" name="s_cb_stable">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Include only packages with a stable version&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Stable</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_any">
+            <property name="toolTip">
+             <string>Search any field</string>
+            </property>
+            <property name="text">
+             <string>Any</string>
+            </property>
+            <property name="checkable">
+             <bool>true</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_iuse">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Search for packages that support a specific use flag(s)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Use Support</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item row="4" column="0" colspan="11">
+         <widget class="QProgressBar" name="s_pbar">
+          <property name="value">
+           <number>0</number>
+          </property>
+          <property name="textVisible">
+           <bool>true</bool>
+          </property>
+          <property name="format">
+           <string/>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="8">
+         <widget class="QLCDNumber" name="s_lcd_results">
+          <property name="digitCount">
+           <number>5</number>
+          </property>
+          <property name="segmentStyle">
+           <enum>QLCDNumber::Flat</enum>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="8" colspan="2">
+         <spacer name="horizontalSpacer_3">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>101</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="0" column="1" rowspan="3" colspan="2">
+         <layout class="QVBoxLayout" name="verticalLayout_3">
+          <item>
+           <widget class="QCheckBox" name="s_cb_testing">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Include only packages with a testing version&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Testing</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_decription">
+            <property name="toolTip">
+             <string>Search the description field</string>
+            </property>
+            <property name="text">
+             <string>Description</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_use_enabled">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Search for packages installed with a specific use flag enabled&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Use Enabled</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item row="0" column="3" rowspan="3" colspan="2">
+         <layout class="QVBoxLayout" name="verticalLayout_2">
+          <item>
+           <widget class="QCheckBox" name="s_cb_installed">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Include only installed packages&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Installed</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_category">
+            <property name="toolTip">
+             <string>Search the category field</string>
+            </property>
+            <property name="text">
+             <string>Category</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_use_disabled">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Search for packages instealled with a specific use flag disabled&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Use Disabled</string>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+        <item row="0" column="5" rowspan="3" colspan="3">
+         <layout class="QVBoxLayout" name="verticalLayout">
+          <property name="sizeConstraint">
+           <enum>QLayout::SetDefaultConstraint</enum>
+          </property>
+          <item>
+           <widget class="QCheckBox" name="s_cb_overlay">
+            <property name="toolTip">
+             <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Include only packages with at least one version in an overlay&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+            </property>
+            <property name="text">
+             <string>Overlay</string>
+            </property>
+            <property name="tristate">
+             <bool>false</bool>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QRadioButton" name="s_rb_name">
+            <property name="toolTip">
+             <string>Search the name field</string>
+            </property>
+            <property name="text">
+             <string>Name</string>
+            </property>
+           </widget>
+          </item>
+          <item>
+           <widget class="QLabel" name="s_l_results">
+            <property name="text">
+             <string>Results: </string>
+            </property>
+            <property name="alignment">
+             <set>Qt::AlignCenter</set>
+            </property>
+           </widget>
+          </item>
+         </layout>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_depgraph">
+       <attribute name="title">
+        <string>Dep Graph</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_3">
+        <item row="0" column="0">
+         <widget class="QRadioButton" name="d_rb_select">
+          <property name="text">
+           <string>Select Package</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="1" colspan="2">
+         <widget class="QComboBox" name="d_cb_category">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a package category from the list&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <item>
+           <property name="text">
+            <string>Select Category</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="0" column="3">
+         <widget class="QComboBox" name="d_cb_package">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a package from the list&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <item>
+           <property name="text">
+            <string>Select Package</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="0" column="4">
+         <widget class="QComboBox" name="d_cb_version">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Select a package version from the list&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <item>
+           <property name="text">
+            <string>Select Version</string>
+           </property>
+          </item>
+         </widget>
+        </item>
+        <item row="0" column="5">
+         <widget class="QLabel" name="d_label_depth">
+          <property name="maximumSize">
+           <size>
+            <width>60</width>
+            <height>16777215</height>
+           </size>
+          </property>
+          <property name="font">
+           <font>
+            <weight>75</weight>
+            <bold>true</bold>
+           </font>
+          </property>
+          <property name="toolTip">
+           <string>Max depgrah depth (0=no max)</string>
+          </property>
+          <property name="layoutDirection">
+           <enum>Qt::LeftToRight</enum>
+          </property>
+          <property name="text">
+           <string>Depth:</string>
+          </property>
+          <property name="alignment">
+           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="6">
+         <widget class="QLineEdit" name="d_le_depth">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="maximumSize">
+           <size>
+            <width>80</width>
+            <height>16777215</height>
+           </size>
+          </property>
+          <property name="sizeIncrement">
+           <size>
+            <width>5</width>
+            <height>0</height>
+           </size>
+          </property>
+          <property name="baseSize">
+           <size>
+            <width>30</width>
+            <height>0</height>
+           </size>
+          </property>
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Set the depth to which the dependencies are calculated (0 = full depth)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="inputMask">
+           <string/>
+          </property>
+          <property name="text">
+           <string>1</string>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="7">
+         <spacer name="horizontalSpacer_2">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>50</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="0" column="8" colspan="2">
+         <widget class="QPushButton" name="d_pb_calculate">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Click to do stuff&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Calculate</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QRadioButton" name="d_rb_manual">
+          <property name="text">
+           <string>Enter Package</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1" colspan="4">
+         <widget class="QLineEdit" name="d_le_package">
+          <property name="enabled">
+           <bool>false</bool>
+          </property>
+          <property name="placeholderText">
+           <string>=category/package-version</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="5" colspan="4">
+         <widget class="QCheckBox" name="d_ckb_installed">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Experimental feature:&lt;/p&gt;&lt;p&gt;May result in spurious parent/child relationships in depgraph&lt;/p&gt;&lt;p&gt;The packages listed are still the correct dependencies.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Do Not Include Installed Packages</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0" colspan="10">
+         <widget class="QTreeView" name="d_tv_results">
+          <property name="sizePolicy">
+           <sizepolicy hsizetype="MinimumExpanding" vsizetype="Expanding">
+            <horstretch>0</horstretch>
+            <verstretch>0</verstretch>
+           </sizepolicy>
+          </property>
+          <property name="minimumSize">
+           <size>
+            <width>0</width>
+            <height>250</height>
+           </size>
+          </property>
+         </widget>
+        </item>
+        <item row="3" column="0" colspan="10">
+         <widget class="QProgressBar" name="d_pbar">
+          <property name="value">
+           <number>0</number>
+          </property>
+          <property name="textVisible">
+           <bool>true</bool>
+          </property>
+          <property name="format">
+           <string/>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="0">
+         <widget class="QPushButton" name="d_pb_expand">
+          <property name="text">
+           <string>Expand All</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="1">
+         <widget class="QPushButton" name="d_pb_collapse">
+          <property name="text">
+           <string>Collapse All</string>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="2" colspan="8">
+         <spacer name="horizontalSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>372</width>
+            <height>27</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+       </layout>
+      </widget>
+      <widget class="QWidget" name="tab_update">
+       <attribute name="title">
+        <string>Emerge</string>
+       </attribute>
+       <layout class="QGridLayout" name="gridLayout_5">
+        <item row="0" column="0">
+         <widget class="QRadioButton" name="e_rb_new_use">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adds the --newuse (-N) option to the emerge command&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>New Use</string>
+          </property>
+          <property name="checkable">
+           <bool>true</bool>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">use_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="0" column="1">
+         <widget class="QRadioButton" name="e_rb_update">
+          <property name="font">
+           <font>
+            <weight>50</weight>
+            <bold>false</bold>
+            <underline>false</underline>
+           </font>
+          </property>
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adds the --update (-u) option to the emerge command&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Update</string>
+          </property>
+          <property name="checkable">
+           <bool>true</bool>
+          </property>
+          <property name="checked">
+           <bool>false</bool>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">tree_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="0" column="2">
+         <widget class="QCheckBox" name="e_cb_deep">
+          <property name="text">
+           <string>Deep</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+         </widget>
+        </item>
+        <item row="0" column="3">
+         <widget class="QRadioButton" name="e_rb_world">
+          <property name="text">
+           <string>@World</string>
+          </property>
+          <property name="checked">
+           <bool>true</bool>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">atom_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="0" column="4">
+         <widget class="QRadioButton" name="e_rb_atom">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Enter a specific atom or set in the box below to use this option&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Atom Below</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">atom_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="0" column="5">
+         <spacer name="horizontalSpacer_5">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
+           <size>
+            <width>44</width>
+            <height>20</height>
+           </size>
+          </property>
+         </spacer>
+        </item>
+        <item row="0" column="6">
+         <widget class="QPushButton" name="e_pb_go">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Executes the command with the set parameters&lt;/p&gt;&lt;p&gt;All command run with '--pretend' set. &lt;/p&gt;&lt;p&gt;'--pretend' is substituted for '--ask' on the displayed command, for quick copy and pasting.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Execute</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="0">
+         <widget class="QRadioButton" name="e_rb_ch_use">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adds the --changed-use (-U) option to the emerge command&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Changed Use</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">use_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="QRadioButton" name="e_rb_emptytree">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adds the --emptytree (-e) option to the emerge command&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>Empty Tree</string>
+          </property>
+          <property name="autoExclusive">
+           <bool>true</bool>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">tree_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="1" column="2">
+         <widget class="QCheckBox" name="e_cb_nodeps">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Adds the --nodeps option to the emerge command (speeds up checking for use changes on a single package)&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+          <property name="text">
+           <string>No Deps</string>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="3">
+         <widget class="QRadioButton" name="e_rb_system">
+          <property name="text">
+           <string>@System</string>
+          </property>
+          <attribute name="buttonGroup">
+           <string notr="true">atom_buttongroup</string>
+          </attribute>
+         </widget>
+        </item>
+        <item row="1" column="4" colspan="3">
+         <widget class="QLineEdit" name="e_le_atom">
+          <property name="placeholderText">
+           <string>Enter atom or set here</string>
+          </property>
+         </widget>
+        </item>
+        <item row="2" column="0" colspan="7">
+         <widget class="QListView" name="e_lv_results"/>
+        </item>
+        <item row="3" column="0" colspan="7">
+         <widget class="QProgressBar" name="e_pbar">
+          <property name="value">
+           <number>0</number>
+          </property>
+          <property name="textVisible">
+           <bool>true</bool>
+          </property>
+          <property name="format">
+           <string/>
+          </property>
+         </widget>
+        </item>
+        <item row="4" column="0" colspan="7">
+         <widget class="QLineEdit" name="u_le_cmd">
+          <property name="toolTip">
+           <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Command to run in a terminal to make proposed changes&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+          </property>
+         </widget>
+        </item>
+       </layout>
+      </widget>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <resources/>
+ <connections/>
+ <buttongroups>
+  <buttongroup name="use_buttongroup">
+   <property name="exclusive">
+    <bool>true</bool>
+   </property>
+  </buttongroup>
+  <buttongroup name="atom_buttongroup"/>
+  <buttongroup name="tree_buttongroup"/>
+ </buttongroups>
+</ui>