From 618cf3d2ec0ec88a99d89f9cb2dbe4926c0843f4 Mon Sep 17 00:00:00 2001 From: Ivan Loskutov Date: Wed, 11 Aug 2010 09:12:32 +0400 Subject: [PATCH] Change code for using new installer (cl-install). Added user managment page and dialog. --- CMakeLists.txt | 83 +++++++------- src/commons.h | 9 ++ src/main.cpp | 8 +- src/pagecfdisk.cpp | 2 +- src/pageinstall.cpp | 4 + src/pagepartitioning.cpp | 17 +++ src/pageusers.cpp | 238 +++++++++++++++++++++++++++++++++++++++ src/pageusers.h | 52 +++++++++ src/systeminstaller.cpp | 12 +- src/userinfodialog.cpp | 123 ++++++++++++++++++++ src/userinfodialog.h | 40 +++++++ 11 files changed, 544 insertions(+), 44 deletions(-) create mode 100644 src/commons.h create mode 100644 src/pageusers.cpp create mode 100644 src/pageusers.h create mode 100644 src/userinfodialog.cpp create mode 100644 src/userinfodialog.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 51c49bc..fce3f67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ set(PROJECT cl-install-gui) project(${PROJECT}) if(NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE "MinsizeRel") + set(CMAKE_BUILD_TYPE "MinsizeRel") endif(NOT CMAKE_BUILD_TYPE) list(APPEND CMAKE_MODULE_PATH "cmake") @@ -18,32 +18,37 @@ include(${QT_USE_FILE}) set(TRANSLATIONS_DEST "share/${PROJECT}") set( SOURCES - src/main.cpp - src/systeminstaller.cpp - src/pagemanager.cpp - src/pagewelcome.cpp - src/pagelicense.cpp - src/pagepartitioning.cpp - src/pagecfdisk.cpp - src/pageconfiguration.cpp - src/pageinstall.cpp - src/pagefinish.cpp - src/tools.cpp + src/main.cpp + src/systeminstaller.cpp + src/pagemanager.cpp + src/pagewelcome.cpp + src/pagelicense.cpp + src/pagepartitioning.cpp + src/pagecfdisk.cpp + src/pageconfiguration.cpp + src/pageusers.cpp + src/pageinstall.cpp + src/pagefinish.cpp + src/tools.cpp src/libparted.cpp + src/userinfodialog.cpp ) set( HEADERS - src/systeminstaller.h - src/installerpage.h - src/pagemanager.h - src/pagewelcome.h - src/pagelicense.h - src/pagepartitioning.h - src/pagecfdisk.h - src/pageconfiguration.h - src/pageinstall.h - src/pagefinish.h + src/systeminstaller.h + src/installerpage.h + src/pagemanager.h + src/pagewelcome.h + src/pagelicense.h + src/pagepartitioning.h + src/pagecfdisk.h + src/pageconfiguration.h + src/pageusers.h + src/pageinstall.h + src/pagefinish.h src/libparted.h + src/userinfodialog.h + src/commons.h ) set( LANGUAGES @@ -52,24 +57,24 @@ set( LANGUAGES ) set( RESOURCES - resources/systeminstaller.qrc + resources/systeminstaller.qrc ) -add_definitions( -DQT_GUI_LIB -DQT_CORE_LIB -Wall) +add_definitions(-DNO_INSTALL -DQT_GUI_LIB -DQT_CORE_LIB -Wall) include_directories( ./ - ${QT_INCLUDES} - ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} - /usr/lib + ${QT_INCLUDES} + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + /usr/lib ) qt4_add_resources( RESOURCES_SRCS - ${RESOURCES} + ${RESOURCES} ) qt4_wrap_cpp( MOC_SRCS - ${HEADERS} + ${HEADERS} ) foreach (LANGUAGE ${LANGUAGES}) @@ -95,15 +100,15 @@ add_custom_command ( add_executable( ${PROJECT} ${HEADERS} - ${SOURCES} - ${MOC_SRCS} - ${RESOURCES_SRCS} + ${SOURCES} + ${MOC_SRCS} + ${RESOURCES_SRCS} ${TRANSLATIONS} ) target_link_libraries( ${PROJECT} - ${QT_LIBRARIES} - qtermwidget + ${QT_LIBRARIES} + qtermwidget parted ) @@ -114,13 +119,15 @@ install( FILES ${CMAKE_BINARY_DIR}/${PROJECT} GROUP_EXECUTE GROUP_READ WORLD_EXECUTE WORLD_READ ) + install( FILES ${TRANSLATIONS_BINARY} DESTINATION share/${PROJECT} PERMISSIONS - OWNER_WRITE OWNER_READ - GROUP_READ - WORLD_READ + OWNER_WRITE OWNER_READ + GROUP_READ + WORLD_READ ) + #install( FILES resources/${PROJECT}.desktop # DESTINATION share/applications # PERMISSIONS diff --git a/src/commons.h b/src/commons.h new file mode 100644 index 0000000..5760f7b --- /dev/null +++ b/src/commons.h @@ -0,0 +1,9 @@ +#pragma once + +class QString; + +struct UserInfo +{ + QString name; + QString psw; +}; diff --git a/src/main.cpp b/src/main.cpp index 1a47515..52d63f3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -14,15 +14,19 @@ int main(int argc, char** argv) QTextCodec::setCodecForTr( QTextCodec::codecForName("UTF-8") ); QTextCodec::setCodecForCStrings( QTextCodec::codecForName("UTF-8") ); - QApplication app(argc, argv); + QApplication app(argc, argv); SystemInstaller installer; +#ifndef NO_INSTALL if ( getuid() != 0) { - QMessageBox::critical( 0, QObject::tr("Error"), QObject::tr("You do not have administrative privileges.") ); + QMessageBox::critical( 0, QObject::tr("Error"), + QObject::tr("You do not have administrative privileges.") + ); return -1; } +#endif installer.show(); diff --git a/src/pagecfdisk.cpp b/src/pagecfdisk.cpp index 924c775..63cbaea 100644 --- a/src/pagecfdisk.cpp +++ b/src/pagecfdisk.cpp @@ -59,7 +59,7 @@ void PageCfdisk::retranslateUi() void PageCfdisk::show() { - QString cmd = QString("LANGUAGE=""%1"" %2 %3").arg(m_Lang).arg(m_Cmd).arg(m_Disk) + "; exit \r\n"; + QString cmd = QString("LANGUAGE='%1' %2 %3").arg(m_Lang).arg(m_Cmd).arg(m_Disk) + "; exit \r\n"; m_Term->sendText( cmd ); m_Term->setFocus(); } diff --git a/src/pageinstall.cpp b/src/pageinstall.cpp index 501c607..08fea02 100644 --- a/src/pageinstall.cpp +++ b/src/pageinstall.cpp @@ -57,6 +57,7 @@ void PageInstall::show() { m_clProc = new QProcess(this); +#ifndef NO_INSTALL connect( m_clProc, SIGNAL(error(QProcess::ProcessError)), this, SLOT(onError(QProcess::ProcessError)) ); connect( m_clProc, SIGNAL(readyReadStandardOutput()), this, SLOT(showStdOut()) ); connect( m_clProc, SIGNAL(readyReadStandardError()), this, SLOT(showStdErr()) ); @@ -83,6 +84,9 @@ void PageInstall::show() args << QString("--set-video_drv=%1").arg( m_Settings->videodrv ); m_clProc->start("calculate", args); +#else + onFinish(0, QProcess::NormalExit); +#endif } } diff --git a/src/pagepartitioning.cpp b/src/pagepartitioning.cpp index 2db934c..a51156d 100644 --- a/src/pagepartitioning.cpp +++ b/src/pagepartitioning.cpp @@ -107,6 +107,7 @@ void PagePartitioning::show() m_Partitions->clear(); m_PartitionsMap.clear(); +#ifndef NO_INSTALL // get disk & partitions QScopedPointer libParted( new LibParted ); @@ -158,6 +159,22 @@ void PagePartitioning::show() } m_PartitionsMap[dev] = partitions; } +#else + + m_Disks->clear(); + + QString dev = "/dev/sda"; + m_Disks->addItem("/dev/sda - Test disk", QVariant(dev)); + + QList partitions; + PartitionDesc part_desc; + + part_desc.first = "/dev/sda1 100GB testfs"; + part_desc.second = "/dev/sda1"; + partitions << part_desc; + + m_PartitionsMap[dev] = partitions; +#endif if (m_Disks->count() > 0) { diff --git a/src/pageusers.cpp b/src/pageusers.cpp new file mode 100644 index 0000000..b2fe0f9 --- /dev/null +++ b/src/pageusers.cpp @@ -0,0 +1,238 @@ +#include "pageusers.h" + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "userinfodialog.h" + +#include + +PageUsers::PageUsers() + : InstallerPage() +{ + setupUi(); + + // connect + connect( m_butAddUser, SIGNAL(clicked()), this, SLOT(addUser()) ); + connect( m_butDelUser, SIGNAL(clicked()), this, SLOT(delUser()) ); + connect( m_lstUsers, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(modifyUser()) ); + + connect( m_edRootPsw, SIGNAL(textChanged(QString)), this, SLOT(checkPasswords()) ); + connect( m_edRootPswRep, SIGNAL(textChanged(QString)), this, SLOT(checkPasswords()) ); + + // add default guest user + m_lstUsers->addItem("guest"); + checkPasswords(); +} + +void PageUsers::setupUi() +{ + m_labRoot = new QLabel; + + QHBoxLayout* hbox_0 = new QHBoxLayout; + hbox_0->addWidget(m_labRoot); + hbox_0->addStretch(); + + m_labRootPsw = new QLabel; + m_edRootPsw = new QLineEdit; + m_edRootPsw->setEchoMode( QLineEdit::Password ); + + m_labRootPswRep = new QLabel; + m_edRootPswRep = new QLineEdit; + m_edRootPswRep->setEchoMode( QLineEdit::Password ); + + QGridLayout* gbox_0 = new QGridLayout; + gbox_0->setContentsMargins(0, 0, 0, 0); + gbox_0->addWidget(m_labRootPsw, 0, 0); + gbox_0->addWidget(m_edRootPsw, 0, 1); + gbox_0->addWidget(m_labRootPswRep, 1, 0); + gbox_0->addWidget(m_edRootPswRep, 1, 1); + + m_labMatch = new QLabel; + QHBoxLayout* hbox_1 = new QHBoxLayout; + hbox_1->addStretch(); + hbox_1->addWidget(m_labMatch); + + m_labUsers = new QLabel; + + QHBoxLayout* hbox_users = new QHBoxLayout; + hbox_users->addWidget(m_labUsers); + hbox_users->addStretch(); + + m_butAddUser = new QToolButton; + m_butAddUser->setIcon( QIcon::fromTheme("list-add-user") ); + + m_butDelUser = new QToolButton; + m_butDelUser->setIcon( QIcon::fromTheme("list-remove") ); + + QHBoxLayout* hbox_but = new QHBoxLayout; + hbox_but->addWidget( m_butAddUser ); + hbox_but->addWidget( m_butDelUser ); + hbox_but->addStretch(); + + m_lstUsers = new QListWidget; + + QVBoxLayout* vbox_0 = new QVBoxLayout; + vbox_0->addLayout(hbox_0); + vbox_0->addLayout(gbox_0); + vbox_0->addLayout(hbox_1); + vbox_0->addLayout(hbox_users); + vbox_0->addLayout(hbox_but); + vbox_0->addWidget(m_lstUsers); + //vbox_0->addStretch(); + + setLayout(vbox_0); + + retranslateUi(); + +} + +void PageUsers::retranslateUi() +{ + setTitle( tr("Users") ); + + m_labRoot->setText( tr("Root password:") ); + m_labRootPsw->setText( tr("Password") ); + m_labRootPswRep->setText( tr("Confirm Password") ); + + m_labUsers->setText( tr("Create users:") ); +} + +void PageUsers::show() +{ + emit changeNext( m_pswState ); +} + +void PageUsers::addUser() +{ + qDebug() << "add user"; + + QScopedPointer userDlg( new UserInfoDialog(this) ); + + if ( userDlg->exec() == QDialog::Accepted ) + { + if (m_lstUserInfo.isEmpty()) + { + // delete guest from list + m_lstUsers->clear(); + } + + UserInfo userInfo = userDlg->getUserInfo(); + + if ( findUserName(userInfo) == -1 ) + { + m_lstUserInfo << userInfo; + m_lstUsers->addItem( userInfo.name ); + } + else + { + QMessageBox::critical( this, tr("Error"), tr("User %1 already exists.").arg(userInfo.name) ); + QTimer::singleShot(0, this, SLOT(addUser())); + } + } +} + +void PageUsers::delUser() +{ + qDebug() << "del user"; + + if (m_lstUserInfo.isEmpty()) + { + QMessageBox::critical( this, tr("Error"), tr("User guest can't be deleted.") ); + return; + } + else + { + int index = m_lstUsers->currentRow(); + if (index != -1) + { + delete m_lstUsers->takeItem(index); + m_lstUserInfo.removeAt(index); + + if (m_lstUserInfo.isEmpty()) + { + m_lstUsers->addItem("guest"); + } + } + } +} + +void PageUsers::modifyUser() +{ + qDebug() << "modify user"; + if (m_lstUserInfo.isEmpty()) + { + QMessageBox::critical( this, tr("Error"), tr("User guest can't be modified.") ); + return; + } + else + { + int index = m_lstUsers->currentRow(); + if (index != -1) + { + QScopedPointer userDlg( new UserInfoDialog(this, m_lstUserInfo.at(index)) ); + + if ( userDlg->exec() == QDialog::Accepted ) + { + UserInfo userInfo = userDlg->getUserInfo(); + + int index_0 = findUserName(userInfo); + if ( (index_0 == -1) || (index_0 == index) ) + { + delete m_lstUsers->takeItem(index); + m_lstUsers->insertItem(index, userInfo.name); + m_lstUserInfo.replace(index, userInfo); + } + else + { + QMessageBox::critical( this, tr("Error"), tr("User %1 already exists.").arg(userInfo.name) ); + QTimer::singleShot(0, this, SLOT(modifyUser())); + } + } + } + } +} + +void PageUsers::checkPasswords() +{ + qDebug() << "check passwords"; + + m_pswState = false; + + if ( (!m_edRootPsw->text().isEmpty()) && (m_edRootPsw->text() == m_edRootPswRep->text()) ) + m_pswState = true; + + QString pswState; + if (m_pswState ) + { + pswState = tr("Passwords match"); + } + else + { + pswState = tr("Passwords do not match"); + } + m_labMatch->setText( pswState ); + + emit changeNext( m_pswState ); +} + +int PageUsers::findUserName( const UserInfo& userInfo ) +{ + int i = 0; + foreach(const UserInfo& info, m_lstUserInfo) + { + if (info.name.compare(userInfo.name, Qt::CaseInsensitive) == 0) + return i; + ++i; + } + return -1; +} + diff --git a/src/pageusers.h b/src/pageusers.h new file mode 100644 index 0000000..8365dc2 --- /dev/null +++ b/src/pageusers.h @@ -0,0 +1,52 @@ +#pragma once + +#include "installerpage.h" + +#include "commons.h" + +class QLabel; +class QLineEdit; +class QToolButton; +class QListWidget; + +class PageUsers : public InstallerPage +{ + Q_OBJECT +public: + explicit PageUsers(); + + void retranslateUi(); + +protected: + void setupUi(); + +public slots: + void show(); + +private slots: + void addUser(); + void delUser(); + void modifyUser(); + void checkPasswords(); + +private: + int findUserName(const UserInfo& userInfo); + +private: + QLabel* m_labRoot; + QLabel* m_labRootPsw; + QLineEdit* m_edRootPsw; + QLabel* m_labRootPswRep; + QLineEdit* m_edRootPswRep; + QLabel* m_labMatch; + + QLabel* m_labUsers; + + QToolButton* m_butAddUser; + QToolButton* m_butDelUser; + + QListWidget* m_lstUsers; + + bool m_pswState; + QList m_lstUserInfo; +}; diff --git a/src/systeminstaller.cpp b/src/systeminstaller.cpp index 367aefa..d560ec4 100644 --- a/src/systeminstaller.cpp +++ b/src/systeminstaller.cpp @@ -17,6 +17,7 @@ #include "pagelicense.h" #include "pagepartitioning.h" #include "pageconfiguration.h" +#include "pageusers.h" #include "pageinstall.h" #include "pagefinish.h" @@ -26,7 +27,6 @@ SystemInstaller::SystemInstaller(QWidget *parent) : QMainWindow(parent), m_Translator(new QTranslator) { - //m_CurrentLanguage = QLocale::system().name(); m_CurrentLanguage = QString(qgetenv("LANG")).split(".").first(); changeLanguage(m_CurrentLanguage); @@ -115,8 +115,10 @@ void SystemInstaller::setupUi() setWindowIcon(icon); // minimum size for window TODO: remove magic numbers, add other sizes? - setMinimumSize(800, 600); - setMaximumSize(800, 600); + //setMinimumSize(800, 600); + //setMaximumSize(800, 600); + setMinimumSize(800, 500); + setMaximumSize(800, 500); QRect scr = QApplication::desktop()->screenGeometry(); move( scr.width() - scr.width()/2 - 800/2, scr.height() - scr.height()/2 - 600/2 ); @@ -165,6 +167,10 @@ void SystemInstaller::setupInstallerPages() ); m_PageManager->addPage(pageConfiguration); + PageUsers* pageUsers( new PageUsers ); + connect( pageUsers, SIGNAL(changeNext(bool)), this, SLOT(changeNext(bool)) ); + m_PageManager->addPage( pageUsers ); + PageInstall* pageInstall( new PageInstall( &m_InstallSettings ) ); connect( pageInstall, SIGNAL(changeNext(bool)), this, SLOT(changeNext(bool)) ); connect( pageInstall, SIGNAL(changePrev(bool)), this, SLOT(changePrev(bool)) ); diff --git a/src/userinfodialog.cpp b/src/userinfodialog.cpp new file mode 100644 index 0000000..b9864f6 --- /dev/null +++ b/src/userinfodialog.cpp @@ -0,0 +1,123 @@ +#include "userinfodialog.h" + +#include +#include +#include +#include + +#include + +UserInfoDialog::UserInfoDialog ( QWidget* parent, const UserInfo& userInfo) + : QDialog(parent) +{ + setupUi(); + + if (userInfo.name.isEmpty()) + { + setWindowTitle( tr("Add user") ); + } + else + { + setWindowTitle( tr("Modify user") ); + + m_edUserName->setText(userInfo.name); + m_edPsw->setText(userInfo.psw); + m_edPswRep->setText(userInfo.psw); + } + + connect( m_edPsw, SIGNAL(textChanged(QString)), this, SLOT(checkPasswords()) ); + connect( m_edPswRep, SIGNAL(textChanged(QString)), this, SLOT(checkPasswords()) ); + + connect( m_butOk, SIGNAL(clicked(bool)), this, SLOT(preAccept()) ); + connect( m_butCancel, SIGNAL(clicked(bool)), this, SLOT(reject()) ); + + checkPasswords(); +} + +UserInfoDialog::~UserInfoDialog() +{ +} + +void UserInfoDialog::setupUi() +{ + m_labUserName = new QLabel( tr("User name:") ); + m_edUserName = new QLineEdit; + + QHBoxLayout* hbox_0 = new QHBoxLayout; + hbox_0->addWidget(m_labUserName); + hbox_0->addWidget(m_edUserName); + + m_labPsw = new QLabel( tr("Password") ); + m_edPsw = new QLineEdit; + m_edPsw->setEchoMode( QLineEdit::Password ); + + m_labPswRep = new QLabel( tr("Confirm Password") ); + m_edPswRep = new QLineEdit; + m_edPswRep->setEchoMode( QLineEdit::Password ); + + QGridLayout* gbox_0 = new QGridLayout; + gbox_0->setContentsMargins(0, 0, 0, 0); + gbox_0->addWidget(m_labPsw, 0, 0); + gbox_0->addWidget(m_edPsw, 0, 1); + gbox_0->addWidget(m_labPswRep, 1, 0); + gbox_0->addWidget(m_edPswRep, 1, 1); + + m_labMatch = new QLabel; + QHBoxLayout* hbox_1 = new QHBoxLayout; + hbox_1->addStretch(); + hbox_1->addWidget(m_labMatch); + + m_butOk = new QPushButton( tr("OK") ); + m_butCancel = new QPushButton( tr("Cancel") ); + + QHBoxLayout* hbox_but = new QHBoxLayout; + hbox_but->addStretch(); + hbox_but->addWidget(m_butOk); + hbox_but->addWidget(m_butCancel); + + QVBoxLayout* vbox_0 = new QVBoxLayout; + vbox_0->addLayout(hbox_0); + vbox_0->addLayout(gbox_0); + vbox_0->addLayout(hbox_1); + vbox_0->addLayout(hbox_but); + + setLayout(vbox_0); +} + +void UserInfoDialog::checkPasswords() +{ + bool pswMatch = false; + + if ( (!m_edPsw->text().isEmpty()) && (m_edPsw->text() == m_edPswRep->text()) ) + pswMatch = true; + + m_butOk->setEnabled( pswMatch ); + + QString pswState; + if ( pswMatch ) + { + pswState = tr("Passwords match"); + } + else + { + pswState = tr("Passwords do not match"); + } + m_labMatch->setText( pswState ); +} + +void UserInfoDialog::preAccept() +{ + if ( m_edUserName->text().isEmpty() ) + { + QMessageBox::critical(this, tr("Error"), tr("User name is empty") ); + m_edUserName->setFocus(); + return; + } + + m_UserInfo.name = m_edUserName->text(); + m_UserInfo.psw = m_edPsw->text(); + + accept(); +} + + diff --git a/src/userinfodialog.h b/src/userinfodialog.h new file mode 100644 index 0000000..5705105 --- /dev/null +++ b/src/userinfodialog.h @@ -0,0 +1,40 @@ +#pragma once + +#include + +#include "commons.h" + +class QLabel; +class QLineEdit; + +class UserInfoDialog: public QDialog +{ + Q_OBJECT + +public: + UserInfoDialog(QWidget* parent = 0, const UserInfo& userInfo = UserInfo() ); + ~UserInfoDialog(); + + UserInfo getUserInfo() { return m_UserInfo; } + +private slots: + void checkPasswords(); + void preAccept(); + +private: + void setupUi(); + +private: + QLabel* m_labUserName; + QLineEdit* m_edUserName; + QLabel* m_labPsw; + QLineEdit* m_edPsw; + QLabel* m_labPswRep; + QLineEdit* m_edPswRep; + QLabel* m_labMatch; + + QPushButton* m_butOk; + QPushButton* m_butCancel; + + UserInfo m_UserInfo; +}; \ No newline at end of file