@ -29,21 +29,21 @@ QWidget* layoutToWidget(QLayout* l, QWidget* parent){
// https://stackoverflow.com/questions/478898/how-do-i-execute-a-command-and-get-the-output-of-the-command-within-c-using-po
std : : string exec ( const char * cmd ) {
std : : array < char , 128 > buffer ;
std : : string result ;
std : : unique_ptr < FILE , decltype ( & pclose ) > pipe ( popen ( cmd , " r " ) , pclose ) ;
if ( ! pipe ) {
throw std : : runtime_error ( " popen() failed! " ) ;
}
while ( fgets ( buffer . data ( ) , buffer . size ( ) , pipe . get ( ) ) ! = nullptr ) {
result + = buffer . data ( ) ;
}
return result ;
std : : array < char , 128 > buffer ;
std : : string result ;
std : : unique_ptr < FILE , decltype ( & pclose ) > pipe ( popen ( cmd , " r " ) , pclose ) ;
if ( ! pipe ) {
throw std : : runtime_error ( " popen() failed! " ) ;
}
while ( fgets ( buffer . data ( ) , buffer . size ( ) , pipe . get ( ) ) ! = nullptr ) {
result + = buffer . data ( ) ;
}
return result ;
}
// Networking functions
Networking : : Networking ( QWidget * parent ) : QWidget ( parent ) {
Networking : : Networking ( QWidget * parent , bool show_advanced ) : QWidget ( parent ) {
try {
wifi = new WifiManager ( this ) ;
} catch ( std : : exception & e ) {
@ -56,25 +56,20 @@ Networking::Networking(QWidget* parent) : QWidget(parent){
return ;
}
connect ( wifi , SIGNAL ( wrongPassword ( QString ) ) , this , SLOT ( wrongPassword ( QString ) ) ) ;
connect ( wifi , SIGNAL ( successfulConnection ( QString ) ) , this , SLOT ( successfulConnection ( QString ) ) ) ;
s = new QStackedLayout ;
inputField = new InputField ( this , 8 ) ;
connect ( inputField , SIGNAL ( emitText ( QString ) ) , this , SLOT ( receiveText ( QString ) ) ) ;
connect ( inputField , SIGNAL ( cancel ( ) ) , this , SLOT ( abortTextInput ( ) ) ) ;
inputField - > setContentsMargins ( 100 , 0 , 100 , 0 ) ;
s - > addWidget ( inputField ) ;
QVBoxLayout * vlayout = new QVBoxLayout ;
QPushButton * advancedSettings = new QPushButton ( " Advanced " ) ;
advancedSettings - > setStyleSheet ( R " (margin-right: 30px) " ) ;
advancedSettings - > setFixedSize ( 300 , 100 ) ;
connect ( advancedSettings , & QPushButton : : released , [ = ] ( ) { s - > setCurrentIndex ( 2 ) ; } ) ;
vlayout - > addSpacing ( 10 ) ;
vlayout - > addWidget ( advancedSettings , 0 , Qt : : AlignRight ) ;
vlayout - > addSpacing ( 10 ) ;
if ( show_advanced ) {
QPushButton * advancedSettings = new QPushButton ( " Advanced " ) ;
advancedSettings - > setStyleSheet ( R " (margin-right: 30px) " ) ;
advancedSettings - > setFixedSize ( 300 , 100 ) ;
connect ( advancedSettings , & QPushButton : : released , [ = ] ( ) { s - > setCurrentIndex ( 1 ) ; } ) ;
vlayout - > addSpacing ( 10 ) ;
vlayout - > addWidget ( advancedSettings , 0 , Qt : : AlignRight ) ;
vlayout - > addSpacing ( 10 ) ;
}
wifiWidget = new WifiUI ( 0 , 5 , wifi ) ;
connect ( wifiWidget , SIGNAL ( connectToNetwork ( Network ) ) , this , SLOT ( connectToNetwork ( Network ) ) ) ;
@ -83,13 +78,9 @@ Networking::Networking(QWidget* parent) : QWidget(parent){
s - > addWidget ( layoutToWidget ( vlayout , this ) ) ;
an = new AdvancedNetworking ( this , wifi ) ;
connect ( an , & AdvancedNetworking : : backPress , [ = ] ( ) { s - > setCurrentIndex ( 1 ) ; } ) ;
connect ( an , & AdvancedNetworking : : openKeyboard , [ = ] ( ) { emit openKeyboard ( ) ; } ) ;
connect ( an , & AdvancedNetworking : : closeKeyboard , [ = ] ( ) { emit closeKeyboard ( ) ; } ) ;
connect ( an , & AdvancedNetworking : : backPress , [ = ] ( ) { s - > setCurrentIndex ( 0 ) ; } ) ;
s - > addWidget ( an ) ;
s - > setCurrentIndex ( 1 ) ;
// Update network status
QTimer * timer = new QTimer ( this ) ;
QObject : : connect ( timer , SIGNAL ( timeout ( ) ) , this , SLOT ( refresh ( ) ) ) ;
@ -100,7 +91,8 @@ Networking::Networking(QWidget* parent) : QWidget(parent){
font - size : 50 px ;
margin : 0 px ;
padding : 15 px ;
border - radius : 25 px ;
border - width : 0 ;
border - radius : 7 px ;
color : # dddddd ;
background - color : # 444444 ;
}
@ -124,39 +116,14 @@ void Networking::connectToNetwork(Network n) {
if ( n . security_type = = SecurityType : : OPEN ) {
wifi - > connect ( n ) ;
} else if ( n . security_type = = SecurityType : : WPA ) {
inputField - > setPromptText ( " Enter password for \" " + n . ssid + " \" " ) ;
s - > setCurrentIndex ( 0 ) ;
selectedNetwork = n ;
emit openKeyboard ( ) ;
QString pass = InputDialog : : getText ( " Enter password for \" " + n . ssid + " \" " ) ;
wifi - > connect ( n , pass ) ;
}
}
void Networking : : abortTextInput ( ) {
s - > setCurrentIndex ( 1 ) ;
emit closeKeyboard ( ) ;
}
void Networking : : receiveText ( QString text ) {
wifi - > disconnect ( ) ;
wifi - > connect ( selectedNetwork , text ) ;
s - > setCurrentIndex ( 1 ) ;
emit closeKeyboard ( ) ;
}
void Networking : : wrongPassword ( QString ssid ) {
if ( s - > currentIndex ( ) = = 0 ) {
qDebug ( ) < < " Wrong password, but we are already trying a new network " ;
return ;
}
if ( s - > currentIndex ( ) = = 2 ) {
qDebug ( ) < < " Wrong password, but we are in advanced settings " ;
return ;
}
if ( ! this - > isVisible ( ) ) {
qDebug ( ) < < " Wrong password, but we are not visible " ;
return ;
}
return ; // TODO: add this back
/*
for ( Network n : wifi - > seen_networks ) {
if ( n . ssid = = ssid ) {
inputField - > setPromptText ( " Wrong password for \" " + n . ssid + " \" " ) ;
@ -165,20 +132,7 @@ void Networking::wrongPassword(QString ssid) {
return ;
}
}
}
void Networking : : successfulConnection ( QString ssid ) {
//Maybe we will want to do something here in the future.
}
void Networking : : sidebarChange ( ) {
if ( s = = nullptr | | an = = nullptr ) {
return ;
}
s - > setCurrentIndex ( 1 ) ;
an - > s - > setCurrentIndex ( 1 ) ;
refresh ( ) ;
*/
}
QFrame * hline ( QWidget * parent = 0 ) {
@ -192,24 +146,19 @@ QFrame* hline(QWidget* parent = 0){
// AdvancedNetworking functions
AdvancedNetworking : : AdvancedNetworking ( QWidget * parent , WifiManager * wifi ) : QWidget ( parent ) , wifi ( wifi ) {
s = new QStackedLayout ; // inputField, mainPage, SSH settings
inputField = new InputField ( this , 8 ) ;
connect ( inputField , SIGNAL ( emitText ( QString ) ) , this , SLOT ( receiveText ( QString ) ) ) ;
connect ( inputField , SIGNAL ( cancel ( ) ) , this , SLOT ( abortTextInput ( ) ) ) ;
inputField - > setContentsMargins ( 100 , 0 , 100 , 0 ) ;
s - > addWidget ( inputField ) ;
s = new QStackedLayout ; // mainPage, SSH settings
QVBoxLayout * vlayout = new QVBoxLayout ;
//Back button
// Back button
QHBoxLayout * backLayout = new QHBoxLayout ;
QPushButton * back = new QPushButton ( " BACK " ) ;
QPushButton * back = new QPushButton ( " Back " ) ;
back - > setFixedSize ( 500 , 100 ) ;
connect ( back , & QPushButton : : released , [ = ] ( ) { emit backPress ( ) ; } ) ;
backLayout - > addWidget ( back , 0 , Qt : : AlignLeft ) ;
vlayout - > addWidget ( layoutToWidget ( backLayout , this ) , 0 , Qt : : AlignLeft ) ;
//Enable tethering layout
// Enable tethering layout
QHBoxLayout * tetheringToggleLayout = new QHBoxLayout ;
tetheringToggleLayout - > addWidget ( new QLabel ( " Enable tethering " ) ) ;
Toggle * toggle_switch = new Toggle ;
@ -223,17 +172,22 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
vlayout - > addWidget ( layoutToWidget ( tetheringToggleLayout , this ) , 0 ) ;
vlayout - > addWidget ( hline ( ) , 0 ) ;
//Change tethering password
// Change tethering password
QHBoxLayout * tetheringPassword = new QHBoxLayout ;
tetheringPassword - > addWidget ( new QLabel ( " Edit tethering password " ) , 1 ) ;
editPasswordButton = new QPushButton ( " EDIT " ) ;
editPasswordButton - > setFixedWidth ( 500 ) ;
connect ( editPasswordButton , & QPushButton : : released , [ = ] ( ) { inputField - > setPromptText ( " Enter the new hotspot password " ) ; s - > setCurrentIndex ( 0 ) ; emit openKeyboard ( ) ; } ) ;
connect ( editPasswordButton , & QPushButton : : released , [ = ] ( ) {
QString pass = InputDialog : : getText ( " Enter new tethering password " ) ;
if ( pass . size ( ) ) {
wifi - > changeTetheringPassword ( pass ) ;
}
} ) ;
tetheringPassword - > addWidget ( editPasswordButton , 1 , Qt : : AlignRight ) ;
vlayout - > addWidget ( layoutToWidget ( tetheringPassword , this ) , 0 ) ;
vlayout - > addWidget ( hline ( ) , 0 ) ;
//IP adress
// IP adress
QHBoxLayout * IPlayout = new QHBoxLayout ;
IPlayout - > addWidget ( new QLabel ( " IP address " ) , 0 ) ;
ipLabel = new QLabel ( wifi - > ipv4_address ) ;
@ -242,7 +196,7 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
vlayout - > addWidget ( layoutToWidget ( IPlayout , this ) , 0 ) ;
vlayout - > addWidget ( hline ( ) , 0 ) ;
//Enable SSH
// Enable SSH
QHBoxLayout * enableSSHLayout = new QHBoxLayout ( this ) ;
enableSSHLayout - > addWidget ( new QLabel ( " Enable SSH " , this ) ) ;
toggle_switch_SSH = new Toggle ( this ) ;
@ -255,12 +209,12 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
vlayout - > addWidget ( layoutToWidget ( enableSSHLayout , this ) ) ;
vlayout - > addWidget ( hline ( ) , 0 ) ;
//Authorized SSH keys
// SSH keys
QHBoxLayout * authSSHLayout = new QHBoxLayout ( this ) ;
authSSHLayout - > addWidget ( new QLabel ( " Authorized SSH keys" , this ) ) ;
authSSHLayout - > addWidget ( new QLabel ( " SSH keys " , this ) ) ;
QPushButton * editAuthSSHButton = new QPushButton ( " EDIT " , this ) ;
editAuthSSHButton - > setFixedWidth ( 500 ) ;
connect ( editAuthSSHButton , & QPushButton : : released , [ = ] ( ) { s - > setCurrentIndex ( 2 ) ; } ) ;
connect ( editAuthSSHButton , & QPushButton : : released , [ = ] ( ) { s - > setCurrentWidget ( ssh ) ; } ) ;
authSSHLayout - > addWidget ( editAuthSSHButton ) ;
vlayout - > addWidget ( layoutToWidget ( authSSHLayout , this ) ) ;
vlayout - > addSpacing ( 50 ) ;
@ -273,14 +227,13 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
// dangerZone->addWidget(deleteAll);
// vlayout->addWidget(layoutToWidget(dangerZone, this));
//vlayout to widget
// vlayout to widget
QWidget * settingsWidget = layoutToWidget ( vlayout , this ) ;
settingsWidget - > setStyleSheet ( " margin-left: 40px; margin-right: 40px; " ) ;
s - > addWidget ( settingsWidget ) ;
s - > setCurrentIndex ( 1 ) ;
ssh = new SSH ;
connect ( ssh , & SSH : : closeSSHSettings , [ = ] ( ) { s - > setCurrentIndex ( 1 ) ; } ) ;
connect ( ssh , & SSH : : closeSSHSettings , [ = ] ( ) { s - > setCurrentIndex ( 0 ) ; } ) ;
s - > addWidget ( ssh ) ;
setLayout ( s ) ;
@ -300,7 +253,7 @@ void AdvancedNetworking::refresh(){
if ( toggle_switch_SSH - > on ! = isSSHEnabled ( ) ) {
toggle_switch_SSH - > togglePosition ( ) ;
}
//Qt can be lazy
// Qt can be lazy
repaint ( ) ;
}
@ -334,16 +287,6 @@ void AdvancedNetworking::toggleSSH(int enable) {
}
}
void AdvancedNetworking : : receiveText ( QString text ) {
wifi - > changeTetheringPassword ( text ) ;
s - > setCurrentIndex ( 1 ) ;
emit closeKeyboard ( ) ;
}
void AdvancedNetworking : : abortTextInput ( ) {
s - > setCurrentIndex ( 1 ) ;
emit closeKeyboard ( ) ;
}
// WifiUI functions
@ -370,7 +313,6 @@ void WifiUI::refresh() {
int i = 0 ;
int countWidgets = 0 ;
int button_height = static_cast < int > ( this - > height ( ) / ( networks_per_page + 1 ) * 0.6 ) ;
for ( Network & network : wifi - > seen_networks ) {
QHBoxLayout * hlayout = new QHBoxLayout ;
if ( page * networks_per_page < = i & & i < ( page + 1 ) * networks_per_page ) {
@ -380,30 +322,30 @@ void WifiUI::refresh() {
if ( ssid . length ( ) > 30 ) {
ssid = ssid . left ( 30 ) + " … " ;
}
hlayout - > addWidget ( new QLabel ( ssid ) ) ;
QLabel * ssid_label = new QLabel ( ssid ) ;
ssid_label - > setStyleSheet ( R " (
font - size : 55 px ;
) " );
hlayout - > addWidget ( ssid_label ) ;
// TODO: don't use images for this
// strength indicator
unsigned int strength_scale = network . strength / 17 ;
QPixmap pix ( " ../assets/images/network_ " + QString : : number ( strength_scale ) + " .png " ) ;
QLabel * icon = new QLabel ( ) ;
icon - > setPixmap ( pix . scaledToWidth ( 100 , Qt : : SmoothTransformation ) ) ;
icon - > setSizePolicy ( QSizePolicy ( QSizePolicy : : Fixed , QSizePolicy : : Fixed ) ) ;
hlayout - > addWidget ( icon ) ;
hlayout - > addSpacing ( 20 ) ;
hlayout - > addWidget ( icon , 0 , Qt : : AlignRight ) ;
// connect button
QPushButton * btn = new QPushButton ( network . security_type = = SecurityType : : UNSUPPORTED ? " Unsupported " : ( network . connected = = ConnectedType : : CONNECTED ? " Connected " : ( network . connected = = ConnectedType : : CONNECTING ? " Connecting " : " Connect " ) ) ) ;
btn - > setFixedWidth ( 400 ) ;
btn - > setFixedHeight ( button_height ) ;
btn - > setDisabled ( network . connected = = ConnectedType : : CONNECTED | | network . connected = = ConnectedType : : CONNECTING | | network . security_type = = SecurityType : : UNSUPPORTED ) ;
hlayout - > addWidget ( btn ) ;
hlayout - > addSpacing ( 20 ) ;
btn - > setFixedWidth ( 350 ) ;
hlayout - > addWidget ( btn , 0 , Qt : : AlignRight ) ;
connectButtons - > addButton ( btn , i ) ;
QWidget * w = new QWidget ;
w - > setLayout ( hlayout ) ;
vlayout - > addWidget ( w , 1 ) ;
vlayout - > addLayout ( hlayout , 1 ) ;
// Don't add the last horizontal line
if ( page * networks_per_page < = i + 1 & & i + 1 < ( page + 1 ) * networks_per_page & & i + 1 < wifi - > seen_networks . size ( ) ) {
vlayout - > addWidget ( hline ( ) , 0 ) ;
@ -412,34 +354,23 @@ void WifiUI::refresh() {
}
i + + ;
}
vlayout - > addStretch ( 3 ) ;
// Pad vlayout to prevert oversized network widgets in case of low visible network count
for ( int i = countWidgets ; i < networks_per_page ; i + + ) {
QWidget * w = new QWidget ;
// That we need to add w twice was determined empiricaly
vlayout - > addWidget ( w , 1 ) ;
vlayout - > addWidget ( w , 1 ) ;
}
QHBoxLayout * prev_next_buttons = new QHBoxLayout ; //Adding constructor exposes the qt bug
// Setup buttons for pagination
QHBoxLayout * prev_next_buttons = new QHBoxLayout ;
QPushButton * prev = new QPushButton ( " Previous " ) ;
prev - > setEnabled ( page ) ;
prev - > setFixedSize ( 400 , button_height ) ;
QObject : : connect ( prev , SIGNAL ( released ( ) ) , this , SLOT ( prevPage ( ) ) ) ;
prev_next_buttons - > addWidget ( prev ) ;
QPushButton * next = new QPushButton ( " Next " ) ;
next - > setFixedSize ( 400 , button_height ) ;
// If there are more visible networks then we can show, enable going to next page
next - > setEnabled ( wifi - > seen_networks . size ( ) > ( page + 1 ) * networks_per_page ) ;
QObject : : connect ( prev , SIGNAL ( released ( ) ) , this , SLOT ( prevPage ( ) ) ) ;
QObject : : connect ( next , SIGNAL ( released ( ) ) , this , SLOT ( nextPage ( ) ) ) ;
prev_next_buttons - > addWidget ( prev ) ;
prev_next_buttons - > addWidget ( next ) ;
QWidget * w = new QWidget ;
w - > setLayout ( prev_next_buttons ) ;
vlayout - > addWidget ( w , 1 , Qt : : AlignBottom ) ;
vlayout - > addLayout ( prev_next_buttons , 2 ) ;
}
void WifiUI : : handleButton ( QAbstractButton * button ) {
@ -452,6 +383,7 @@ void WifiUI::prevPage() {
page - - ;
refresh ( ) ;
}
void WifiUI : : nextPage ( ) {
page + + ;
refresh ( ) ;