1 //===========================================
2 //  Lumina-DE source code
3 //  Copyright (c) 2014, Ken Moore
4 //  Available under the 3-clause BSD license
5 //  See the LICENSE file for full details
6 //===========================================
7 #include "SysMenuQuick.h"
8 #include "ui_SysMenuQuick.h"
9 
10 #include "../../LSession.h"
11 #include <LuminaX11.h>
12 
LSysMenuQuick(QWidget * parent)13 LSysMenuQuick::LSysMenuQuick(QWidget *parent) : QWidget(parent), ui(new Ui::LSysMenuQuick){
14   ui->setupUi(this);
15   brighttimer = new QTimer(this);
16     brighttimer->setSingleShot(true);
17     brighttimer->setInterval(50); //50ms delay in setting the new value
18   //Now reset the initial saved settings (this is handles by the LOS/session now - 4/22/15)
19   firstrun = true;
20   UpdateMenu(); //do this once before all the signals/slots are connected below
21   firstrun = false;
22   //Now setup the connections
23   connect(ui->slider_volume, SIGNAL(valueChanged(int)), this, SLOT(volSliderChanged()) );
24   connect(ui->slider_brightness, SIGNAL(valueChanged(int)), this, SLOT(brightSliderChanged()) );
25   connect(ui->tool_wk_prev, SIGNAL(clicked()), this, SLOT(prevWorkspace()) );
26   connect(ui->tool_wk_next, SIGNAL(clicked()), this, SLOT(nextWorkspace()) );
27   connect(ui->tool_logout, SIGNAL(clicked()), this, SLOT(startLogout()) );
28   connect(ui->tool_vol_mixer, SIGNAL(clicked()), this, SLOT(startMixer()) );
29   connect(brighttimer, SIGNAL(timeout()), this, SLOT(setCurrentBrightness()) );
30   connect(ui->combo_locale, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLocale()) );
31   //And setup the default icons
32   ui->label_bright_icon->setPixmap( LXDG::findIcon("redshift","preferences-desktop-brightness").pixmap(ui->label_bright_icon->maximumSize()) );
33   ui->tool_wk_prev->setIcon( LXDG::findIcon("go-previous-view",""));
34   ui->tool_wk_next->setIcon( LXDG::findIcon("go-next-view","") );
35   ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") );
36 }
37 
~LSysMenuQuick()38 LSysMenuQuick::~LSysMenuQuick(){
39 
40 }
41 
UpdateMenu()42 void LSysMenuQuick::UpdateMenu(){
43   ui->retranslateUi(this);
44   //Audio Volume
45   int val = LOS::audioVolume();
46   QIcon ico;
47   if(val > 66){ ico= LXDG::findIcon("audio-volume-high",""); }
48   else if(val > 33){ ico= LXDG::findIcon("audio-volume-medium",""); }
49   else if(val > 0){ ico= LXDG::findIcon("audio-volume-low",""); }
50   else{ ico= LXDG::findIcon("audio-volume-muted",""); }
51   bool hasMixer = LOS::hasMixerUtility();
52   ui->label_vol_icon->setVisible(!hasMixer);
53   ui->tool_vol_mixer->setVisible(hasMixer);
54   if(!hasMixer){ ui->label_vol_icon->setPixmap( ico.pixmap(ui->label_vol_icon->maximumSize()) ); }
55   else{ ui->tool_vol_mixer->setIcon(ico); }
56   QString txt = QString::number(val)+"%";
57   if(val<100){ txt.prepend(" "); } //make sure no widget resizing
58   ui->label_vol_text->setText(txt);
59   if(ui->slider_volume->value()!= val){ ui->slider_volume->setValue(val); }
60   //Screen Brightness
61   val = LOS::ScreenBrightness();
62   if(val < 0){
63     //No brightness control - hide it
64     ui->group_brightness->setVisible(false);
65   }else{
66     ui->group_brightness->setVisible(true);
67     txt = QString::number(val)+"%";
68     if(val<100){ txt.prepend(" "); } //make sure no widget resizing
69     ui->label_bright_text->setText(txt);
70     if(ui->slider_brightness->value()!=val){ ui->slider_brightness->setValue(val); }
71   }
72 
73   //Do any one-time checks
74   if(firstrun){
75     hasBat = LOS::hasBattery(); //No need to check this more than once - will not change in the middle of a session
76     //Current Locale
77     QStringList locales = LUtils::knownLocales();
78     ui->combo_locale->clear();
79     QLocale curr;
80     for(int i=0; i<locales.length(); i++){
81       QLocale loc( (locales[i]=="pt") ? "pt_PT" : locales[i] );
82       ui->combo_locale->addItem(loc.nativeLanguageName()+" ("+locales[i]+")", locales[i]); //Make the display text prettier later
83       if(locales[i] == curr.name() || locales[i] == curr.name().section("_",0,0) ){
84         //Current Locale
85 	ui->combo_locale->setCurrentIndex(ui->combo_locale->count()-1); //the last item in the list right now
86       }
87     }
88     ui->group_locale->setVisible(locales.length() > 1);
89   }
90 
91   //Battery Status
92   if(hasBat){
93     ui->group_battery->setVisible(true);
94     val = LOS::batteryCharge();
95     if(LOS::batteryIsCharging()){
96       if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-low","").pixmap(ui->label_bat_icon->maximumSize()) ); }
97       else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); }
98       else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-040","").pixmap(ui->label_bat_icon->maximumSize()) ); }
99       else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-060","").pixmap(ui->label_bat_icon->maximumSize()) ); }
100       else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging-080","").pixmap(ui->label_bat_icon->maximumSize()) ); }
101       else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-charging","").pixmap(ui->label_bat_icon->maximumSize()) ); }
102       ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), tr("connected")) );
103     }else{
104       if(val < 1){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-missing","").pixmap(ui->label_bat_icon->maximumSize()) ); }
105       else if(val < 15){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-low","").pixmap(ui->label_bat_icon->maximumSize()) ); }
106       else if(val < 30){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-caution","").pixmap(ui->label_bat_icon->maximumSize()) ); }
107       else if(val < 50){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-040","").pixmap(ui->label_bat_icon->maximumSize()) ); }
108       else if(val < 70){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-060","").pixmap(ui->label_bat_icon->maximumSize()) ); }
109       else if(val < 90){ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-080","").pixmap(ui->label_bat_icon->maximumSize()) ); }
110       else{ ui->label_bat_icon->setPixmap( LXDG::findIcon("battery-100","").pixmap(ui->label_bat_icon->maximumSize()) ); }
111       ui->label_bat_text->setText( QString("%1%\n(%2)").arg(QString::number(val), getRemainingTime()) );
112     }
113   }else{
114     ui->group_battery->setVisible(false);
115   }
116   //Workspace
117   val = LSession::handle()->XCB->CurrentWorkspace();
118   int tot = LSession::handle()->XCB->NumberOfWorkspaces();
119   ui->group_workspace->setVisible(val>=0 && tot>1);
120   ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(val+1), QString::number(tot)) );
121 }
122 
volSliderChanged()123 void LSysMenuQuick::volSliderChanged(){
124   int val = ui->slider_volume->value();
125   LOS::setAudioVolume(val);
126   QString txt = QString::number(val)+"%";
127   if(val<100){ txt.prepend(" "); } //make sure no widget resizing
128   ui->label_vol_text->setText( txt );
129   if(val > 66){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-high","").pixmap(ui->label_vol_icon->maximumSize()) ); }
130   else if(val > 33){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-medium","").pixmap(ui->label_vol_icon->maximumSize()) ); }
131   else if(val > 0){ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-low","").pixmap(ui->label_vol_icon->maximumSize()) ); }
132   else{ ui->label_vol_icon->setPixmap( LXDG::findIcon("audio-volume-muted","").pixmap(ui->label_vol_icon->maximumSize()) ); }
133 }
134 
startMixer()135 void LSysMenuQuick::startMixer(){
136   emit CloseMenu();
137   LOS::startMixerUtility();
138 }
139 
brightSliderChanged()140 void LSysMenuQuick::brightSliderChanged(){
141   //Brightness controls cannot operate extremely quickly - combine calls as necessary
142   if(brighttimer->isActive()){ brighttimer->stop(); }
143   brighttimer->start();
144   // *DO* update the label right away
145   int val = ui->slider_brightness->value();
146   QString txt = QString::number(val)+"%";
147   if(val<100){ txt.prepend(" "); } //make sure no widget resizing
148   ui->label_bright_text->setText( txt );
149 }
150 
setCurrentBrightness()151 void LSysMenuQuick::setCurrentBrightness(){
152   int val = ui->slider_brightness->value();
153   LOS::setScreenBrightness(val);
154   QString txt = QString::number(val)+"%";
155   if(val<100){ txt.prepend(" "); } //make sure no widget resizing
156   ui->label_bright_text->setText( txt );
157 }
158 
nextWorkspace()159 void LSysMenuQuick::nextWorkspace(){
160   int cur = LSession::handle()->XCB->CurrentWorkspace();
161   int tot = LSession::handle()->XCB->NumberOfWorkspaces();
162   //qDebug()<< "Next Workspace:" << cur << tot;
163   cur++;
164   if(cur>=tot){ cur = 0; } //back to beginning
165   //qDebug() << " - New Current:" << cur;
166   LSession::handle()->XCB->SetCurrentWorkspace(cur);
167 ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) );
168 }
169 
prevWorkspace()170 void LSysMenuQuick::prevWorkspace(){
171   int cur = LSession::handle()->XCB->CurrentWorkspace();
172   int tot = LSession::handle()->XCB->NumberOfWorkspaces();
173   cur--;
174   if(cur<0){ cur = tot-1; } //back to last
175   LSession::handle()->XCB->SetCurrentWorkspace(cur);
176   ui->label_wk_text->setText( QString(tr("%1 of %2")).arg(QString::number(cur+1), QString::number(tot)) );
177 }
178 
getRemainingTime()179 QString LSysMenuQuick::getRemainingTime(){
180   int secs = LOS::batterySecondsLeft();
181   if(secs < 0){ return "??"; }
182   QString rem; //remaining
183   if(secs > 3600){
184     int hours = secs/3600;
185     rem.append( QString::number(hours)+"h ");
186     secs = secs - (hours*3600);
187   }
188   if(secs > 60){
189     int min = secs/60;
190     rem.append( QString::number(min)+"m ");
191     secs = secs - (min*60);
192   }
193   if(secs > 0){
194     rem.append( QString::number(secs)+"s");
195   }else{
196     rem.append( "0s" );
197   }
198   return rem;
199 }
200 
startLogout()201 void LSysMenuQuick::startLogout(){
202   emit CloseMenu();
203   LSession::handle()->systemWindow();
204 }
205 
changeLocale()206 void LSysMenuQuick::changeLocale(){
207   //Get the currently selected Locale
208   QString locale = ui->combo_locale->currentData().toString();
209   emit CloseMenu();
210   LSession::handle()->switchLocale(locale);
211 }
212