aboutsummaryrefslogtreecommitdiff
path: root/src-qt5
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5')
-rw-r--r--src-qt5/core-utils/lumina-config/mainWindow.cpp3
-rw-r--r--src-qt5/core-utils/lumina-config/pages/PageWidget.h2
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_compton.cpp13
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_main.cpp5
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_main.h1
-rw-r--r--src-qt5/core-utils/lumina-config/pages/page_mouse.cpp2
-rw-r--r--src-qt5/core/libLumina/LInputDevice.cpp40
-rw-r--r--src-qt5/core/libLumina/LInputDevice.h11
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/MainUI.cpp83
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/MainUI.h3
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/MainUI.ui34
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp47
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/TarBackend.h7
-rw-r--r--src-qt5/desktop-utils/lumina-archiver/isoDialog.ui151
14 files changed, 351 insertions, 51 deletions
diff --git a/src-qt5/core-utils/lumina-config/mainWindow.cpp b/src-qt5/core-utils/lumina-config/mainWindow.cpp
index d6ada8f5..659cb306 100644
--- a/src-qt5/core-utils/lumina-config/mainWindow.cpp
+++ b/src-qt5/core-utils/lumina-config/mainWindow.cpp
@@ -9,6 +9,7 @@
#include "globals.h"
#include "pages/getPage.h"
+#include "pages/page_main.h"
//=============
// PUBLIC
@@ -133,7 +134,7 @@ void mainWindow::on_actionSave_triggered(){
}
void mainWindow::on_actionBack_triggered(){
- if(cpage.isEmpty()){ this->close(); } //main menu - go ahead and close it
+ if(cpage.isEmpty()){ }// page_main::clearlineEdit(); } //since ESC doesnt close any other Lumina Appliction by default, I've commented this out for the time being.
else{ page_change(""); } //Use the interactive wrapper (check for save state, etc).
}
diff --git a/src-qt5/core-utils/lumina-config/pages/PageWidget.h b/src-qt5/core-utils/lumina-config/pages/PageWidget.h
index 2d663e71..8cd23db7 100644
--- a/src-qt5/core-utils/lumina-config/pages/PageWidget.h
+++ b/src-qt5/core-utils/lumina-config/pages/PageWidget.h
@@ -52,7 +52,7 @@ public slots:
//Simplification function for widget connections
virtual void settingChanged(){
- emit HasPendingChanges(true);
+ emit HasPendingChanges(true);
}
};
diff --git a/src-qt5/core-utils/lumina-config/pages/page_compton.cpp b/src-qt5/core-utils/lumina-config/pages/page_compton.cpp
index e3bfe1fd..8cdb2ea7 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_compton.cpp
+++ b/src-qt5/core-utils/lumina-config/pages/page_compton.cpp
@@ -12,11 +12,10 @@
// PUBLIC
//==========
page_compton::page_compton(QWidget *parent) : PageWidget(parent), ui(new Ui::page_compton()){
- ui->setupUi(this);
- connect(ui->text_file, SIGNAL(textChanged()), this, SLOT(settingChanged()) );
- connect(ui->check_disablecompton, SIGNAL(toggled(bool)), this, SLOT(settingChanged()) );
- connect(ui->check_GPUverify, SIGNAL(toggled(bool)), this, SLOT(settingChanged()) );
- updateIcons();
+ ui->setupUi(this);
+ connect(ui->text_file, SIGNAL(textChanged()), this, SLOT(settingChanged()) );
+ connect(ui->check_disablecompton, SIGNAL(toggled(bool)), this, SLOT(settingChanged()) );
+ updateIcons();
}
page_compton::~page_compton(){
@@ -36,7 +35,6 @@ void page_compton::SaveSettings(){
}
void page_compton::LoadSettings(int){
- emit HasPendingChanges(false);
emit ChangePageTitle( tr("Compositor Settings") );
QSettings settings("lumina-desktop","sessionsettings");
ui->check_disablecompton->setChecked( !settings.value("enableCompositing", true).toBool() );
@@ -44,10 +42,11 @@ void page_compton::LoadSettings(int){
QString set = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/compton.conf";
qDebug() << "Load Compton settings:" << set;
ui->text_file->setPlainText( LUtils::readFile(set).join("\n") );
+ emit HasPendingChanges(false);
}
void page_compton::updateIcons(){
-
+emit HasPendingChanges(false);
}
//=================
diff --git a/src-qt5/core-utils/lumina-config/pages/page_main.cpp b/src-qt5/core-utils/lumina-config/pages/page_main.cpp
index 69b32c09..e60606f3 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_main.cpp
+++ b/src-qt5/core-utils/lumina-config/pages/page_main.cpp
@@ -121,6 +121,11 @@ void page_main::SaveSettings(){
}
+void page_main::clearlineEdit(){
+ ui->lineEdit->clear();
+}
+
+
void page_main::LoadSettings(int){
emit HasPendingChanges(false);
emit ChangePageTitle( tr("Desktop Settings") );
diff --git a/src-qt5/core-utils/lumina-config/pages/page_main.h b/src-qt5/core-utils/lumina-config/pages/page_main.h
index e4bfeafd..095815e9 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_main.h
+++ b/src-qt5/core-utils/lumina-config/pages/page_main.h
@@ -20,6 +20,7 @@ public:
~page_main();
virtual void setPreviousPage(QString id);
+ void clearlineEdit();
public slots:
void SaveSettings();
diff --git a/src-qt5/core-utils/lumina-config/pages/page_mouse.cpp b/src-qt5/core-utils/lumina-config/pages/page_mouse.cpp
index 0dabdf2d..dbe075d7 100644
--- a/src-qt5/core-utils/lumina-config/pages/page_mouse.cpp
+++ b/src-qt5/core-utils/lumina-config/pages/page_mouse.cpp
@@ -24,7 +24,7 @@ page_mouse::page_mouse(QWidget *parent) : PageWidget(parent), ui(new Ui::page_mo
}else{
qDebug() << "Found Pointer:" << devices[i]->devNumber();
qDebug() << " - isExtension:" << devices[i]->isExtension();
- devices[i]->listProperties();
+ qDebug() << " - Properties:" << devices[i]->listProperties();
}
}
}
diff --git a/src-qt5/core/libLumina/LInputDevice.cpp b/src-qt5/core/libLumina/LInputDevice.cpp
index 79f5c27f..d141e39a 100644
--- a/src-qt5/core/libLumina/LInputDevice.cpp
+++ b/src-qt5/core/libLumina/LInputDevice.cpp
@@ -15,12 +15,17 @@
#include <xcb/xcb.h>
#include <xcb/xcb_atom.h>
#include <xcb/xinput.h>
+#include <xcb/xproto.h>
-// LInputDevice Class
+//===================
+// LInputDevice Class
+//===================
+// === PUBLIC ===
LInputDevice::LInputDevice(unsigned int id, unsigned int type){
devID = id;
devType = type;
//devName = name;
+ getProperties(); //need to populate the name/atom correlations for properties
}
LInputDevice::~LInputDevice(){
@@ -47,18 +52,37 @@ bool LInputDevice::isExtension(){
|| devType==XCB_INPUT_DEVICE_USE_IS_X_EXTENSION_POINTER);
}
+// Property Management
QStringList LInputDevice::listProperties(){
+ return devProps.keys();
+}
+
+QVariant LInputDevice::propertyValue(QString prop){
+ if(!devProps.contains(prop)){ return QVariant(); }
+ //Now generate the property request
+ // xcb_input_get_device_property_cookie_t cookie = xcb_input_get_device_property_unchecked( QX11Info::connection(), devProps.value(prop), \
+// XCB_ATOM_ATOM, 0, 1000, devID, NULL);
+ QVariant result;
+ return result;
+}
+
+// === PRIVATE ===
+void LInputDevice::getProperties(){
+ devProps.clear();
xcb_input_list_device_properties_cookie_t cookie = xcb_input_list_device_properties_unchecked(QX11Info::connection(), devID);
xcb_input_list_device_properties_reply_t *reply = xcb_input_list_device_properties_reply(QX11Info::connection(), cookie, NULL);
- qDebug() << "Property List:";
- qDebug() << " - response_type:" << reply->response_type;
- qDebug() << " - num atoms:" << reply->num_atoms;
- qDebug() << " - length:" << reply->length;
- qDebug() << " - sequence:" << reply->sequence;
+ //Get the atoms
+ xcb_atom_t *atoms = xcb_input_list_device_properties_atoms(reply);
+ //qDebug() << "Property Response Type:" << reply->response_type; //Always seems to be "1"
+ QList<xcb_get_atom_name_cookie_t> cookies;
+ for(int i=0; i<reply->num_atoms; i++){ cookies << xcb_get_atom_name(QX11Info::connection(), atoms[i]); }
+ for(int i=0; i<reply->num_atoms; i++){
+ xcb_get_atom_name_reply_t *nr = xcb_get_atom_name_reply(QX11Info::connection(), cookies[i], NULL);
+ devProps.insert(QString::fromUtf8( xcb_get_atom_name_name(nr), xcb_get_atom_name_name_length(nr) ),atoms[i] );
+ ::free(nr);
+ }
//Done with data structure
::free(reply);
- //Return info
- return QStringList();
}
//======================
// LInput Static Functions
diff --git a/src-qt5/core/libLumina/LInputDevice.h b/src-qt5/core/libLumina/LInputDevice.h
index 1293ea92..f7a4713c 100644
--- a/src-qt5/core/libLumina/LInputDevice.h
+++ b/src-qt5/core/libLumina/LInputDevice.h
@@ -13,24 +13,33 @@
#include <QList>
#include <QString>
#include <QStringList>
+#include <QHash>
+#include <QVariant>
+
+#include <xcb/xproto.h>
class LInputDevice{
public:
LInputDevice(unsigned int id, unsigned int type); //don't use this directly - use the "listDevices()" function instead
~LInputDevice();
+ //Device Information
//QString name(); //Return the name of this device
unsigned int devNumber();
bool isPointer();
bool isKeyboard();
bool isExtension();
- //List Properties of device
+ //Property Management
QStringList listProperties();
+ QVariant propertyValue(QString prop);
private:
unsigned int devID; //device ID number - assigned at class creation
unsigned int devType; //device "use" identifier - assigned at class creation
+ QHash<QString, xcb_atom_t> devProps; //Known device properties <name, atom>
+
+ void getProperties();
//QString devName; //device name - use this for cross-session management (id #'s can get changed every session)
};
diff --git a/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp b/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp
index 9710045c..9d41374c 100644
--- a/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp
+++ b/src-qt5/desktop-utils/lumina-archiver/MainUI.cpp
@@ -18,7 +18,7 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
this->setWindowTitle(tr("Archive Manager"));
BACKEND = new Backend(this);
connect(BACKEND, SIGNAL(ProcessStarting()), this, SLOT(ProcStarting()) );
- connect(BACKEND, SIGNAL(ProcessFinished()), this, SLOT(ProcFinished()) );
+ connect(BACKEND, SIGNAL(ProcessFinished(bool, QString)), this, SLOT(ProcFinished(bool, QString)) );
connect(BACKEND, SIGNAL(ProgressUpdate(int, QString)), this, SLOT(ProcUpdate(int, QString)) );
//Add a spacer between toolbar items
@@ -33,16 +33,18 @@ MainUI::MainUI() : QMainWindow(), ui(new Ui::MainUI){
connect(ui->actionAdd_File, SIGNAL(triggered()), this, SLOT(addFiles()) );
connect(ui->actionRemove_File, SIGNAL(triggered()), this, SLOT(remFiles()) );
connect(ui->actionExtract_All, SIGNAL(triggered()), this, SLOT(extractFiles()) );
+ connect(ui->actionExtract_Sel, SIGNAL(triggered()), this, SLOT(extractSelection()) );
connect(ui->actionAdd_Dirs, SIGNAL(triggered()), this, SLOT(addDirs()) );
connect(ui->tree_contents, SIGNAL(itemDoubleClicked(QTreeWidgetItem*, int)), this, SLOT(ViewFile(QTreeWidgetItem*)) );
ui->progressBar->setVisible(false);
ui->label_progress->setVisible(false);
+ ui->label_progress_icon->setVisible(false);
ui->actionAdd_File->setEnabled(false);
ui->actionRemove_File->setEnabled(false);
ui->actionExtract_All->setEnabled(false);
ui->actionAdd_Dirs->setEnabled(false);
loadIcons();
- ui->tree_contents->setHeaderLabels( QStringList() << tr("File") << tr("MimeType") << tr("Size") << tr("Compressed")+" " );
+ ui->tree_contents->setHeaderLabels( QStringList() << tr("File") << tr("MimeType") << tr("Size")+" " );
}
MainUI::~MainUI(){
@@ -51,7 +53,11 @@ MainUI::~MainUI(){
void MainUI::LoadArguments(QStringList args){
for(int i=0; i<args.length(); i++){
- if(QFile::exists(args[i])){ BACKEND->loadFile(args[i]); break;}
+ if(QFile::exists(args[i])){
+ ui->label_progress->setText(tr("Opening Archive..."));
+ BACKEND->loadFile(args[i]);
+ break;
+ }
}
}
@@ -64,6 +70,7 @@ void MainUI::loadIcons(){
ui->actionAdd_Dirs->setIcon( LXDG::findIcon("archive-insert-directory","") );
ui->actionRemove_File->setIcon( LXDG::findIcon("archive-remove","") );
ui->actionExtract_All->setIcon( LXDG::findIcon("archive-extract","") );
+ ui->actionExtract_Sel->setIcon( LXDG::findIcon("archive-extract","") );
}
//===================
@@ -72,17 +79,16 @@ void MainUI::loadIcons(){
QTreeWidgetItem* MainUI::findItem(QString path, QTreeWidgetItem *start){
if(start==0){
for(int i=0; i<ui->tree_contents->topLevelItemCount(); i++){
- QString itpath = ui->tree_contents->topLevelItem(i)->whatsThis(0);
- if(itpath == path){ return ui->tree_contents->topLevelItem(i); }
- else if(path.startsWith(itpath+"/")){ return findItem(path, ui->tree_contents->topLevelItem(i)); }
+ if(ui->tree_contents->topLevelItem(i)->whatsThis(0) == path){ return ui->tree_contents->topLevelItem(i); }
+ else if(path.startsWith(ui->tree_contents->topLevelItem(i)->whatsThis(0)+"/")){ return findItem(path, ui->tree_contents->topLevelItem(i)); }
}
}else{
for(int i=0; i<start->childCount(); i++){
- QString itpath = start->child(i)->whatsThis(0);
- if(itpath == path){ return start->child(i); }
- else if(path.startsWith(itpath+"/")){ return findItem(path, start->child(i)); }
+ if(start->child(i)->whatsThis(0) == path){ return start->child(i); }
+ else if(path.startsWith(start->child(i)->whatsThis(0)+"/")){ return findItem(path, start->child(i)); }
}
}
+ //qDebug() << "Could not find item:" << path;
return 0; //nothing found
}
@@ -158,24 +164,28 @@ void MainUI::NewArchive(){
if(QFile::exists(file)){
if( !QFile::remove(file) ){ QMessageBox::warning(this, tr("Error"), QString(tr("Could not overwrite file:"))+"\n"+file); }
}
+ ui->label_progress->setText(""); //just clear it (this action is instant)
BACKEND->loadFile(file);
}
void MainUI::OpenArchive(){
QString file = QFileDialog::getOpenFileName(this, tr("Open Archive"), QDir::homePath(), OpenFileTypes() );
if(file.isEmpty()){ return; }
+ ui->label_progress->setText(tr("Opening Archive..."));
BACKEND->loadFile(file);
}
void MainUI::addFiles(){
QStringList files = QFileDialog::getOpenFileNames(this, tr("Add to Archive"), QDir::homePath() );
if(files.isEmpty()){ return; }
+ ui->label_progress->setText(tr("Adding Items..."));
BACKEND->startAdd(files);
}
void MainUI::addDirs(){
QString dirs = QFileDialog::getExistingDirectory(this, tr("Add to Archive"), QDir::homePath() );
if(dirs.isEmpty()){ return; }
+ ui->label_progress->setText(tr("Adding Items..."));
BACKEND->startAdd(QStringList() << dirs);
}
@@ -186,35 +196,57 @@ void MainUI::remFiles(){
items << sel[i]->whatsThis(0);
}
items.removeDuplicates();
+ ui->label_progress->setText(tr("Removing Items..."));
BACKEND->startRemove(items);
}
void MainUI::extractFiles(){
QString dir = QFileDialog::getExistingDirectory(this, tr("Extract Into Directory"), QDir::homePath() );
if(dir.isEmpty()){ return; }
+ ui->label_progress->setText(tr("Extracting..."));
BACKEND->startExtract(dir, true);
}
+void MainUI::extractSelection(){
+ if(ui->tree_contents->currentItem()==0){ return; }
+ QString sel = ui->tree_contents->currentItem()->whatsThis(0);
+ QString dir = QFileDialog::getExistingDirectory(this, tr("Extract Into Directory"), QDir::homePath() );
+ if(dir.isEmpty()){ return; }
+ ui->label_progress->setText(tr("Extracting..."));
+ BACKEND->startExtract(dir, true, sel);
+}
+
void MainUI::ViewFile(QTreeWidgetItem *it){
if(it->childCount()>0){ return; } //directory - not viewable
+ ui->label_progress->setText(tr("Extracting..."));
BACKEND->startViewFile(it->whatsThis(0));
}
void MainUI::UpdateTree(){
- ui->tree_contents->setHeaderLabels( QStringList() << tr("File") << tr("MimeType") << tr("Size") << tr("Compressed")+" " );
+ this->setEnabled(false);
+ ui->tree_contents->setHeaderLabels( QStringList() << tr("File") << tr("MimeType") << tr("Size")+" " );
QStringList files = BACKEND->heirarchy();
files.sort();
//Remove any entries for file no longer in the archive
bool changed = cleanItems(files);
- qDebug() << "Found Files:" << files;
+ //qDebug() << "Found Files:" << files;
for(int i=0; i<files.length(); i++){
if(0 != findItem(files[i]) ){ continue; } //already in the tree widget
QString mime = LXDG::findAppMimeForFile(files[i].section("/",-1), false); //first match only
- QTreeWidgetItem *it = new QTreeWidgetItem( QStringList() << files[i].section("/",-1) << mime << LUtils::BytesToDisplaySize( BACKEND->size(files[i])) << LUtils::BytesToDisplaySize(BACKEND->csize(files[i])) );
+ QTreeWidgetItem *it = new QTreeWidgetItem();
+ it->setText(0, files[i].section("/",-1) );
+ if(!BACKEND->isLink(files[i])){
+ it->setText(1, LXDG::findAppMimeForFile(files[i].section("/",-1), false) );
+ it->setText(2, LUtils::BytesToDisplaySize( BACKEND->size(files[i])) );
+ }else{
+ it->setText(1, QString(tr("Link To: %1")).arg(BACKEND->linkTo(files[i]) ) );
+ }
it->setWhatsThis(0, files[i]);
if(BACKEND->isDir(files[i])){
it->setIcon(0, LXDG::findIcon("folder",""));
it->setText(1,""); //clear the mimetype
+ }else if(BACKEND->isLink(files[i])){
+ it->setIcon(0, LXDG::findIcon("emblem-symbolic-link","") );
}else{
it->setIcon(0, LXDG::findMimeIcon(files[i].section("/",-1)) );
}
@@ -226,14 +258,23 @@ void MainUI::UpdateTree(){
else{ parent->addChild(it); }
}else{
ui->tree_contents->addTopLevelItem(it);
+ QApplication::processEvents();
}
changed = true;
}
- int wid = 0;
+
if(changed){
- for(int i=3; i>0; i--){ui->tree_contents->resizeColumnToContents(i); wid+= ui->tree_contents->columnWidth(i); }
+ int wid = ui->tree_contents->fontMetrics().width("W")*5;
+ ui->tree_contents->setColumnWidth(2, wid);
+ for(int i=1; i<2; i++){ui->tree_contents->resizeColumnToContents(i); QApplication::processEvents(); wid+= ui->tree_contents->columnWidth(i); }
+ //qDebug() << "Set column 0 width:" << wid << ui->tree_contents->viewport()->width();
ui->tree_contents->setColumnWidth(0, ui->tree_contents->viewport()->width()-wid);
}
+ ui->tree_contents->sortItems(0, Qt::AscendingOrder); //sort by name
+ ui->tree_contents->sortItems(1,Qt::AscendingOrder); //sort by mimetype (put dirs first - still organized by name)
+
+ this->setEnabled(true);
+ ui->tree_contents->setEnabled(true);
}
//Backend Handling
@@ -241,17 +282,22 @@ void MainUI::ProcStarting(){
ui->progressBar->setRange(0,0);
ui->progressBar->setValue(0);
ui->progressBar->setVisible(true);
- ui->label_progress->setVisible(true);
+ ui->label_progress->setVisible(!ui->label_progress->text().isEmpty());
+ ui->label_progress_icon->setVisible(false);
ui->tree_contents->setEnabled(false);
ui->label_archive->setText(BACKEND->currentFile());
}
-void MainUI::ProcFinished(){
+void MainUI::ProcFinished(bool success, QString msg){
+ UpdateTree();
ui->progressBar->setRange(0,0);
ui->progressBar->setValue(0);
ui->progressBar->setVisible(false);
- ui->label_progress->setVisible(false);
- ui->tree_contents->setEnabled(true);
+ ui->label_progress->setText(msg);
+ ui->label_progress->setVisible(!msg.isEmpty());
+ ui->label_progress_icon->setVisible(!msg.isEmpty());
+ if(success){ ui->label_progress_icon->setPixmap( LXDG::findIcon("task-complete","").pixmap(32,32) );}
+ else{ ui->label_progress_icon->setPixmap( LXDG::findIcon("task-attention","").pixmap(32,32) );}
if(ui->label_archive->text()!=BACKEND->currentFile()){
ui->label_archive->setText(BACKEND->currentFile());
this->setWindowTitle(BACKEND->currentFile().section("/",-1));
@@ -265,7 +311,6 @@ void MainUI::ProcFinished(){
ui->actionRemove_File->setEnabled(canmodify && info.exists());
ui->actionExtract_All->setEnabled(info.exists());
ui->actionAdd_Dirs->setEnabled(canmodify);
- UpdateTree();
}
void MainUI::ProcUpdate(int percent, QString txt){
diff --git a/src-qt5/desktop-utils/lumina-archiver/MainUI.h b/src-qt5/desktop-utils/lumina-archiver/MainUI.h
index 09207aa3..bb462a7d 100644
--- a/src-qt5/desktop-utils/lumina-archiver/MainUI.h
+++ b/src-qt5/desktop-utils/lumina-archiver/MainUI.h
@@ -44,13 +44,14 @@ private slots:
void addDirs();
void remFiles();
void extractFiles();
+ void extractSelection();
void ViewFile(QTreeWidgetItem *it);
void UpdateTree();
//Backend Handling
void ProcStarting();
- void ProcFinished();
+ void ProcFinished(bool, QString);
void ProcUpdate(int percent, QString txt);
};
diff --git a/src-qt5/desktop-utils/lumina-archiver/MainUI.ui b/src-qt5/desktop-utils/lumina-archiver/MainUI.ui
index 8c2b2836..1aff2e4f 100644
--- a/src-qt5/desktop-utils/lumina-archiver/MainUI.ui
+++ b/src-qt5/desktop-utils/lumina-archiver/MainUI.ui
@@ -57,6 +57,31 @@
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
+ <widget class="QLabel" name="label_progress_icon">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QProgressBar" name="progressBar">
<property name="value">
<number>24</number>
@@ -68,6 +93,9 @@
<property name="text">
<string notr="true"/>
</property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
</widget>
</item>
</layout>
@@ -101,6 +129,7 @@
<addaction name="actionRemove_File"/>
<addaction name="separator"/>
<addaction name="actionExtract_All"/>
+ <addaction name="actionExtract_Sel"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuEdit"/>
@@ -183,6 +212,11 @@
<string>Add directory to archive</string>
</property>
</action>
+ <action name="actionExtract_Sel">
+ <property name="text">
+ <string>Extract Selection</string>
+ </property>
+ </action>
</widget>
<resources/>
<connections/>
diff --git a/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp b/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp
index 4dee247b..919a6813 100644
--- a/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp
+++ b/src-qt5/desktop-utils/lumina-archiver/TarBackend.cpp
@@ -32,7 +32,7 @@ void Backend::loadFile(QString path){
flags.clear();
flags << "-f" << filepath; //add the actual archive path
if(QFile::exists(path)){ startList(); }
- else{ contents.clear(); emit ProcessFinished(); }
+ else{ contents.clear(); emit ProcessFinished(true, ""); }
}
bool Backend::canModify(){
@@ -75,6 +75,16 @@ bool Backend::isDir(QString file){
return contents.value(file)[0].startsWith("d");
}
+bool Backend::isLink(QString file){
+ if(!contents.contains(file)){ return false; }
+ return contents.value(file)[0].startsWith("l");
+}
+
+QString Backend::linkTo(QString file){
+ if(!contents.contains(file)){ return ""; }
+ return contents.value(file)[2];
+}
+
//Modification routines
void Backend::startAdd(QStringList paths){
//NOTE: All the "paths" have to have the same parent directory
@@ -115,11 +125,13 @@ void Backend::startRemove(QStringList paths){
PROC.start("tar", args);
}
-void Backend::startExtract(QString path, bool overwrite){
+void Backend::startExtract(QString path, bool overwrite, QString file){
QStringList args;
args << "-x";
if(!overwrite){ args << "-k"; }
- args << flags << "-C" << path;
+ args << flags;
+ if(!file.isEmpty()){ args << "--include" << file << "--strip-components" << QString::number(file.count("/")); }
+ args << "-C" << path;
STARTING=true;
//qDebug() << "Starting command:" << "tar" << args;
PROC.start("tar", args);
@@ -151,14 +163,23 @@ void Backend::parseLines(QStringList lines){
QString file = info[1];
QString perms = "";
if(file.endsWith("/")){ perms = "d"; file.chop(1); }
- contents.insert(file, QStringList() << perms << "-1" ); //Save the [perms, size ]
+ contents.insert(file, QStringList() << perms << "-1" <<""); //Save the [perms, size, linkto ]
}
else if(info.length()<9){ continue; } //invalid line
//TAR Archive parsing
while(info.length()>9){ info[8] = info[8]+" "+info[9]; info.removeAt(9); } //Filename has spaces in it
QString file = info[8];
if(file.endsWith("/")){ file.chop(1); }
- contents.insert(file, QStringList() << info[0] << info[4] ); //Save the [perms, size ]
+ QString linkto;
+ //See if this file has the "link to" or "->" notation
+ if(file.contains(" -> ")){ linkto = file.section(" -> ",1,-1); file = file.section(" -> ",0,0); }
+ else if(file.contains(" link to ")){
+ //Special case - alternate form of a link within a tar archive (not reflected in perms)
+ linkto = file.section(" link to ",1,-1);
+ file = file.section(" link to ",0,0);
+ if(info[0].startsWith("-")){ info[0].replace(0,1,"l"); }
+ }
+ contents.insert(file, QStringList() << info[0] << info[4] << linkto); //Save the [perms, size, linkto ]
}
}
@@ -174,17 +195,19 @@ void Backend::startList(){
// PRIVATE SLOTS
//===============
void Backend::procFinished(int retcode, QProcess::ExitStatus){
+ static QString result;
processData();
- qDebug() << "Process Finished:" << PROC.arguments() << retcode;
+ //qDebug() << "Process Finished:" << PROC.arguments() << retcode;
LIST = STARTING = false;
if(PROC.arguments().contains("-tv")){
if(retcode!=0){ contents.clear(); } //could not read archive
- emit ProcessFinished();
+ emit ProcessFinished(true,result);
+ result.clear();
}else{
bool needupdate = true;
QStringList args = PROC.arguments();
if(args.contains("-x") && retcode==0){
- needupdate=false;
+ needupdate=false;
if(args.contains("--include")){
//Need to find the full path to the extracted file
QString path = args.last() +"/"+ args[ args.indexOf("--include")+1].section("/",-1);
@@ -201,8 +224,10 @@ void Backend::procFinished(int retcode, QProcess::ExitStatus){
QFile::remove(tmpfilepath);
}
}
+ if(args.contains("-x")){ result = tr("Extraction Finished"); }
+ else if(args.contains("-c")){ result = tr("Modification Finished"); }
if(needupdate){ startList(); }
- else{ emit ProcessFinished(); }
+ else{ emit ProcessFinished(retcode==0, result); result.clear(); }
}
}
@@ -213,7 +238,9 @@ void Backend::processData(){
if(read.endsWith("\n")){ data.clear(); }
else{ data = read.section("\n",-1); read = read.section("\n",0,-2); }
QStringList lines = read.split("\n",QString::SkipEmptyParts);
+ QString info;
if(LIST){ parseLines(lines); }
+ else if(!lines.isEmpty()){ info = lines.last(); }
//qDebug() << lines;
- emit ProgressUpdate(-1, "");
+ emit ProgressUpdate(-1, info);
}
diff --git a/src-qt5/desktop-utils/lumina-archiver/TarBackend.h b/src-qt5/desktop-utils/lumina-archiver/TarBackend.h
index f12aae63..47bc0bb6 100644
--- a/src-qt5/desktop-utils/lumina-archiver/TarBackend.h
+++ b/src-qt5/desktop-utils/lumina-archiver/TarBackend.h
@@ -29,14 +29,17 @@ public:
double size(QString file);
double csize(QString file);
bool isDir(QString file);
+ bool isLink(QString file);
+ QString linkTo(QString file);
//Modification routines
void startAdd(QStringList paths);
void startRemove(QStringList paths);
- void startExtract(QString path, bool overwrite); //path to dir
+ void startExtract(QString path, bool overwrite, QString file=""); //path to dir, overwrite, optional file to extract (everything otherwise)
void startViewFile(QString path);
+ //Special process
public slots:
private:
@@ -58,7 +61,7 @@ signals:
void FileLoaded();
void ProcessStarting();
void ProgressUpdate(int, QString); //percentage, text
- void ProcessFinished();
+ void ProcessFinished(bool, QString); //success, text
};
#endif
diff --git a/src-qt5/desktop-utils/lumina-archiver/isoDialog.ui b/src-qt5/desktop-utils/lumina-archiver/isoDialog.ui
new file mode 100644
index 00000000..99ba31fb
--- /dev/null
+++ b/src-qt5/desktop-utils/lumina-archiver/isoDialog.ui
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>isoDialog</class>
+ <widget class="QDialog" name="isoDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>305</width>
+ <height>179</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Burn ISO/IMG to device</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_iso">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>TextLabel</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Transfer Rate</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QSpinBox" name="spin_rate_num">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>1023</number>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="combo_rate_units"/>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>USB Device</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QCheckBox" name="check_sync">
+ <property name="text">
+ <string>Wipe all extra space on device (conv = sync)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QComboBox" name="combo_devices"/>
+ </item>
+ <item>
+ <widget class="QToolButton" name="tool_refresh">
+ <property name="toolTip">
+ <string>Refresh Device List</string>
+ </property>
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="4" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="push_cancel">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="push_start">
+ <property name="text">
+ <string>Start</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
bgstack15