From b81fab28cd27b3470f6eec725754ec9567409b81 Mon Sep 17 00:00:00 2001 From: Antonio David Gellida Lavara Date: Mon, 20 Apr 2020 16:54:05 +0200 Subject: [PATCH] "Updating" --- README.md | 8 +- READMEesES.md | 8 +- debian/README | 2 +- debian/README.Debian | 2 +- debian/README.source | 2 +- debian/changelog | 4 +- debian/files | 2 +- src/about.cpp | 23 +- src/checkstatus.cpp | 136 +- src/fixes.cpp | 72 + src/images/panda.png | Bin 0 -> 20124 bytes src/images/transparent-clipboard-clear-5.png | Bin 0 -> 3490 bytes src/images/ubunsys+panda.png | Bin 0 -> 21591 bytes src/initializations.cpp | 94 +- src/main.cpp | 10 +- src/mainwindow.cpp | 181 +- src/mainwindow.h | 54 +- src/mainwindow.ui | 2026 +++++++++--------- src/packagesdialog.cpp | 18 - src/packagestab.cpp | 1 - src/preferencesdialog.cpp | 20 +- src/preferencesdialog.ui | 8 +- src/repairtab.cpp | 170 -- src/tweakstab.cpp | 365 +--- src/ubunsys.pro | 7 +- src/ubunsys.qrc | 3 + src/updates.cpp | 118 +- src/updatescriptsdialog.cpp | 155 -- src/updatescriptsdialog.h | 30 - src/updatescriptsdialog.ui | 97 - 30 files changed, 1571 insertions(+), 2045 deletions(-) create mode 100755 src/fixes.cpp create mode 100644 src/images/panda.png create mode 100644 src/images/transparent-clipboard-clear-5.png create mode 100644 src/images/ubunsys+panda.png delete mode 100755 src/repairtab.cpp delete mode 100755 src/updatescriptsdialog.cpp delete mode 100755 src/updatescriptsdialog.h delete mode 100755 src/updatescriptsdialog.ui diff --git a/README.md b/README.md index 12d94fa..ee5994c 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ forks open issues total downloads - total downloads latest release - latest release + total downloads latest release + latest release maintained Platforms Status @@ -48,8 +48,8 @@ Due to lack of time paused development. **There are currently 2 branches of development:** -* [master](https://github.com/adgellida/ubunsys/tree/master) - Includes the most stable version. -* [dev](https://github.com/adgellida/ubunsys/tree/dev) - This branch is in development. The most updated version is here. +* [master](https://github.com/adgellida/ubunsys/tree/master) - Includes the most stable and lastest version. +* [dev](https://github.com/adgellida/ubunsys/tree/dev) - This branch is deprecated, only for experiments. **This is a very dangerous app, if you don't know what you are touching or how to fix it, don't do it. This software is for testing and knowledge purposes. It's unstable software.** diff --git a/READMEesES.md b/READMEesES.md index 2238adb..def3902 100644 --- a/READMEesES.md +++ b/READMEesES.md @@ -11,8 +11,8 @@ forks open issues total downloads - total downloads latest release - latest release + total downloads latest release + latest release maintained Platforms Status @@ -48,8 +48,8 @@ Debido a falta de tiempo desarrollo pausado. **Actualmente hay 2 ramas de desarrollo:** -* [master](https://github.com/adgellida/ubunsys/tree/master) - Incluye la versión más estable. -* [dev](https://github.com/adgellida/ubunsys/tree/dev) - Esta rama está en desarrollo. La versión más actualizada está aquí. +* [master](https://github.com/adgellida/ubunsys/tree/master) - Incluye la versión más estable y reciente. +* [dev](https://github.com/adgellida/ubunsys/tree/dev) - Esta rama está en desuso, sólo para experimentos. **App muy peligrosa en algunos puntos, si no sabes donde estás tocando o cómo arreglarlo, no lo hagas. Hecha con motivos de aprendizaje y testeo. No pretende ser estable de momento.** diff --git a/debian/README b/debian/README index 00f7105..fae73fe 100644 --- a/debian/README +++ b/debian/README @@ -3,4 +3,4 @@ The Debian Package ubunsys Comments regarding the Package - -- Antonio David Gellida Lavara Sat, 4 Apr 2020 17:35:00 +0200 + -- Antonio David Gellida Lavara Mon, 20 Apr 2020 16:40:00 +0200 diff --git a/debian/README.Debian b/debian/README.Debian index 2e1e890..e5578cc 100644 --- a/debian/README.Debian +++ b/debian/README.Debian @@ -3,4 +3,4 @@ ubunsys for Debian - -- Antonio David Gellida Lavara Sat, 4 Apr 2020 17:35:00 +0200 + -- Antonio David Gellida Lavara Mon, 20 Apr 2020 16:40:00 +0200 diff --git a/debian/README.source b/debian/README.source index 6de4bd2..c644d87 100644 --- a/debian/README.source +++ b/debian/README.source @@ -6,5 +6,5 @@ manual section 4.14. You WILL either need to modify or delete this file> - -- Antonio David Gellida Lavara Sat, 4 Apr 2020 17:35:00 +0200 + -- Antonio David Gellida Lavara Mon, 20 Apr 2020 16:40:00 +0200 diff --git a/debian/changelog b/debian/changelog index 6c76139..d7d38e2 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -ubunsys (2020.04.04~ubuntu20.04) focal; urgency=medium +ubunsys (2020.04.20~ubuntu20.04) focal; urgency=medium * Added minor changes and applied bugfixes. - -- Antonio David Gellida Lavara Sat, 4 Apr 2020 17:35:00 +0200 + -- Antonio David Gellida Lavara Mon, 20 Apr 2020 16:40:00 +0200 diff --git a/debian/files b/debian/files index 09e9eb0..c31573c 100644 --- a/debian/files +++ b/debian/files @@ -1 +1 @@ -ubunsys_2020.04.04~ubuntu20.04_source.buildinfo admin optional +ubunsys_2020.04.20~ubuntu20.04_source.buildinfo admin optional diff --git a/src/about.cpp b/src/about.cpp index e8ff43d..ece0e58 100755 --- a/src/about.cpp +++ b/src/about.cpp @@ -1,6 +1,8 @@ #include "mainwindow.h" #include #include +#include +#include ///////////////////////ABOUT/////////////////////// @@ -11,12 +13,16 @@ void MainWindow::on_actionAbout_triggered() about.setTextFormat(Qt::RichText); //this is what makes the links clickable about.setText(tr("

ubunsys


" "

Configurable app referent to packages, updates and configurations


" - "

Contains bugs. Alpha test status.


" + "

Contains bugs. Alpha status.


" + "

.


" - "

Credits to:


" + "

Credits to:


" + + "

Art by " + "napafau


" "

Icon based on this Author " - "Bernar Novalyi


" + "Bernar Novalyi


" "

Theme got from here Author " "ColinDuquesnoyi


" @@ -24,7 +30,9 @@ void MainWindow::on_actionAbout_triggered() "

SQLite library based on this Author " "katecpp


" - "

Sources:


" + "

.


" + + "

Sources:


" "

Github Repo - Updated


" @@ -38,13 +46,14 @@ void MainWindow::on_actionAbout_triggered() "


")); - about.setInformativeText(tr("Copyright (c) 2020 all rights reserved\n\n\GPL v2\n\nAntonio David Gellida Lavara\n\nadgellida@gmail.com\n\n" - "v2020.04.04")); + about.setInformativeText(tr("Copyright (c) 2020 all rights reserved\n\n\GPL v2\n\nAntonio David Gellida Lavara\n\nadgellida@gmail.com\n\nv2020.04.20")); about.setWindowTitle(tr("About")); about.setStandardButtons(QMessageBox::Ok); - about.setIconPixmap(QPixmap(":/images/ubunsys.png")); + //about.setIconPixmap(QPixmap(":/images/panda.png")); + + about.setIconPixmap(QPixmap(":/images/ubunsys+panda.png")); about.setWindowIcon(QIcon(":/images/ubunsys.png")); //about.setIcon(":/images/ubunsys.png"); about.setDefaultButton(QMessageBox::Ok); diff --git a/src/checkstatus.cpp b/src/checkstatus.cpp index 2eeb1b1..5640a9f 100644 --- a/src/checkstatus.cpp +++ b/src/checkstatus.cpp @@ -1,7 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "packagesdialog.h" -#include "updatescriptsdialog.h" #include #include #include @@ -13,35 +12,22 @@ void MainWindow::checkAllStatus() system("/usr/share/ubunsys/scripts/updateUbuntupackages.sh"); MainWindow::checkaptfastInstalled(); - MainWindow::checkUbunsysUpdate(); - - //1.######## //MainWindow::checkFirewallStatus(); - //2.######## MainWindow::checkHiddenStartupItemsStatus(); - //3.######## MainWindow::checkOfficialUpdateNotificationStatus(); - //4.######## MainWindow::checkSudoWithoutPassStatus(); - //5.######## - //MainWindow::checkTextEditor(); - //6.######## MainWindow::checkAsterisksStatus(); - //7.######## MainWindow::checkUpdateAutoStatus(); - //8.######## MainWindow::checkHibernationStatus(); - //9.######## MainWindow::checkLockScreenStatus(); - //10.######## MainWindow::checkLoginSoundStatus(); } -//1.######## +//######## void MainWindow::checkFirewallStatus() { - //1.######## firewall + //######## firewall //######## Status system("xterm -e '" @@ -67,20 +53,20 @@ void MainWindow::checkFirewallStatus() ui->checkBox_firewall->setEnabled(true); } -//2.######## +//######## void MainWindow::on_checkFirewallStatus_clicked() { - //2.######## HideStartupItems + //######## HideStartupItems //######## Status MainWindow::checkFirewallStatus(); } -//2.######## +//######## void MainWindow::checkHiddenStartupItemsStatus() { - //2.######## HideStartupItems + //######## HideStartupItems //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -99,10 +85,10 @@ void MainWindow::checkHiddenStartupItemsStatus() } -//3.######## +//######## void MainWindow::checkOfficialUpdateNotificationStatus() { - //3.######## updateNotif + //########updateNotif //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -121,10 +107,10 @@ void MainWindow::checkOfficialUpdateNotificationStatus() } -//4.######## +//######## void MainWindow::checkSudoWithoutPassStatus() { - //4.######## sudoWithoutPass + //######## sudoWithoutPass //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -143,34 +129,11 @@ void MainWindow::checkSudoWithoutPassStatus() } -//5.######## - -void MainWindow::checkTextEditor() -{ - //5.######## textEditor - //######## Status - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); - DbManager db(path); - - QString actualTextEditorSelected = db.getStatus("textEditor"); - - QFile file (QDir::homePath() + "/.ubunsys/configurations/actualTextEditor.cfg"); - if ( file.open(QIODevice::ReadWrite) ) - { - QTextStream stream( &file ); - stream << actualTextEditorSelected << endl; - } - - system("~/.ubunsys/downloads/ubuntuScripts-dev/textEditorChange && " - "exit"); - -} - -//6.######## +//######## void MainWindow::checkAsterisksStatus() { - //6.######## asterisks + //######## asterisks //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -188,11 +151,11 @@ void MainWindow::checkAsterisksStatus() } } -//7.######## +//######## void MainWindow::checkUpdateAutoStatus() { - //7.######## updateAuto + //######## updateAuto //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -216,11 +179,11 @@ void MainWindow::checkUpdateAutoStatus() } -//8.######## +//######## void MainWindow::checkHibernationStatus() { - //8.######## hibernation + //######## hibernation //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -238,11 +201,11 @@ void MainWindow::checkHibernationStatus() } } -//9.######## +//######## void MainWindow::checkLockScreenStatus() { - //9.######## lockScreen + //######## lockScreen //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -261,11 +224,11 @@ void MainWindow::checkLockScreenStatus() } -//10.######## +//######## void MainWindow::checkLoginSoundStatus() { - //10.######## loginSound + //######## loginSound //######## Status static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -284,11 +247,11 @@ void MainWindow::checkLoginSoundStatus() } -//14.######## +//######## void MainWindow::checkaptfastInstalled(){ - //14.######## checkApt-fastInstallation + //######## checkApt-fastInstallation //######## Status system("/usr/share/ubunsys/scripts/apt-fastChecking.sh"); @@ -329,6 +292,8 @@ void MainWindow::checkUbunsysUpdate(){ DbManager db(path); QString status = db.getStatus("appUpdatePresent"); + QString status2 = db.getStatus("ubunsysGithubVersion"); + if (status == "false"){ @@ -339,7 +304,7 @@ void MainWindow::checkUbunsysUpdate(){ QMessageBox msgBox; msgBox.setWindowTitle("ubunsys app update present"); - msgBox.setText("There's an update, would you like to install it?"); + msgBox.setText("There's an update v" + status2 + ", would you like to install it?"); msgBox.setStandardButtons(QMessageBox::Yes); msgBox.addButton(QMessageBox::No); msgBox.setDefaultButton(QMessageBox::No); @@ -353,3 +318,54 @@ void MainWindow::checkUbunsysUpdate(){ } } } + +void MainWindow::checkUserInSudoers(){ + + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status = db.getStatus("sudoWOPass"); + + if (status == "Enabled"){ + + QMessageBox::information(this,tr("ubunsys needs privileges"),tr("Your user is in sudoers group.\nubunsys now will work correctly")); + + } + + else if (status == "Disabled"){ + + QMessageBox msgBox; + msgBox.setWindowTitle("ubunsys needs privileges"); + msgBox.setText("ubunsys needs your user in the sudoers group.\nDo you allow it?"); + msgBox.setStandardButtons(QMessageBox::Yes); + msgBox.addButton(QMessageBox::No); + msgBox.setDefaultButton(QMessageBox::Yes); + + if (msgBox.exec() == QMessageBox::Yes){ + + MainWindow::on_checkBoxSudoWOPass_clicked(true); + + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status2 = db.getStatus("sudoWOPass"); + + if (status2 == "Enabled"){ + + QMessageBox::information(this,tr("ubunsys needs privileges"),tr("Your user is in sudoers group.\nubunsys now will work correctly")); + } + + else{ + + QMessageBox::information(this,tr("ubunsys needs privileges"),tr("ubunsys wont' work correctly")); + + } + + }else { + + QMessageBox::information(this,tr("ubunsys needs privileges"),tr("ubunsys wont' work correctly")); + } + + } + +} diff --git a/src/fixes.cpp b/src/fixes.cpp new file mode 100755 index 0000000..bbca184 --- /dev/null +++ b/src/fixes.cpp @@ -0,0 +1,72 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" + +///////////////////////FIXES TAB/////////////////////// +//http://www.upubuntu.com/2013/05/how-to-fix-broken-packages-using.html + +void MainWindow::on_integrityCheckButton_clicked() +{ +// Reboots and checks integrity system + + process->start("sh", QStringList() << "-c" << "shutdown -Fr now"); +} + +void MainWindow::on_repairNetworkButton_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo service network-manager restart"); +} + +void MainWindow::on_repairGPGKeys_clicked() +{ + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntupackages-master/apps1/y-ppa-manager && sudo launchpad-getkeys && sudo apt-fast -y update"); +} + +void MainWindow::on_unlock_var_lib_dpkg_lock_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo ~/.ubunsys/downloads/ubuntuScripts-dev/058.dpkgLock"); +} + +void MainWindow::on_fixBrokenPackagesButton_1_clicked() +{ + on_updateAndUpgradeButton_clicked(); +} + +void MainWindow::on_fixBrokenPackagesButton_2_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo apt-fast -y --fix-broken install"); +} + +void MainWindow::on_fixBrokenPackagesButton_3_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo rm /var/lib/apt/lists/* -vf && sudo apt-fast -y update"); +} + +void MainWindow::on_fixBrokenPackagesButton_4_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo apt-fast -f install && sudo apt-fast -y autoremove && sudo apt-fast -y autoclean && sudo apt-fast -y clean"); +} + +void MainWindow::on_fixBrokenPackagesButton_5_clicked() +{ + process->start("sh", QStringList() << "-c" << "sudo dpkg --configure -a && sudo apt-fast -y update"); +} + +void MainWindow::on_fixBrokenPackagesButton_6_clicked() +{ + process->start("sh", QStringList() << "-c" << "echo Open Ubuntu Software Center and if prompted to repair broken packages, click simply the repair button"); +} + +void MainWindow::on_backupReposButton_clicked() +{ + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntuScripts-dev/077.backupReposUnsupportedReleases"); +} + +void MainWindow::on_reenableReposButton_clicked() +{ + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntuScripts-dev/078.re-enableReposUnsupportedReleases"); +} + +void MainWindow::on_restoreReposButton_clicked() +{ + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntuScripts-dev/079.restoreReposUnsupportedReleases"); +} diff --git a/src/images/panda.png b/src/images/panda.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6ffcb8e690ab4412f4f9d7906be01668055c4e GIT binary patch literal 20124 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 literal 0 HcmV?d00001 diff --git a/src/images/transparent-clipboard-clear-5.png b/src/images/transparent-clipboard-clear-5.png new file mode 100644 index 0000000000000000000000000000000000000000..0b0d16e4e20cc06af74fc1acf8ff2b470903ca34 GIT binary patch literal 3490 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 UR|aQKKUsA8IwsmxT8_{E17H(>GXMYp literal 0 HcmV?d00001 diff --git a/src/images/ubunsys+panda.png b/src/images/ubunsys+panda.png new file mode 100644 index 0000000000000000000000000000000000000000..34ff53a5d5f0ee0434bf66708ea38e0a8b21877c GIT binary patch literal 21591 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 literal 0 HcmV?d00001 diff --git a/src/initializations.cpp b/src/initializations.cpp index e2377fa..d687ae7 100644 --- a/src/initializations.cpp +++ b/src/initializations.cpp @@ -1,12 +1,31 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "packagesdialog.h" -#include "updatescriptsdialog.h" #include #include -void MainWindow::initializeDatabase() -{ +void MainWindow::initializeTrayIcon(){ + + // Tray icon menu + auto menu = this->createMenu(); + this->trayIcon->setContextMenu(menu); + + // App icon + auto appIcon = QIcon(":/images/ubunsys.png"); + this->trayIcon->setIcon(appIcon); + this->setWindowIcon(appIcon); + + // Displaying the tray icon + this->trayIcon->show(); // Note: without explicitly calling show(), QSystemTrayIcon::activated signal will never be emitted! + + // Interaction + connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::iconActivated); + + //trayIcon->showMessage("ubunsys", "I'm opening... Please wait, downloading required scripts", appIcon, 6000); + +} + +void MainWindow::initializeDatabase(){ //Database initialization begin static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -20,7 +39,6 @@ if (db.isOpen()) if (out == false) // If table not exists, we add variables and values { - //initializing values of database begin db.createTable(); // Creates a table if it doens't exist. Otherwise, it will use existing table. //db.removeAllNames(); @@ -28,25 +46,25 @@ if (db.isOpen()) db.addNameStatus("dataPresent", "Enabled"); //######### db.addNameStatus("messageAtInit", "Enabled"); - //1.######### + //######### db.addNameStatus("firewall", "Disabled"); - //2.######### + //######### db.addNameStatus("hideStartupItems", "Disabled"); - //3.######### + //######### db.addNameStatus("officialUpdateNotification", "Enabled"); - //4.######### + //######### db.addNameStatus("sudoWOPass", "Disabled"); - //5.######### + //######### db.addNameStatus("textEditor", "nano"); - //6.######### + //######### db.addNameStatus("asterisks", "Disabled"); - //7.######### + //######### db.addNameStatus("updateAuto", "Disabled"); - //8.######### + //######### db.addNameStatus("hibernation", "Disabled"); - //9.######### + //######### db.addNameStatus("lockScreen", "Enabled"); - //10.######## + //######### db.addNameStatus("loginSound", "Enabled"); //######## db.addNameStatus("language", "English"); @@ -62,15 +80,19 @@ if (db.isOpen()) db.addNameStatus("ubunsysInstalledVersion", "NULL"); //######## db.addNameStatus("updateAutoAppBegin", "Enabled"); - //######## - //db.addNameStatus("ubuntupackages_remote_commit_version", "NULL"); - //######## - //db.addNameStatus("ubuntupackages_previous_commit_version", "NULL"); - //######## - //db.addNameStatus("ubuntuScripts_remote_commit_version", "NULL"); - //######## - //db.addNameStatus("ubuntuScripts_previous_commit_version", "NULL"); + //######### + db.addNameStatus("terminal", "xterm"); } + + bool out2 = db.nameExists("terminal"); + qDebug() << "Exists?"; + qDebug() << out2; + + if (out == false) // If table not exists, we add variables and values + { + db.addNameStatus("terminal", "xterm"); + } + } else { @@ -139,6 +161,31 @@ void MainWindow::initializeGUI(){ ui->tabWidget_3->setCurrentIndex(0); } +void MainWindow::initializeConsole(){ + + //this->setGeometry(333, 333, 355, 355); + + QVBoxLayout *layout = new QVBoxLayout; + + console = new QTextEdit; + process = new QProcess; + + //console->setTextBackgroundColor("RED"); + + layout->addWidget(console); + + process->setProcessChannelMode(QProcess::MergedChannels); + + console->setStyleSheet("QTextEdit { background-color : black; color : green; }"); + console->ensureCursorVisible(); + + ui->widget_3->setLayout(layout); + ui->widget_3->setGeometry(70, 550, 600, 200); + + connect(process, SIGNAL(readyRead()), this, SLOT(get_data())); + connect(process, SIGNAL(finished(int)), this, SLOT(add_text_completed())); +} + void MainWindow::showMessageAtInit() { static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); @@ -161,6 +208,7 @@ void MainWindow::showMessageAtInit() void MainWindow::createFoldersFiles() { system("test -d ~/.ubunsys || mkdir -p ~/.ubunsys && " + "test -d ~/.ubunsys/configurations || mkdir -p ~/.ubunsys/configurations && " "test -d ~/.ubunsys/scripts || mkdir -p ~/.ubunsys/scripts && " "test -d ~/.ubunsys/downloads || mkdir -p ~/.ubunsys/downloads && " "test -d ~/.ubunsys/files || mkdir -p ~/.ubunsys/files && " @@ -174,6 +222,7 @@ void MainWindow::createFoldersFiles() void MainWindow::showUpdateOutput() { +/* QFile file (QDir::homePath() + "/.ubunsys/updates/updateLog.log"); if(!file.open(QIODevice::ReadOnly)) @@ -187,4 +236,5 @@ void MainWindow::showUpdateOutput() system("touch ~/.ubunsys/updates/updateLog.log"); ui->statusBar->showMessage(tr("Recommendation: Push Help -> Tutorial")); +*/ } diff --git a/src/main.cpp b/src/main.cpp index 159cfcd..ad5513f 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -7,7 +7,6 @@ #include #include - int main(int argc, char *argv[]) { QApplication app(argc, argv); @@ -19,8 +18,7 @@ int main(int argc, char *argv[]) static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); DbManager db(path); - //11.######## language - //######## Selection + //######## Language selection // if (db.isOpen()) // { @@ -37,8 +35,7 @@ int main(int argc, char *argv[]) // } - //12.######## theme - //######## Selection + //######## Theme selection QString themeSelected = db.getStatus("theme"); @@ -65,6 +62,7 @@ int main(int argc, char *argv[]) MainWindow w; w.show(); - + //Widget o; + //o.show(); return app.exec(); } diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index cb3172c..6fbe921 100755 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1,12 +1,12 @@ #include "mainwindow.h" #include "ui_mainwindow.h" -#include "updatescriptsdialog.cpp" -#include "updatescriptsdialog.h" #include "preferencesdialog.cpp" #include "preferencesdialog.h" #include #include #include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) @@ -16,87 +16,48 @@ MainWindow::MainWindow(QWidget *parent) { ui->setupUi(this); - // Tray icon menu - auto menu = this->createMenu(); - this->trayIcon->setContextMenu(menu); - - // App icon - auto appIcon = QIcon(":/images/ubunsys.png"); - this->trayIcon->setIcon(appIcon); - this->setWindowIcon(appIcon); - - // Displaying the tray icon - this->trayIcon->show(); // Note: without explicitly calling show(), QSystemTrayIcon::activated signal will never be emitted! - - // Interaction - connect(trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::iconActivated); - - //trayIcon->showMessage("ubunsys", "I'm opening... Please wait, downloading required scripts", appIcon, 6000); - - connect(ui->actionAbout_Qt, SIGNAL(triggered()), - qApp, SLOT(aboutQt())); - - //Creating folder configurations - - system("test -d ~/.ubunsys || mkdir -p ~/.ubunsys && " - "test -d ~/.ubunsys/configurations || mkdir -p ~/.ubunsys/configurations && " - "exit"); - - //######## initializeDatabase + //ui->centralWidget->setVisible(false); + //######## INITIALIZATIONS + MainWindow::initializeTrayIcon(); + MainWindow::createFoldersFiles(); MainWindow::initializeDatabase(); - - //######## initializeGUI - MainWindow::initializeGUI(); - - //######## createFoldersFiles - - MainWindow::createFoldersFiles(); + MainWindow::initializeConsole(); + MainWindow::showMessageAtInit(); + MainWindow::checkUserInSudoers(); + MainWindow::checkAllStatus(); + //MainWindow::showUpdateOutput(); //Create extra open on future dialogs begin - - UpdateScriptsDialogUi = new UpdateScriptsDialog ();////////////// - connect(UpdateScriptsDialogUi, SIGNAL(CloseClicked()), this , SLOT(closeUpdateDialog()));//////////////// + connect(ui->actionAbout_Qt, SIGNAL(triggered()), + qApp, SLOT(aboutQt())); PackagesDialogUi = new PackagesDialog ();////////////// //connect(PackagesDialogUi, SIGNAL(CloseClicked()), this , SLOT(closePackagesDialog()));//////////////// PreferencesDialogUi = new PreferencesDialog ();////////////// - connect(PreferencesDialogUi, SIGNAL(CloseClicked()), this , SLOT(closePreferencesDialog()));//////////////// - - //Create extra open on future dialogs end - - //######## showMessageAtInit - - MainWindow::showMessageAtInit(); - - //######## checkAllStatus - - MainWindow::checkAllStatus(); - - //######## showUpdateOutput - - MainWindow::showUpdateOutput(); + connect(PreferencesDialogUi, SIGNAL(CloseClicked()), this , SLOT(closePreferencesDialog()));//////////////// } + ///icon QMenu* MainWindow::createMenu() { - // App can exit via Quit menu + // App can exit via Quit menu - //auto update = new QAction(tr("&Update system"), this); - //connect(update, SIGNAL(triggered()), this, SLOT(MainWindow::on_updateAndUpgradeButton_clicked())); + //auto update = new QAction(tr("&Update system"), this); + //connect(update, SIGNAL(triggered()), this, SLOT(MainWindow::on_updateAndUpgradeButton_clicked())); - auto quitAction = new QAction("&Quit", this); - connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); + auto quitAction = new QAction("&Quit", this); + connect(quitAction, &QAction::triggered, qApp, &QCoreApplication::quit); - auto menu = new QMenu(this); + auto menu = new QMenu(this); - //menu->addAction(update); - //menu->addSeparator(); - menu->addAction(quitAction); + //menu->addAction(update); + //menu->addSeparator(); + menu->addAction(quitAction); - return menu; + return menu; } ///icon @@ -122,7 +83,6 @@ void MainWindow::trayIconClicked(QSystemTrayIcon::ActivationReason reason) MainWindow::~MainWindow() { - delete UpdateScriptsDialogUi;//////////////// delete PackagesDialogUi;//////////////// delete PreferencesDialogUi;//////////////// delete ui; @@ -130,49 +90,20 @@ MainWindow::~MainWindow() //#############FUNCTION DECLARATIONS -void MainWindow::on_actionManualUpdateDialog_triggered()////////////////////// -{ - qDebug() << "dialogOpenned"; - UpdateScriptsDialogUi->show(); - ui->textBrowser->setText(tr("Continue on the opened dialog...")); -} - void MainWindow::on_runScriptsManager_released()////////////////////// { qDebug() << "dialogOpenned"; PackagesDialogUi->show(); - ui->textBrowser->setText(tr("Continue on the opened dialog...")); ui->statusBar->showMessage(tr("Continue on the opened dialog...")); } -void MainWindow::closeUpdateDialog() -{ - //Show update output - - QFile file (QDir::homePath() + "/.ubunsys/updates/updateLog.log"); - if(!file.open(QIODevice::ReadOnly)) - QMessageBox::information(0,"info",file.errorString()); - - QTextStream in (&file); - - ui->textBrowser->setText(in.readAll()); - - //QFile::remove(QDir::homePath() + "/.ubunsys/updates/updateLog.log"); - system("rm -Rf ~/.ubunsys/updates/updateLog.log"); - system("touch ~/.ubunsys/updates/updateLog.log"); - - qDebug() << "Close pushed"; - - UpdateScriptsDialogUi->close(); -} - //PREFERENCES void MainWindow::on_actionPreferences_triggered()////////////////////// { qDebug() << "Preferences pushed"; PreferencesDialogUi->show(); - ui->textBrowser->setText(tr("Opened preferences dialog...")); + //ui->textBrowser->setText(tr("Opened preferences dialog...")); } void MainWindow::closePreferencesDialog()////////////////////// @@ -236,26 +167,72 @@ void MainWindow::on_actionTwitter_triggered() void MainWindow::on_openCronButton_clicked() { - ui->statusBar->showMessage(tr("Opening cron jobs")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/063.openCron" " && " "echo Close this window!" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } void MainWindow::on_eraseCronButton_clicked() { - ui->statusBar->showMessage(tr("Erasing cron jobs")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/064.eraseCron" " && " "echo Close this window!" "; exec bash'"); +} + +void MainWindow::on_actionCleanTerminal_triggered() +{ + console->clear(); +} + +void MainWindow::on_actionCleanSystem_triggered() +{ + MainWindow::on_cleanButton_clicked(); +} + +void MainWindow::on_openBashRCButton_clicked() +{ + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status = db.getStatus("terminal"); + QString status2 = db.getStatus("textEditor"); + + QProcess::startDetached(status + " -e \"sudo -i "+ status2 +" ~/.bashrc \" "); +} + +//##CONSOLE + +void MainWindow::get_data() +{ + this->console->moveCursor(QTextCursor::End); + this->console->insertPlainText(process->readAll()); + this->console->moveCursor(QTextCursor::End); + // this->console->setPlainText(process->readAllStandardError()); +} + +void MainWindow::add_text_completed() +{ + this->console->insertPlainText("\n\n===PROCESS FINISHED===\n\n"); +} + +//## + +void MainWindow::closeEvent(QCloseEvent *event) +{ + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status = db.getStatus("sudoWOPass"); + + if (status == "Enabled"){ + + MainWindow::on_checkBoxSudoWOPass_clicked(false); + QMessageBox::information(this,tr("sudoers group"),tr("For more security ubunsys has removed your user from sudoers group")); + } - ui->statusBar->showMessage(tr("Done. Now select another action")); + QWidget::closeEvent(event); } diff --git a/src/mainwindow.h b/src/mainwindow.h index 66134dc..873f534 100755 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -11,11 +11,12 @@ #include #include #include -#include ////////// #include ////////// #include ////////// #include #include +#include +#include namespace Ui { class MainWindow; @@ -31,41 +32,40 @@ class MainWindow : public QMainWindow explicit MainWindow(QWidget *parent = 0); ~MainWindow(); - void initializeGUI(); - void checkUbunsysUpdate(); - void showUpdateOutput(); + //######## CONSOLE + QVBoxLayout *layout; + QTextEdit *console; + //######## + void initializeTrayIcon(); void createFoldersFiles(); - void showMessageAtInit(); void initializeDatabase(); + void showMessageAtInit(); + void initializeGUI(); + void initializeConsole(); + void checkUbunsysUpdate(); + void checkUserInSudoers(); + void showUpdateOutput(); //######## DISABLED - //0.######## CHECK METHODS + //######## CHECK METHODS void checkAllStatus(); - //1.######## void checkFirewallStatus(); - //2.######## void checkHiddenStartupItemsStatus(); - //3.######## void checkOfficialUpdateNotificationStatus(); - //4.######## void checkSudoWithoutPassStatus(); - //5.######## - void checkTextEditor(); - //6.######## void checkAsterisksStatus(); - //7.######## void checkUpdateAutoStatus(); - //8.######## void checkHibernationStatus(); - //9.######## void checkLockScreenStatus(); - //10.######## void checkLoginSoundStatus(); - //14.######## void checkaptfastInstalled(); + public slots: + //######## CONSOLE + void add_text_completed(); + //######## + //void closePackagesDialog();/////////////// - void closeUpdateDialog();/////////////// void closePreferencesDialog();/////////////// void iconActivated(QSystemTrayIcon::ActivationReason);///icon @@ -73,7 +73,10 @@ public slots: private slots: - void on_actionManualUpdateDialog_triggered();//////////// + //######## CONSOLE + void get_data(); + //######## + void on_runScriptsManager_released();//////////// void on_actionPreferences_triggered();//////////// @@ -151,17 +154,26 @@ private slots: void on_runSyncTime_clicked(); void on_listUpgradablePackagesButton_clicked(); void on_listLatestInstalledPackagesButton_clicked(); + void on_actionCleanTerminal_triggered(); + void on_actionCleanSystem_triggered(); + void on_openBashRCButton_clicked(); + void closeEvent(QCloseEvent *event); private: Ui::MainWindow *ui; - UpdateScriptsDialog *UpdateScriptsDialogUi;///////////// PackagesDialog *PackagesDialogUi;///////////// PreferencesDialog *PreferencesDialogUi;///////////// + //icon begin QSystemTrayIcon *trayIcon; QMenu* trayIconMenu; QMenu* createMenu(); //icon end + + //######## CONSOLE + QProcess *process; + //######## + }; #endif // MAINWINDOW_H diff --git a/src/mainwindow.ui b/src/mainwindow.ui index ddcd1aa..c6922b0 100755 --- a/src/mainwindow.ui +++ b/src/mainwindow.ui @@ -6,8 +6,8 @@ 0 0 - 649 - 682 + 666 + 835 @@ -24,10 +24,10 @@ - 10 - 10 - 631 - 571 + 9 + 9 + 651 + 541 @@ -40,7 +40,7 @@ QTabWidget::Rounded - 3 + 6 @@ -68,80 +68,76 @@ - - - true - - - - 0 - 0 - 691 - 571 - - - - 0 - - - - 16 - 16 - - - - - Install - - - - - 10 - 30 - 111 - 36 - - - - + + + + + true - - Open + + 0 - 30 - 30 - - - - - - - false - - - - - - 10 - 10 - 241 + 16 16 - - - - - 75 - true - - - - Scripts Manager + + + + Install + + + + + 10 + 30 + 111 + 36 + + + + + + + Open + + + + 30 + 30 + + + + + + + false + + + + + + 10 + 10 + 118 + 17 + + + + + 75 + true + + + + Scripts Manager + + + - - + + @@ -149,794 +145,40 @@ :/images/nav_10-512.png:/images/nav_10-512.png - - - - - - 0 - 0 - 581 - 571 - - - - - 50 - false - - - - false - - - 0 - - - - Sources - - - - - 10 - 10 - 141 - 16 - - - - - 75 - true - - - - <html><head/><body><p><span style=" font-weight:400;">Using the directory you can easily add new repositories without the need to edit the central/etc/apt/sources.list file. I.e. you can just put a file with a unique name and the same format as /etc/apt/sources.list into this folder and it is used by apt.</span></p><p><span style=" font-weight:400;">In order to remove this source again you can just remove that specific file without the need for handling side effects, parsing or mangling with/etc/apt/sources.list. It's mainly for scripts or other packages to put their repositories there automatically - if you manually add repositories you could add them to /etc/apt/sources.list manually.</span><br/></p></body></html> - - - sources.list.d - - - - - - 10 - 30 - 111 - 36 - - - - - - - Open - - - - 30 - 30 - - - - - - - false - - - - - - 10 - 180 - 111 - 36 - - - - - - - Import - - - - 30 - 30 - - - - - - - false - - - - - - 10 - 100 - 111 - 36 - - - - - - - Edit - - - - 30 - 30 - - - - - - - false - - - - - - 10 - 140 - 111 - 36 - - - - - - - Export - - - - 30 - 30 - - - - - - - false - - - - - - 20 - 370 - 531 - 111 - - - - - - - 20 - 340 - 651 - 20 - - - - - 75 - true - - - - Log update scripts - - - - - - 10 - 80 - 141 - 16 - - - - - 75 - true - - - - <html><head/><body><p><span style=" font-weight:400;">Apt uses this file to lists the 'sources' from which packages can be obtained.</span></p></body></html> - - - sources.list - - - - - - - - - :/images/update-arrows.png - - - - - - - - - 0 - 0 - 701 - 571 - - - - 1 - - - - Normal user - - - - - 60 - 120 - 161 - 21 - - - - - 50 - false - - - - Clean system - - - - - - 60 - 20 - 511 - 20 - - - - - 50 - false - - - - Default update repos & upgrade system - - - - - - 10 - 60 - 41 - 40 - - - - <html><head/><body><p>installpackages1-minimal of ubuntupackages on git for normal users</p></body></html> - - - - - - - - - - :/images/install.png:/images/install.png - - - - 30 - 30 - - - - - - - false - - - - - - 60 - 70 - 351 - 21 - - - - - 50 - false - - - - Exec normal user installation script - - - - - - 10 - 10 - 41 - 36 - - - - <html><head/><body><p>apt-fast -y update</p><p>apt-fast -y upgrade</p></body></html> - - - - - - - - - - :/images/if_gtk-refresh_28464.png:/images/if_gtk-refresh_28464.png - - - - 30 - 30 - - - - - - - false - - - - - - 10 - 110 - 41 - 36 - - - - <html><head/><body><p>apt-fast -f install</p><p>apt-fast -y autoremove</p><p>apt-fast -y autoclean</p><p>apt-fast -y clean</p></body></html> - - - - - - - - - - :/images/broom2.png:/images/broom2.png - - - - 30 - 30 - - - - - - - false - - - - - - Advanced user - - - - - 60 - 70 - 401 - 21 - - - - - 50 - false - - - - Upgrade to latest stable - - - - - - 10 - 110 - 41 - 36 - - - - <html><head/><body><p>Recover space from unused kernels</p></body></html> - - - - - - - - - - :/images/broom2.png:/images/broom2.png - - - - 30 - 30 - - - - - - - false - - - - - - 10 - 10 - 41 - 36 - - - - <html><head/><body><p>apt-fast -y update</p><p>apt-fast -y dist-upgrade</p></body></html> - - - - - - - - - - :/images/128-128-76912453c14fc15ed016df244ce34b54.png:/images/128-128-76912453c14fc15ed016df244ce34b54.png - - - - 30 - 30 - - - - - - - false - - - - - - 60 - 20 - 511 - 21 - - - - - 50 - false - - - - Default update repos & smart upgrade system - - - - - - 60 - 120 - 231 - 21 - - - - - 50 - false - - - - Clean ancient kernels - - - - - - 10 - 60 - 41 - 36 - - - - <html><head/><body><p>do-release-upgrade</p></body></html> - - - - - - - - - - :/images/upgrade.png:/images/upgrade.png - - - - 30 - 30 - - - - - - - false - - - - - false - - - - 10 - 330 - 91 - 31 - - - - - - - 10 - 260 - 201 - 31 - - - - - 75 - true - - - - Update auto programmable - - - - - - 10 - 290 - 91 - 31 - - - - - Disabled - - - - - Each hour - - - - - At boot - - - - - - - 60 - 170 - 231 - 21 - - - - - 50 - false - - - - List upgradable packages - - - - - - 10 - 160 - 41 - 36 - - - - <html><head/><body><p>Recover space from unused kernels</p></body></html> - - - - - - - - - - :/images/Future-595b40b75ba036ed117d7e0d.svg:/images/Future-595b40b75ba036ed117d7e0d.svg - - - - 30 - 30 - - - - - - - false - - - - - - 60 - 220 - 231 - 21 - - - - - 50 - false - - - - List latest installed packages - - - - - - 10 - 210 - 41 - 36 - - - - <html><head/><body><p>Recover space from unused kernels</p></body></html> - - - - - - - - - - :/images/icons8-update-100.png:/images/icons8-update-100.png - - - - 30 - 30 - - - - - - - false - - - - - true - - - - 240 - 290 - 51 - 41 - - - - - - - - - - - 16 - 16 - - - - false - - - - - - 240 - 260 - 261 - 31 - - - - - 75 - true - - - - Official Update notification - - - + + + + + + 10 + 10 + 691 + 511 + + + + + 50 + false + + + + false + + + 0 + + + + Sources + + 10 - 370 - 191 - 31 + 10 + 141 + 16 @@ -945,83 +187,55 @@ true + + <html><head/><body><p><span style=" font-weight:400;">Using the directory you can easily add new repositories without the need to edit the central/etc/apt/sources.list file. I.e. you can just put a file with a unique name and the same format as /etc/apt/sources.list into this folder and it is used by apt.</span></p><p><span style=" font-weight:400;">In order to remove this source again you can just remove that specific file without the need for handling side effects, parsing or mangling with/etc/apt/sources.list. It's mainly for scripts or other packages to put their repositories there automatically - if you manually add repositories you could add them to /etc/apt/sources.list manually.</span><br/></p></body></html> + - Update auto at app begin + sources.list.d - - - true - + 10 - 400 - 51 - 41 + 30 + 111 + 36 - - + + - + Open - 16 - 16 + 30 + 30 - - false - - - - - - Developer - - - - - 60 - 10 - 311 - 41 - - - - - 50 - false - + + - - Upgrade to latest dev + + false - + 10 - 10 - 41 + 180 + 111 36 - - <html><head/><body><p>do-release-upgrade -d</p></body></html> - - - - - - :/images/flecha_arriba.png:/images/flecha_arriba.png + Import @@ -1036,49 +250,48 @@ false - + - 60 - 70 - 271 - 21 + 10 + 100 + 111 + 36 - - - 50 - false - + + - Install mainline kernels + Edit - - - - true + + + 30 + 30 + + + + + + + false + + 10 - 60 - 41 + 140 + 111 36 - - <html><head/><body><p>Select kernels to install with ukuu</p></body></html> - - - - - - :/images/flecha_arriba.png:/images/flecha_arriba.png + Export @@ -1093,9 +306,779 @@ false + + + + 10 + 80 + 141 + 16 + + + + + 75 + true + + + + <html><head/><body><p><span style=" font-weight:400;">Apt uses this file to lists the 'sources' from which packages can be obtained.</span></p></body></html> + + + sources.list + + + + + + :/images/update-arrows.png + + + + + + + + + + + + -21 + -11 + 1171 + 541 + + + + + + 20 + 10 + 681 + 511 + + + + 2 + + + + Normal user + + + + + 60 + 120 + 161 + 21 + + + + + 50 + false + + + + Clean system + + + + + + 60 + 20 + 511 + 20 + + + + + 50 + false + + + + Default update repos & upgrade system + + + + + + 10 + 60 + 41 + 40 + + + + <html><head/><body><p>installpackages1-minimal of ubuntupackages on git for normal users</p></body></html> + + + + + + + + + + :/images/install.png:/images/install.png + + + + 30 + 30 + + + + + + + false + + + + + + 60 + 70 + 351 + 21 + + + + + 50 + false + + + + Exec normal user installation script + + + + + + 10 + 10 + 41 + 36 + + + + <html><head/><body><p>apt-fast -y update</p><p>apt-fast -y upgrade</p></body></html> + + + + + + + + + + :/images/if_gtk-refresh_28464.png:/images/if_gtk-refresh_28464.png + + + + 30 + 30 + + + + + + + false + + + + + + 10 + 110 + 41 + 36 + + + + <html><head/><body><p>apt-fast -f install</p><p>apt-fast -y autoremove</p><p>apt-fast -y autoclean</p><p>apt-fast -y clean</p></body></html> + + + + + + + + + + :/images/broom2.png:/images/broom2.png + + + + 30 + 30 + + + + + + + false + + + + + + Advanced user + + + + + 60 + 70 + 401 + 21 + + + + + 50 + false + + + + Upgrade to latest stable + + + + + + 10 + 110 + 41 + 36 + + + + <html><head/><body><p>Recover space from unused kernels</p></body></html> + + + + + + + + + + :/images/broom2.png:/images/broom2.png + + + + 30 + 30 + + + + + + + false + + + + + + 10 + 10 + 41 + 36 + + + + <html><head/><body><p>apt-fast -y update</p><p>apt-fast -y dist-upgrade</p></body></html> + + + + + + + + + + :/images/128-128-76912453c14fc15ed016df244ce34b54.png:/images/128-128-76912453c14fc15ed016df244ce34b54.png + + + + 30 + 30 + + + + + + + false + + + + + + 60 + 20 + 511 + 21 + + + + + 50 + false + + + + Default update repos & smart upgrade system + + + + + + 60 + 120 + 231 + 21 + + + + + 50 + false + + + + Clean ancient kernels + + + + + + 10 + 60 + 41 + 36 + + + + <html><head/><body><p>do-release-upgrade</p></body></html> + + + + + + + + + + :/images/upgrade.png:/images/upgrade.png + + + + 30 + 30 + + + + + + + false + + + + + false + + + + 10 + 330 + 91 + 31 + + + + + + + 10 + 260 + 201 + 31 + + + + + 75 + true + + + + Update auto programmable + + + + + + 10 + 290 + 91 + 31 + + + + + Disabled + + + + + Each hour + + + + + At boot + + + + + + + 60 + 170 + 231 + 21 + + + + + 50 + false + + + + List upgradable packages + + + + + + 10 + 160 + 41 + 36 + + + + <html><head/><body><p>Recover space from unused kernels</p></body></html> + + + + + + + + + + :/images/Future-595b40b75ba036ed117d7e0d.svg:/images/Future-595b40b75ba036ed117d7e0d.svg + + + + 30 + 30 + + + + + + + false + + + + + + 60 + 220 + 231 + 21 + + + + + 50 + false + + + + List latest installed packages + + + + + + 10 + 210 + 41 + 36 + + + + <html><head/><body><p>Recover space from unused kernels</p></body></html> + + + + + + + + + + :/images/icons8-update-100.png:/images/icons8-update-100.png + + + + 30 + 30 + + + + + + + false + + + + + true + + + + 240 + 290 + 51 + 41 + + + + + + + + + + + 16 + 16 + + + + false + + + + + + 240 + 260 + 261 + 31 + + + + + 75 + true + + + + Official Update notification + + + + + + 10 + 370 + 191 + 31 + + + + + 75 + true + + + + Update auto at app begin + + + + + true + + + + 10 + 400 + 51 + 41 + + + + + + + + + + + 16 + 16 + + + + false + + + + + + Developer + + + + + 60 + 10 + 311 + 41 + + + + + 50 + false + + + + Upgrade to latest dev + + + + + + 10 + 10 + 41 + 36 + + + + <html><head/><body><p>do-release-upgrade -d</p></body></html> + + + + + + + + + + :/images/flecha_arriba.png:/images/flecha_arriba.png + + + + 30 + 30 + + + + + + + false + + + + + + 60 + 70 + 271 + 21 + + + + + 50 + false + + + + Install mainline kernels + + + + + true + + + + 10 + 60 + 41 + 36 + + + + <html><head/><body><p>Select kernels to install with Mainline Ubuntu Kernel Installer</p></body></html> + + + + + + + + + + :/images/flecha_arriba.png:/images/flecha_arriba.png + + + + 30 + 30 + + + + + + + false + + + + + + + + + @@ -1107,14 +1090,14 @@ - 0 - 0 + 10 + 10 691 - 571 + 511 - 1 + 0 @@ -1431,7 +1414,7 @@ and restore that you want with elevated permissions. 60 240 - 191 + 201 41 @@ -1995,10 +1978,10 @@ for unsupported realeases - 0 - 0 - 581 - 571 + 10 + 10 + 691 + 511 @@ -2575,10 +2558,10 @@ on terminal - 0 - 0 - 581 - 571 + 10 + 10 + 691 + 511 @@ -2705,10 +2688,10 @@ on terminal - 0 - 0 - 581 - 571 + 10 + 10 + 691 + 511 @@ -2863,7 +2846,7 @@ on terminal 10 - 150 + 220 221 16 @@ -2882,7 +2865,7 @@ on terminal 10 - 170 + 240 111 36 @@ -2913,7 +2896,7 @@ on terminal 10 - 210 + 280 111 36 @@ -3669,6 +3652,82 @@ Windows false + + + + 10 + 150 + 141 + 16 + + + + + 75 + true + + + + <html><head/><body><p><span style=" font-weight:400;">Is for use by the system administrator. It is traditionally executed after all the normal system services are started, at the end of the process of switching to a multiuser runlevel. You might use it to start a custom service.</span></p></body></html> + + + <html><head/><body><p><br/></p></body></html> + + + .bashrc + + + + + + 10 + 170 + 111 + 36 + + + + + + + Edit + + + + 30 + 30 + + + + + + + false + + + installTemplatesButton + label_5 + label_34 + label_35 + runGrubcustomizerButton + label_32 + label_37 + openMainRestoreButton + openRCLocalButton + label_48 + label_51 + resetDconf + checkBoxHiddenStartupItems + checkBoxLoginSound + goMouseRateCheckerButton + label_33 + label_64 + editGrubButton + updateGrubButton + runSyncTime + openMainBackupButton + label_49 + openBashRCButton @@ -3932,17 +3991,27 @@ Windows + + + + 40 + 550 + 621 + 131 + + + - 540 - 19 + 560 + 20 90 16 - v2020.04.04 + v2020.04.20 @@ -3951,7 +4020,7 @@ Windows 0 0 - 649 + 666 22 @@ -3983,7 +4052,6 @@ Windows - @@ -4014,12 +4082,13 @@ Windows - - + + + @@ -4177,15 +4246,6 @@ Windows Update app - - - - :/images/upgrade.png:/images/upgrade.png - - - Manually update scripts - - @@ -4195,7 +4255,7 @@ Windows Default update repos && upgrade system - Default update repos & upgrade system + <html><head/><body><p><span style=" color:#000000;">Default update repos &amp; upgrade system</span></p><p><span style=" color:#ff55ff;">sudo apt-fast -y update &amp;&amp; upgrade</span></p></body></html> @@ -4207,7 +4267,7 @@ Windows Default update repos && smart upgrade system - Default update repos & smart upgrade system + <html><head/><body><p><span style=" color:#000000;">Default update repos &amp; smart upgrade system</span></p><p><span style=" color:#ff55ff;">sudo apt-fast -y update &amp;&amp; dist-upgrade</span></p></body></html> @@ -4222,6 +4282,30 @@ Windows Go to Twitter + + + + :/images/transparent-clipboard-clear-5.png:/images/transparent-clipboard-clear-5.png + + + Clean Terminal + + + Clean Terminal + + + + + + :/images/broom2.png:/images/broom2.png + + + Clean System + + + <html><head/><body><p><span style=" color:#000000;">Clean System</span></p><p><span style=" color:#ff55ff;">sudo apt-get -f install &amp;&amp; sudo apt-get-y autoremove &amp;&amp; sudo apt-get -y autoclean &amp;&amp; sudo apt-get -y clean</span></p></body></html> + + diff --git a/src/packagesdialog.cpp b/src/packagesdialog.cpp index a2f279b..3ff6d78 100755 --- a/src/packagesdialog.cpp +++ b/src/packagesdialog.cpp @@ -261,8 +261,6 @@ void PackagesDialog::on_runSavedScriptListButton_clicked() void PackagesDialog::on_exportListButton_clicked() { - ui->statusBar->showMessage(tr("Exporting list")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/047.exportList" " && " @@ -270,29 +268,13 @@ void PackagesDialog::on_exportListButton_clicked() "; exec bash'"); QMessageBox::information(this,tr("Notification"),tr("Backuped OK on \n\n") + QDir::homePath() + "/.ubunsys/backups/scriptsFiles"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } void PackagesDialog::on_openInTextEditorButton_clicked() { - ui->statusBar->showMessage(tr("Opening Scripts selected. Please wait...")); - system("sed -i '1i #!/bin/bash' ~/.ubunsys/files/packagesToWatch.sh"); QProcess::startDetached("xterm -e \"cd ~/.ubunsys/files && sudo chmod 777 ~/.ubunsys/files/packagesToWatch.sh && ~/.ubunsys/files/packagesToWatch.sh && echo Close this window!! && read; exec bash\""); - -/* - system("xterm -e '" - "cd ~/.ubunsys/files && sudo chmod 777 ~/.ubunsys/files/packagesToWatch.sh && ~/.ubunsys/files/packagesToWatch.sh" - " && " - "echo Close this window!!" - " && " - "read" - "; exec bash'"); -*/ - - ui->statusBar->showMessage(tr("Done. Now select another action")); } //void PackagesDialog::on_txtFilter_textChanged(const QString &arg1) diff --git a/src/packagestab.cpp b/src/packagestab.cpp index a525570..e068202 100755 --- a/src/packagestab.cpp +++ b/src/packagestab.cpp @@ -1,7 +1,6 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "packagesdialog.h" -#include "updatescriptsdialog.h" #include ///////////////////////PACKAGES TAB/////////////////////// diff --git a/src/preferencesdialog.cpp b/src/preferencesdialog.cpp index c0edbbb..560d39e 100755 --- a/src/preferencesdialog.cpp +++ b/src/preferencesdialog.cpp @@ -44,6 +44,14 @@ PreferencesDialog::PreferencesDialog(QWidget *parent) : //text editor end + //terminal begin + + QString actualTerminalSelected = db.getStatus("terminal"); //gets data from db + + ui->terminal->setText(actualTerminalSelected); //puts actual data on gui + + //terminal end + } PreferencesDialog::~PreferencesDialog() { @@ -113,6 +121,13 @@ void PreferencesDialog::on_closePreferencesDialogButton_clicked() //textEditor end + //terminal begin + + QString newTerminalSelected = ui->terminal->toPlainText(); //gets new data from gui + db.updateStatus("terminal", newTerminalSelected); //puts into db + + //terminal end + } void PreferencesDialog::closeEvent(QCloseEvent *event) @@ -141,5 +156,8 @@ void PreferencesDialog::on_restoreDefaultTextEditorButton_clicked() void PreferencesDialog::on_restoreDefaultTerminalButton_clicked() { - + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + db.updateStatus("terminal", "xterm"); + ui->terminal->setText("xterm"); } diff --git a/src/preferencesdialog.ui b/src/preferencesdialog.ui index 9ed975d..ebb0969 100755 --- a/src/preferencesdialog.ui +++ b/src/preferencesdialog.ui @@ -100,8 +100,8 @@ - 239 - 250 + 250 + 260 141 31 @@ -180,7 +180,7 @@ do the same if you click on "Close and Restart" - false + true @@ -215,7 +215,7 @@ do the same if you click on "Close and Restart" - false + true diff --git a/src/repairtab.cpp b/src/repairtab.cpp deleted file mode 100755 index 68157fc..0000000 --- a/src/repairtab.cpp +++ /dev/null @@ -1,170 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" - -///////////////////////REPAIR TAB/////////////////////// -//http://www.upubuntu.com/2013/05/how-to-fix-broken-packages-using.html - -void MainWindow::on_integrityCheckButton_clicked() -{ -// Reboots and checks integrity system - - ui->statusBar->showMessage(tr("Checking integrity system")); - - system("xterm -e '" - "shutdown -Fr now" - "; exec bash'"); -} - -void MainWindow::on_repairNetworkButton_clicked() -{ - ui->statusBar->showMessage(tr("Repairing network. Put Please wait")); - - system("xterm -e '" - "sudo service network-manager restart" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Network restarted or fix cancelled, check if ok now")); -} - -void MainWindow::on_repairGPGKeys_clicked() -{ - ui->statusBar->showMessage(tr("Repairing missed GPG keys. Please wait")); - - system("xterm -e '" - "sudo ~/.ubunsys/downloads/ubuntupackages-master/apps1/y-ppa-manager" - " && " - "sudo launchpad-getkeys" - " && " - "sudo apt-fast -y update" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Missed GPG keys repaired or fix cancelled, check if ok now")); -} - -void MainWindow::on_unlock_var_lib_dpkg_lock_clicked() -{ - ui->statusBar->showMessage(tr("Unlocking /var/lib/dpkg/lock. Please wait")); - - system("xterm -e '" - "sudo ~/.ubunsys/downloads/ubuntuScripts-dev/058.can_t_block_var_lib_dpkg_lock" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Unlocked /var/lib/dpkg/lock, check if ok now")); -} - -void MainWindow::on_fixBrokenPackagesButton_1_clicked() -{ - ui->statusBar->showMessage(tr("Executing package repair 1. Then close the terminal window")); - - system("xterm -e '" - "sudo apt-fast -y update" - " && " - "sudo apt-fast -y upgrade" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Reparation 1 executed succesful. Test if all is corrected")); -} - -void MainWindow::on_fixBrokenPackagesButton_2_clicked() -{ - ui->statusBar->showMessage(tr("Executing package repair 2. Then close the terminal window")); - - system("xterm -e '" - "sudo apt-fast -y --fix-broken install" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Reparation 2 executed succesful. Test if all is corrected")); -} - -void MainWindow::on_fixBrokenPackagesButton_3_clicked() -{ - ui->statusBar->showMessage(tr("Executing package repair 3. Then close the terminal window")); - - system("xterm -e '" - "sudo rm /var/lib/apt/lists/* -vf" - " && " - "sudo apt-fast -y update" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Reparation 3 executed succesful. Test if all is corrected")); -} - -void MainWindow::on_fixBrokenPackagesButton_4_clicked() -{ - ui->statusBar->showMessage(tr("Executing package repair 4. Then close the terminal window")); - - system("xterm -e '" - "sudo apt-fast -f install" - " && " - "sudo apt-fast -y autoremove" - " && " - "sudo apt-fast -y autoclean" - " && " - "sudo apt-fast -y clean" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Reparation 4 executed succesful. Test if all is corrected")); -} - -void MainWindow::on_fixBrokenPackagesButton_5_clicked() -{ - ui->statusBar->showMessage(tr("Executing package repair 5. Then close the terminal window")); - - system("xterm -e '" - "sudo dpkg --configure -a" - " && " - "sudo apt-fast -y update" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Reparation 5 executed succesful. Test if all is corrected")); -} - -void MainWindow::on_fixBrokenPackagesButton_6_clicked() -{ - system("xterm -e bash -c 'echo Open Ubuntu Software Center and if prompted to repair broken packages, click simply the repair button; exec bash'"); -} - -void MainWindow::on_backupReposButton_clicked() -{ - ui->statusBar->showMessage(tr("Installing templates")); - - system("bash -c '" - "~/.ubunsys/downloads/ubuntuScripts-dev/077.backupReposUnsupportedReleases" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); -} - -void MainWindow::on_reenableReposButton_clicked() -{ - ui->statusBar->showMessage(tr("Installing templates")); - - system("bash -c '" - "~/.ubunsys/downloads/ubuntuScripts-dev/078.re-enableReposUnsupportedReleases" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); -} - -void MainWindow::on_restoreReposButton_clicked() -{ - ui->statusBar->showMessage(tr("Installing templates")); - - system("bash -c '" - "~/.ubunsys/downloads/ubuntuScripts-dev/079.restoreReposUnsupportedReleases" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); -} diff --git a/src/tweakstab.cpp b/src/tweakstab.cpp index d413934..779fada 100755 --- a/src/tweakstab.cpp +++ b/src/tweakstab.cpp @@ -12,53 +12,48 @@ ////////////////////////////////SOURCES -//##sources.list.d +//##sources.list.d - no slider terminal void MainWindow::on_openSourcesListDButton_clicked() { - ui->statusBar->showMessage(tr("Opening sources.list.d")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/023.openSourcesListD" - " && " - "echo Close this window!" - "; exec bash'"); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); - //QDesktopServices::openUrl(QUrl("file:///etc/apt/sources.list.d")); + QString status = db.getStatus("terminal"); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/023.openSourcesListD \" "); } -//##sources.list +//##open sources.list - no slider terminal + texteditor void MainWindow::on_openSourcesListButton_clicked() { - ui->statusBar->showMessage(tr("Opening Sources.list")); - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); DbManager db(path); - QString status = db.getStatus("textEditor"); + QString status = db.getStatus("terminal"); + QString status2 = db.getStatus("textEditor"); - QProcess::startDetached("xterm -e \"sudo -i "+ status +" /etc/apt/sources.list && exit; exec bash\""); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \"sudo -i "+ status2 +" /etc/apt/sources.list \" "); } +//##backup sources.list - no slider terminal + void MainWindow::on_backupSourcesListButton_clicked() { - ui->statusBar->showMessage(tr("Backuping sudoers")); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/043.backupSourcesList" - " && " - "exit" - "; exec bash'"); + QString status = db.getStatus("terminal"); - QMessageBox::information(this,tr("Notification"),tr("Backuped OK on \n\n") + QDir::homePath() + "/.ubunsys/backups/sources.list"); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/043.backupSourcesList \" "); + ui->statusBar->showMessage(tr("Done. sources.list restored succesful")); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QMessageBox::information(this,tr("Notification"),tr("Backuped OK on \n\n") + QDir::homePath() + "/.ubunsys/backups/sources.list"); } +//##import sources.list - no slider terminal + void MainWindow::on_importSourcesListButton_clicked() { QString filename=QFileDialog::getOpenFileName( @@ -81,37 +76,34 @@ void MainWindow::on_importSourcesListButton_clicked() // optional, as QFile destructor will already do it: file.close(); - system("xterm -e '" - "sudo chmod 777 ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh" - "&&" - "sudo ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh" - " && " - "sudo rm -Rf ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh" - " && " - "exit" - "; exec bash'"); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); - //this would normally start the event loop, but is not needed for this - //minimal example: - //return app.exec(); + QString status = db.getStatus("terminal"); - ui->statusBar->showMessage(tr("Done. sources.list restored succesful")); + QProcess::startDetached(status + " -e \" sudo chmod 777 ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh " + "&&" + " bash -c ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh " + "&&" + " -e \" sudo rm -Rf ~/.ubunsys/backups/sources.list/restoreSourcesListScript.sh \" "); + QMessageBox::information(this,tr("Notification"),tr("sources.list restored succesful")); } -//##OfficialUpdateNotification +//##OfficialUpdateNotification - slider void MainWindow::on_checkBoxOfficialUpdateNotification_clicked(bool checked) { + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status = db.getStatus("terminal"); + if (checked == true){ qDebug() << checked; - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/054.enableOfficialUpdateNotification" - " && " - "exit" - "; exec bash'"); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/054.enableOfficialUpdateNotification \" "); ui->statusBar->showMessage(tr("Enabled")); } @@ -120,11 +112,7 @@ void MainWindow::on_checkBoxOfficialUpdateNotification_clicked(bool checked) qDebug() << checked; - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/055.disableOfficialUpdateNotification" - " && " - "exit" - "; exec bash'"); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/055.disableOfficialUpdateNotification \" "); ui->statusBar->showMessage(tr("Disabled")); } @@ -135,7 +123,7 @@ void MainWindow::on_checkBoxOfficialUpdateNotification_clicked(bool checked) ////////////////////////////////SECURITY -//##sudo without pass all +//##sudo without pass all - slider void MainWindow::on_checkBoxSudoWOPass_clicked(bool checked) { @@ -150,8 +138,6 @@ void MainWindow::on_checkBoxSudoWOPass_clicked(bool checked) "exit" "; exec bash'"); - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else if (checked == false){ @@ -165,91 +151,73 @@ void MainWindow::on_checkBoxSudoWOPass_clicked(bool checked) "exit" "; exec bash'"); - ui->statusBar->showMessage(tr("Done. Now select another action")); } MainWindow::checkSudoWithoutPassStatus(); } -//##sudo without pass specific +//##enable sudo without pass specific - to verify void MainWindow::on_enableSudoWithoutPassSpecificButton_clicked() { - ui->statusBar->showMessage(tr("Enabling sudo without pass specific")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/052.enableSudoWithoutPassSpecific" " && " "exit" "; exec bash'"); - ui->statusBar->showMessage(tr("Done. Now select another action")); } +//##disable sudo without pass specific - to verify + void MainWindow::on_disableSudoWithoutPassSpecificButton_clicked() { - ui->statusBar->showMessage(tr("Disabling sudo without pass specific")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/053.disableSudoWithoutPassSpecific" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } -//##sudoers.d +//##sudoers.d - no slider terminal void MainWindow::on_openSudoersDButton_clicked() { - ui->statusBar->showMessage(tr("Opening sudoers.d")); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/051.openSudoersD" - " && " - "echo Close this window!" - "; exec bash'"); + QString status = db.getStatus("terminal"); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/051.openSudoersD \" "); } -//##hosts +//##hosts - no slider terminal + texteditor void MainWindow::on_openHostsButton_clicked() { - ui->statusBar->showMessage(tr("Opening hosts")); - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); DbManager db(path); - QString status = db.getStatus("textEditor"); - - QProcess::startDetached("xterm -e \"sudo -i "+ status +" /etc/hosts && exit; exec bash\""); + QString status = db.getStatus("terminal"); + QString status2 = db.getStatus("textEditor"); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \"sudo -i "+ status2 +" /etc/hosts \" "); } -//##sudoers +//##sudoers - special void MainWindow::on_openSudoersFileButton_clicked() { - ui->statusBar->showMessage(tr("Opening sudoers")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/027.openSudoersFile" " && " "echo Close this window!" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } void MainWindow::on_backupSudoersFileButton_clicked() { - ui->statusBar->showMessage(tr("Backuping sudoers")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/028.backupSudoersFile" " && " @@ -257,10 +225,10 @@ void MainWindow::on_backupSudoersFileButton_clicked() "; exec bash'"); QMessageBox::information(this,tr("Notification"),tr("Backuped OK on \n\n") + QDir::homePath() + "/.ubunsys/backups/sudoersFiles"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } +//import Sudoers - to verify + void MainWindow::on_importSudoersFileButton_clicked() { QString filename=QFileDialog::getOpenFileName( @@ -300,7 +268,7 @@ void MainWindow::on_importSudoersFileButton_clicked() //return app.exec(); } -//##firewall +//##firewall - slider void MainWindow::on_checkBox_firewall_clicked(bool checked) { @@ -316,9 +284,6 @@ void MainWindow::on_checkBox_firewall_clicked(bool checked) " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else if (checked == false){ @@ -334,8 +299,6 @@ void MainWindow::on_checkBox_firewall_clicked(bool checked) "exit" "; exec bash'"); - ui->statusBar->showMessage(tr("Done. Now select another action")); - } MainWindow::checkFirewallStatus(); @@ -354,22 +317,23 @@ void MainWindow::on_goMouseRateCheckerButton_clicked() ui->statusBar->showMessage(tr("Go to mouse rate checker. Please wait.")); } -//##Templates +//##Templates - no slider terminal void MainWindow::on_installTemplatesButton_clicked() { ui->statusBar->showMessage(tr("Installing templates")); - system("bash -c '" - "~/.ubunsys/downloads/ubuntuScripts-dev/018.installTemplates" - " && " - "exit" - "; exec bash'"); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); + + QString status = db.getStatus("terminal"); + + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/018.installTemplates \" "); ui->statusBar->showMessage(tr("Templates installed succesful. Now select another action")); } -//##MainBackup +//##Main Backup - to verify void MainWindow::on_openMainBackupButton_clicked() { @@ -397,10 +361,10 @@ void MainWindow::on_openMainBackupButton_clicked() "; exec bash'"); } - - ui->statusBar->showMessage(tr("Done. Now select another action")); } +//##Main Restore - to verify + void MainWindow::on_openMainRestoreButton_clicked() { QString filename=QFileDialog::getOpenFileName( @@ -449,136 +413,94 @@ void MainWindow::on_openMainRestoreButton_clicked() "; exec bash'"); QMessageBox::information(this,tr("Notification"),tr("Restored all OK")); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } } -//##rc.local +//##rc.local - no slider terminal + texteditor void MainWindow::on_openRCLocalButton_clicked() { - ui->statusBar->showMessage(tr("Opening rc.local")); - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); DbManager db(path); - QString status = db.getStatus("textEditor"); - - QProcess::startDetached("xterm -e \"sudo -i "+ status +" /etc/rc.local && exit; exec bash\""); + QString status = db.getStatus("terminal"); + QString status2 = db.getStatus("textEditor"); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \"sudo -i "+ status2 +" /etc/rc.local \" "); } -//##HiddenStartupItems +//##HiddenStartupItems - slider void MainWindow::on_checkBoxHiddenStartupItems_clicked(bool checked) { if (checked != false){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Showing")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/038.showHiddenStartupItems" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - + system("xterm -e '" + "~/.ubunsys/downloads/ubuntuScripts-dev/038.showHiddenStartupItems" + " && " + "exit" + "; exec bash'"); } else if (checked == false){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Unshowing")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/037.unshowHiddenStartupItems" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - + system("xterm -e '" + "~/.ubunsys/downloads/ubuntuScripts-dev/037.unshowHiddenStartupItems" + " && " + "exit" + "; exec bash'"); } MainWindow::checkHiddenStartupItemsStatus(); } -//##dualBoot +//##dualBoot - no slider terminal void MainWindow::on_runGrubcustomizerButton_clicked() { - ui->statusBar->showMessage(tr("Installs/runs grub-customizer. Please wait")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntupackages-master/apps1/grub-customizer" - " && " - "sudo grub-customizer" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntupackages-master/apps1/grub-customizer && sudo grub-customizer"); } -//##Sync Time +//##Sync Time - no slider terminal void MainWindow::on_runSyncTime_clicked() { - ui->statusBar->showMessage(tr("Sync Time")); + static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); + DbManager db(path); - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/changeLinuxtoWindowsTime" - " && " - "echo Close this window!" - "; exec bash'"); + QString status = db.getStatus("terminal"); - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \" bash -c ~/.ubunsys/downloads/ubuntuScripts-dev/changeLinuxtoWindowsTime \" "); } -//##edit grub +//##edit grub - no slider terminal + texteditor void MainWindow::on_editGrubButton_clicked() { - ui->statusBar->showMessage(tr("Edit grub")); - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); DbManager db(path); - QString status = db.getStatus("textEditor"); + QString status = db.getStatus("terminal"); + QString status2 = db.getStatus("textEditor"); - QProcess::startDetached("xterm -e \"sudo -i "+ status +" /etc/default/grub && exit; exec bash\""); - - ui->statusBar->showMessage(tr("Done. Now select another action")); + QProcess::startDetached(status + " -e \"sudo -i "+ status2 +" /etc/default/grub \" "); } -//##update grub +//##update grub - no slider terminal void MainWindow::on_updateGrubButton_clicked() { - ui->statusBar->showMessage(tr("Update grub")); + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntuScripts-dev/081.updateGrub"); - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/081.updateGrub" - " && " - "echo Close this window!" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } -//##resetDconf +//##resetDconf - reserved void MainWindow::on_resetDconf_clicked() { - ui->statusBar->showMessage(tr("Resetting dconf config")); - QMessageBox::StandardButton reply; reply = QMessageBox::question(this, "Warning", "Are you completely sure?", QMessageBox::Yes|QMessageBox::No); @@ -591,194 +513,131 @@ void MainWindow::on_resetDconf_clicked() " && " "echo Close this window!" "; exec bash'"); - - - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else { qDebug() << "Yes was *not* clicked"; - ui->statusBar->showMessage(tr("Execution canceled")); } } -//##asterisks +//##asterisks - slider void MainWindow::on_checkBoxAsterisks_clicked(bool checked) { - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); - DbManager db(path); - - if (db.isOpen()) - { - - if (checked == true){ - qDebug() << checked; - - ui->statusBar->showMessage(tr("Doing visible asterisks")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/021.doVisibleAsterisks" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - - } - - else if (checked == false){ - qDebug() << checked; - - ui->statusBar->showMessage(tr("Doing invisible asterisks")); - - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/022.doInvisibleAsterisks" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); + if (checked == true){ + qDebug() << checked; + system("xterm -e '" + "~/.ubunsys/downloads/ubuntuScripts-dev/021.doVisibleAsterisks" + " && " + "exit" + "; exec bash'"); + } - } + else if (checked == false){ + qDebug() << checked; + system("xterm -e '" + "~/.ubunsys/downloads/ubuntuScripts-dev/022.doInvisibleAsterisks" + " && " + "exit" + "; exec bash'"); } MainWindow::checkAsterisksStatus(); } -//##hibernation +//##hibernation - slider void MainWindow::on_checkBoxHibernation_clicked(bool checked) { if (checked == true){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Hibernation enabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/007.enableHibernation" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else if (checked == false){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Hibernation disabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/024.disableHibernation" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } MainWindow::checkHibernationStatus(); } -//##lock screen +//##lock screen - slider void MainWindow::on_checkBoxLockScreen_clicked(bool checked) { if (checked == true){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Lock screen Enabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/036.enableLockScreen" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else if (checked == false){ qDebug() << checked; - - ui->statusBar->showMessage(tr("Lock screen Disabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/035.disableLockScreen" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } MainWindow::checkLockScreenStatus(); } -//##login sound +//##login sound - slider void MainWindow::on_checkBoxLoginSound_clicked(bool checked) { if (checked == true){ qDebug() << checked; - ui->statusBar->showMessage(tr("Login Sound Enabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/039.enableLoginSound" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); - } else if (checked == false){ qDebug() << checked; - ui->statusBar->showMessage(tr("Login Sound Disabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/040.disableLoginSound" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } MainWindow::checkLoginSoundStatus(); } -//##fonts +//##fonts - to implement void MainWindow::on_installInfinalityFontsButton_clicked() { - ui->statusBar->showMessage(tr("Login Sound Disabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntupackages-master-apps/infinality-fonts" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } void MainWindow::on_uninstallInfinalityFontsButton_clicked() { - ui->statusBar->showMessage(tr("Login Sound Disabled")); - system("xterm -e '" "~/.ubunsys/downloads/ubuntuScripts-dev/082.uninstallInfinalityFonts" " && " "exit" "; exec bash'"); - - ui->statusBar->showMessage(tr("Done. Now select another action")); } diff --git a/src/ubunsys.pro b/src/ubunsys.pro index a84b49e..44aaf89 100755 --- a/src/ubunsys.pro +++ b/src/ubunsys.pro @@ -22,28 +22,25 @@ SOURCES += main.cpp \ initializations.cpp \ mainwindow.cpp \ toolbartab.cpp \ - repairtab.cpp \ tweakstab.cpp \ packagestab.cpp \ about.cpp \ tutorial.cpp \ packagesdialog.cpp \ rootfilesysproxymodel.cpp \ - updatescriptsdialog.cpp \ preferencesdialog.cpp \ updates.cpp \ - dbmanager.cpp + dbmanager.cpp \ + fixes.cpp HEADERS += mainwindow.h \ packagesdialog.h \ rootfilesysproxymodel.h \ - updatescriptsdialog.h \ preferencesdialog.h \ dbmanager.h FORMS += mainwindow.ui \ packagesdialog.ui \ - updatescriptsdialog.ui \ preferencesdialog.ui RC_ICONS += images/ubunsys.png diff --git a/src/ubunsys.qrc b/src/ubunsys.qrc index 3719df3..ed47435 100755 --- a/src/ubunsys.qrc +++ b/src/ubunsys.qrc @@ -56,5 +56,8 @@ images/broom.png images/broom2.png images/settings-4-128.png + images/transparent-clipboard-clear-5.png + images/panda.png + images/ubunsys+panda.png diff --git a/src/updates.cpp b/src/updates.cpp index 1b41163..e725e9f 100755 --- a/src/updates.cpp +++ b/src/updates.cpp @@ -2,6 +2,8 @@ #include "ui_mainwindow.h" #include #include +#include +#include ///////////////////////UPDATES/////////////////////// @@ -14,143 +16,51 @@ void MainWindow::on_updateAndUpgradeButton_clicked() { - ui->statusBar->showMessage(tr("Executing default update & upgrade system. Then close the terminal window")); - QProcess::startDetached("xterm -e \"sudo apt-fast -y update && sudo apt-fast -y upgrade && echo Close window if ok; exec bash\""); + process->start("sh", QStringList() << "-c" << "sudo apt-fast -y update && sudo apt-fast -y upgrade"); -/* - system("xterm -e '" - "sudo apt-fast -y update" - " && " - "sudo apt-fast -y upgrade" - "; exec bash'"); -*/ - - ui->statusBar->showMessage(tr("Default update & upgrade system did it successful. Now select another action")); } void MainWindow::on_basicPackagesInstallButton_clicked() { - ui->statusBar->showMessage(tr("Executing normal user installation script. Then close the terminal window")); - - QProcess::startDetached("xterm -e \"cd ~/.ubunsys/downloads/ubuntupackages-master && sudo ~/.ubunsys/downloads/ubuntupackages-master/installpackages1-minimal; exec bash\""); -/* - system("xterm -e '" - "cd ~/.ubunsys/downloads/ubuntupackages-master" - " && " - "sudo ~/.ubunsys/downloads/ubuntupackages-master/installpackages1-minimal" - "; exec bash'"); -*/ - ui->statusBar->showMessage(tr("Script executed succesful. Now select another action")); + process->start("sh", QStringList() << "-c" << "cd ~/.ubunsys/downloads/ubuntupackages-master && sudo ~/.ubunsys/downloads/ubuntupackages-master/packagesToInstall_20200419.list"); } void MainWindow::on_cleanButton_clicked() { - ui->statusBar->showMessage(tr("Executing system clean. Then close the terminal window")); - - QProcess::startDetached("xterm -e \"sudo apt-get -f install && sudo apt-get -y autoremove && sudo apt-get -y autoclean && sudo apt-get -y clean; exec bash\""); -/* - system("xterm -e '" - "sudo apt-get -f install" - " && " - "sudo apt-get -y autoremove" - " && " - "sudo apt-get -y autoclean" - " && " - "sudo apt-get -y clean" - "; exec bash'"); -*/ - ui->statusBar->showMessage(tr("System clean did it succesful. Now select another action")); + process->start("sh", QStringList() << "-c" << "sudo apt-get -f install && sudo apt-get -y autoremove && sudo apt-get -y autoclean && sudo apt-get -y clean"); } // Advanced user void MainWindow::on_dist_upgradeButton_clicked() { - ui->statusBar->showMessage(tr("Executing smart system upgrade. Then close the terminal window")); - - QProcess::startDetached("xterm -e \"sudo apt-fast -y update && sudo apt-fast -y dist-upgrade; exec bash\""); -/* - system("xterm -e '" - "sudo apt-fast -y update" - " && " - "sudo apt-fast -y dist-upgrade" - "; exec bash'"); -*/ - ui->statusBar->showMessage(tr("Smart system upgrade did it succesful. Now select another action")); + process->start("sh", QStringList() << "-c" << "sudo apt-fast -y update && sudo apt-fast -y dist-upgrade"); } void MainWindow::on_cleanKernelsButton_clicked() { - ui->statusBar->showMessage(tr("Executing kernels clean. Then close the terminal window")); - - QProcess::startDetached("xterm -e \"sudo apt-get -y install byobu && sudo purge-old-kernels; exec bash\""); -/* - system("xterm -e '" - "sudo apt-get -y install byobu" - " && " - "sudo purge-old-kernels" - "; exec bash'"); -*/ - ui->statusBar->showMessage(tr("Kernels clean did it succesful. Now select another action")); + process->start("sh", QStringList() << "-c" << "sudo purge-old-kernels"); } void MainWindow::on_listUpgradablePackagesButton_clicked() { - system("xterm -e '" - "sudo ~/.ubunsys/downloads/ubuntuScripts-dev/listUpgradablePackages" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Missed GPG keys repaired or fix cancelled, check if ok now")); + process->start("sh", QStringList() << "-c" << "sudo ~/.ubunsys/downloads/ubuntuScripts-dev/listUpgradablePackages"); } void MainWindow::on_listLatestInstalledPackagesButton_clicked() { - system("xterm -e '" - "~/.ubunsys/downloads/ubuntuScripts-dev/listLatestInstalledPackages" - " && " - "exit" - "; exec bash'"); - - ui->statusBar->showMessage(tr("Missed GPG keys repaired or fix cancelled, check if ok now")); + process->start("sh", QStringList() << "-c" << "~/.ubunsys/downloads/ubuntuScripts-dev/listLatestInstalledPackages"); } void MainWindow::on_upgradeLatestStableButton_clicked() { - ui->statusBar->showMessage(tr("Executing upgrade to Latest Stable Version. Then close the terminal window")); - QProcess::startDetached("xterm -e \"sudo do-release-upgrade; exec bash\""); - -/* - system("xterm -e '" - "sudo do-release-upgrade" - "; exec bash'"); -*/ - - ui->statusBar->showMessage(tr("Upgrade to Latest Stable Version did it succesful. Now select another action")); } void MainWindow::on_installMainlineKernels_clicked() { - ui->statusBar->showMessage(tr("Checking if ukuu is installed and we install it if necessary")); - - QProcess::startDetached("xterm -e \"sudo ~/.ubunsys/downloads/ubuntuScripts-dev/034.check_ukuu_installed && ukuu-gtk; exec bash\""); -/* - system("xterm -e '" - "sudo ~/.ubunsys/downloads/ubuntuScripts-dev/034.check_ukuu_installed" - " && " - "exit" - "; exec bash'"); -*/ - //ui->statusBar->showMessage(tr("Running ukuu...")); - - //QProcess::startDetached("ukuu-gtk"); - - //system("ukuu-gtk &&"); - - ui->statusBar->showMessage(tr("ukuu opened. Select another action.")); + process->start("sh", QStringList() << "-c" << "sudo ~/.ubunsys/downloads/ubuntupackages-master/apps1/mainline-ubuntu-kernel-installer && mainline-gtk"); } void MainWindow::on_comboBoxUpdate_currentIndexChanged(const QString &arg1) @@ -199,13 +109,5 @@ void MainWindow::on_comboBoxUpdate_currentIndexChanged(const QString &arg1) void MainWindow::on_upgradeLatestDevButton_clicked() { - ui->statusBar->showMessage(tr("Executing upgrade to Latest Dev Version. Then close the terminal window")); - QProcess::startDetached("xterm -e \"sudo do-release-upgrade -d; exec bash\""); -/* - system("xterm -e '" - "sudo do-release-upgrade -d" - "; exec bash'"); -*/ - ui->statusBar->showMessage(tr("Upgrade to Latest Dev Version did it succesful. Now select another action")); } diff --git a/src/updatescriptsdialog.cpp b/src/updatescriptsdialog.cpp deleted file mode 100755 index f1a4cd1..0000000 --- a/src/updatescriptsdialog.cpp +++ /dev/null @@ -1,155 +0,0 @@ -#include "updatescriptsdialog.h" -#include "ui_updatescriptsdialog.h" -#include -#include -#include -#include -#include - -UpdateScriptsDialog::UpdateScriptsDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::UpdateScriptsDialog) -{ - ui->setupUi(this); - - ui->statusBar->showMessage(tr("Push to check scripts version and update if necessary.")); - - connect(ui->closeUpdateDialogButton, SIGNAL(clicked()),this, SIGNAL(CloseClicked()) );////////// - - ui->textBrowser->setText(tr("Waiting selection...")); - ui->progressBar->setValue(0); -} - -UpdateScriptsDialog::~UpdateScriptsDialog() -{ - delete ui; -} - -void UpdateScriptsDialog::on_checkButton_clicked() -{ - system("rm -Rf ~/.ubunsys/updates/updateLog.log"); - system("touch ~/.ubunsys/updates/updateLog.log"); - - ui->textBrowser->clear(); - ui->textBrowser->setText(tr("Checking...")); - - ui->statusBar->showMessage(tr("Checking your scripts version and updating if necessary. Please wait...")); - - ui->progressBar->setValue(0); - //######## Update ubuntuScripts - ui->progressBar->setValue(15); - ui->statusBar->showMessage(tr("Checking ubuntuscripts. Please wait...")); - system("/usr/share/ubunsys/scripts/updateUbuntuScripts.sh"); - - //######## Update ubuntupackages - ui->progressBar->setValue(40); - ui->statusBar->showMessage(tr("Checking ubuntupackages. Please wait...")); - system("/usr/share/ubunsys/scripts/updateUbuntupackages.sh"); - - //######## apt-fast checking - ui->progressBar->setValue(65); - ui->statusBar->showMessage(tr("Checking apt-fast. Please wait...")); - system("/usr/share/ubunsys/scripts/apt-fastChecking.sh"); - - //######## Update ubunsys - ui->progressBar->setValue(85); - ui->statusBar->showMessage(tr("Checking ubunsys. Please wait...")); - system("/usr/share/ubunsys/scripts/updateUbunsys.sh"); - - ui->progressBar->setValue(100); - - ui->statusBar->showMessage(tr("Scripts version checked and updated if necessary. Close this window!")); - - //Show update output - - QFile file (QDir::homePath() + "/.ubunsys/updates/updateLog.log"); - - if(!file.open(QIODevice::ReadOnly)) - QMessageBox::information(0,"info",file.errorString()); - - QTextStream in (&file); - - ui->textBrowser->setText(in.readAll()); - - //QFile::remove(QDir::homePath() + "/.ubunsys/updates/updateLog.log"); - //system("rm -Rf ~/.ubunsys/updates/updateLog.log"); - //system("touch ~/.ubunsys/updates/updateLog.log"); - - - //textEditor begin - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); - DbManager db(path); - - QString actualTextEditorSelected = db.getStatus("textEditor"); - - QFile file2 (QDir::homePath() + "/.ubunsys/configurations/actualTextEditor.cfg"); - if ( file2.open(QIODevice::ReadWrite) ) - { - QTextStream stream( &file2 ); - stream << actualTextEditorSelected << endl; - } - - //system("~/.ubunsys/configurations/textEditorChange && " - system("~/.ubunsys/downloads/ubuntuScripts-dev/textEditorChange && " - "exit"); - - //textEditor end -} - -void UpdateScriptsDialog::on_forceButton_clicked() //NOT WORKS OK, DISABLED -{ - system("rm -Rf ~/.ubunsys/updates/updateLog.log"); - system("touch ~/.ubunsys/updates/updateLog.log"); - - ui->textBrowser->clear(); - ui->textBrowser->setText(tr("Forcing only packages & scripts updates...")); - - ui->statusBar->showMessage(tr("Updating forcedly. Please wait...")); - ui->progressBar->setValue(0); - system("/usr/share/ubunsys/scripts/updateForced.sh"); - ui->progressBar->setValue(100); - - ui->statusBar->showMessage(tr("Updated forcedly. Close this window!")); - - //Show update output - - QFile file (QDir::homePath() + "/.ubunsys/updates/updateLog.log"); - - if(!file.open(QIODevice::ReadOnly)) - QMessageBox::information(0,"info",file.errorString()); - - QTextStream in (&file); - - ui->textBrowser->setText(in.readAll()); - - - //textEditor begin - - static const QString path (QDir::homePath() + "/.ubunsys/configurations/config.db"); - DbManager db(path); - - QString actualTextEditorSelected = db.getStatus("textEditor"); - - QFile file2 (QDir::homePath() + "/.ubunsys/configurations/actualTextEditor.cfg"); - if ( file2.open(QIODevice::ReadWrite) ) - { - QTextStream stream( &file2 ); - stream << actualTextEditorSelected << endl; - } - - system("~/.ubunsys/downloads/ubuntuScripts-dev/textEditorChange && " - "exit"); - - //textEditor end - -} - -void UpdateScriptsDialog::on_closeUpdateDialogButton_clicked() -{ - ui->statusBar->showMessage(tr("Push to check scripts version and update if necessary.")); - - ui->textBrowser->setText(tr("Waiting selection...")); - ui->progressBar->setValue(0); -} - - diff --git a/src/updatescriptsdialog.h b/src/updatescriptsdialog.h deleted file mode 100755 index 40e4e1d..0000000 --- a/src/updatescriptsdialog.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef UPDATESCRIPTSDIALOG_H -#define UPDATESCRIPTSDIALOG_H - -#include - -namespace Ui { -class UpdateScriptsDialog; -} - -class UpdateScriptsDialog : public QDialog -{ - Q_OBJECT - -public: - explicit UpdateScriptsDialog(QWidget *parent = 0); - ~UpdateScriptsDialog(); - -signals: - void CloseClicked();/////////// - -private slots: - void on_checkButton_clicked(); - void on_closeUpdateDialogButton_clicked(); - void on_forceButton_clicked(); - -private: - Ui::UpdateScriptsDialog *ui; -}; - -#endif // UPDATESCRIPTSDIALOG_H diff --git a/src/updatescriptsdialog.ui b/src/updatescriptsdialog.ui deleted file mode 100755 index ba65970..0000000 --- a/src/updatescriptsdialog.ui +++ /dev/null @@ -1,97 +0,0 @@ - - - UpdateScriptsDialog - - - - 0 - 0 - 669 - 225 - - - - Manual check if scripts update is required... - - - - - 230 - 20 - 201 - 23 - - - - 0 - - - - - - 160 - 51 - 91 - 31 - - - - Check - - - - - true - - - - 0 - 200 - 661 - 21 - - - - - - - 10 - 90 - 651 - 111 - - - - - - - 400 - 51 - 91 - 31 - - - - Close - - - - - false - - - - 280 - 51 - 91 - 31 - - - - Force - - - - - -