Changeset b6102c8


Ignore:
Timestamp:
05/02/14 11:52:15 (4 months ago)
Author:
Ken Moore <ken@…>
Branches:
master, releng/10.0.2
Children:
0381f41
Parents:
90b56d9d
Message:

Import the new AppCafe? for pbing from the projects tree into the main build tree.

Location:
src-qt4/pc-softwaremanager
Files:
14 added
12 deleted
10 edited

Legend:

Unmodified
Added
Removed
  • src-qt4/pc-softwaremanager/SoftwareManager.qrc

    rf85c713 rb6102c8  
    11<RCC> 
    22  <qresource> 
     3    <file>icons/info-tips.png</file> 
     4    <file>icons/stat-installed.png</file> 
     5    <file>icons/stat-recommended.png</file> 
     6    <file>icons/redflag.png</file> 
    37    <file>configure.png</file> 
    48    <file>icons/graphicalapp.png</file> 
    59    <file>icons/serverapp.png</file> 
    610    <file>icons/textapp.png</file> 
    7     <file>defaultrecommendations.txt</file> 
    811    <file>icons/config.png</file> 
    9     <file>icons/add-root.png</file> 
    10     <file>icons/remove-root.png</file> 
    1112    <file>icons/export.png</file> 
    1213    <file>icons/import.png</file> 
    1314    <file>icons/arrow-down.png</file> 
    1415    <file>icons/arrow-up.png</file> 
    15     <file>icons/app_upgrade-root.png</file> 
    16     <file>icons/app_downgrade-root.png</file> 
    17     <file>icons/app_download-root.png</file> 
    1816    <file>icons/appcafe.png</file> 
    1917    <file>icons/application.png</file> 
     
    4038    <file>icons/app_upgrade.png</file> 
    4139    <file>icons/app_upgrade_small.png</file> 
    42     <file>icons/app_upgrade_small-root.png</file> 
    4340    <file>icons/xdg_desktop.png</file> 
     41    <file>icons/unlock.png</file> 
     42    <file>icons/lock.png</file> 
     43    <file>icons/favorite.png</file> 
     44    <file>icons/default-graphical.png</file> 
     45    <file>icons/default-pkg.png</file> 
     46    <file>icons/default-server.png</file> 
     47    <file>icons/default-text.png</file> 
    4448    <file>icons/xdg_menu.png</file> 
    4549    <file>icons/xdg_mime.png</file> 
  • src-qt4/pc-softwaremanager/extras.h

    re543bca rb6102c8  
    3838 
    3939public: 
    40   static bool checkUser(bool wardenMode){ 
     40  static bool checkUser(){ 
    4141    QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); 
    4242    QString logname; 
     
    4444    else if(env.contains("USERNAME")){ logname = env.value("USERNAME"); } 
    4545    else if(env.contains("USER")){ logname = env.value("USER"); } 
    46     bool ok = FALSE; 
    47     if( logname.isEmpty() ){} 
    48     else if( wardenMode && (logname=="root") ){ ok = TRUE;} 
    49     else if( !wardenMode && (logname!="root") ){ ok = TRUE; } 
     46    bool ok = (logname.toLower()=="root"); 
    5047    return ok; 
    5148  } 
     
    7875 static QString getSystemArch(){ 
    7976    return getLineFromCommandOutput("uname -m").simplified(); 
     77 } 
     78  
     79 static QString getRegularUser(){ 
     80    QString user = QString( getenv("SUDO_USER") ); 
     81    if(user.isEmpty()){ user = QString( getenv("LOGNAME") ); } 
     82    if(user.toLower()=="root"){ user.clear(); } 
     83    return user; 
    8084 } 
    8185  
  • src-qt4/pc-softwaremanager/largeItemWidget.h

    refbe467 rb6102c8  
    3737#include <QPixmap> 
    3838 
     39#include "pbiDBAccess.h" 
     40 
    3941class LargeItemWidget : public QWidget{ 
    4042        Q_OBJECT 
     
    4244  private: 
    4345    QString uniqueAppID; //should be something unique like <name>-<version>-<arch>       
    44     QLabel *type; 
     46    QLabel *type, *recommend, *installed; 
    4547  signals: 
    4648    void appClicked(QString); 
     
    5052     
    5153  public: 
    52     LargeItemWidget(QString appID, QString name, QString description, QString icon) : QWidget(){ 
    53  
     54    LargeItemWidget(QWidget* parent, NGApp app, QString fixedicon="") : QWidget(parent){ 
     55      if(fixedicon.isEmpty()){ fixedicon = app.icon; } 
    5456      //Create the toolbutton 
    5557      QToolButton *button = new QToolButton(); 
    5658        button->setIconSize(QSize(34,34)); 
    57           QAction *act = new QAction( QIcon(icon), "", 0); 
     59          QAction *act = new QAction( QIcon(fixedicon), "", 0); 
    5860        button->setDefaultAction(act); 
    5961        button->setToolButtonStyle(Qt::ToolButtonIconOnly); 
    6062 
    6163      //Create the labels 
    62       QLabel *appName = new QLabel("<b>"+name+"</b>"); 
     64      QString txt = "<b>"+app.name+"</b>"; 
     65      if(!app.rating.isEmpty() ){ txt.append( "\t ("+app.rating+"/5)"); } 
     66      QLabel *appName = new QLabel(txt); 
    6367            appName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
    64       QLabel *appDesc = new QLabel(description); 
     68      QLabel *appDesc = new QLabel(app.shortdescription); 
    6569        appDesc->setWordWrap(TRUE); 
    66       type = new QLabel(); 
    67             //type->setScaledContents(true); 
    68             type->setVisible(false); 
     70      type = new QLabel(this); 
     71            if(app.type.toLower()=="graphical"){ 
     72                type->setPixmap(QPixmap(":icons/graphicalapp.png").scaled(16,16)); 
     73                type->setToolTip(tr("Graphical Application")); 
     74                type->setVisible(true); 
     75            }else if(app.type.toLower()=="text"){ 
     76                type->setPixmap(QPixmap(":icons/textapp.png").scaled(16,16)); 
     77                type->setToolTip(tr("Command-line Application")); 
     78                type->setVisible(true);        
     79            }else if(app.type.toLower()=="server"){ 
     80                type->setPixmap(QPixmap(":icons/serverapp.png").scaled(16,16)); 
     81                type->setToolTip(tr("Server Application")); 
     82                type->setVisible(true);        
     83            }else{ 
     84                type->setVisible(false);               
     85            } 
     86      recommend = new QLabel(this); 
     87            recommend->setPixmap(QPixmap(":icons/stat-recommended.png").scaled(16,16)); 
     88            recommend->setToolTip( tr("PC-BSD Recommendation") ); 
     89            recommend->setVisible(app.isRecommended); 
     90      installed = new QLabel(this); 
     91            installed->setPixmap(QPixmap(":icons/stat-installed.png").scaled(16,16)); 
     92            installed->setToolTip( tr("Currently Installed") ); 
     93            installed->setVisible(app.isInstalled); 
    6994      QHBoxLayout *hl = new QHBoxLayout; 
    7095            hl->addWidget(appName); 
     96            hl->addWidget(recommend); 
    7197            hl->addWidget(type); 
     98            hl->addWidget(installed); 
    7299      //Add the items to the widget 
    73100      QGridLayout *layout = new QGridLayout; 
     
    78105       
    79106      //Save the app identifier 
    80       uniqueAppID=appID; 
     107      uniqueAppID=app.origin; 
     108      connect(button,SIGNAL(clicked()), this, SLOT(sendSignal()) ); 
     109      this->setStyleSheet("QToolTip{background: rgb(230,230,230); border: 1px solid grey; border-radius: 3px; padding: 1px; color: black;}"); 
     110    } 
     111     
     112    LargeItemWidget(QWidget *parent, NGCat cat, QString fixedicon="") : QWidget(parent){ 
     113      if(fixedicon.isEmpty()){ fixedicon = cat.icon; } 
     114      //Create the toolbutton 
     115      QToolButton *button = new QToolButton(); 
     116        button->setIconSize(QSize(34,34)); 
     117          QAction *act = new QAction( QIcon(fixedicon), "", 0); 
     118        button->setDefaultAction(act); 
     119        button->setToolButtonStyle(Qt::ToolButtonIconOnly); 
     120 
     121      //Create the labels 
     122      QLabel *appName = new QLabel("<b>"+cat.name+"</b>"); 
     123            appName->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); 
     124      QLabel *appDesc = new QLabel(cat.description); 
     125        appDesc->setWordWrap(TRUE); 
     126      type = new QLabel(this); 
     127          type->setVisible(false);             
     128      recommend = new QLabel(this); 
     129          recommend->setVisible(false); 
     130      installed = new QLabel(this); 
     131          installed->setVisible(false); 
     132      QHBoxLayout *hl = new QHBoxLayout; 
     133            hl->addWidget(appName); 
     134            hl->addWidget(recommend); 
     135            hl->addWidget(type); 
     136            hl->addWidget(installed); 
     137      //Add the items to the widget 
     138      QGridLayout *layout = new QGridLayout; 
     139      layout->addWidget(button,0,0,2,1); 
     140      layout->addLayout(hl,0,1); 
     141      layout->addWidget(appDesc,1,1); 
     142      this->setLayout(layout); 
     143       
     144      //Save the app identifier 
     145      uniqueAppID=cat.portcat; 
    81146      connect(button,SIGNAL(clicked()), this, SLOT(sendSignal()) ); 
    82147    } 
     148     
    83149    virtual ~LargeItemWidget(){} 
    84150     
    85     void setType(QString typ){ 
    86       if(typ.toLower()=="graphical"){ 
    87         type->setPixmap(QPixmap(":icons/graphicalapp.png").scaled(16,16)); 
    88         type->setToolTip(tr("Graphical Application")); 
    89         type->setVisible(true); 
    90       }else if(typ.toLower()=="text"){ 
    91         type->setPixmap(QPixmap(":icons/textapp.png").scaled(16,16)); 
    92         type->setToolTip(tr("Command-line Application")); 
    93         type->setVisible(true);        
    94       }else if(typ.toLower()=="server"){ 
    95         type->setPixmap(QPixmap(":icons/serverapp.png").scaled(16,16)); 
    96         type->setToolTip(tr("Server Application")); 
    97         type->setVisible(true);        
    98       }else{ 
    99         type->setVisible(false);               
    100       } 
    101     } 
    102151     
    103152  protected: 
  • src-qt4/pc-softwaremanager/main.cpp

    r78fa8b2 rb6102c8  
    1212int main( int argc, char ** argv ) 
    1313{ 
     14    //Check for root permissions 
     15    if( getuid() != 0){ 
     16      qDebug() << "pc-softwaremanager must be started as root!"; 
     17      return 1; 
     18    } 
     19     
    1420    QtSingleApplication a(argc, argv);    
    1521    if ( a.isRunning() ) 
     
    2733    MainUI w;  
    2834 
    29     if ( argc >= 2) 
     35    /*if ( argc >= 2) 
    3036    { 
    3137       QString chkarg = argv[1]; 
     
    4349         //w.showInstalledTab(); 
    4450       //} 
    45     } 
     51    }*/ 
    4652 
    4753    w.ProgramInit(); 
  • src-qt4/pc-softwaremanager/mainUI.cpp

    rde397c3d rb6102c8  
    3333  statusLabel = new QLabel(); 
    3434  ui->statusbar->addWidget(statusLabel); 
    35 } 
    36  
    37 void MainUI::setWardenMode(QString dir, QString ip){ 
    38   wardenDir = dir; wardenIP = ip; 
     35  netman = new QNetworkAccessManager(this); 
     36    connect(netman, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotScreenshotAvailable(QNetworkReply*)) ); 
     37    netreply = 0; 
     38         
     39  ui->text_dev_output->setVisible(false); 
     40         
     41  //additional connections to the UI 
     42  connect(ui->actionGraphical_Apps, SIGNAL(triggered(bool)), this, SLOT( browserViewSettingsChanged() ) ); 
     43  connect(ui->actionText_Apps, SIGNAL(triggered(bool)), this, SLOT( browserViewSettingsChanged() ) ); 
     44  connect(ui->actionServer_Apps, SIGNAL(triggered(bool)), this, SLOT( browserViewSettingsChanged() ) ); 
     45  connect(ui->actionRaw_Packages, SIGNAL(triggered(bool)), this, SLOT( browserViewSettingsChanged() ) ); 
    3946} 
    4047 
     
    4249{  
    4350   qDebug("Application starting..."); 
    44    //Initial Checks 
    45      bool wardenMode = !wardenDir.isEmpty(); 
    46      bool ok = Extras::checkUser(wardenMode); 
    47      if(!ok && wardenMode){  //Not root 
    48        QMessageBox::information( this, tr("Error!"), tr("The AppCafe must be run as root when in Warden compatibility mode") ); 
    49        close();       
    50      }else if( !ok && !wardenMode){ 
    51        QMessageBox::information( this, tr("Error!"), tr("The AppCafe must be started with user permissions!")+"\n"+tr("The user must also be a part of the \"operator\" group") ); 
    52        close(); 
    53      } 
    54     
    55    //Initialize the backend worker class 
    56    //qDebug() << "Initialize Backend"; 
     51   //Now startup the backend 
     52   qDebug() << "Startup Backend"; 
    5753   PBI = new PBIBackend(); 
    58      if(wardenMode){ PBI->setWardenMode(wardenDir, wardenIP); } 
    59       
    6054   //Initialize the Installed tab 
    61    //qDebug() << "Initialize Installed Tab"; 
     55   qDebug() << "Initialize Installed Tab"; 
    6256   initializeInstalledTab(); 
    6357   //Initialize the PBI Browser 
    64    //qDebug() << "Initialize Browser Tab"; 
     58   qDebug() << "Initialize Browser Tab"; 
    6559   initializeBrowserTab(); 
    6660    
    67    //Now startup the backend 
    68    //qDebug() << "Startup Backend"; 
     61 
    6962     connect(PBI,SIGNAL(LocalPBIChanges()),this,SLOT(slotRefreshInstallTab()) ); 
    7063     connect(PBI,SIGNAL(PBIStatusChange(QString)),this,SLOT(slotPBIStatusUpdate(QString)) ); 
     
    7467     connect(PBI,SIGNAL(SimilarFound(QStringList)),this,SLOT(slotShowSimilarApps(QStringList)) ); 
    7568     connect(PBI,SIGNAL(Error(QString,QString,QStringList)),this,SLOT(slotDisplayError(QString,QString,QStringList)) ); 
    76      PBI->start(); 
    77  
     69     connect(PBI,SIGNAL(devMessage(QString)), ui->text_dev_output, SLOT(append(QString)) ); 
    7870   //Make sure we start on the installed tab 
    79    ui->tabWidget->setCurrentWidget(ui->tab_installed); 
    80    ui->stackedWidget->setCurrentWidget(ui->page_install_list); 
     71   ui->tabWidget->setCurrentWidget(ui->tab_browse); 
     72 
     73   //In the initialization phase, this should already have the installed/repo info available 
     74   slotRefreshInstallTab(); 
     75   slotEnableBrowser(); 
    8176} 
    8277 
     
    123118 
    124119void MainUI::on_actionAppCafe_Settings_triggered(){ 
    125   PBI->openConfigurationDialog(); 
    126 } 
    127  
    128 void MainUI::on_actionInstall_From_File_triggered(){ 
    129   QStringList files = QFileDialog::getOpenFileNames(this, tr("Install PBI"), QDir::homePath(), tr("PBI Application (*.pbi)") ); 
    130   if(files.isEmpty()){ return; } //cancelled 
    131   //Verify that they want to install these applications 
    132   QStringList names; 
    133   for(int i=0; i<files.length(); i++){ names << files[i].section("/",-1); } 
    134   names.sort(); 
    135   if( QMessageBox::Yes == QMessageBox::question(this, tr("Verify Installation"), tr("Are you ready to begin installing these PBI's?")+"\n"+tr("NOTE: You will need to manually add desktop/menu icons through the AppCafe afterwards.")+"\n\n"+names.join("\n"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ){ 
    136     //This might take a while, so don't allow the user to run this action again until it is done (thread safe though) 
    137     ui->actionInstall_From_File->setEnabled(false); 
    138     PBI->installPBIFromFile(files); 
    139     ui->actionInstall_From_File->setEnabled(true); 
    140   } 
     120  //PBI->openConfigurationDialog(); 
     121} 
     122 
     123void MainUI::on_actionDeveloper_Mode_triggered(){ 
     124  ui->text_dev_output->setVisible(ui->actionDeveloper_Mode->isChecked()); 
    141125} 
    142126 
     
    145129// ========================= 
    146130void MainUI::initializeInstalledTab(){ 
    147          
    148131  //Setup the action menu for installed applications 
    149132  actionMenu = new QMenu(); 
    150     actionMenu->addAction( QIcon(":icons/view-refresh.png"), tr("Update"), this, SLOT(slotActionUpdate()) ); 
    151     actionMenu->addSeparator(); 
    152133    QMenu *dmenu = actionMenu->addMenu( QIcon(":icons/xdg_desktop.png"), tr("Desktop Icons")); 
    153134      dmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddDesktop()) ); 
    154135      dmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveDesktop()) ); 
    155     QMenu *mmenu = actionMenu->addMenu( QIcon(":icons/xdg_menu.png"), tr("Menu Icons")); 
    156       mmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMenu()) ); 
    157       mmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMenu()) );   
    158       mmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMenuAll()) ); 
    159     QMenu *pmenu = actionMenu->addMenu( QIcon(":icons/xdg_paths.png"), tr("Path Links")); 
    160       pmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddPath()) ); 
    161       pmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemovePath()) );   
    162       pmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddPathAll()) ); 
    163     QMenu *fmenu = actionMenu->addMenu( QIcon(":icons/xdg_mime.png"), tr("File Associations")); 
    164       fmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMime()) ); 
    165       fmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMime()) );   
    166       fmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMimeAll()) ); 
    167136    actionMenu->addSeparator(); 
    168137    actionMenu->addAction( QIcon(":icons/remove.png"), tr("Uninstall"), this, SLOT(slotActionRemove()) ); 
     
    170139    actionMenu->addAction( QIcon(":icons/dialog-cancel.png"), tr("Cancel Actions"), this, SLOT(slotActionCancel()) ); 
    171140  //Setup the shortcuts menu for installed applications 
    172   shortcutMenu = new QMenu(this); 
    173     sDeskMenu = shortcutMenu->addMenu( QIcon(":icons/xdg_desktop.png"), tr("Desktop Icons")); 
    174       sDeskMenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddDesktop()) ); 
    175       sDeskMenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveDesktop()) ); 
    176     sMenuMenu = shortcutMenu->addMenu( QIcon(":icons/xdg_menu.png"), tr("Menu Icons")); 
    177       sMenuMenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMenu()) ); 
    178       sMenuMenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMenu()) );   
    179       sMenuMenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMenuAll()) ); 
    180     QMenu *spmenu = shortcutMenu->addMenu( QIcon(":icons/xdg_paths.png"), tr("Path Links")); 
    181       spmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddPath()) ); 
    182       spmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemovePath()) );   
    183       spmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddPathAll()) ); 
    184     sMimeMenu = shortcutMenu->addMenu( QIcon(":icons/xdg_mime.png"), tr("File Associations")); 
    185       sMimeMenu ->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMime()) ); 
    186       sMimeMenu ->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMime()) );   
    187       sMimeMenu ->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMimeAll()) ); 
    188   ui->tool_install_shortcuts->setMenu(shortcutMenu); 
     141    sDeskMenu = new QMenu(this); 
     142      sDeskMenu->addAction( QIcon(":icons/add.png"),tr("Add Desktop Shortcuts"),this,SLOT(slotActionAddDesktop()) ); 
     143      sDeskMenu->addAction( QIcon(":icons/remove.png"),tr("Remove Desktop Shortcuts"),this,SLOT(slotActionRemoveDesktop()) ); 
     144  ui->tool_install_shortcuts->setMenu(sDeskMenu); 
    189145  //Setup the binary menu for installed applications 
    190146  appBinMenu = new QMenu(); 
     
    208164  //simplification function for filling the tree widget item with the appropriate information about the PBI 
    209165  QString ID = item->whatsThis(0); 
     166  NGApp app = PBI->singleAppInfo(ID); 
     167  if(app.origin.isEmpty()){ return; } //invalid item 
    210168  if(item->text(0).isEmpty()){  //new entry - get everything 
    211     QStringList vals; vals <<"name"<<"version"<<"status"; //same as column order 
    212     if(!vals.isEmpty()){ 
    213       vals = PBI->PBIInfo(ID, vals); 
    214       for(int i=0; i<vals.length(); i++){ item->setText(i,vals[i]); } 
    215       QString icon = PBI->PBIInfo(ID, QStringList("icon")).join(""); 
     169    //Fill the item columns [name, version, status] 
     170      item->setText(0,app.name); 
     171      item->setText(1,app.installedversion); 
     172      item->setText(2, PBI->currentAppStatus(ID)); 
     173      //for(int i=0; i<vals.length(); i++){ item->setText(i,vals[i]); } 
     174      QString icon = app.icon; 
    216175        //Load a default icon if none found 
    217       if(icon.isEmpty()){ icon = defaultIcon; } 
     176      if(icon.isEmpty() || !QFile::exists(icon) ){ icon = defaultIcon; } 
    218177      item->setIcon(0,QIcon(icon) ); 
    219178      item->setCheckState(0,Qt::Unchecked); 
    220     } 
    221179  }else{ // Just update the necesary info 
    222     QStringList vals; vals << "version" << "status"; 
    223     vals = PBI->PBIInfo(ID,vals); 
    224     if(!vals.isEmpty()){ item->setText(1,vals[0]); item->setText(2,vals[1]); } 
     180    item->setText(1, app.installedversion); 
     181    item->setText(2, PBI->currentAppStatus(ID) ); 
    225182  } 
    226183} 
     
    228185QStringList MainUI::getCheckedItems(){ 
    229186  //Return the pbiID's of all the active items 
    230   QStringList output; 
    231   //See if we are on the single-app details page or custom context menu- then get the current app only 
    232   if(ui->stackedWidget->currentWidget() == ui->page_install_details){ 
    233       output << cDetails;   
    234            
     187  QStringList output;   
    235188  //Check for whether this is the context menu on the main widget 
    236   }else if(!cDetails.isEmpty()){ 
     189  if(!cDetails.isEmpty()){ 
    237190     output << cDetails; 
    238191     cDetails.clear(); 
     
    255208   //Get the list we need (in order) 
    256209  QStringList installList = PBI->installedList(); 
    257   installList.sort(); //sort in ascending order 
    258    //Get the list we have now 
     210  installList.append( PBI->pendingInstallList() ); 
     211  installList.removeDuplicates(); 
     212  //Quick finish if no items installed/pending 
     213  if(installList.isEmpty()){ 
     214    ui->tree_install_apps->clear(); 
     215    return; 
     216  } 
     217  //Get the list we have now and handle items as needed 
    259218  QStringList cList; 
    260219  for(int i=0; i<ui->tree_install_apps->topLevelItemCount(); i++){ 
    261     cList << ui->tree_install_apps->topLevelItem(i)->whatsThis(0); 
    262   } 
    263   //Quick finish if no items installed 
    264   if(installList.isEmpty()){ 
    265     ui->tree_install_apps->clear(); 
    266   }else{ 
    267     //Now make adjustments as necessary 
    268     for(int i=0; i<installList.length(); i++){ 
    269       //Detemine what action should be done with this item location 
    270       int todo = 0; //0=insert new item, 1=update current item, 2=remove current item 
    271       if(i < cList.length()){ 
    272         if(installList[i] == cList[i]){ todo=1; } 
    273         else if( installList.contains(cList[i]) && !cList.contains(installList[i]) ){ todo=0; } //new item to be inserted here 
    274         else if( !installList.contains(cList[i]) ){ todo=2; } //current item in this location should be removed 
    275       } 
    276       //Now perform the action on this location 
    277       if(todo==0){  
    278         //insert new item 
    279         QTreeWidgetItem *item = new QTreeWidgetItem; //create the item 
     220    QString item = ui->tree_install_apps->topLevelItem(i)->whatsThis(0); 
     221    //Update item if necessary 
     222    if(installList.contains(item)){  
     223        formatInstalledItemDisplay( ui->tree_install_apps->topLevelItem(i) );  
     224        installList.removeAll(item); //Remove it from the list - since already handled 
     225    //Remove item if necessary 
     226    }else{ 
     227      delete ui->tree_install_apps->takeTopLevelItem(i); 
     228      i--; //make sure to back up once to prevent missing the next item 
     229    } 
     230  } 
     231  //Now add any new items to the list 
     232  for(int i=0; i<installList.length(); i++){ 
     233    QTreeWidgetItem *item = new QTreeWidgetItem; //create the item 
     234        //qDebug() << "New Item:" << installList[i]; 
    280235        item->setWhatsThis(0,installList[i]); 
    281236        //Now format the display 
     
    287242          //Now insert this item onto the list 
    288243          ui->tree_install_apps->insertTopLevelItem(i,item); 
    289           cList.insert(i,installList[i]); //reflect this inclusion into the current list 
    290244        } 
    291          
    292       }else if(todo==1){ 
    293         //Update current item 
    294         formatInstalledItemDisplay( ui->tree_install_apps->topLevelItem(i) ); 
    295          
    296       }else{ 
    297         //Remove current item 
    298         ui->tree_install_apps->takeTopLevelItem(i); 
    299         cList.removeAt(i); //reflect the change to the current list 
    300         i--; //Re-check the item that should be in this location 
    301       } 
    302     } 
    303     //Now makesure that there are no extra items at the end 
    304     int il = installList.length(); 
    305     while(il < cList.length()){ 
    306       ui->tree_install_apps->takeTopLevelItem(il); 
    307       cList.removeAt(il); //reflect the change to the current list  
    308     } 
    309   } //end of empty list check 
    310  
     245  } 
    311246  //Make sure that there is an item selected 
    312247  if(ui->tree_install_apps->topLevelItemCount() > 0 ){ 
     
    319254    }  
    320255  } 
    321   //If the installed app page is visible, be sure to update it too 
    322   if( ui->stackedWidget->currentWidget() == ui->page_install_details){ 
    323     updateInstallDetails(cDetails); 
    324   } 
    325   slotUpdateSelectedPBI();; //Update the info boxes 
     256  //slotUpdateSelectedPBI();; //Update the info boxes 
    326257  slotDisplayStats(); 
    327258  slotCheckSelectedItems(); 
     
    340271  } 
    341272  ui->tool_install_performaction->setEnabled(chkd); 
    342   if(ui->stackedWidget->currentWidget() != ui->page_install_details){ 
    343     cDetails.clear(); //Make sure this is cleared if not on the details page 
    344   } 
     273  cDetails.clear(); //Make sure this is cleared since context menu not open 
    345274} 
    346275 
     
    351280    QString itemID = ui->tree_install_apps->topLevelItem(i)->whatsThis(0); 
    352281    if(itemID == pbiID){ 
    353       QString stat = PBI->PBIInfo(pbiID,QStringList()<<"status").join(""); 
     282      QString stat = PBI->currentAppStatus(pbiID); 
    354283      ui->tree_install_apps->topLevelItem(i)->setText(2,stat); 
    355       // See if we need to update the download progress bar 
    356       QString appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    357       if ( appID == pbiID ) { 
    358         slotUpdateSelectedPBI(); 
    359         //If the details page is currently visible, update it too 
    360         if(ui->stackedWidget->currentWidget() == ui->page_install_details){ 
    361           updateInstallDetails(appID); 
    362         } 
    363       } 
    364     }else{ 
    365       //Just check/update the icon if necessary  
    366       if(ui->tree_install_apps->topLevelItem(i)->icon(0).isNull()){ 
    367          ui->tree_install_apps->topLevelItem(i)->setIcon(0, QIcon( PBI->PBIInfo(itemID, QStringList() << "icon").join("") )); 
    368       } 
    369     } 
    370   } 
    371   
     284    } 
     285  } 
    372286  //If the browser app page is current for this app 
    373   QString metaID = PBI->pbiToAppID(pbiID); 
    374   if( (ui->stacked_browser->currentWidget() == ui->page_app) && (cApp == metaID) && ui->page_app->isVisible() ){ 
     287  if( (ui->stacked_browser->currentWidget() == ui->page_app) && (cApp == pbiID) && ui->page_app->isVisible() ){ 
    375288    slotUpdateAppDownloadButton(); 
    376289  } 
     
    384297  } 
    385298  if(appID.isEmpty()){return;} 
    386   //Update the info on the details page 
    387   updateInstallDetails(appID); 
    388   //Now show the page 
    389   ui->stackedWidget->setCurrentWidget(ui->page_install_details); 
    390 } 
    391  
    392 void MainUI::on_tool_install_back_clicked(){ 
    393   //List page should always be current based upon backend 
    394   ui->stackedWidget->setCurrentWidget(ui->page_install_list); 
    395 } 
    396  
    397 void MainUI::on_tool_install_gotobrowserpage_clicked(){ 
    398   //When you want to open up the browser page for an application 
    399   QString appID = Extras::nameToID( ui->tree_install_apps->currentItem()->text(0) ); 
    400299  slotGoToApp(appID); 
    401300} 
     
    413312void MainUI::on_tree_install_apps_itemSelectionChanged(){ 
    414313  //When an installed PBI is clicked on 
    415   slotUpdateSelectedPBI(); 
    416   if(ui->stackedWidget->currentWidget() != ui->page_install_list){ 
    417     ui->stackedWidget->setCurrentWidget(ui->page_install_list); 
    418   } 
    419314  slotCheckSelectedItems(); 
    420315} 
     
    423318 //Make sure it is a valid/installed application 
    424319 QString appID = item->whatsThis(0); 
    425   appID = PBI->isInstalled(appID); 
    426   if(appID.isEmpty()){ return; } //invalid item 
     320   if( !PBI->isInstalled(appID) ){ return; } 
     321  qDebug() << "Item Double Clicked:" << appID; 
    427322  //Update the info on the details page 
    428   updateInstallDetails(appID); 
    429   //Now show the page 
    430   ui->stackedWidget->setCurrentWidget(ui->page_install_details); 
    431 } 
    432  
    433 void MainUI::on_check_install_autoupdate_clicked(){ 
    434   //Get the current item 
    435   QString appID; 
    436   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    437     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    438   } 
    439   if(appID.isEmpty()){return;} 
    440   //Now determine the current state of the checkbox 
    441   bool enabled = ui->check_install_autoupdate->isChecked(); 
    442   //Now have the backend make the change 
    443   PBI->enableAutoUpdate(appID, enabled); 
    444   //Now ask if the user also wants to start updating it now 
    445   if(enabled && !PBI->upgradeAvailable(appID).isEmpty()){ 
    446     if( QMessageBox::Yes == QMessageBox::question(this, tr("Start Update?"), tr("Do you wish to start updating this application right now?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) ){ 
    447       PBI->upgradePBI(QStringList() << appID); 
    448     } 
    449   } 
    450   //Now force the info on the page to be updated in a moment (need time for database to update) 
    451   //QTimer::singleShot(500, this, SLOT(on_tool_install_details_clicked()) ); 
    452 } 
    453  
    454 void MainUI::on_tool_install_update_clicked(){ 
    455   //Get the current item 
    456   QString appID; 
    457   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    458     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    459   } 
    460   if(appID.isEmpty()){return;} 
    461   PBI->upgradePBI(QStringList() << appID); 
    462 } 
    463  
    464 void MainUI::on_tool_install_remove_clicked(){ 
    465   //Get the current item 
    466   QString appID; 
    467   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    468     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    469   } 
    470   if(appID.isEmpty()){return;} 
    471   //Verify removal 
    472   if( QMessageBox::Yes == QMessageBox::question(this,tr("Verify PBI Removal"), tr("Are you sure you wish to remove this application?")+"\n\n"+appID,QMessageBox::Yes | QMessageBox::Cancel,QMessageBox::Cancel) ){ 
    473     PBI->removePBI(QStringList() << appID); 
    474   } 
    475 } 
    476  
    477 void MainUI::on_tool_install_cancel_clicked(){ 
    478   //Get the current item 
    479   QString appID; 
    480   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    481     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    482   } 
    483   if(appID.isEmpty()){return;} 
    484   PBI->cancelActions(QStringList() << appID); 
    485    
     323  slotGoToApp(appID); 
    486324} 
    487325 
    488326void MainUI::on_tool_install_maintainer_clicked(){ 
    489327  //Get the current item 
    490   QString appID; 
    491   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    492     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    493   } 
    494   if(appID.isEmpty()){return;} 
     328  QString appID = cApp; 
    495329  //Get the maintainer email 
    496   QString email = PBI->PBIInfo(appID, QStringList() << "maintainer").join(""); 
     330  NGApp app = PBI->singleAppInfo(appID); 
     331  QString email = app.maintainer; 
    497332  if(email.isEmpty()){ return; } 
    498333  //Verify that the user wants to launch their email client 
     
    503338  //Get the command from the action 
    504339  QString cmd = "mailto:"+email; 
    505   QStringList info = PBI->PBIInfo(appID, QStringList() << "name" << "date" << "version" << "arch" << "fbsdversion" ); 
     340  //QStringList info = PBI->PBIInfo(appID, QStringList() << "name" << "date" << "version" << "arch" << "fbsdversion" ); 
    506341  //Add a sample subject 
    507   cmd.append("?subject="+info[0]+" port question"); 
     342  cmd.append("?subject="+app.origin+" port question"); 
    508343  //Add the info to the body of the email 
    509344  cmd.append("&body="); 
    510   cmd.append("-----------\nPBI Information:\nName: "+info[0] + "\nDate Created: "+info[1] +"\nVersion: "+info[2] +"\nArchitecture: "+info[3] +"\nFreeBSD Version: "+info[4] ); 
     345  cmd.append("-----------\nPBI Information:\nName: "+app.name + "\nDate Installed: "+app.installedwhen +"\nVersion: "+app.installedversion ); 
    511346  //Startup the command externally 
    512   QProcess::execute("xdg-open \""+cmd+"\""); 
     347  PBI->runCmdAsUser("xdg-open \""+cmd+"\""); 
    513348} 
    514349 
     
    520355  qDebug() << "Get context menu for:" << pbiID; 
    521356  //Now Update the context menu appropriately 
    522   QStringList info = PBI->PBIInfo(pbiID, QStringList() << "hasdesktopicons" << "hasmenuicons" << "hasmimetypes"); 
    523   if(info.isEmpty()){ return; } //invalid application 
     357  NGApp info = PBI->singleAppInfo(pbiID); 
     358  //QStringList info = PBI->PBIInfo(pbiID, QStringList() << "hasdesktopicons" << "hasmenuicons" << "hasmimetypes"); 
     359  if( info.origin.isEmpty() ){ return; } //invalid application 
    524360  bool pending = PBI->isWorking(pbiID); 
    525361  contextActionMenu->clear(); 
    526   if(!PBI->upgradeAvailable(pbiID).isEmpty() &&  !pending){ 
     362  if( (info.version != info.installedversion) &&  !pending){ 
    527363    //Upgrade is only available if actions not pending 
    528364    contextActionMenu->addAction( QIcon(":icons/view-refresh.png"), tr("Update"), this, SLOT(slotActionUpdate()) ); 
    529365    contextActionMenu->addSeparator(); 
    530366  } 
    531   if(info[0]=="true"){ 
     367  if(info.hasDE){ 
    532368    QMenu *dmenu = contextActionMenu->addMenu( QIcon(":icons/xdg_desktop.png"), tr("Desktop Icons")); 
    533369      dmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddDesktop()) ); 
    534370      dmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveDesktop()) ); 
    535   } 
    536   if(info[1]=="true"){ 
    537     QMenu *mmenu = contextActionMenu->addMenu( QIcon(":icons/xdg_menu.png"), tr("Menu Icons")); 
    538       mmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMenu()) ); 
    539       mmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMenu()) );   
    540       mmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMenuAll()) ); 
    541   } 
    542   //Paths are always available if actually installed 
    543   if( !PBI->isInstalled(pbiID).isEmpty() ){ 
    544     QMenu *pmenu = contextActionMenu->addMenu( QIcon(":icons/xdg_paths.png"), tr("Path Links")); 
    545       pmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddPath()) ); 
    546       pmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemovePath()) );   
    547       pmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddPathAll()) ); 
    548   } 
    549   if(info[2]=="true"){ 
    550     QMenu *fmenu = contextActionMenu->addMenu( QIcon(":icons/xdg_mime.png"), tr("File Associations")); 
    551       fmenu->addAction( QIcon(":icons/add.png"),tr("Add"),this,SLOT(slotActionAddMime()) ); 
    552       fmenu->addAction( QIcon(":icons/remove.png"),tr("Remove"),this,SLOT(slotActionRemoveMime()) );   
    553       fmenu->addAction( QIcon(":icons/add-root.png"),tr("Add (All Users)"),this,SLOT(slotActionAddMimeAll()) ); 
    554371  } 
    555372  if(!pending){ 
     
    557374    contextActionMenu->addSeparator(); 
    558375    contextActionMenu->addAction( QIcon(":icons/remove.png"), tr("Uninstall"), this, SLOT(slotActionRemove()) ); 
    559   } 
    560   if(pending){ 
     376  }else{ 
    561377    //Cancel option is only available if actions are currently pending     
    562378    contextActionMenu->addSeparator(); 
     
    583399} 
    584400 
    585 void MainUI::slotActionAddPath(){ 
    586   QStringList items = getCheckedItems(); 
    587   PBI->addPaths(items,FALSE);  //Only for current user   
    588 } 
    589  
    590 void MainUI::slotActionRemovePath(){ 
    591   QStringList items = getCheckedItems(); 
    592   PBI->rmPaths(items,FALSE);  //Only for current user 
    593 } 
    594  
    595 void MainUI::slotActionAddPathAll(){ 
    596   QStringList items = getCheckedItems(); 
    597   PBI->addPaths(items,TRUE);  //For all users (root permissions required) 
    598 } 
    599  
    600 void MainUI::slotActionAddMenu(){ 
    601   QStringList items = getCheckedItems(); 
    602   PBI->addMenuIcons(items,FALSE);  //Only for current user 
    603 } 
    604  
    605 void MainUI::slotActionRemoveMenu(){ 
    606   QStringList items = getCheckedItems(); 
    607   PBI->rmMenuIcons(items,FALSE);  //Only for current user        
    608 } 
    609  
    610 void MainUI::slotActionAddMenuAll(){ 
    611   QStringList items = getCheckedItems(); 
    612   PBI->addMenuIcons(items,TRUE);  //For all users (root permissions required)    
    613 } 
    614  
    615 void MainUI::slotActionAddMime(){ 
    616   QStringList items = getCheckedItems(); 
    617   PBI->addMimeTypes(items,FALSE);  //Only for current user       
    618 } 
    619  
    620 void MainUI::slotActionRemoveMime(){ 
    621   QStringList items = getCheckedItems(); 
    622   PBI->rmMimeTypes(items,FALSE);  //Only for current user        
    623 } 
    624  
    625 void MainUI::slotActionAddMimeAll(){ 
    626     QStringList items = getCheckedItems(); 
    627   PBI->addMimeTypes(items,TRUE);  //For all users (root permissions required)    
    628 } 
    629  
    630 void MainUI::slotActionUpdate(){ 
    631   QStringList checkedID = getCheckedItems(); 
    632   if(!checkedID.isEmpty()){ 
    633     PBI->upgradePBI(checkedID);   
    634   } 
    635 } 
    636  
    637401void MainUI::slotActionRemove(){ 
    638402  QStringList checkedID = getCheckedItems(); 
    639403  if(!checkedID.isEmpty()){ 
    640404    //Verify that the user really wants to remove these apps 
    641     if( QMessageBox::Yes == QMessageBox::question(this,tr("Verify PBI Removal"), tr("Are you sure you wish to remove these applications?")+"\n\n"+checkedID.join("\n"),QMessageBox::Yes | QMessageBox::Cancel,QMessageBox::Cancel) ){ 
     405    checkedID = generateRemoveMessage(checkedID); 
     406    if( !checkedID.isEmpty() ){ 
    642407      PBI->removePBI(checkedID); 
    643408    } 
     
    658423  QString cmd = "xdg-open "+desktopfile; 
    659424  //Startup the command externally 
    660   QProcess::startDetached(cmd); 
    661 } 
    662  
    663 void MainUI::slotUpdateSelectedPBI(){ 
    664   //Get the currently selected app 
    665   QString appID; 
    666   if(ui->tree_install_apps->topLevelItemCount() > 0){ 
    667     appID = ui->tree_install_apps->currentItem()->whatsThis(0); 
    668   } 
    669   //See if this one is actually installed 
    670   appID = PBI->isInstalled(appID); 
    671   if(appID.isEmpty()){ 
    672     ui->tool_install_details->setEnabled(false); 
    673   }else{ 
    674     ui->tool_install_details->setEnabled(true);    
    675   } 
    676      
    677 } 
    678  
    679 void MainUI::updateInstallDetails(QString appID){ 
    680   //Get the information to update the details page 
    681   //Get the PBI info for that item 
    682     cDetails = appID; //save for later 
    683     QStringList vals;  
    684     vals << "name" << "icon" << "author" << "website" << "version" << "license" << "description" << "maintainer" << "date" << "arch"; 
    685     QStringList bools; 
    686     bools << "autoupdate" << "hasdesktopicons" << "hasmenuicons" << "requiresroot" << "hasmimetypes"; 
    687     vals = PBI->PBIInfo(appID,vals); 
    688     bools = PBI->PBIInfo(appID,bools); 
    689     //Make sure the info lists are not empty 
    690     if(vals.isEmpty() || bools.isEmpty()){ 
    691       ui->tool_install_details->setEnabled(false); 
    692       return;  
    693     } 
    694     //Load a default icon if none found 
    695     if(vals[1].isEmpty()){ vals[1] = defaultIcon; } 
    696     //Now set the info on the UI 
    697     bool desktopSC = (bools[1] == "true"); // XDG desktop entries available 
    698     bool menuSC= (bools[2] == "true");   // XDG menu entries available 
    699     bool autoupdate = (bools[0] == "true"); //auto-update enabled 
    700     bool rootonly = (bools[3] == "true"); //requires root 
    701     bool mimeSC = (bools[4] == "true"); //XDG mime entries available 
    702     //Create the shortcuts string 
    703     sDeskMenu->setEnabled(desktopSC); 
    704     sMenuMenu->setEnabled(menuSC); 
    705     sMimeMenu->setEnabled(mimeSC); 
    706     //Now display that info on the UI 
    707     ui->label_install_app->setText(vals[0]); 
    708     ui->label_install_icon->setPixmap( QPixmap(vals[1]).scaled(64,64, Qt::KeepAspectRatio, Qt::SmoothTransformation) ); 
    709     if(vals[3].isEmpty()){  
    710       ui->label_install_author->setText(vals[2]);  
    711       ui->label_install_author->setToolTip(""); 
    712     }else{  
    713       ui->label_install_author->setText("<a href="+vals[3]+">"+vals[2]+"</a>");  
    714       ui->label_install_author->setToolTip(vals[3]); //show website URL as tooltip 
    715     } 
    716     ui->label_install_version->setText(vals[4]); 
    717     ui->label_install_license->setText(vals[5]); 
    718     ui->text_install_description->setPlainText(vals[6]); 
    719     ui->tool_install_maintainer->setVisible( vals[7].contains("@") ); 
    720     ui->label_install_date->setText(vals[8]); 
    721     ui->label_install_arch->setText(vals[9]); 
    722     //ui->label_install_shortcuts->setText(shortcuts); 
    723     ui->check_install_autoupdate->setChecked(autoupdate); 
    724    
    725     //Adjust the quick action buttons as necessary 
    726     if( PBI->isWorking(appID) ){ 
    727       //Actions pending/working only show cancel button 
    728       ui->tool_install_cancel->setVisible(TRUE); 
    729       ui->tool_install_remove->setVisible(FALSE); 
    730       ui->tool_install_update->setVisible(FALSE); 
    731       ui->tool_install_startApp->setVisible(FALSE); 
    732     }else{ 
    733       //Nothing pending 
    734       ui->tool_install_cancel->setVisible(FALSE); 
    735       if( !PBI->isInstalled(appID).isEmpty() ){  
    736         //Remove Button 
    737         ui->tool_install_remove->setVisible(TRUE); 
    738         if(rootonly){ ui->tool_install_remove->setIcon(QIcon(":icons/remove-root.png")); } 
    739         else{ ui->tool_install_remove->setIcon(QIcon(":icons/remove.png")); } 
    740         //Update 
    741         if(PBI->upgradeAvailable(appID).isEmpty()){ ui->tool_install_update->setVisible(FALSE); } 
    742         else{ 
    743           ui->tool_install_update->setVisible(TRUE);  
    744           if(rootonly){ ui->tool_install_update->setIcon(QIcon(":icons/app_upgrade_small-root.png")); } 
    745           else{ ui->tool_install_update->setIcon(QIcon(":icons/app_upgrade_small.png")); } 
    746         } 
    747         //Start Application binaries 
    748         QStringList bins = PBI->pbiBinList(appID); 
    749         appBinMenu->clear(); 
    750         for(int i=0; i<bins.length(); i++){ 
    751           QAction *act = new QAction(this); 
    752             act->setText(bins[i].section("::::",0,0)); //set name 
    753             act->setWhatsThis(bins[i].section("::::",1,10)); //set command string 
    754           appBinMenu->addAction(act); 
    755         } 
    756         if(appBinMenu->isEmpty()){ ui->tool_install_startApp->setVisible(FALSE); } 
    757         else{ ui->tool_install_startApp->setVisible(TRUE); } 
    758       }else{  
    759         ui->tool_install_remove->setVisible(FALSE);  
    760         ui->tool_install_update->setVisible(FALSE);  
    761         ui->tool_install_startApp->setVisible(FALSE); 
    762       }    
    763     } 
    764  
    765   //Update the current status indicators 
    766   QString stat = PBI->currentAppStatus(appID,true); //get the raw status 
    767   QString statF = PBI->currentAppStatus(appID, false); //get the non-raw status 
    768   if( stat.isEmpty() && statF.isEmpty() ){ 
    769     //Not currently running - hide the display indicators 
    770     ui->group_install_appStat->setVisible(false); 
    771   }else{ 
    772     //Currently installing/removing/updating - show last message from process 
    773     if(!statF.isEmpty()){ ui->label_install_status->setText(statF); } 
    774     else{ ui->label_install_status->setText(stat); } 
    775     ui->group_install_appStat->setVisible(TRUE); 
    776   } 
     425  PBI->runCmdAsUser(cmd); 
    777426} 
    778427 
     
    798447  connect(ui->line_browse_searchbar,SIGNAL(returnPressed()),this,SLOT(slotGoToSearch()) ); 
    799448  connect(ui->tool_browse_gotocat, SIGNAL(clicked()), this, SLOT(slotGoToCatBrowser()) ); 
     449  //Setup the jail menu title widget 
     450  jailLabel = new QLabel(" <b>"+tr("Install in jail:")+"</b> ", this); 
     451        jailLabel->setAlignment(Qt::AlignCenter); 
     452  jailAction = new QWidgetAction(this); 
     453        jailAction->setDefaultWidget(jailLabel); 
     454  //Setup jail install menu 
     455  jailMenu = new QMenu(this); 
     456  connect(jailMenu, SIGNAL(triggered(QAction*)), this, SLOT(installAppIntoJail(QAction*)) ); 
     457  //Setup the back button menu 
     458  backMenu = new QMenu(this); 
     459  connect(backMenu, SIGNAL(triggered(QAction*)), this, SLOT(slotBackToApp(QAction*)) ); 
     460  ui->tool_br_back->setVisible(false); //no apps to go back to yet 
     461  ui->tool_br_back->setMenu(backMenu); 
    800462} 
    801463 
     
    819481void MainUI::slotUpdateBrowserHome(){ 
    820482  //Load the Recommendations 
    821   clearScrollArea(ui->scroll_br_home_rec); 
    822   QVBoxLayout *reclayout = new QVBoxLayout; 
    823   QStringList recList = PBI->getRecommendations(); 
    824   QStringList info; info << "name" << "shortdescription" << "icon" << "type"; 
    825   for(int i=0; i<recList.length(); i++){ 
    826     QStringList data = PBI->AppInfo(recList[i],info); 
    827     if(!data.isEmpty()){ 
    828       LargeItemWidget *item = new LargeItemWidget(recList[i],data[0],data[1],data[2]); 
    829       //Set the type icon 
    830       item->setType(data[3].toLower()); 
    831       connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    832       reclayout->addWidget(item); 
    833     } 
    834   } 
    835   reclayout->addStretch(); //add a spacer to the end 
    836   ui->scroll_br_home_rec->widget()->setLayout(reclayout); 
     483  ui->group_br_recommend->setVisible( fillVerticalAppArea(ui->scroll_br_home_rec, PBI->getRecommendedApps(), false) ); 
     484  //Load the application spotlight 
     485  ui->group_br_home_spotlight->setVisible( fillVerticalAppArea(ui->scroll_br_home_spot, PBI->getHighlightedApps(), false) ); 
    837486  //Load the newest applications 
    838487  clearScrollArea(ui->scroll_br_home_newapps); 
    839488  QHBoxLayout *newapplayout = new QHBoxLayout; 
    840   QStringList newapps = PBI->getRecentApps(); 
    841   for(int i=0; i<newapps.length(); i++){ 
    842     QStringList appdata = PBI->AppInfo(newapps[i],QStringList() << "name" << "icon" << "latestversion"); 
    843     if(!appdata.isEmpty()){ 
    844       SmallItemWidget *item = new SmallItemWidget(newapps[i],appdata[0],appdata[1],appdata[2]); 
     489  QStringList newapps = PBI->getNewApps(); 
     490  QList<NGApp> apps = PBI->AppInfo(newapps); 
     491  for(int i=0; i<apps.length(); i++){ 
     492    //QStringList appdata = PBI->AppInfo(newapps[i],QStringList() << "name" << "icon" << "latestversion"); 
     493    //if(!appdata.isEmpty()){ 
     494      SmallItemWidget *item = new SmallItemWidget(apps[i].origin, apps[i].name, checkIcon(apps[i].icon, apps[i].type), apps[i].version); 
    845495      connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    846496      newapplayout->addWidget(item); 
    847     } 
     497    //} 
    848498  } 
    849499  newapplayout->addStretch(); //add a spacer to the end 
     
    865515  //Now update the category browser page (since it only needs to be done once like the home menu) 
    866516  //Load the Categories 
    867   QStringList cats = PBI->browserCategories(); 
    868     cats.sort(); 
     517  QStringList catlist = PBI->browserCategories(); 
     518  catlist.sort(); 
     519  QList<NGCat> cats = PBI->CatInfo(catlist); //all categories 
    869520    clearScrollArea(ui->scroll_br_cats); 
    870521    QVBoxLayout *catlayout = new QVBoxLayout; 
    871     info.clear(); info << "name" << "description" << "icon"; 
    872522    for(int i=0; i<cats.length(); i++){ 
    873       QStringList data = PBI->CatInfo(cats[i],info); 
    874       if(!data.isEmpty()){ 
    875         LargeItemWidget *item = new LargeItemWidget(cats[i],data[0],data[1],data[2]); 
     523        LargeItemWidget *item = new LargeItemWidget(this,cats[i]); 
    876524        connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToCategory(QString)) ); 
    877525        catlayout->addWidget(item); 
    878       } 
    879526    } 
    880527    catlayout->addStretch(); //add a spacer to the end 
     
    883530 
    884531void MainUI::slotGoToHome(){ 
     532  ui->tool_br_back->setVisible(!backApps.isEmpty()); 
    885533  ui->tabWidget->setCurrentWidget(ui->tab_browse); 
    886534  ui->stacked_browser->setCurrentWidget(ui->page_home);  
     
    892540 
    893541void MainUI::slotGoToCatBrowser(){ 
     542  ui->tool_br_back->setVisible(!backApps.isEmpty()); 
    894543  ui->tabWidget->setCurrentWidget(ui->tab_browse); 
    895544  ui->stacked_browser->setCurrentWidget(ui->page_browsecats); 
     
    902551void MainUI::slotGoToCategory(QString cat){ 
    903552  qDebug() << "Show Category:" << cat; 
     553  ui->tool_br_back->setVisible(!backApps.isEmpty()); 
    904554  //Get the apps in this category 
    905   QStringList apps = PBI->browserApps(cat); 
    906   if(apps.isEmpty()){ 
    907     qDebug() << "Invalid category:" << cat; 
    908     return; 
    909   } 
    910   clearScrollArea(ui->scroll_br_cat_apps); 
    911   apps.sort(); 
    912   QVBoxLayout *applayout = new QVBoxLayout; 
    913   QStringList info; info << "name" << "shortdescription" << "icon" << "type"; 
    914   for(int i=0; i<apps.length(); i++){ 
    915     QStringList data = PBI->AppInfo(apps[i],info); 
    916     if(!data.isEmpty()){ 
    917       //Trim the description if necessary 
    918       if(data[1].size()>100){ data[1] = data[1].left(100).append("..."); } 
    919       LargeItemWidget *item = new LargeItemWidget(apps[i],data[0],data[1],data[2]); 
    920       item->setType(data[3].toLower()); 
    921       connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    922       applayout->addWidget(item);  
    923     } 
    924   } 
    925   applayout->addStretch(); 
    926   ui->scroll_br_cat_apps->widget()->setLayout(applayout); 
     555  QStringList applist = PBI->browserApps(cat); 
     556    applist.sort(); 
     557  QList<NGApp> apps = PBI->AppInfo(applist); 
     558  if( !fillVerticalAppArea(ui->scroll_br_cat_apps, applist, true) ){ 
     559    ui->label_br_cat_empty->setVisible(true); 
     560  }else{ 
     561    ui->label_br_cat_empty->setVisible(false); 
     562  } 
     563 
    927564  //Now enable/disable the shortcut buttons 
    928565  ui->tool_browse_app->setVisible(false); 
     
    930567  ui->tool_browse_gotocat->setVisible(true); 
    931568  //Setup the icon/name for the category display 
    932     QStringList catinfo = PBI->CatInfo(cat,QStringList() << "name" << "icon"); 
    933     ui->tool_browse_cat->setText(catinfo[0]); 
    934     ui->label_cat_name->setText(catinfo[0]); 
    935     if(catinfo[1].isEmpty()){ catinfo[1] = defaultIcon; } 
    936     ui->tool_browse_cat->setIcon(QIcon(catinfo[1])); 
    937     ui->label_cat_icon->setPixmap( QPixmap(catinfo[1]).scaled(32,32) );  
     569    NGCat catinfo = PBI->singleCatInfo(cat); 
     570    //QStringList catinfo = PBI->CatInfo(cat,QStringList() << "name" << "icon"); 
     571    ui->tool_browse_cat->setText(catinfo.name); 
     572    ui->label_cat_name->setText(catinfo.name); 
     573    if(catinfo.icon.isEmpty() || !QFile::exists(catinfo.icon) ){ catinfo.icon = defaultIcon; } 
     574    ui->tool_browse_cat->setIcon(QIcon(catinfo.icon)); 
     575    ui->label_cat_icon->setPixmap( QPixmap(catinfo.icon).scaled(32,32) );  
    938576  //Now move to the page 
    939577  ui->tabWidget->setCurrentWidget(ui->tab_browse); 
     
    943581} 
    944582 
    945 void MainUI::slotGoToApp(QString appID){ 
     583void MainUI::slotGoToApp(QString appID, bool goback){ 
    946584  qDebug() << "Show App:" << appID; 
    947585  //Get the general application info 
    948   QStringList data;  
    949   data << "name" << "icon" << "author" << "website" << "license" << "type" << "description" \ 
    950        << "category" << "requiresroot" << "latestversion" << "latestarch" <<"latestsize" \ 
    951        << "backupversion" << "backuparch" << "backupsize"; 
    952   data = PBI->AppInfo(appID,data); 
    953   if(data.isEmpty()){ 
     586  NGApp data = PBI->singleAppInfo(appID); 
     587  if(data.origin.isEmpty()){ 
    954588    qDebug() << "Invalid App:" << appID; 
    955589    return; 
    956590  } 
     591  //Save this appID for going back later 
     592  if(!goback){ //is not a return to an old page 
     593    if(backApps.length() > 0){ 
     594      backApps.removeAll(appID); 
     595      backApps.prepend(appID); 
     596    }else{ 
     597      backApps.prepend(appID); 
     598    } 
     599    //Now rebuild the back menu 
     600    backMenu->clear(); 
     601    for(int i=0; i<backApps.length() && i<10; i++){ //only show 10 items max 
     602      backMenu->addAction(backApps[i]); 
     603    } 
     604  } 
     605  ui->tool_br_back->setVisible( backApps.length() > 1 ); 
    957606  cApp = appID; //save this for later 
    958607  //Start the search for similar apps 
    959608  PBI->searchSimilar = appID; 
    960   ui->group_bapp_similar->setVisible(FALSE); 
     609  ui->tabWidget_browse_info->setTabEnabled(3, false); //similar apps tab 
    961610  QTimer::singleShot(0,PBI,SLOT(startSimilarSearch())); 
    962611  //Now Check icon 
    963   if(data[1].isEmpty()){ data[1] = defaultIcon; } 
     612  //qDebug() << "App Icon:" << data.origin << data.icon << data.type; 
     613  data.icon = checkIcon(data.icon, data.type); //if(data.icon.isEmpty() || !QFile::exists(data.icon)){ data.icon = defaultIcon; } 
     614  //qDebug() << " - fixed icon:" << data.icon; 
    964615  //Now fill the UI with the data 
    965   ui->label_bapp_name->setText(data[0]); 
    966   ui->label_bapp_icon->setPixmap(QPixmap(data[1])); 
    967   if(data[3].isEmpty()){ ui->label_bapp_authorweb->setText(data[2]); } 
    968   else{ ui->label_bapp_authorweb->setText("<a href="+data[3]+">"+data[2]+"</a>"); } 
    969   ui->label_bapp_authorweb->setToolTip(data[3]); 
    970   ui->label_bapp_license->setText(data[4]); 
    971   ui->label_bapp_type->setText(data[5]); 
    972   ui->text_bapp_description->setText(data[6]); 
    973   //Now determine the appropriate version info 
    974   QString pbiID = PBI->isInstalled(appID); //get pbiID 
    975   QString cVer; 
    976   if(!pbiID.isEmpty()){ cVer = PBI->PBIInfo(pbiID,QStringList("version")).join(""); } 
    977   bool useLatest=FALSE; 
    978   bool nobackup = data[12].isEmpty(); 
    979   if(cVer.isEmpty()){ useLatest=TRUE; } //not currently installed 
    980   else if(cVer != data[9]){ useLatest=TRUE;} //not the latest version 
    981   //Now put the proper version info on the UI 
    982   if(useLatest || nobackup){ 
    983     ui->label_bapp_version->setText(data[9]); 
    984     ui->label_bapp_arch->setText(data[10]); 
    985     if(data[11].isEmpty()){ ui->label_bapp_size->setText(tr("Unknown")); } 
    986     else{ ui->label_bapp_size->setText( Extras::sizeKToDisplay(data[11]) ); } 
    987   }else{ 
    988     ui->label_bapp_version->setText(data[12]); 
    989     ui->label_bapp_arch->setText(data[13]); 
    990     if(data[14].isEmpty()){ ui->label_bapp_size->setText(tr("Unknown")); } 
    991     else{ ui->label_bapp_size->setText( Extras::sizeKToDisplay(data[14]) ); } 
    992   } 
     616  ui->label_bapp_name->setText(data.name); 
     617  ui->label_bapp_icon->setPixmap(QPixmap(data.icon).scaled(ui->label_bapp_icon->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) ); 
     618  ui->label_bapp_authorweb->setText(data.author); 
     619  ui->tool_app_openweb->setWhatsThis(data.website); 
     620  ui->tool_app_openweb->setVisible( !data.website.isEmpty() && !(data.website.toLower()=="unknown") ); 
     621  ui->label_bapp_authorweb->setToolTip(data.website); 
     622  ui->label_bapp_license->setText(data.license); 
     623  ui->label_bapp_type->setText(data.type); 
     624  ui->text_bapp_description->setText(data.description); 
     625  if(data.rating.isEmpty()){ 
     626    ui->tool_app_rank->setText("?? / 5"); 
     627  }else{ 
     628    ui->tool_app_rank->setText( data.rating+" / 5"); 
     629  } 
     630  QString cVer = data.installedversion; 
     631    ui->label_bapp_version->setText(data.version); 
     632    ui->label_bapp_arch->setText(data.arch); 
     633    if(data.size.isEmpty()){ ui->label_bapp_size->setText(tr("Unknown")); } 
     634    else{ ui->label_bapp_size->setText( data.size ); } 
    993635  //Now update the download button appropriately 
    994636  slotUpdateAppDownloadButton(); 
    995  
     637  ui->group_app_installed->setVisible(data.isInstalled); 
     638  if(data.isInstalled){ 
     639    //Now update the application buttons 
     640    //Start Application binaries 
     641        QStringList bins = PBI->appBinList(appID); 
     642        appBinMenu->clear(); 
     643        for(int i=0; i<bins.length(); i++){ 
     644          QAction *act = new QAction(this); 
     645            act->setText(bins[i].section("::::",0,0)); //set name 
     646            act->setWhatsThis(bins[i].section("::::",1,10)); //set command string 
     647          appBinMenu->addAction(act); 
     648        } 
     649        ui->tool_install_startApp->setVisible(!appBinMenu->isEmpty()); 
     650    //Maintainer button 
     651      ui->tool_install_maintainer->setVisible( data.maintainer.contains("@") ); 
     652    //Shortcuts button 
     653      ui->tool_install_shortcuts->setVisible(data.hasDE); 
     654         
     655  } 
    996656  //Now enable/disable the shortcut buttons 
    997657  ui->tool_browse_app->setVisible(TRUE); 
    998     ui->tool_browse_app->setText(data[0]); 
    999     ui->tool_browse_app->setIcon(QIcon(data[1])); 
    1000   QStringList catinfo = PBI->CatInfo(Extras::nameToID(data[7]),QStringList() << "name" << "icon"); 
    1001   if(!catinfo.isEmpty()){ 
     658    ui->tool_browse_app->setText(data.name); 
     659    ui->tool_browse_app->setIcon(QIcon(data.icon)); 
     660    bApp = appID; //button app ID 
     661  NGCat catinfo; 
     662  if(!data.category.isEmpty()){ catinfo = PBI->singleCatInfo(data.category); } 
     663  else{ catinfo = PBI->singleCatInfo(data.portcat); } 
     664    bCat = catinfo.portcat; //current button category ID 
     665  //QStringList catinfo = PBI->CatInfo(Extras::nameToID(data[7]),QStringList() << "name" << "icon"); 
     666  //qDebug() << "Show App Category:" << bCat; 
     667  if(!catinfo.name.isEmpty()){ 
    1002668    ui->tool_browse_gotocat->setVisible(false); 
    1003669    ui->tool_browse_cat->setVisible(TRUE); 
    1004     ui->tool_browse_cat->setText(catinfo[0]); 
    1005     if(catinfo[1].isEmpty()){ catinfo[1] = defaultIcon; } 
    1006     ui->tool_browse_cat->setIcon(QIcon(catinfo[1])); 
     670    ui->tool_browse_cat->setText(catinfo.name); 
     671    if(catinfo.icon.isEmpty() || !QFile::exists(catinfo.icon) ){ catinfo.icon = defaultIcon; } 
     672    ui->tool_browse_cat->setIcon(QIcon(catinfo.icon)); 
    1007673  } 
    1008674  ui->tabWidget->setCurrentWidget(ui->tab_browse); 
    1009675  ui->stacked_browser->setCurrentWidget(ui->page_app); 
     676  ui->tabWidget_browse_info->setCurrentWidget(ui->tab_app_desc); 
     677  //Screenshots tab 
     678  if(data.screenshots.isEmpty()){ 
     679    ui->tabWidget_browse_info->setTabEnabled(1,false); 
     680  }else{ 
     681    ui->tabWidget_browse_info->setTabEnabled(1,true); 
     682    //still need to load the first screenshot 
     683    showScreenshot(0); 
     684  } 
     685  //Plugins tab 
     686  //qDebug() << "plugins:" << data.possiblePlugins; 
     687  ui->tabWidget_browse_info->setTabEnabled(2, fillVerticalAppArea( ui->scroll_app_plugins, data.possiblePlugins, false)); 
     688  //Build Options tab 
     689  //qDebug() << "Build Options:" << data.buildOptions; 
     690  if(data.buildOptions.isEmpty()){ 
     691    ui->tabWidget_browse_info->setTabEnabled(4,false); 
     692  }else{ 
     693    ui->tabWidget_browse_info->setTabEnabled(4,true); 
     694    ui->list_app_buildopts->clear(); 
     695    ui->list_app_buildopts->addItems(data.buildOptions); 
     696  } 
    1010697         
     698} 
     699 
     700void MainUI::slotBackToApp(QAction* act){ 
     701  slotGoToApp(act->text(), true);        
    1011702} 
    1012703 
    1013704void MainUI::slotUpdateAppDownloadButton(){ 
    1014705  QString ico; 
    1015   QString working = PBI->currentAppStatus(cApp); 
    1016   QString rawstat = PBI->currentAppStatus(cApp, true); 
    1017   QStringList info = PBI->AppInfo(cApp, QStringList() << "latestversion" << "backupversion" << "requiresroot"); 
    1018   QString pbiID = PBI->isInstalled(cApp); 
    1019   //qDebug() << "App Download status:" << working << rawstat; 
    1020   if(!working.isEmpty() && !rawstat.isEmpty() ){ //app currently pending or actually doing something 
    1021     if(rawstat.startsWith("DLSTAT::")){ ui->tool_bapp_download->setText(tr("Downloading..")); } 
    1022     else{ ui->tool_bapp_download->setText(working); } 
     706  QStringList goodjails = PBI->jailsWithoutPkg(cApp); 
     707  if( PBI->isWorking(cApp) ){ //app currently pending or actually doing something 
     708    ui->tool_bapp_download->setText( PBI->currentAppStatus(cApp) ); 
    1023709    ui->tool_bapp_download->setIcon(QIcon(":icons/working.png")); 
    1024     ui->tool_bapp_download->setEnabled(FALSE); 
    1025   }else if( pbiID.isEmpty() ){ //new installation 
     710    ui->tool_bapp_download->setEnabled(false); 
     711  }else if( !PBI->isInstalled(cApp) ){ //new installation 
    1026712    ui->tool_bapp_download->setText(tr("Install Now!")); 
    1027713    ico = ":icons/app_download.png"; 
    1028     ui->tool_bapp_download->setEnabled(TRUE); 
    1029   }else if( !PBI->upgradeAvailable(pbiID).isEmpty() ){ //Update available 
    1030     ui->tool_bapp_download->setText(tr("Update")); 
    1031     ico = ":icons/app_upgrade.png"; 
    1032     ui->tool_bapp_download->setEnabled(TRUE); 
    1033   }else if(!info[1].isEmpty()){  //Downgrade available 
    1034     ui->tool_bapp_download->setText(tr("Downgrade")); 
    1035     ico = ":icons/app_downgrade.png"; 
    1036     ui->tool_bapp_download->setEnabled(TRUE); 
     714    ui->tool_bapp_download->setEnabled(true); 
    1037715  }else{ //already installed (no downgrade available) 
    1038716    ui->tool_bapp_download->setText(tr("Installed")); 
    1039717    ui->tool_bapp_download->setIcon(QIcon(":icons/dialog-ok.png")); 
    1040     ui->tool_bapp_download->setEnabled(FALSE); 
     718    ui->tool_bapp_download->setEnabled(!goodjails.isEmpty()); //only disable if no jail menu 
    1041719  } 
    1042720  //Now set the icon appropriately if it requires root permissions 
    1043721  if(!ico.isEmpty()){ 
    1044     if(info[2]=="true"){ //requires root permissions to install 
    1045       ico.replace(".png","-root.png"); 
    1046     } 
    1047722    ui->tool_bapp_download->setIcon(QIcon(ico)); 
    1048723  } 
    1049724  ui->tool_bapp_download->setWhatsThis(cApp); //set for slot 
     725  //Now set the button menu appropriately 
     726  if(goodjails.isEmpty()){ 
     727    ui->tool_bapp_download->setMenu(0); //remove the menu 
     728    ui->tool_bapp_download->setPopupMode( QToolButton::DelayedPopup ); 
     729  }else{ 
     730    //Re-create the menu with the valid jails 
     731    jailMenu->clear(); 
     732      jailMenu->addAction( jailAction ); 
     733      jailMenu->addSeparator(); 
     734      for(int i=0; i<goodjails.length(); i++){ 
     735        jailMenu->addAction(goodjails[i]); 
     736      } 
     737    //now add the menu to the button 
     738    ui->tool_bapp_download->setMenu(jailMenu);  
     739    ui->tool_bapp_download->setPopupMode( QToolButton::MenuButtonPopup ); 
     740  } 
    1050741} 
    1051742 
     
    1065756void MainUI::slotShowSimilarApps(QStringList apps){ 
    1066757  qDebug() << " - Similar applications:" << apps; 
    1067   if(apps.isEmpty()){ ui->group_bapp_similar->setVisible(FALSE); } 
    1068   else{ 
    1069     clearScrollArea(ui->scroll_bapp_similar); 
    1070     QHBoxLayout *layout = new QHBoxLayout; 
    1071     for(int i=0; i<apps.length(); i++){ 
    1072       QStringList appdata = PBI->AppInfo(apps[i],QStringList() << "name" << "icon"); 
    1073       if(!appdata.isEmpty()){ 
    1074         SmallItemWidget *item = new SmallItemWidget(apps[i],appdata[0],appdata[1],""); 
    1075         connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    1076         layout->addWidget(item); 
    1077       } 
    1078     } 
    1079     layout->addStretch(); //add a spacer to the end 
    1080     layout->setContentsMargins(1,1,1,1); 
    1081     ui->scroll_bapp_similar->widget()->setLayout(layout); 
    1082     //Make sure that the similar scrollarea is the proper fit vertically (no vertical scrolling) 
    1083     ui->scroll_bapp_similar->setMinimumHeight(ui->scroll_bapp_similar->widget()->minimumSizeHint().height() +ui->scroll_bapp_similar->horizontalScrollBar()->height()/1.2); 
    1084     //Now make the group visible as appropriate 
    1085     ui->group_bapp_similar->setVisible(TRUE); 
    1086     if(ui->group_bapp_similar->isChecked()){ ui->scroll_bapp_similar->setVisible(TRUE); } 
    1087     else{ ui->scroll_bapp_similar->setVisible(FALSE); } 
    1088     //Now make sure the app page has the proper layout dimensions 
    1089     ui->page_app->updateGeometry(); 
    1090   } 
     758  ui->tabWidget_browse_info->setTabEnabled(3, fillVerticalAppArea( ui->scroll_app_similar, apps, true) ); 
     759    //ui->page_app->updateGeometry(); 
    1091760} 
    1092761 
    1093762void MainUI::slotShowSearchResults(QStringList best, QStringList rest){ 
    1094763  //Now display the search results 
    1095   if(best.isEmpty()){ 
     764  if( !fillVerticalAppArea( ui->scroll_bsearch_best, best, true) ){ 
    1096765    ui->label_bsearch_info->setText( QString(tr("No Search Results Found for the term: %1")).arg(ui->line_browse_searchbar->text()) ); 
    1097766    ui->label_bsearch_info->setVisible(TRUE); 
     
    1100769  }else{ 
    1101770    ui->label_bsearch_info->setVisible(FALSE); 
    1102     //Now fill the "best" section 
    1103     clearScrollArea(ui->scroll_bsearch_best); 
    1104     QVBoxLayout *layout = new QVBoxLayout; 
    1105     QStringList info; info << "name" << "shortdescription" << "icon" << "type"; 
    1106     for(int i=0; i<best.length(); i++){ 
    1107       QStringList data = PBI->AppInfo(best[i],info); 
    1108       if(!data.isEmpty()){ 
    1109         //Trim the description if necessary 
    1110         if(data[1].size()>100){ data[1] = data[1].left(100).append("..."); } 
    1111         LargeItemWidget *item = new LargeItemWidget(best[i],data[0],data[1],data[2]); 
    1112         item->setType(data[3].toLower()); 
    1113         connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    1114         layout->addWidget(item);  
    1115       } 
    1116     } 
    1117     layout->addStretch(); 
    1118     ui->scroll_bsearch_best->widget()->setLayout(layout); 
    1119771    ui->group_bsearch_best->setVisible(TRUE); 
    1120      
    1121772    //Now fill the other results 
    1122     if(rest.isEmpty()){ ui->group_bsearch_other->setVisible(FALSE); } 
    1123     else{ 
    1124       ui->group_bsearch_other->setVisible(TRUE); 
    1125       clearScrollArea(ui->scroll_bsearch_other); 
    1126       QVBoxLayout *layout2 = new QVBoxLayout; 
    1127       for(int i=0; i<rest.length(); i++){ 
    1128         QStringList data = PBI->AppInfo(rest[i],info); 
    1129         if(!data.isEmpty()){ 
    1130           //Trim the description if necessary 
    1131           if(data[1].size()>100){ data[1] = data[1].left(100).append("..."); } 
    1132           LargeItemWidget *item = new LargeItemWidget(rest[i],data[0],data[1],data[2]); 
    1133           item->setType(data[3].toLower()); 
    1134           connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
    1135           layout2->addWidget(item);  
    1136         } 
    1137       } 
    1138       layout2->addStretch(); 
    1139       ui->scroll_bsearch_other->widget()->setLayout(layout2); 
    1140     } 
     773    ui->group_bsearch_other->setVisible( fillVerticalAppArea( ui->scroll_bsearch_other, rest, true) ); 
    1141774  } 
    1142775         
     
    1151784    //Refresh the app page if that is the one currently showing 
    1152785    if(ui->stacked_browser->currentWidget() == ui->page_app){ on_tool_browse_app_clicked(); }      
    1153   }else{ 
    1154     //Always return to the installed list 
    1155     ui->stackedWidget->setCurrentWidget(ui->page_install_list); 
    1156786  } 
    1157787} 
     
    1162792 
    1163793void MainUI::on_tool_browse_cat_clicked(){ 
    1164   QString cat = Extras::nameToID(ui->tool_browse_cat->text()); 
    1165   if(cCat == cat){ //already loaded - just show it (prevents resetting scroll positions) 
     794  if(cCat == bCat){ //already loaded - just show it (prevents resetting scroll positions) 
    1166795    ui->stacked_browser->setCurrentWidget(ui->page_cat); 
    1167796    //Now enable/disable the shortcut buttons 
     
    1170799    ui->tool_browse_gotocat->setVisible(true); 
    1171800  }else{ //load and show the category 
    1172     slotGoToCategory(cat); 
     801    slotGoToCategory(bCat);  //button cat id 
    1173802  } 
    1174803} 
    1175804 
    1176805void MainUI::on_tool_browse_app_clicked(){ 
    1177   QString appID = Extras::nameToID(ui->tool_browse_app->text()); 
    1178   slotGoToApp(appID); 
     806  slotGoToApp(bApp); //button app id 
    1179807} 
    1180808 
     
    1193821void MainUI::on_tool_bapp_download_clicked(){ 
    1194822  QString appID = ui->tool_bapp_download->whatsThis(); 
     823  if(PBI->isInstalled(appID)){ return; } //do nothing if already installed 
    1195824  //Verify the app installation 
    1196825  if( QMessageBox::Yes != QMessageBox::question(this,tr("Verify Installation"), tr("Are you sure you want to install this application?")+"\n\n"+appID,QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes)){ 
     
    1200829  ui->tool_bapp_download->setEnabled(FALSE); //make sure it cannot be clicked more than once before page refresh 
    1201830  //Now show the Installed tab 
    1202   ui->tabWidget->setCurrentWidget(ui->tab_installed); 
     831  //ui->tabWidget->setCurrentWidget(ui->tab_installed); 
    1203832} 
    1204833 
     
    1207836} 
    1208837 
    1209 void MainUI::on_group_bapp_similar_toggled(bool show){ 
    1210   ui->scroll_bapp_similar->setVisible(show); 
     838void MainUI::on_tool_app_nextScreen_clicked(){ 
     839  //Read the current screenshot and go to the previous one 
     840  int cur = ui->label_app_cScreen->text().section("/",0,0).simplified().toInt(); 
     841  showScreenshot(cur); //the viewable number is always 1 greater than the actual number 
     842} 
     843 
     844void MainUI::on_tool_app_prevScreen_clicked(){ 
     845  //Read the current screenshot and go to the previous one 
     846  int cur = ui->label_app_cScreen->text().section("/",0,0).simplified().toInt(); 
     847  showScreenshot(cur-2); //the viewable number is always 1 greater than the actual number        
     848} 
     849 
     850void MainUI::on_tool_app_rank_clicked(){ 
     851  qDebug() << "Open PC-BSD wiki ratings page"; 
     852  QString url = "http://wiki.pcbsd.org/index.php/AppCafe/"+cApp; 
     853  PBI->runCmdAsUser("xdg-open \'"+url+"\'"); 
     854} 
     855 
     856void MainUI::on_tool_app_openweb_clicked(){ 
     857  qDebug() << "Open application website"; 
     858  QString url = ui->tool_app_openweb->whatsThis(); 
     859  PBI->runCmdAsUser("xdg-open \'"+url+"\'"); 
     860} 
     861 
     862void MainUI::on_tool_br_back_clicked(){ 
     863  if(backApps.length() <= 0){ return; } 
     864  QString app; 
     865  if(ui->stacked_browser->currentWidget()==ui->page_app){ 
     866    //make sure to get the one after the currently showing app 
     867    for(int i=0; i<backApps.length(); i++){ 
     868      if(backApps[i]==cApp && (i+1)<backApps.length() ){ 
     869        app = backApps[i+1]; 
     870        break; 
     871      } 
     872    } 
     873  } 
     874  if(app.isEmpty()){ 
     875    //just get the first app in the back list (the most recent) 
     876    app = backApps[0]; 
     877  } 
     878  slotGoToApp(app, true); 
     879} 
     880 
     881void MainUI::browserViewSettingsChanged(){ 
     882  //Update the currently visible browser page if necessary 
     883  QWidget* page = ui->stacked_browser->currentWidget(); 
     884  if(page == ui->page_cat){ 
     885    slotGoToCategory(cCat); 
     886  }else if(page == ui->page_search){ 
     887    slotGoToSearch(); 
     888  }   
     889} 
     890 
     891void MainUI::installAppIntoJail(QAction *act){ 
     892  QString jail = act->text(); 
     893  qDebug() << "Installation into Jail requested:" << cApp << jail; 
     894  qDebug() << "Check for current jail package not implemented yet"; 
     895  PBI->installApp(QStringList() << cApp, jail); 
    1211896} 
    1212897 
     
    1221906} 
    1222907 
     908bool MainUI::fillVerticalAppArea( QScrollArea* area, QStringList applist, bool filter){ 
     909  //clear the scroll area first 
     910  clearScrollArea(area); 
     911  bool ok = false; //returns whether any apps were shown after filtering 
     912  //Re-create the layout 
     913  QVBoxLayout *layout = new QVBoxLayout; 
     914    QList<NGApp> apps = PBI->AppInfo(applist); 
     915    for(int i=0; i<apps.length(); i++){ 
     916        bool goodApp = false; 
     917        if(apps[i].type.toLower()=="graphical"){goodApp = ui->actionGraphical_Apps->isChecked(); } 
     918        else if(apps[i].type.toLower()=="text"){goodApp = ui->actionText_Apps->isChecked(); } 
     919        else if(apps[i].type.toLower()=="server"){goodApp = ui->actionServer_Apps->isChecked(); } 
     920        else{goodApp = ui->actionRaw_Packages->isChecked(); } 
     921        if( !filter || goodApp){ 
     922          LargeItemWidget *item = new LargeItemWidget(this,apps[i], checkIcon(apps[i].icon, apps[i].type) ); 
     923          connect(item,SIGNAL(appClicked(QString)),this,SLOT(slotGoToApp(QString)) ); 
     924          layout->addWidget(item);  
     925          ok = true; 
     926        } 
     927    } 
     928    layout->addStretch(); 
     929    area->widget()->setLayout(layout); 
     930    return ok; 
     931} 
     932 
    1223933void MainUI::slotDisplayError(QString title,QString message,QStringList log){ 
    1224934  QMessageBox *dlg = new QMessageBox(this); 
     
    1229939} 
    1230940 
     941void MainUI::showScreenshot(int num){ 
     942  //Get the screenshots available 
     943  NGApp app = PBI->singleAppInfo(cApp); //currently shown app 
     944  if(app.screenshots.isEmpty()){ return; } //no screenshots available 
     945  if(app.screenshots.length() <= num){ num = 0; } //go to first 
     946  else if(num < 0){ num = app.screenshots.length()-1; } //go to last 
     947  //Get the current screenshot number 
     948  ui->label_app_cScreen->setText( QString::number(num+1)+"/"+QString::number(app.screenshots.length()) ); 
     949  //download the file from the URL given and auto-show it 
     950    // - make sure we don't have a request still running, otherwise cancel it 
     951    if(netreply==0){} // do nothing, not initialized yet 
     952    else if(netreply->isRunning()){ netreply->abort(); } 
     953  netreply = netman->get( QNetworkRequest( QUrl(app.screenshots[num]) ) ); 
     954  qDebug() << "Start fetching screenshot:" << netreply->url(); 
     955  ui->label_app_screenshot->setText( tr("Please wait. Downloading Screenshot.") ); 
     956  ui->tool_app_nextScreen->setEnabled(false); 
     957  ui->tool_app_prevScreen->setEnabled(false); 
     958} 
     959 
     960void MainUI::slotScreenshotAvailable(QNetworkReply *reply){ 
     961  qDebug() << "Screenshot retrieval finished:" << reply->error(); 
     962  if(reply->error() == QNetworkReply::NoError){ 
     963    QByteArray picdata = reply->readAll(); 
     964    QPixmap pix; 
     965      pix.loadFromData(picdata); 
     966    ui->label_app_screenshot->setText(""); //clear the text 
     967    ui->label_app_screenshot->setPixmap( pix.scaled(ui->label_app_screenshot->size(), Qt::KeepAspectRatio, Qt::SmoothTransformation) ); 
     968  }else{ 
     969    //Network error 
     970    ui->label_app_screenshot->setText( tr("Could not load screenshot (network error)") ); 
     971  } 
     972  //Now enable the prev/next buttons as necessary 
     973  QStringList txt = ui->label_app_cScreen->text().split("/"); 
     974  if(txt.length()!=2){ return; } //invalid text for some reason 
     975  if(txt[0]!="1"){ ui->tool_app_nextScreen->setEnabled(true); } 
     976  if(txt[0] != txt[1]){ ui->tool_app_prevScreen->setEnabled(true); } 
     977} 
     978 
     979QString MainUI::checkIcon(QString icon, QString type){ 
     980  QString ico; 
     981  if( !QFile::exists(icon) || icon.isEmpty()){ 
     982    if(type.toLower()=="graphical"){ ico = ":/icons/default-graphical.png"; } 
     983    else if(type.toLower()=="text"){ ico = ":/icons/default-text.png"; } 
     984    else if(type.toLower()=="server"){ ico = ":/icons/default-server.png"; } 
     985    else{ ico = ":/icons/default-pkg.png"; } 
     986  }else{ 
     987    ico = icon; 
     988  } 
     989  return ico; 
     990} 
     991 
    1231992void MainUI::slotDisplayStats(){ 
    1232   int avail = PBI->numAvailable; 
    1233   int installed = PBI->numInstalled; 
     993  int avail = PBI->appAvailable; 
     994  int pkg = PBI->pkgAvailable; 
    1234995  QString text; 
    1235   if(avail == -1){ 
    1236     text = QString(tr("Installed: %1")).arg(QString::number(installed));   
    1237   }else{ 
    1238     text = QString(tr("Installed: %1")+"\t"+tr("Available: %2")).arg(QString::number(installed), QString::number(avail));   
     996  if(avail > 0){ 
     997    text = QString(tr("Applications Available: %1")).arg(QString::number(avail))+"\t\t";   
     998  } 
     999  if(pkg > 0){ 
     1000    text.append( QString(tr("Total Packages: %1")).arg(QString::number(pkg)) ); 
    12391001  } 
    12401002  //Get the number of installed/available applications and display it  
    12411003  statusLabel->setText(text);    
    12421004} 
     1005 
     1006QStringList MainUI::generateRemoveMessage(QStringList apps){ 
     1007 
     1008  QString msg = tr("Please verify the following removals:")+"\n\n"; 
     1009  for(int i=0; i<apps.length(); i++){ 
     1010    NGApp app = PBI->singleAppInfo(apps[i]); 
     1011    if(app.rdependancy.contains("pcbsd-base")){ apps.removeAt(i); i--; continue; } //skip it - cannot remove 
     1012    msg.append(app.name+"\n"); 
     1013    if(!app.rdependancy.isEmpty()){ msg.append( " - "+QString(tr("Also Removes: %1")).arg(app.rdependancy.join(", "))+"\n" ); } 
     1014  } 
     1015   
     1016  if(apps.isEmpty()){ 
     1017    QMessageBox::warning(this, tr("Invalid Removal"), tr("These applications are required by the base PC-BSD system and cannot be removed") ); 
     1018  }else{ 
     1019    if( QMessageBox::Yes != QMessageBox::question(this,tr("Verify PBI Removal"), msg ,QMessageBox::Yes | QMessageBox::Cancel,QMessageBox::Cancel) ){ 
     1020      apps.clear(); 
     1021    } 
     1022  } 
     1023  return apps; 
     1024} 
  • src-qt4/pc-softwaremanager/mainUI.h

    rde397c3d rb6102c8  
    2323#include <QDesktopServices> 
    2424#include <QUrl> 
     25#include <QNetworkAccessManager> 
     26#include <QNetworkReply> 
     27#include <QWidgetAction> 
    2528 
    2629/* LibPCBSD Includes */ 
     
    2831 
    2932/* Local Includes */ 
    30 #include "pbiBackend.h" 
     33#include "pbiNgBackend.h" 
    3134#include "extras.h" 
    3235#include "largeItemWidget.h" 
     
    4447   explicit MainUI(QWidget* parent = 0); 
    4548   void ProgramInit(); 
    46    void setWardenMode(QString dir,QString ip); //call before ProgramInit 
     49   //void setWardenMode(QString dir,QString ip); //call before ProgramInit 
    4750 
    4851public slots: 
     
    5861  void on_actionQuit_triggered(); 
    5962  void on_actionAppCafe_Settings_triggered(); 
    60   void on_actionInstall_From_File_triggered(); 
     63  void on_actionDeveloper_Mode_triggered(); 
     64 
    6165  //INSTALLED TAB 
    6266  void slotRefreshInstallTab(); 
     
    6468  void slotPBIStatusUpdate(QString); 
    6569  void on_tool_install_details_clicked(); 
    66   void on_tool_install_back_clicked(); 
    67   void on_tool_install_gotobrowserpage_clicked(); 
    6870  void on_tool_install_toggleall_clicked(); 
    6971  void on_tree_install_apps_itemSelectionChanged(); 
    7072  void on_tree_install_apps_itemDoubleClicked(QTreeWidgetItem *item); 
    71   void on_check_install_autoupdate_clicked(); 
    72   void on_tool_install_update_clicked(); 
    73   void on_tool_install_remove_clicked(); 
    74   void on_tool_install_cancel_clicked(); 
     73 
    7574  void on_tool_install_maintainer_clicked(); 
    7675  void slotInstalledAppRightClicked(const QPoint &); 
     
    7877  void slotActionAddDesktop(); 
    7978  void slotActionRemoveDesktop(); 
    80   void slotActionAddPath(); 
    81   void slotActionRemovePath(); 
    82   void slotActionAddPathAll(); 
    83   void slotActionAddMenu(); 
    84   void slotActionRemoveMenu(); 
    85   void slotActionAddMenuAll(); 
    86   void slotActionAddMime(); 
    87   void slotActionRemoveMime(); 
    88   void slotActionAddMimeAll(); 
    89   void slotActionUpdate(); 
    9079  void slotActionRemove(); 
    9180  void slotActionCancel(); 
    9281  void slotStartApp(QAction*); 
    93   void slotUpdateSelectedPBI(); 
    94   void updateInstallDetails(QString appID); 
     82 
    9583  //BROWSER TAB 
    9684  void slotDisableBrowser(bool shownotification = TRUE); 
     
    10088  void slotGoToCatBrowser(); 
    10189  void slotGoToCategory(QString); 
    102   void slotGoToApp(QString); 
     90  void slotGoToApp(QString, bool goback = false); 
     91  void slotBackToApp(QAction*); 
    10392  void slotUpdateAppDownloadButton(); 
    10493  void slotGoToSearch(); 
     
    112101  void on_tool_bapp_download_clicked(); 
    113102  void on_group_br_home_newapps_toggled(bool); 
    114   void on_group_bapp_similar_toggled(bool); 
     103  void on_tool_app_nextScreen_clicked(); 
     104  void on_tool_app_prevScreen_clicked(); 
     105  void on_tool_app_rank_clicked(); 
     106  void on_tool_app_openweb_clicked(); 
     107  void on_tool_br_back_clicked(); 
     108  void browserViewSettingsChanged(); 
     109 
     110  void installAppIntoJail(QAction *act); 
     111 
    115112  //OTHER 
    116113  void slotDisplayError(QString,QString,QStringList); 
     114  void slotScreenshotAvailable(QNetworkReply*); 
    117115   
    118116private: 
    119117  Ui::MainUI *ui; 
    120   QString wardenDir, wardenIP, defaultIcon; 
     118  QString defaultIcon; 
    121119  PBIBackend *PBI; 
     120  QNetworkAccessManager *netman; 
     121  QNetworkReply *netreply; 
    122122  //INSTALLED TAB 
    123   QMenu *actionMenu, *appBinMenu, *shortcutMenu, *sDeskMenu, *sMenuMenu, *sMimeMenu, *contextActionMenu; 
     123  QMenu *actionMenu, *appBinMenu, *sDeskMenu, *contextActionMenu, *jailMenu, *backMenu; 
    124124  QString cDetails; 
    125125  void initializeInstalledTab(); 
     
    129129  QTimer *searchTimer; 
    130130  QString cCat, cApp; 
     131  QString bCat, bApp; //current cat/app for the buttons 
     132  QStringList backApps; 
    131133  void initializeBrowserTab(); 
    132134  //OTHER 
    133   QLabel *statusLabel; 
     135  QLabel *statusLabel, *jailLabel; 
     136  QWidgetAction *jailAction; 
    134137  void clearScrollArea(QScrollArea*); 
     138  bool fillVerticalAppArea(QScrollArea *area, QStringList applist, bool filter = false); 
     139  void showScreenshot(int num=0); 
     140  QString checkIcon(QString icon, QString type); 
    135141  void slotDisplayStats(); 
     142  QStringList generateRemoveMessage(QStringList apps); 
    136143     
    137144} ; 
  • src-qt4/pc-softwaremanager/mainUI.ui

    rf85c713 rb6102c8  
    77    <x>0</x> 
    88    <y>0</y> 
    9     <width>473</width> 
     9    <width>514</width> 
    1010    <height>520</height> 
    1111   </rect> 
     
    1818    <normaloff>:/icons/appcafe.png</normaloff>:/icons/appcafe.png</iconset> 
    1919  </property> 
     20  <property name="toolTip"> 
     21   <string/> 
     22  </property> 
     23  <property name="styleSheet"> 
     24   <string notr="true">QToolTip{  
     25background: rgba(230,230,230,220);  
     26border: 1px solid grey; 
     27border-radius: 3px; 
     28padding: 1px; 
     29color: black; 
     30}</string> 
     31  </property> 
    2032  <widget class="QWidget" name="centralwidget"> 
    2133   <property name="styleSheet"> 
     
    2335   </property> 
    2436   <layout class="QVBoxLayout" name="verticalLayout"> 
     37    <property name="topMargin"> 
     38     <number>2</number> 
     39    </property> 
     40    <property name="bottomMargin"> 
     41     <number>2</number> 
     42    </property> 
    2543    <item> 
    26      <widget class="QTabWidget" name="tabWidget"> 
     44     <widget class="QStackedWidget" name="stacked_main"> 
    2745      <property name="currentIndex"> 
    28        <number>1</number> 
     46       <number>0</number> 
    2947      </property> 
    30       <property name="iconSize"> 
    31        <size> 
    32         <width>20</width> 
    33         <height>20</height> 
    34        </size> 
    35       </property> 
    36       <widget class="QWidget" name="tab_installed"> 
    37        <attribute name="icon"> 
    38         <iconset resource="SoftwareManager.qrc"> 
    39          <normaloff>:/icons/application.png</normaloff>:/icons/application.png</iconset> 
    40        </attribute> 
    41        <attribute name="title"> 
    42         <string>Installed</string> 
    43        </attribute> 
    44        <layout class="QVBoxLayout" name="verticalLayout_2"> 
    45         <property name="spacing"> 
    46          <number>-1</number> 
    47         </property> 
    48         <property name="leftMargin"> 
    49          <number>2</number> 
    50         </property> 
    51         <property name="topMargin"> 
    52          <number>4</number> 
    53         </property> 
    54         <property name="rightMargin"> 
    55          <number>2</number> 
    56         </property> 
    57         <property name="bottomMargin"> 
    58          <number>4</number> 
     48      <widget class="QWidget" name="page"> 
     49       <layout class="QVBoxLayout" name="verticalLayout_3"> 
     50        <property name="margin"> 
     51         <number>0</number> 
    5952        </property> 
    6053        <item> 
    61          <widget class="QStackedWidget" name="stackedWidget"> 
     54         <widget class="QGroupBox" name="group_updates"> 
    6255          <property name="styleSheet"> 
    63            <string notr="true"/> 
     56           <string notr="true">QGroupBox{ 
     57background: rbga(50,190,255,130); 
     58border-radius: 5px; 
     59}</string> 
    6460          </property> 
     61          <property name="title"> 
     62           <string/> 
     63          </property> 
     64          <layout class="QHBoxLayout" name="horizontalLayout_6"> 
     65           <property name="margin"> 
     66            <number>3</number> 
     67           </property> 
     68           <item> 
     69            <widget class="QToolButton" name="toolButton"> 
     70             <property name="text"> 
     71              <string>Start Updates</string> 
     72             </property> 
     73             <property name="icon"> 
     74              <iconset resource="SoftwareManager.qrc"> 
     75               <normaloff>:/icons/view-refresh.png</normaloff>:/icons/view-refresh.png</iconset> 
     76             </property> 
     77             <property name="toolButtonStyle"> 
     78              <enum>Qt::ToolButtonTextBesideIcon</enum> 
     79             </property> 
     80            </widget> 
     81           </item> 
     82           <item> 
     83            <widget class="QLabel" name="label_updates"> 
     84             <property name="font"> 
     85              <font> 
     86               <weight>75</weight> 
     87               <bold>true</bold> 
     88              </font> 
     89             </property> 
     90             <property name="text"> 
     91              <string>Application updates are available!</string> 
     92             </property> 
     93            </widget> 
     94           </item> 
     95          </layout> 
     96         </widget> 
     97        </item> 
     98        <item> 
     99         <widget class="QTabWidget" name="tabWidget"> 
    65100          <property name="currentIndex"> 
    66101           <number>1</number> 
    67102          </property> 
    68           <widget class="QWidget" name="page_install_list"> 
    69            <layout class="QVBoxLayout" name="verticalLayout_21"> 
    70             <property name="margin"> 
    71              <number>0</number> 
     103          <property name="iconSize"> 
     104           <size> 
     105            <width>20</width> 
     106            <height>20</height> 
     107           </size> 
     108          </property> 
     109          <widget class="QWidget" name="tab_installed"> 
     110           <attribute name="icon"> 
     111            <iconset resource="SoftwareManager.qrc"> 
     112             <normaloff>:/icons/application.png</normaloff>:/icons/application.png</iconset> 
     113           </attribute> 
     114           <attribute name="title"> 
     115            <string>Installed</string> 
     116           </attribute> 
     117           <layout class="QVBoxLayout" name="verticalLayout_2"> 
     118            <property name="spacing"> 
     119             <number>-1</number> 
     120            </property> 
     121            <property name="leftMargin"> 
     122             <number>2</number> 
     123            </property> 
     124            <property name="topMargin"> 
     125             <number>4</number> 
     126            </property> 
     127            <property name="rightMargin"> 
     128             <number>2</number> 
     129            </property> 
     130            <property name="bottomMargin"> 
     131             <number>4</number> 
    72132            </property> 
    73133            <item> 
    74134             <layout class="QHBoxLayout" name="horizontalLayout_11"> 
     135              <item> 
     136               <widget class="QComboBox" name="comboBox"/> 
     137              </item> 
    75138              <item> 
    76139               <spacer name="horizontalSpacer_2"> 
     
    112175              <property name="indentation"> 
    113176               <number>0</number> 
     177              </property> 
     178              <property name="sortingEnabled"> 
     179               <bool>true</bool> 
    114180              </property> 
    115181              <attribute name="headerCascadingSectionResizes"> 
     
    192258           </layout> 
    193259          </widget> 
    194           <widget class="QWidget" name="page_install_details"> 
    195            <layout class="QGridLayout" name="gridLayout_2"> 
    196             <property name="margin"> 
     260          <widget class="QWidget" name="tab_browse"> 
     261           <attribute name="icon"> 
     262            <iconset resource="SoftwareManager.qrc"> 
     263             <normaloff>:/icons/appcafe.png</normaloff>:/icons/appcafe.png</iconset> 
     264           </attribute> 
     265           <attribute name="title"> 
     266            <string>Browse For Apps</string> 
     267           </attribute> 
     268           <layout class="QVBoxLayout" name="verticalLayout_4"> 
     269            <property name="leftMargin"> 
     270             <number>2</number> 
     271            </property> 
     272            <property name="topMargin"> 
     273             <number>3</number> 
     274            </property> 
     275            <property name="rightMargin"> 
     276             <number>2</number> 
     277            </property> 
     278            <property name="bottomMargin"> 
    197279             <number>0</number> 
    198280            </property> 
    199             <item row="3" column="0"> 
    200              <widget class="QFrame" name="frame_2"> 
    201               <property name="styleSheet"> 
    202                <string notr="true"/> 
    203               </property> 
    204               <property name="frameShape"> 
    205                <enum>QFrame::StyledPanel</enum> 
    206               </property> 
    207               <property name="frameShadow"> 
    208                <enum>QFrame::Raised</enum> 
    209               </property> 
    210               <layout class="QHBoxLayout" name="horizontalLayout_14"> 
    211                <property name="margin"> 
    212                 <number>2</number> 
    213                </property> 
    214                <item> 
    215                 <layout class="QFormLayout" name="formLayout_7"> 
    216                  <property name="fieldGrowthPolicy"> 
    217                   <enum>QFormLayout::ExpandingFieldsGrow</enum> 
    218                  </property> 
    219                  <item row="0" column="0"> 
    220                   <widget class="QLabel" name="label_3"> 
    221                    <property name="text"> 
    222                     <string>Created:</string> 
    223                    </property> 
    224                   </widget> 
    225                  </item> 
    226                  <item row="0" column="1"> 
    227                   <widget class="QLabel" name="label_install_date"> 
    228                    <property name="text"> 
    229                     <string notr="true">Build Date</string> 
    230                    </property> 
    231                   </widget> 
    232                  </item> 
    233                  <item row="1" column="0"> 
    234                   <widget class="QLabel" name="label"> 
    235                    <property name="text"> 
    236                     <string>Version:</string> 
    237                    </property> 
    238                   </widget> 
    239                  </item> 
    240                  <item row="1" column="1"> 
    241                   <widget class="QLabel" name="label_install_version"> 
    242                    <property name="text"> 
    243                     <string notr="true">x.xx.x</string> 
    244                    </property> 
    245                   </widget> 
    246                  </item> 
    247                 </layout> 
    248                </item> 
    249                <item> 
    250                 <layout class="QFormLayout" name="formLayout"> 
    251                  <property name="fieldGrowthPolicy"> 
    252                   <enum>QFormLayout::ExpandingFieldsGrow</enum> 
    253                  </property> 
    254                  <item row="0" column="0"> 
    255                   <widget class="QLabel" name="label_4"> 
    256                    <property name="text"> 
    257                     <string>License:</string> 
    258                    </property> 
    259                   </widget> 
    260                  </item> 
    261                  <item row="0" column="1"> 
    262                   <widget class="QLabel" name="label_install_license"> 
    263                    <property name="text"> 
    264                     <string notr="true">BSD</string> 
    265                    </property> 
    266                   </widget> 
    267                  </item> 
    268                  <item row="1" column="0"> 
    269                   <widget class="QLabel" name="label_5"> 
    270                    <property name="text"> 
    271                     <string>Architecture:</string> 
    272                    </property> 
    273                   </widget> 
    274                  </item> 
    275                  <item row="1" column="1"> 
    276                   <widget class="QLabel" name="label_install_arch"> 
    277                    <property name="text"> 
    278                     <string notr="true">arch</string> 
    279                    </property> 
    280                   </widget> 
    281                  </item> 
    282                 </layout> 
    283                </item> 
    284               </layout> 
    285              </widget> 
    286             </item> 
    287             <item row="7" column="0"> 
    288              <widget class="QGroupBox" name="group_install_appStat"> 
    289               <property name="title"> 
    290                <string>Current Operations</string> 
    291               </property> 
    292               <property name="flat"> 
    293                <bool>true</bool> 
    294               </property> 
    295               <layout class="QVBoxLayout" name="verticalLayout_18"> 
    296                <item> 
    297                 <layout class="QHBoxLayout" name="horizontalLayout_10"> 
    298                  <item> 
    299                   <widget class="QToolButton" name="tool_install_cancel"> 
    300                    <property name="sizePolicy"> 
    301                     <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
    302                      <horstretch>0</horstretch> 
    303                      <verstretch>0</verstretch> 
    304                     </sizepolicy> 
    305                    </property> 
    306                    <property name="toolTip"> 
    307                     <string>Cancel any actions for this application</string> 
    308                    </property> 
    309                    <property name="statusTip"> 
    310                     <string>Cancel any actions for this application</string> 
    311                    </property> 
    312                    <property name="text"> 
    313                     <string>Cancel Operations</string> 
    314                    </property> 
    315                    <property name="icon"> 
    316                     <iconset resource="SoftwareManager.qrc"> 
    317                      <normaloff>:/icons/dialog-cancel.png</normaloff>:/icons/dialog-cancel.png</iconset> 
    318                    </property> 
    319                    <property name="toolButtonStyle"> 
    320                     <enum>Qt::ToolButtonIconOnly</enum> 
    321                    </property> 
    322                   </widget> 
    323                  </item> 
    324                  <item> 
    325                   <widget class="QToolButton" name="tool_install_update"> 
    326                    <property name="toolTip"> 
    327                     <string>Update the application to the most recent version</string> 
    328                    </property> 
    329                    <property name="statusTip"> 
    330                     <string>Update the selected application</string> 
    331                    </property> 
    332                    <property name="text"> 
    333                     <string>Update</string> 
    334                    </property> 
    335                    <property name="icon"> 
    336                     <iconset resource="SoftwareManager.qrc"> 
    337                      <normaloff>:/icons/view-refresh.png</normaloff>:/icons/view-refresh.png</iconset> 
    338                    </property> 
    339                    <property name="toolButtonStyle"> 
    340                     <enum>Qt::ToolButtonIconOnly</enum> 
    341                    </property> 
    342                   </widget> 
    343                  </item> 
    344                  <item> 
    345                   <widget class="QLabel" name="label_install_status"> 
    346                    <property name="sizePolicy"> 
    347                     <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> 
    348                      <horstretch>0</horstretch> 
    349                      <verstretch>0</verstretch> 
    350                     </sizepolicy> 
    351                    </property> 
    352                    <property name="text"> 
    353                     <string notr="true">TextLabel</string> 
    354                    </property> 
    355                    <property name="wordWrap"> 
    356                     <bool>true</bool> 
    357                    </property> 
    358                   </widget> 
    359                  </item> 
    360                 </layout> 
    361                </item> 
    362               </layout> 
    363              </widget> 
    364             </item> 
    365             <item row="2" column="0"> 
    366              <layout class="QHBoxLayout" name="horizontalLayout_6"> 
     281            <item> 
     282             <layout class="QHBoxLayout" name="horizontalLayout_4"> 
    367283              <item> 
    368                <widget class="QLabel" name="label_install_icon"> 
    369                 <property name="sizePolicy"> 
    370                  <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 
    371                   <horstretch>0</horstretch> 
    372                   <verstretch>0</verstretch> 
    373                  </sizepolicy> 
    374                 </property> 
    375                 <property name="maximumSize"> 
    376                  <size> 
    377                   <width>64</width> 
    378                   <height>64</height> 
    379                  </size> 
     284               <widget class="QToolButton" name="tool_br_back"> 
     285                <property name="toolTip"> 
     286                 <string>Back to previous application</string> 
     287                </property> 
     288                <property name="styleSheet"> 
     289                 <string notr="true">QToolButton{ 
     290padding-right: 16px;  
     291}</string> 
    380292                </property> 
    381293                <property name="text"> 
    382                  <string/> 
    383                 </property> 
    384                 <property name="pixmap"> 
    385                  <pixmap resource="SoftwareManager.qrc">:/icons/appcafe.png</pixmap> 
    386                 </property> 
    387                 <property name="scaledContents"> 
    388                  <bool>false</bool> 
     294                 <string>...</string> 
     295                </property> 
     296                <property name="icon"> 
     297                 <iconset resource="SoftwareManager.qrc"> 
     298                  <normaloff>:/icons/go-previous.png</normaloff>:/icons/go-previous.png</iconset> 
     299                </property> 
     300                <property name="popupMode"> 
     301                 <enum>QToolButton::MenuButtonPopup</enum> 
    389302                </property> 
    390303               </widget> 
    391304              </item> 
    392305              <item> 
    393                <layout class="QVBoxLayout" name="verticalLayout_3"> 
    394                 <item> 
    395                  <widget class="QLabel" name="label_install_app"> 
    396                   <property name="sizePolicy"> 
    397                    <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> 
    398                     <horstretch>0</horstretch> 
    399                     <verstretch>0</verstretch> 
    400                    </sizepolicy> 
    401                   </property> 
    402                   <property name="font"> 
    403                    <font> 
    404                     <pointsize>12</pointsize> 
    405                     <weight>75</weight> 
    406                     <bold>true</bold> 
    407                     <underline>true</underline> 
    408                    </font> 
    409                   </property> 
    410                   <property name="text"> 
    411                    <string notr="true">Application</string> 
    412                   </property> 
    413                   <property name="alignment"> 
    414                    <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    415                   </property> 
    416                  </widget> 
    417                 </item> 
    418                 <item> 
    419                  <widget class="QLabel" name="label_install_author"> 
    420                   <property name="text"> 
    421                    <string notr="true">&lt;a href=&quot;http://www.pcbsd.org&quot;&gt;PC_BSD&lt;/a&gt;</string> 
    422                   </property> 
    423                   <property name="alignment"> 
    424                    <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    425                   </property> 
    426                   <property name="openExternalLinks"> 
    427                    <bool>true</bool> 
    428                   </property> 
    429                   <property name="textInteractionFlags"> 
    430                    <set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse</set> 
    431                   </property> 
    432                  </widget> 
    433                 </item> 
    434                </layout> 
    435               </item> 
    436               <item> 
    437                <layout class="QVBoxLayout" name="verticalLayout_10"> 
    438                 <item> 
    439                  <widget class="QToolButton" name="tool_install_startApp"> 
    440                   <property name="sizePolicy"> 
    441                    <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 
    442                     <horstretch>0</horstretch> 
    443                     <verstretch>0</verstretch> 
    444                    </sizepolicy> 
    445                   </property> 
    446                   <property name="statusTip"> 
    447                    <string>Start the application</string> 
    448                   </property> 
    449                   <property name="layoutDirection"> 
    450                    <enum>Qt::LeftToRight</enum> 
    451                   </property> 
    452                   <property name="text"> 
    453                    <string>Start</string> 
    454                   </property> 
    455                   <property name="icon"> 
    456                    <iconset resource="SoftwareManager.qrc"> 
    457                     <normaloff>:/icons/application.png</normaloff>:/icons/application.png</iconset> 
    458                   </property> 
    459                   <property name="popupMode"> 
    460                    <enum>QToolButton::InstantPopup</enum> 
    461                   </property> 
    462                   <property name="toolButtonStyle"> 
    463                    <enum>Qt::ToolButtonTextBesideIcon</enum> 
    464                   </property> 
    465                  </widget> 
    466                 </item> 
    467                </layout> 
    468               </item> 
    469              </layout> 
    470             </item> 
    471             <item row="4" column="0"> 
    472              <widget class="QPlainTextEdit" name="text_install_description"> 
    473               <property name="sizePolicy"> 
    474                <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> 
    475                 <horstretch>0</horstretch> 
    476                 <verstretch>0</verstretch> 
    477                </sizepolicy> 
    478               </property> 
    479               <property name="readOnly"> 
    480                <bool>true</bool> 
    481               </property> 
    482              </widget> 
    483             </item> 
    484             <item row="5" column="0"> 
    485              <layout class="QHBoxLayout" name="horizontalLayout_12"> 
    486               <property name="margin"> 
    487                <number>1</number> 
    488               </property> 
    489               <item> 
    490                <widget class="QToolButton" name="tool_install_shortcuts"> 
     306               <widget class="QToolButton" name="tool_browse_home"> 
    491307                <property name="text"> 
    492                  <string>Shortcuts</string> 
     308                 <string>Home</string> 
    493309                </property> 
    494310                <property name="icon"> 
    495311                 <iconset resource="SoftwareManager.qrc"> 
    496                   <normaloff>:/icons/config.png</normaloff>:/icons/config.png</iconset> 
    497                 </property> 
    498                 <property name="popupMode"> 
    499                  <enum>QToolButton::InstantPopup</enum> 
     312                  <normaloff>:/icons/go-home.png</normaloff>:/icons/go-home.png</iconset> 
    500313                </property> 
    501314                <property name="toolButtonStyle"> 
    502                  <enum>Qt::ToolButtonTextBesideIcon</enum> 
     315                 <enum>Qt::ToolButtonIconOnly</enum> 
    503316                </property> 
    504317               </widget> 
    505318              </item> 
    506319              <item> 
    507                <widget class="QToolButton" name="tool_install_maintainer"> 
     320               <widget class="QToolButton" name="tool_browse_gotocat"> 
    508321                <property name="text"> 
    509                  <string>Contact Maintainer</string> 
     322                 <string>Browse Categories</string> 
    510323                </property> 
    511324                <property name="icon"> 
    512325                 <iconset resource="SoftwareManager.qrc"> 
    513                   <normaloff>:/icons/email.png</normaloff>:/icons/email.png</iconset> 
     326                  <normaloff>:/icons/xdg_menu.png</normaloff>:/icons/xdg_menu.png</iconset> 
    514327                </property> 
    515328                <property name="popupMode"> 
     
    522335              </item> 
    523336              <item> 
    524                <spacer name="horizontalSpacer_9"> 
     337               <widget class="QToolButton" name="tool_browse_cat"> 
     338                <property name="text"> 
     339                 <string>Category</string> 
     340                </property> 
     341                <property name="icon"> 
     342                 <iconset resource="SoftwareManager.qrc"> 
     343                  <normaloff>:/icons/xdg_menu.png</normaloff>:/icons/xdg_menu.png</iconset> 
     344                </property> 
     345                <property name="toolButtonStyle"> 
     346                 <enum>Qt::ToolButtonTextBesideIcon</enum> 
     347                </property> 
     348               </widget> 
     349              </item> 
     350              <item> 
     351               <widget class="QToolButton" name="tool_browse_app"> 
     352                <property name="text"> 
     353                 <string>App</string> 
     354                </property> 
     355                <property name="icon"> 
     356                 <iconset resource="SoftwareManager.qrc"> 
     357                  <normaloff>:/icons/appcafe.png</normaloff>:/icons/appcafe.png</iconset> 
     358                </property> 
     359                <property name="toolButtonStyle"> 
     360                 <enum>Qt::ToolButtonTextBesideIcon</enum> 
     361                </property> 
     362               </widget> 
     363              </item> 
     364              <item> 
     365               <spacer name="horizontalSpacer_3"> 
    525366                <property name="orientation"> 
    526367                 <enum>Qt::Horizontal</enum> 
     
    535376              </item> 
    536377              <item> 
    537                <widget class="QCheckBox" name="check_install_autoupdate"> 
    538                 <property name="statusTip"> 
    539                  <string>Automatically update the selected application when an update is available</string> 
    540                 </property> 
     378               <widget class="QLineEdit" name="line_browse_searchbar"> 
     379                <property name="placeholderText"> 
     380                 <string>Search Here</string> 
     381                </property> 
     382               </widget> 
     383              </item> 
     384              <item> 
     385               <widget class="QToolButton" name="tool_browse_search"> 
    541386                <property name="text"> 
    542                  <string>Auto-Update</string> 
     387                 <string>Search</string> 
    543388                </property> 
    544389                <property name="icon"> 
    545390                 <iconset resource="SoftwareManager.qrc"> 
    546                   <normaloff>:/icons/view-refresh.png</normaloff>:/icons/view-refresh.png</iconset> 
     391                  <normaloff>:/icons/edit-find.png</normaloff>:/icons/edit-find.png</iconset> 
    547392                </property> 
    548393               </widget> 
     
    550395             </layout> 
    551396            </item> 
    552             <item row="6" column="0"> 
    553              <spacer name="verticalSpacer"> 
    554               <property name="orientation"> 
    555                <enum>Qt::Vertical</enum> 
    556               </property> 
    557               <property name="sizeHint" stdset="0"> 
    558                <size> 
    559                 <width>20</width> 
    560                 <height>0</height> 
    561                </size> 
    562               </property> 
    563              </spacer> 
    564             </item> 
    565             <item row="0" column="0"> 
    566              <layout class="QHBoxLayout" name="horizontalLayout_13"> 
    567               <item> 
    568                <widget class="QToolButton" name="tool_install_back"> 
    569                 <property name="text"> 
    570                  <string>Back</string> 
    571                 </property> 
    572                 <property name="icon"> 
    573                  <iconset resource="SoftwareManager.qrc"> 
    574                   <normaloff>:/icons/go-previous.png</normaloff>:/icons/go-previous.png</iconset> 
    575                 </property> 
    576                 <property name="toolButtonStyle"> 
    577                  <enum>Qt::ToolButtonTextBesideIcon</enum> 
    578                 </property> 
    579                </widget> 
    580               </item> 
    581               <item> 
    582                <spacer name="horizontalSpacer_7"> 
    583                 <property name="orientation"> 
    584                  <enum>Qt::Horizontal</enum> 
    585                 </property> 
    586                 <property name="sizeHint" stdset="0"> 
    587                  <size> 
    588                   <width>0</width> 
    589                   <height>20</height> 
    590                  </size> 
    591                 </property> 
    592                </spacer> 
    593               </item> 
    594               <item> 
    595                <widget class="QToolButton" name="tool_install_remove"> 
    596                 <property name="toolTip"> 
    597                  <string>Remove the selected application</string> 
    598                 </property> 
    599                 <property name="statusTip"> 
    600                  <string>Remove the selected application</string> 
    601                 </property> 
    602                 <property name="text"> 
    603                  <string>Uninstall</string> 
    604                 </property> 
    605                 <property name="icon"> 
    606                  <iconset resource="SoftwareManager.qrc"> 
    607                   <normaloff>:/icons/remove.png</normaloff>:/icons/remove.png</iconset> 
    608                 </property> 
    609                 <property name="toolButtonStyle"> 
    610                  <enum>Qt::ToolButtonTextBesideIcon</enum> 
    611                 </property> 
    612                </widget> 
    613               </item> 
    614               <item> 
    615                <widget class="QToolButton" name="tool_install_gotobrowserpage"> 
    616                 <property name="text"> 
    617                  <string>Find</string> 
    618                 </property> 
    619                 <property name="icon"> 
    620                  <iconset resource="SoftwareManager.qrc"> 
    621                   <normaloff>:/icons/edit-find.png</normaloff>:/icons/edit-find.png</iconset> 
    622                 </property> 
    623                 <property name="toolButtonStyle"> 
    624                  <enum>Qt::ToolButtonTextBesideIcon</enum> 
    625                 </property> 
    626                </widget> 
    627               </item> 
    628              </layout> 
    629             </item> 
    630             <item row="1" column="0"> 
    631              <widget class="Line" name="line_2"> 
    632               <property name="orientation"> 
    633                <enum>Qt::Horizontal</enum> 
    634               </property> 
    635              </widget> 
    636             </item> 
    637            </layout> 
    638           </widget> 
    639          </widget> 
    640         </item> 
    641        </layout> 
    642       </widget> 
    643       <widget class="QWidget" name="tab_browse"> 
    644        <attribute name="icon"> 
    645         <iconset resource="SoftwareManager.qrc"> 
    646          <normaloff>:/icons/appcafe.png</normaloff>:/icons/appcafe.png</iconset> 
    647        </attribute> 
    648        <attribute name="title"> 
    649         <string>Browse For Apps</string> 
    650        </attribute> 
    651        <layout class="QVBoxLayout" name="verticalLayout_4"> 
    652         <property name="leftMargin"> 
    653          <number>2</number> 
    654         </property> 
    655         <property name="topMargin"> 
    656          <number>3</number> 
    657         </property> 
    658         <property name="rightMargin"> 
    659          <number>2</number> 
    660         </property> 
    661         <property name="bottomMargin"> 
    662          <number>0</number> 
    663         </property> 
    664         <item> 
    665          <layout class="QHBoxLayout" name="horizontalLayout_4"> 
    666           <item> 
    667            <widget class="QToolButton" name="tool_browse_home"> 
    668             <property name="text"> 
    669              <string>Home</string> 
    670             </property> 
    671             <property name="icon"> 
    672              <iconset resource="SoftwareManager.qrc"> 
    673               <normaloff>:/icons/go-home.png</normaloff>:/icons/go-home.png</iconset> 
    674             </property> 
    675             <property name="toolButtonStyle"> 
    676              <enum>Qt::ToolButtonIconOnly</enum> 
    677             </property> 
    678            </widget> 
    679           </item> 
    680           <item> 
    681            <widget class="QToolButton" name="tool_browse_gotocat"> 
    682             <property name="text"> 
    683              <string>Browse Categories</string> 
    684             </property> 
    685             <property name="icon"> 
    686              <iconset resource="SoftwareManager.qrc"> 
    687               <normaloff>:/icons/xdg_menu.png</normaloff>:/icons/xdg_menu.png</iconset> 
    688             </property> 
    689             <property name="popupMode"> 
    690              <enum>QToolButton::InstantPopup</enum> 
    691             </property> 
    692             <property name="toolButtonStyle"> 
    693              <enum>Qt::ToolButtonTextBesideIcon</enum> 
    694             </property> 
    695            </widget> 
    696           </item> 
    697           <item> 
    698            <widget class="QToolButton" name="tool_browse_cat"> 
    699             <property name="text"> 
    700              <string>Category</string> 
    701             </property> 
    702             <property name="icon"> 
    703              <iconset resource="SoftwareManager.qrc"> 
    704               <normaloff>:/icons/xdg_menu.png</normaloff>:/icons/xdg_menu.png</iconset> 
    705             </property> 
    706             <property name="toolButtonStyle"> 
    707              <enum>Qt::ToolButtonTextBesideIcon</enum> 
    708             </property> 
    709            </widget> 
    710           </item> 
    711           <item> 
    712            <widget class="QToolButton" name="tool_browse_app"> 
    713             <property name="text"> 
    714              <string>App</string> 
    715             </property> 
    716             <property name="icon"> 
    717              <iconset resource="SoftwareManager.qrc"> 
    718               <normaloff>:/icons/appcafe.png</normaloff>:/icons/appcafe.png</iconset> 
    719             </property> 
    720             <property name="toolButtonStyle"> 
    721              <enum>Qt::ToolButtonTextBesideIcon</enum> 
    722             </property> 
    723            </widget> 
    724           </item> 
    725           <item> 
    726            <spacer name="horizontalSpacer_3"> 
    727             <property name="orientation"> 
    728              <enum>Qt::Horizontal</enum> 
    729             </property> 
    730             <property name="sizeHint" stdset="0"> 
    731              <size> 
    732               <width>40</width> 
    733               <height>20</height> 
    734              </size> 
    735             </property> 
    736            </spacer> 
    737           </item> 
    738           <item> 
    739            <widget class="QLineEdit" name="line_browse_searchbar"> 
    740             <property name="placeholderText"> 
    741              <string>Search Here</string> 
    742             </property> 
    743            </widget> 
    744           </item> 
    745           <item> 
    746            <widget class="QToolButton" name="tool_browse_search"> 
    747             <property name="text"> 
    748              <string>Search</string> 
    749             </property> 
    750             <property name="icon"> 
    751              <iconset resource="SoftwareManager.qrc"> 
    752               <normaloff>:/icons/edit-find.png</normaloff>:/icons/edit-find.png</iconset> 
    753             </property> 
    754            </widget> 
    755           </item> 
    756          </layout> 
    757         </item> 
    758         <item> 
    759          <widget class="QStackedWidget" name="stacked_browser"> 
    760           <property name="styleSheet"> 
    761            <string notr="true">QWidget#page_home, QWidget#page_cat, QWidget#page_app, QWidget#page_search, QWidget#page_browsecats{ 
     397            <item> 
     398             <widget class="QStackedWidget" name="stacked_browser"> 
     399              <property name="styleSheet"> 
     400               <string notr="true">QWidget#page_home, QWidget#page_cat, QWidget#page_app, QWidget#page_search, QWidget#page_browsecats{ 
    762401background-image: url(:/browserBackground.png); 
    763402background-position: left bottom; 
     
    766405} 
    767406QWidget{ 
    768 background: transparent; 
     407  background: transparent; 
    769408} 
    770409QGroupBox{ 
     
    772411} 
    773412QToolButton{ 
    774   background-color: rgba(145,142,140,80); 
     413  background-color: rgba(145,142,140,120); 
    775414 border: 1px solid grey; 
    776415 border-radius: 5px; 
    777416} 
    778417QToolButton:hover{ 
    779  background-color: rgba(145,142,140,80); 
     418 background-color: rgba(145,142,140,120); 
    780419 border: 1px solid rgba(140,140,250,230); 
    781420 border-radius: 5px; 
     
    792431} 
    793432QScrollArea{  
    794   background-color: rgba(190,190,190,30); 
    795  border: 1px solid grey; 
    796  border-radius: 5px; 
     433background-color: rgba(250,250,250,200);  
     434border-width: 0px;  
     435border-radius: 5px; 
     436} 
     437 
     438QToolTip{  
     439background: rgb(230,230,230);  
     440border: 1px solid grey; 
     441border-radius: 3px; 
     442padding: 1px; 
     443color: black; 
     444} 
     445 
     446QTabWidget, QTabBar{  
     447background-color: rgba(250,250,250,100);  
    797448}</string> 
    798           </property> 
    799           <property name="frameShape"> 
    800            <enum>QFrame::StyledPanel</enum> 
    801           </property> 
    802           <property name="currentIndex"> 
    803            <number>1</number> 
    804           </property> 
    805           <widget class="QWidget" name="page_home"> 
    806            <layout class="QGridLayout" name="gridLayout"> 
    807             <item row="0" column="0" colspan="2"> 
    808              <widget class="QGroupBox" name="group_br_home_newapps"> 
    809               <property name="sizePolicy"> 
    810                <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
    811                 <horstretch>0</horstretch> 
    812                 <verstretch>0</verstretch> 
    813                </sizepolicy> 
    814449              </property> 
    815               <property name="styleSheet"> 
    816                <string notr="true">QGroupBox::indicator:unchecked{ 
     450              <property name="frameShape"> 
     451               <enum>QFrame::StyledPanel</enum> 
     452              </property> 
     453              <property name="currentIndex"> 
     454               <number>3</number> 
     455              </property> 
     456              <widget class="QWidget" name="page_home"> 
     457               <layout class="QGridLayout" name="gridLayout"> 
     458                <item row="0" column="0" colspan="2"> 
     459                 <widget class="QGroupBox" name="group_br_home_newapps"> 
     460                  <property name="sizePolicy"> 
     461                   <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
     462                    <horstretch>0</horstretch> 
     463                    <verstretch>0</verstretch> 
     464                   </sizepolicy> 
     465                  </property> 
     466                  <property name="styleSheet"> 
     467                   <string notr="true">QGroupBox::indicator:unchecked{ 
    817468image: url(:icons/arrow-down.png); 
    818469} 
     
    823474spacing: 1px; 
    824475}</string> 
    825               </property> 
    826               <property name="title"> 
    827                <string>View Recent Additions</string> 
    828               </property> 
    829               <property name="alignment"> 
    830                <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    831               </property> 
    832               <property name="checkable"> 
    833                <bool>true</bool> 
    834               </property> 
    835               <property name="checked"> 
    836                <bool>true</bool> 
    837               </property> 
    838               <layout class="QVBoxLayout" name="verticalLayout_5"> 
    839                <item> 
    840                 <widget class="QScrollArea" name="scroll_br_home_newapps"> 
    841                  <property name="sizePolicy"> 
    842                   <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> 
    843                    <horstretch>0</horstretch> 
    844                    <verstretch>0</verstretch> 
    845                   </sizepolicy> 
    846                  </property> 
    847                  <property name="minimumSize"> 
    848                   <size> 
    849                    <width>0</width> 
    850                    <height>0</height> 
    851                   </size> 
    852                  </property> 
    853                  <property name="verticalScrollBarPolicy"> 
    854                   <enum>Qt::ScrollBarAlwaysOff</enum> 
    855                  </property> 
    856                  <property name="horizontalScrollBarPolicy"> 
    857                   <enum>Qt::ScrollBarAsNeeded</enum> 
    858                  </property> 
    859                  <property name="widgetResizable"> 
    860                   <bool>true</bool> 
    861                  </property> 
    862                  <property name="alignment"> 
    863                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    864                  </property> 
    865                  <widget class="QWidget" name="scroll_br_home_newapps_contents"> 
    866                   <property name="geometry"> 
    867                    <rect> 
    868                     <x>0</x> 
    869                     <y>0</y> 
    870                     <width>98</width> 
    871                     <height>28</height> 
    872                    </rect> 
    873                   </property> 
    874                   <layout class="QHBoxLayout" name="horizontalLayout_5"/> 
    875                  </widget> 
    876                 </widget> 
    877                </item> 
    878               </layout> 
    879              </widget> 
    880             </item> 
    881             <item row="1" column="0"> 
    882              <widget class="QGroupBox" name="group_br_recommend"> 
    883               <property name="title"> 
    884                <string>PC-BSD Recommendations</string> 
    885               </property> 
    886               <layout class="QVBoxLayout" name="verticalLayout_13"> 
    887                <item> 
    888                 <widget class="QScrollArea" name="scroll_br_home_rec"> 
    889                  <property name="sizePolicy"> 
    890                   <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding"> 
    891                    <horstretch>0</horstretch> 
    892                    <verstretch>0</verstretch> 
    893                   </sizepolicy> 
    894                  </property> 
    895                  <property name="styleSheet"> 
    896                   <string notr="true"/> 
    897                  </property> 
    898                  <property name="verticalScrollBarPolicy"> 
    899                   <enum>Qt::ScrollBarAsNeeded</enum> 
    900                  </property> 
    901                  <property name="widgetResizable"> 
    902                   <bool>true</bool> 
    903                  </property> 
    904                  <property name="alignment"> 
    905                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> 
    906                  </property> 
    907                  <widget class="QWidget" name="scroll_br_home_cats_contents"> 
    908                   <property name="geometry"> 
    909                    <rect> 
    910                     <x>0</x> 
    911                     <y>0</y> 
    912                     <width>98</width> 
    913                     <height>28</height> 
    914                    </rect> 
    915                   </property> 
    916                   <layout class="QVBoxLayout" name="verticalLayout_6"/> 
    917                  </widget> 
    918                 </widget> 
    919                </item> 
    920               </layout> 
    921              </widget> 
    922             </item> 
    923            </layout> 
    924           </widget> 
    925           <widget class="QWidget" name="page_cat"> 
    926            <layout class="QVBoxLayout" name="verticalLayout_9"> 
    927             <item> 
    928              <layout class="QHBoxLayout" name="horizontalLayout_2"> 
    929               <item> 
    930                <widget class="QLabel" name="label_cat_icon"> 
    931                 <property name="maximumSize"> 
    932                  <size> 
    933                   <width>32</width> 
    934                   <height>32</height> 
    935                  </size> 
    936                 </property> 
    937                 <property name="text"> 
    938                  <string notr="true"/> 
    939                 </property> 
    940                 <property name="pixmap"> 
    941                  <pixmap resource="SoftwareManager.qrc">:/icons/appcafe.png</pixmap> 
    942                 </property> 
    943                 <property name="scaledContents"> 
    944                  <bool>true</bool> 
    945                 </property> 
    946                </widget> 
    947               </item> 
    948               <item> 
    949                <widget class="QLabel" name="label_cat_name"> 
    950                 <property name="font"> 
    951                  <font> 
    952                   <pointsize>11</pointsize> 
    953                   <weight>75</weight> 
    954                   <bold>true</bold> 
    955                  </font> 
    956                 </property> 
    957                 <property name="text"> 
    958                  <string>Category</string> 
    959                 </property> 
    960                </widget> 
    961               </item> 
    962              </layout> 
    963             </item> 
    964             <item> 
    965              <widget class="QScrollArea" name="scroll_br_cat_apps"> 
    966               <property name="widgetResizable"> 
    967                <bool>true</bool> 
    968               </property> 
    969               <widget class="QWidget" name="scrollAreaWidgetContents_4"> 
    970                <property name="geometry"> 
    971                 <rect> 
    972                  <x>0</x> 
    973                  <y>0</y> 
    974                  <width>435</width> 
    975                  <height>344</height> 
    976                 </rect> 
    977                </property> 
    978                <layout class="QVBoxLayout" name="verticalLayout_23"/> 
    979               </widget> 
    980              </widget> 
    981             </item> 
    982            </layout> 
    983           </widget> 
    984           <widget class="QWidget" name="page_browsecats"> 
    985            <layout class="QVBoxLayout" name="verticalLayout_7"> 
    986             <item> 
    987              <widget class="QScrollArea" name="scroll_br_cats"> 
    988               <property name="widgetResizable"> 
    989                <bool>true</bool> 
    990               </property> 
    991               <widget class="QWidget" name="scrollAreaWidgetContents_5"> 
    992                <property name="geometry"> 
    993                 <rect> 
    994                  <x>0</x> 
    995                  <y>0</y> 
    996                  <width>98</width> 
    997                  <height>28</height> 
    998                 </rect> 
    999                </property> 
    1000                <layout class="QVBoxLayout" name="verticalLayout_24"/> 
    1001               </widget> 
    1002              </widget> 
    1003             </item> 
    1004            </layout> 
    1005           </widget> 
    1006           <widget class="QWidget" name="page_app"> 
    1007            <layout class="QVBoxLayout" name="verticalLayout_14"> 
    1008             <item> 
    1009              <layout class="QHBoxLayout" name="horizontalLayout_7"> 
    1010               <item> 
    1011                <widget class="QLabel" name="label_bapp_icon"> 
    1012                 <property name="maximumSize"> 
    1013                  <size> 
    1014                   <width>64</width> 
    1015                   <height>64</height> 
    1016                  </size> 
    1017                 </property> 
    1018                 <property name="text"> 
    1019                  <string/> 
    1020                 </property> 
    1021                 <property name="pixmap"> 
    1022                  <pixmap resource="SoftwareManager.qrc">:/icons/appcafe.png</pixmap> 
    1023                 </property> 
    1024                 <property name="scaledContents"> 
    1025                  <bool>true</bool> 
    1026                 </property> 
    1027                </widget> 
    1028               </item> 
    1029               <item> 
    1030                <layout class="QVBoxLayout" name="verticalLayout_12"> 
    1031                 <item> 
    1032                  <spacer name="verticalSpacer_4"> 
    1033                   <property name="orientation"> 
    1034                    <enum>Qt::Vertical</enum> 
    1035                   </property> 
    1036                   <property name="sizeHint" stdset="0"> 
    1037                    <size> 
    1038                     <width>20</width> 
    1039                     <height>40</height> 
    1040                    </size> 
    1041                   </property> 
    1042                  </spacer> 
    1043                 </item> 
    1044                 <item> 
    1045                  <widget class="QLabel" name="label_bapp_name"> 
    1046                   <property name="font"> 
    1047                    <font> 
    1048                     <pointsize>13</pointsize> 
    1049                     <weight>75</weight> 
    1050                     <bold>true</bold> 
    1051                    </font> 
    1052                   </property> 
    1053                   <property name="text"> 
    1054                    <string notr="true">Sample Application</string> 
    1055                   </property> 
    1056                   <property name="scaledContents"> 
    1057                    <bool>false</bool> 
    1058                   </property> 
     476                  </property> 
     477                  <property name="title"> 
     478                   <string>New Applications</string> 
     479                  </property> 
     480                  <property name="alignment"> 
     481                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     482                  </property> 
     483                  <property name="checkable"> 
     484                   <bool>true</bool> 
     485                  </property> 
     486                  <property name="checked"> 
     487                   <bool>true</bool> 
     488                  </property> 
     489                  <layout class="QVBoxLayout" name="verticalLayout_5"> 
     490                   <item> 
     491                    <widget class="QScrollArea" name="scroll_br_home_newapps"> 
     492                     <property name="sizePolicy"> 
     493                      <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> 
     494                       <horstretch>0</horstretch> 
     495                       <verstretch>0</verstretch> 
     496                      </sizepolicy> 
     497                     </property> 
     498                     <property name="minimumSize"> 
     499                      <size> 
     500                       <width>0</width> 
     501                       <height>0</height> 
     502                      </size> 
     503                     </property> 
     504                     <property name="verticalScrollBarPolicy"> 
     505                      <enum>Qt::ScrollBarAlwaysOff</enum> 
     506                     </property> 
     507                     <property name="horizontalScrollBarPolicy"> 
     508                      <enum>Qt::ScrollBarAsNeeded</enum> 
     509                     </property> 
     510                     <property name="widgetResizable"> 
     511                      <bool>true</bool> 
     512                     </property> 
     513                     <property name="alignment"> 
     514                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     515                     </property> 
     516                     <widget class="QWidget" name="scroll_br_home_newapps_contents"> 
     517                      <property name="geometry"> 
     518                       <rect> 
     519                        <x>0</x> 
     520                        <y>0</y> 
     521                        <width>72</width> 
     522                        <height>16</height> 
     523                       </rect> 
     524                      </property> 
     525                      <layout class="QHBoxLayout" name="horizontalLayout_5"/> 
     526                     </widget> 
     527                    </widget> 
     528                   </item> 
     529                  </layout> 
    1059530                 </widget> 
    1060531                </item> 
    1061                 <item> 
    1062                  <widget class="QLabel" name="label_bapp_authorweb"> 
    1063                   <property name="text"> 
    1064                    <string notr="true">&lt;a href=http://www.pcbsd.org&gt;The PC-BSD Project&lt;/a&gt;</string> 
    1065                   </property> 
    1066                   <property name="openExternalLinks"> 
    1067                    <bool>true</bool> 
    1068                   </property> 
     532                <item row="2" column="0"> 
     533                 <widget class="QGroupBox" name="group_br_recommend"> 
     534                  <property name="title"> 
     535                   <string>PC-BSD Recommendations</string> 
     536                  </property> 
     537                  <layout class="QVBoxLayout" name="verticalLayout_13"> 
     538                   <item> 
     539                    <widget class="QScrollArea" name="scroll_br_home_rec"> 
     540                     <property name="sizePolicy"> 
     541                      <sizepolicy hsizetype="Expanding" vsizetype="MinimumExpanding"> 
     542                       <horstretch>0</horstretch> 
     543                       <verstretch>0</verstretch> 
     544                      </sizepolicy> 
     545                     </property> 
     546                     <property name="styleSheet"> 
     547                      <string notr="true"/> 
     548                     </property> 
     549                     <property name="verticalScrollBarPolicy"> 
     550                      <enum>Qt::ScrollBarAsNeeded</enum> 
     551                     </property> 
     552                     <property name="widgetResizable"> 
     553                      <bool>true</bool> 
     554                     </property> 
     555                     <property name="alignment"> 
     556                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> 
     557                     </property> 
     558                     <widget class="QWidget" name="scroll_br_home_cats_contents"> 
     559                      <property name="geometry"> 
     560                       <rect> 
     561                        <x>0</x> 
     562                        <y>0</y> 
     563                        <width>51</width> 
     564                        <height>16</height> 
     565                       </rect> 
     566                      </property> 
     567                      <layout class="QVBoxLayout" name="verticalLayout_6"/> 
     568                     </widget> 
     569                    </widget> 
     570                   </item> 
     571                  </layout> 
    1069572                 </widget> 
    1070573                </item> 
    1071                 <item> 
    1072                  <spacer name="verticalSpacer_3"> 
    1073                   <property name="orientation"> 
    1074                    <enum>Qt::Vertical</enum> 
    1075                   </property> 
    1076                   <property name="sizeHint" stdset="0"> 
    1077                    <size> 
    1078                     <width>20</width> 
    1079                     <height>40</height> 
    1080                    </size> 
    1081                   </property> 
    1082                  </spacer> 
     574                <item row="1" column="0"> 
     575                 <widget class="QGroupBox" name="group_br_home_spotlight"> 
     576                  <property name="title"> 
     577                   <string>Application Spotlight</string> 
     578                  </property> 
     579                  <property name="checkable"> 
     580                   <bool>false</bool> 
     581                  </property> 
     582                  <layout class="QVBoxLayout" name="verticalLayout_17"> 
     583                   <item> 
     584                    <widget class="QScrollArea" name="scroll_br_home_spot"> 
     585                     <property name="widgetResizable"> 
     586                      <bool>true</bool> 
     587                     </property> 
     588                     <widget class="QWidget" name="scrollAreaWidgetContents_6"> 
     589                      <property name="geometry"> 
     590                       <rect> 
     591                        <x>0</x> 
     592                        <y>0</y> 
     593                        <width>51</width> 
     594                        <height>16</height> 
     595                       </rect> 
     596                      </property> 
     597                     </widget> 
     598                    </widget> 
     599                   </item> 
     600                  </layout> 
     601                 </widget> 
    1083602                </item> 
    1084603               </layout> 
    1085               </item> 
    1086               <item> 
    1087                <spacer name="horizontalSpacer_4"> 
    1088                 <property name="orientation"> 
    1089                  <enum>Qt::Horizontal</enum> 
    1090                 </property> 
    1091                 <property name="sizeHint" stdset="0"> 
    1092                  <size> 
    1093                   <width>40</width> 
    1094                   <height>20</height> 
    1095                  </size> 
    1096                 </property> 
    1097                </spacer> 
    1098               </item> 
    1099               <item> 
    1100                <layout class="QVBoxLayout" name="verticalLayout_11"> 
     604              </widget> 
     605              <widget class="QWidget" name="page_cat"> 
     606               <layout class="QVBoxLayout" name="verticalLayout_9"> 
    1101607                <item> 
    1102                  <layout class="QHBoxLayout" name="horizontalLayout_8"> 
     608                 <layout class="QHBoxLayout" name="horizontalLayout_2"> 
    1103609                  <item> 
    1104                    <spacer name="horizontalSpacer_8"> 
    1105                     <property name="orientation"> 
    1106                      <enum>Qt::Horizontal</enum> 
    1107                     </property> 
    1108                     <property name="sizeType"> 
    1109                      <enum>QSizePolicy::MinimumExpanding</enum> 
    1110                     </property> 
    1111                     <property name="sizeHint" stdset="0"> 
     610                   <widget class="QLabel" name="label_cat_icon"> 
     611                    <property name="maximumSize"> 
    1112612                     <size> 
    1113                       <width>0</width> 
    1114                       <height>20</height> 
     613                      <width>32</width> 
     614                      <height>32</height> 
    1115615                     </size> 
    1116616                    </property> 
    1117                    </spacer> 
     617                    <property name="text"> 
     618                     <string notr="true"/> 
     619                    </property> 
     620                    <property name="pixmap"> 
     621                     <pixmap resource="SoftwareManager.qrc">:/icons/appcafe.png</pixmap> 
     622                    </property> 
     623                    <property name="scaledContents"> 
     624                     <bool>true</bool> 
     625                    </property> 
     626                   </widget> 
    1118627                  </item> 
    1119628                  <item> 
    1120                    <widget class="QToolButton" name="tool_bapp_download"> 
    1121                     <property name="sizePolicy"> 
    1122                      <sizepolicy hsizetype="Minimum" vsizetype="Preferred"> 
    1123                       <horstretch>0</horstretch> 
    1124                       <verstretch>0</verstretch> 
    1125                      </sizepolicy> 
    1126                     </property> 
     629                   <widget class="QLabel" name="label_cat_name"> 
    1127630                    <property name="font"> 
    1128631                     <font> 
     632                      <pointsize>11</pointsize> 
    1129633                      <weight>75</weight> 
    1130634                      <bold>true</bold> 
     
    1132636                    </property> 
    1133637                    <property name="text"> 
    1134                      <string notr="true">Install Now!</string> 
    1135                     </property> 
    1136                     <property name="icon"> 
    1137                      <iconset resource="SoftwareManager.qrc"> 
    1138                       <normaloff>:/icons/app_download.png</normaloff>:/icons/app_download.png</iconset> 
    1139                     </property> 
    1140                     <property name="iconSize"> 
    1141                      <size> 
    1142                       <width>48</width> 
    1143                       <height>48</height> 
    1144                      </size> 
    1145                     </property> 
    1146                     <property name="toolButtonStyle"> 
    1147                      <enum>Qt::ToolButtonTextUnderIcon</enum> 
     638                     <string>Category</string> 
    1148639                    </property> 
    1149640                   </widget> 
     
    1152643                </item> 
    1153644                <item> 
    1154                  <layout class="QFormLayout" name="formLayout_5"> 
    1155                   <property name="fieldGrowthPolicy"> 
    1156                    <enum>QFormLayout::ExpandingFieldsGrow</enum> 
    1157                   </property> 
     645                 <widget class="QLabel" name="label_br_cat_empty"> 
     646                  <property name="font"> 
     647                   <font> 
     648                    <weight>75</weight> 
     649                    <bold>true</bold> 
     650                   </font> 
     651                  </property> 
     652                  <property name="styleSheet"> 
     653                   <string notr="true">background-color: rgba(255,0,0,150); border-radius: 5px;</string> 
     654                  </property> 
     655                  <property name="text"> 
     656                   <string>No applications in this category match the current browser view options.</string> 
     657                  </property> 
     658                  <property name="alignment"> 
     659                   <set>Qt::AlignCenter</set> 
     660                  </property> 
     661                 </widget> 
     662                </item> 
     663                <item> 
     664                 <widget class="QScrollArea" name="scroll_br_cat_apps"> 
     665                  <property name="widgetResizable"> 
     666                   <bool>true</bool> 
     667                  </property> 
     668                  <widget class="QWidget" name="scrollAreaWidgetContents_4"> 
     669                   <property name="geometry"> 
     670                    <rect> 
     671                     <x>0</x> 
     672                     <y>0</y> 
     673                     <width>73</width> 
     674                     <height>16</height> 
     675                    </rect> 
     676                   </property> 
     677                   <layout class="QVBoxLayout" name="verticalLayout_23"/> 
     678                  </widget> 
     679                 </widget> 
     680                </item> 
     681               </layout> 
     682              </widget> 
     683              <widget class="QWidget" name="page_browsecats"> 
     684               <layout class="QVBoxLayout" name="verticalLayout_7"> 
     685                <item> 
     686                 <widget class="QScrollArea" name="scroll_br_cats"> 
     687                  <property name="widgetResizable"> 
     688                   <bool>true</bool> 
     689                  </property> 
     690                  <widget class="QWidget" name="scrollAreaWidgetContents_5"> 
     691                   <property name="geometry"> 
     692                    <rect> 
     693                     <x>0</x> 
     694                     <y>0</y> 
     695                     <width>88</width> 
     696                     <height>18</height> 
     697                    </rect> 
     698                   </property> 
     699                   <layout class="QVBoxLayout" name="verticalLayout_24"/> 
     700                  </widget> 
     701                 </widget> 
     702                </item> 
     703               </layout> 
     704              </widget> 
     705              <widget class="QWidget" name="page_app"> 
     706               <layout class="QVBoxLayout" name="verticalLayout_14"> 
     707                <item> 
     708                 <layout class="QGridLayout" name="gridLayout_3"> 
     709                  <item row="0" column="1"> 
     710                   <layout class="QVBoxLayout" name="verticalLayout_12"> 
     711                    <property name="spacing"> 
     712                     <number>2</number> 
     713                    </property> 
     714                    <item> 
     715                     <widget class="QLabel" name="label_bapp_name"> 
     716                      <property name="font"> 
     717                       <font> 
     718                        <pointsize>13</pointsize> 
     719                        <weight>75</weight> 
     720                        <bold>true</bold> 
     721                       </font> 
     722                      </property> 
     723                      <property name="text"> 
     724                       <string notr="true">Sample Application</string> 
     725                      </property> 
     726                      <property name="scaledContents"> 
     727                       <bool>false</bool> 
     728                      </property> 
     729                     </widget> 
     730                    </item> 
     731                    <item> 
     732                     <layout class="QHBoxLayout" name="horizontalLayout_15"> 
     733                      <item> 
     734                       <widget class="QToolButton" name="tool_app_openweb"> 
     735                        <property name="toolTip"> 
     736                         <string>Open application website in browser</string> 
     737                        </property> 
     738                        <property name="styleSheet"> 
     739                         <string notr="true">QToolButton{background: transparent; border-width: 0px;} 
     740QToolButton::hover{border: 1px solid rgba(100,120,255,200); }</string> 
     741                        </property> 
     742                        <property name="text"> 
     743                         <string>...</string> 
     744                        </property> 
     745                        <property name="icon"> 
     746                         <iconset resource="SoftwareManager.qrc"> 
     747                          <normaloff>:/icons/graphicalapp.png</normaloff>:/icons/graphicalapp.png</iconset> 
     748                        </property> 
     749                       </widget> 
     750                      </item> 
     751                      <item> 
     752                       <widget class="QLabel" name="label_bapp_authorweb"> 
     753                        <property name="text"> 
     754                         <string notr="true">&lt;a href=http://www.pcbsd.org&gt;The PC-BSD Project&lt;/a&gt;</string> 
     755                        </property> 
     756                        <property name="openExternalLinks"> 
     757                         <bool>true</bool> 
     758                        </property> 
     759                       </widget> 
     760                      </item> 
     761                     </layout> 
     762                    </item> 
     763                    <item> 
     764                     <layout class="QHBoxLayout" name="horizontalLayout_16"> 
     765                      <item> 
     766                       <widget class="QToolButton" name="tool_app_rank"> 
     767                        <property name="font"> 
     768                         <font> 
     769                          <weight>75</weight> 
     770                          <bold>true</bold> 
     771                         </font> 
     772                        </property> 
     773                        <property name="toolTip"> 
     774                         <string>Rate this application on the PC-BSD wiki</string> 
     775                        </property> 
     776                        <property name="styleSheet"> 
     777                         <string notr="true">QToolButton{background: transparent; border-width: 0px;} 
     778QToolButton::hover{border: 1px solid rgba(100,120,255,200); }</string> 
     779                        </property> 
     780                        <property name="text"> 
     781                         <string notr="true">Rank</string> 
     782                        </property> 
     783                        <property name="icon"> 
     784                         <iconset resource="SoftwareManager.qrc"> 
     785                          <normaloff>:/icons/favorite.png</normaloff>:/icons/favorite.png</iconset> 
     786                        </property> 
     787                        <property name="toolButtonStyle"> 
     788                         <enum>Qt::ToolButtonTextBesideIcon</enum> 
     789                        </property> 
     790                       </widget> 
     791                      </item> 
     792                      <item> 
     793                       <widget class="QToolButton" name="tool_app_tips"> 
     794                        <property name="text"> 
     795                         <string>User Tips</string> 
     796                        </property> 
     797                        <property name="icon"> 
     798                         <iconset resource="SoftwareManager.qrc"> 
     799                          <normaloff>:/icons/info-tips.png</normaloff>:/icons/info-tips.png</iconset> 
     800                        </property> 
     801                        <property name="toolButtonStyle"> 
     802                         <enum>Qt::ToolButtonTextBesideIcon</enum> 
     803                        </property> 
     804                       </widget> 
     805                      </item> 
     806                     </layout> 
     807                    </item> 
     808                    <item> 
     809                     <spacer name="verticalSpacer_3"> 
     810                      <property name="orientation"> 
     811                       <enum>Qt::Vertical</enum> 
     812                      </property> 
     813                      <property name="sizeHint" stdset="0"> 
     814                       <size> 
     815                        <width>20</width> 
     816                        <height>40</height> 
     817                       </size> 
     818                      </property> 
     819                     </spacer> 
     820                    </item> 
     821                   </layout> 
     822                  </item> 
     823                  <item row="0" column="2"> 
     824                   <spacer name="horizontalSpacer_4"> 
     825                    <property name="orientation"> 
     826                     <enum>Qt::Horizontal</enum> 
     827                    </property> 
     828                    <property name="sizeHint" stdset="0"> 
     829                     <size> 
     830                      <width>40</width> 
     831                      <height>20</height> 
     832                     </size> 
     833                    </property> 
     834                   </spacer> 
     835                  </item> 
    1158836                  <item row="0" column="0"> 
    1159                    <widget class="QLabel" name="label_9"> 
    1160                     <property name="font"> 
    1161                      <font> 
    1162                       <weight>50</weight> 
    1163                       <italic>true</italic> 
    1164                       <bold>false</bold> 
    1165                      </font> 
     837                   <layout class="QVBoxLayout" name="verticalLayout_28"> 
     838                    <item> 
     839                     <widget class="QLabel" name="label_bapp_icon"> 
     840                      <property name="maximumSize"> 
     841                       <size> 
     842                        <width>64</width> 
     843                        <height>64</height> 
     844                       </size> 
     845                      </property> 
     846                      <property name="text"> 
     847                       <string/> 
     848                      </property> 
     849                      <property name="pixmap"> 
     850                       <pixmap resource="SoftwareManager.qrc">:/icons/appcafe.png</pixmap> 
     851                      </property> 
     852                      <property name="scaledContents"> 
     853                       <bool>true</bool> 
     854                      </property> 
     855                     </widget> 
     856                    </item> 
     857                    <item> 
     858                     <spacer name="verticalSpacer_4"> 
     859                      <property name="orientation"> 
     860                       <enum>Qt::Vertical</enum> 
     861                      </property> 
     862                      <property name="sizeHint" stdset="0"> 
     863                       <size> 
     864                        <width>20</width> 
     865                        <height>40</height> 
     866                       </size> 
     867                      </property> 
     868                     </spacer> 
     869                    </item> 
     870                   </layout> 
     871                  </item> 
     872                  <item row="1" column="0" colspan="3"> 
     873                   <widget class="QGroupBox" name="group_app_installed"> 
     874                    <property name="title"> 
     875                     <string/> 
    1166876                    </property> 
    1167                     <property name="text"> 
    1168                      <string>Version:</string> 
    1169                     </property> 
     877                    <layout class="QHBoxLayout" name="horizontalLayout_7"> 
     878                     <property name="margin"> 
     879                      <number>1</number> 
     880                     </property> 
     881                     <item> 
     882                      <widget class="QToolButton" name="tool_install_startApp"> 
     883                       <property name="sizePolicy"> 
     884                        <sizepolicy hsizetype="Fixed" vsizetype="Fixed"> 
     885                         <horstretch>0</horstretch> 
     886                         <verstretch>0</verstretch> 
     887                        </sizepolicy> 
     888                       </property> 
     889                       <property name="statusTip"> 
     890                        <string>Start the application</string> 
     891                       </property> 
     892                       <property name="layoutDirection"> 
     893                        <enum>Qt::LeftToRight</enum> 
     894                       </property> 
     895                       <property name="text"> 
     896                        <string>Launch</string> 
     897                       </property> 
     898                       <property name="icon"> 
     899                        <iconset resource="SoftwareManager.qrc"> 
     900                         <normaloff>:/icons/application.png</normaloff>:/icons/application.png</iconset> 
     901                       </property> 
     902                       <property name="iconSize"> 
     903                        <size> 
     904                         <width>20</width> 
     905                         <height>20</height> 
     906                        </size> 
     907                       </property> 
     908                       <property name="popupMode"> 
     909                        <enum>QToolButton::InstantPopup</enum> 
     910                       </property> 
     911                       <property name="toolButtonStyle"> 
     912                        <enum>Qt::ToolButtonTextBesideIcon</enum> 
     913                       </property> 
     914                      </widget> 
     915                     </item> 
     916                     <item> 
     917                      <widget class="QToolButton" name="tool_install_maintainer"> 
     918                       <property name="text"> 
     919                        <string>Contact Maintainer</string> 
     920                       </property> 
     921                       <property name="icon"> 
     922                        <iconset resource="SoftwareManager.qrc"> 
     923                         <normaloff>:/icons/email.png</normaloff>:/icons/email.png</iconset> 
     924                       </property> 
     925                       <property name="iconSize"> 
     926                        <size> 
     927                         <width>20</width> 
     928                         <height>20</height> 
     929                        </size> 
     930                       </property> 
     931                       <property name="popupMode"> 
     932                        <enum>QToolButton::InstantPopup</enum> 
     933                       </property> 
     934                       <property name="toolButtonStyle"> 
     935                        <enum>Qt::ToolButtonTextBesideIcon</enum> 
     936                       </property> 
     937                      </widget> 
     938                     </item> 
     939                     <item> 
     940                      <widget class="QToolButton" name="tool_install_shortcuts"> 
     941                       <property name="text"> 
     942                        <string>Shortcuts</string> 
     943                       </property> 
     944                       <property name="icon"> 
     945                        <iconset resource="SoftwareManager.qrc"> 
     946                         <normaloff>:/icons/config.png</normaloff>:/icons/config.png</iconset> 
     947                       </property> 
     948                       <property name="iconSize"> 
     949                        <size> 
     950                         <width>20</width> 
     951                         <height>20</height> 
     952                        </size> 
     953                       </property> 
     954                       <property name="popupMode"> 
     955                        <enum>QToolButton::InstantPopup</enum> 
     956                       </property> 
     957                       <property name="toolButtonStyle"> 
     958                        <enum>Qt::ToolButtonTextBesideIcon</enum> 
     959                       </property> 
     960                      </widget> 
     961                     </item> 
     962                     <item> 
     963                      <spacer name="horizontalSpacer_8"> 
     964                       <property name="orientation"> 
     965                        <enum>Qt::Horizontal</enum> 
     966                       </property> 
     967                       <property name="sizeHint" stdset="0"> 
     968                        <size> 
     969                         <width>40</width> 
     970                         <height>20</height> 
     971                        </size> 
     972                       </property> 
     973                      </spacer> 
     974                     </item> 
     975                    </layout> 
    1170976                   </widget> 
    1171977                  </item> 
    1172                   <item row="0" column="1"> 
    1173                    <widget class="QLabel" name="label_bapp_version"> 
    1174                     <property name="font"> 
    1175                      <font> 
    1176                       <weight>50</weight> 
    1177                       <italic>false</italic> 
    1178                       <bold>false</bold> 
    1179                      </font> 
    1180                     </property> 
    1181                     <property name="text"> 
    1182                      <string notr="true">x.xx.x</string> 
    1183                     </property> 
    1184                    </widget> 
    1185                   </item> 
    1186                   <item row="1" column="0"> 
    1187                    <widget class="QLabel" name="label_19"> 
    1188                     <property name="font"> 
    1189                      <font> 
    1190                       <weight>50</weight> 
    1191                       <italic>true</italic> 
    1192                       <bold>false</bold> 
    1193                      </font> 
    1194                     </property> 
    1195                     <property name="text"> 
    1196                      <string>Size:</string> 
    1197                     </property> 
    1198                    </widget> 
    1199                   </item> 
    1200                   <item row="1" column="1"> 
    1201                    <widget class="QLabel" name="label_bapp_size"> 
    1202                     <property name="text"> 
    1203                      <string notr="true">??.? MB</string> 
    1204                     </property> 
    1205                    </widget> 
     978                  <item row="0" column="3" rowspan="2"> 
     979                   <layout class="QVBoxLayout" name="verticalLayout_11"> 
     980                    <item> 
     981                     <layout class="QHBoxLayout" name="horizontalLayout_8"> 
     982                      <item> 
     983                       <widget class="QToolButton" name="tool_bapp_download"> 
     984                        <property name="sizePolicy"> 
     985                         <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
     986                          <horstretch>0</horstretch> 
     987                          <verstretch>0</verstretch> 
     988                         </sizepolicy> 
     989                        </property> 
     990                        <property name="minimumSize"> 
     991                         <size> 
     992                          <width>80</width> 
     993                          <height>0</height> 
     994                         </size> 
     995                        </property> 
     996                        <property name="font"> 
     997                         <font> 
     998                          <weight>75</weight> 
     999                          <bold>true</bold> 
     1000                         </font> 
     1001                        </property> 
     1002                        <property name="styleSheet"> 
     1003                         <string notr="true">QToolButton::menu-button{ 
     1004width: 14px; 
     1005}</string> 
     1006                        </property> 
     1007                        <property name="text"> 
     1008                         <string notr="true">Install</string> 
     1009                        </property> 
     1010                        <property name="icon"> 
     1011                         <iconset resource="SoftwareManager.qrc"> 
     1012                          <normaloff>:/icons/app_download.png</normaloff>:/icons/app_download.png</iconset> 
     1013                        </property> 
     1014                        <property name="iconSize"> 
     1015                         <size> 
     1016                          <width>48</width> 
     1017                          <height>48</height> 
     1018                         </size> 
     1019                        </property> 
     1020                        <property name="popupMode"> 
     1021                         <enum>QToolButton::MenuButtonPopup</enum> 
     1022                        </property> 
     1023                        <property name="toolButtonStyle"> 
     1024                         <enum>Qt::ToolButtonTextUnderIcon</enum> 
     1025                        </property> 
     1026                       </widget> 
     1027                      </item> 
     1028                     </layout> 
     1029                    </item> 
     1030                    <item> 
     1031                     <layout class="QFormLayout" name="formLayout_5"> 
     1032                      <property name="fieldGrowthPolicy"> 
     1033                       <enum>QFormLayout::ExpandingFieldsGrow</enum> 
     1034                      </property> 
     1035                      <property name="formAlignment"> 
     1036                       <set>Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing</set> 
     1037                      </property> 
     1038                      <property name="leftMargin"> 
     1039                       <number>3</number> 
     1040                      </property> 
     1041                      <property name="rightMargin"> 
     1042                       <number>3</number> 
     1043                      </property> 
     1044                      <item row="0" column="0"> 
     1045                       <widget class="QLabel" name="label_9"> 
     1046                        <property name="font"> 
     1047                         <font> 
     1048                          <weight>50</weight> 
     1049                          <italic>true</italic> 
     1050                          <bold>false</bold> 
     1051                         </font> 
     1052                        </property> 
     1053                        <property name="text"> 
     1054                         <string>Version:</string> 
     1055                        </property> 
     1056                       </widget> 
     1057                      </item> 
     1058                      <item row="0" column="1"> 
     1059                       <widget class="QLabel" name="label_bapp_version"> 
     1060                        <property name="font"> 
     1061                         <font> 
     1062                          <weight>50</weight> 
     1063                          <italic>false</italic> 
     1064                          <bold>false</bold> 
     1065                         </font> 
     1066                        </property> 
     1067                        <property name="text"> 
     1068                         <string notr="true">x.xx.x</string> 
     1069                        </property> 
     1070                       </widget> 
     1071                      </item> 
     1072                      <item row="1" column="0"> 
     1073                       <widget class="QLabel" name="label_19"> 
     1074                        <property name="font"> 
     1075                         <font> 
     1076                          <weight>50</weight> 
     1077                          <italic>true</italic> 
     1078                          <bold>false</bold> 
     1079                         </font> 
     1080                        </property> 
     1081                        <property name="text"> 
     1082                         <string>Size:</string> 
     1083                        </property> 
     1084                       </widget> 
     1085                      </item> 
     1086                      <item row="1" column="1"> 
     1087                       <widget class="QLabel" name="label_bapp_size"> 
     1088                        <property name="text"> 
     1089                         <string notr="true">??.? MB</string> 
     1090                        </property> 
     1091                       </widget> 
     1092                      </item> 
     1093                     </layout> 
     1094                    </item> 
     1095                   </layout> 
    12061096                  </item> 
    12071097                 </layout> 
    12081098                </item> 
    1209                </layout> 
    1210               </item> 
    1211              </layout> 
    1212             </item> 
    1213             <item> 
    1214              <widget class="Line" name="line"> 
    1215               <property name="orientation"> 
    1216                <enum>Qt::Horizontal</enum> 
    1217               </property> 
    1218              </widget> 
    1219             </item> 
    1220             <item> 
    1221              <widget class="QGroupBox" name="group_bapp_info"> 
    1222               <property name="title"> 
    1223                <string>Application Information</string> 
    1224               </property> 
    1225               <layout class="QVBoxLayout" name="verticalLayout_15"> 
    1226                <item> 
    1227                 <layout class="QHBoxLayout" name="horizontalLayout_3"> 
    1228                  <item> 
    1229                   <layout class="QFormLayout" name="formLayout_3"> 
    1230                    <property name="fieldGrowthPolicy"> 
    1231                     <enum>QFormLayout::ExpandingFieldsGrow</enum> 
     1099                <item> 
     1100                 <widget class="Line" name="line"> 
     1101                  <property name="orientation"> 
     1102                   <enum>Qt::Horizontal</enum> 
     1103                  </property> 
     1104                 </widget> 
     1105                </item> 
     1106                <item> 
     1107                 <widget class="QGroupBox" name="group_bapp_info"> 
     1108                  <property name="title"> 
     1109                   <string>Application Information</string> 
     1110                  </property> 
     1111                  <layout class="QVBoxLayout" name="verticalLayout_15"> 
     1112                   <property name="leftMargin"> 
     1113                    <number>3</number> 
    12321114                   </property> 
    1233                    <item row="0" column="0"> 
    1234                     <widget class="QLabel" name="label_11"> 
    1235                      <property name="font"> 
    1236                       <font> 
    1237                        <weight>75</weight> 
    1238                        <bold>true</bold> 
    1239                       </font> 
    1240                      </property> 
    1241                      <property name="text"> 
    1242                       <string>Platform:</string> 
    1243                      </property> 
    1244                     </widget> 
     1115                   <property name="topMargin"> 
     1116                    <number>1</number> 
     1117                   </property> 
     1118                   <property name="rightMargin"> 
     1119                    <number>3</number> 
     1120                   </property> 
     1121                   <property name="bottomMargin"> 
     1122                    <number>1</number> 
     1123                   </property> 
     1124                   <item> 
     1125                    <layout class="QHBoxLayout" name="horizontalLayout_3"> 
     1126                     <item> 
     1127                      <layout class="QFormLayout" name="formLayout_3"> 
     1128                       <property name="fieldGrowthPolicy"> 
     1129                        <enum>QFormLayout::ExpandingFieldsGrow</enum> 
     1130                       </property> 
     1131                       <item row="0" column="0"> 
     1132                        <widget class="QLabel" name="label_11"> 
     1133                         <property name="font"> 
     1134                          <font> 
     1135                           <weight>75</weight> 
     1136                           <bold>true</bold> 
     1137                          </font> 
     1138                         </property> 
     1139                         <property name="text"> 
     1140                          <string>Platform:</string> 
     1141                         </property> 
     1142                        </widget> 
     1143                       </item> 
     1144                       <item row="0" column="1"> 
     1145                        <widget class="QLabel" name="label_bapp_arch"> 
     1146                         <property name="text"> 
     1147                          <string notr="true">TextLabel</string> 
     1148                         </property> 
     1149                        </widget> 
     1150                       </item> 
     1151                      </layout> 
     1152                     </item> 
     1153                     <item> 
     1154                      <spacer name="horizontalSpacer_6"> 
     1155                       <property name="orientation"> 
     1156                        <enum>Qt::Horizontal</enum> 
     1157                       </property> 
     1158                       <property name="sizeHint" stdset="0"> 
     1159                        <size> 
     1160                         <width>40</width> 
     1161                         <height>20</height> 
     1162                        </size> 
     1163                       </property> 
     1164                      </spacer> 
     1165                     </item> 
     1166                     <item> 
     1167                      <layout class="QFormLayout" name="formLayout_4"> 
     1168                       <item row="0" column="0"> 
     1169                        <widget class="QLabel" name="label_17"> 
     1170                         <property name="font"> 
     1171                          <font> 
     1172                           <weight>75</weight> 
     1173                           <bold>true</bold> 
     1174                          </font> 
     1175                         </property> 
     1176                         <property name="text"> 
     1177                          <string>License:</string> 
     1178                         </property> 
     1179                        </widget> 
     1180                       </item> 
     1181                       <item row="0" column="1"> 
     1182                        <widget class="QLabel" name="label_bapp_license"> 
     1183                         <property name="text"> 
     1184                          <string notr="true">BSD</string> 
     1185                         </property> 
     1186                        </widget> 
     1187                       </item> 
     1188                      </layout> 
     1189                     </item> 
     1190                     <item> 
     1191                      <spacer name="horizontalSpacer_5"> 
     1192                       <property name="orientation"> 
     1193                        <enum>Qt::Horizontal</enum> 
     1194                       </property> 
     1195                       <property name="sizeHint" stdset="0"> 
     1196                        <size> 
     1197                         <width>40</width> 
     1198                         <height>20</height> 
     1199                        </size> 
     1200                       </property> 
     1201                      </spacer> 
     1202                     </item> 
     1203                     <item> 
     1204                      <layout class="QFormLayout" name="formLayout_2"> 
     1205                       <property name="fieldGrowthPolicy"> 
     1206                        <enum>QFormLayout::ExpandingFieldsGrow</enum> 
     1207                       </property> 
     1208                       <item row="0" column="0"> 
     1209                        <widget class="QLabel" name="label_13"> 
     1210                         <property name="font"> 
     1211                          <font> 
     1212                           <weight>75</weight> 
     1213                           <bold>true</bold> 
     1214                          </font> 
     1215                         </property> 
     1216                         <property name="text"> 
     1217                          <string>Type:</string> 
     1218                         </property> 
     1219                        </widget> 
     1220                       </item> 
     1221                       <item row="0" column="1"> 
     1222                        <widget class="QLabel" name="label_bapp_type"> 
     1223                         <property name="text"> 
     1224                          <string notr="true">TextLabel</string> 
     1225                         </property> 
     1226                        </widget> 
     1227                       </item> 
     1228                      </layout> 
     1229                     </item> 
     1230                    </layout> 
    12451231                   </item> 
    1246                    <item row="0" column="1"> 
    1247                     <widget class="QLabel" name="label_bapp_arch"> 
    1248                      <property name="text"> 
    1249                       <string notr="true">TextLabel</string> 
    1250                      </property> 
     1232                   <item> 
     1233                    <widget class="QTabWidget" name="tabWidget_browse_info"> 
     1234                     <property name="styleSheet"> 
     1235                      <string notr="true">QToolTip{  
     1236background: rgb(230,230,230);  
     1237border: 1px solid grey; 
     1238border-radius: 3px; 
     1239padding: 1px; 
     1240color: black; 
     1241}</string> 
     1242                     </property> 
     1243                     <property name="currentIndex"> 
     1244                      <number>2</number> 
     1245                     </property> 
     1246                     <widget class="QWidget" name="tab_app_desc"> 
     1247                      <attribute name="icon"> 
     1248                       <iconset resource="SoftwareManager.qrc"> 
     1249                        <normaloff>:/icons/xdg_mime.png</normaloff>:/icons/xdg_mime.png</iconset> 
     1250                      </attribute> 
     1251                      <attribute name="title"> 
     1252                       <string>Description</string> 
     1253                      </attribute> 
     1254                      <layout class="QVBoxLayout" name="verticalLayout_22"> 
     1255                       <item> 
     1256                        <widget class="QTextEdit" name="text_bapp_description"> 
     1257                         <property name="styleSheet"> 
     1258                          <string notr="true">background: transparent; border-width: 0px;</string> 
     1259                         </property> 
     1260                         <property name="frameShape"> 
     1261                          <enum>QFrame::StyledPanel</enum> 
     1262                         </property> 
     1263                         <property name="frameShadow"> 
     1264                          <enum>QFrame::Plain</enum> 
     1265                         </property> 
     1266                         <property name="horizontalScrollBarPolicy"> 
     1267                          <enum>Qt::ScrollBarAlwaysOff</enum> 
     1268                         </property> 
     1269                         <property name="textInteractionFlags"> 
     1270                          <set>Qt::TextSelectableByMouse</set> 
     1271                         </property> 
     1272                        </widget> 
     1273                       </item> 
     1274                      </layout> 
     1275                     </widget> 
     1276                     <widget class="QWidget" name="tab_app_screenshots"> 
     1277                      <attribute name="icon"> 
     1278                       <iconset resource="SoftwareManager.qrc"> 
     1279                        <normaloff>:/icons/xdg_desktop.png</normaloff>:/icons/xdg_desktop.png</iconset> 
     1280                      </attribute> 
     1281                      <attribute name="title"> 
     1282                       <string>ScreenShots</string> 
     1283                      </attribute> 
     1284                      <layout class="QVBoxLayout" name="verticalLayout_26"> 
     1285                       <item> 
     1286                        <widget class="QLabel" name="label_app_screenshot"> 
     1287                         <property name="sizePolicy"> 
     1288                          <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> 
     1289                           <horstretch>0</horstretch> 
     1290                           <verstretch>0</verstretch> 
     1291                          </sizepolicy> 
     1292                         </property> 
     1293                         <property name="text"> 
     1294                          <string notr="true"/> 
     1295                         </property> 
     1296                         <property name="alignment"> 
     1297                          <set>Qt::AlignCenter</set> 
     1298                         </property> 
     1299                        </widget> 
     1300                       </item> 
     1301                       <item> 
     1302                        <layout class="QHBoxLayout" name="horizontalLayout_9"> 
     1303                         <item> 
     1304                          <widget class="QToolButton" name="tool_app_prevScreen"> 
     1305                           <property name="text"> 
     1306                            <string>...</string> 
     1307                           </property> 
     1308                           <property name="icon"> 
     1309                            <iconset resource="SoftwareManager.qrc"> 
     1310                             <normaloff>:/icons/go-previous.png</normaloff>:/icons/go-previous.png</iconset> 
     1311                           </property> 
     1312                           <property name="autoRaise"> 
     1313                            <bool>false</bool> 
     1314                           </property> 
     1315                          </widget> 
     1316                         </item> 
     1317                         <item> 
     1318                          <widget class="QLabel" name="label_app_cScreen"> 
     1319                           <property name="text"> 
     1320                            <string notr="true">?/?</string> 
     1321                           </property> 
     1322                           <property name="alignment"> 
     1323                            <set>Qt::AlignCenter</set> 
     1324                           </property> 
     1325                          </widget> 
     1326                         </item> 
     1327                         <item> 
     1328                          <widget class="QToolButton" name="tool_app_nextScreen"> 
     1329                           <property name="text"> 
     1330                            <string>...</string> 
     1331                           </property> 
     1332                           <property name="icon"> 
     1333                            <iconset resource="SoftwareManager.qrc"> 
     1334                             <normaloff>:/icons/go-next.png</normaloff>:/icons/go-next.png</iconset> 
     1335                           </property> 
     1336                          </widget> 
     1337                         </item> 
     1338                        </layout> 
     1339                       </item> 
     1340                      </layout> 
     1341                     </widget> 
     1342                     <widget class="QWidget" name="tab_app_plugins"> 
     1343                      <attribute name="icon"> 
     1344                       <iconset resource="SoftwareManager.qrc"> 
     1345                        <normaloff>:/icons/xdg_menu.png</normaloff>:/icons/xdg_menu.png</iconset> 
     1346                      </attribute> 
     1347                      <attribute name="title"> 
     1348                       <string>Plugins</string> 
     1349                      </attribute> 
     1350                      <layout class="QVBoxLayout" name="verticalLayout_8"> 
     1351                       <item> 
     1352                        <widget class="QScrollArea" name="scroll_app_plugins"> 
     1353                         <property name="styleSheet"> 
     1354                          <string notr="true">background: transparent;</string> 
     1355                         </property> 
     1356                         <property name="horizontalScrollBarPolicy"> 
     1357                          <enum>Qt::ScrollBarAlwaysOff</enum> 
     1358                         </property> 
     1359                         <property name="widgetResizable"> 
     1360                          <bool>true</bool> 
     1361                         </property> 
     1362                         <property name="alignment"> 
     1363                          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     1364                         </property> 
     1365                         <widget class="QWidget" name="scrollAreaWidgetContents_8"> 
     1366                          <property name="geometry"> 
     1367                           <rect> 
     1368                            <x>0</x> 
     1369                            <y>0</y> 
     1370                            <width>452</width> 
     1371                            <height>66</height> 
     1372                           </rect> 
     1373                          </property> 
     1374                         </widget> 
     1375                        </widget> 
     1376                       </item> 
     1377                      </layout> 
     1378                     </widget> 
     1379                     <widget class="QWidget" name="tab_app_similar"> 
     1380                      <attribute name="icon"> 
     1381                       <iconset resource="SoftwareManager.qrc"> 
     1382                        <normaloff>:/icons/application.png</normaloff>:/icons/application.png</iconset> 
     1383                      </attribute> 
     1384                      <attribute name="title"> 
     1385                       <string>Similar</string> 
     1386                      </attribute> 
     1387                      <layout class="QVBoxLayout" name="verticalLayout_25"> 
     1388                       <item> 
     1389                        <widget class="QScrollArea" name="scroll_app_similar"> 
     1390                         <property name="styleSheet"> 
     1391                          <string notr="true">background: transparent;</string> 
     1392                         </property> 
     1393                         <property name="horizontalScrollBarPolicy"> 
     1394                          <enum>Qt::ScrollBarAlwaysOff</enum> 
     1395                         </property> 
     1396                         <property name="widgetResizable"> 
     1397                          <bool>true</bool> 
     1398                         </property> 
     1399                         <property name="alignment"> 
     1400                          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     1401                         </property> 
     1402                         <widget class="QWidget" name="scrollAreaWidgetContents_7"> 
     1403                          <property name="geometry"> 
     1404                           <rect> 
     1405                            <x>0</x> 
     1406                            <y>0</y> 
     1407                            <width>452</width> 
     1408                            <height>136</height> 
     1409                           </rect> 
     1410                          </property> 
     1411                         </widget> 
     1412                        </widget> 
     1413                       </item> 
     1414                      </layout> 
     1415                     </widget> 
     1416                     <widget class="QWidget" name="tab_app_opts"> 
     1417                      <attribute name="icon"> 
     1418                       <iconset resource="SoftwareManager.qrc"> 
     1419                        <normaloff>:/icons/preferences-system.png</normaloff>:/icons/preferences-system.png</iconset> 
     1420                      </attribute> 
     1421                      <attribute name="title"> 
     1422                       <string>Build Options</string> 
     1423                      </attribute> 
     1424                      <layout class="QVBoxLayout" name="verticalLayout_27"> 
     1425                       <item> 
     1426                        <widget class="QListWidget" name="list_app_buildopts"> 
     1427                         <property name="frameShape"> 
     1428                          <enum>QFrame::NoFrame</enum> 
     1429                         </property> 
     1430                         <property name="showDropIndicator" stdset="0"> 
     1431                          <bool>false</bool> 
     1432                         </property> 
     1433                         <property name="alternatingRowColors"> 
     1434                          <bool>true</bool> 
     1435                         </property> 
     1436                         <property name="selectionMode"> 
     1437                          <enum>QAbstractItemView::NoSelection</enum> 
     1438                         </property> 
     1439                         <property name="viewMode"> 
     1440                          <enum>QListView::ListMode</enum> 
     1441                         </property> 
     1442                         <property name="sortingEnabled"> 
     1443                          <bool>true</bool> 
     1444                         </property> 
     1445                        </widget> 
     1446                       </item> 
     1447                      </layout> 
     1448                     </widget> 
    12511449                    </widget> 
    12521450                   </item> 
    12531451                  </layout> 
    1254                  </item> 
    1255                  <item> 
    1256                   <spacer name="horizontalSpacer_6"> 
    1257                    <property name="orientation"> 
    1258                     <enum>Qt::Horizontal</enum> 
    1259                    </property> 
    1260                    <property name="sizeHint" stdset="0"> 
    1261                     <size> 
    1262                      <width>40</width> 
    1263                      <height>20</height> 
    1264                     </size> 
    1265                    </property> 
    1266                   </spacer> 
    1267                  </item> 
    1268                  <item> 
    1269                   <layout class="QFormLayout" name="formLayout_4"> 
    1270                    <item row="0" column="0"> 
    1271                     <widget class="QLabel" name="label_17"> 
    1272                      <property name="font"> 
    1273                       <font> 
    1274                        <weight>75</weight> 
    1275                        <bold>true</bold> 
    1276                       </font> 
    1277                      </property> 
    1278                      <property name="text"> 
    1279                       <string>License:</string> 
    1280                      </property> 
    1281                     </widget> 
    1282                    </item> 
    1283                    <item row="0" column="1"> 
    1284                     <widget class="QLabel" name="label_bapp_license"> 
    1285                      <property name="text"> 
    1286                       <string notr="true">BSD</string> 
    1287                      </property> 
     1452                 </widget> 
     1453                </item> 
     1454                <item> 
     1455                 <spacer name="verticalSpacer_2"> 
     1456                  <property name="orientation"> 
     1457                   <enum>Qt::Vertical</enum> 
     1458                  </property> 
     1459                  <property name="sizeHint" stdset="0"> 
     1460                   <size> 
     1461                    <width>20</width> 
     1462                    <height>0</height> 
     1463                   </size> 
     1464                  </property> 
     1465                 </spacer> 
     1466                </item> 
     1467               </layout> 
     1468              </widget> 
     1469              <widget class="QWidget" name="page_search"> 
     1470               <layout class="QVBoxLayout" name="verticalLayout_20"> 
     1471                <item> 
     1472                 <widget class="QLabel" name="label_bsearch_info"> 
     1473                  <property name="sizePolicy"> 
     1474                   <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
     1475                    <horstretch>0</horstretch> 
     1476                    <verstretch>0</verstretch> 
     1477                   </sizepolicy> 
     1478                  </property> 
     1479                  <property name="text"> 
     1480                   <string notr="true">Please wait while the search is being performed</string> 
     1481                  </property> 
     1482                  <property name="alignment"> 
     1483                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     1484                  </property> 
     1485                  <property name="wordWrap"> 
     1486                   <bool>true</bool> 
     1487                  </property> 
     1488                 </widget> 
     1489                </item> 
     1490                <item> 
     1491                 <widget class="QGroupBox" name="group_bsearch_best"> 
     1492                  <property name="sizePolicy"> 
     1493                   <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> 
     1494                    <horstretch>0</horstretch> 
     1495                    <verstretch>0</verstretch> 
     1496                   </sizepolicy> 
     1497                  </property> 
     1498                  <property name="title"> 
     1499                   <string>Best Matches</string> 
     1500                  </property> 
     1501                  <layout class="QVBoxLayout" name="verticalLayout_16"> 
     1502                   <item> 
     1503                    <widget class="QScrollArea" name="scroll_bsearch_best"> 
     1504                     <property name="horizontalScrollBarPolicy"> 
     1505                      <enum>Qt::ScrollBarAlwaysOff</enum> 
     1506                     </property> 
     1507                     <property name="widgetResizable"> 
     1508                      <bool>true</bool> 
     1509                     </property> 
     1510                     <property name="alignment"> 
     1511                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     1512                     </property> 
     1513                     <widget class="QWidget" name="scrollAreaWidgetContents"> 
     1514                      <property name="geometry"> 
     1515                       <rect> 
     1516                        <x>0</x> 
     1517                        <y>0</y> 
     1518                        <width>57</width> 
     1519                        <height>16</height> 
     1520                       </rect> 
     1521                      </property> 
     1522                     </widget> 
    12881523                    </widget> 
    12891524                   </item> 
    12901525                  </layout> 
    1291                  </item> 
    1292                  <item> 
    1293                   <spacer name="horizontalSpacer_5"> 
    1294                    <property name="orientation"> 
    1295                     <enum>Qt::Horizontal</enum> 
    1296                    </property> 
    1297                    <property name="sizeHint" stdset="0"> 
    1298                     <size> 
    1299                      <width>40</width> 
    1300                      <height>20</height> 
    1301                     </size> 
    1302                    </property> 
    1303                   </spacer> 
    1304                  </item> 
    1305                  <item> 
    1306                   <layout class="QFormLayout" name="formLayout_2"> 
    1307                    <property name="fieldGrowthPolicy"> 
    1308                     <enum>QFormLayout::ExpandingFieldsGrow</enum> 
    1309                    </property> 
    1310                    <item row="0" column="0"> 
    1311                     <widget class="QLabel" name="label_13"> 
    1312                      <property name="font"> 
    1313                       <font> 
    1314                        <weight>75</weight> 
    1315                        <bold>true</bold> 
    1316                       </font> 
    1317                      </property> 
    1318                      <property name="text"> 
    1319                       <string>Type:</string> 
    1320                      </property> 
    1321                     </widget> 
    1322                    </item> 
    1323                    <item row="0" column="1"> 
    1324                     <widget class="QLabel" name="label_bapp_type"> 
    1325                      <property name="text"> 
    1326                       <string notr="true">TextLabel</string> 
    1327                      </property> 
     1526                 </widget> 
     1527                </item> 
     1528                <item> 
     1529                 <widget class="QGroupBox" name="group_bsearch_other"> 
     1530                  <property name="sizePolicy"> 
     1531                   <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> 
     1532                    <horstretch>0</horstretch> 
     1533                    <verstretch>0</verstretch> 
     1534                   </sizepolicy> 
     1535                  </property> 
     1536                  <property name="title"> 
     1537                   <string>Other Results</string> 
     1538                  </property> 
     1539                  <layout class="QVBoxLayout" name="verticalLayout_19"> 
     1540                   <item> 
     1541                    <widget class="QScrollArea" name="scroll_bsearch_other"> 
     1542                     <property name="horizontalScrollBarPolicy"> 
     1543                      <enum>Qt::ScrollBarAlwaysOff</enum> 
     1544                     </property> 
     1545                     <property name="widgetResizable"> 
     1546                      <bool>true</bool> 
     1547                     </property> 
     1548                     <property name="alignment"> 
     1549                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
     1550                     </property> 
     1551                     <widget class="QWidget" name="scrollAreaWidgetContents_2"> 
     1552                      <property name="geometry"> 
     1553                       <rect> 
     1554                        <x>0</x> 
     1555                        <y>0</y> 
     1556                        <width>57</width> 
     1557                        <height>16</height> 
     1558                       </rect> 
     1559                      </property> 
     1560                     </widget> 
    13281561                    </widget> 
    13291562                   </item> 
    13301563                  </layout> 
    1331                  </item> 
    1332                 </layout> 
    1333                </item> 
    1334                <item> 
    1335                 <widget class="QTextEdit" name="text_bapp_description"> 
    1336                  <property name="horizontalScrollBarPolicy"> 
    1337                   <enum>Qt::ScrollBarAlwaysOff</enum> 
    1338                  </property> 
    1339                  <property name="textInteractionFlags"> 
    1340                   <set>Qt::TextSelectableByMouse</set> 
    1341                  </property> 
    1342                 </widget> 
    1343                </item> 
    1344               </layout> 
    1345              </widget> 
    1346             </item> 
    1347             <item> 
    1348              <spacer name="verticalSpacer_2"> 
    1349               <property name="orientation"> 
    1350                <enum>Qt::Vertical</enum> 
    1351               </property> 
    1352               <property name="sizeHint" stdset="0"> 
    1353                <size> 
    1354                 <width>20</width> 
    1355                 <height>0</height> 
    1356                </size> 
    1357               </property> 
    1358              </spacer> 
    1359             </item> 
    1360             <item> 
    1361              <widget class="QGroupBox" name="group_bapp_similar"> 
    1362               <property name="styleSheet"> 
    1363                <string notr="true">QGroupBox::indicator:unchecked{ 
    1364 image: url(:icons/arrow-down.png); 
    1365 } 
    1366 QGroupBox::indicator:checked{ 
    1367 image: url(:icons/arrow-up.png); 
    1368 } 
    1369 QGroupBox::title{ 
    1370 spacing: 1px; 
    1371 }</string> 
    1372               </property> 
    1373               <property name="title"> 
    1374                <string>Similar Applications</string> 
    1375               </property> 
    1376               <property name="checkable"> 
    1377                <bool>true</bool> 
    1378               </property> 
    1379               <layout class="QVBoxLayout" name="verticalLayout_8"> 
    1380                <item> 
    1381                 <widget class="QScrollArea" name="scroll_bapp_similar"> 
    1382                  <property name="styleSheet"> 
    1383                   <string notr="true"/> 
    1384                  </property> 
    1385                  <property name="verticalScrollBarPolicy"> 
    1386                   <enum>Qt::ScrollBarAlwaysOff</enum> 
    1387                  </property> 
    1388                  <property name="widgetResizable"> 
    1389                   <bool>true</bool> 
    1390                  </property> 
    1391                  <widget class="QWidget" name="scrollAreaWidgetContents_3"> 
    1392                   <property name="geometry"> 
    1393                    <rect> 
    1394                     <x>0</x> 
    1395                     <y>0</y> 
    1396                     <width>98</width> 
    1397                     <height>28</height> 
    1398                    </rect> 
    1399                   </property> 
    14001564                 </widget> 
    1401                 </widget> 
    1402                </item> 
    1403               </layout> 
    1404              </widget> 
    1405             </item> 
    1406            </layout> 
    1407           </widget> 
    1408           <widget class="QWidget" name="page_search"> 
    1409            <layout class="QVBoxLayout" name="verticalLayout_20"> 
    1410             <item> 
    1411              <widget class="QLabel" name="label_bsearch_info"> 
    1412               <property name="sizePolicy"> 
    1413                <sizepolicy hsizetype="Preferred" vsizetype="Preferred"> 
    1414                 <horstretch>0</horstretch> 
    1415                 <verstretch>0</verstretch> 
    1416                </sizepolicy> 
    1417               </property> 
    1418               <property name="text"> 
    1419                <string notr="true">Please wait while the search is being performed</string> 
    1420               </property> 
    1421               <property name="alignment"> 
    1422                <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    1423               </property> 
    1424               <property name="wordWrap"> 
    1425                <bool>true</bool> 
    1426               </property> 
    1427              </widget> 
    1428             </item> 
    1429             <item> 
    1430              <widget class="QGroupBox" name="group_bsearch_best"> 
    1431               <property name="sizePolicy"> 
    1432                <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> 
    1433                 <horstretch>0</horstretch> 
    1434                 <verstretch>0</verstretch> 
    1435                </sizepolicy> 
    1436               </property> 
    1437               <property name="title"> 
    1438                <string>Best Matches</string> 
    1439               </property> 
    1440               <layout class="QVBoxLayout" name="verticalLayout_16"> 
    1441                <item> 
    1442                 <widget class="QScrollArea" name="scroll_bsearch_best"> 
    1443                  <property name="horizontalScrollBarPolicy"> 
    1444                   <enum>Qt::ScrollBarAlwaysOff</enum> 
    1445                  </property> 
    1446                  <property name="widgetResizable"> 
    1447                   <bool>true</bool> 
    1448                  </property> 
    1449                  <property name="alignment"> 
    1450                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    1451                  </property> 
    1452                  <widget class="QWidget" name="scrollAreaWidgetContents"> 
    1453                   <property name="geometry"> 
    1454                    <rect> 
    1455                     <x>0</x> 
    1456                     <y>0</y> 
    1457                     <width>98</width> 
    1458                     <height>28</height> 
    1459                    </rect> 
    1460                   </property> 
    1461                  </widget> 
    1462                 </widget> 
    1463                </item> 
    1464               </layout> 
    1465              </widget> 
    1466             </item> 
    1467             <item> 
    1468              <widget class="QGroupBox" name="group_bsearch_other"> 
    1469               <property name="sizePolicy"> 
    1470                <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> 
    1471                 <horstretch>0</horstretch> 
    1472                 <verstretch>0</verstretch> 
    1473                </sizepolicy> 
    1474               </property> 
    1475               <property name="title"> 
    1476                <string>Other Results</string> 
    1477               </property> 
    1478               <layout class="QVBoxLayout" name="verticalLayout_19"> 
    1479                <item> 
    1480                 <widget class="QScrollArea" name="scroll_bsearch_other"> 
    1481                  <property name="horizontalScrollBarPolicy"> 
    1482                   <enum>Qt::ScrollBarAlwaysOff</enum> 
    1483                  </property> 
    1484                  <property name="widgetResizable"> 
    1485                   <bool>true</bool> 
    1486                  </property> 
    1487                  <property name="alignment"> 
    1488                   <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set> 
    1489                  </property> 
    1490                  <widget class="QWidget" name="scrollAreaWidgetContents_2"> 
    1491                   <property name="geometry"> 
    1492                    <rect> 
    1493                     <x>0</x> 
    1494                     <y>0</y> 
    1495                     <width>98</width> 
    1496                     <height>28</height> 
    1497                    </rect> 
    1498                   </property> 
    1499                  </widget> 
    1500                 </widget> 
    1501                </item> 
    1502               </layout> 
     1565                </item> 
     1566               </layout> 
     1567              </widget> 
    15031568             </widget> 
    15041569            </item> 
     
    15091574       </layout> 
    15101575      </widget> 
     1576      <widget class="QWidget" name="page_2"/> 
     1577     </widget> 
     1578    </item> 
     1579    <item> 
     1580     <widget class="QTextEdit" name="text_dev_output"> 
     1581      <property name="readOnly"> 
     1582       <bool>true</bool> 
     1583      </property> 
    15111584     </widget> 
    15121585    </item> 
     
    15181591     <x>0</x> 
    15191592     <y>0</y> 
    1520      <width>473</width> 
    1521      <height>21</height> 
     1593     <width>514</width> 
     1594     <height>20</height> 
    15221595    </rect> 
    15231596   </property> 
     
    15381611    </property> 
    15391612    <addaction name="actionAppCafe_Settings"/> 
     1613    <addaction name="separator"/> 
     1614    <addaction name="actionDeveloper_Mode"/> 
     1615   </widget> 
     1616   <widget class="QMenu" name="menuBrowser_View"> 
     1617    <property name="title"> 
     1618     <string>Browser View</string> 
     1619    </property> 
     1620    <addaction name="actionGraphical_Apps"/> 
     1621    <addaction name="actionText_Apps"/> 
     1622    <addaction name="actionServer_Apps"/> 
     1623    <addaction name="actionRaw_Packages"/> 
    15401624   </widget> 
    15411625   <addaction name="menuFile"/> 
    15421626   <addaction name="menuConfigure"/> 
     1627   <addaction name="menuBrowser_View"/> 
    15431628  </widget> 
    15441629  <widget class="QStatusBar" name="statusbar"/> 
     
    15941679   <property name="text"> 
    15951680    <string>I&amp;nstall PBI</string> 
     1681   </property> 
     1682  </action> 
     1683  <action name="actionContained_Only"> 
     1684   <property name="text"> 
     1685    <string>Contained Only</string> 
     1686   </property> 
     1687  </action> 
     1688  <action name="actionSystem_Only"> 
     1689   <property name="text"> 
     1690    <string>System Only</string> 
     1691   </property> 
     1692  </action> 
     1693  <action name="actionGraphical_Apps"> 
     1694   <property name="checkable"> 
     1695    <bool>true</bool> 
     1696   </property> 
     1697   <property name="checked"> 
     1698    <bool>true</bool> 
     1699   </property> 
     1700   <property name="text"> 
     1701    <string>Graphical Apps</string> 
     1702   </property> 
     1703  </action> 
     1704  <action name="actionText_Apps"> 
     1705   <property name="checkable"> 
     1706    <bool>true</bool> 
     1707   </property> 
     1708   <property name="checked"> 
     1709    <bool>true</bool> 
     1710   </property> 
     1711   <property name="text"> 
     1712    <string>Text Apps</string> 
     1713   </property> 
     1714  </action> 
     1715  <action name="actionServer_Apps"> 
     1716   <property name="checkable"> 
     1717    <bool>true</bool> 
     1718   </property> 
     1719   <property name="checked"> 
     1720    <bool>true</bool> 
     1721   </property> 
     1722   <property name="text"> 
     1723    <string>Server Apps</string> 
     1724   </property> 
     1725  </action> 
     1726  <action name="actionRaw_Packages"> 
     1727   <property name="checkable"> 
     1728    <bool>true</bool> 
     1729   </property> 
     1730   <property name="text"> 
     1731    <string>Raw Packages</string> 
     1732   </property> 
     1733  </action> 
     1734  <action name="actionDeveloper_Mode"> 
     1735   <property name="checkable"> 
     1736    <bool>true</bool> 
     1737   </property> 
     1738   <property name="text"> 
     1739    <string>Developer Mode</string> 
    15961740   </property> 
    15971741  </action> 
  • src-qt4/pc-softwaremanager/pbiDBAccess.cpp

    r32be23f rb6102c8  
    2626 #include "pbiDBAccess.h" 
    2727 
    28 // ================================ 
    29 // =======  SETUP FUNCTIONS ======= 
    30 // ================================ 
    31 bool PBIDBAccess::setDBPath(QString fullPath){ 
    32   bool ok = FALSE; 
    33   //Make sure the directory exists first 
    34   if(QFile::exists(fullPath)){ 
    35     DBPath = fullPath; 
    36     if(!DBPath.endsWith("/")){DBPath.append("/");} 
    37     DBDir->setPath(fullPath); 
    38     //Now read the list of available repos 
    39     reloadRepoList(); 
    40     ok = TRUE; 
    41   } 
    42   return ok; 
    43 } 
    44  
    45 void PBIDBAccess::setRootCMDPrefix(QString prefix){ 
    46   //All commands need root permissions to run, so this is used  
    47   //    to add the proper cmd prefix to prompt to run with root permissions 
    48   // Example: "pc-su" or "warden chroot <ip>" 
    49   cmdPrefix = prefix; 
    50   if(!cmdPrefix.endsWith(" ")){ cmdPrefix.append(" "); } 
    51   //qDebug() << "DB command prefix:" << cmdPrefix; 
    52 } 
    53  
    54 void PBIDBAccess::reloadRepoList(){ 
    55   repoList.clear(); 
    56   if(DBDir->cd(DBPath+"repos")){ //directory exists 
    57     repoList = DBDir->entryList(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Readable); 
    58   }      
    59 } 
    60  
    61 bool PBIDBAccess::setRepo(QString repoNum){ 
    62   //Make sure the repo is available 
    63   bool ok = DBDir->cd(DBPath+"repos"); 
    64   if(ok){ //directory exists 
    65     QStringList rL = DBDir->entryList(QStringList()<<repoNum+"*",QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Readable); 
    66     if(rL.length() == 1){ //this repo exists 
    67       currentRepoNumber=rL[0].section(".",0,0,QString::SectionSkipEmpty); 
    68       currentRepoID=rL[0].section(".",1,1,QString::SectionSkipEmpty); 
    69       return TRUE; 
    70     } 
    71   } 
    72   return FALSE; 
    73 } 
    74  
    75 bool PBIDBAccess::currentRepoInvalid(){ 
    76   //Check to make sure that the current Repo is still valid 
    77   reloadRepoList(); 
    78   if(repoList.contains(currentRepoNumber+"."+currentRepoID)){ return FALSE; } 
    79   else{ return TRUE; } 
    80 } 
    81  
    82 QStringList PBIDBAccess::availableRepos(){ 
    83   QStringList output; 
    84   for(int i=0; i<repoList.length(); i++){ 
    85     output << repoList[i].section(".",0,0,QString::SectionSkipEmpty); 
    86   } 
    87   return output; 
    88 } 
    89  
    90 QStringList PBIDBAccess::repoInfo(QString repoNum){ 
    91   //Returns: output=[Name, Master URL]   
    92   QStringList output; 
    93   QString ID = getIDFromNum(repoNum); 
    94     QStringList lines = Extras::readFile(DBPath+"repos/"+repoNum+"."+ID); 
    95     if(!lines.isEmpty()){ 
    96       output <<"" << ""; //make sure there are two entries available 
    97       for(int j=0; j<lines.length(); j++){ 
    98          if(lines[j].startsWith("URL: ")){ output[1] = lines[j].section("URL: ",1,50).simplified(); } 
    99          else if(lines[j].startsWith("Desc: ")){ output[0] = lines[j].section("Desc: ",1,50).simplified(); } 
    100       } 
    101     } 
    102   return output; 
    103 } 
    104  
    105 QStringList PBIDBAccess::repoMirrors(QString repoNum){ 
    106   QStringList output; 
    107   QString ID = getIDFromNum(repoNum); 
    108   if(!ID.isEmpty()){ 
    109     output = Extras::readFile(DBPath+"mirrors/"+ID);       
    110   } 
    111   return output; 
     28PBIDBAccess::PBIDBAccess(){ 
     29  proc = new QProcess; 
     30  proc->setProcessEnvironment( QProcessEnvironment::systemEnvironment() ); 
     31  proc->setProcessChannelMode(QProcess::MergedChannels); 
     32} 
     33 
     34PBIDBAccess::~PBIDBAccess(){ 
     35  delete proc;   
    11236} 
    11337 
     
    11539// =======  PUBLIC ACCESS FUNCTIONS ======= 
    11640// ======================================== 
    117 QStringList PBIDBAccess::installed(){ 
    118   QStringList output; 
    119   bool ok = DBDir->cd(DBPath+"installed"); 
     41void PBIDBAccess::syncDBInfo(QString jailID, bool localreload, bool allreload){ 
     42  //The PBI/Cat lists are the same for all jails 
     43  syncLargePkgRepoList(allreload); //reload the base pkg information (large) 
     44  bool synced = syncPkgInstallList(jailID, localreload || allreload); //load the installed PKG list 
     45  syncPbiRepoLists(localreload || allreload || synced); //load the PBI index lists 
     46} 
     47 
     48QHash<QString, NGApp> PBIDBAccess::getRawAppList(){ //PBI-apps that can be installed 
     49  return PBIAVAIL; 
     50} 
     51 
     52QHash<QString, NGCat> PBIDBAccess::Categories(){  //All categories for ports/pbi's (unified) 
     53  return CATAVAIL; 
     54} 
     55 
     56QHash<QString, NGApp> PBIDBAccess::DetailedAppList(){ 
     57  return PBIAVAIL; 
     58} 
     59 
     60QHash<QString, NGApp> PBIDBAccess::DetailedPkgList(){ 
     61   syncLargePkgRepoList(); //Now fill out the details for all available package (can take a while) 
     62  QHash<QString, NGApp> hash = PKGAVAIL; 
     63  QStringList IK = PKGINSTALLED.keys(); 
     64  for(int i=0; i<IK.length(); i++){ 
     65    if( !hash.contains(IK[i]) ){ hash.insert( IK[i], PKGINSTALLED[IK[i]] ); } 
     66  } 
     67  return hash; 
     68} 
     69 
     70NGApp PBIDBAccess::getLocalPkgDetails(NGApp app){ 
     71  //Simply set the proper bits in the container for locally installed apps 
     72  // NOTE: This is dependant upon which jail is being probed 
     73  QStringList args; 
     74  if( !jailLoaded.isEmpty() ){ 
     75    args << "-j" << jailLoaded; 
     76  } 
     77  args << "query" << "%v::::%sh::::%k::::%t::::%a" << app.origin; 
     78  QString out = runCMD("pkg", args); 
     79  if(out.isEmpty()){ 
     80    app.isInstalled=false; 
     81  }else{ 
     82    app.isInstalled=true; 
     83    app.installedversion = out.section("::::",0,0); 
     84    app.installedsize = out.section("::::",1,1); 
     85    app.isLocked = (out.section("::::",2,2) == "1"); 
     86    QString timestamp = out.section("::::",3,3); 
     87      app.installedwhen = QDateTime::fromMSecsSinceEpoch( timestamp.toLongLong() ).toString(Qt::DefaultLocaleShortDate); 
     88    app.isOrphan = (out.section("::::",4,4) == "1"); 
     89  } 
     90  return app; 
     91} 
     92 
     93 
     94QStringList PBIDBAccess::getRawPkgList(){ //All packages that can be installed 
     95  return QStringList(PKGAVAIL.keys());  
     96} 
     97 
     98QStringList PBIDBAccess::getRawInstalledPackages(){ //Installed Packages on the system 
     99  return QStringList(PKGINSTALLED.keys()); 
     100} 
     101         
     102NGApp PBIDBAccess::updateAppStatus(NGApp app){ 
     103  //This function assumes that the internal lists are currently up-to-date 
     104  bool ok = true; 
     105  if( !app.needsPkgs.isEmpty() ){ 
     106    //Check for all these package, not just the current pkg 
     107    for(int i=0; i<app.needsPkgs.length(); i++){ 
     108      if( !PKGINSTALLED.contains(app.needsPkgs[i]) ){ 
     109        ok = false; 
     110        break; //don't bother checking further 
     111      } 
     112    } 
     113  } 
    120114  if(ok){ 
    121     output = DBDir->entryList( QDir::Dirs | QDir::NoDotAndDotDot | QDir::NoSymLinks | QDir::Readable); 
    122   } 
    123   return output; 
    124 } 
    125  
    126 QStringList PBIDBAccess::installedPbiInfo(QString pbiID){ 
    127   //Output format: output[ name, version, arch, date created, author, website, installpath, iconpath, maintainer, description, fbsdversion] 
    128   QStringList output; 
    129   QString path = DBPath+"installed/"+pbiID; 
    130   bool ok = DBDir->cd(path); 
    131   if(ok){ 
    132     output << readOneLineFile(path+"/pbi_name"); 
    133     output << readOneLineFile(path+"/pbi_version"); 
    134     output << readOneLineFile(path+"/pbi_arch"); 
    135     //Get the latest date (remove the time) for this PBI (mdate and patchmdate seem to vary in use) 
    136     QString mdate = readOneLineFile(path+"/pbi_mdate").section(" ",0,0).simplified(); 
    137     QString pdate = readOneLineFile(path+"/pbi_patchmdate").section(" ",0,0).simplified(); 
    138     if( !pdate.isEmpty() && (pdate > mdate) ){ 
    139       output << pdate; //use the date it was patched 
    140     }else{ 
    141       output <<  mdate; //use the date it was initially created 
    142     } 
    143     output << readOneLineFile(path+"/pbi_author"); 
    144     output << readOneLineFile(path+"/pbi_web"); 
    145     output << readOneLineFile(path+"/pbi_installedpath"); 
    146     output << path+"/pbi_icon.png"; 
    147     output << readOneLineFile(path+"/pbi_maintainer"); 
    148     output << cleanupDescription( readOneLineFile(path+"/pbi_desc").split("\n") ); 
    149     output << readOneLineFile(path+"/pbi_fbsdver"); 
    150   } 
    151   return output; 
    152 } 
    153  
    154 bool PBIDBAccess::installedPbiAutoUpdate(QString pbiID){ 
    155    bool ok = FALSE; 
    156    if( QFile::exists(DBPath+"installed/"+pbiID+"/autoupdate-enable") ){ ok = TRUE; } 
    157    //qDebug() << "AutoUpdate:" << pbiID << ok; 
    158    return ok; 
    159 } 
    160  
    161 bool PBIDBAccess::installedPbiNeedsRoot(QString pbiID){ 
    162   bool ok=FALSE; 
    163   if( QFile::exists(DBPath+"installed/"+pbiID+"/pbi_requiresroot") ){ ok=TRUE; } 
    164   else{ 
    165     //Also check who installed the PBI if not flagged directly 
    166     QFileInfo fInfo(DBPath+"installed/"+pbiID); 
    167     if( fInfo.owner() == "root" ){ ok=TRUE; } 
    168   } 
    169   //qDebug() << pbiID << "requires root:" << ok; 
    170   return ok; 
    171 } 
    172  
    173 bool PBIDBAccess::installedPbiHasXdgDesktop(QString installPath){ 
    174   if(!installPath.endsWith("/")){ installPath.append("/"); } 
    175   bool ok = DBDir->cd(installPath+".xdg-desktop"); 
    176   if(ok){ 
    177     if( DBDir->entryList(QStringList()<<"*.desktop",QDir::Files).length() > 0 ){ return TRUE; }    
    178   } 
    179   return FALSE; 
    180 } 
    181  
    182 bool PBIDBAccess::installedPbiHasXdgMenu(QString installPath){ 
    183   if(!installPath.endsWith("/")){ installPath.append("/"); } 
    184   bool ok = DBDir->cd(installPath+".xdg-menu"); 
    185   if(ok){ 
    186     if( DBDir->entryList(QStringList()<<"*.desktop",QDir::Files).length() > 0 ){ return TRUE; }    
    187   } 
    188   return FALSE; 
    189 } 
    190  
    191 bool PBIDBAccess::installedPbiHasXdgMime(QString installPath){ 
    192   if(!installPath.endsWith("/")){ installPath.append("/"); } 
    193   bool ok = DBDir->cd(installPath+".xdg-mime"); 
    194   if(ok){ 
    195     if( DBDir->entryList(QStringList()<<"*.xml",QDir::Files).length() > 0 ){ return TRUE; }        
    196   } 
    197   return FALSE; 
    198 } 
    199  
    200 QString PBIDBAccess::indexFilePath(){ 
    201   return DBPath+"index/"+currentRepoID+"-index"; 
    202 } 
    203  
    204 QString PBIDBAccess::metaFilePath(){ 
    205   return DBPath+"index/"+currentRepoID+"-meta";  
    206 } 
    207  
    208 QStringList PBIDBAccess::parseIndexLine(QString line){ 
    209   //output[name, arch, version, date, sizeK, isLatest(bool), filename] 
    210   //line format 12/3/2013: [name,arch,version,checksum,datetimeBuilt,mirrorPathToPBI,datetimeApproved,?,current/active,sizeInK,?] 
    211       // NOTE: last two entries missing quite often 
    212   QStringList lineInfo = line.split(":"); 
    213   QStringList output; 
    214   if(lineInfo.length() < 9 ){ return output; } //skip incomplete entries 
    215   output << lineInfo[0]; //name 
    216   output << lineInfo[1]; //architecture 
    217   output << lineInfo[2]; //version 
    218   QDateTime DT; 
    219   DT.setTime_t(lineInfo[6].toInt()); 
    220   output << DT.toString("yyyyMMdd"); //date added to AppCafe 
    221   if(lineInfo.length() >= 10){ output << lineInfo[9]; }//Size in KB 
    222   else{ output << ""; } 
    223   if(lineInfo[8].simplified() == "current"){ output << "true"; } //is most recent version 
    224   else{ output << "false"; }  //is an older version 
    225   output << lineInfo[5].section("/",-1); //filename (Example: myapp-0.1-amd64.pbi) 
    226   return output; 
    227 } 
    228  
    229 QStringList PBIDBAccess::parseAppMetaLine(QString line){ 
    230   // line format 11/14/2013 (10.x PBI format):  
    231   // [name,category,remoteIcon,author,website,license,apptype,tags,description,requiresroot,dateadded,maintainerEmail,shortDescription] 
    232   QStringList list = line.split(";"); 
    233   //Format the output list 
    234   QStringList output; 
    235   //bool DEBUG = (list[0].toLower()=="xastir"); 
    236   if(list.length() < 13){ return output;} //invalid line 
    237   output << list[0]; //NAME 
    238   output << list[1]; //CATEGORY 
    239   output << list[2]; //remoteIcon 
    240   output << list[3]; //AUTHOR 
    241   output << list[4]; //WEBSITE 
    242   output << list[5]; //LICENSE 
    243   output << list[6]; //APP-TYPE 
    244   output << list[7]; //TAGS 
    245   //Cleanup the description (try to format the text properly) 
    246   output << cleanupDescription( list[8].split("<br>") ); //DESCRIPTION 
    247   if(list[9]=="YES"){ list[9]="true"; } //change to the same true/false syntax as elsewhere 
    248   output << list[9]; //REQUIRESROOT 
    249   output << list[10]; //DATE ADDED (just a number - not human-readable) 
    250   output << list[11]; //MAINTAINER EMAIL 
    251   //Cleanup the short description 
    252   output << cleanupDescription( list[12].split("<br>", QString::SkipEmptyParts) ); //SHORT DESCRIPTION 
    253   return output; 
    254 } 
    255  
    256 QStringList PBIDBAccess::parseCatMetaLine(QString line){ 
    257   // line format 11/14/2013: [name,remoteicon,description] 
    258   QStringList output = line.split(";"); 
    259   if(output.length() < 3){output.clear(); } //incomplete line 
    260   return output; 
    261 } 
    262          
    263 QString PBIDBAccess::remoteToLocalIcon(QString name, QString remoteIconPath){ 
    264   QString output = DBPath+"repo-icons/"+currentRepoID+"-"+name+"."+remoteIconPath.section(".",-1); 
    265   //qDebug() << "Remote to Local Icon Path conversion:" << remoteIconPath << output; 
    266   return output; 
    267 } 
    268  
    269 // ===== Database Modification Functions ===== 
    270 bool PBIDBAccess::addRepoFile(QString rpofilepath){ 
    271   if(!QFile::exists(rpofilepath)){ return FALSE; } 
    272   //Generate the command 
    273   QString cmd; 
    274   if(cmdPrefix.isEmpty()){ return FALSE; } 
    275   else{ cmd = cmdPrefix; } 
    276   cmd.append("\"pbi_addrepo "+rpofilepath+"\""); 
    277   qDebug() <<"DB cmd generated:" << cmd; 
    278   //Now run the command 
    279   QStringList result = runCMD(cmd).split("\n"); 
    280   if(!result.isEmpty()){ 
    281     if(result[result.length()-1].startsWith("Added new repo:")){  
    282       //Make sure to prompt the PBI Daemon to refresh the meta/index files now 
    283       runCMD( cmdPrefix+"\"pbid --refresh\"" ); //don't care about output 
    284       return TRUE; 
    285     } 
    286   }  
    287   qDebug() << "PBI Database Error:"; 
    288   qDebug() << " - CMD:"<<cmd; 
    289   qDebug() << " - Error:"<<result; 
    290   return FALSE; 
    291 } 
    292  
    293 bool PBIDBAccess::removeRepo(QString repoNum){ 
    294   //Generate the command 
    295   QString cmd; 
    296   if(cmdPrefix.isEmpty()){ return FALSE; } 
    297   else{ cmd = cmdPrefix; } 
    298   cmd.append("\"pbi_deleterepo "+repoNum+"\""); 
    299   qDebug() <<"DB cmd generated:" << cmd; 
    300   //Now run the command 
    301   QStringList result = runCMD(cmd).split("\n"); 
    302   if(!result.isEmpty()){ 
    303     //qDebug() << "Repo Removed:" << result; 
    304     if(result[result.length()-1].startsWith("Deleted Repository")){ return TRUE; } 
    305   }  
    306   qDebug() << "PBI Database Error:"; 
    307   qDebug() << " - CMD:"<<cmd; 
    308   qDebug() << " - Error:"<<result; 
    309   return FALSE;  
    310 } 
    311  
    312 bool PBIDBAccess::moveRepoUp(QString repoNum){ 
    313   //Generate the command 
    314   QString cmd; 
    315   if(cmdPrefix.isEmpty()){ return FALSE; } 
    316   else{ cmd = cmdPrefix; } 
    317   cmd.append("\"pbi_listrepo --up "+repoNum+"\""); 
    318   qDebug() <<"DB cmd generated:" << cmd; 
    319   //Now run the command 
    320   QStringList result = runCMD(cmd).split("\n"); 
    321   if(!result.isEmpty()){ 
    322     return TRUE; //no special check for this - will need to re-load repos anyway 
    323   }  
    324   return FALSE; 
    325 } 
    326  
    327 bool PBIDBAccess::moveRepoDown(QString repoNum){ 
    328   //Generate the command 
    329   QString cmd; 
    330   if(cmdPrefix.isEmpty()){ return FALSE; } 
    331   else{ cmd = cmdPrefix; } 
    332   cmd.append("\"pbi_listrepo --down "+repoNum+"\""); 
    333   qDebug() <<"DB cmd generated:" << cmd; 
    334   //Now run the command 
    335   QStringList result = runCMD(cmd).split("\n"); 
    336   if(!result.isEmpty()){ 
    337     return TRUE; //no special check for this - will need to re-load repos anyway 
    338   }  
    339   return FALSE; 
    340 } 
    341  
    342 bool PBIDBAccess::setRepoMirrors(QString repoNum, QStringList mirrors){ 
    343   QString cmd; 
    344   if(cmdPrefix.isEmpty()){ return FALSE; } 
    345   else{ cmd = cmdPrefix; } 
    346   cmd.append("\"pbi_listrepo --mirror "+mirrors.join(",")+" "+repoNum+"\""); 
    347   qDebug() <<"DB cmd generated:" << cmd; 
    348   //Now run the command 
    349   QStringList result = runCMD(cmd).split("\n"); 
    350   if(!result.isEmpty()){ 
    351     if(mirrors.isEmpty()){ 
    352       if(result[result.length()-1].startsWith("Mirror(s):")){ return TRUE; } 
    353     }else{ 
    354       if(result[result.length()-1] == mirrors[mirrors.length()-1] ){ return TRUE; } 
    355     } 
    356   }  
    357   qDebug() << "PBI Database Error:"; 
    358   qDebug() << " - CMD:"<<cmd; 
    359   qDebug() << " - Error:"<<result; 
    360   return FALSE;          
    361 } 
     115    app = getLocalPkgDetails(app); //this will check the actual app package 
     116  }else{ 
     117    app.isInstalled = false; 
     118  } 
     119  return app; 
     120} 
     121 
     122QStringList PBIDBAccess::AppMenuEntries(NGApp app){ 
     123  if(app.pbiorigin.isEmpty() || !app.hasME ){ return QStringList(); } 
     124  QDir mdir(PBI_DBDIR+app.pbiorigin+"/xdg-menu"); 
     125  QStringList files = mdir.entryList(QStringList() << "*.desktop", QDir::Files | QDir::NoDotAndDotDot, QDir::Name); 
     126  for(int i=0; i<files.length(); i++){ 
     127    files[i] = mdir.absoluteFilePath(files[i]); 
     128  } 
     129  return files; 
     130} 
     131 
     132void PBIDBAccess::getAppCafeHomeInfo(QStringList *NEW, QStringList *HIGHLIGHT, QStringList *RECOMMEND){ 
     133  NEW->clear(); HIGHLIGHT->clear(); RECOMMEND->clear(); 
     134  QStringList info = readAppCafeFile(); 
     135  //qDebug() << "AppCafe File contents:\n" << info; 
     136  for(int i=0; i<info.length(); i++){ 
     137    if(info[i].startsWith("New=")){ NEW->append( info[i].section("::::",0,0).section("=",1,50).simplified() ); } 
     138    else if(info[i].startsWith("Highlight=")){ HIGHLIGHT->append( info[i].section("::::",0,0).section("=",1,50).simplified() ); } 
     139    else if(info[i].startsWith("Recommended=")){  
     140      QString origin = info[i].section("::::",0,0).section("=",1,50).simplified(); 
     141      if(PKGAVAIL.contains(origin)){ 
     142         NGApp app = PKGAVAIL[origin]; 
     143           app.isRecommended = true; 
     144         PKGAVAIL.insert(origin, app); 
     145      } 
     146      if(PKGINSTALLED.contains(origin)){ 
     147         NGApp app = PKGINSTALLED[origin]; 
     148           app.isRecommended = true; 
     149         PKGINSTALLED.insert(origin, app); 
     150      } 
     151      if(PBIAVAIL.contains(origin)){ 
     152         NGApp app = PBIAVAIL[origin]; 
     153           app.isRecommended = true; 
     154         PBIAVAIL.insert(origin, app); 
     155      } 
     156      RECOMMEND->append( origin );  
     157    } 
     158  } 
     159} 
     160 
     161QStringList PBIDBAccess::listJailPackages(QString jailID){ 
     162  if(jailID.isEmpty()){ return QStringList(); } 
     163  QStringList args;  
     164    args << "-j" << jailID; 
     165    args << "query" << "-a" << "APP=%o"; 
     166    // [origin, installed version, installed size, isLocked, timestamp, isOrphan 
     167    QStringList out = runCMD("pkg",args).split("APP="); 
     168    for(int i=0; i<out.length(); i++){ 
     169      out[i] = out[i].simplified(); //remove any extra whitespace 
     170    } 
     171    return out; 
     172} 
     173 
     174QStringList PBIDBAccess::basePackageList(){ 
     175  return QStringList(); 
     176} 
     177 
    362178 
    363179// ======================================== 
    364180// =======  PRIVATE ACCESS FUNCTIONS ====== 
    365181// ======================================== 
     182 
     183//------------------ 
     184//  SYNCERS 
     185//------------------ 
     186bool PBIDBAccess::syncPkgInstallList(QString jailID, bool reload){ 
     187  //qDebug() << "Sync Local PKG Repo"; 
     188  bool synced = false; 
     189  if(PKGINSTALLED.isEmpty() || reload || (jailLoaded!=jailID) ){ 
     190    PKGINSTALLED.clear(); 
     191    QStringList args;  
     192    if( !jailID.isEmpty() ){ args << "-j" << jailID; } 
     193    args << "query" << "-a" << "APP=%o::::%v::::%sh::::%k::::%t::::%a::::%q"; 
     194    // [origin, installed version, installed size, isLocked, timestamp, isOrphan 
     195    QStringList out = runCMD("pkg",args).split("APP=");  
     196    for(int i=0; i<out.length(); i++){ 
     197      QStringList info = out[i].split("::::"); 
     198      if(info.length() < 7){ continue; } //invalid 
     199      NGApp app; 
     200      if(PKGAVAIL.contains(info[0])){ app = PKGAVAIL[info[0]]; } //start from the current remote info 
     201      app.origin = info[0]; 
     202      app.installedversion = info[1]; 
     203      app.installedsize = info[2]; 
     204      app.isLocked = (info[3] == "1"); 
     205      app.installedwhen = QDateTime::fromMSecsSinceEpoch( info[4].toLongLong() ).toString(Qt::DefaultLocaleShortDate); 
     206      app.isOrphan = (info[5] == "1"); 
     207      app.installedarch = info[6]; 
     208      app.isInstalled = true; 
     209      PKGINSTALLED.insert(info[0], app); 
     210    } 
     211    //Now get the reverse dependancy lists 
     212    args.clear();  
     213    if( !jailID.isEmpty() ){ args << "-j" << jailID; } 
     214    args << "query" << "-a" << "APP=%o::::%rn"; 
     215    out = runCMD("pkg", args).split("APP="); 
     216    //qDebug() << "Get reverse Deps:" << out; 
     217    for(int i=0; i<out.length();i++){ 
     218      QStringList info = out[i].split("::::"); 
     219      NGApp app; 
     220      if(PKGINSTALLED.contains(info[0])){ app = PKGINSTALLED[info[0]]; } //Update existing info 
     221      else{ continue; } //invalid 
     222      app.rdependancy.append( info[1].simplified() ); 
     223      PKGINSTALLED.insert(info[0], app); 
     224    } 
     225    jailLoaded = jailID; //keep track of which jail this list is for 
     226    synced = true; 
     227    //qDebug() << "PKGINSTALLED:" << PKGINSTALLED; 
     228  } 
     229  //qDebug() << " - end Local PKG Repo Sync"; 
     230  return synced; 
     231} 
     232 
     233void PBIDBAccess::syncLargePkgRepoList(bool reload){ 
     234  //Detailed list of packages available on the repo (can take a while) 
     235    //  - use PKGAVAIL as the base template for all the other info classes (save on "pkg" calls) 
     236  //qDebug() << "Sync Remote PKG Repo"; 
     237  if(PKGAVAIL.isEmpty() || reload){ 
     238    PKGAVAIL.clear(); 
     239    QStringList args; args << "rquery" << "APP=%o::::%n::::%v::::%m::::%w::::%c::::%e::::%sh::::%q"; 
     240    QStringList out = runCMD("pkg",args).split("APP=");    
     241    for(int i=0; i<out.length(); i++){ 
     242      QStringList info = out[i].split("::::"); 
     243       //qDebug() << "PKG:" << info; 
     244        //[ origin, name, version, maintainer, website, comment, description, size] 
     245        if(info.length() < 9){ continue; } //invalid 
     246      NGApp app; 
     247            app.origin = info[0]; 
     248            app.name = info[1]; 
     249            app.version = info[2]; 
     250            app.maintainer = info[3]; 
     251            app.website = info[4]; 
     252            app.shortdescription = cleanupDescription( info[5].split("\n") ); 
     253            app.description = cleanupDescription( info[6].split("\n") ); 
     254            app.size = info[7]; 
     255            app.arch = info[8]; 
     256            app.portcat = info[0].section("/",0,0).simplified(); 
     257            //app = getRemotePkgDetails(app); 
     258      PKGAVAIL.insert(info[0], app); 
     259    } 
     260  } 
     261  //qDebug() << " - end Remote PKG Repo Sync"; 
     262} 
     263 
     264void PBIDBAccess::syncPbiRepoLists(bool reload){ 
     265  // NOTE: Uses the PKGAVAIL and PKGINSTALLED lists  - check your sync order!! 
     266  //qDebug() << "Sync PBI repo"; 
     267  //All PBIs/Categories available in the index (jail independant) 
     268  if(PBIAVAIL.isEmpty() || CATAVAIL.isEmpty() || reload){ 
     269    PBIAVAIL.clear(); CATAVAIL.clear(); 
     270    QStringList index = readIndexFile(); 
     271    index.sort(); //make sure that categories are first (Cat=, PBI=) 
     272    for(int i=0; i<index.length(); i++){ 
     273      if(index[i].startsWith("Cat=")){ 
     274        NGCat cat = parseNgCatLine( index[i].section("=",1,50) ); 
     275        if(!cat.portcat.isEmpty()){ 
     276          //qDebug() << "CAT:" << cat.portcat << cat.name; 
     277          CATAVAIL.insert(cat.portcat, cat); 
     278        } 
     279      }else if(index[i].startsWith("PBI=")){ 
     280         
     281        NGApp app = parseNgIndexLine( index[i].section("=",1,50) ); 
     282        //Prune the PBI app based upon package availability 
     283        //qDebug() << "PBI:" << app.origin << PKGAVAILABLE.contains(app.origin); 
     284        if( !app.origin.isEmpty() && PKGAVAIL.contains(app.origin) ){ 
     285          //qDebug() << "PBI Available:" << app.origin << app.name; 
     286          //Also check for additional required packages 
     287          bool ok = true; 
     288          for(int i=0; i<app.needsPkgs.length(); i++){ 
     289            if( !PKGAVAIL.contains(app.needsPkgs[i]) ){ ok = false; qDebug() << "BAD PBI:" << app.origin << app.needsPkgs; break; } 
     290          } 
     291          if(!ok && app.isInstalled){ qDebug() <<" - but is installed"; app.isInstalled=false; ok = true; } 
     292          if(ok){ 
     293            //if(app.isInstalled){ qDebug() << "PBI Installed:" << app.origin << app.name << app.installedversion; } 
     294            PBIAVAIL.insert(app.origin, app); 
     295          } 
     296        } 
     297      }else if(index[i].startsWith("PKG=")){ 
     298        //Additional PKG info in the PBI index (to save on pkg calls for multi-line info) 
     299          //Just adds additional info for existing packages 
     300        parseNgPkgLine( index[i].section("=",1,100) ); 
     301      } 
     302    } 
     303  } //end sync if necessary 
     304  //qDebug() << " - end PBI repo sync"; 
     305} 
     306 
     307//------------------- 
     308//   PARSERS 
     309//------------------- 
     310NGApp PBIDBAccess::parseNgIndexLine(QString line){ 
     311  //PBI= index line: [port, name, +ports, author, website, license, app type, category, tags, maintainer, shortdesc, fulldesc, screenshots, related, plugins, conf dir] 
     312  // screenshots = list of URL's for screenshots (empty space delimiter? Note "%20"->" " conversion within a single URL) 
     313  // related = list of ports that are similar to this one 
     314  QStringList lineInfo = line.split("::::"); 
     315  if(lineInfo.length() < 18){ return NGApp(); } //invalid entry - skip it 
     316  QString orig = lineInfo[0]; 
     317  NGApp app; 
     318  if(PKGINSTALLED.contains(orig)){ app = PKGINSTALLED[orig]; } //Try to start with the known info 
     319  else if(PKGAVAIL.contains(orig)){ app = PKGAVAIL[orig]; } 
     320        app.origin = orig; 
     321        app.name = lineInfo[1]; 
     322        app.needsPkgs = lineInfo[2].split(" ", QString::SkipEmptyParts); 
     323        app.author = lineInfo[3]; 
     324        app.website = lineInfo[4]; 
     325        app.license = lineInfo[5]; 
     326        app.type = lineInfo[6]; 
     327        app.category = app.origin.section("/",0,0); 
     328        app.tags = lineInfo[8].split(","); 
     329        app.maintainer = lineInfo[9]; 
     330        app.shortdescription = cleanupDescription( lineInfo[10].split("<br>") ); 
     331        app.description = cleanupDescription( lineInfo[11].split("<br>") ); 
     332        app.screenshots = lineInfo[12].split(" ", QString::SkipEmptyParts); 
     333            app.screenshots = app.screenshots.replaceInStrings("%20"," "); 
     334        app.similarApps = lineInfo[13].split(" ", QString::SkipEmptyParts); 
     335        app.possiblePlugins = lineInfo[14].split(" ", QString::SkipEmptyParts); 
     336        app.pbiorigin = lineInfo[15]; 
     337        app.buildOptions = lineInfo[16].split(" ",QString::SkipEmptyParts); 
     338        app.rating = lineInfo[17]; //all ratings out of 5 total 
     339        //Now check for different types of shortcuts for this app 
     340        app.hasDE = QFile::exists( PBI_DBDIR+app.pbiorigin+"/xdg-desktop" ); 
     341        app.hasME = QFile::exists( PBI_DBDIR+app.pbiorigin+"/xdg-menu" ); 
     342        app.hasMT = QFile::exists( PBI_DBDIR+app.pbiorigin+"/xdg-mime" ); 
     343        //Now create the path to the icon in the index 
     344        app.icon = PBI_DBDIR+app.pbiorigin+"/icon.png"; 
     345  //qDebug() << "Found App:" << app.name << app.origin; 
     346  return app; 
     347} 
     348 
     349NGCat PBIDBAccess::parseNgCatLine(QString line){ 
     350  //Cat= index line: [name, icon, description, freebsd category] 
     351  QStringList lineInfo = line.split("::::"); 
     352  NGCat cat; 
     353        if(lineInfo.length() < 4){ return cat; } //invalid entry - skip it 
     354        cat.name = lineInfo[0]; 
     355        cat.icon = PBI_DBDIR+"PBI-cat-icons/"+lineInfo[1]; 
     356        cat.description = cleanupDescription( lineInfo[2].split("<br>") ); 
     357        cat.portcat = lineInfo[3].remove(":"); 
     358  //qDebug() << "Found Cat:" << cat.name << cat.portcat; 
     359  return cat; 
     360} 
     361 
     362void PBIDBAccess::parseNgPkgLine(QString line){ 
     363  //Add this additional information to any existing data 
     364  //PKG= [origin, options, licences] 
     365  QStringList info = line.split("::::"); 
     366  if(info.length() < 3){ return; } 
     367  if(PBIAVAIL.contains(info[0])){ 
     368    NGApp app = PBIAVAIL[info[0]]; 
     369      if(!info[1].isEmpty()){ app.buildOptions = info[1].split(" "); } 
     370      if(!info[2].isEmpty()){ app.license = info[2]; } 
     371      PBIAVAIL.insert(info[0], app); 
     372  } 
     373  if(PKGINSTALLED.contains(info[0])){ 
     374    NGApp app = PKGINSTALLED[info[0]]; 
     375      if(!info[1].isEmpty()){ app.buildOptions = info[1].split(" "); } 
     376      if(!info[2].isEmpty()){ app.license = info[2]; } 
     377      PKGINSTALLED.insert(info[0], app); 
     378  } 
     379  if(PKGAVAIL.contains(info[0])){ 
     380    NGApp app = PKGAVAIL[info[0]]; 
     381      if(!info[