├── .gitignore ├── CMakeLists.txt ├── LICENSE ├── README.md ├── install-global.sh ├── install-local.sh ├── metadata.desktop.template ├── nowdockplasmoid ├── contents │ ├── code │ │ ├── activitiesTools.js │ │ ├── layout.js │ │ └── tools.js │ ├── config │ │ ├── config.qml │ │ └── main.xml │ ├── images │ │ └── panel-west.png │ └── ui │ │ ├── CircleText.qml │ │ ├── ConfigAppearance.qml │ │ ├── ConfigInteraction.qml │ │ ├── ConfigPanel.qml │ │ ├── ContextMenu.qml │ │ ├── GlowPoint.qml │ │ ├── MouseHandler.qml │ │ ├── TaskActiveItem.qml │ │ ├── TaskDelegate.qml │ │ ├── TaskGroupItem.qml │ │ ├── TaskIconBuffers.qml │ │ ├── TaskIconItem.qml │ │ ├── TaskProgressOverlay.qml │ │ ├── TaskWindows.qml │ │ ├── ToolTipDelegate.qml │ │ ├── ToolTipWindowMouseArea.qml │ │ ├── VisualAddItem.qml │ │ └── main.qml └── metadata.desktop ├── po ├── Messages.sh ├── el.po ├── pl.po ├── plasma_applet_org.kde.store.nowdock.plasmoid.pot ├── update-metadata.sh └── zh_TW.po ├── uninstall-global.sh └── uninstall-local.sh /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | .* 3 | !.gitignore 4 | build 5 | *.kdev4 6 | 7 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | project(nowdockpanel) 2 | cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) 3 | 4 | find_package(ECM 0.0.11 REQUIRED NO_MODULE) 5 | 6 | set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR}) 7 | find_package(KF5Plasma) 8 | 9 | plasma_install_package(nowdockplasmoid org.kde.store.nowdock.plasmoid) 10 | 11 | FIND_PROGRAM(GETTEXT_MSGFMT_EXECUTABLE msgfmt) 12 | 13 | IF(NOT GETTEXT_MSGFMT_EXECUTABLE) 14 | MESSAGE( 15 | "------ 16 | NOTE: msgfmt not found. Translations will *not* be installed 17 | ------") 18 | ELSE(NOT GETTEXT_MSGFMT_EXECUTABLE) 19 | 20 | SET(catalogname plasma_applet_org.kde.store.nowdock.plasmoid) 21 | 22 | ADD_CUSTOM_TARGET(translations ALL) 23 | 24 | FILE(GLOB PO_FILES po/*.po) 25 | 26 | FOREACH(_poFile ${PO_FILES}) 27 | GET_FILENAME_COMPONENT(_poFileName ${_poFile} NAME) 28 | STRING(REGEX REPLACE "^${catalogname}_?" "" _langCode ${_poFileName} ) 29 | STRING(REGEX REPLACE "\\.po$" "" _langCode ${_langCode} ) 30 | 31 | IF( _langCode ) 32 | GET_FILENAME_COMPONENT(_lang ${_poFile} NAME_WE) 33 | SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) 34 | 35 | ADD_CUSTOM_COMMAND(TARGET translations 36 | COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --check -o ${_gmoFile} ${_poFile} 37 | DEPENDS ${_poFile}) 38 | INSTALL(FILES ${_gmoFile} DESTINATION ${LOCALE_INSTALL_DIR}/${_langCode}/LC_MESSAGES/ RENAME ${catalogname}.mo) 39 | ENDIF( _langCode ) 40 | 41 | ENDFOREACH(_poFile ${PO_FILES}) 42 | 43 | ENDIF(NOT GETTEXT_MSGFMT_EXECUTABLE) 44 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #### DEPRECATED: Now Dock is no longer maintained. Future development is focused on [Latte Dock](https://github.com/psifidotos/Latte-Dock), a merge of Now Dock and [Candil-Dock](https://github.com/audoban/Candil-Dock) projects. Feel free to join us in this new journey! 2 | 3 | ------------- 4 | 5 | About 6 | ===== 7 | This is a plasmoid for Plasma 5 which is trying to implement a 8 | mac style effect for tasks 9 | 10 | Installation 11 | ============ 12 | ####(no translations)#### 13 | 14 | 1. Right click on Plasma Desktop -> Unlock Widgets 15 | 2. Right click on Plasma Desktop -> Add Widgets 16 | 3. Download New Widgets 17 | 4. Search for "Now Dock Plasmoid" 18 | 5. Install 19 | 20 | Manual Installation 21 | ============ 22 | 23 | ####(no translations)#### 24 | - _sh install-local.sh_ 25 | 26 | ####(with translations)#### 27 | - _sh install-global.sh_ 28 | 29 | You can add Now Dock Plasmoid from Plasma's Widget list 30 | 31 | Translators 32 | ============ 33 | For translations you can use the **po/plasma_applet_org.kde.store.nowdock.plasmoid.pot** file and either make a **Pull Request** for your language or upload the your language file at https://github.com/psifidotos/nowdock-plasmoid/issues/43 34 | 35 | 36 | 37 | Requirements 38 | ------------ 39 | Plasma >= 5.7.0 40 | -------------------------------------------------------------------------------- /install-global.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #Author: Michail Vourlakos 3 | #Summary: Installation script for Now Dock Plasmoid 4 | #This script was written and tested on openSuSe Leap 42.1 5 | 6 | set -e 7 | 8 | if [ -d build ]; then 9 | cd build 10 | rm -fr * 11 | else 12 | mkdir build 13 | cd build 14 | fi 15 | 16 | cmake -DCMAKE_INSTALL_PREFIX=/usr .. 17 | make 18 | sudo make install 19 | -------------------------------------------------------------------------------- /install-local.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #Author: Michail Vourlakos 3 | #Summary: Installation script for Now Dock Panel 4 | #This script was written and tested on openSuSe Leap 42.1 5 | 6 | cd nowdockplasmoid 7 | plasmapkg2 -r . 8 | plasmapkg2 -i . 9 | -------------------------------------------------------------------------------- /metadata.desktop.template: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | _Name=Now Dock 3 | _Comment=Switch between running applications 4 | 5 | 6 | Type=Service 7 | Icon=preferences-system-windows 8 | X-KDE-ServiceTypes=Plasma/Applet 9 | X-Plasma-API=declarativeappletscript 10 | X-Plasma-MainScript=ui/main.qml 11 | X-Plasma-Provides=org.kde.plasma.multitasking 12 | X-KDE-PluginInfo-Author=Michail Vourlakos 13 | X-KDE-PluginInfo-Email=mvourlakos@gmail.com 14 | X-KDE-PluginInfo-Name=org.kde.store.nowdock.plasmoid 15 | X-KDE-PluginInfo-Version=0.4.90 16 | X-KDE-PluginInfo-Website=https://store.kde.org/p/1151047/ 17 | X-KDE-PluginInfo-Category=Windows and Tasks 18 | X-KDE-PluginInfo-Depends= 19 | X-KDE-PluginInfo-License=GPL v2+ 20 | X-KDE-PluginInfo-EnabledByDefault=true 21 | 22 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/code/activitiesTools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | var currentActivity; 20 | var launchersOnActivities; 21 | //it is used as the first item in the stringList in order to check the list is ok 22 | var indicator = 'multi'; 23 | var plasmoid; 24 | 25 | function restoreLaunchers(){ 26 | ///this is a stringlist of types activityId, number of launchers, launchers 27 | if(plasmoid && plasmoid.configuration && currentActivity != "00000000-0000-0000-0000-000000000000"){ 28 | var values = plasmoid.configuration.launchers; 29 | values = values.split(";"); 30 | var returnedStringList = []; 31 | 32 | // console.log("----------------------- Restoring ---------------------"); 33 | // console.log("Full Restoration:"+values); 34 | var type = values.splice(0,1); 35 | 36 | // console.log("Pass 1 - " +type); 37 | if (type == indicator){ 38 | // console.log("Pass 2"); 39 | while (values.length > 2){ 40 | // console.log("Pass 3 - "+values); 41 | var actId = values[0]; 42 | var subLaunchers = values.splice(2,values[1]); 43 | // console.log("To Be Restored launchers, "+actId+ ", "+subLaunchers.length+", "+subLaunchers); 44 | 45 | var activityRecord = get(actId); 46 | if(activityRecord){ 47 | // console.log("Activity item found..."); 48 | if(activityRecord.launchers) 49 | activityRecord.launchers.splice(0,activityRecord.launchers.length); 50 | 51 | activityRecord.launchers = subLaunchers; 52 | } 53 | else{ 54 | // console.log("Activity item is added..."); 55 | var res = {id:values[0], launchers:subLaunchers}; 56 | launchersOnActivities.push(res); 57 | } 58 | 59 | values.splice(0,2); 60 | 61 | } 62 | } 63 | 64 | if (get('*')) 65 | returnedStringList = returnedStringList.concat(get('*').launchers); 66 | else{ 67 | var result = {id:'*', launchers:[]}; 68 | launchersOnActivities.push(result); 69 | } 70 | 71 | if (get(currentActivity)) 72 | returnedStringList = returnedStringList.concat(get(currentActivity).launchers); 73 | 74 | // console.log("Restored Strings:"+returnedStringList); 75 | 76 | return returnedStringList; 77 | } 78 | else 79 | return []; 80 | } 81 | 82 | function saveLaunchers(){ 83 | // console.log("----------------------- Saving ---------------------"); 84 | 85 | var returnedStringList = []; 86 | returnedStringList.push(indicator); 87 | 88 | // console.log("Array Size:"+launchersOnActivities.length); 89 | var size = launchersOnActivities.length; 90 | for(var i=size-1; i>=0; --i){ 91 | var activitySaving = get(launchersOnActivities[i].id); 92 | // console.log("Saving, "+activitySaving.id + " - "+activitySaving.launchers.length+" - "+activitySaving.launchers); 93 | if(activitySaving.launchers.length>0){ 94 | /* console.log("------- "+activitySaving.id+" ----------"); 95 | for(var j=0; j 0){ 136 | tempList = launcherList.slice(0); 137 | } 138 | else{ 139 | tempList =[]; 140 | } 141 | 142 | // console.log("IMPORTANT SENT LIST: "+tempList.length+" - "+launcherList.length+" - "+tempList); 143 | // 144 | // console.log("In memory Defaults:" + get('*').launchers); 145 | // if(get(currentActivity)) 146 | // console.log("In memory Current: "+get(currentActivity).launchers.length+ ' - ' + get(currentActivity).launchers); 147 | 148 | var currentList = get(currentActivity); 149 | 150 | var resultedCurrent = []; 151 | // console.log("-------------"); 152 | 153 | for(var i=tempList.length-1; i>=0; --i){ 154 | var index=-1; 155 | if(currentList){ 156 | index = getIndex(String(tempList[i]), currentList.launchers); 157 | } 158 | 159 | if(index >=0 || isInSpecificActivity(tempList[i])){ 160 | var result = tempList.splice(i,1); 161 | resultedCurrent.unshift(String(result)); 162 | } 163 | } 164 | 165 | // console.log("Resulted Current: "+resultedCurrent); 166 | 167 | /* console.log("---- To Be Set List ------"); 168 | for(var j=0; j=0) 217 | return true; 218 | 219 | // console.log("Check exists:"+id+ " - "+ "pos:"+index+" ,,, "+ get('*').activities); 220 | return false; 221 | } 222 | 223 | function isInSpecificActivity(id){ 224 | for(var i=0; i=0) 230 | return true; 231 | } 232 | } 233 | 234 | return false; 235 | } 236 | 237 | 238 | function setDefaultLaunchers(launchersList){ 239 | // console.log("Set Default Launchers"); 240 | if(!get('*')){ 241 | var result = {id:'*', launchers:launchersList}; 242 | launchersOnActivities.push(result); 243 | } 244 | else{ 245 | if (get('*').launchers) 246 | get('*').launchers.splice(0,get('*').launchers.length); 247 | get('*').launchers=launchersList; 248 | } 249 | 250 | // console.log("Default:::: "+get('*').launchers); 251 | } 252 | 253 | function setActivityLaunchers(launchersList, actId){ 254 | // console.log("Set Activity Launchers"); 255 | var currentList = get(actId); 256 | // console.log("-------------"); 257 | // console.log("ResultedForMemory: "+launchersList); 258 | if(currentList){ 259 | if(currentList.launchers) 260 | currentList.launchers.splice(0,currentList.launchers.length); 261 | 262 | // console.log("list exists"); 263 | currentList.launchers=launchersList; 264 | } 265 | else{ 266 | // console.log("new list"); 267 | var res = {id:actId, launchers:launchersList}; 268 | launchersOnActivities.push(res); 269 | } 270 | 271 | /* console.log("New Memory List: "+get(actId).launchers); 272 | for(var j=0; j= 0){ 315 | activityList.splice(index, 1); 316 | } 317 | } 318 | } 319 | 320 | function addToList(id, activityId){ 321 | var activity = get(activityId); 322 | if(!activity){ 323 | var res = {id:activityId, launchers:[]}; 324 | res.launchers.push(id); 325 | launchersOnActivities.push(res); 326 | } 327 | else{ 328 | var launcherList = activity.launchers; 329 | var index = getIndex(id,launcherList); 330 | if(index<0){ 331 | launcherList.push(id); 332 | } 333 | 334 | } 335 | } 336 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/code/layout.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | function horizontalMargins() { 20 | return taskFrame.margins.left + taskFrame.margins.right; 21 | } 22 | 23 | function verticalMargins() { 24 | return taskFrame.margins.top + taskFrame.margins.bottom; 25 | } 26 | 27 | function adjustMargin(height, margin) { 28 | var available = height - verticalMargins(); 29 | 30 | if (available < units.iconSizes.small) { 31 | return Math.floor((margin * (units.iconSizes.small / available)) / 3); 32 | } 33 | 34 | return margin; 35 | } 36 | 37 | function launcherLayoutTasks() { 38 | return Math.round(tasksModel.launcherCount / Math.floor(preferredMinWidth() / launcherWidth())); 39 | } 40 | 41 | function launcherLayoutWidthDiff() { 42 | return (launcherLayoutTasks() * taskWidth()) - (tasksModel.launcherCount * launcherWidth()); 43 | } 44 | 45 | function logicalTaskCount() { 46 | var count = (tasksModel.count - tasksModel.launcherCount) + launcherLayoutTasks(); 47 | 48 | return Math.max(tasksModel.count ? 1 : 0, count); 49 | } 50 | 51 | function maxStripes() { 52 | var length = tasks.vertical ? taskList.width : taskList.height; 53 | var minimum = tasks.vertical ? preferredMinWidth() : preferredMinHeight(); 54 | 55 | return Math.min(plasmoid.configuration.maxStripes, Math.max(1, Math.floor(length / minimum))); 56 | } 57 | 58 | function tasksPerStripe() { 59 | if (plasmoid.configuration.forceStripes) { 60 | return Math.ceil(logicalTaskCount() / maxStripes()); 61 | } else { 62 | var length = tasks.vertical ? taskList.height : taskList.width; 63 | var minimum = tasks.vertical ? preferredMinHeight() : preferredMinWidth(); 64 | 65 | return Math.floor(length / minimum); 66 | } 67 | } 68 | 69 | function calculateStripes() { 70 | var stripes = plasmoid.configuration.forceStripes ? plasmoid.configuration.maxStripes : Math.min(plasmoid.configuration.maxStripes, Math.ceil(logicalTaskCount() / tasksPerStripe())); 71 | 72 | return Math.min(stripes, maxStripes()); 73 | } 74 | 75 | function full() { 76 | return (maxStripes() == calculateStripes()); 77 | } 78 | 79 | function optimumCapacity(width, height) { 80 | var length = tasks.vertical ? height : width; 81 | var maximum = tasks.vertical ? preferredMaxHeight() : preferredMaxWidth(); 82 | 83 | return (Math.ceil(length / maximum) * maxStripes()); 84 | } 85 | 86 | function layoutWidth() { 87 | if (plasmoid.configuration.forceStripes && !tasks.vertical) { 88 | return Math.min(tasks.width, Math.max(preferredMaxWidth(), tasksPerStripe() * preferredMaxWidth())); 89 | } else { 90 | return tasks.width; 91 | } 92 | } 93 | 94 | function layoutHeight() { 95 | if (plasmoid.configuration.forceStripes && tasks.vertical) { 96 | return Math.min(tasks.height, Math.max(preferredMaxHeight(), tasksPerStripe() * preferredMaxHeight())); 97 | } else { 98 | return tasks.height; 99 | } 100 | } 101 | 102 | function preferredMinWidth() { 103 | var width = launcherWidth(); 104 | 105 | if (!tasks.vertical && !tasks.iconsOnly) { 106 | width += (units.smallSpacing * 2) + (theme.mSize(theme.defaultFont).width * 12); 107 | } 108 | 109 | return width; 110 | } 111 | 112 | function preferredMaxWidth() { 113 | if (tasks.iconsOnly) { 114 | if (tasks.vertical) { 115 | return tasks.width + verticalMargins(); 116 | } else { 117 | return tasks.height + horizontalMargins(); 118 | } 119 | } 120 | 121 | if (plasmoid.configuration.groupingStrategy != 0 && !plasmoid.configuration.groupPopups) { 122 | return preferredMinWidth(); 123 | } 124 | 125 | return Math.floor(preferredMinWidth() * 1.6); 126 | } 127 | 128 | function preferredMinHeight() { 129 | // TODO FIXME UPSTREAM: Port to proper font metrics for descenders once we have access to them. 130 | return theme.mSize(theme.defaultFont).height + 4; 131 | } 132 | 133 | function preferredMaxHeight() { 134 | return verticalMargins() + Math.min(units.iconSizes.small * 3, theme.mSize(theme.defaultFont).height * 3); 135 | } 136 | 137 | function taskWidth() { 138 | if (tasks.vertical) { 139 | return Math.floor(taskList.width / calculateStripes()); 140 | } else { 141 | if (full() && Math.max(1, logicalTaskCount()) > tasksPerStripe()) { 142 | return Math.floor(taskList.width / Math.ceil(logicalTaskCount() / maxStripes())); 143 | } else { 144 | return Math.min(preferredMaxWidth(), Math.floor(taskList.width / Math.min(logicalTaskCount(), tasksPerStripe()))); 145 | } 146 | } 147 | } 148 | 149 | function taskHeight() { 150 | if (tasks.vertical) { 151 | if (full() && Math.max(1, logicalTaskCount()) > tasksPerStripe()) { 152 | return Math.floor(taskList.height / Math.ceil(logicalTaskCount() / maxStripes())); 153 | } else { 154 | return Math.min(preferredMaxHeight(), Math.floor(taskList.height / Math.min(logicalTaskCount(), tasksPerStripe()))); 155 | } 156 | } else { 157 | return Math.floor(taskList.height / calculateStripes()); 158 | } 159 | } 160 | 161 | function launcherWidth() { 162 | var baseWidth = tasks.vertical ? preferredMinHeight() : Math.min(tasks.height, units.iconSizes.small * 3); 163 | 164 | return (baseWidth + horizontalMargins()) 165 | - (adjustMargin(baseWidth, taskFrame.margins.top) + adjustMargin(baseWidth, taskFrame.margins.bottom)); 166 | } 167 | 168 | function layout(container) { 169 | var item; 170 | var stripes = calculateStripes(); 171 | var taskCount = tasksModel.count - tasksModel.launcherCount; 172 | var width = taskWidth(); 173 | var adjustedWidth = width; 174 | var height = taskHeight(); 175 | 176 | if (!tasks.vertical && stripes == 1 && taskCount) 177 | { 178 | var shrink = ((tasksModel.count - tasksModel.launcherCount) * preferredMaxWidth()) 179 | + (tasksModel.launcherCount * launcherWidth()) > taskList.width; 180 | width = Math.min(shrink ? width + Math.floor(launcherLayoutWidthDiff() / taskCount) : width, 181 | preferredMaxWidth()); 182 | } 183 | 184 | for (var i = 0; i < container.count; ++i) { 185 | item = container.itemAt(i); 186 | 187 | if (!item) { 188 | continue; 189 | } 190 | 191 | adjustedWidth = width; 192 | 193 | if (!tasks.vertical && !tasks.iconsOnly && (plasmoid.configuration.separateLaunchers || stripes == 1)) { 194 | if (item.m.IsLauncher === true) { 195 | adjustedWidth = launcherWidth(); 196 | } else if (stripes > 1 && i == tasksModel.launcherCount) { 197 | adjustedWidth += launcherLayoutWidthDiff(); 198 | } 199 | } 200 | 201 | item.width = adjustedWidth; 202 | item.height = height; 203 | item.visible = true; 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/code/tools.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | 20 | function wheelActivateNextPrevTask(wheelDelta, eventDelta) { 21 | // magic number 120 for common "one click" 22 | // See: http://qt-project.org/doc/qt-5/qml-qtquick-wheelevent.html#angleDelta-prop 23 | wheelDelta += eventDelta; 24 | var increment = 0; 25 | while (wheelDelta >= 120) { 26 | wheelDelta -= 120; 27 | increment++; 28 | } 29 | while (wheelDelta <= -120) { 30 | wheelDelta += 120; 31 | increment--; 32 | } 33 | while (increment != 0) { 34 | activateNextPrevTask(increment < 0) 35 | increment += (increment < 0) ? 1 : -1; 36 | } 37 | 38 | return wheelDelta; 39 | } 40 | 41 | function activateNextPrevTask(next) { 42 | // FIXME TODO: Unnecessarily convoluted and costly; optimize. 43 | 44 | var taskIndexList = []; 45 | var activeTaskIndex = tasksModel.activeTask; 46 | 47 | for (var i = 0; i < taskList.children.length - 1; ++i) { 48 | var task = taskList.children[i]; 49 | var modelIndex = task.modelIndex(i); 50 | 51 | if (task !== undefined){ 52 | if (task.IsLauncher !== true && task.IsStartup !== true) { 53 | if (task.m.IsGroupParent === true) { 54 | for (var j = 0; j < tasksModel.rowCount(modelIndex); ++j) { 55 | taskIndexList.push(tasksModel.makeModelIndex(i, j)); 56 | } 57 | } else { 58 | taskIndexList.push(modelIndex); 59 | } 60 | } 61 | } 62 | } 63 | 64 | if (!taskIndexList.length) { 65 | return; 66 | } 67 | 68 | var target = taskIndexList[0]; 69 | 70 | for (var i = 0; i < taskIndexList.length; ++i) { 71 | if (taskIndexList[i] === activeTaskIndex) 72 | { 73 | if (next && i < (taskIndexList.length - 1)) { 74 | target = taskIndexList[i + 1]; 75 | } else if (!next) { 76 | if (i) { 77 | target = taskIndexList[i - 1]; 78 | } else { 79 | target = taskIndexList[taskIndexList.length - 1]; 80 | } 81 | } 82 | 83 | break; 84 | } 85 | } 86 | 87 | tasksModel.requestActivate(target); 88 | } 89 | 90 | function insertIndexAt(above, x, y) { 91 | if (above && above.itemIndex) { 92 | return above.itemIndex; 93 | } else { 94 | var distance = panel.vertical ? y : x; 95 | //var step = panel.vertical ? LayoutManager.taskWidth() : LayoutManager.taskHeight(); 96 | var step = panel.realSize; 97 | var stripe = Math.ceil(distance / step); 98 | 99 | /* if (stripe === LayoutManager.calculateStripes()) { 100 | return tasksModel.count - 1; 101 | } else { 102 | return stripe * LayoutManager.tasksPerStripe(); 103 | }*/ 104 | 105 | return stripe-1; 106 | } 107 | } 108 | 109 | 110 | function publishIconGeometries(taskItems) { 111 | for (var i = 0; i < taskItems.length - 1; ++i) { 112 | var task = taskItems[i]; 113 | 114 | if (task !== undefined){ 115 | if (task.IsLauncher !== true && task.IsStartup !== true) { 116 | tasksModel.requestPublishDelegateGeometry(tasksModel.makeModelIndex(task.itemIndex), 117 | backend.globalRect(task), task); 118 | } 119 | } 120 | } 121 | } 122 | 123 | function taskPrefix(prefix) { 124 | var effectivePrefix; 125 | 126 | switch (plasmoid.location) { 127 | case PlasmaCore.Types.LeftEdge: 128 | effectivePrefix = "west-" + prefix; 129 | break; 130 | case PlasmaCore.Types.TopEdge: 131 | effectivePrefix = "north-" + prefix; 132 | break; 133 | case PlasmaCore.Types.RightEdge: 134 | effectivePrefix = "east-" + prefix; 135 | break; 136 | default: 137 | effectivePrefix = "south-" + prefix; 138 | } 139 | if (!frame.hasElementPrefix(effectivePrefix)) { 140 | return prefix; 141 | } 142 | return effectivePrefix; 143 | 144 | } 145 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/config/config.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | 20 | import QtQuick 2.0 21 | 22 | import org.kde.plasma.configuration 2.0 23 | 24 | ConfigModel { 25 | ConfigCategory { 26 | name: i18n("Appearance") 27 | icon: "preferences-desktop-display-color" 28 | source: "ConfigAppearance.qml" 29 | } 30 | ConfigCategory { 31 | name: i18n("Panel") 32 | icon: "window-duplicate" 33 | source: "ConfigPanel.qml" 34 | } 35 | ConfigCategory { 36 | name: i18n("Interaction") 37 | icon: "preferences-system-windows-move" 38 | source: "ConfigInteraction.qml" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/config/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | false 11 | 12 | 13 | false 14 | 15 | 16 | true 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | true 26 | 27 | 28 | true 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 2 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 0 51 | 52 | 53 | true 54 | 55 | 56 | true 57 | 58 | 59 | true 60 | 61 | 62 | true 63 | 64 | 65 | 14 66 | 67 | 68 | 48 69 | 70 | 71 | false 72 | 73 | 74 | false 75 | 76 | 77 | false 78 | 79 | 80 | true 81 | 82 | 83 | 10 84 | 85 | 86 | false 87 | 88 | 89 | false 90 | 91 | 92 | false 93 | 94 | 95 | false 96 | 97 | 98 | 2 99 | 100 | 101 | false 102 | 103 | 104 | false 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/images/panel-west.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/psifidotos/nowdock-plasmoid/4803aeabcdbe387f7b60d11f3297ec6f5be90b05/nowdockplasmoid/contents/images/panel-west.png -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/CircleText.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.2 20 | import QtGraphicalEffects 1.0 21 | 22 | Item { 23 | property double proportion 24 | 25 | property string valueLabel 26 | property string numberValue 27 | 28 | property bool fullCircle 29 | property bool showNumber 30 | property bool showLabel 31 | 32 | property double circleOpacity: 1 33 | 34 | property double fontPixelSize: partSize // * 0.55 35 | 36 | property double stdThickness: partSize < 0 ? 0 : partSize // "/2.1" 37 | property double circleThicknessAttr: fullCircle ? 0 : stdThickness * 0.9 38 | property double partSize: height / 2 39 | property double pi2: Math.PI * 2 40 | 41 | onProportionChanged: { 42 | repaint() 43 | } 44 | 45 | function repaint() { 46 | canvas.requestPaint() 47 | } 48 | 49 | Canvas { 50 | id: canvas 51 | 52 | property int lineWidth: 1 53 | property bool fill: true 54 | property bool stroke: true 55 | property real alpha: 1.0 56 | 57 | // edge bleeding fix 58 | readonly property double filler: 0.01 59 | 60 | width: parent.width 61 | height: parent.height 62 | antialiasing: true 63 | opacity: 1.0 64 | 65 | onPaint: { 66 | var ctx = getContext('2d') 67 | ctx.clearRect(0, 0, canvas.width, canvas.height) 68 | ctx.fillStyle = theme.highlightColor 69 | 70 | var startRadian = - Math.PI / 2 71 | 72 | var radians = pi2 * proportion 73 | 74 | ctx.beginPath(); 75 | ctx.arc(width/2, height/2, stdThickness, startRadian, startRadian + radians + filler, false) 76 | ctx.arc(width/2, height/2, circleThicknessAttr, startRadian + radians + filler, startRadian, true) 77 | 78 | ctx.closePath() 79 | ctx.fill() 80 | } 81 | } 82 | 83 | DropShadow { 84 | anchors.fill: canvas 85 | radius: 4 86 | samples: 8 87 | spread: 0.5 88 | fast: true 89 | color: theme.backgroundColor 90 | source: canvas 91 | } 92 | 93 | Text { 94 | id: valueText 95 | anchors.centerIn: parent 96 | text: numberValue 97 | font.pixelSize: fontPixelSize 98 | color: theme.textColor 99 | visible: showNumber 100 | } 101 | 102 | DropShadow { 103 | anchors.fill: valueText 104 | radius: 3 105 | samples: 8 106 | spread: 0.6 107 | fast: true 108 | color: theme.backgroundColor 109 | source: valueText 110 | visible: showNumber 111 | } 112 | 113 | Text { 114 | id: valueTextLabel 115 | anchors.bottom: parent.bottom 116 | anchors.bottomMargin: -2 117 | anchors.right: parent.right 118 | text: valueLabel 119 | font.pixelSize: fontPixelSize * 0.65 120 | color: theme.textColor 121 | visible: true 122 | } 123 | } 124 | 125 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/ConfigAppearance.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQuick.Controls 1.0 21 | import QtQuick.Layouts 1.0 22 | import QtGraphicalEffects 1.0 23 | 24 | import org.kde.plasma.core 2.0 as PlasmaCore 25 | import org.kde.plasma.components 2.0 as PlasmaComponents 26 | 27 | Item { 28 | id: mainItem 29 | 30 | width: childrenRect.width 31 | height: childrenRect.height 32 | 33 | property bool vertical: (plasmoid.formFactor == PlasmaCore.Types.Vertical) 34 | 35 | property alias cfg_zoomHelper: zoomHelper.checked 36 | property alias cfg_zoomLevel: zoomLevel.value 37 | property alias cfg_showShadows: showShadows.checked 38 | property alias cfg_showGlow: showGlow.checked 39 | property alias cfg_iconSize: iconSizeCmb.realValue 40 | property alias cfg_threeColorsWindows: threeColorsWindows.checked 41 | property alias cfg_dotsOnActive: dotsOnActive.checked 42 | property alias cfg_durationTime : durationTime.value 43 | property alias cfg_reverseLinesPosition : reverseLinesPosition.checked 44 | 45 | property alias cfg_isInNowDockPanel: mainItem.isInNowDockPanel 46 | 47 | property bool isInNowDockPanel 48 | 49 | ColumnLayout { 50 | id:mainColumn 51 | spacing: 15 52 | width: parent.width-40 53 | 54 | //Layout.fillWidth: true 55 | 56 | GroupBox { 57 | title: "" 58 | flat: true 59 | Layout.fillWidth: true 60 | 61 | ColumnLayout { 62 | Layout.fillWidth: true 63 | width: mainItem.width-40 64 | 65 | RowLayout{ 66 | 67 | Label { 68 | text: i18n("Icon size: ") 69 | } 70 | 71 | ComboBox { 72 | // 16, 22, 32, 48, 64,128, 256 73 | id: iconSizeCmb 74 | enabled: !mainItem.isInNowDockPanel 75 | 76 | property int realValue 77 | property bool startup: true 78 | model: ["16px.", "22px.", "32px.", "48px.", "64px.", "96px", "128px.", "256px."] 79 | 80 | onCurrentIndexChanged: { 81 | switch(currentIndex){ 82 | case 0: 83 | realValue = 16; 84 | break; 85 | case 1: 86 | realValue = 22; 87 | break; 88 | case 2: 89 | realValue = 32; 90 | break; 91 | case 3: 92 | realValue = 48; 93 | break; 94 | case 4: 95 | realValue = 64; 96 | break; 97 | case 5: 98 | realValue = 96; 99 | break; 100 | case 6: 101 | realValue = 128; 102 | break; 103 | case 7: 104 | realValue = 256; 105 | break; 106 | default: 107 | realValue = 64; 108 | break 109 | } 110 | } 111 | 112 | onRealValueChanged: { 113 | if(startup){ 114 | switch (realValue){ 115 | case 16: 116 | currentIndex = 0; 117 | break; 118 | case 22: 119 | currentIndex = 1; 120 | break; 121 | case 32: 122 | currentIndex = 2; 123 | break; 124 | case 48: 125 | currentIndex = 3; 126 | break; 127 | case 64: 128 | currentIndex = 4; 129 | break; 130 | case 96: 131 | currentIndex = 5; 132 | break; 133 | case 128: 134 | currentIndex = 6; 135 | break; 136 | case 256: 137 | currentIndex = 7; 138 | break; 139 | default: 140 | currentIndex = 4; 141 | break 142 | } 143 | startup = false; 144 | } 145 | } 146 | } 147 | 148 | Label { 149 | id: versionLabel 150 | 151 | font.italic: true 152 | horizontalAlignment: Text.AlignRight 153 | Layout.alignment: Qt.AlignRight 154 | Layout.fillWidth: true 155 | 156 | text: i18n("ver: ") + "0.4.90" 157 | } 158 | } 159 | 160 | 161 | CheckBox { 162 | id: showShadows 163 | text: i18n("Enable shadows for icons") 164 | enabled: true 165 | } 166 | 167 | CheckBox { 168 | id: showGlow 169 | text: i18n("Show glow around windows points") 170 | enabled: true 171 | } 172 | 173 | CheckBox { 174 | id: threeColorsWindows 175 | text: i18n("Different color for minimized windows") 176 | enabled: true 177 | } 178 | 179 | CheckBox { 180 | id: dotsOnActive 181 | text: i18n("Dots on active window") 182 | enabled: true 183 | } 184 | 185 | CheckBox { 186 | id: reverseLinesPosition 187 | text: i18n("Reverse position for lines and dots") 188 | enabled: true 189 | } 190 | } 191 | } 192 | 193 | GridLayout{ 194 | id: animationsGridLayout 195 | Layout.fillWidth: true 196 | columns: 3 197 | 198 | 199 | Label { 200 | id: durationTimeLabel 201 | 202 | Layout.alignment: Qt.AlignHCenter 203 | horizontalAlignment: Text.AlignHCenter 204 | 205 | text: i18n("Animations: ") 206 | } 207 | 208 | Slider { 209 | id: durationTime 210 | enabled: true 211 | Layout.fillWidth: true 212 | minimumValue: 0 213 | maximumValue: 3 214 | stepSize: 1 215 | tickmarksEnabled: true 216 | } 217 | Label { 218 | enabled: durationTime.value > 0 219 | Layout.alignment: Qt.AlignHCenter 220 | horizontalAlignment: Text.AlignHCenter 221 | font.italic: durationTime.value > 0 ? false : true 222 | 223 | property string textUsed: durationTime.value > 0 ? i18n("duration") : i18n("disabled") 224 | 225 | text: (durationTime.value > 0 ? ("x" + durationTime.value) + " " + textUsed : textUsed ) 226 | } 227 | 228 | Label{Layout.columnSpan: 3} 229 | 230 | Item{ 231 | enabled: !mainItem.isInNowDockPanel 232 | Layout.columnSpan: 3 233 | Layout.fillWidth: true 234 | Label { 235 | text: i18n("Zoom") 236 | anchors.centerIn: parent 237 | font.bold: true 238 | font.italic: true 239 | } 240 | } 241 | 242 | ////// 243 | 244 | Label { 245 | enabled: !mainItem.isInNowDockPanel 246 | Layout.alignment: Qt.AlignHCenter 247 | horizontalAlignment: Text.AlignHCenter 248 | 249 | text: i18n("Level: ") 250 | } 251 | 252 | Slider { 253 | id: zoomLevel 254 | enabled: !mainItem.isInNowDockPanel 255 | Layout.fillWidth: true 256 | minimumValue: 0 257 | maximumValue: 20 258 | stepSize: 1 259 | tickmarksEnabled: true 260 | } 261 | 262 | Label { 263 | id:zoomLevelText 264 | enabled: !mainItem.isInNowDockPanel 265 | Layout.minimumWidth: metricsLabel2.width 266 | Layout.maximumWidth: metricsLabel2.width 267 | Layout.alignment: Qt.AlignHCenter 268 | horizontalAlignment: Text.AlignHCenter 269 | //Layout.alignment: Qt.AlignRight 270 | 271 | 272 | property real fixedZoom: (1 + (zoomLevel.value / 20)) 273 | text: "x"+ fixedZoom.toFixed(2) 274 | 275 | Label{ 276 | id:metricsLabel2 277 | visible: false 278 | text: "x1.50" 279 | } 280 | } 281 | ///// 282 | //spacer to set a minimumWidth for sliders 283 | //Layout.minimumWidth didnt work 284 | Label{} 285 | // Label{Layout.maximumWidth: 275} 286 | Label{} 287 | 288 | //////// 289 | 290 | CheckBox { 291 | id: zoomHelper 292 | enabled: !mainItem.isInNowDockPanel 293 | text: i18n("Show a red line on the limit needed for animations") 294 | 295 | Layout.columnSpan: 3 296 | } 297 | } 298 | } 299 | 300 | DropShadow { 301 | id:shadowText 302 | anchors.fill: inNowDockLabel 303 | enabled: isInNowDockPanel 304 | radius: 3 305 | samples: 5 306 | color: "#cc080808" 307 | source: inNowDockLabel 308 | 309 | verticalOffset: 2 310 | horizontalOffset: -1 311 | visible: isInNowDockPanel 312 | } 313 | 314 | 315 | Label { 316 | id:inNowDockLabel 317 | anchors.horizontalCenter: mainItem.horizontalCenter 318 | anchors.bottom: mainColumn.bottom 319 | anchors.bottomMargin: mainColumn.height / 12 320 | // anchors.verticalCenterOffset: (mainColumn.height / 4) 321 | 322 | width: 0.85 * mainItem.width 323 | text: i18n("For the disabled settings you should use the Now Dock Panel Configuration Window") 324 | visible: mainItem.isInNowDockPanel 325 | 326 | horizontalAlignment: Text.AlignHCenter 327 | // font.bold: true 328 | font.italic: true 329 | font.pointSize: 1.2 * theme.defaultFont.pointSize 330 | 331 | wrapMode: Text.WordWrap 332 | } 333 | } 334 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/ConfigInteraction.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | 20 | import QtQuick 2.0 21 | import QtQuick.Controls 1.0 22 | import QtQuick.Layouts 1.0 23 | 24 | import org.kde.plasma.core 2.0 as PlasmaCore 25 | import org.kde.plasma.components 2.0 as PlasmaComponents 26 | 27 | Item { 28 | width: childrenRect.width 29 | height: childrenRect.height 30 | 31 | property bool vertical: (plasmoid.formFactor == PlasmaCore.Types.Vertical) 32 | 33 | property alias cfg_wheelEnabled: wheelEnabled.checked 34 | property alias cfg_middleClickAction: middleClickAction.currentIndex 35 | 36 | property alias cfg_showOnlyCurrentScreen: showOnlyCurrentScreen.checked 37 | property alias cfg_showOnlyCurrentDesktop: showOnlyCurrentDesktop.checked 38 | property alias cfg_showOnlyCurrentActivity: showOnlyCurrentActivity.checked 39 | 40 | property alias cfg_highlightWindows: highlightWindowsChk.checked 41 | property alias cfg_smartLaunchersEnabled: smartLaunchersChk.checked 42 | property alias cfg_showToolTips: showPreviewsChk.checked 43 | property alias cfg_showWindowActions: windowActionsChk.checked 44 | 45 | ColumnLayout{ 46 | spacing: 15 47 | 48 | GroupBox { 49 | title: "" 50 | flat: true 51 | Layout.fillWidth: true 52 | 53 | ColumnLayout { 54 | Layout.fillWidth: true 55 | 56 | CheckBox { 57 | id: wheelEnabled 58 | text: i18n("Cycle through tasks with mouse wheel") 59 | enabled: false 60 | } 61 | 62 | CheckBox { 63 | id: showPreviewsChk 64 | Layout.fillWidth: true 65 | text: i18n("Preview windows on hovering") 66 | } 67 | 68 | CheckBox { 69 | id: highlightWindowsChk 70 | Layout.fillWidth: true 71 | text: i18n("Highlight windows on hovering") 72 | } 73 | 74 | CheckBox { 75 | id: windowActionsChk 76 | Layout.fillWidth: true 77 | text: i18n("Show window actions in the context menu") 78 | } 79 | 80 | CheckBox { 81 | id: smartLaunchersChk 82 | Layout.fillWidth: true 83 | text: i18n("Show progress information in task buttons") 84 | } 85 | 86 | RowLayout { 87 | Label { 88 | text: i18n("On middle-click:") 89 | } 90 | 91 | ComboBox { 92 | id: middleClickAction 93 | Layout.fillWidth: true 94 | model: [i18nc("The click action", "None"), i18n("Close Window or Group"), i18n("New Instance"), i18n("Minimize/Restore Window or Group")] 95 | } 96 | } 97 | } 98 | } 99 | 100 | 101 | ColumnLayout { 102 | Layout.fillWidth: true 103 | 104 | 105 | Label { 106 | text: i18n("Filters") 107 | // Layout.fillWidth: true 108 | anchors.horizontalCenter: parent.horizontalCenter 109 | // anchors.centerIn: parent 110 | font.bold: true 111 | font.italic: true 112 | } 113 | 114 | 115 | CheckBox { 116 | id: showOnlyCurrentScreen 117 | text: i18n("Show only tasks from the current screen") 118 | } 119 | 120 | CheckBox { 121 | id: showOnlyCurrentDesktop 122 | text: i18n("Show only tasks from the current desktop") 123 | } 124 | 125 | CheckBox { 126 | id: showOnlyCurrentActivity 127 | text: i18n("Show only tasks from the current activity") 128 | } 129 | } 130 | 131 | } 132 | 133 | } 134 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/ConfigPanel.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQuick.Controls 1.0 21 | import QtQuick.Layouts 1.0 22 | import QtGraphicalEffects 1.0 23 | 24 | import org.kde.plasma.core 2.0 as PlasmaCore 25 | import org.kde.plasma.components 2.0 as PlasmaComponents 26 | 27 | Item { 28 | id: mainItem 29 | 30 | width: childrenRect.width 31 | height: childrenRect.height 32 | 33 | property bool vertical: (plasmoid.formFactor == PlasmaCore.Types.Vertical) 34 | 35 | property alias cfg_showBarLine: showBarLine.checked 36 | property alias cfg_useThemePanel: useThemePanel.checked 37 | property alias cfg_panelSize: panelSize.value 38 | property alias cfg_transparentPanel: transparentPanel.checked 39 | property alias cfg_plasmoidPosition: panelPositionCmb.currentIndex 40 | property alias cfg_isInNowDockPanel: mainItem.isInNowDockPanel 41 | 42 | property bool isInNowDockPanel 43 | 44 | ColumnLayout { 45 | 46 | id:mainColumn 47 | spacing: 15 48 | Layout.fillWidth: true 49 | 50 | GridLayout{ 51 | enabled: !mainItem.isInNowDockPanel 52 | Layout.fillWidth: true 53 | columns: 3 54 | property bool panelConfigEnabled: showBarLine.checked && useThemePanel.checked 55 | 56 | 57 | Label { 58 | text: i18n("Position: ") 59 | } 60 | 61 | ComboBox { 62 | // 16, 22, 32, 48, 64,128, 256 63 | id: panelPositionCmb 64 | 65 | Layout.fillWidth: true 66 | model: [i18n("Center"), i18n("Left"), i18n("Right"), i18n("Top"), i18n("Bottom")] 67 | } 68 | Label{} 69 | 70 | 71 | CheckBox { 72 | id: showBarLine 73 | Layout.columnSpan: 3 74 | text: i18n("Show bar line for tasks") 75 | enabled: true 76 | } 77 | 78 | CheckBox { 79 | id: useThemePanel 80 | Layout.columnSpan: 3 81 | text: i18n("Use plasma theme panel") 82 | enabled: showBarLine.checked 83 | } 84 | 85 | CheckBox { 86 | id: transparentPanel 87 | Layout.columnSpan: 3 88 | text: i18n("Use transparency in the panel") 89 | enabled: parent.panelConfigEnabled 90 | } 91 | 92 | 93 | Label { 94 | id: panelLabel 95 | text: i18n("Size: ") 96 | enabled: parent.panelConfigEnabled 97 | } 98 | 99 | Slider { 100 | id: panelSize 101 | enabled: parent.panelConfigEnabled 102 | Layout.fillWidth: true 103 | minimumValue: 0 104 | maximumValue: 256 105 | stepSize: 2 106 | tickmarksEnabled: false 107 | } 108 | 109 | Label { 110 | enabled: parent.panelConfigEnabled 111 | Layout.minimumWidth: metricsLabel.width 112 | Layout.maximumWidth: metricsLabel.width 113 | Layout.alignment: Qt.AlignRight 114 | horizontalAlignment: Text.AlignRight 115 | 116 | text: ( panelSize.value + " px." ) 117 | 118 | Label{ 119 | id:metricsLabel 120 | visible: false 121 | text: panelSize.maximumValue+" px." 122 | } 123 | } 124 | 125 | /* Label{ 126 | Layout.columnSpan: 3 127 | Layout.fillWidth: false 128 | Layout.alignment: Qt.AlignRight 129 | Layout.maximumWidth: zoomLevel.width + zoomLevelText.width + panelLabel.width 130 | horizontalAlignment: Text.AlignRight 131 | text: i18n("in panel placement, themes that have set a specific panel transparent work better") 132 | wrapMode: Text.WordWrap 133 | font.italic: true 134 | enabled: parent.panelConfigEnabled 135 | }*/ 136 | 137 | ///// 138 | //spacer to set a minimumWidth for sliders 139 | //Layout.minimumWidth didnt work 140 | Label{} 141 | Label{Layout.minimumWidth: 280} 142 | Label{} 143 | 144 | } 145 | } 146 | 147 | DropShadow { 148 | id:shadowText 149 | anchors.fill: inNowDockLabel 150 | enabled: isInNowDockPanel 151 | radius: 3 152 | samples: 5 153 | color: "#cc080808" 154 | source: inNowDockLabel 155 | 156 | verticalOffset: 2 157 | horizontalOffset: -1 158 | visible: isInNowDockPanel 159 | } 160 | 161 | 162 | Label { 163 | id:inNowDockLabel 164 | anchors.horizontalCenter: mainItem.horizontalCenter 165 | anchors.verticalCenter: mainColumn.verticalCenter 166 | // anchors.verticalCenterOffset: (mainColumn.height / 4) 167 | 168 | width: 0.85 * mainItem.width 169 | text: i18n("For the disabled settings you should use the Now Dock Panel Configuration Window") 170 | visible: mainItem.isInNowDockPanel 171 | 172 | horizontalAlignment: Text.AlignHCenter 173 | // font.bold: true 174 | font.italic: true 175 | font.pointSize: 1.2 * theme.defaultFont.pointSize 176 | 177 | wrapMode: Text.WordWrap 178 | } 179 | 180 | } 181 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/ContextMenu.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | import QtQuick 2.0 19 | 20 | import org.kde.plasma.plasmoid 2.0 21 | 22 | import org.kde.plasma.core 2.0 as PlasmaCore 23 | import org.kde.plasma.components 2.0 as PlasmaComponents 24 | import org.kde.activities 0.1 as Activities 25 | 26 | import "../code/activitiesTools.js" as ActivitiesTools 27 | 28 | PlasmaComponents.ContextMenu { 29 | id: menu 30 | 31 | property QtObject mpris2Source 32 | 33 | placement: { 34 | if (plasmoid.location == PlasmaCore.Types.LeftEdge) { 35 | return PlasmaCore.Types.RightPosedTopAlignedPopup; 36 | } else if (plasmoid.location == PlasmaCore.Types.TopEdge) { 37 | return PlasmaCore.Types.BottomPosedLeftAlignedPopup; 38 | } else { 39 | return PlasmaCore.Types.TopPosedLeftAlignedPopup; 40 | } 41 | } 42 | 43 | minimumWidth: visualParent ? visualParent.width : 1 44 | 45 | property bool isOnAllActivitiesLauncher: true 46 | 47 | property int activitiesCount: 0 48 | 49 | onStatusChanged: { 50 | if (visualParent && visualParent.m.LauncherUrlWithoutIcon != null && status == PlasmaComponents.DialogStatus.Open) { 51 | launcherToggleAction.checked = (tasksModel.launcherPosition(visualParent.m.LauncherUrlWithoutIcon) != -1); 52 | updateOnAllActivitiesLauncher(); 53 | } else if (status == PlasmaComponents.DialogStatus.Closed) { 54 | checkListHovered.start(); 55 | menu.destroy(); 56 | } 57 | } 58 | 59 | function show() { 60 | //trying to use the dragging mechanism in order to not hide the dock 61 | panel.disableRestoreZoom = true; 62 | panel.signalDraggingState(true); 63 | loadDynamicLaunchActions(visualParent.m.LauncherUrlWithoutIcon); 64 | // backend.ungrabMouse(visualParent); 65 | openRelative(); 66 | } 67 | 68 | function newMenuItem(parent) { 69 | return Qt.createQmlObject( 70 | "import org.kde.plasma.components 2.0 as PlasmaComponents;" + 71 | "PlasmaComponents.MenuItem {}", 72 | parent); 73 | } 74 | 75 | function newSeparator(parent) { 76 | return Qt.createQmlObject( 77 | "import org.kde.plasma.components 2.0 as PlasmaComponents;" + 78 | "PlasmaComponents.MenuItem { separator: true }", 79 | parent); 80 | } 81 | 82 | function loadDynamicLaunchActions(launcherUrl) { 83 | var actionList = backend.jumpListActions(launcherUrl, menu); 84 | 85 | for (var i = 0; i < actionList.length; ++i) { 86 | var item = newMenuItem(menu); 87 | item.action = actionList[i]; 88 | menu.addMenuItem(item, virtualDesktopsMenuItem); 89 | } 90 | 91 | if (actionList.length > 0) { 92 | menu.addMenuItem(newSeparator(menu), virtualDesktopsMenuItem); 93 | } 94 | 95 | var actionList = backend.recentDocumentActions(launcherUrl, menu); 96 | 97 | for (var i = 0; i < actionList.length; ++i) { 98 | var item = newMenuItem(menu); 99 | item.action = actionList[i]; 100 | menu.addMenuItem(item, virtualDesktopsMenuItem); 101 | } 102 | 103 | if (actionList.length > 0) { 104 | menu.addMenuItem(newSeparator(menu), virtualDesktopsMenuItem); 105 | } 106 | 107 | // Add Media Player control actions 108 | var sourceName = mpris2Source.sourceNameForLauncherUrl(launcherUrl); 109 | 110 | if (sourceName) { 111 | var playerData = mpris2Source.data[sourceName] 112 | 113 | if (playerData.CanControl) { 114 | var menuItem = menu.newMenuItem(menu); 115 | menuItem.text = i18nc("Play previous track", "Previous Track"); 116 | menuItem.icon = "media-skip-backward"; 117 | menuItem.enabled = Qt.binding(function() { 118 | return playerData.CanGoPrevious; 119 | }); 120 | menuItem.clicked.connect(function() { 121 | mpris2Source.goPrevious(sourceName); 122 | }); 123 | menu.addMenuItem(menuItem, virtualDesktopsMenuItem); 124 | 125 | menuItem = menu.newMenuItem(menu); 126 | // PlasmaCore Menu doesn't actually handle icons or labels changing at runtime... 127 | menuItem.text = Qt.binding(function() { 128 | return playerData.PlaybackStatus === "Playing" ? i18nc("Pause playback", "Pause") : i18nc("Start playback", "Play"); 129 | }); 130 | menuItem.icon = Qt.binding(function() { 131 | return playerData.PlaybackStatus === "Playing" ? "media-playback-pause" : "media-playback-start"; 132 | }); 133 | menuItem.clicked.connect(function() { 134 | mpris2Source.playPause(sourceName); 135 | }); 136 | menu.addMenuItem(menuItem, virtualDesktopsMenuItem); 137 | 138 | menuItem = menu.newMenuItem(menu); 139 | menuItem.text = i18nc("Stop playback", "Stop"); 140 | menuItem.icon = "media-playback-stop"; 141 | menuItem.clicked.connect(function() { 142 | mpris2Source.stop(sourceName); 143 | }); 144 | menu.addMenuItem(menuItem, virtualDesktopsMenuItem); 145 | 146 | menuItem = menu.newMenuItem(menu); 147 | menuItem.text = i18nc("Play next track", "Next Track"); 148 | menuItem.icon = "media-skip-forward"; 149 | menuItem.enabled = Qt.binding(function() { 150 | return playerData.CanGoNext; 151 | }); 152 | menuItem.clicked.connect(function() { 153 | mpris2Source.goNext(sourceName); 154 | }); 155 | menu.addMenuItem(menuItem, virtualDesktopsMenuItem); 156 | 157 | menu.addMenuItem(newSeparator(menu), virtualDesktopsMenuItem); 158 | 159 | // If we don't have a window associated with the player but we can quit 160 | // it through MPRIS we'll offer a "Quit" option instead of "Close" 161 | if (!closeWindowItem.visible && playerData.CanQuit) { 162 | menuItem = menu.newMenuItem(menu); 163 | menuItem.text = i18nc("Quit media player app", "Quit"); 164 | menuItem.icon = "application-exit"; 165 | menuItem.visible = Qt.binding(function() { 166 | return !closeWindowItem.visible; 167 | }); 168 | menuItem.clicked.connect(function() { 169 | mpris2Source.quit(sourceName); 170 | }); 171 | menu.addMenuItem(menuItem); 172 | } 173 | 174 | // If we don't have a window associated with the player but we can raise 175 | // it through MPRIS we'll offer a "Restore" option 176 | if (!startNewInstanceItem.visible && playerData.CanRaise) { 177 | menuItem = menu.newMenuItem(menu); 178 | menuItem.text = i18nc("Open or bring to the front window of media player app", "Restore"); 179 | menuItem.icon = playerData["Desktop Icon Name"]; 180 | menuItem.visible = Qt.binding(function() { 181 | return !startNewInstanceItem.visible; 182 | }); 183 | menuItem.clicked.connect(function() { 184 | mpris2Source.raise(sourceName); 185 | }); 186 | menu.addMenuItem(menuItem, startNewInstanceItem); 187 | } 188 | } 189 | } 190 | } 191 | 192 | function updateOnAllActivitiesLauncher(){ 193 | isOnAllActivitiesLauncher = ActivitiesTools.isOnAllActivities(visualParent.m.LauncherUrlWithoutIcon); 194 | } 195 | 196 | Component.onCompleted: { 197 | ActivitiesTools.launchersOnActivities = panel.launchersOnActivities 198 | ActivitiesTools.currentActivity = activityInfo.currentActivity; 199 | ActivitiesTools.plasmoid = plasmoid; 200 | // updateOnAllActivitiesLauncher(); 201 | } 202 | 203 | 204 | Component.onDestruction: { 205 | backend.ungrabMouse(visualParent); 206 | panel.signalDraggingState(false); 207 | panel.disableRestoreZoom = false; 208 | checkListHovered.start(); 209 | } 210 | 211 | /// Sub Items 212 | 213 | PlasmaComponents.MenuItem { 214 | id: virtualDesktopsMenuItem 215 | 216 | visible: virtualDesktopInfo.numberOfDesktops > 1 217 | && (visualParent && visualParent.m.IsLauncher !== true 218 | && visualParent.m.IsStartup !== true 219 | && visualParent.m.IsVirtualDesktopChangeable === true) 220 | 221 | enabled: visible 222 | 223 | text: i18n("Move To Desktop") 224 | 225 | Connections { 226 | target: virtualDesktopInfo 227 | 228 | onNumberOfDesktopsChanged: virtualDesktopsMenu.refresh() 229 | onDesktopNamesChanged: virtualDesktopsMenu.refresh() 230 | } 231 | 232 | PlasmaComponents.ContextMenu { 233 | id: virtualDesktopsMenu 234 | 235 | visualParent: virtualDesktopsMenuItem.action 236 | 237 | function refresh() { 238 | clearMenuItems(); 239 | 240 | if (virtualDesktopInfo.numberOfDesktops <= 1) { 241 | return; 242 | } 243 | 244 | var menuItem = menu.newMenuItem(virtualDesktopsMenu); 245 | menuItem.text = i18n("Move To Current Desktop"); 246 | menuItem.enabled = Qt.binding(function() { 247 | return menu.visualParent && menu.visualParent.m.VirtualDesktop != virtualDesktopInfo.currentDesktop; 248 | }); 249 | menuItem.clicked.connect(function() { 250 | tasksModel.requestVirtualDesktop(menu.visualParent.modelIndex(), 0); 251 | }); 252 | 253 | menuItem = menu.newMenuItem(virtualDesktopsMenu); 254 | menuItem.text = i18n("All Desktops"); 255 | menuItem.checkable = true; 256 | menuItem.checked = Qt.binding(function() { 257 | return menu.visualParent && menu.visualParent.m.IsOnAllVirtualDesktops === true; 258 | }); 259 | menuItem.clicked.connect(function() { 260 | tasksModel.requestVirtualDesktop(menu.visualParent.modelIndex(), 0); 261 | }); 262 | backend.setActionGroup(menuItem.action); 263 | 264 | menu.newSeparator(virtualDesktopsMenu); 265 | 266 | for (var i = 0; i < virtualDesktopInfo.desktopNames.length; ++i) { 267 | menuItem = menu.newMenuItem(virtualDesktopsMenu); 268 | //menuItem.text = i18nc("1 = number of desktop, 2 = desktop name", "%1 Desktop %2", i + 1, virtualDesktopInfo.desktopNames[i]); 269 | menuItem.text = (i + 1) + ". " + virtualDesktopInfo.desktopNames[i]; 270 | menuItem.checkable = true; 271 | menuItem.checked = Qt.binding((function(i) { 272 | return function() { return menu.visualParent && menu.visualParent.m.VirtualDesktop == (i + 1) }; 273 | })(i)); 274 | menuItem.clicked.connect((function(i) { 275 | return function() { return tasksModel.requestVirtualDesktop(menu.visualParent.modelIndex(), i + 1); }; 276 | })(i)); 277 | backend.setActionGroup(menuItem.action); 278 | } 279 | 280 | menu.newSeparator(virtualDesktopsMenu); 281 | 282 | menuItem = menu.newMenuItem(virtualDesktopsMenu); 283 | menuItem.text = i18n("New Desktop"); 284 | menuItem.clicked.connect(function() { 285 | tasksModel.requestVirtualDesktop(menu.visualParent.modelIndex(), virtualDesktopInfo.numberOfDesktops + 1) 286 | }); 287 | } 288 | 289 | Component.onCompleted: refresh() 290 | } 291 | } 292 | 293 | 294 | PlasmaComponents.MenuItem { 295 | id: activitiesDesktopsMenuItem 296 | 297 | visible: activityInfo.numberOfRunningActivities > 1 298 | && (visualParent && !visualParent.m.IsLauncher 299 | && !visualParent.m.IsStartup) 300 | 301 | enabled: visible 302 | 303 | text: i18n("Move To &Activity") 304 | 305 | Connections { 306 | target: activityInfo 307 | 308 | onNumberOfRunningActivitiesChanged: activitiesDesktopsMenu.refresh() 309 | } 310 | 311 | PlasmaComponents.ContextMenu { 312 | id: activitiesDesktopsMenu 313 | 314 | visualParent: activitiesDesktopsMenuItem.action 315 | 316 | function refresh() { 317 | clearMenuItems(); 318 | 319 | if (activityInfo.numberOfRunningActivities <= 1) { 320 | return; 321 | } 322 | 323 | var menuItem = menu.newMenuItem(activitiesDesktopsMenu); 324 | menuItem.text = i18n("Add To Current Activity"); 325 | menuItem.enabled = Qt.binding(function() { 326 | return menu.visualParent && menu.visualParent.m.Activities.length > 0 && 327 | menu.visualParent.m.Activities.indexOf(activityInfo.currentActivity) < 0; 328 | }); 329 | menuItem.clicked.connect(function() { 330 | tasksModel.requestActivities(menu.visualParent.modelIndex(), menu.visualParent.m.Activities.concat(activityInfo.currentActivity)); 331 | }); 332 | 333 | menuItem = menu.newMenuItem(activitiesDesktopsMenu); 334 | menuItem.text = i18n("All Activities"); 335 | menuItem.checkable = true; 336 | menuItem.checked = Qt.binding(function() { 337 | return menu.visualParent && menu.visualParent.m.Activities.length === 0; 338 | }); 339 | menuItem.clicked.connect(function() { 340 | var checked = menuItem.checked; 341 | var newActivities = menu.visualParent.m.Activities; 342 | var size = newActivities.length; 343 | 344 | newActivities = undefined; // will cast to an empty QStringList i.e all activities 345 | if (size === 0) { 346 | newActivities = new Array(activityInfo.currentActivity); 347 | } 348 | 349 | tasksModel.requestActivities(menu.visualParent.modelIndex(), newActivities); 350 | }); 351 | 352 | menu.newSeparator(activitiesDesktopsMenu); 353 | 354 | var runningActivities = activityInfo.runningActivities(); 355 | for (var i = 0; i < runningActivities.length; ++i) { 356 | var activityId = runningActivities[i]; 357 | 358 | menuItem = menu.newMenuItem(activitiesDesktopsMenu); 359 | menuItem.text = activityInfo.activityName(runningActivities[i]); 360 | menuItem.checkable = true; 361 | menuItem.checked = Qt.binding( (function(activityId) { 362 | return function() { 363 | return menu.visualParent && menu.visualParent.m.Activities.indexOf(activityId) >= 0; 364 | }; 365 | })(activityId)); 366 | menuItem.clicked.connect((function(activityId) { 367 | return function () { 368 | var checked = menuItem.checked; 369 | var newActivities = menu.visualParent.m.Activities; 370 | var index = newActivities.indexOf(activityId) 371 | 372 | if (index < 0) { 373 | newActivities = newActivities.concat(activityId); 374 | } else { 375 | //newActivities = newActivities.splice(index, 1); //this does not work!!! 376 | newActivities.splice(index, 1); 377 | } 378 | return tasksModel.requestActivities(menu.visualParent.modelIndex(), newActivities); 379 | }; 380 | })(activityId)); 381 | } 382 | 383 | menu.newSeparator(activitiesDesktopsMenu); 384 | } 385 | 386 | Component.onCompleted: refresh() 387 | } 388 | } 389 | 390 | 391 | 392 | PlasmaComponents.MenuItem { 393 | visible: (visualParent 394 | && visualParent.m.IsLauncher !== true 395 | && visualParent.m.IsStartup !== true 396 | && plasmoid.configuration.showWindowActions) 397 | 398 | enabled: visualParent && visualParent.m.IsMinimizable === true 399 | 400 | checkable: true 401 | checked: visualParent && visualParent.m.IsMinimized === true 402 | 403 | text: i18n("Minimize") 404 | 405 | onClicked: tasksModel.requestToggleMinimized(visualParent.modelIndex()) 406 | } 407 | 408 | PlasmaComponents.MenuItem { 409 | visible: (visualParent 410 | && visualParent.m.IsLauncher !== true 411 | && visualParent.m.IsStartup !== true 412 | && plasmoid.configuration.showWindowActions) 413 | 414 | enabled: visualParent && visualParent.m.IsMaximizable === true 415 | 416 | checkable: true 417 | checked: visualParent && visualParent.m.IsMaximized === true 418 | 419 | text: i18n("Maximize") 420 | 421 | onClicked: tasksModel.requestToggleMaximized(visualParent.modelIndex()) 422 | } 423 | 424 | PlasmaComponents.MenuItem { 425 | id: moreActionsMenuItem 426 | 427 | visible: (visualParent 428 | && visualParent.m.IsLauncher !== true 429 | && visualParent.m.IsStartup !== true 430 | && plasmoid.configuration.showWindowActions) 431 | 432 | enabled: visible 433 | 434 | text: i18n("More Actions") 435 | 436 | PlasmaComponents.ContextMenu { 437 | visualParent: moreActionsMenuItem.action 438 | 439 | PlasmaComponents.MenuItem { 440 | enabled: menu.visualParent && menu.visualParent.m.IsMovable === true 441 | 442 | text: i18n("Move") 443 | icon: "transform-move" 444 | 445 | onClicked: tasksModel.requestMove(menu.visualParent.modelIndex()) 446 | } 447 | 448 | PlasmaComponents.MenuItem { 449 | enabled: menu.visualParent && menu.visualParent.m.IsResizable === true 450 | 451 | text: i18n("Resize") 452 | 453 | onClicked: tasksModel.requestResize(menu.visualParent.modelIndex()) 454 | } 455 | 456 | PlasmaComponents.MenuItem { 457 | checkable: true 458 | checked: menu.visualParent && menu.visualParent.m.IsKeepAbove === true 459 | 460 | text: i18n("Keep Above Others") 461 | icon: "go-up" 462 | 463 | onClicked: tasksModel.requestToggleKeepAbove(menu.visualParent.modelIndex()) 464 | } 465 | 466 | PlasmaComponents.MenuItem { 467 | checkable: true 468 | checked: menu.visualParent && menu.visualParent.m.IsKeepBelow === true 469 | 470 | text: i18n("Keep Below Others") 471 | icon: "go-down" 472 | 473 | onClicked: tasksModel.requestToggleKeepBelow(menu.visualParent.modelIndex()) 474 | } 475 | 476 | PlasmaComponents.MenuItem { 477 | enabled: menu.visualParent && menu.visualParent.m.IsFullScreenable === true 478 | 479 | checkable: true 480 | checked: menu.visualParent && menu.visualParent.m.IsFullScreen === true 481 | 482 | text: i18n("Fullscreen") 483 | icon: "view-fullscreen" 484 | 485 | onClicked: tasksModel.requestToggleFullScreen(menu.visualParent.modelIndex()) 486 | } 487 | 488 | PlasmaComponents.MenuItem { 489 | enabled: menu.visualParent && menu.visualParent.m.IsShadeable === true 490 | 491 | checkable: true 492 | checked: menu.visualParent && menu.visualParent.m.IsShaded === true 493 | 494 | text: i18n("Shade") 495 | 496 | onClicked: tasksModel.requestToggleShaded(menu.visualParent.modelIndex()) 497 | } 498 | 499 | PlasmaComponents.MenuItem { 500 | separator: true 501 | } 502 | 503 | PlasmaComponents.MenuItem { 504 | visible: (plasmoid.configuration.groupingStrategy != 0) && menu.visualParent.m.IsWindow === true 505 | 506 | checkable: true 507 | checked: menu.visualParent && menu.visualParent.m.IsGroupable === true 508 | 509 | text: i18n("Allow this program to be grouped") 510 | 511 | onClicked: tasksModel.requestToggleGrouping(menu.visualParent.modelIndex()) 512 | } 513 | } 514 | } 515 | 516 | PlasmaComponents.MenuItem { 517 | id: startNewInstanceItem 518 | visible: (visualParent && visualParent.m.IsLauncher !== true && visualParent.m.IsStartup !== true) 519 | 520 | enabled: visualParent && visualParent.m.LauncherUrlWithoutIcon != null 521 | 522 | text: i18n("Start New Instance") 523 | icon: "system-run" 524 | 525 | onClicked: tasksModel.requestNewInstance(visualParent.modelIndex()) 526 | } 527 | 528 | PlasmaComponents.MenuItem { 529 | separator: true 530 | 531 | visible: (visualParent 532 | && visualParent.m.IsLauncher !== true 533 | && visualParent.m.IsStartup !== true 534 | && plasmoid.configuration.showWindowActions) 535 | } 536 | 537 | PlasmaComponents.MenuItem { 538 | id: launcherToggleOnAllActivitiesAction 539 | visible: launcherToggleAction.visible && launcherToggleAction.checked && activitiesCount > 1 540 | enabled: visualParent && visualParent.m.LauncherUrlWithoutIcon != null 541 | 542 | checkable: true 543 | checked: isOnAllActivitiesLauncher 544 | text: i18n("Show Launcher On All Activities") 545 | 546 | onClicked:{ 547 | ActivitiesTools.toggleLauncherState(visualParent.m.LauncherUrlWithoutIcon); 548 | updateOnAllActivitiesLauncher(); 549 | } 550 | } 551 | 552 | PlasmaComponents.MenuItem { 553 | id: launcherToggleAction 554 | 555 | visible: (visualParent && visualParent.m.IsLauncher !== true && visualParent.m.IsStartup !== true) 556 | 557 | enabled: visualParent && visualParent.m.LauncherUrlWithoutIcon != null 558 | 559 | checkable: true 560 | 561 | text: i18n("Show Launcher When Not Running") 562 | 563 | onClicked: { 564 | if (tasksModel.launcherPosition(visualParent.m.LauncherUrlWithoutIcon) != -1) { 565 | tasksModel.requestRemoveLauncher(visualParent.m.LauncherUrlWithoutIcon); 566 | } else { 567 | tasksModel.requestAddLauncher(visualParent.m.LauncherUrl); 568 | } 569 | } 570 | } 571 | 572 | PlasmaComponents.MenuItem { 573 | visible: (visualParent && visualParent.m.IsLauncher === true) && activitiesCount > 1 574 | 575 | checkable: true 576 | checked: isOnAllActivitiesLauncher 577 | text: i18n("Show Launcher On All Activities") 578 | 579 | onClicked:{ 580 | ActivitiesTools.toggleLauncherState(visualParent.m.LauncherUrlWithoutIcon); 581 | updateOnAllActivitiesLauncher(); 582 | } 583 | } 584 | 585 | PlasmaComponents.MenuItem { 586 | visible: (visualParent && visualParent.m.IsLauncher === true) 587 | 588 | text: i18n("Remove Launcher") 589 | 590 | onClicked: tasksModel.requestRemoveLauncher(visualParent.m.LauncherUrlWithoutIcon); 591 | } 592 | 593 | 594 | 595 | 596 | PlasmaComponents.MenuItem { 597 | property QtObject configureAction: null 598 | 599 | enabled: configureAction && configureAction.enabled 600 | 601 | text: configureAction ? configureAction.text : "" 602 | icon: configureAction ? configureAction.icon : "" 603 | 604 | onClicked: configureAction.trigger() 605 | 606 | Component.onCompleted: configureAction = plasmoid.action("configure") 607 | } 608 | 609 | PlasmaComponents.MenuItem { 610 | separator: true 611 | } 612 | 613 | PlasmaComponents.MenuItem { 614 | id: closeWindowItem 615 | visible: (visualParent && visualParent.m.IsLauncher !== true && visualParent.m.IsStartup !== true) 616 | 617 | enabled: visualParent && visualParent.m.IsClosable === true 618 | 619 | text: i18n("Close") 620 | icon: "window-close" 621 | 622 | onClicked: tasksModel.requestClose(visualParent.modelIndex()) 623 | } 624 | } 625 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/GlowPoint.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import org.kde.plasma.core 2.0 as PlasmaCore 21 | import org.kde.plasma.components 2.0 as Components 22 | 23 | import QtGraphicalEffects 1.0 24 | 25 | Item{ 26 | // property string color 27 | id: glowItem 28 | 29 | property bool roundCorners: true 30 | property bool showAttention: false 31 | 32 | property int animation: plasmoid.configuration.durationTime*units.longDuration 33 | 34 | property color attentionColor: colorScopePalette.negativeTextColor // "#ffff1717" 35 | property color basicColor: "blue" 36 | 37 | onShowAttentionChanged: { 38 | if(showAttention == false){ 39 | smallCircle.color = basicColor; 40 | } 41 | } 42 | 43 | Item{ 44 | id:mainGlow 45 | anchors.fill: parent 46 | 47 | Rectangle { 48 | id: smallCircle 49 | anchors.centerIn: parent 50 | anchors.fill: parent 51 | 52 | color: glowItem.basicColor 53 | radius: glowItem.roundCorners ? Math.min(width,height) / 2 : 0 54 | 55 | 56 | SequentialAnimation{ 57 | running: (glowItem.showAttention == true) 58 | loops: Animation.Infinite 59 | 60 | PropertyAnimation { 61 | target: smallCircle 62 | property: "color" 63 | to: glowItem.attentionColor 64 | duration: glowItem.animation 65 | easing.type: Easing.InOutQuad 66 | } 67 | 68 | PropertyAnimation { 69 | target:smallCircle 70 | property: "color" 71 | to: glowItem.basicColor 72 | duration: glowItem.animation 73 | easing.type: Easing.InOutQuad 74 | } 75 | } 76 | } 77 | 78 | RectangularGlow { 79 | id:recGlow 80 | anchors.fill: smallCircle 81 | glowRadius: 2 * Math.min(smallCircle.width, smallCircle.height) 82 | spread: 0.2 83 | color: smallCircle.color 84 | //color: "#cc222222" 85 | // cornerRadius: smallCircle.radius + glowRadius 86 | opacity: panel.showBarLine ? 0.25 : 0.45 87 | visible: panel.glow 88 | } 89 | 90 | /* BrightnessContrast { 91 | anchors.fill: recGlow 92 | source: recGlow 93 | anchors.margins: 1 94 | brightness: 0.4 95 | contrast: 0.3 96 | visible: panel.glow 97 | }*/ 98 | } 99 | 100 | 101 | 102 | } 103 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/MouseHandler.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | 20 | import QtQuick 2.0 21 | 22 | import org.kde.draganddrop 2.0 23 | 24 | import org.kde.taskmanager 0.1 as TaskManager 25 | 26 | //import "../code/layout.js" as LayoutManager 27 | import "../code/tools.js" as TaskTools 28 | 29 | Item { 30 | // signal urlDropped(url url) 31 | signal urlsDropped(var urls) 32 | 33 | property Item target 34 | property Item ignoredItem 35 | property bool moved: false 36 | 37 | property alias hoveredItem: dropHandler.hoveredItem 38 | property alias onlyLaunchers: dropHandler.onlyLaunchers 39 | 40 | 41 | Timer { 42 | id: ignoreItemTimer 43 | 44 | repeat: false 45 | interval: 120 46 | 47 | onTriggered: { 48 | ignoredItem = null; 49 | } 50 | } 51 | 52 | Connections { 53 | target: panel 54 | 55 | onDragSourceChanged: { 56 | if (!dragSource) { 57 | ignoredItem = null; 58 | ignoreItemTimer.stop(); 59 | } 60 | } 61 | } 62 | 63 | DropArea { 64 | id: dropHandler 65 | 66 | anchors.fill: parent 67 | 68 | preventStealing: true; 69 | 70 | property int droppedPosition: -1; 71 | property bool onlyLaunchers: false; 72 | 73 | property Item hoveredItem 74 | 75 | onDragEnter:{ 76 | if(panel.dragSource == null){ 77 | panel.dropNewLauncher = true; 78 | 79 | var createLaunchers = event.mimeData.urls.every(function (item) { 80 | return backend.isApplication(item) 81 | }); 82 | 83 | 84 | if (createLaunchers) 85 | onlyLaunchers = true; 86 | } 87 | } 88 | 89 | onDragMove: { 90 | if(panel.dragSource == null){ 91 | panel.dropNewLauncher = true; 92 | } 93 | 94 | if (target.animating) { 95 | return; 96 | } 97 | 98 | var above = target.childAtPos(event.x, event.y); 99 | 100 | // If we're mixing launcher tasks with other tasks and are moving 101 | // a (small) launcher task across a non-launcher task, don't allow 102 | // the latter to be the move target twice in a row for a while, as 103 | // it will naturally be moved underneath the cursor as result of the 104 | // initial move, due to being far larger than the launcher delegate. 105 | // TODO: This restriction (minus the timer, which improves things) 106 | // has been proven out in the EITM fork, but could be improved later 107 | // by tracking the cursor movement vector and allowing the drag if 108 | // the movement direction has reversed, etablishing user intent to 109 | // move back. 110 | /* if (panel.dragSource != null 111 | && panel.dragSource.m.IsLauncher === true && above != null 112 | && above.m != null 113 | && above.m.IsLauncher !== true && above == ignoredItem) { 114 | return; 115 | } else { 116 | ignoredItem = null; 117 | }*/ 118 | if (panel.dragSource == null 119 | && ignoredItem == above) 120 | return; 121 | 122 | //at some point it was needed the following && above != ignoredItem 123 | //but know not... strange... && above != ignoredItem 124 | //I use the ignoredItem in order to reduce the move calls as much 125 | //as possible 126 | if (tasksModel.sortMode == TaskManager.TasksModel.SortManual && panel.dragSource && ignoredItem == null) { 127 | var insertAt = TaskTools.insertIndexAt(above, event.x, event.y); 128 | 129 | if (panel.dragSource != above && panel.dragSource.itemIndex != insertAt) { 130 | // console.log(panel.dragSource.itemIndex + " - "+insertAt); 131 | tasksModel.move(panel.dragSource.itemIndex, insertAt); 132 | ignoredItem = above; 133 | ignoreItemTimer.restart(); 134 | } 135 | } else if (!panel.dragSource && above && hoveredItem != above) { 136 | hoveredItem = above; 137 | panel.dropNewLauncher = true; 138 | // activationTimer.restart(); 139 | } else if (!above) { 140 | panel.dropNewLauncher = true; 141 | hoveredItem = null; 142 | // activationTimer.stop(); 143 | } 144 | } 145 | 146 | onDragLeave: { 147 | hoveredItem = null; 148 | panel.dropNewLauncher = false; 149 | onlyLaunchers = false; 150 | activationTimer.stop(); 151 | } 152 | 153 | onDrop: { 154 | // Reject internal drops. 155 | panel.dropNewLauncher = false; 156 | onlyLaunchers = false; 157 | 158 | if (event.mimeData.formats.indexOf("application/x-orgkdeplasmataskmanager_taskbuttonitem") >= 0) { 159 | return; 160 | } 161 | 162 | if (event.mimeData.hasUrls) { 163 | parent.urlsDropped(event.mimeData.urls); 164 | } 165 | } 166 | 167 | Timer { 168 | id: activationTimer 169 | 170 | interval: 250 171 | repeat: false 172 | 173 | onTriggered: { 174 | /* if (parent.hoveredItem.m.IsGroupParent === true) { 175 | groupDialog.visualParent = parent.hoveredItem; 176 | groupDialog.visible = true; 177 | } else if (parent.hoveredItem.m.IsLauncher !== true) { 178 | tasksModel.requestActivate(parent.hoveredItem.modelIndex()); 179 | }*/ 180 | } 181 | } 182 | } 183 | /* 184 | MouseArea { 185 | id: wheelHandler 186 | 187 | anchors.fill: parent 188 | property int wheelDelta: 0; 189 | enabled: plasmoid.configuration.wheelEnabled 190 | 191 | onWheel: wheelDelta = TaskTools.wheelActivateNextPrevTask(wheelDelta, wheel.angleDelta.y); 192 | } */ 193 | } 194 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskActiveItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQuick.Layouts 1.1 21 | import QtGraphicalEffects 1.0 22 | 23 | import org.kde.plasma.core 2.0 as PlasmaCore 24 | import org.kde.plasma.components 2.0 as PlasmaComponents 25 | 26 | 27 | Item{ 28 | width: ( icList.orientation === Qt.Horizontal ) ? wrapper.regulatorWidth : 6 29 | height: ( icList.orientation === Qt.Vertical ) ? wrapper.regulatorHeight : 6 30 | 31 | Rectangle{ 32 | opacity: m.IsActive ? 1 : 0 33 | visible: false 34 | 35 | color: theme.buttonFocusColor 36 | 37 | width: ( icList.orientation === Qt.Horizontal ) ? parent.width : 3 38 | height: ( icList.orientation === Qt.Vertical ) ? parent.height : 3 39 | 40 | anchors.bottom: (panel.position === PlasmaCore.Types.BottomPositioned) ? parent.bottom : undefined 41 | anchors.top: (panel.position === PlasmaCore.Types.TopPositioned) ? parent.top : undefined 42 | anchors.left: (panel.position === PlasmaCore.Types.LeftPositioned) ? parent.left : undefined 43 | anchors.right: (panel.position === PlasmaCore.Types.RightPositioned) ? parent.right : undefined 44 | } 45 | }// active indicator 46 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskGroupItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQuick.Layouts 1.1 21 | import QtGraphicalEffects 1.0 22 | 23 | import org.kde.plasma.core 2.0 as PlasmaCore 24 | import org.kde.plasma.components 2.0 as PlasmaComponents 25 | 26 | Item{ 27 | id:glowFrame 28 | width: ( icList.orientation === Qt.Horizontal ) ? wrapper.regulatorWidth : size 29 | height: ( icList.orientation === Qt.Vertical ) ? wrapper.regulatorHeight : size 30 | 31 | //property int size: Math.ceil( panel.iconSize/13 ) //5 32 | property int size: panel.statesLineSize 33 | 34 | //SystemPalette { id: myPalette; colorGroup: SystemPalette.Active } 35 | property color isActiveColor: theme.buttonFocusColor 36 | //property color isShownColor: plasmoid.configuration.threeColorsWindows ? panel.shownDotColor : isActiveColor 37 | property color isShownColor: isActiveColor 38 | property color minimizedColor: plasmoid.configuration.threeColorsWindows ? panel.minimizedDotColor : isActiveColor 39 | property color notActiveColor: mainItemContainer.hasMinimized ? minimizedColor : isShownColor 40 | 41 | /* Rectangle{ 42 | anchors.fill: parent 43 | border.width: 1 44 | border.color: "yellow" 45 | color: "transparent" 46 | opacity:0.6 47 | }*/ 48 | 49 | Item{ 50 | anchors.centerIn: parent 51 | 52 | width: flowItem.width 53 | height: flowItem.height 54 | 55 | Flow{ 56 | id: flowItem 57 | flow: ( icList.orientation === Qt.Vertical ) ? Flow.TopToBottom : Flow.LeftToRight 58 | 59 | GlowPoint{ 60 | id:firstPoint 61 | visible: ( !IsLauncher ) ? true: false 62 | 63 | basicColor: (mainItemContainer.hasActive) ? 64 | glowFrame.isActiveColor : glowFrame.notActiveColor 65 | 66 | roundCorners: true 67 | showAttention: model.IsDemandingAttention ? true : false 68 | 69 | property int stateWidth: mainItemContainer.isGroupParent ? (wrapper.regulatorWidth - secondPoint.width) : wrapper.regulatorWidth - spacer.width 70 | property int stateHeight: mainItemContainer.isGroupParent ? wrapper.regulatorHeight - secondPoint.height : wrapper.regulatorHeight - spacer.height 71 | 72 | property int animationTime: plasmoid.configuration.durationTime* (0.7*units.longDuration) 73 | 74 | property bool isActive: mainItemContainer.hasActive 75 | || (panel.showPreviews && windowsPreviewDlg.activeItem && (windowsPreviewDlg.activeItem === mainItemContainer)) 76 | 77 | property bool vertical: panel.vertical 78 | 79 | property real scaleFactor: wrapper.scale 80 | 81 | function updateInitialSizes(){ 82 | if(glowFrame){ 83 | if(vertical) 84 | width = glowFrame.size; 85 | else 86 | height = glowFrame.size; 87 | 88 | if(vertical && isActive) 89 | height = stateHeight; 90 | else 91 | height = glowFrame.size; 92 | 93 | if(!vertical && isActive) 94 | width = stateWidth; 95 | else 96 | width = glowFrame.size; 97 | } 98 | } 99 | 100 | 101 | onIsActiveChanged: { 102 | // if(mainItemContainer.hasActive || windowsPreviewDlg.visible) 103 | activeAndReverseAnimation.start(); 104 | } 105 | 106 | onScaleFactorChanged: { 107 | if(!activeAndReverseAnimation.running && !panel.vertical && isActive){ 108 | width = stateWidth; 109 | } 110 | else if (!activeAndReverseAnimation.running && panel.vertical && isActive){ 111 | height = stateHeight; 112 | } 113 | } 114 | 115 | onStateWidthChanged:{ 116 | if(!activeAndReverseAnimation.running && !vertical && isActive) 117 | width = stateWidth; 118 | } 119 | 120 | onStateHeightChanged:{ 121 | if(!activeAndReverseAnimation.running && vertical && isActive) 122 | height = stateHeight; 123 | } 124 | 125 | onVerticalChanged: updateInitialSizes(); 126 | 127 | Component.onCompleted: { 128 | updateInitialSizes(); 129 | 130 | panel.onIconSizeChanged.connect(updateInitialSizes); 131 | } 132 | 133 | NumberAnimation{ 134 | id: activeAndReverseAnimation 135 | target: firstPoint 136 | property: panel.vertical ? "height" : "width" 137 | to: mainItemContainer.hasActive 138 | || (panel.showPreviews && windowsPreviewDlg.activeItem && (windowsPreviewDlg.activeItem === mainItemContainer)) 139 | ? (panel.vertical ? firstPoint.stateHeight : firstPoint.stateWidth) : glowFrame.size 140 | duration: firstPoint.animationTime 141 | easing.type: Easing.InQuad 142 | 143 | onStopped: firstPoint.updateInitialSizes() 144 | } 145 | } 146 | 147 | Item{ 148 | id:spacer 149 | width: mainItemContainer.isGroupParent ? 0.5*glowFrame.size : 0 150 | height: mainItemContainer.isGroupParent ? 0.5*glowFrame.size : 0 151 | } 152 | 153 | GlowPoint{ 154 | id:secondPoint 155 | width: visible ? glowFrame.size : 0 156 | height: width 157 | 158 | basicColor: ((mainItemContainer.hasActive)&&(!(mainItemContainer.hasMinimized))) ? state2Color : state1Color 159 | roundCorners: true 160 | visible: ( mainItemContainer.isGroupParent && plasmoid.configuration.dotsOnActive ) 161 | || (mainItemContainer.isGroupParent && !mainItemContainer.hasActive)? true: false 162 | 163 | //when there is no active window 164 | property color state1Color: mainItemContainer.hasShown ? glowFrame.isShownColor : glowFrame.minimizedColor 165 | //when there is active window 166 | property color state2Color: mainItemContainer.hasMinimized ? glowFrame.minimizedColor : glowFrame.isShownColor 167 | } 168 | } 169 | } 170 | }// number of windows indicator 171 | 172 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskIconBuffers.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtGraphicalEffects 1.0 3 | 4 | import org.kde.plasma.core 2.0 as PlasmaCore 5 | import org.kde.plasma.components 2.0 as PlasmaComponents 6 | 7 | import org.kde.kquickcontrolsaddons 2.0 as KQuickControlAddons 8 | 9 | Component { 10 | id: imageBufferingComponent 11 | Item { 12 | id: yourImageWithLoadedIconContainer 13 | anchors.fill: parent 14 | 15 | visible: false 16 | 17 | property QtObject imageTimer 18 | 19 | function updateImage(){ 20 | if(!imageTimer) 21 | imageTimer = tttTimer.createObject(iconImage); 22 | else{ 23 | imageTimer.loop = 1; 24 | imageTimer.restart(); 25 | } 26 | } 27 | 28 | Item{ 29 | id:fixedIcon 30 | 31 | width: panel.iconSize + 2*shadowImageNoActive.radius 32 | height: width 33 | 34 | visible:false 35 | 36 | KQuickControlAddons.QIconItem{ 37 | id: iconImage 38 | 39 | width: panel.iconSize 40 | height: width 41 | anchors.centerIn: parent 42 | 43 | icon: decoration 44 | state: KQuickControlAddons.QIconItem.DefaultState 45 | 46 | enabled: true 47 | visible: true 48 | 49 | smooth: true 50 | // onIconChanged: updateBuffers(); 51 | 52 | property int counter: 0 53 | 54 | function updateBuffers(){ 55 | if((index !== -1) &&(!centralItem.toBeDestroyed) &&(!mainItemContainer.delayingRemove)){ 56 | if(panel.initializationStep){ 57 | panel.initializationStep = false; 58 | } 59 | 60 | centralItem.firstDrawed = true; 61 | // counter++; 62 | // console.log(counter); 63 | 64 | if(shadowedImage && shadowedImage.source) 65 | shadowedImage.source.destroy(); 66 | 67 | 68 | if(panel.enableShadows == true){ 69 | shadowImageNoActive.grabToImage(function(result) { 70 | shadowedImage.source = result.url 71 | result.destroy(); 72 | }, Qt.size(fixedIcon.width,fixedIcon.height) ); 73 | } 74 | else{ 75 | fixedIcon.grabToImage(function(result) { 76 | shadowedImage.source = result.url; 77 | result.destroy(); 78 | }, Qt.size(fixedIcon.width,fixedIcon.height) ); 79 | } 80 | 81 | mainItemContainer.buffersAreReady = true; 82 | if(!panel.initializatedBuffers) 83 | panel.noInitCreatedBuffers++; 84 | 85 | iconImageBuffer.opacity = 1; 86 | } 87 | } 88 | 89 | Component{ 90 | id:tttTimer 91 | 92 | Timer{ 93 | id:ttt 94 | repeat: true 95 | interval: loop <= 1 ? centralItem.shadowInterval : 2500 96 | 97 | property int loop: 0; 98 | 99 | onTriggered: { 100 | iconImage.updateBuffers(); 101 | 102 | loop++; 103 | 104 | // console.log(loop+' - '+interval); 105 | if(loop > 2) 106 | ttt.destroy(300); 107 | } 108 | 109 | Component.onCompleted: ttt.start(); 110 | }// end of timer 111 | 112 | }//end of component of timer 113 | 114 | Component.onCompleted: { 115 | yourImageWithLoadedIconContainer.updateImage(); 116 | } 117 | 118 | Component.onDestruction: { 119 | if(yourImageWithLoadedIconContainer.imageTimer) 120 | yourImageWithLoadedIconContainer.imageTimer.destroy(); 121 | } 122 | } 123 | } 124 | 125 | DropShadow { 126 | id:shadowImageNoActive 127 | visible: false 128 | width: fixedIcon.width 129 | height: fixedIcon.height 130 | anchors.centerIn: fixedIcon 131 | 132 | radius: centralItem.shadowSize 133 | samples: 2 * radius 134 | color: "#ff080808" 135 | source: fixedIcon 136 | 137 | verticalOffset: 2 138 | } 139 | 140 | Component.onDestruction: { 141 | if(yourImageWithLoadedIconContainer.imageTimer) 142 | yourImageWithLoadedIconContainer.imageTimer.destroy(); 143 | } 144 | } 145 | } 146 | 147 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskIconItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQuick.Layouts 1.1 21 | import QtGraphicalEffects 1.0 22 | 23 | import org.kde.plasma.core 2.0 as PlasmaCore 24 | import org.kde.plasma.components 2.0 as PlasmaComponents 25 | import org.kde.plasma.private.taskmanager 0.1 as TaskManagerApplet 26 | 27 | import org.kde.kquickcontrolsaddons 2.0 as KQuickControlAddons 28 | 29 | //I am using KQuickControlAddons.QIconItem even though onExit it triggers the following error 30 | //QObject::~QObject: Timers cannot be stopped from another thread 31 | //but it increases performance almost to double during animation 32 | 33 | Item{ 34 | id: centralItem 35 | 36 | width: wrapper.regulatorWidth 37 | height: wrapper.regulatorHeight 38 | 39 | //big interval to show shadows only after all the crappy adds and removes of tasks 40 | //have happened 41 | property bool firstDrawed: true 42 | property bool toBeDestroyed: false 43 | 44 | // three intervals in order to create the necessarty buffers from the 45 | // PlasmaCore.IconItem, one big interval for the first creation of the 46 | // plasmoid, a second one for the first creation of a task and a small one 47 | // for simple updates. 48 | // This is done before especially on initialization stage some visuals 49 | // are not ready and empty buffers are created 50 | 51 | //property int firstDrawedInterval: panel.initializationStep ? 2000 : 1000 52 | // property int shadowInterval: firstDrawed ? firstDrawedInterval : 250 53 | property int shadowInterval: firstDrawed ? 1000 : 250 54 | 55 | property int shadowSize : Math.ceil(panel.iconSize / 10) 56 | 57 | readonly property bool smartLauncherEnabled: ((mainItemContainer.isStartup === false) && (plasmoid.configuration.smartLaunchersEnabled)) 58 | readonly property variant iconDecoration: decoration 59 | property QtObject buffers: null 60 | property QtObject smartLauncherItem: null 61 | 62 | /* Rectangle{ 63 | anchors.fill: parent 64 | border.width: 1 65 | border.color: "green" 66 | color: "transparent" 67 | } */ 68 | 69 | Connections{ 70 | target: panel 71 | onZoomFactorChanged: updateImages() 72 | onIconSizeChanged: updateImages() 73 | onEnableShadowsChanged: updateImages() 74 | } 75 | 76 | onIconDecorationChanged: { 77 | updateImages(); 78 | } 79 | 80 | Rectangle{ 81 | id: draggedRectangle 82 | width: iconImageBuffer.width+1 83 | height: iconImageBuffer.height+1 84 | anchors.centerIn: iconImageBuffer 85 | opacity: 0 86 | radius: 3 87 | anchors.margins: 5 88 | 89 | property color tempColor: theme.highlightColor 90 | color: tempColor 91 | border.width: 1 92 | border.color: theme.highlightColor 93 | 94 | onTempColorChanged: tempColor.a = 0.35; 95 | } 96 | 97 | //temporary buffers containing the normal Image icon and the zoomed Image icon 98 | // Image{id:zoomedImage; visible:false} 99 | // Image{id:normalImage; visible:false} 100 | Image{ 101 | id:shadowedImage 102 | anchors.centerIn:iconImageBuffer 103 | // anchors.horizontalCenter: iconImageBuffer.horizontalCenter 104 | //anchors.verticalCenter: iconImageBuffer.verticalCenter 105 | 106 | width:iconImageBuffer.width+2*shadowSize 107 | height:iconImageBuffer.height+2*shadowSize 108 | 109 | //visible: plasmoid.configuration.showShadows 110 | visible: false 111 | 112 | states: State { 113 | name: "reparented" 114 | ParentChange { target: shadowedImage; parent: panel; } 115 | } 116 | 117 | //Corize to use when a window is removed.... 118 | /* Colorize{ 119 | id: removeImageColorizer 120 | source: parent 121 | anchors.fill: parent 122 | 123 | enabled: false 124 | visible: false 125 | 126 | hue: 0 127 | saturation: 0 128 | lightness: 0 129 | }*/ 130 | } 131 | 132 | /* Rectangle{ 133 | anchors.fill: iconImageBuffer 134 | border.width: 1 135 | border.color: "red" 136 | color: "transparent" 137 | }*/ 138 | 139 | KQuickControlAddons.QIconItem{ 140 | id: iconImageBuffer 141 | 142 | // anchors.centerIn: parent 143 | 144 | width: Math.round(newTempSize) //+ 2*centralItem.shadowSize 145 | height: Math.round(width) 146 | icon: decoration 147 | 148 | property int zoomedSize: panel.zoomFactor * panel.iconSize 149 | 150 | property real basicScalingWidth : wrapper.inTempScaling ? (panel.iconSize * wrapper.scaleWidth) : 151 | panel.iconSize * wrapper.scale 152 | property real basicScalingHeight : wrapper.inTempScaling ? (panel.iconSize * wrapper.scaleHeight) : 153 | panel.iconSize * wrapper.scale 154 | 155 | property real newTempSize: (wrapper.opacity == 1) ? Math.min(basicScalingWidth, basicScalingHeight) : 156 | Math.max(basicScalingWidth, basicScalingHeight) 157 | 158 | ///states for launcher animation 159 | states: [ 160 | State{ 161 | name: "*" 162 | when: !launcherAnimation.running && !newWindowAnimation.running 163 | 164 | AnchorChanges{ 165 | target:iconImageBuffer; 166 | anchors.horizontalCenter: parent.horizontalCenter; 167 | anchors.verticalCenter: parent.verticalCenter; 168 | anchors.right: undefined; 169 | anchors.left: undefined; 170 | anchors.top: undefined; 171 | anchors.bottom: undefined; 172 | } 173 | }, 174 | 175 | State{ 176 | name: "animating" 177 | when: launcherAnimation.running || newWindowAnimation.running 178 | 179 | AnchorChanges{ 180 | target:iconImageBuffer; 181 | anchors.horizontalCenter: undefined; 182 | anchors.verticalCenter: undefined; 183 | anchors.right: panel.position === PlasmaCore.Types.LeftPositioned ? parent.right : undefined; 184 | anchors.left: panel.position === PlasmaCore.Types.RightPositioned ? parent.left : undefined; 185 | anchors.top: panel.position === PlasmaCore.Types.BottomPositioned ? parent.top : undefined; 186 | anchors.bottom: panel.position === PlasmaCore.Types.TopPositioned ? parent.bottom : undefined; 187 | } 188 | } 189 | ] 190 | 191 | ///transitions, basic for the anchor changes 192 | transitions: [ 193 | Transition{ 194 | from: "animating" 195 | to: "*" 196 | 197 | AnchorAnimation { duration: 1.5*plasmoid.configuration.durationTime*units.longDuration } 198 | } 199 | ] 200 | } 201 | 202 | ///Shadow in tasks 203 | Loader{ 204 | anchors.fill: iconImageBuffer 205 | active: plasmoid.configuration.showShadows 206 | 207 | sourceComponent: DropShadow{ 208 | anchors.fill: parent 209 | color: "#ff080808" 210 | samples: 2 * radius 211 | source: iconImageBuffer 212 | radius: centralItem.shadowSize 213 | verticalOffset: 2 214 | } 215 | } 216 | 217 | 218 | VisualAddItem{ 219 | id: dropFilesVisual 220 | anchors.fill: iconImageBuffer 221 | 222 | visible: opacity == 0 ? false : true 223 | opacity: panel.dropNewLauncher && !mouseHandler.onlyLaunchers 224 | && (panel.dragSource == null) && (mouseHandler.hoveredItem === mainItemContainer) ? 1 : 0 225 | } 226 | 227 | BrightnessContrast{ 228 | id:hoveredImage 229 | opacity: mainItemContainer.containsMouse ? 1 : 0 230 | anchors.fill: iconImageBuffer 231 | 232 | brightness: 0.25 233 | source: iconImageBuffer 234 | 235 | Behavior on opacity { 236 | NumberAnimation { duration: plasmoid.configuration.durationTime*units.longDuration } 237 | } 238 | } 239 | 240 | BrightnessContrast { 241 | id: brightnessTaskEffect 242 | anchors.fill: iconImageBuffer 243 | source: iconImageBuffer 244 | 245 | visible: clickedAnimation.running 246 | } 247 | 248 | Colorize{ 249 | id: stateColorizer 250 | source: iconImageBuffer 251 | anchors.fill: iconImageBuffer 252 | //visible: false 253 | opacity:0 254 | 255 | hue:0 256 | saturation:0 257 | lightness:0 258 | } 259 | 260 | //Something to show until the buffers are updated 261 | 262 | //KQuickControlAddons.QIconItem{ 263 | /* 264 | PlasmaCore.IconItem{ 265 | id: iconImageBackground 266 | 267 | //property real relatedSize: panel.iconSize * ( (doubleSize - 7) / doubleSize ); 268 | // width: (visible) ? relatedSize * wrapper.scale : panel.iconSize 269 | width: (visible) ? panel.iconSize * wrapper.scale : panel.iconSize 270 | height: width 271 | anchors.centerIn: parent 272 | 273 | // state: wrapper.containsMouse ? KQuickControlAddons.QIconItem.ActiveState : KQuickControlAddons.QIconItem.DefaultState 274 | // icon: decoration 275 | active: wrapper.containsMouse 276 | enabled: true 277 | source: decoration 278 | usesPlasmaTheme: false 279 | 280 | visible: ((iconImageBuffer.opacity == 1) && (panel.enableShadows)) ? false : true 281 | 282 | Component{ 283 | id:hideBackTimer 284 | 285 | Timer{ 286 | id:hideBackgroundTimer 287 | repeat:false 288 | interval: centralItem.shadowInterval 289 | 290 | onTriggered: { 291 | // iconImageBackground.visible = false; 292 | iconImageBuffer.opacity = 1; 293 | hideBackgroundTimer.destroy(); 294 | // iconImageBuffer.visible = false; 295 | } 296 | 297 | Component.onCompleted: hideBackgroundTimer.start(); 298 | } 299 | } 300 | }*/ 301 | 302 | Loader{ 303 | id:defaultWithShadow 304 | //sourceComponent: imageBufferingComponent 305 | sourceComponent: TaskIconBuffers{} 306 | active: mainItemContainer.isStartup ? false : true 307 | } 308 | 309 | Loader { 310 | anchors.fill: iconImageBuffer 311 | asynchronous: true 312 | source: "TaskProgressOverlay.qml" 313 | active: (centralItem.smartLauncherEnabled && centralItem.smartLauncherItem 314 | && centralItem.smartLauncherItem.progressVisible) 315 | } 316 | 317 | ///////Activate animation///// 318 | SequentialAnimation{ 319 | id: clickedAnimation 320 | 321 | property bool pressed: mainItemContainer.pressed 322 | property int speed: plasmoid.configuration.durationTime*units.longDuration 323 | 324 | ParallelAnimation{ 325 | PropertyAnimation { 326 | target: brightnessTaskEffect 327 | property: "brightness" 328 | to: -0.5 329 | duration: clickedAnimation.speed 330 | easing.type: Easing.OutQuad 331 | } 332 | PropertyAnimation { 333 | target: wrapper 334 | property: "scale" 335 | to: panel.taskInAnimation ? 0.9 : wrapper.scale - (panel.zoomFactor - 1) / 2 336 | duration: clickedAnimation.speed 337 | easing.type: Easing.OutQuad 338 | } 339 | } 340 | 341 | ParallelAnimation{ 342 | PropertyAnimation { 343 | target: brightnessTaskEffect 344 | property: "brightness" 345 | to: 0 346 | duration: clickedAnimation.speed 347 | easing.type: Easing.OutQuad 348 | } 349 | PropertyAnimation { 350 | target: wrapper 351 | property: "scale" 352 | to: panel.taskInAnimation ? 1 : panel.zoomFactor 353 | duration: clickedAnimation.speed 354 | easing.type: Easing.OutQuad 355 | } 356 | } 357 | 358 | 359 | onPressedChanged: { 360 | if( (pressed)&& 361 | ((mainItemContainer.lastButtonClicked == Qt.LeftButton)||(mainItemContainer.lastButtonClicked == Qt.MidButton)) ){ 362 | mainItemContainer.animationStarted(); 363 | start(); 364 | } 365 | } 366 | 367 | onStopped: { 368 | if( !mainItemContainer.isDragged){ 369 | mainItemContainer.animationEnded(); 370 | checkListHovered.startDuration(6*units.longDuration); 371 | } 372 | } 373 | } 374 | 375 | 376 | Component.onCompleted: { 377 | if (smartLauncherEnabled && !smartLauncherItem) { 378 | var smartLauncher = Qt.createQmlObject( 379 | " import org.kde.plasma.private.taskmanager 0.1 as TaskManagerApplet; TaskManagerApplet.SmartLauncherItem { }", 380 | centralItem); 381 | 382 | smartLauncher.launcherUrl = Qt.binding(function() { return model.LauncherUrlWithoutIcon; }); 383 | 384 | smartLauncherItem = smartLauncher; 385 | } 386 | } 387 | 388 | Component.onDestruction: { 389 | centralItem.toBeDestroyed = true; 390 | 391 | if(shadowedImage && shadowedImage.source) 392 | shadowedImage.source.destroy(); 393 | 394 | if(removingAnimation.removingItem) 395 | removingAnimation.removingItem.destroy(); 396 | 397 | gc(); 398 | } 399 | ////end of activate animation//// 400 | 401 | ////bouncing task, e.g. on launcher activating and when a new window is 402 | ////added in a group task 403 | SequentialAnimation{ 404 | id:launcherAnimation 405 | 406 | property bool launchedAlready: false 407 | property int speed: plasmoid.configuration.durationTime * 0.8 * units.longDuration 408 | 409 | SequentialAnimation{ 410 | ParallelAnimation{ 411 | PropertyAnimation { 412 | target: wrapper 413 | property: (icList.orientation == Qt.Vertical) ? "tempScaleWidth" : "tempScaleHeight" 414 | to: panel.zoomFactor 415 | duration: launcherAnimation.speed 416 | easing.type: Easing.OutQuad 417 | } 418 | 419 | PropertyAnimation { 420 | target: wrapper 421 | property: (icList.orientation == Qt.Horizontal) ? "tempScaleWidth" : "tempScaleHeight" 422 | to: 1 423 | duration: launcherAnimation.speed 424 | easing.type: Easing.OutQuad 425 | } 426 | } 427 | 428 | PropertyAnimation { 429 | target: wrapper 430 | property: (icList.orientation == Qt.Vertical) ? "tempScaleWidth" : "tempScaleHeight" 431 | to: 1 432 | duration: 3*plasmoid.configuration.durationTime*launcherAnimation.speed 433 | easing.type: Easing.OutBounce 434 | } 435 | 436 | ParallelAnimation{ 437 | PropertyAnimation { 438 | target: wrapper 439 | property: (icList.orientation == Qt.Vertical) ? "tempScaleHeight" : "tempScaleWidth" 440 | to: 1 441 | duration: plasmoid.configuration.durationTime*launcherAnimation.speed 442 | easing.type: Easing.OutBounce 443 | } 444 | 445 | PropertyAnimation { 446 | target: wrapper 447 | property: "scale" 448 | to: 1 449 | duration: plasmoid.configuration.durationTime*launcherAnimation.speed 450 | easing.type: Easing.OutQuad 451 | } 452 | } 453 | } 454 | 455 | 456 | onStopped: { 457 | //wrapper.scale = 1; 458 | /* if ( panel.noTasksInAnimation>0 ) { 459 | panel.noTasksInAnimation--; 460 | } 461 | if ( panel.animations>0 ) { 462 | panel.animations--; 463 | }*/ 464 | //console.log ("Nooo 2: "+panel.noTasksInAnimation + " - "+panel.animations); 465 | clearAnimationsSignals(); 466 | 467 | mainItemContainer.setBlockingAnimation(false); 468 | mainItemContainer.animationEnded(); 469 | mainItemContainer.launcherAction(); 470 | } 471 | 472 | function clearAnimationsSignals() { 473 | if ( launchedAlready && panel.noTasksInAnimation>0 ) { 474 | panel.noTasksInAnimation--; 475 | } 476 | 477 | if ( launchedAlready && panel.animationsNeedThickness>0 ) { 478 | panel.setAnimationsNeedThickness( panel.animationsNeedThickness-1 ); 479 | } 480 | 481 | launchedAlready = false; 482 | } 483 | 484 | function init(){ 485 | //console.log ("Nooo 1 : "+panel.noTasksInAnimation); 486 | if(!launchedAlready) { 487 | launchedAlready = true; 488 | panel.setAnimationsNeedThickness( panel.animationsNeedThickness+1 ); 489 | panel.noTasksInAnimation++; 490 | mainItemContainer.setBlockingAnimation(true); 491 | } 492 | 493 | wrapper.tempScaleWidth = wrapper.scale; 494 | wrapper.tempScaleHeight = wrapper.scale; 495 | 496 | icList.hoveredIndex = -1; 497 | } 498 | 499 | function bounceLauncher(){ 500 | if(panel.zoomFactor > 1){ 501 | mainItemContainer.animationStarted(); 502 | init(); 503 | start(); 504 | } 505 | else 506 | stopped(); 507 | } 508 | 509 | 510 | Component.onCompleted: { 511 | wrapper.runLauncherAnimation.connect(bounceLauncher); 512 | } 513 | 514 | Component.onDestruction: { 515 | clearAnimationsSignals(); 516 | } 517 | } 518 | /////////////////// end of launcher animation 519 | 520 | 521 | ////////////////// new window and needs attention animation 522 | SequentialAnimation{ 523 | id:newWindowAnimation 524 | 525 | property int speed: plasmoid.configuration.durationTime*units.longDuration 526 | property bool isDemandingAttention: (IsDemandingAttention === true) ? true : false 527 | property bool entered: mainItemContainer.mouseEntered 528 | property bool needsThicknessSent: false //flag to check if the signal for thickness was sent 529 | 530 | SequentialAnimation{ 531 | ParallelAnimation{ 532 | PropertyAnimation { 533 | target: wrapper 534 | property: (icList.orientation == Qt.Vertical) ? "tempScaleWidth" : "tempScaleHeight" 535 | to: 1 + (0.6 * (panel.zoomFactor-1)) 536 | duration: newWindowAnimation.speed 537 | easing.type: Easing.OutQuad 538 | } 539 | 540 | PropertyAnimation { 541 | target: wrapper 542 | property: (icList.orientation == Qt.Horizontal) ? "tempScaleWidth" : "tempScaleHeight" 543 | to: 1 544 | duration: newWindowAnimation.speed 545 | easing.type: Easing.OutQuad 546 | } 547 | } 548 | 549 | PropertyAnimation { 550 | target: wrapper 551 | property: (icList.orientation == Qt.Vertical) ? "tempScaleWidth" : "tempScaleHeight" 552 | to: 1 553 | duration: 3*plasmoid.configuration.durationTime*newWindowAnimation.speed 554 | easing.type: Easing.OutBounce 555 | } 556 | } 557 | 558 | function clear(){ 559 | loops = 1; 560 | newWindowAnimation.stop(); 561 | // iconImageBuffer.anchors.centerIn = iconImageBuffer.parent; 562 | 563 | wrapper.tempScaleWidth = 1; 564 | wrapper.tempScaleHeight = 1; 565 | } 566 | 567 | onStopped: { 568 | sendEndOfNeedThicknessAnimation(); 569 | clear(); 570 | } 571 | 572 | onIsDemandingAttentionChanged: { 573 | if( (!isDemandingAttention)&&(running)){ 574 | clear(); 575 | // wrapper.animationEnded(); 576 | } 577 | else if(isDemandingAttention){ 578 | bounceNewWindow(); 579 | } 580 | } 581 | 582 | function sendEndOfNeedThicknessAnimation(){ 583 | if (needsThicknessSent) { 584 | needsThicknessSent = false; 585 | if (panel.animationsNeedThickness > 0) { 586 | panel.setAnimationsNeedThickness( panel.animationsNeedThickness-1 ); 587 | } 588 | } 589 | } 590 | 591 | function init(){ 592 | wrapper.tempScaleWidth = wrapper.scale; 593 | wrapper.tempScaleHeight = wrapper.scale; 594 | 595 | if(!isDemandingAttention) 596 | loops = 2; 597 | else 598 | loops = 20; 599 | 600 | if (!needsThicknessSent) { 601 | needsThicknessSent = true; 602 | panel.setAnimationsNeedThickness( panel.animationsNeedThickness+1 ); 603 | } 604 | 605 | // icList.hoveredIndex = -1; 606 | } 607 | 608 | function bounceNewWindow(){ 609 | newWindowAnimation.init(); 610 | start(); 611 | } 612 | 613 | Component.onCompleted: { 614 | mainItemContainer.groupWindowAdded.connect(bounceNewWindow); 615 | } 616 | 617 | Component.onDestruction: { 618 | sendEndOfNeedThicknessAnimation(); 619 | } 620 | } 621 | 622 | /////Removing a Window from a group//// 623 | 624 | Item{ 625 | id:removingAnimation 626 | 627 | function init(){ 628 | var relavantPoint 629 | if(plasmoid.configuration.showShadows) 630 | relavantPoint = panel.mapFromItem(shadowedImage,0,0); 631 | else 632 | relavantPoint = panel.mapFromItem(iconImageBuffer,0,0); 633 | 634 | 635 | var removingItem = removeTaskComponent.createObject(panel); 636 | removingItem.x = relavantPoint.x; 637 | removingItem.y = relavantPoint.y; 638 | 639 | removingItem.start(); 640 | } 641 | 642 | function removeTask(){ 643 | if(centralItem.firstDrawed && !centralItem.toBeDestroyed 644 | && mainItemContainer.buffersAreReady && plasmoid.configuration.showShadows 645 | && windowSystem.compositingActive){ 646 | removingAnimation.init(); 647 | } 648 | } 649 | 650 | 651 | Component.onCompleted: { 652 | mainItemContainer.groupWindowRemoved.connect(removeTask); 653 | } 654 | 655 | ///////////// Component for animating removing window from group 656 | 657 | Component { 658 | id: removeTaskComponent 659 | Item{ 660 | id: removeTask 661 | width: plasmoid.configuration.showShadows ? shadowedImage.width : iconImageBuffer.width 662 | height: plasmoid.configuration.showShadows ? shadowedImage.height : iconImageBuffer.height 663 | //parent: panel 664 | 665 | visible: false 666 | 667 | Image { 668 | id: tempRemoveIcon 669 | source: plasmoid.configuration.showShadows ? shadowedImage.source : iconImageBuffer.source 670 | anchors.fill: parent 671 | } 672 | 673 | Colorize{ 674 | source: tempRemoveIcon 675 | anchors.fill: tempRemoveIcon 676 | 677 | hue: 0 678 | saturation: 0 679 | lightness: 0 680 | } 681 | 682 | ParallelAnimation{ 683 | id: componentRemoveAnimation 684 | 685 | property int speed: 2*plasmoid.configuration.durationTime*units.longDuration 686 | property Item removingItem: parent 687 | property int toPoint: 0 688 | 689 | PropertyAnimation { 690 | target: removeTask 691 | property: "opacity" 692 | to: 0 693 | duration: componentRemoveAnimation.speed 694 | easing.type: Easing.InQuad 695 | } 696 | 697 | PropertyAnimation { 698 | target: removeTask 699 | property: (icList.orientation == Qt.Horizontal) ? "y" : "x" 700 | to: componentRemoveAnimation.toPoint 701 | duration: componentRemoveAnimation.speed 702 | easing.type: Easing.InQuad 703 | } 704 | 705 | onStopped: { 706 | removeTask.destroy(); 707 | gc(); 708 | } 709 | } 710 | 711 | function start(){ 712 | var tempPoint = 0; 713 | 714 | if(icList.orientation == Qt.Horizontal) 715 | tempPoint = y; 716 | else 717 | tempPoint = x; 718 | 719 | if( (panel.position === PlasmaCore.Types.BottomPositioned) || 720 | (panel.position === PlasmaCore.Types.RightPositioned) ){ 721 | componentRemoveAnimation.toPoint = tempPoint + panel.iconSize; 722 | } 723 | else{ 724 | componentRemoveAnimation.toPoint = tempPoint - panel.iconSize; 725 | } 726 | 727 | visible = true; 728 | componentRemoveAnimation.start(); 729 | } 730 | 731 | } 732 | } 733 | } 734 | 735 | //////////// States //////////////////// 736 | states: [ 737 | State{ 738 | name: "*" 739 | when: !mainItemContainer.isDragged 740 | }, 741 | 742 | State{ 743 | name: "isDragged" 744 | when: ( (mainItemContainer.isDragged) && (plasmoid.immutable) ) 745 | 746 | // PropertyChanges { target: clickedAnimation; running:false } 747 | PropertyChanges { target: wrapper; scale:1 + ((panel.zoomFactor - 1) / 2)} 748 | } 749 | ] 750 | 751 | //////////// Transitions ////////////// 752 | 753 | transitions: [ 754 | Transition{ 755 | id: isDraggedTransition 756 | to: "isDragged" 757 | property int speed: plasmoid.configuration.durationTime*units.longDuration 758 | 759 | SequentialAnimation{ 760 | ParallelAnimation{ 761 | PropertyAnimation { 762 | target: draggedRectangle 763 | property: "opacity" 764 | to: 1 765 | duration: isDraggedTransition.speed 766 | easing.type: Easing.OutQuad 767 | } 768 | 769 | PropertyAnimation { 770 | target: iconImageBuffer 771 | property: "opacity" 772 | to: 0 773 | duration: isDraggedTransition.speed 774 | easing.type: Easing.OutQuad 775 | } 776 | 777 | PropertyAnimation { 778 | target: stateColorizer 779 | property: "opacity" 780 | to: 1 781 | duration: isDraggedTransition.speed 782 | easing.type: Easing.OutQuad 783 | } 784 | } 785 | } 786 | 787 | onRunningChanged: { 788 | if(running){ 789 | mainItemContainer.animationStarted(); 790 | //panel.animations++; 791 | panel.updateScale(index-1, 1, 0); 792 | panel.updateScale(index+1, 1, 0); 793 | } 794 | } 795 | }, 796 | Transition{ 797 | id: defaultTransition 798 | from: "isDragged" 799 | to: "*" 800 | property int speed: plasmoid.configuration.durationTime*units.longDuration 801 | 802 | SequentialAnimation{ 803 | ParallelAnimation{ 804 | PropertyAnimation { 805 | target: draggedRectangle 806 | property: "opacity" 807 | to: 0 808 | duration: defaultTransition.speed 809 | easing.type: Easing.OutQuad 810 | } 811 | 812 | PropertyAnimation { 813 | target: iconImageBuffer 814 | property: "opacity" 815 | to: 1 816 | duration: defaultTransition.speed 817 | easing.type: Easing.OutQuad 818 | } 819 | 820 | PropertyAnimation { 821 | target: stateColorizer 822 | property: "opacity" 823 | to: 0 824 | duration: isDraggedTransition.speed 825 | easing.type: Easing.OutQuad 826 | } 827 | } 828 | 829 | PropertyAnimation { 830 | target: wrapper 831 | property: "scale" 832 | to: 1; 833 | duration: isDraggedTransition.speed 834 | easing.type: Easing.OutQuad 835 | } 836 | 837 | } 838 | 839 | onRunningChanged: { 840 | if(!running){ 841 | var halfZoom = 1 + ((panel.zoomFactor - 1) / 2); 842 | panel.updateScale(index-1, halfZoom, 0); 843 | panel.updateScale(index+1, halfZoom, 0); 844 | 845 | mainItemContainer.animationEnded(); 846 | // panel.animations--; 847 | } 848 | } 849 | } 850 | ] 851 | 852 | 853 | ////////////////////////// 854 | 855 | function updateImages(){ 856 | if(panel){ 857 | if(defaultWithShadow.item){ 858 | defaultWithShadow.item.updateImage(); 859 | } 860 | } 861 | } 862 | 863 | 864 | }// Icon Item 865 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskProgressOverlay.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | 21 | import org.kde.plasma.core 2.0 as PlasmaCore 22 | 23 | Item { 24 | id: background 25 | anchors.fill: parent 26 | 27 | CircleText { 28 | id: progressCircle 29 | width: 0.42 * parent.height 30 | height: width 31 | numberValue: centralItem.smartLauncherItem.count 32 | fullCircle: true 33 | showNumber: true 34 | proportion: centralItem.smartLauncherItem.progress / 100 35 | 36 | states: [ 37 | State { 38 | name: "left" 39 | when: (panel.position === PlasmaCore.Types.LeftPositioned) 40 | 41 | AnchorChanges { 42 | target: progressCircle 43 | anchors{ top:background.top; bottom:undefined; left:undefined; right:background.right;} 44 | } 45 | }, 46 | State { 47 | name: "right" 48 | when: (panel.position === PlasmaCore.Types.RightPositioned) 49 | 50 | AnchorChanges { 51 | target: progressCircle 52 | anchors{ top:background.top; bottom:undefined; left:background.left; right:undefined;} 53 | } 54 | }, 55 | State { 56 | name: "bottom" 57 | when: (panel.position === PlasmaCore.Types.BottomPositioned) 58 | 59 | AnchorChanges { 60 | target: progressCircle 61 | anchors{ top:background.top; bottom:undefined; left:undefined; right:background.right;} 62 | } 63 | }, 64 | State { 65 | name: "top" 66 | when: (panel.position === PlasmaCore.Types.TopPositioned) 67 | 68 | AnchorChanges { 69 | target: progressCircle 70 | anchors{ top:background.top; bottom:undefined; left:undefined; right:background.right;} 71 | } 72 | } 73 | ] 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/TaskWindows.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | import QtQml.Models 2.2 21 | 22 | //trying to do a very simple thing to count how many windows does 23 | //a task instace has... 24 | //Workaround the mess with launchers, startups, windows etc. 25 | 26 | Item{ 27 | id: windowsContainer 28 | property int windowsCount: 0 29 | 30 | property bool isLauncher: IsLauncher ? true : false 31 | property bool isStartup: IsStartup ? true : false 32 | property bool isWindow: IsWindow ? true : false 33 | 34 | onIsLauncherChanged: updateCounter(); 35 | // onIsStartupChanged: updateCounter(); 36 | // onIsWindowChanged: updateCounter(); 37 | 38 | //states that exist in windows in a Group of windows 39 | property bool hasMinimized: false; 40 | property bool hasShown: false; 41 | property bool hasActive: false; 42 | 43 | //FIXME: For some reason the index is not updated correctly in some cases (e.g. window dragging, repositioning launchers) 44 | // and this way much beautiful information are lost, an activity change back and return, 45 | // it fixes this sometimes... 46 | DelegateModel { 47 | id: windowsLocalModel 48 | model: tasksModel //icList.model 49 | rootIndex: tasksModel.makeModelIndex(currentIndex >=0 ? currentIndex : index) 50 | 51 | property int currentIndex: -1 52 | 53 | delegate: Item{ 54 | property string title: model.display 55 | } 56 | 57 | onCountChanged:{ 58 | windowsContainer.updateCounter(); 59 | } 60 | } 61 | 62 | function initializeStates(){ 63 | hasMinimized = false; 64 | hasShown = false; 65 | hasActive = false; 66 | 67 | if(IsGroupParent){ 68 | checkInternalStates(); 69 | } 70 | else{ 71 | if(mainItemContainer.isMinimized){ 72 | hasMinimized = true; 73 | } 74 | else if(mainItemContainer.isActive) 75 | hasActive = true; 76 | else 77 | hasShown = true; 78 | } 79 | } 80 | 81 | function checkInternalStates(){ 82 | windowsLocalModel.currentIndex = index; 83 | var childs = windowsLocalModel.items; 84 | 85 | for(var i=0; i 0) { 111 | title = title.substring(0, lst); 112 | }*/ 113 | 114 | result.push(title); 115 | } 116 | 117 | return result; 118 | } 119 | 120 | 121 | Component.onCompleted: { 122 | mainItemContainer.checkWindowsStates.connect(initializeStates); 123 | updateCounter(); 124 | } 125 | 126 | function updateCounter(){ 127 | // console.log("--------- "+ index+" -------"); 128 | if(index>=0){ 129 | if(IsGroupParent){ 130 | windowsLocalModel.currentIndex = index; 131 | var tempC = windowsLocalModel.count; 132 | 133 | if (tempC == 0){ 134 | if(isLauncher){ 135 | windowsCount = 0; 136 | } 137 | else if(isWindow || isStartup){ 138 | windowsCount = 1; 139 | } 140 | } 141 | else{ 142 | windowsCount = tempC; 143 | } 144 | } 145 | else{ 146 | if(isLauncher){ 147 | windowsCount = 0; 148 | } 149 | else if(isWindow || isStartup){ 150 | windowsCount = 1; 151 | } 152 | } 153 | 154 | initializeStates(); 155 | } 156 | 157 | } 158 | 159 | } 160 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/ToolTipDelegate.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 by Sebastian Kügler 3 | * Copyright 2014 by Martin Gräßlin 4 | * Copyright 2016 by Kai Uwe Broulik 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU Library General Public License as 8 | * published by the Free Software Foundation; either version 2, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU Library General Public License for more details 15 | * 16 | * You should have received a copy of the GNU Library General Public 17 | * License along with this program; if not, write to the 18 | * Free Software Foundation, Inc., 19 | * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 20 | */ 21 | 22 | import QtQuick 2.0 23 | import QtQuick.Layouts 1.1 24 | import QtGraphicalEffects 1.0 25 | 26 | import org.kde.plasma.core 2.0 as PlasmaCore 27 | import org.kde.plasma.components 2.0 as PlasmaComponents 28 | import org.kde.plasma.extras 2.0 as PlasmaExtras 29 | import org.kde.kquickcontrolsaddons 2.0 as KQuickControlsAddons 30 | 31 | //Column { 32 | MouseArea{ 33 | id: tooltipContentItem 34 | hoverEnabled: true 35 | 36 | property Item toolTip 37 | property var parentIndex 38 | property var titles 39 | property var windows 40 | property string mainText 41 | property string subText 42 | property variant icon 43 | property url launcherUrl 44 | property bool group: windows ? (windows.length > 1) : false 45 | 46 | readonly property int thumbnailWidth: units.gridUnit * 15 47 | readonly property int thumbnailHeight: units.gridUnit * 10 48 | 49 | property int preferredTextWidth: theme.mSize(theme.defaultFont).width * 30 50 | property int _s: units.largeSpacing / 2 51 | 52 | Layout.minimumWidth: Math.max(thumbnailWidth, windowRow.width, appLabelRow.width) + _s 53 | Layout.minimumHeight: childrenRect.height 54 | Layout.maximumWidth: Layout.minimumWidth 55 | Layout.maximumHeight: Layout.minimumHeight 56 | 57 | onContainsMouseChanged: { 58 | checkMouseInside(); 59 | } 60 | 61 | function checkMouseInside(){ 62 | var isInside = containsMouse || windowRow.containsMouse(); 63 | if (isInside){ 64 | toolTipDelegate.currentItem = parentIndex; 65 | } 66 | else{ 67 | toolTipDelegate.currentItem = -1; 68 | checkListHovered.restart(); 69 | } 70 | } 71 | 72 | states: State { 73 | when: mpris2Source.hasPlayer 74 | 75 | PropertyChanges { 76 | target: thumbnailSourceItem 77 | opacity: 0 // cannot set visible to false or else WindowThumbnail won't provide thumbnail 78 | } 79 | PropertyChanges { 80 | target: playerControlsOpacityMask 81 | visible: true 82 | source: thumbnailSourceItem 83 | maskSource: playerControlsShadowMask 84 | } 85 | PropertyChanges { 86 | target: playerControlsRow 87 | visible: mpris2Source.hasPlayer 88 | } 89 | } 90 | 91 | PlasmaCore.DataSource { 92 | id: mpris2Source 93 | readonly property string current: { 94 | var desktopFileName = launcherUrl.toString().split('/').pop().replace(".desktop", "") 95 | 96 | for (var i = 0, length = sources.length; i < length; ++i) { 97 | var source = sources[i]; 98 | var sourceData = data[source]; 99 | 100 | if (sourceData && sourceData.DesktopEntry === desktopFileName) { 101 | return source 102 | } 103 | } 104 | 105 | return "" 106 | } 107 | 108 | readonly property bool hasPlayer: !!current 109 | 110 | readonly property bool playing: hasPlayer && data[current].PlaybackStatus === "Playing" 111 | readonly property bool canControl: hasPlayer && data[current].CanControl 112 | readonly property bool canGoBack: hasPlayer && data[current].CanGoPrevious 113 | readonly property bool canGoNext: hasPlayer && data[current].CanGoNext 114 | readonly property bool canRaise: hasPlayer && data[current].CanRaise 115 | 116 | readonly property var currentMetadata: hasPlayer ? data[current].Metadata : ({}) 117 | 118 | readonly property string track: { 119 | var xesamTitle = currentMetadata["xesam:title"] 120 | if (xesamTitle) { 121 | return xesamTitle 122 | } 123 | // if no track title is given, print out the file name 124 | var xesamUrl = currentMetadata["xesam:url"] ? currentMetadata["xesam:url"].toString() : "" 125 | if (!xesamUrl) { 126 | return "" 127 | } 128 | var lastSlashPos = xesamUrl.lastIndexOf('/') 129 | if (lastSlashPos < 0) { 130 | return "" 131 | } 132 | var lastUrlPart = xesamUrl.substring(lastSlashPos + 1) 133 | return decodeURIComponent(lastUrlPart) 134 | } 135 | readonly property string artist: currentMetadata["xesam:artist"] || "" 136 | readonly property string albumArt: currentMetadata["mpris:artUrl"] || "" 137 | 138 | function goPrevious() { 139 | startOperation("Previous") 140 | } 141 | 142 | function goNext() { 143 | startOperation("Next") 144 | } 145 | 146 | function playPause() { 147 | startOperation("PlayPause") 148 | } 149 | 150 | function raise() { 151 | startOperation("Raise") 152 | } 153 | 154 | function startOperation(op) { 155 | var service = mpris2Source.serviceForSource(current) 156 | var operation = service.operationDescription(op) 157 | return service.startOperationCall(operation) 158 | } 159 | 160 | engine: "mpris2" 161 | connectedSources: sources 162 | } 163 | 164 | Column{ 165 | spacing: _s 166 | 167 | Item { 168 | id: thumbnailContainer 169 | width: Math.max(tooltipContentItem.width, windowRow.width) 170 | height: albumArtImage.available ? albumArtImage.height : 171 | raisePlayerArea.visible ? raisePlayerArea.height : 172 | windowRow.height 173 | 174 | Item { 175 | id: thumbnailSourceItem 176 | anchors.fill: parent 177 | 178 | PlasmaExtras.ScrollArea { 179 | id: scrollArea 180 | anchors.horizontalCenter: parent.horizontalCenter 181 | width: Math.max(windowRow.width, thumbnailWidth) 182 | height: parent.height 183 | 184 | visible: !albumArtImage.available 185 | 186 | verticalScrollBarPolicy: Qt.ScrollBarAlwaysOff 187 | horizontalScrollBarPolicy: Qt.ScrollBarAlwaysOff 188 | 189 | Component.onCompleted: { 190 | flickableItem.interactive = Qt.binding(function() { 191 | return contentItem.width > viewport.width; 192 | }); 193 | } 194 | 195 | Row { 196 | id: windowRow 197 | width: childrenRect.width 198 | height: childrenRect.height 199 | spacing: units.largeSpacing 200 | 201 | Repeater { 202 | model: (plasmoid.configuration.showToolTips && !albumArtImage.available) 203 | || !windowSystem.compositingActive ? windows : null 204 | 205 | Column{ 206 | PlasmaCore.WindowThumbnail { 207 | id: windowThumbnail 208 | 209 | width: thumbnailWidth 210 | height: thumbnailHeight 211 | 212 | winId: modelData 213 | 214 | ToolTipWindowMouseArea { 215 | anchors.fill: parent 216 | modelIndex: tasksModel.makeModelIndex(parentIndex, group ? index : -1) 217 | winId: modelData 218 | thumbnailItem: parent 219 | } 220 | } 221 | 222 | PlasmaComponents.Label{ 223 | text: titles && titles[index] ? titles[index] : "" 224 | wrapMode: Text.Wrap 225 | font.italic: true 226 | elide: Text.ElideRight 227 | opacity: 0.7 228 | textFormat: Text.PlainText 229 | verticalAlignment: Text.AlignVCenter 230 | 231 | width: thumbnailWidth 232 | } 233 | } 234 | 235 | } 236 | 237 | function containsMouse(){ 238 | for(var i=0; i 3 | * Copyright 2014 by Martin Gräßlin 4 | * Copyright 2016 by Kai Uwe Broulik 5 | * 6 | * This program is free software; you can redistribute it and/or modify 7 | * it under the terms of the GNU Library General Public License as 8 | * published by the Free Software Foundation; either version 2, or 9 | * (at your option) any later version. 10 | * 11 | * This program is distributed in the hope that it will be useful, 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | * GNU Library General Public License for more details 15 | * 16 | * You should have received a copy of the GNU Library General Public 17 | * License along with this program; if not, write to the 18 | * Free Software Foundation, Inc., 19 | * 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 20 | */ 21 | 22 | import QtQuick 2.0 23 | 24 | import org.kde.plasma.components 2.0 as PlasmaComponents 25 | 26 | MouseArea { 27 | property var modelIndex 28 | property int winId // FIXME Legacy 29 | property Item thumbnailItem 30 | 31 | acceptedButtons: Qt.LeftButton 32 | hoverEnabled: true 33 | enabled: winId != 0 34 | 35 | onClicked: { 36 | tasksModel.requestActivate(modelIndex); 37 | windowsPreviewDlg.hide(); 38 | //toolTip.hideToolTip(); 39 | } 40 | 41 | onContainsMouseChanged: { 42 | tooltipContentItem.checkMouseInside(); 43 | 44 | panel.windowsHovered([winId], containsMouse); 45 | } 46 | 47 | PlasmaComponents.ToolButton { 48 | anchors { 49 | top: parent.top 50 | topMargin: thumbnailItem ? (thumbnailItem.height - thumbnailItem.paintedHeight) / 2 : 0 51 | right: parent.right 52 | rightMargin: thumbnailItem ? (thumbnailItem.width - thumbnailItem.paintedWidth) / 2 : 0 53 | } 54 | 55 | iconSource: "window-close" 56 | visible: parent.containsMouse && winId != 0 57 | tooltip: i18nc("close this window", "Close") 58 | 59 | onClicked: tasksModel.requestClose(modelIndex); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /nowdockplasmoid/contents/ui/VisualAddItem.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2013 Michail Vourlakos 3 | * 4 | * This program is free software; you can redistribute it and/or modify 5 | * it under the terms of the GNU General Public License as published by 6 | * the Free Software Foundation; either version 2 of the License, or 7 | * (at your option) any later version. 8 | * 9 | * This program is distributed in the hope that it will be useful, 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 | * GNU General Public License for more details. 13 | * 14 | * You should have received a copy of the GNU General Public License 15 | * along with this program; if not, write to the Free Software 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 2.010-1301, USA. 17 | */ 18 | 19 | import QtQuick 2.0 20 | 21 | import org.kde.plasma.core 2.0 as PlasmaCore 22 | 23 | Item{ 24 | Rectangle{ 25 | anchors.fill: parent 26 | 27 | anchors.bottom: (panel.position === PlasmaCore.Types.TopPositioned) ? parent.bottom : undefined 28 | anchors.top: (panel.position === PlasmaCore.Types.BottomPositioned) ? parent.top : undefined 29 | anchors.left: (panel.position === PlasmaCore.Types.RightPositioned) ? parent.left : undefined 30 | anchors.right: (panel.position === PlasmaCore.Types.LeftPositioned) ? parent.right : undefined 31 | 32 | radius: panel.iconSize/10 33 | 34 | property color tempColor: "#aa222222" 35 | color: tempColor 36 | border.width: 1 37 | border.color: "#ff656565" 38 | 39 | property int crossSize: Math.min(parent.width/2, parent.height/2) 40 | 41 | Rectangle{width: parent.crossSize; height: 4; anchors.centerIn: parent; color: theme.highlightColor} 42 | Rectangle{width: 4; height: parent.crossSize; anchors.centerIn: parent; color: theme.highlightColor} 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /nowdockplasmoid/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Name=Now Dock 3 | Name[el]=Now Dock 4 | Name[pl]=Now Dock 5 | Name[zh_TW]=Now Dock 6 | Comment=Switch between running applications 7 | Comment[el]=Εναλλαγή μεταξύ ενεργών εφαρμογών 8 | Comment[pl]=Przełączanie między uruchomionymi aplikacjami 9 | Comment[zh_TW]=在執行中的應用程式間切換 10 | 11 | 12 | Type=Service 13 | Icon=preferences-system-windows 14 | X-KDE-ServiceTypes=Plasma/Applet 15 | X-Plasma-API=declarativeappletscript 16 | X-Plasma-MainScript=ui/main.qml 17 | X-Plasma-Provides=org.kde.plasma.multitasking 18 | X-KDE-PluginInfo-Author=Michail Vourlakos 19 | X-KDE-PluginInfo-Email=mvourlakos@gmail.com 20 | X-KDE-PluginInfo-Name=org.kde.store.nowdock.plasmoid 21 | X-KDE-PluginInfo-Version=0.4.90 22 | X-KDE-PluginInfo-Website=https://store.kde.org/p/1151047/ 23 | X-KDE-PluginInfo-Category=Windows and Tasks 24 | X-KDE-PluginInfo-Depends= 25 | X-KDE-PluginInfo-License=GPL v2+ 26 | X-KDE-PluginInfo-EnabledByDefault=true 27 | 28 | -------------------------------------------------------------------------------- /po/Messages.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | BASEDIR=".." # root of translatable sources 4 | PROJECT="plasma_applet_org.kde.store.nowdock.plasmoid" # project name 5 | PROJECTPATH="../nowdockplasmoid" # project path 6 | BUGADDR="https://github.com/psifidotos/nowdock-plasmoid/" # MSGID-Bugs 7 | WDIR="`pwd`" # working dir 8 | 9 | echo "Preparing rc files" 10 | 11 | # we use simple sorting to make sure the lines do not jump around too much from system to system 12 | find "${BASEDIR}" -name '*.rc' -o -name '*.ui' -o -name '*.kcfg' | sort > "${WDIR}/rcfiles.list" 13 | xargs --arg-file="${WDIR}/rcfiles.list" extractrc > "${WDIR}/rc.cpp" 14 | 15 | # additional string for KAboutData 16 | # echo 'i18nc("NAME OF TRANSLATORS","Your names");' >> "${WDIR}/rc.cpp" 17 | # echo 'i18nc("EMAIL OF TRANSLATORS","Your emails");' >> "${WDIR}/rc.cpp" 18 | 19 | intltool-extract --quiet --type=gettext/ini ../metadata.desktop.template 20 | cat ../metadata.desktop.template.h >> ${WDIR}/rc.cpp 21 | rm ../metadata.desktop.template.h 22 | 23 | 24 | # echo "Done preparing rc files" 25 | echo "Extracting messages" 26 | 27 | # see above on sorting 28 | 29 | find "${BASEDIR}" -name '*.cpp' -o -name '*.h' -o -name '*.c' -o -name '*.qml' | sort > "${WDIR}/infiles.list" 30 | echo "rc.cpp" >> "${WDIR}/infiles.list" 31 | 32 | xgettext --from-code=UTF-8 -C -kde -ci18n -ki18n:1 -ki18nc:1c,2 -ki18np:1,2 -ki18ncp:1c,2,3 \ 33 | -ktr2i18n:1 -kI18N_NOOP:1 -kI18N_NOOP2:1c,2 -kN_:1 -kaliasLocale -kki18n:1 -kki18nc:1c,2 \ 34 | -kki18np:1,2 -kki18ncp:1c,2,3 --msgid-bugs-address="${BUGADDR}" --files-from=infiles.list \ 35 | -D "${BASEDIR}" -D "${WDIR}" -o "${PROJECT}.pot" || \ 36 | { echo "error while calling xgettext. aborting."; exit 1; } 37 | echo "Done extracting messages" 38 | 39 | echo "Merging translations" 40 | catalogs=`find . -name '*.po'` 41 | for cat in $catalogs; do 42 | echo "$cat" 43 | msgmerge -o "$cat.new" "$cat" "${WDIR}/${PROJECT}.pot" 44 | mv "$cat.new" "$cat" 45 | done 46 | 47 | intltool-merge --quiet --desktop-style . ../metadata.desktop.template "${PROJECTPATH}"/metadata.desktop 48 | 49 | 50 | echo "Done merging translations" 51 | echo "Cleaning up" 52 | rm "${WDIR}/rcfiles.list" 53 | rm "${WDIR}/infiles.list" 54 | rm "${WDIR}/rc.cpp" 55 | echo "Done" 56 | -------------------------------------------------------------------------------- /po/el.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Michail Vοurlakos , 2016. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://github.com/psifidotos/nowdock-plasmoid/\n" 9 | "POT-Creation-Date: 2016-11-25 00:01+0200\n" 10 | "PO-Revision-Date: 2016-11-25 00:01+0200\n" 11 | "Last-Translator: Michail Vοurlakos \n" 12 | "Language-Team: Greek \n" 13 | "Language: el_GR\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | "X-Generator: Lokalize 2.0\n" 19 | 20 | #: ../nowdockplasmoid/contents/config/config.qml:26 21 | msgid "Appearance" 22 | msgstr "Εμφάνιση" 23 | 24 | #: ../nowdockplasmoid/contents/config/config.qml:31 25 | msgid "Panel" 26 | msgstr "Πίνακας" 27 | 28 | #: ../nowdockplasmoid/contents/config/config.qml:36 29 | msgid "Interaction" 30 | msgstr "Αλληλεπίδραση" 31 | 32 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:68 33 | msgid "Icon size: " 34 | msgstr "Μέγεθος: " 35 | 36 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:156 37 | msgid "ver: " 38 | msgstr "εκδ: " 39 | 40 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:163 41 | msgid "Enable shadows for icons" 42 | msgstr "Σκιές στα εικονίδια" 43 | 44 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:169 45 | msgid "Show glow around windows points" 46 | msgstr "Λάμψη στα σημεία κατάστασης των παραθύρων" 47 | 48 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:175 49 | msgid "Different color for minimized windows" 50 | msgstr "Διαφορετικό χρώμα για ελαχιστοποιημένα παράθυρα" 51 | 52 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:181 53 | msgid "Dots on active window" 54 | msgstr "Τελείες στο ενεργό παράθυρο" 55 | 56 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:187 57 | msgid "Reverse position for lines and dots" 58 | msgstr "Αντίστροφη θέση για γραμμές και τελείες" 59 | 60 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:205 61 | msgid "Animations: " 62 | msgstr "Εφέ: " 63 | 64 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 65 | msgid "duration" 66 | msgstr "διάρκεια" 67 | 68 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 69 | msgid "disabled" 70 | msgstr "ανενεργό" 71 | 72 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:235 73 | msgid "Zoom" 74 | msgstr "Εστίαση" 75 | 76 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:249 77 | msgid "Level: " 78 | msgstr "Επίπεδο:" 79 | 80 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:293 81 | msgid "Show a red line on the limit needed for animations" 82 | msgstr "Εμφάνιση κόκκινης γραμμής στο όριο των εφέ" 83 | 84 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:323 85 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:169 86 | msgid "" 87 | "For the disabled settings you should use the Now Dock Panel Configuration " 88 | "Window" 89 | msgstr "" 90 | "Για τις ανενεργές ρυθμίσεις πρέπει να χρησιμοποιήσετε το Παράθυρο Ρυθμίσεων " 91 | "του Πίνακα Now Dock" 92 | 93 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:58 94 | msgid "Cycle through tasks with mouse wheel" 95 | msgstr "Περιήγηση στις εργασίες με τη ροδέλα του ποντικιού" 96 | 97 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:65 98 | msgid "Preview windows on hovering" 99 | msgstr "Προεπισκοπήσεις παραθύρων" 100 | 101 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:71 102 | msgid "Highlight windows on hovering" 103 | msgstr "Τονισμός παραθύρων" 104 | 105 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:77 106 | msgid "Show window actions in the context menu" 107 | msgstr "Ενέργειες παραθύρου στο μενού επιλογών" 108 | 109 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:83 110 | msgid "Show progress information in task buttons" 111 | msgstr "Εμφάνιση προόδου εργασιών" 112 | 113 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:88 114 | msgid "On middle-click:" 115 | msgstr "Στο μεσαίο κλικ:" 116 | 117 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 118 | msgctxt "The click action" 119 | msgid "None" 120 | msgstr "Καμία" 121 | 122 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 123 | msgid "Close Window or Group" 124 | msgstr "Κλείσιμο παραθύρου ή ομάδας" 125 | 126 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 127 | msgid "New Instance" 128 | msgstr "Νέο στιγμιότυπο" 129 | 130 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 131 | msgid "Minimize/Restore Window or Group" 132 | msgstr "Ελαχιστοποίηση/Επαναφορά παραθύρου ή ομάδας" 133 | 134 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:106 135 | msgid "Filters" 136 | msgstr "Φίλτρα" 137 | 138 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:117 139 | msgid "Show only tasks from the current screen" 140 | msgstr "Εμφάνιση εργασιών μόνο της τρέχουσας οθόνης" 141 | 142 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:122 143 | msgid "Show only tasks from the current desktop" 144 | msgstr "Εμφάνιση εργασιών μόνο της τρέχουσας επιφάνειας εργασίας" 145 | 146 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:127 147 | msgid "Show only tasks from the current activity" 148 | msgstr "Εμφάνιση εργασιών μόνο της τρέχουσας δραστηριότητας" 149 | 150 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:58 151 | msgid "Position: " 152 | msgstr "Θέση: " 153 | 154 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 155 | msgid "Center" 156 | msgstr "Κέντρο" 157 | 158 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 159 | msgid "Left" 160 | msgstr "Αριστερά" 161 | 162 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 163 | msgid "Right" 164 | msgstr "Δεξιά" 165 | 166 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 167 | msgid "Top" 168 | msgstr "Πάνω" 169 | 170 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 171 | msgid "Bottom" 172 | msgstr "Κάτω" 173 | 174 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:74 175 | msgid "Show bar line for tasks" 176 | msgstr "Εμφάνιση υποβάθρου για τις εργασίες" 177 | 178 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:81 179 | msgid "Use plasma theme panel" 180 | msgstr "Πίνακας από το θέμα του Plasma" 181 | 182 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:88 183 | msgid "Use transparency in the panel" 184 | msgstr "Πίνακας με διαφάνεια" 185 | 186 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:95 187 | msgid "Size: " 188 | msgstr "Μέγεθος: " 189 | 190 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:112 191 | msgctxt "Play previous track" 192 | msgid "Previous Track" 193 | msgstr "Προηγούμενο" 194 | 195 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 196 | msgctxt "Pause playback" 197 | msgid "Pause" 198 | msgstr "Παύση" 199 | 200 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 201 | msgctxt "Start playback" 202 | msgid "Play" 203 | msgstr "Έναρξη" 204 | 205 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:136 206 | msgctxt "Stop playback" 207 | msgid "Stop" 208 | msgstr "Διακοπή" 209 | 210 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:144 211 | msgctxt "Play next track" 212 | msgid "Next Track" 213 | msgstr "Επόμενο" 214 | 215 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:160 216 | msgctxt "Quit media player app" 217 | msgid "Quit" 218 | msgstr "Έξοδος" 219 | 220 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:175 221 | msgctxt "Open or bring to the front window of media player app" 222 | msgid "Restore" 223 | msgstr "Επαναφορά" 224 | 225 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:212 226 | msgid "Move To Desktop" 227 | msgstr "Στην Επιφάνεια Εργασίας" 228 | 229 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:234 230 | msgid "Move To Current Desktop" 231 | msgstr "Στην Τρέχουσα Επιφάνεια Εργασίας" 232 | 233 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:243 234 | msgid "All Desktops" 235 | msgstr "Όλες οι Επιφάνειες Εργασίας" 236 | 237 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:272 238 | msgid "New Desktop" 239 | msgstr "Νέα Επιφάνεια Εργασίας" 240 | 241 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:292 242 | msgid "Move To &Activity" 243 | msgstr "Δραστηριότητες" 244 | 245 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:313 246 | msgid "Add To Current Activity" 247 | msgstr "Στην Τρέχουσα Δραστηριότητα" 248 | 249 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:323 250 | msgid "All Activities" 251 | msgstr "Όλες τις Δραστηριότητες" 252 | 253 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:389 254 | msgid "Minimize" 255 | msgstr "Ελαχιστοποίηση" 256 | 257 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:405 258 | msgid "Maximize" 259 | msgstr "Μεγιστοποίηση" 260 | 261 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:420 262 | msgid "More Actions" 263 | msgstr "Περισσότερες ενέργειες" 264 | 265 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:428 266 | msgid "Move" 267 | msgstr "Μετακίνηση" 268 | 269 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:437 270 | msgid "Resize" 271 | msgstr "Αλλαγή μεγέθους" 272 | 273 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:446 274 | msgid "Keep Above Others" 275 | msgstr "Διατήρηση πάνω από τα άλλα" 276 | 277 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:456 278 | msgid "Keep Below Others" 279 | msgstr "Διατήρηση κάτω από τα άλλα" 280 | 281 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:468 282 | msgid "Fullscreen" 283 | msgstr "Πλήρης οθόνη" 284 | 285 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:480 286 | msgid "Shade" 287 | msgstr "Τύλιγμα" 288 | 289 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:495 290 | msgid "Allow this program to be grouped" 291 | msgstr "Να επιτρέπεται η ομαδοποίηση του προγράμματος" 292 | 293 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:508 294 | msgid "Start New Instance" 295 | msgstr "Νέο Στιγμιότυπο" 296 | 297 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:530 298 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:563 299 | msgid "Show Launcher On All Activities" 300 | msgstr "Εκκινητής σε Όλες τις Δραστηριότητες" 301 | 302 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:547 303 | msgid "Show Launcher When Not Running" 304 | msgstr "Εκκινητής όταν δεν είναι Ενεργό" 305 | 306 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:574 307 | msgid "Remove Launcher" 308 | msgstr "Αφαίρεση Εκκινητή" 309 | 310 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:605 311 | msgid "Close" 312 | msgstr "Κλείσιμο" 313 | 314 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:747 315 | msgid "On %1" 316 | msgstr "Σε %1" 317 | 318 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:756 319 | msgctxt "Which virtual desktop a window is currently on" 320 | msgid "Available on all activities" 321 | msgstr "Σε όλες τις δραστηριότητες" 322 | 323 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:775 324 | msgctxt "Activities a window is currently on (apart from the current one)" 325 | msgid "Also available on %1" 326 | msgstr "Διαθέσιμο επίσης σε %1" 327 | 328 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:779 329 | msgctxt "Which activities a window is currently on" 330 | msgid "Available on %1" 331 | msgstr "Διαθέσιμο σε %1" 332 | 333 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:339 334 | msgctxt "Go to previous song" 335 | msgid "Previous" 336 | msgstr "Προηγούμενο" 337 | 338 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 339 | msgctxt "Pause player" 340 | msgid "Pause" 341 | msgstr "Παύση" 342 | 343 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 344 | msgctxt "Start player" 345 | msgid "Play" 346 | msgstr "Έναρξη" 347 | 348 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:356 349 | msgctxt "Go to next song" 350 | msgid "Next" 351 | msgstr "Επόμενο" 352 | 353 | #: ../nowdockplasmoid/contents/ui/ToolTipWindowMouseArea.qml:57 354 | msgctxt "close this window" 355 | msgid "Close" 356 | msgstr "Κλείσιμο" 357 | 358 | #: ../po/rc.cpp:1 rc.cpp:1 359 | msgid "Now Dock" 360 | msgstr "Now Dock" 361 | 362 | #: ../po/rc.cpp:2 rc.cpp:2 363 | msgid "Switch between running applications" 364 | msgstr "Εναλλαγή μεταξύ ενεργών εφαρμογών" 365 | 366 | -------------------------------------------------------------------------------- /po/pl.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Damian Kopeć , 2016. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://github.com/psifidotos/nowdock-plasmoid/\n" 9 | "POT-Creation-Date: 2016-11-25 00:01+0200\n" 10 | "PO-Revision-Date: 2016-10-16 13:14+0100\n" 11 | "Last-Translator: Damian Kopeć \n" 12 | "Language-Team: Polish \n" 13 | "Language: pl\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " 18 | "|| n%100>=20) ? 1 : 2);\n" 19 | "X-Generator: Lokalize 2.0\n" 20 | 21 | #: ../nowdockplasmoid/contents/config/config.qml:26 22 | msgid "Appearance" 23 | msgstr "Wygląd " 24 | 25 | #: ../nowdockplasmoid/contents/config/config.qml:31 26 | msgid "Panel" 27 | msgstr "Panel" 28 | 29 | # może być lepsze/kontekst 30 | #: ../nowdockplasmoid/contents/config/config.qml:36 31 | msgid "Interaction" 32 | msgstr "Interakcja" 33 | 34 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:68 35 | msgid "Icon size: " 36 | msgstr "Rozmiar ikon:" 37 | 38 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:156 39 | msgid "ver: " 40 | msgstr "" 41 | 42 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:163 43 | msgid "Enable shadows for icons" 44 | msgstr "Włącz wyświetlanie cieni ikon" 45 | 46 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:169 47 | msgid "Show glow around windows points" 48 | msgstr "Pokaż poświatę przy punktach okien" 49 | 50 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:175 51 | msgid "Different color for minimized windows" 52 | msgstr "Inny kolor zminimalizowanych okien" 53 | 54 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:181 55 | msgid "Dots on active window" 56 | msgstr "Kropki na aktywnych oknach" 57 | 58 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:187 59 | msgid "Reverse position for lines and dots" 60 | msgstr "" 61 | 62 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:205 63 | msgid "Animations: " 64 | msgstr "Animacje:" 65 | 66 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 67 | msgid "duration" 68 | msgstr "czas trwania" 69 | 70 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 71 | msgid "disabled" 72 | msgstr "wyłączone" 73 | 74 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:235 75 | msgid "Zoom" 76 | msgstr "Zbliżenie" 77 | 78 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:249 79 | msgid "Level: " 80 | msgstr "Poziom:" 81 | 82 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:293 83 | msgid "Show a red line on the limit needed for animations" 84 | msgstr "Pokaż czerwoną linię określającą miejsce potrzebne dla animacji" 85 | 86 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:323 87 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:169 88 | msgid "" 89 | "For the disabled settings you should use the Now Dock Panel Configuration " 90 | "Window" 91 | msgstr "Dla niedostępnych ustawień użyj Okna Konfiguracji Panelu Now Dock" 92 | 93 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:58 94 | msgid "Cycle through tasks with mouse wheel" 95 | msgstr "Zmiana aktywnego zadania kółkiem myszy" 96 | 97 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:65 98 | msgid "Preview windows on hovering" 99 | msgstr "Podgląd okna przy najechaniu kursorem" 100 | 101 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:71 102 | msgid "Highlight windows on hovering" 103 | msgstr "Zaznaczenie okna przy najechaniu kursorem" 104 | 105 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:77 106 | msgid "Show window actions in the context menu" 107 | msgstr "" 108 | 109 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:83 110 | msgid "Show progress information in task buttons" 111 | msgstr "Pokaż informacje o postępie na przyciskach" 112 | 113 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:88 114 | msgid "On middle-click:" 115 | msgstr "Środkowy Przycisk Myszy:" 116 | 117 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 118 | msgctxt "The click action" 119 | msgid "None" 120 | msgstr "Nic" 121 | 122 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 123 | msgid "Close Window or Group" 124 | msgstr "Zamknij Okno lub Grupę" 125 | 126 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 127 | msgid "New Instance" 128 | msgstr "Nowa instancja" 129 | 130 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 131 | msgid "Minimize/Restore Window or Group" 132 | msgstr "Zminimalizuj/Przywróć Okno lub Grupę" 133 | 134 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:106 135 | msgid "Filters" 136 | msgstr "Filtry" 137 | 138 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:117 139 | msgid "Show only tasks from the current screen" 140 | msgstr "Pokaż tylko zadania z obecnego ekranu" 141 | 142 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:122 143 | msgid "Show only tasks from the current desktop" 144 | msgstr "Pokaż tylko zadania z obecnego pulpitu" 145 | 146 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:127 147 | msgid "Show only tasks from the current activity" 148 | msgstr "Pokaż tylko zadania z obecnej aktywności" 149 | 150 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:58 151 | msgid "Position: " 152 | msgstr "Pozycja:" 153 | 154 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 155 | msgid "Center" 156 | msgstr "Środek" 157 | 158 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 159 | msgid "Left" 160 | msgstr "Lewa" 161 | 162 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 163 | msgid "Right" 164 | msgstr "Prawa" 165 | 166 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 167 | msgid "Top" 168 | msgstr "Góra" 169 | 170 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 171 | msgid "Bottom" 172 | msgstr "Dół" 173 | 174 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:74 175 | msgid "Show bar line for tasks" 176 | msgstr "Pokaż linie rozdzielające dla zadań" 177 | 178 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:81 179 | msgid "Use plasma theme panel" 180 | msgstr "Użyj motywu panelu plazmy" 181 | 182 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:88 183 | msgid "Use transparency in the panel" 184 | msgstr "Użyj przezroczystości w panelu" 185 | 186 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:95 187 | msgid "Size: " 188 | msgstr "Rozmiar:" 189 | 190 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:112 191 | msgctxt "Play previous track" 192 | msgid "Previous Track" 193 | msgstr "Poprzedni utwór" 194 | 195 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 196 | msgctxt "Pause playback" 197 | msgid "Pause" 198 | msgstr "Pauza" 199 | 200 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 201 | msgctxt "Start playback" 202 | msgid "Play" 203 | msgstr "Odtwórz" 204 | 205 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:136 206 | msgctxt "Stop playback" 207 | msgid "Stop" 208 | msgstr "Zatrzymaj" 209 | 210 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:144 211 | msgctxt "Play next track" 212 | msgid "Next Track" 213 | msgstr "Następny utwór" 214 | 215 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:160 216 | msgctxt "Quit media player app" 217 | msgid "Quit" 218 | msgstr "Wyjdź" 219 | 220 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:175 221 | msgctxt "Open or bring to the front window of media player app" 222 | msgid "Restore" 223 | msgstr "Przywróć" 224 | 225 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:212 226 | msgid "Move To Desktop" 227 | msgstr "Przenieś Na Pulpit" 228 | 229 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:234 230 | msgid "Move To Current Desktop" 231 | msgstr "Przenieś Na Obecny Pulpit" 232 | 233 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:243 234 | msgid "All Desktops" 235 | msgstr "Wszystkie Pulpity" 236 | 237 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:272 238 | msgid "New Desktop" 239 | msgstr "Nowy Pulpit" 240 | 241 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:292 242 | msgid "Move To &Activity" 243 | msgstr "Przenieś do &Activity" 244 | 245 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:313 246 | msgid "Add To Current Activity" 247 | msgstr "Dodaj Do Obecnej Aktywności" 248 | 249 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:323 250 | msgid "All Activities" 251 | msgstr "Wszystkie Aktywności" 252 | 253 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:389 254 | msgid "Minimize" 255 | msgstr "" 256 | 257 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:405 258 | msgid "Maximize" 259 | msgstr "" 260 | 261 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:420 262 | msgid "More Actions" 263 | msgstr "" 264 | 265 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:428 266 | msgid "Move" 267 | msgstr "" 268 | 269 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:437 270 | msgid "Resize" 271 | msgstr "" 272 | 273 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:446 274 | msgid "Keep Above Others" 275 | msgstr "" 276 | 277 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:456 278 | msgid "Keep Below Others" 279 | msgstr "" 280 | 281 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:468 282 | msgid "Fullscreen" 283 | msgstr "" 284 | 285 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:480 286 | msgid "Shade" 287 | msgstr "" 288 | 289 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:495 290 | msgid "Allow this program to be grouped" 291 | msgstr "" 292 | 293 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:508 294 | msgid "Start New Instance" 295 | msgstr "Utwórz nową instancję" 296 | 297 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:530 298 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:563 299 | msgid "Show Launcher On All Activities" 300 | msgstr "Pokaż Skrót Na Wszystkich Aktywnościach" 301 | 302 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:547 303 | msgid "Show Launcher When Not Running" 304 | msgstr "Pokaż Skrót Kiedy Aplikacja Nie Jest Uruchomiona" 305 | 306 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:574 307 | msgid "Remove Launcher" 308 | msgstr "Usuń Skrót" 309 | 310 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:605 311 | msgid "Close" 312 | msgstr "Zamknij" 313 | 314 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:747 315 | msgid "On %1" 316 | msgstr "Na %1" 317 | 318 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:756 319 | msgctxt "Which virtual desktop a window is currently on" 320 | msgid "Available on all activities" 321 | msgstr "Dostępne We Wszystkich Aktywnościach" 322 | 323 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:775 324 | msgctxt "Activities a window is currently on (apart from the current one)" 325 | msgid "Also available on %1" 326 | msgstr "Dostępne Także na %1" 327 | 328 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:779 329 | msgctxt "Which activities a window is currently on" 330 | msgid "Available on %1" 331 | msgstr "Dostępne na %1" 332 | 333 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:339 334 | msgctxt "Go to previous song" 335 | msgid "Previous" 336 | msgstr "Poprzedni" 337 | 338 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 339 | msgctxt "Pause player" 340 | msgid "Pause" 341 | msgstr "Pauza" 342 | 343 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 344 | msgctxt "Start player" 345 | msgid "Play" 346 | msgstr "Odtwórz" 347 | 348 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:356 349 | msgctxt "Go to next song" 350 | msgid "Next" 351 | msgstr "Następny" 352 | 353 | #: ../nowdockplasmoid/contents/ui/ToolTipWindowMouseArea.qml:57 354 | msgctxt "close this window" 355 | msgid "Close" 356 | msgstr "Zamknij" 357 | 358 | #: ../po/rc.cpp:1 rc.cpp:1 359 | msgid "Now Dock" 360 | msgstr "Now Dock" 361 | 362 | #: ../po/rc.cpp:2 rc.cpp:2 363 | msgid "Switch between running applications" 364 | msgstr "Przełączanie między uruchomionymi aplikacjami" 365 | -------------------------------------------------------------------------------- /po/plasma_applet_org.kde.store.nowdock.plasmoid.pot: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: https://github.com/psifidotos/nowdock-plasmoid/\n" 11 | "POT-Creation-Date: 2016-11-25 00:01+0200\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "Language: \n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=CHARSET\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: ../nowdockplasmoid/contents/config/config.qml:26 21 | msgid "Appearance" 22 | msgstr "" 23 | 24 | #: ../nowdockplasmoid/contents/config/config.qml:31 25 | msgid "Panel" 26 | msgstr "" 27 | 28 | #: ../nowdockplasmoid/contents/config/config.qml:36 29 | msgid "Interaction" 30 | msgstr "" 31 | 32 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:68 33 | msgid "Icon size: " 34 | msgstr "" 35 | 36 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:156 37 | msgid "ver: " 38 | msgstr "" 39 | 40 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:163 41 | msgid "Enable shadows for icons" 42 | msgstr "" 43 | 44 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:169 45 | msgid "Show glow around windows points" 46 | msgstr "" 47 | 48 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:175 49 | msgid "Different color for minimized windows" 50 | msgstr "" 51 | 52 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:181 53 | msgid "Dots on active window" 54 | msgstr "" 55 | 56 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:187 57 | msgid "Reverse position for lines and dots" 58 | msgstr "" 59 | 60 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:205 61 | msgid "Animations: " 62 | msgstr "" 63 | 64 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 65 | msgid "duration" 66 | msgstr "" 67 | 68 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 69 | msgid "disabled" 70 | msgstr "" 71 | 72 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:235 73 | msgid "Zoom" 74 | msgstr "" 75 | 76 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:249 77 | msgid "Level: " 78 | msgstr "" 79 | 80 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:293 81 | msgid "Show a red line on the limit needed for animations" 82 | msgstr "" 83 | 84 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:323 85 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:169 86 | msgid "" 87 | "For the disabled settings you should use the Now Dock Panel Configuration " 88 | "Window" 89 | msgstr "" 90 | 91 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:58 92 | msgid "Cycle through tasks with mouse wheel" 93 | msgstr "" 94 | 95 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:65 96 | msgid "Preview windows on hovering" 97 | msgstr "" 98 | 99 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:71 100 | msgid "Highlight windows on hovering" 101 | msgstr "" 102 | 103 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:77 104 | msgid "Show window actions in the context menu" 105 | msgstr "" 106 | 107 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:83 108 | msgid "Show progress information in task buttons" 109 | msgstr "" 110 | 111 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:88 112 | msgid "On middle-click:" 113 | msgstr "" 114 | 115 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 116 | msgctxt "The click action" 117 | msgid "None" 118 | msgstr "" 119 | 120 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 121 | msgid "Close Window or Group" 122 | msgstr "" 123 | 124 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 125 | msgid "New Instance" 126 | msgstr "" 127 | 128 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 129 | msgid "Minimize/Restore Window or Group" 130 | msgstr "" 131 | 132 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:106 133 | msgid "Filters" 134 | msgstr "" 135 | 136 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:117 137 | msgid "Show only tasks from the current screen" 138 | msgstr "" 139 | 140 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:122 141 | msgid "Show only tasks from the current desktop" 142 | msgstr "" 143 | 144 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:127 145 | msgid "Show only tasks from the current activity" 146 | msgstr "" 147 | 148 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:58 149 | msgid "Position: " 150 | msgstr "" 151 | 152 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 153 | msgid "Center" 154 | msgstr "" 155 | 156 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 157 | msgid "Left" 158 | msgstr "" 159 | 160 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 161 | msgid "Right" 162 | msgstr "" 163 | 164 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 165 | msgid "Top" 166 | msgstr "" 167 | 168 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 169 | msgid "Bottom" 170 | msgstr "" 171 | 172 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:74 173 | msgid "Show bar line for tasks" 174 | msgstr "" 175 | 176 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:81 177 | msgid "Use plasma theme panel" 178 | msgstr "" 179 | 180 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:88 181 | msgid "Use transparency in the panel" 182 | msgstr "" 183 | 184 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:95 185 | msgid "Size: " 186 | msgstr "" 187 | 188 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:112 189 | msgctxt "Play previous track" 190 | msgid "Previous Track" 191 | msgstr "" 192 | 193 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 194 | msgctxt "Pause playback" 195 | msgid "Pause" 196 | msgstr "" 197 | 198 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 199 | msgctxt "Start playback" 200 | msgid "Play" 201 | msgstr "" 202 | 203 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:136 204 | msgctxt "Stop playback" 205 | msgid "Stop" 206 | msgstr "" 207 | 208 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:144 209 | msgctxt "Play next track" 210 | msgid "Next Track" 211 | msgstr "" 212 | 213 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:160 214 | msgctxt "Quit media player app" 215 | msgid "Quit" 216 | msgstr "" 217 | 218 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:175 219 | msgctxt "Open or bring to the front window of media player app" 220 | msgid "Restore" 221 | msgstr "" 222 | 223 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:212 224 | msgid "Move To Desktop" 225 | msgstr "" 226 | 227 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:234 228 | msgid "Move To Current Desktop" 229 | msgstr "" 230 | 231 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:243 232 | msgid "All Desktops" 233 | msgstr "" 234 | 235 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:272 236 | msgid "New Desktop" 237 | msgstr "" 238 | 239 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:292 240 | msgid "Move To &Activity" 241 | msgstr "" 242 | 243 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:313 244 | msgid "Add To Current Activity" 245 | msgstr "" 246 | 247 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:323 248 | msgid "All Activities" 249 | msgstr "" 250 | 251 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:389 252 | msgid "Minimize" 253 | msgstr "" 254 | 255 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:405 256 | msgid "Maximize" 257 | msgstr "" 258 | 259 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:420 260 | msgid "More Actions" 261 | msgstr "" 262 | 263 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:428 264 | msgid "Move" 265 | msgstr "" 266 | 267 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:437 268 | msgid "Resize" 269 | msgstr "" 270 | 271 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:446 272 | msgid "Keep Above Others" 273 | msgstr "" 274 | 275 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:456 276 | msgid "Keep Below Others" 277 | msgstr "" 278 | 279 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:468 280 | msgid "Fullscreen" 281 | msgstr "" 282 | 283 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:480 284 | msgid "Shade" 285 | msgstr "" 286 | 287 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:495 288 | msgid "Allow this program to be grouped" 289 | msgstr "" 290 | 291 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:508 292 | msgid "Start New Instance" 293 | msgstr "" 294 | 295 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:530 296 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:563 297 | msgid "Show Launcher On All Activities" 298 | msgstr "" 299 | 300 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:547 301 | msgid "Show Launcher When Not Running" 302 | msgstr "" 303 | 304 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:574 305 | msgid "Remove Launcher" 306 | msgstr "" 307 | 308 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:605 309 | msgid "Close" 310 | msgstr "" 311 | 312 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:747 313 | msgid "On %1" 314 | msgstr "" 315 | 316 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:756 317 | msgctxt "Which virtual desktop a window is currently on" 318 | msgid "Available on all activities" 319 | msgstr "" 320 | 321 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:775 322 | msgctxt "Activities a window is currently on (apart from the current one)" 323 | msgid "Also available on %1" 324 | msgstr "" 325 | 326 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:779 327 | msgctxt "Which activities a window is currently on" 328 | msgid "Available on %1" 329 | msgstr "" 330 | 331 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:339 332 | msgctxt "Go to previous song" 333 | msgid "Previous" 334 | msgstr "" 335 | 336 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 337 | msgctxt "Pause player" 338 | msgid "Pause" 339 | msgstr "" 340 | 341 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 342 | msgctxt "Start player" 343 | msgid "Play" 344 | msgstr "" 345 | 346 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:356 347 | msgctxt "Go to next song" 348 | msgid "Next" 349 | msgstr "" 350 | 351 | #: ../nowdockplasmoid/contents/ui/ToolTipWindowMouseArea.qml:57 352 | msgctxt "close this window" 353 | msgid "Close" 354 | msgstr "" 355 | 356 | #: ../po/rc.cpp:1 rc.cpp:1 357 | msgid "Now Dock" 358 | msgstr "" 359 | 360 | #: ../po/rc.cpp:2 rc.cpp:2 361 | msgid "Switch between running applications" 362 | msgstr "" 363 | -------------------------------------------------------------------------------- /po/update-metadata.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | BASEDIR=".." # root of translatable sources 4 | PROJECT="plasma_applet_org.kde.store.nowdock.plasmoid" # project name 5 | PROJECTPATH="../nowdockplasmoid" # project path 6 | BUGADDR="https://github.com/psifidotos/nowdock-plasmoid" # MSGID-Bugs 7 | WDIR="`pwd`" # working dir 8 | 9 | intltool-merge --quiet --desktop-style . ../metadata.desktop.template "${PROJECTPATH}"/metadata.desktop 10 | 11 | echo "metadata.desktop file was updated..." 12 | -------------------------------------------------------------------------------- /po/zh_TW.po: -------------------------------------------------------------------------------- 1 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 2 | # This file is distributed under the same license as the PACKAGE package. 3 | # 4 | # Jeff Huang , 2016. 5 | msgid "" 6 | msgstr "" 7 | "Project-Id-Version: \n" 8 | "Report-Msgid-Bugs-To: https://github.com/psifidotos/nowdock-plasmoid/\n" 9 | "POT-Creation-Date: 2016-11-25 00:01+0200\n" 10 | "PO-Revision-Date: 2016-11-26 17:34+0800\n" 11 | "Last-Translator: Jeff Huang \n" 12 | "Language-Team: Chinese \n" 13 | "Language: zh_TW\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=n != 1;\n" 18 | "X-Generator: Lokalize 2.0\n" 19 | 20 | #: ../nowdockplasmoid/contents/config/config.qml:26 21 | msgid "Appearance" 22 | msgstr "外觀" 23 | 24 | #: ../nowdockplasmoid/contents/config/config.qml:31 25 | msgid "Panel" 26 | msgstr "面板" 27 | 28 | #: ../nowdockplasmoid/contents/config/config.qml:36 29 | msgid "Interaction" 30 | msgstr "反應" 31 | 32 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:68 33 | msgid "Icon size: " 34 | msgstr "圖示大小:" 35 | 36 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:156 37 | msgid "ver: " 38 | msgstr "版本:" 39 | 40 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:163 41 | msgid "Enable shadows for icons" 42 | msgstr "啟用圖示陰影" 43 | 44 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:169 45 | msgid "Show glow around windows points" 46 | msgstr "在視窗點周圍顯示光暈" 47 | 48 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:175 49 | msgid "Different color for minimized windows" 50 | msgstr "最小化視窗使用不同的顏色" 51 | 52 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:181 53 | msgid "Dots on active window" 54 | msgstr "作用中的視窗顯示點" 55 | 56 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:187 57 | msgid "Reverse position for lines and dots" 58 | msgstr "線與點位置反轉" 59 | 60 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:205 61 | msgid "Animations: " 62 | msgstr "動畫:" 63 | 64 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 65 | msgid "duration" 66 | msgstr "期間" 67 | 68 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:223 69 | msgid "disabled" 70 | msgstr "已停用" 71 | 72 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:235 73 | msgid "Zoom" 74 | msgstr "縮放" 75 | 76 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:249 77 | msgid "Level: " 78 | msgstr "等級:" 79 | 80 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:293 81 | msgid "Show a red line on the limit needed for animations" 82 | msgstr "在需要限制的動畫上顯示紅線" 83 | 84 | #: ../nowdockplasmoid/contents/ui/ConfigAppearance.qml:323 85 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:169 86 | msgid "" 87 | "For the disabled settings you should use the Now Dock Panel Configuration " 88 | "Window" 89 | msgstr "為了已停用的設定,您必須使用 Now Dock 面板設定視窗" 90 | 91 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:58 92 | msgid "Cycle through tasks with mouse wheel" 93 | msgstr "使用滑鼠滾輪循環切換工作" 94 | 95 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:65 96 | msgid "Preview windows on hovering" 97 | msgstr "在滑鼠游標停留其上時預覽視窗" 98 | 99 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:71 100 | msgid "Highlight windows on hovering" 101 | msgstr "在滑鼠游標停留其上時突顯視窗" 102 | 103 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:77 104 | msgid "Show window actions in the context menu" 105 | msgstr "在右鍵選單中顯示視窗動作" 106 | 107 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:83 108 | msgid "Show progress information in task buttons" 109 | msgstr "在工具按鍵裡顯示進度資訊" 110 | 111 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:88 112 | msgid "On middle-click:" 113 | msgstr "點擊滑鼠中鍵:" 114 | 115 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 116 | msgctxt "The click action" 117 | msgid "None" 118 | msgstr "無" 119 | 120 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 121 | msgid "Close Window or Group" 122 | msgstr "關閉視窗或群組" 123 | 124 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 125 | msgid "New Instance" 126 | msgstr "新的實體" 127 | 128 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:94 129 | msgid "Minimize/Restore Window or Group" 130 | msgstr "最小化/復原視窗" 131 | 132 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:106 133 | msgid "Filters" 134 | msgstr "過濾器" 135 | 136 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:117 137 | msgid "Show only tasks from the current screen" 138 | msgstr "只顯示目前螢幕上的工作" 139 | 140 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:122 141 | msgid "Show only tasks from the current desktop" 142 | msgstr "只顯示目前桌面上的工作" 143 | 144 | #: ../nowdockplasmoid/contents/ui/ConfigInteraction.qml:127 145 | msgid "Show only tasks from the current activity" 146 | msgstr "只顯示目前活動裡的工作" 147 | 148 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:58 149 | msgid "Position: " 150 | msgstr "位置:" 151 | 152 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 153 | msgid "Center" 154 | msgstr "置中" 155 | 156 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 157 | msgid "Left" 158 | msgstr "左邊" 159 | 160 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 161 | msgid "Right" 162 | msgstr "右邊" 163 | 164 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 165 | msgid "Top" 166 | msgstr "頂部" 167 | 168 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:66 169 | msgid "Bottom" 170 | msgstr "底部" 171 | 172 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:74 173 | msgid "Show bar line for tasks" 174 | msgstr "為工作顯示條狀列" 175 | 176 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:81 177 | msgid "Use plasma theme panel" 178 | msgstr "使用 Plasma 主題面板" 179 | 180 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:88 181 | msgid "Use transparency in the panel" 182 | msgstr "在面板中使用漸層" 183 | 184 | #: ../nowdockplasmoid/contents/ui/ConfigPanel.qml:95 185 | msgid "Size: " 186 | msgstr "大小:" 187 | 188 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:112 189 | msgctxt "Play previous track" 190 | msgid "Previous Track" 191 | msgstr "前一軌" 192 | 193 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 194 | msgctxt "Pause playback" 195 | msgid "Pause" 196 | msgstr "暫停" 197 | 198 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:125 199 | msgctxt "Start playback" 200 | msgid "Play" 201 | msgstr "播放" 202 | 203 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:136 204 | msgctxt "Stop playback" 205 | msgid "Stop" 206 | msgstr "停止" 207 | 208 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:144 209 | msgctxt "Play next track" 210 | msgid "Next Track" 211 | msgstr "下一軌" 212 | 213 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:160 214 | msgctxt "Quit media player app" 215 | msgid "Quit" 216 | msgstr "離開" 217 | 218 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:175 219 | msgctxt "Open or bring to the front window of media player app" 220 | msgid "Restore" 221 | msgstr "恢復" 222 | 223 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:212 224 | msgid "Move To Desktop" 225 | msgstr "移動到桌面" 226 | 227 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:234 228 | msgid "Move To Current Desktop" 229 | msgstr "移到目前桌面" 230 | 231 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:243 232 | msgid "All Desktops" 233 | msgstr "所有桌面" 234 | 235 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:272 236 | msgid "New Desktop" 237 | msgstr "新增桌面" 238 | 239 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:292 240 | msgid "Move To &Activity" 241 | msgstr "移動到活動(&A)" 242 | 243 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:313 244 | msgid "Add To Current Activity" 245 | msgstr "加入到目前的活動" 246 | 247 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:323 248 | msgid "All Activities" 249 | msgstr "所有的活動" 250 | 251 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:389 252 | msgid "Minimize" 253 | msgstr "最小化" 254 | 255 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:405 256 | msgid "Maximize" 257 | msgstr "最大化" 258 | 259 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:420 260 | msgid "More Actions" 261 | msgstr "更多動作" 262 | 263 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:428 264 | msgid "Move" 265 | msgstr "移動" 266 | 267 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:437 268 | msgid "Resize" 269 | msgstr "調整大小" 270 | 271 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:446 272 | msgid "Keep Above Others" 273 | msgstr "顯示在最上層" 274 | 275 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:456 276 | msgid "Keep Below Others" 277 | msgstr "顯示在最下層" 278 | 279 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:468 280 | msgid "Fullscreen" 281 | msgstr "全螢幕" 282 | 283 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:480 284 | msgid "Shade" 285 | msgstr "陰影" 286 | 287 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:495 288 | msgid "Allow this program to be grouped" 289 | msgstr "允許此程式被歸類" 290 | 291 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:508 292 | msgid "Start New Instance" 293 | msgstr "開啟新的實體" 294 | 295 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:530 296 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:563 297 | msgid "Show Launcher On All Activities" 298 | msgstr "在所有活動中顯示啟動器" 299 | 300 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:547 301 | msgid "Show Launcher When Not Running" 302 | msgstr "當未執行時顯示啟動器" 303 | 304 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:574 305 | msgid "Remove Launcher" 306 | msgstr "移除啟動器" 307 | 308 | #: ../nowdockplasmoid/contents/ui/ContextMenu.qml:605 309 | msgid "Close" 310 | msgstr "關閉" 311 | 312 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:747 313 | msgid "On %1" 314 | msgstr "於 %1" 315 | 316 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:756 317 | msgctxt "Which virtual desktop a window is currently on" 318 | msgid "Available on all activities" 319 | msgstr "所有活動都可使用" 320 | 321 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:775 322 | msgctxt "Activities a window is currently on (apart from the current one)" 323 | msgid "Also available on %1" 324 | msgstr "也可在 %1 上使用" 325 | 326 | #: ../nowdockplasmoid/contents/ui/TaskDelegate.qml:779 327 | msgctxt "Which activities a window is currently on" 328 | msgid "Available on %1" 329 | msgstr "於 %1 上使用" 330 | 331 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:339 332 | msgctxt "Go to previous song" 333 | msgid "Previous" 334 | msgstr "前一個" 335 | 336 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 337 | msgctxt "Pause player" 338 | msgid "Pause" 339 | msgstr "暫停" 340 | 341 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:348 342 | msgctxt "Start player" 343 | msgid "Play" 344 | msgstr "啟動" 345 | 346 | #: ../nowdockplasmoid/contents/ui/ToolTipDelegate.qml:356 347 | msgctxt "Go to next song" 348 | msgid "Next" 349 | msgstr "下一個" 350 | 351 | #: ../nowdockplasmoid/contents/ui/ToolTipWindowMouseArea.qml:57 352 | msgctxt "close this window" 353 | msgid "Close" 354 | msgstr "關閉" 355 | 356 | #: ../po/rc.cpp:1 rc.cpp:1 357 | msgid "Now Dock" 358 | msgstr "Now Dock" 359 | 360 | #: ../po/rc.cpp:2 rc.cpp:2 361 | msgid "Switch between running applications" 362 | msgstr "在執行中的應用程式間切換" 363 | 364 | -------------------------------------------------------------------------------- /uninstall-global.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #Author: Michail Vourlakos 3 | #Summary: Uninstallation script for Now Dock Panel 4 | #This script was written and tested on openSuSe Leap 42.1 5 | 6 | if [ -f build/install_manifest.txt ]; then 7 | echo "Uninstallation file exists..." 8 | sudo xargs rm < build/install_manifest.txt 9 | else 10 | echo "Uninstallation file does not exist." 11 | fi 12 | -------------------------------------------------------------------------------- /uninstall-local.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | #Author: Michail Vourlakos 3 | #Summary: Installation script for Now Dock Plasmoid 4 | #This script was written and tested on openSuSe Leap 42.1 5 | 6 | cd nowdockplasmoid 7 | plasmapkg2 -r . 8 | --------------------------------------------------------------------------------