aboutsummaryrefslogtreecommitdiff
path: root/src/Slit.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/Slit.cc')
-rw-r--r--src/Slit.cc68
1 files changed, 55 insertions, 13 deletions
diff --git a/src/Slit.cc b/src/Slit.cc
index 4134075..8a09e6c 100644
--- a/src/Slit.cc
+++ b/src/Slit.cc
@@ -56,6 +56,7 @@
56#include "SlitClient.hh" 56#include "SlitClient.hh"
57#include "Xutil.hh" 57#include "Xutil.hh"
58#include "FbAtoms.hh" 58#include "FbAtoms.hh"
59#include "FbTk/MenuSeparator.hh"
59#include "FbTk/StringUtil.hh" 60#include "FbTk/StringUtil.hh"
60#include "FbTk/I18n.hh" 61#include "FbTk/I18n.hh"
61 62
@@ -161,14 +162,13 @@ string FbTk::Resource<Slit::Direction>::getString() {
161 162
162namespace { 163namespace {
163 164
164class SlitClientMenuItem: public FbTk::MenuItem { 165class SlitClientMenuItem: public FbTk::MenuItem{
165public: 166public:
166 explicit SlitClientMenuItem(SlitClient &client, FbTk::RefCount<FbTk::Command> &cmd): 167 explicit SlitClientMenuItem(Slit& slit, SlitClient &client, FbTk::RefCount<FbTk::Command> &cmd):
167 FbTk::MenuItem(client.matchName().c_str(), cmd), m_client(client) { 168 FbTk::MenuItem(client.matchName().c_str(), cmd), m_slit(slit), m_client(client) {
169 setCommand(cmd);
168 FbTk::MenuItem::setSelected(client.visible()); 170 FbTk::MenuItem::setSelected(client.visible());
169 // save resources as default click action 171 setToggleItem(true);
170 FbTk::RefCount<FbTk::Command> save_rc(new FbCommands::SaveResources());
171 setCommand(save_rc);
172 } 172 }
173 const std::string &label() const { 173 const std::string &label() const {
174 return m_client.matchName(); 174 return m_client.matchName();
@@ -176,11 +176,19 @@ public:
176 bool isSelected() const { 176 bool isSelected() const {
177 return m_client.visible(); 177 return m_client.visible();
178 } 178 }
179 void click(int button, int time) { 179 void click(int button, int time) {
180 m_client.setVisible(!m_client.visible()); 180 if (button == 4) { // wheel up
181 FbTk::MenuItem::click(button, time); 181 m_slit.clientUp(&m_client);
182 } else if (button == 5) { // wheel down
183 m_slit.clientDown(&m_client);
184 } else {
185 m_client.setVisible(!m_client.visible());
186 FbTk::MenuItem::setSelected(m_client.visible());
187 FbTk::MenuItem::click(button, time);
188 }
182 } 189 }
183private: 190private:
191 Slit& m_slit;
184 SlitClient &m_client; 192 SlitClient &m_client;
185}; 193};
186 194
@@ -898,6 +906,35 @@ void Slit::shutdown() {
898 removeClient(m_client_list.front(), true, true); 906 removeClient(m_client_list.front(), true, true);
899} 907}
900 908
909void Slit::clientUp(SlitClient* client) {
910 if (!client || m_client_list.size() < 2)
911 return;
912
913 SlitClients::iterator it = m_client_list.begin();
914
915 for(it++; it != m_client_list.end(); it++) {
916 if ((*it) == client) {
917 swap(*it, *(it--));
918 reconfigure();
919 break;
920 }
921 }
922}
923
924void Slit::clientDown(SlitClient* client) {
925 if (!client || m_client_list.size() < 2)
926 return;
927
928 SlitClients::reverse_iterator it = m_client_list.rbegin();
929 for(it++; it != m_client_list.rend(); it++) {
930 if ((*it) == client) {
931 swap(*it, *(it--));
932 reconfigure();
933 break;
934 }
935 }
936}
937
901void Slit::cycleClientsUp() { 938void Slit::cycleClientsUp() {
902 if (m_client_list.size() < 2) 939 if (m_client_list.size() < 2)
903 return; 940 return;
@@ -1108,17 +1145,22 @@ void Slit::updateClientmenu() {
1108 m_clientlist_menu.insert(_FBTEXT(Slit, CycleUp, "Cycle Up", "Cycle clients upwards"), cycle_up); 1145 m_clientlist_menu.insert(_FBTEXT(Slit, CycleUp, "Cycle Up", "Cycle clients upwards"), cycle_up);
1109 m_clientlist_menu.insert(_FBTEXT(Slit, CycleDown, "Cycle Down", "Cycle clients downwards"), cycle_down); 1146 m_clientlist_menu.insert(_FBTEXT(Slit, CycleDown, "Cycle Down", "Cycle clients downwards"), cycle_down);
1110 1147
1111 FbTk::MenuItem *separator = new FbTk::MenuItem("---"); 1148 m_clientlist_menu.insert(new FbTk::MenuSeparator());
1112 separator->setEnabled(false);
1113 m_clientlist_menu.insert(separator);
1114 1149
1115 FbTk::RefCount<FbTk::Command> reconfig(new FbTk::SimpleCommand<Slit>(*this, &Slit::reconfigure)); 1150 FbTk::RefCount<FbTk::Command> reconfig(new FbTk::SimpleCommand<Slit>(*this, &Slit::reconfigure));
1116 SlitClients::iterator it = m_client_list.begin(); 1151 SlitClients::iterator it = m_client_list.begin();
1117 for (; it != m_client_list.end(); ++it) { 1152 for (; it != m_client_list.end(); ++it) {
1118 if ((*it) != 0 && (*it)->window() != 0) 1153 if ((*it) != 0 && (*it)->window() != 0)
1119 m_clientlist_menu.insert(new SlitClientMenuItem(*(*it), reconfig)); 1154 m_clientlist_menu.insert(new SlitClientMenuItem(*this, *(*it), reconfig));
1120 } 1155 }
1121 1156
1157 m_clientlist_menu.insert(new FbTk::MenuSeparator());
1158 FbTk::RefCount<FbTk::Command> savecmd(new FbTk::SimpleCommand<Slit>(*this, &Slit::saveClientList));
1159 m_clientlist_menu.insert(_FBTEXT(Slit,
1160 SaveSlitList,
1161 "Save SlitList", "Saves the current order in the slit"),
1162 savecmd);
1163
1122 m_clientlist_menu.update(); 1164 m_clientlist_menu.update();
1123} 1165}
1124 1166