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