├── .gitignore ├── CMakeLists.txt ├── LICENSE ├── README.md ├── examples ├── font_awesome.png ├── font_awesome.sh ├── kargos_plugin.1s.sh ├── kargos_plugin_demo.1s.sh ├── kargos_plugin_submenus.sh └── rssnews.30m.py ├── kargos-example.png ├── kargos-logo.png ├── kargos-options.png ├── kargos-rss-example.png └── plasmoid ├── contents ├── config │ ├── config.qml │ └── main.xml ├── ui │ ├── CompactRepresentation.qml │ ├── FirstLinesRotator.qml │ ├── FullRepresentation.qml │ ├── IconifiableButton.qml │ ├── ItemTextMouseArea.qml │ ├── config │ │ ├── ConfigAppearance.qml │ │ ├── ConfigGeneral.qml │ │ ├── ConfigPage.qml │ │ └── ConfigSection.qml │ └── main.qml └── vendor │ └── FontAwesome │ ├── FontAwesome.qml │ ├── Object.qml │ ├── README.txt │ ├── fontawesome-webfont.ttf │ └── qmldir └── metadata.desktop /.gitignore: -------------------------------------------------------------------------------- 1 | CMakeLists.txt.user 2 | *.qmlc 3 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | # Set minimum CMake version (required for CMake 3.0 or later) 2 | cmake_minimum_required(VERSION 2.8.12) 3 | 4 | # Use Extra CMake Modules (ECM) for common functionality. 5 | # See http://api.kde.org/ecm/manual/ecm.7.html 6 | # and http://api.kde.org/ecm/manual/ecm-kde-modules.7.html 7 | find_package(ECM REQUIRED NO_MODULE) 8 | # Needed by find_package(KF5Plasma) below. 9 | set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ${CMAKE_MODULE_PATH}) 10 | 11 | # Locate plasma_install_package macro. 12 | find_package(KF5Plasma REQUIRED) 13 | 14 | # Add installatation target ("make install"). 15 | plasma_install_package(plasmoid org.kde.kargos) 16 | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | 676 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # kargos 2 | 3 | ![kargos logo](kargos-logo.png "kargos logo") 4 | 5 | A Plasma port of [Argos](https://github.com/p-e-w/argos/blob/master/README.md) and [BitBar plugins](https://github.com/matryer/bitbar-plugins) to fast create 6 | custom plasmoids. 7 | 8 | **Note: This is an alpha project. By now, it only was tested on Kubuntu 16.04 LTS.** 9 | 10 | ## What is implemented 11 | 12 | - Submenus nesting ('--'). 13 | - "href" attribute. 14 | - "bash" attribute. 15 | - "size" attribute. 16 | - "refresh" attribute. 17 | - "iconName" attribute (it should be a valid KDE icon name) 18 | - "font" attribute. 19 | - "color" attribute. 20 | - "dropdown" attribute. 21 | - "image" attribute (base64 encoded image). 22 | - "imageURL" attribute (**non BitBar, kargos only**). A URL for the image. 23 | - "imageWidth", "imageHeight" attributes (**non BitBar, kargos only**). Max size for 24 | the image. If only one is provided, aspect ratio is preserved. 25 | - "terminal" attribute. 26 | - "onclick" attribute (**non BitBar, kargos only**). Possible values: `bash` or `href`. What to execute if you click on the line, that is, 27 | to run the command indicated in the `bash` attribute or go to the web indicated by the `href` attribute. The corresponding "Go" or "Run" 28 | button will not appear. 29 | - HTML support. Only the subset [supported by QML](http://doc.qt.io/qt-5/richtext-html-subset.html). 30 | - Interval detection on the command filename. A custom interval option is available. 31 | 32 | ## Extras / Extensions 33 | 34 | We've added a few extensions to the BitBar/Argos protocol, for extra features the authors wanted. 35 | All of these are prefixed with `kargos.`. 36 | 37 | ### Icons from Font Awesome 38 | 39 | When writing quick bash scripts for personal use, coming up with icons that look decent on various screen sizes/densities is a pain. 40 | Using plasma's icons look beautiful, but they are a rather limited selection. 41 | 42 | [Font Awesome](https://fontawesome.com/v4.7.0/icons/) on the other hand, have a vast library of icons that are, well... awesome! 43 | You can use them with the `kargos.fa_icon` attribute, like so: 44 | 45 | ```bash 46 | #!/bin/bash 47 | 48 | # Note: font awesome icon size is determined by font size 49 | echo "Hello world! | kargos.fa_icon=globe size=16"; 50 | ``` 51 | This would cause Kargos to render: 52 | ![Kargos examples/font-awesome.sh screenshot](examples/font_awesome.png) 53 | 54 | Note that this uses font awesome version 4.7, so make sure you filter by that version if you use [their gallery](https://fontawesome.com/v4.7.0/icons/). Furthermore, some of their icons are not free and can't be used in Kargos. 55 | Refer to the [plasmoid/contents/vendor/FontAwesome/FontAwesome.qml](plasmoid/contents/vendor/FontAwesome/FontAwesome.qml) file for an authoritative list of icons that can be used in Kargos. 56 | 57 | 58 | ## Installation 59 | 60 | To get and install the latest version: 61 | 62 | ``` 63 | git clone git@github.com:lipido/kargos.git 64 | cd kargos 65 | kpackagetool5 -t Plasma/Applet --install plasmoid 66 | 67 | ``` 68 | 69 | Also, you can find a release of kargos in [kde-look.org](https://store.kde.org/p/1173112/), 70 | so you can install it directly from your desktop by choosing "Get new widgets" 71 | 72 | If you're using Arch Linux, there's also an [AUR pacakge](https://aur.archlinux.org/packages/plasma5-applets-kargos-git/) for it. 73 | 74 | ## Example plugin 75 | kargos follows (part of) the [BitBar plugin](https://github.com/matryer/bitbar-plugins) 76 | standard, which is very simple. To create a plugin, all you have to do is to create 77 | an executable program (in any language) that produces standard output following 78 | an [specific format](https://github.com/matryer/bitbar#plugin-api). 79 | 80 | For example, this is the `examples/kargos_plugin.1s.sh` file (1s means that the plasmoid will re-render 81 | every 1 second): 82 | 83 | ```bash 84 | #!/bin/bash 85 | echo "$(date)" 86 | echo "---" 87 | echo "Launch Gimp | bash=/usr/bin/gimp iconName=applications-graphics" 88 | echo "Kernel: $(uname -r) | iconName=system-settings iconName=applications-development" 89 | echo "Go to Google | href=http://www.google.com size=4 iconName=applications-internet" 90 | TOP_OUTPUT=$(top -b -n 1 | head -n 20 | awk 1 ORS="\\\\n") 91 | echo "$TOP_OUTPUT | font=monospace iconName=applications-system" 92 | ``` 93 | 94 | You need to configure this file in your plasmoid options: 95 | ![kargos options panel](kargos-options.png "kargos options panel") 96 | 97 | 98 | And then it will produce the following contents in your plasmoid: 99 | ![kargos example plasmoid](kargos-example.png "kargos example plasmoid") 100 | 101 | That's all. You can add the a kargo plasmoid to your panel. You have to configure 102 | it to indicate the command or executable. 103 | 104 | ## Another example: a RSS reader 105 | This a tribute to the KDE 3 KNewsTicker. There are many RSS readers, but the 106 | concept of KNewsTicker was unique for me. I do not like to open a RSS client 107 | or take any action to read feeds because, although I can do this the first days, 108 | in a few days I am not checking them anymore. However, with KNewsTicker, news are 109 | rotating continuously and in a discrete fashion. However, you will be aware of them 110 | sooner or later. 111 | 112 | KNewsTicker was discontinued and no longer available since KDE 4. But you can 113 | implement it easily with kargos and Python! 114 | 115 | You can find an [example](examples/rssnews.30m.py) of plugin to read your 116 | favourite RSS feeds. News will be rotating in your panel and, if you dropdown, 117 | you can read all the news. 118 | 119 | Here are the results! 120 | 121 | ![kargos RSS plugin](kargos-rss-example.png "kargos options panel") 122 | 123 | ## Discussion / Contributing 124 | Have questions, ideas, or just wanna talk about Kargos? Come join us at [#kargos:kde.org](https://matrix.to/#/!JJUzArvSQNWhqQsQVB:kde.org?via=kde.org&via=lasath.org). 125 | 126 | Note that this is a matrix channel, not IRC. [Matrix](https://matrix.org) is (in many ways) the successor to IRC and KDE is already using it. The [KDE wiki has a nice guide](https://community.kde.org/Matrix) for getting started if you've never used matrix client before. 127 | 128 | -------------------------------------------------------------------------------- /examples/font_awesome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/examples/font_awesome.png -------------------------------------------------------------------------------- /examples/font_awesome.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Note: font awesome icon size is determined by font size 4 | echo "Hello world! | kargos.fa_icon=globe size=16"; 5 | 6 | -------------------------------------------------------------------------------- /examples/kargos_plugin.1s.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "$(date)" 3 | echo "---" 4 | echo "Launch Gimp | bash=/usr/bin/gimp iconName=applications-graphics" 5 | echo "Kernel: $(uname -r) | iconName=system-settings iconName=applications-development" 6 | echo "Go to Google | href=http://www.google.com iconName=applications-internet" 7 | TOP_OUTPUT=$(top -b -n 1 | head -n 20 | awk 1 ORS="\\\\n") 8 | echo "$TOP_OUTPUT | font=monospace iconName=applications-system" 9 | -------------------------------------------------------------------------------- /examples/kargos_plugin_demo.1s.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Rotating item 1 $(date +\"%T\") (href, icon, onclick=href, color=yellow) | color=yellow iconName=dialog-ok href=http://www.google.com onclick=href" 3 | echo "Rotating item 2 (qt) $(date +\"%T\") (bash, imageURL) | bash=ls imageURL=http://doc.qt.io/qt-5/images/declarative-qtlogo.png" 4 | echo "Rotating item 2bis (kde) $(date +\"%T\") (bash, imageURL) | bash=ls imageURL=https://dot.kde.org/sites/all/themes/neverland/logo.png" 5 | echo "Rotating item 3 $(date +\"%T\") (bash, icon, font, href, onclick=bash) | iconName=dialog-cancel bash=ls font=serif href=http://www.google.com onclick=bash" 6 | echo "Rotating item 4 $(date +\"%T\") (font, size) | size=14 font=serif" 7 | echo "en | href=http://www.google.com bash=ls" 8 | echo "---" 9 | echo "Dropdown item 1 $(date +\"%T\") (href, icon, image, color=yellow) |color=yellow iconName=dialog-ok href=http://www.google.com image=$(wget -O - http://doc.qt.io/qt-5/images/declarative-qtlogo.png | base64 -w0)" 10 | echo "Dropdown item 2 $(date +\"%T\") (bash with quotes, imageURL, onclick=bash, terminal=true) | terminal=true bash='ls -l' onclick=bash imageURL=http://doc.qt.io/qt-5/images/declarative-qtlogo.png" 11 | echo "Dropdown item 3 $(date +\"%T\") (bash, icon, font, href, refresh) | iconName=dialog-cancel bash='sleep 2' font=serif href=http://www.google.com refresh=true" 12 | echo "Dropdown item 4 $(date +\"%T\") (font, size) | size=14 font=serif" 13 | echo "NoDropdown item 4 $(date +\"%T\") (dropdown=false) | dropdown=false" 14 | echo "Menu" 15 | echo "-- submenu item 1 $(date +\"%T\") (href, icon)|iconName=dialog-ok href=http://www.google.com" 16 | echo "-- submenu item 2 $(date +\"%T\") (href) | href=http://www.google.com" 17 | echo "-- submenu item 3 $(date +\"%T\") (bash, icon, font) | iconName=dialog-cancel bash=ls font=serif" 18 | echo "-- submenu item 4 $(date +\"%T\") (font, size) | size=14 font=serif" 19 | echo "Menu 2" 20 | echo "-- submenu2 item 1 $(date +\"%T\") (href, icon)|iconName=dialog-ok href=http://www.google.com" 21 | echo "-- submenu2 item 2 $(date +\"%T\") (href) | href=http://www.google.com" 22 | echo "-- submenu2 item 3 $(date +\"%T\") (bash, icon, font) | iconName=dialog-cancel bash=ls font=serif" 23 | echo "-- submenu2 item 4 $(date +\"%T\") (font, size) | size=14 font=serif" -------------------------------------------------------------------------------- /examples/kargos_plugin_submenus.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Root" 3 | echo "Toooooor" 4 | echo "---" 5 | echo "Graphics" 6 | echo "-- Gimp" 7 | echo "-- Gwenview" 8 | echo "Office" 9 | echo "-- LibreOffice Writer | dropdown=false" 10 | echo "-- LibreOffice Calc" 11 | 12 | -------------------------------------------------------------------------------- /examples/rssnews.30m.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys 3 | # sys.setdefaultencoding() does not exist, here! 4 | 5 | import urllib2 6 | import xml.etree.ElementTree as ET 7 | 8 | reload(sys) # Reload does the trick! 9 | sys.setdefaultencoding('UTF8') 10 | 11 | # limit the number of items per url. -1= no limit 12 | MAX=-1 13 | 14 | urls = [ 15 | # (url,icon). icon maybe empty string 16 | ('https://dot.kde.org/rss.xml', 'https://dot.kde.org/sites/all/themes/neverland/logo.png'), 17 | ('https://dot.kde.org/rss.xml', '') 18 | ] 19 | 20 | 21 | 22 | print "---" 23 | print "Refresh|refresh=true iconName=view-refresh" 24 | for (url, icon) in urls: 25 | 26 | response = urllib2.urlopen(url) 27 | html = response.read() 28 | 29 | try: 30 | root = ET.fromstring(html) 31 | count = 0 32 | for item in root.findall('.//item'): 33 | if count == MAX: 34 | break 35 | count += 1 36 | title = item.find('title').text 37 | link = item.find('link').text 38 | line = title.replace('|', '/') + '| href=' + link 39 | if (icon !=None and icon != ''): 40 | line+=' imageWidth=22 imageHeight=22 imageURL='+icon 41 | else: 42 | line+=' iconName=application-rss+xml' 43 | print line 44 | print line + ' dropdown=false' 45 | except: 46 | line = 'error fetching '+url+'|' 47 | if (icon !=None and icon != ''): 48 | line+=' imageWidth=22 imageHeight=22 imageURL='+icon 49 | else: 50 | line+=' iconName=application-rss+xml' 51 | print line 52 | print line + ' dropdown=false' 53 | -------------------------------------------------------------------------------- /kargos-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/kargos-example.png -------------------------------------------------------------------------------- /kargos-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/kargos-logo.png -------------------------------------------------------------------------------- /kargos-options.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/kargos-options.png -------------------------------------------------------------------------------- /kargos-rss-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/kargos-rss-example.png -------------------------------------------------------------------------------- /plasmoid/contents/config/config.qml: -------------------------------------------------------------------------------- 1 | /*************************************************************************** 2 | * Copyright (C) 2013 by Eike Hein * 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 * 16 | * Free Software Foundation, Inc., * 17 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * 18 | ***************************************************************************/ 19 | 20 | import QtQuick 2.0 21 | 22 | import org.kde.plasma.configuration 2.0 23 | 24 | ConfigModel { 25 | ConfigCategory { 26 | name: i18n("General") 27 | icon: "preferences-system-windows" 28 | source: "config/ConfigGeneral.qml" 29 | } 30 | ConfigCategory { 31 | name: i18n("Appearance") 32 | icon: "preferences-desktop-color" 33 | source: "config/ConfigAppearance.qml" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /plasmoid/contents/config/main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 1 14 | 15 | 16 | 5 17 | 18 | 19 | 20 | 21 | 0 22 | 23 | 24 | 600 25 | 26 | 27 | 600 28 | 29 | 30 | true 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/CompactRepresentation.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | 22 | import QtQuick 2.0 23 | import org.kde.plasma.components 2.0 as PlasmaComponents 24 | import QtQuick.Controls 1.4 25 | import QtQuick.Layouts 1.1 26 | import org.kde.plasma.core 2.0 as PlasmaCore 27 | 28 | 29 | Item { 30 | 31 | id: compactRoot 32 | 33 | Layout.preferredWidth: rotator.implicitWidth + (dropdownButton.visible?dropdownButton.implicitWidth + 5 : 0) 34 | 35 | property var mouseIsInside: false; 36 | 37 | MouseArea { 38 | id: mousearea 39 | hoverEnabled: true 40 | anchors.fill : parent 41 | 42 | onEntered: { 43 | mouseIsInside = true; 44 | mouseExitDelayer.stop(); 45 | } 46 | 47 | onExited: { 48 | mouseExitDelayer.restart(); 49 | } 50 | 51 | onClicked: { 52 | if (!rotator.mousearea.hasClickAction && root.dropdownItemsCount > 0) { 53 | doDropdown(); 54 | } 55 | } 56 | 57 | Timer { 58 | id: mouseExitDelayer 59 | interval: 1000 60 | onTriggered: { 61 | mouseIsInside = false; 62 | } 63 | } 64 | 65 | function doDropdown() { 66 | if (!plasmoid.expanded) { 67 | plasmoid.expanded = true; 68 | mouseExitDelayer.stop(); 69 | } else if (plasmoid.expanded) { 70 | plasmoid.expanded = false; 71 | } 72 | } 73 | 74 | FirstLinesRotator { 75 | id: rotator 76 | buttonHidingDelay: true 77 | anchors.verticalCenter: parent.verticalCenter 78 | labelMaxWidth: plasmoid.configuration.compactLabelMaxWidth 79 | } 80 | 81 | // Tooltip for arrow (taken from the systemtray plasmoid) 82 | Item { 83 | id: dropdownButton 84 | 85 | width: units.iconSizes.smallMedium 86 | height: units.iconSizes.smallMedium 87 | 88 | implicitWidth: units.iconSizes.smallMedium 89 | implicitHeight: units.iconSizes.smallMedium 90 | 91 | visible: (root.dropdownItemsCount > 0) && (!plasmoid.configuration.d_ArrowNeverVisible) && (mouseIsInside || plasmoid.expanded || plasmoid.configuration.d_ArrowAlwaysVisible) 92 | 93 | anchors { 94 | right: parent.right 95 | verticalCenter: parent.verticalCenter 96 | } 97 | 98 | MouseArea { 99 | id: arrowMouseArea 100 | anchors.fill: parent 101 | onClicked: { 102 | mousearea.doDropdown() 103 | } 104 | 105 | readonly property int arrowAnimationDuration: units.shortDuration * 3 106 | 107 | PlasmaCore.Svg { 108 | id: arrowSvg 109 | imagePath: "widgets/arrows" 110 | } 111 | 112 | PlasmaCore.SvgItem { 113 | id: arrow 114 | 115 | anchors.centerIn: parent 116 | width: Math.min(parent.width, parent.height) 117 | height: width 118 | 119 | rotation: plasmoid.expanded ? 180 : 0 120 | Behavior on rotation { 121 | RotationAnimation { 122 | duration: arrowMouseArea.arrowAnimationDuration 123 | } 124 | } 125 | opacity: plasmoid.expanded ? 0 : 1 126 | Behavior on opacity { 127 | NumberAnimation { 128 | duration: arrowMouseArea.arrowAnimationDuration 129 | } 130 | } 131 | 132 | svg: arrowSvg 133 | elementId: { 134 | if (plasmoid.location == PlasmaCore.Types.BottomEdge) { 135 | return "up-arrow" 136 | } else if (plasmoid.location == PlasmaCore.Types.TopEdge) { 137 | return "down-arrow" 138 | } else if (plasmoid.location == PlasmaCore.Types.LeftEdge) { 139 | return "right-arrow" 140 | } else { 141 | return "left-arrow" 142 | } 143 | } 144 | } 145 | 146 | PlasmaCore.SvgItem { 147 | anchors.centerIn: parent 148 | width: arrow.width 149 | height: arrow.height 150 | 151 | rotation: plasmoid.expanded ? 0 : -180 152 | Behavior on rotation { 153 | RotationAnimation { 154 | duration: arrowMouseArea.arrowAnimationDuration 155 | } 156 | } 157 | opacity: plasmoid.expanded ? 1 : 0 158 | Behavior on opacity { 159 | NumberAnimation { 160 | duration: arrowMouseArea.arrowAnimationDuration 161 | } 162 | } 163 | 164 | svg: arrowSvg 165 | elementId: { 166 | if (plasmoid.location == PlasmaCore.Types.BottomEdge) { 167 | return "down-arrow" 168 | } else if (plasmoid.location == PlasmaCore.Types.TopEdge) { 169 | return "up-arrow" 170 | } else if (plasmoid.location == PlasmaCore.Types.LeftEdge) { 171 | return "left-arrow" 172 | } else { 173 | return "right-arrow" 174 | } 175 | } 176 | } 177 | } 178 | } 179 | 180 | Component.onCompleted: { 181 | // more compact 182 | rotator.mousearea.goButton.text=''; 183 | rotator.mousearea.runButton.text=''; 184 | rotator.mousearea.buttonsAlwaysVisible = true 185 | rotator.mousearea.iconMode = true 186 | } 187 | } 188 | } 189 | 190 | 191 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/FirstLinesRotator.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | import QtQuick 2.0 22 | import org.kde.plasma.components 2.0 as PlasmaComponents 23 | import QtQuick.Controls 1.4 24 | import QtQuick.Layouts 1.1 25 | import org.kde.plasma.core 2.0 as PlasmaCore 26 | import "../vendor/FontAwesome" 27 | 28 | Row { 29 | id: control 30 | spacing: 2 31 | anchors.left: parent.left 32 | anchors.right: parent.right 33 | 34 | height: label.implicitHeight + 20 35 | property bool buttonHidingDelay: false 36 | 37 | property var rotatingItems : [] 38 | property var currentMessage : -1 39 | property int labelMaxWidth: 0 40 | 41 | readonly property alias icon: icon 42 | readonly property alias image: image 43 | readonly property alias label: label 44 | readonly property alias mousearea: mousearea 45 | 46 | function getCurrentItem() { 47 | return (rotatingItems.length > 0 && currentMessage != -1) ? rotatingItems[currentMessage] : null; 48 | } 49 | 50 | function updateItems(){ 51 | image.update(); 52 | label.update(); 53 | icon.update(); 54 | mousearea.reset(); 55 | } 56 | 57 | function update(stdout) { 58 | 59 | var beforeSeparator = true; 60 | var newItems = []; 61 | 62 | stdout.split('\n').forEach(function(line) { 63 | if (line.trim().length === 0) { 64 | return; 65 | } 66 | if (line.trim() === '---') { 67 | beforeSeparator = false; 68 | return; 69 | } 70 | var parsedItem = root.parseLine(line); 71 | if (beforeSeparator) { 72 | newItems.push(parsedItem); 73 | } else if (parsedItem.dropdown !== undefined && parsedItem.dropdown === 'false') { 74 | newItems.push(parsedItem); 75 | } 76 | }); 77 | 78 | if (newItems.length == 0) { 79 | currentMessage = -1; 80 | } else if (currentMessage >= newItems.length) { 81 | currentMessage = 0; 82 | } else if (currentMessage === -1) { 83 | currentMessage = 0; 84 | } 85 | 86 | rotatingItems = newItems; 87 | 88 | 89 | if (root.command == '') { 90 | label.text = 'No command configured. Go to settings...'; 91 | } else { 92 | updateItems(); 93 | } 94 | 95 | } 96 | PlasmaCore.IconItem { 97 | id: icon 98 | visible: false 99 | source: 'dialog-ok' 100 | anchors.verticalCenter : control.verticalCenter 101 | height: control.height * 0.75 102 | 103 | function update() { 104 | var item = getCurrentItem(); 105 | if (item !== null) { 106 | source = (item.iconName !== undefined)? item.iconName: null 107 | } 108 | if (source === null) { 109 | visible = false; 110 | } else { 111 | visible = true; 112 | } 113 | iconMouseArea.cursorShape = root.isClickable(item) ? Qt.PointingHandCursor: Qt.ArrowCursor; 114 | } 115 | 116 | MouseArea { 117 | id: iconMouseArea 118 | anchors.fill: parent 119 | 120 | onClicked: { 121 | var item = getCurrentItem(); 122 | root.doItemClick(item); 123 | } 124 | } 125 | } 126 | 127 | Image { 128 | id: image 129 | fillMode: Image.PreserveAspectFit 130 | 131 | anchors.verticalCenter : control.verticalCenter 132 | height: control.height * 0.6 133 | 134 | function update() { 135 | var item = getCurrentItem(); 136 | if (item !== null) { 137 | if (item.image !== undefined) { 138 | createImageFile(item.image, function(filename) { 139 | image.source = filename; 140 | }); 141 | } 142 | 143 | if (item.imageURL !== undefined) { 144 | image.source = item.imageURL; 145 | } 146 | 147 | if (item.imageWidth !== undefined) { 148 | image.sourceSize.width = item.imageWidth 149 | } 150 | 151 | if (item.imageHeight !== undefined) { 152 | image.sourceSize.height = item.imageHeight 153 | } 154 | 155 | // clear image 156 | if (item.imageURL === undefined && item.image === undefined) { 157 | image.source = ''; 158 | } 159 | 160 | imageMouseArea.cursorShape = root.isClickable(item) ? Qt.PointingHandCursor: Qt.ArrowCursor; 161 | } 162 | } 163 | 164 | Component.onCompleted: { 165 | sourceSize.height = control.height 166 | } 167 | 168 | MouseArea { 169 | id: imageMouseArea 170 | anchors.fill: parent 171 | 172 | onClicked: { 173 | var item = getCurrentItem(); 174 | root.doItemClick(item); 175 | } 176 | } 177 | } 178 | 179 | Item { 180 | id: labelAndButtons 181 | 182 | implicitWidth: label.width + (mousearea.goButton.visible? mousearea.goButton.implicitWidth + 5 :0) + (mousearea.runButton.visible?mousearea.runButton.implicitWidth + 5 : 0) 183 | implicitHeight: label.implicitHeight 184 | 185 | anchors.verticalCenter: parent.verticalCenter 186 | readonly property bool labelTooSmall: label.implicitWidth < mousearea.runButton.implicitWidth + mousearea.goButton.implicitWidth + 10 187 | 188 | PlasmaComponents.Label { 189 | id: label 190 | text: 'starting...' 191 | textFormat: Text.RichText 192 | 193 | property var defaultFontFamily; 194 | property var defaultFontSize; 195 | property var defaultColor; 196 | 197 | anchors.verticalCenter: parent.verticalCenter 198 | 199 | elide: (labelMaxWidth > 0)? Text.ElideRight: Text.ElideNonde 200 | width: (labelMaxWidth > 0)? labelMaxWidth: label.implicitWidth 201 | 202 | Component.onCompleted: { 203 | defaultFontFamily = font.family; 204 | defaultFontSize = font.pointSize; 205 | defaultColor = color + ''; //append '' to avoid binding to color property, we want just to intialize it. 206 | update(); 207 | rotationTimer.running = true 208 | } 209 | 210 | function update() { 211 | var item = getCurrentItem(); 212 | if (item !== null) { 213 | if (item["kargos.fa_icon"]) { 214 | text = FontAwesome[item["kargos.fa_icon"]] + " " + item.title; 215 | } else { 216 | text = item.title; 217 | } 218 | 219 | if (item.font !== undefined) { 220 | font.family = item.font; 221 | } else { 222 | font.family = defaultFontFamily; 223 | } 224 | if (item.size !== undefined) { 225 | font.pointSize = item.size; 226 | } else { 227 | font.pointSize = defaultFontSize; 228 | } 229 | if (item.color !== undefined) { 230 | color = item.color; 231 | } else { 232 | color = label.defaultColor 233 | } 234 | } else { 235 | text = 'starting...'; 236 | } 237 | mousearea.item = item; 238 | 239 | var _correctedMaxWidth = label.implicitWidth 240 | } 241 | } 242 | 243 | ItemTextMouseArea { 244 | id: mousearea 245 | buttonHidingDelay: control.buttonHidingDelay 246 | 247 | onEntered: { 248 | rotationTimer.running = false; 249 | } 250 | 251 | onExited: { 252 | rotationTimer.running = true; 253 | } 254 | 255 | onWheel: { 256 | if (wheel.angleDelta.y < 0) { 257 | rotateNext(); 258 | } else if (wheel.angleDelta.y > 0) { 259 | rotatePrev(); 260 | } 261 | } 262 | } 263 | } 264 | 265 | Connections { 266 | target: commandResultsDS 267 | onExited: { 268 | control.update(stdout); 269 | } 270 | } 271 | 272 | function rotateNext() { 273 | if (control.rotatingItems.length > 0) { 274 | control.currentMessage = (control.currentMessage + 1) % control.rotatingItems.length; 275 | updateItems(); 276 | } 277 | } 278 | 279 | function rotatePrev() { 280 | if (control.rotatingItems.length > 0) { 281 | control.currentMessage = control.currentMessage - 1; 282 | if (control.currentMessage == -1) { 283 | control.currentMessage = control.rotatingItems.length - 1; 284 | } 285 | updateItems(); 286 | } 287 | } 288 | 289 | Timer { 290 | id: rotationTimer 291 | interval: plasmoid.configuration.rotation * 1000 292 | running: false 293 | repeat: true 294 | onTriggered: { 295 | rotateNext(); 296 | } 297 | } 298 | } 299 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/FullRepresentation.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | import QtQuick 2.0 22 | import org.kde.plasma.components 2.0 as PlasmaComponents 23 | import QtQuick.Controls 1.4 24 | import QtQuick.Layouts 1.1 25 | import org.kde.plasma.core 2.0 as PlasmaCore 26 | 27 | Item { 28 | id: fullRoot 29 | 30 | Layout.preferredWidth: plasmoid.configuration.width 31 | Layout.preferredHeight: plasmoid.configuration.height 32 | 33 | ListModel { 34 | id: kargosModel 35 | } 36 | 37 | Component.onCompleted: { 38 | //first update 39 | root.update(); 40 | } 41 | 42 | 43 | // Info for submenus. 44 | // This structure has information of all submenus and their visibility status. 45 | // Since on each update the listview is regenerated, we use this structure to preserve the open/closed 46 | // status of submenus 47 | property var categories: ({}); 48 | 49 | ListView { 50 | id: listView 51 | anchors.fill: parent 52 | model: kargosModel 53 | header: createHeader(); 54 | 55 | function createHeader() { 56 | if (!root.isConstrained()) { 57 | 58 | return Qt.createComponent("FirstLinesRotator.qml"); 59 | } else { 60 | return null; 61 | } 62 | 63 | } 64 | 65 | delegate: Row { 66 | 67 | id: row 68 | height: (typeof category === 'undefined' || (fullRoot.categories[category].visible)) ? row.visibleHeight: 0 69 | visible: (typeof category === 'undefined') ? true : (fullRoot.categories[category].visible) 70 | spacing: 2 71 | 72 | PlasmaCore.IconItem { 73 | id: icon 74 | source: (typeof iconName !== 'undefined')? iconName: '' 75 | anchors.verticalCenter: row.verticalCenter 76 | 77 | Component.onCompleted: { 78 | if (typeof iconName === 'undefined') { 79 | icon.width = 0 80 | } 81 | } 82 | } 83 | 84 | Image { 85 | id: image 86 | anchors.verticalCenter: row.verticalCenter 87 | fillMode: Image.PreserveAspectFit 88 | 89 | MouseArea { 90 | anchors.fill: parent 91 | cursorShape: root.isClickable(model) ? Qt.PointingHandCursor: Qt.ArrowCursor 92 | onClicked: { 93 | root.doItemClick(model); 94 | } 95 | } 96 | } 97 | 98 | Component.onCompleted: { 99 | if (typeof category !== 'undefined') { 100 | fullRoot.categories[category].rows.push(row); 101 | } 102 | 103 | if (typeof model.image !== 'undefined') { 104 | createImageFile(model.image, function(filename) { 105 | image.source = filename; 106 | }); 107 | } 108 | 109 | if (typeof model.imageURL !== 'undefined') { 110 | image.source = model.imageURL; 111 | } 112 | 113 | if (typeof model.imageWidth !== 'undefined') { 114 | image.sourceSize.width = model.imageWidth 115 | } 116 | 117 | if (typeof model.imageHeight !== 'undefined') { 118 | image.sourceSize.height = model.imageHeight 119 | } 120 | 121 | if (typeof model.image !== 'undefined' && typeof model.imageURL !== 'undefined') { 122 | image.width = 0; 123 | } 124 | } 125 | 126 | Item { 127 | id: labelAndButtons 128 | width: fullRoot.width - icon.width - arrow_icon.width - image.width//some right margin 129 | height: itemLabel.implicitHeight + 10 130 | anchors.verticalCenter: row.verticalCenter 131 | 132 | PlasmaComponents.Label { 133 | id: itemLabel 134 | text: fullRoot.createTitleText(model); 135 | width: labelAndButtons.width - (mousearea.goButton.width) - (mousearea.runButton.width) 136 | anchors.verticalCenter: labelAndButtons.verticalCenter 137 | wrapMode: Text.WordWrap 138 | // elide: Text.ElideRight 139 | Component.onCompleted: { 140 | if (typeof model.font !== 'undefined') { 141 | font.family = model.font; 142 | } 143 | if (typeof model.size !== 'undefined') { 144 | font.pointSize = model.size; 145 | } 146 | if (typeof model.color !== 'undefined') { 147 | color = model.color; 148 | } 149 | } 150 | } 151 | 152 | ItemTextMouseArea { 153 | id: mousearea 154 | item: model 155 | } 156 | } 157 | 158 | // expand-collapse icon 159 | PlasmaCore.IconItem { 160 | id: arrow_icon 161 | source: (fullRoot.categories[model.title] !== undefined && fullRoot.categories[model.title].visible) ? 'arrow-down': 'arrow-up' 162 | visible: (typeof model.category === 'undefined' && fullRoot.categories[model.title] !== undefined && fullRoot.categories[model.title].items.length > 0) ? true:false 163 | 164 | width: (visible) ? units.iconSizes.smallMedium : 0 165 | height: units.iconSizes.smallMedium 166 | 167 | MouseArea { 168 | cursorShape: Qt.PointingHandCursor 169 | anchors.fill: parent 170 | onClicked: { 171 | // In order to notify binding of fullRoot.categories property, we clone it, and then reassign it. 172 | var newState = fullRoot.copyObject(fullRoot.categories); 173 | newState[model.title].visible = !newState[model.title].visible 174 | 175 | fullRoot.categories = newState; 176 | } 177 | 178 | hoverEnabled: true 179 | 180 | onEntered: { 181 | // avoid flikering on each update 182 | timer.running = false; 183 | } 184 | 185 | onExited: { 186 | // avoid flikering on each update 187 | timer.running = true; 188 | } 189 | } 190 | } 191 | } 192 | } 193 | 194 | Connections { 195 | target: commandResultsDS 196 | onExited: { 197 | update(stdout); 198 | } 199 | } 200 | 201 | function copyObject(object) { 202 | var copy = {}; 203 | 204 | Object.keys(object).forEach(function(prop) { 205 | copy[prop] = object[prop]; 206 | 207 | }); 208 | 209 | return copy; 210 | } 211 | 212 | function createTitleText(item) { 213 | var titleText = '
'+item.title.replace(/\\n/g, '
').replace(/ /g, '  ') + '
'; 214 | 215 | return titleText; 216 | 217 | } 218 | function update(stdout) { 219 | kargosModel.clear(); 220 | 221 | var items = parseItems(stdout); 222 | 223 | items.forEach(function(item) { 224 | if (item.dropdown === undefined || item.dropdown === 'true') { 225 | if (item.category !== undefined) { 226 | if (fullRoot.categories[item.category] === undefined) { 227 | fullRoot.categories[item.category] = {visible : false, items: [], rows: []}; 228 | } 229 | 230 | if (item.category !== undefined) { 231 | fullRoot.categories[item.category].items.push(item); 232 | } 233 | } 234 | } 235 | }); 236 | 237 | items.forEach(function(item) { 238 | if (item.dropdown === undefined || item.dropdown === true) { 239 | kargosModel.append(item); 240 | } 241 | }); 242 | } 243 | } 244 | 245 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/IconifiableButton.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | import QtQuick 2.0 22 | import org.kde.plasma.components 2.0 as PlasmaComponents 23 | import QtQuick.Controls 1.4 24 | import QtQuick.Layouts 1.1 25 | import org.kde.plasma.core 2.0 as PlasmaCore 26 | 27 | Item { 28 | id: control 29 | property string text: '' 30 | property string iconName: '' 31 | 32 | 33 | width: iconMode ? controlInnerIcon.implicitWidth: controlInnerButton.implicitWidth 34 | height: iconMode ? controlInnerIcon.implicitHeight: controlInnerButton.implicitHeight 35 | 36 | property bool iconMode: true 37 | 38 | signal clicked() 39 | 40 | implicitWidth: iconMode ? controlInnerIcon.implicitWidth: controlInnerButton.implicitWidth 41 | implicitHeight: iconMode ? controlInnerIcon.implicitHeight: controlInnerButton.implicitHeight 42 | 43 | 44 | Button { 45 | id: controlInnerButton 46 | visible: !control.iconMode 47 | tooltip: control.text 48 | iconName: control.iconName 49 | anchors.fill: parent 50 | 51 | onClicked: control.clicked() 52 | } 53 | 54 | PlasmaCore.IconItem { 55 | id: controlInnerIcon 56 | visible: control.iconMode 57 | source: control.iconName 58 | //anchors.fill: parent 59 | anchors.topMargin: 5 60 | anchors.bottomMargin: 5 61 | 62 | 63 | width: controlInnerIcon.implicitWidth * 0.95 64 | 65 | // opacity: 0.5 66 | MouseArea { 67 | 68 | /*hoverEnabled: true 69 | 70 | onEntered: { 71 | controlInnerIcon.opacity = 1.0 72 | } 73 | 74 | onExited: { 75 | controlInnerIcon.opacity = 0.5 76 | }*/ 77 | 78 | anchors.fill: parent 79 | 80 | onClicked: control.clicked() 81 | } 82 | 83 | } 84 | } -------------------------------------------------------------------------------- /plasmoid/contents/ui/ItemTextMouseArea.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | import QtQuick 2.0 22 | import org.kde.plasma.components 2.0 as PlasmaComponents 23 | import QtQuick.Controls 1.4 24 | import QtQuick.Layouts 1.1 25 | import org.kde.plasma.core 2.0 as PlasmaCore 26 | 27 | 28 | MouseArea { 29 | 30 | id: mousearea 31 | anchors.fill: parent 32 | propagateComposedEvents: true 33 | hoverEnabled: true 34 | 35 | cursorShape: hasClickAction ? Qt.PointingHandCursor: Qt.ArrowCursor 36 | 37 | property bool hasClickAction: isClickable(item) 38 | 39 | property var item: null; 40 | property bool buttonHidingDelay: false 41 | 42 | property bool buttonsAlwaysVisible: false 43 | property bool buttonsShouldHide: true 44 | 45 | readonly property alias goButton: goButton 46 | readonly property alias runButton: runButton 47 | 48 | property bool iconMode: false 49 | 50 | onClicked: { 51 | root.doItemClick(item); 52 | 53 | mouse.accepted = false 54 | } 55 | 56 | onEntered: { 57 | if (buttonHidingDelay) buttonHidder.stop(); 58 | buttonsShouldHide = false; 59 | 60 | if (goButton.visible || runButton.visible) { 61 | // avoid buttons to disappear on each update 62 | timer.running = false; 63 | } 64 | } 65 | 66 | onExited: { 67 | if (!buttonsAlwaysVisible) { 68 | if (buttonHidingDelay) buttonHidder.restart(); 69 | else hideButtons(); 70 | } 71 | 72 | timer.running = true; 73 | } 74 | 75 | function reset() { 76 | if (!buttonsAlwaysVisible) { 77 | buttonsShouldHide = true 78 | } 79 | } 80 | 81 | function hideButtons() { 82 | buttonsShouldHide = true 83 | } 84 | 85 | 86 | // workaround. When the compact representation is used (kargos in a panel) 87 | // the buttons disappear just before being clicked. This is caused by the 88 | // onExited event, which hiddes all butons, is being launched before the 89 | // click event on button (so, by hidding buttons, the click eventually does not 90 | // happen). So, we delay the button hidding in order to 91 | // capture the click event 92 | Timer { 93 | id: buttonHidder 94 | interval: 1000 95 | onTriggered: { 96 | buttonsShouldHide = true 97 | } 98 | } 99 | 100 | IconifiableButton { 101 | id: goButton 102 | iconMode: mousearea.iconMode 103 | 104 | text: visible? 'Go to: '+item.href : '' 105 | iconName: 'edit-link' 106 | 107 | anchors.right: parent.right 108 | anchors.verticalCenter: parent.verticalCenter 109 | 110 | visible: item !== null && (buttonsAlwaysVisible || !buttonsShouldHide) && (typeof item.href !== 'undefined') && (typeof item.onclick === 'undefined' || item.onclick !== 'href') 111 | 112 | onClicked: { 113 | 114 | if (item !== null && item.href !== undefined) { 115 | executable.exec('xdg-open '+item.href); 116 | } 117 | doRefreshIfNeeded(item); 118 | 119 | } 120 | 121 | } 122 | 123 | IconifiableButton { 124 | id: runButton 125 | iconMode: mousearea.iconMode 126 | 127 | text: visible? 'Run: '+item.bash : '' 128 | iconName: 'run-build' 129 | 130 | anchors.right: goButton.visible? goButton.left: parent.right 131 | anchors.rightMargin: goButton.visible? (mousearea.iconMode ? 0 : 2): 0 132 | anchors.verticalCenter: parent.verticalCenter 133 | 134 | visible: item!==null && (buttonsAlwaysVisible || !buttonsShouldHide) && (typeof item.bash !== 'undefined') && (typeof item.onclick === 'undefined' || item.onclick !== 'bash') 135 | 136 | onClicked: { 137 | if (item !== null && item.bash !== undefined) { 138 | if (item.terminal !== undefined && item.terminal === 'true') { 139 | executable.exec('konsole --noclose -e '+item.bash, function() { 140 | root.doRefreshIfNeeded(item); 141 | 142 | }); 143 | } else { 144 | executable.exec(item.bash, function() { 145 | root.doRefreshIfNeeded(item); 146 | }); 147 | } 148 | } 149 | 150 | } 151 | } 152 | } -------------------------------------------------------------------------------- /plasmoid/contents/ui/config/ConfigAppearance.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 1.0 3 | import QtQuick.Layouts 1.0 4 | import org.kde.plasma.core 2.0 as PlasmaCore 5 | import org.kde.plasma.components 2.0 as PlasmaComponents 6 | import org.kde.plasma.extras 2.0 as PlasmaExtras 7 | 8 | ConfigPage { 9 | id: page 10 | 11 | property alias cfg_width: width.value 12 | property alias cfg_compactLabelMaxWidth: compactLabelMaxWidth.value 13 | property alias cfg_height: height.value 14 | property alias cfg_d_ArrowNeverVisible: d_ArrowNeverVisible.checked 15 | property alias cfg_d_ArrowAlwaysVisible: d_ArrowAlwaysVisible.checked 16 | property alias cfg_d_ArrowVisibleAsNeeded: d_ArrowVisibleAsNeeded.checked 17 | 18 | 19 | ConfigSection { 20 | label: i18n("Preferred width in px") 21 | 22 | SpinBox { 23 | id: width 24 | Layout.fillWidth: true 25 | maximumValue: 10000 26 | } 27 | } 28 | 29 | ConfigSection { 30 | label: i18n("Preferred height in px") 31 | 32 | SpinBox { 33 | id: height 34 | Layout.fillWidth: true 35 | maximumValue: 10000 36 | } 37 | } 38 | 39 | ConfigSection { 40 | label: i18n("Compact (on panel) fixed text width (0: unlimited)") 41 | 42 | SpinBox { 43 | id: compactLabelMaxWidth 44 | Layout.fillWidth: true 45 | maximumValue: 10000 46 | } 47 | } 48 | 49 | ConfigSection { 50 | 51 | GroupBox { 52 | title: i18n('Dropdown arrow visible option: ') 53 | anchors.left: parent.left 54 | Layout.columnSpan: 2 55 | 56 | ColumnLayout { 57 | ExclusiveGroup { id: dropdownArrowVisibleGroup } 58 | RadioButton { 59 | id: d_ArrowAlwaysVisible 60 | text: i18n('Always visible') 61 | exclusiveGroup: dropdownArrowVisibleGroup 62 | } 63 | RadioButton { 64 | id: d_ArrowVisibleAsNeeded 65 | text: i18n('Visible as needed') 66 | exclusiveGroup: dropdownArrowVisibleGroup 67 | } 68 | RadioButton { 69 | id: d_ArrowNeverVisible 70 | text: i18n('Never visible') 71 | exclusiveGroup: dropdownArrowVisibleGroup 72 | } 73 | } 74 | } 75 | 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/config/ConfigGeneral.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 1.0 3 | import QtQuick.Layouts 1.0 4 | import org.kde.plasma.core 2.0 as PlasmaCore 5 | import org.kde.plasma.components 2.0 as PlasmaComponents 6 | import org.kde.plasma.extras 2.0 as PlasmaExtras 7 | 8 | ConfigPage { 9 | id: page 10 | 11 | property alias cfg_command: command.text 12 | property alias cfg_interval: interval.value 13 | property alias cfg_rotation: rotation.value 14 | 15 | ConfigSection { 16 | label: i18n("Command line or executable path. The output of this command will be parsed following the Argos/Bitbar convention") 17 | 18 | TextField { 19 | id: command 20 | Layout.fillWidth: true 21 | } 22 | } 23 | 24 | ConfigSection { 25 | label: i18n("Interval in seconds (ignored if the previous property is an executable with the interval on its name. ex: myplugin.1s.sh)") 26 | 27 | SpinBox { 28 | id: interval 29 | Layout.fillWidth: true 30 | maximumValue: 99999 31 | } 32 | } 33 | 34 | ConfigSection { 35 | label: i18n("Rotation delay in seconds (rotation interval of the lines before the ---)") 36 | 37 | SpinBox { 38 | id: rotation 39 | Layout.fillWidth: true 40 | maximumValue: 60 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/config/ConfigPage.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Layouts 1.0 3 | 4 | ColumnLayout { 5 | id: page 6 | Layout.fillWidth: true 7 | default property alias _contentChildren: content.data 8 | 9 | 10 | ColumnLayout { 11 | id: content 12 | Layout.fillWidth: true 13 | Layout.alignment: Qt.AlignTop 14 | 15 | // Workaround for crash when using default on a Layout. 16 | // https://bugreports.qt.io/browse/QTBUG-52490 17 | // Still affecting Qt 5.7.0 18 | Component.onDestruction: { 19 | while (children.length > 0) { 20 | children[children.length - 1].parent = page; 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/config/ConfigSection.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | import QtQuick.Controls 1.0 3 | import QtQuick.Layouts 1.0 4 | 5 | // Alternative to GroupBox for when we want the title to always be left aligned. 6 | Rectangle { 7 | id: control 8 | Layout.fillWidth: true 9 | default property alias _contentChildren: content.children 10 | property string label: "" 11 | 12 | color: "#0c000000" 13 | border.width: 2 14 | border.color: "#10000000" 15 | // radius: 5 16 | property int padding: 8 17 | height: childrenRect.height + padding + padding 18 | property alias spacing: content.spacing 19 | 20 | Label { 21 | id: title 22 | visible: control.label 23 | text: control.label 24 | anchors.leftMargin: padding 25 | // anchors.topMargin: padding 26 | anchors.left: parent.left 27 | anchors.top: parent.top 28 | anchors.right: parent.right 29 | height: visible ? implicitHeight : padding 30 | Layout.fillWidth: true 31 | wrapMode: Text.WordWrap 32 | width: control.width 33 | 34 | } 35 | 36 | ColumnLayout { 37 | id: content 38 | anchors.top: title.bottom 39 | anchors.left: parent.left 40 | anchors.right: parent.right 41 | anchors.margins: padding 42 | // spacing: 0 43 | // height: childrenRect.height 44 | 45 | // Workaround for crash when using default on a Layout. 46 | // https://bugreports.qt.io/browse/QTBUG-52490 47 | // Still affecting Qt 5.7.0 48 | Component.onDestruction: { 49 | while (children.length > 0) { 50 | children[children.length - 1].parent = control; 51 | } 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /plasmoid/contents/ui/main.qml: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * kargos 4 | * 5 | * Copyright (C) 2017 - 2020 Daniel Glez-Peña 6 | * 7 | * This program is free software: you can redistribute it and/or modify 8 | * it under the terms of the GNU General Public License as 9 | * published by the Free Software Foundation, either version 3 of the 10 | * License, or (at your option) any later version. 11 | * 12 | * This program is distributed in the hope that it will be useful, 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | * GNU General Public License for more details. 16 | * 17 | * You should have received a copy of the GNU General Public 18 | * License along with this program. If not, see 19 | * . 20 | */ 21 | import QtQuick 2.0 22 | import QtQuick.Layouts 1.1 23 | import QtQuick.Controls 1.4 24 | 25 | import org.kde.plasma.components 2.0 as PlasmaComponents 26 | import org.kde.plasma.core 2.0 as PlasmaCore 27 | import org.kde.plasma.plasmoid 2.0 28 | import org.kde.kquickcontrolsaddons 2.0 29 | 30 | Item { 31 | id: root 32 | 33 | // status bar only show icon, no words if constrained 34 | Plasmoid.preferredRepresentation: isConstrained() ? Plasmoid.compactRepresentation : Plasmoid.fullRepresentation 35 | //Plasmoid.preferredRepresentation: Plasmoid.compactRepresentation 36 | 37 | Plasmoid.compactRepresentation: CompactRepresentation {} 38 | Plasmoid.fullRepresentation: FullRepresentation {} 39 | 40 | property int interval; 41 | property int dropdownItemsCount: -1; 42 | 43 | function isConstrained() { 44 | return (plasmoid.formFactor == PlasmaCore.Types.Vertical || plasmoid.formFactor == PlasmaCore.Types.Horizontal); 45 | } 46 | 47 | property var command: plasmoid.configuration.command 48 | 49 | onCommandChanged: { 50 | update(); 51 | } 52 | 53 | Component.onCompleted: { 54 | timer.running = true; 55 | } 56 | 57 | function update() { 58 | if (command === '') { 59 | plasmoid.setConfigurationRequired(true, 'You need to provide a command'); 60 | 61 | } else { 62 | plasmoid.setConfigurationRequired(false); 63 | } 64 | //dropdownItemsCount = 0; 65 | commandResultsDS.exec(command); 66 | updateInterval(); 67 | } 68 | 69 | function updateInterval() { 70 | var commandTokens = command.split('.'); 71 | 72 | if (commandTokens.length >= 3) { 73 | var intervalToken = commandTokens[commandTokens.length - 2]; //ex: 1s 74 | 75 | 76 | if (/^[0-9]+[smhd]$/.test(intervalToken)) { 77 | var lastChar = intervalToken.charAt(intervalToken.length-1); 78 | switch (lastChar) { 79 | case 's': timer.interval = parseInt(intervalToken.slice(0, -1)) * 1000; break; 80 | case 'm': timer.interval = parseInt(intervalToken.slice(0, -1)) * 1000 * 60; break; 81 | case 'h': timer.interval = parseInt(intervalToken.slice(0, -1)) * 1000 * 3600; break; 82 | case 'd': timer.interval = parseInt(intervalToken.slice(0, -1)) * 1000 * 3600 * 24; break; 83 | } 84 | } 85 | } else { 86 | timer.interval = plasmoid.configuration.interval * 1000 87 | } 88 | } 89 | 90 | 91 | function parseLine(line, currentCategory) { 92 | var parsedObject = {title: line}; 93 | 94 | if (line.indexOf('|') != -1) { 95 | parsedObject.title = line.split('|')[0].replace(/\s+$/, ''); 96 | 97 | var attributesToken = line.split('|')[1].trim(); 98 | 99 | // replace \' to string __ESCAPED_QUOTE__ 100 | attributesToken = attributesToken.replace(/\\'/g, '__ESCAPED_QUOTE__'); 101 | var tokens = attributesToken.match(/([^\s']+=[^\s']+|[^\s']+='[^']*')+/g) 102 | tokens.forEach(function(attribute_value) { 103 | if (attribute_value.indexOf('=')!=-1) { 104 | parsedObject[attribute_value.split('=')[0]] = attribute_value.substring(attribute_value.indexOf('=') + 1).replace(/'/g, '').replace(/__ESCAPED_QUOTE__/g, "'"); 105 | } 106 | }); 107 | } 108 | 109 | // submenus 110 | if (parsedObject.title.match(/^--/)) { 111 | parsedObject.title = parsedObject.title.substring(2).trim(); 112 | if (currentCategory !== undefined) { 113 | parsedObject.category = currentCategory; 114 | } 115 | } 116 | return parsedObject; 117 | } 118 | 119 | function parseItems(stdout) { 120 | var items = []; 121 | var currentCategory = null; 122 | 123 | var menuGroupsStrings = stdout.split("---"); 124 | 125 | var totalItems = 0; 126 | if (menuGroupsStrings.length > 1) { 127 | 128 | for (var i = 1; i < menuGroupsStrings.length; i++) { 129 | var groupString = menuGroupsStrings[i]; 130 | 131 | var groupTokens = groupString.trim().split('\n'); 132 | groupTokens.forEach(function (groupToken) { 133 | var parsedItem = root.parseLine(groupToken, currentCategory); 134 | if (parsedItem.category === undefined) { 135 | currentCategory = parsedItem.title; 136 | } 137 | items.push(parsedItem); 138 | totalItems ++; 139 | 140 | }); 141 | } 142 | } 143 | return items; 144 | } 145 | 146 | function doRefreshIfNeeded(item) { 147 | if (item !== null && item.refresh == 'true') { 148 | root.update(); 149 | } 150 | } 151 | 152 | function doItemClick(item) { 153 | 154 | if (item !== null && item.href !== undefined && item.onclick === 'href') { 155 | executable.exec('xdg-open '+item.href); 156 | } 157 | 158 | if (item !== null && item.bash !== undefined && item.onclick === 'bash') { 159 | if (item.terminal !== undefined && item.terminal === 'true') { 160 | executable.exec('konsole --noclose -e '+item.bash, function() { 161 | doRefreshIfNeeded(item); 162 | }); 163 | } else { 164 | executable.exec(item.bash, function() { 165 | doRefreshIfNeeded(item); 166 | }); 167 | } 168 | } else { 169 | doRefreshIfNeeded(item); 170 | } 171 | } 172 | 173 | function isClickable(item) { 174 | return item !==null && (item.refresh == 'true' || item.onclick == 'href' || item.onclick == 'bash'); 175 | } 176 | 177 | // DataSource for the user command execution results 178 | PlasmaCore.DataSource { 179 | id: commandResultsDS 180 | engine: "executable" 181 | connectedSources: [] 182 | onNewData: { 183 | var stdout = data["stdout"] 184 | exited(sourceName, stdout) 185 | disconnectSource(sourceName) // cmd finished 186 | } 187 | 188 | function exec(cmd) { 189 | connectSource(cmd) 190 | } 191 | signal exited(string sourceName, string stdout) 192 | 193 | } 194 | 195 | // Generic DataSource to execute internal kargo commands (like running bash 196 | // attribute or open the browser with href) 197 | PlasmaCore.DataSource { 198 | id: executable 199 | engine: "executable" 200 | connectedSources: [] 201 | property var callbacks: ({}) 202 | onNewData: { 203 | var stdout = data["stdout"] 204 | 205 | if (callbacks[sourceName] !== undefined) { 206 | callbacks[sourceName](stdout); 207 | } 208 | 209 | exited(sourceName, stdout) 210 | disconnectSource(sourceName) // cmd finished 211 | } 212 | 213 | function exec(cmd, onNewDataCallback) { 214 | if (onNewDataCallback !== undefined){ 215 | callbacks[cmd] = onNewDataCallback 216 | } 217 | connectSource(cmd) 218 | 219 | } 220 | signal exited(string sourceName, string stdout) 221 | 222 | } 223 | 224 | property var imagesIndex: ({}) 225 | 226 | function createImageFile(base64, callback) { 227 | var filename = imagesIndex[base64]; 228 | if (filename === undefined) { 229 | executable.exec('/bin/bash -c \'file=$(mktemp /tmp/kargos.image.XXXXXX); echo "'+base64+'" | base64 -d > $file; echo -n $file\'', function(filename) { 230 | imagesIndex[base64] = filename; 231 | callback(filename); 232 | }); 233 | } else { 234 | callback(filename); 235 | } 236 | 237 | } 238 | 239 | Connections { 240 | target: commandResultsDS 241 | onExited: { 242 | dropdownItemsCount = parseItems(stdout).filter( 243 | function(item) { 244 | return item.dropdown === undefined || item.dropdown !== 'false' 245 | }).length; 246 | 247 | if (stdout.indexOf('---') === -1) { 248 | plasmoid.expanded = false 249 | } 250 | } 251 | } 252 | 253 | Connections { 254 | target: plasmoid 255 | // `externalData` is emitted when the containment decides to send data to a plasmoid. 256 | // More usefully (for us at least), plasmoidviewer also sends its first argument this way. 257 | // So, for development we can do: 258 | // $ plasmoidviewer -a ./plasmoid "echo hello world" 259 | // and this will set the command as "echo hello world". 260 | onExternalData: function (mimeType, data) { 261 | console.debug("Got externalData: " + data); 262 | if (!command) { 263 | command = data; 264 | } 265 | } 266 | } 267 | 268 | Timer { 269 | id: timer 270 | interval: plasmoid.configuration.interval * 1000 271 | running: false 272 | repeat: true 273 | onTriggered: update() 274 | } 275 | } 276 | -------------------------------------------------------------------------------- /plasmoid/contents/vendor/FontAwesome/FontAwesome.qml: -------------------------------------------------------------------------------- 1 | pragma Singleton 2 | import QtQuick 2.0 3 | 4 | Object { 5 | 6 | FontLoader { 7 | source: "./fontawesome-webfont.ttf" 8 | } 9 | 10 | property string fontFamily: "FontAwesome" 11 | 12 | // Icons 13 | property string addressBook : "\uf2b9" 14 | property string addressBookO : "\uf2ba" 15 | property string addressCard : "\uf2bb" 16 | property string addressCardO : "\uf2bc" 17 | property string adjust : "\uf042" 18 | property string adn : "\uf170" 19 | property string alignCenter : "\uf037" 20 | property string alignJustify : "\uf039" 21 | property string alignLeft : "\uf036" 22 | property string alignRight : "\uf038" 23 | property string amazon : "\uf270" 24 | property string ambulance : "\uf0f9" 25 | property string americanSignLanguageInterpreting : "\uf2a3" 26 | property string anchor : "\uf13d" 27 | property string android : "\uf17b" 28 | property string angellist : "\uf209" 29 | property string angleDoubleDown : "\uf103" 30 | property string angleDoubleLeft : "\uf100" 31 | property string angleDoubleRight : "\uf101" 32 | property string angleDoubleUp : "\uf102" 33 | property string angleDown : "\uf107" 34 | property string angleLeft : "\uf104" 35 | property string angleRight : "\uf105" 36 | property string angleUp : "\uf106" 37 | property string apple : "\uf179" 38 | property string archive : "\uf187" 39 | property string areaChart : "\uf1fe" 40 | property string arrowCircleDown : "\uf0ab" 41 | property string arrowCircleLeft : "\uf0a8" 42 | property string arrowCircleODown : "\uf01a" 43 | property string arrowCircleOLeft : "\uf190" 44 | property string arrowCircleORight : "\uf18e" 45 | property string arrowCircleOUp : "\uf01b" 46 | property string arrowCircleRight : "\uf0a9" 47 | property string arrowCircleUp : "\uf0aa" 48 | property string arrowDown : "\uf063" 49 | property string arrowLeft : "\uf060" 50 | property string arrowRight : "\uf061" 51 | property string arrowUp : "\uf062" 52 | property string arrows : "\uf047" 53 | property string arrowsAlt : "\uf0b2" 54 | property string arrowsH : "\uf07e" 55 | property string arrowsV : "\uf07d" 56 | property string aslInterpreting : "\uf2a3" 57 | property string assistiveListeningSystems : "\uf2a2" 58 | property string asterisk : "\uf069" 59 | property string at : "\uf1fa" 60 | property string audioDescription : "\uf29e" 61 | property string automobile : "\uf1b9" 62 | property string backward : "\uf04a" 63 | property string balanceScale : "\uf24e" 64 | property string ban : "\uf05e" 65 | property string bandcamp : "\uf2d5" 66 | property string bank : "\uf19c" 67 | property string barChart : "\uf080" 68 | property string barChartO : "\uf080" 69 | property string barcode : "\uf02a" 70 | property string bars : "\uf0c9" 71 | property string bath : "\uf2cd" 72 | property string bathtub : "\uf2cd" 73 | property string battery : "\uf240" 74 | property string battery0 : "\uf244" 75 | property string battery1 : "\uf243" 76 | property string battery2 : "\uf242" 77 | property string battery3 : "\uf241" 78 | property string battery4 : "\uf240" 79 | property string batteryEmpty : "\uf244" 80 | property string batteryFull : "\uf240" 81 | property string batteryHalf : "\uf242" 82 | property string batteryQuarter : "\uf243" 83 | property string batteryThreeQuarters : "\uf241" 84 | property string bed : "\uf236" 85 | property string beer : "\uf0fc" 86 | property string behance : "\uf1b4" 87 | property string behanceSquare : "\uf1b5" 88 | property string bell : "\uf0f3" 89 | property string bellO : "\uf0a2" 90 | property string bellSlash : "\uf1f6" 91 | property string bellSlashO : "\uf1f7" 92 | property string bicycle : "\uf206" 93 | property string binoculars : "\uf1e5" 94 | property string birthdayCake : "\uf1fd" 95 | property string bitbucket : "\uf171" 96 | property string bitbucketSquare : "\uf172" 97 | property string bitcoin : "\uf15a" 98 | property string blackTie : "\uf27e" 99 | property string blind : "\uf29d" 100 | property string bluetooth : "\uf293" 101 | property string bluetoothB : "\uf294" 102 | property string bold : "\uf032" 103 | property string bolt : "\uf0e7" 104 | property string bomb : "\uf1e2" 105 | property string book : "\uf02d" 106 | property string bookmark : "\uf02e" 107 | property string bookmarkO : "\uf097" 108 | property string braille : "\uf2a1" 109 | property string briefcase : "\uf0b1" 110 | property string btc : "\uf15a" 111 | property string bug : "\uf188" 112 | property string building : "\uf1ad" 113 | property string buildingO : "\uf0f7" 114 | property string bullhorn : "\uf0a1" 115 | property string bullseye : "\uf140" 116 | property string bus : "\uf207" 117 | property string buysellads : "\uf20d" 118 | property string cab : "\uf1ba" 119 | property string calculator : "\uf1ec" 120 | property string calendar : "\uf073" 121 | property string calendarCheckO : "\uf274" 122 | property string calendarMinusO : "\uf272" 123 | property string calendarO : "\uf133" 124 | property string calendarPlusO : "\uf271" 125 | property string calendarTimesO : "\uf273" 126 | property string camera : "\uf030" 127 | property string cameraRetro : "\uf083" 128 | property string car : "\uf1b9" 129 | property string caretDown : "\uf0d7" 130 | property string caretLeft : "\uf0d9" 131 | property string caretRight : "\uf0da" 132 | property string caretSquareODown : "\uf150" 133 | property string caretSquareOLeft : "\uf191" 134 | property string caretSquareORight : "\uf152" 135 | property string caretSquareOUp : "\uf151" 136 | property string caretUp : "\uf0d8" 137 | property string cartArrowDown : "\uf218" 138 | property string cartPlus : "\uf217" 139 | property string cc : "\uf20a" 140 | property string ccAmex : "\uf1f3" 141 | property string ccDinersClub : "\uf24c" 142 | property string ccDiscover : "\uf1f2" 143 | property string ccJcb : "\uf24b" 144 | property string ccMastercard : "\uf1f1" 145 | property string ccPaypal : "\uf1f4" 146 | property string ccStripe : "\uf1f5" 147 | property string ccVisa : "\uf1f0" 148 | property string certificate : "\uf0a3" 149 | property string chain : "\uf0c1" 150 | property string chainBroken : "\uf127" 151 | property string check : "\uf00c" 152 | property string checkCircle : "\uf058" 153 | property string checkCircleO : "\uf05d" 154 | property string checkSquare : "\uf14a" 155 | property string checkSquareO : "\uf046" 156 | property string chevronCircleDown : "\uf13a" 157 | property string chevronCircleLeft : "\uf137" 158 | property string chevronCircleRight : "\uf138" 159 | property string chevronCircleUp : "\uf139" 160 | property string chevronDown : "\uf078" 161 | property string chevronLeft : "\uf053" 162 | property string chevronRight : "\uf054" 163 | property string chevronUp : "\uf077" 164 | property string child : "\uf1ae" 165 | property string chrome : "\uf268" 166 | property string circle : "\uf111" 167 | property string circleO : "\uf10c" 168 | property string circleONotch : "\uf1ce" 169 | property string circleThin : "\uf1db" 170 | property string clipboard : "\uf0ea" 171 | property string clockO : "\uf017" 172 | property string clone : "\uf24d" 173 | property string close : "\uf00d" 174 | property string cloud : "\uf0c2" 175 | property string cloudDownload : "\uf0ed" 176 | property string cloudUpload : "\uf0ee" 177 | property string cny : "\uf157" 178 | property string code : "\uf121" 179 | property string codeFork : "\uf126" 180 | property string codepen : "\uf1cb" 181 | property string codiepie : "\uf284" 182 | property string coffee : "\uf0f4" 183 | property string cog : "\uf013" 184 | property string cogs : "\uf085" 185 | property string columns : "\uf0db" 186 | property string comment : "\uf075" 187 | property string commentO : "\uf0e5" 188 | property string commenting : "\uf27a" 189 | property string commentingO : "\uf27b" 190 | property string comments : "\uf086" 191 | property string commentsO : "\uf0e6" 192 | property string compass : "\uf14e" 193 | property string compress : "\uf066" 194 | property string connectdevelop : "\uf20e" 195 | property string contao : "\uf26d" 196 | property string copy : "\uf0c5" 197 | property string copyright : "\uf1f9" 198 | property string creativeCommons : "\uf25e" 199 | property string creditCard : "\uf09d" 200 | property string creditCardAlt : "\uf283" 201 | property string crop : "\uf125" 202 | property string crosshairs : "\uf05b" 203 | property string css3 : "\uf13c" 204 | property string cube : "\uf1b2" 205 | property string cubes : "\uf1b3" 206 | property string cut : "\uf0c4" 207 | property string cutlery : "\uf0f5" 208 | property string dashboard : "\uf0e4" 209 | property string dashcube : "\uf210" 210 | property string database : "\uf1c0" 211 | property string deaf : "\uf2a4" 212 | property string deafness : "\uf2a4" 213 | property string dedent : "\uf03b" 214 | property string delicious : "\uf1a5" 215 | property string desktop : "\uf108" 216 | property string deviantart : "\uf1bd" 217 | property string diamond : "\uf219" 218 | property string digg : "\uf1a6" 219 | property string dollar : "\uf155" 220 | property string dotCircleO : "\uf192" 221 | property string download : "\uf019" 222 | property string dribbble : "\uf17d" 223 | property string driversLicense : "\uf2c2" 224 | property string driversLicenseO : "\uf2c3" 225 | property string dropbox : "\uf16b" 226 | property string drupal : "\uf1a9" 227 | property string edge : "\uf282" 228 | property string edit : "\uf044" 229 | property string eercast : "\uf2da" 230 | property string eject : "\uf052" 231 | property string ellipsisH : "\uf141" 232 | property string ellipsisV : "\uf142" 233 | property string empire : "\uf1d1" 234 | property string envelope : "\uf0e0" 235 | property string envelopeO : "\uf003" 236 | property string envelopeOpen : "\uf2b6" 237 | property string envelopeOpenO : "\uf2b7" 238 | property string envelopeSquare : "\uf199" 239 | property string envira : "\uf299" 240 | property string eraser : "\uf12d" 241 | property string etsy : "\uf2d7" 242 | property string eur : "\uf153" 243 | property string euro : "\uf153" 244 | property string exchange : "\uf0ec" 245 | property string exclamation : "\uf12a" 246 | property string exclamationCircle : "\uf06a" 247 | property string exclamationTriangle : "\uf071" 248 | property string expand : "\uf065" 249 | property string expeditedssl : "\uf23e" 250 | property string externalLink : "\uf08e" 251 | property string externalLinkSquare : "\uf14c" 252 | property string eye : "\uf06e" 253 | property string eyeSlash : "\uf070" 254 | property string eyedropper : "\uf1fb" 255 | property string fa : "\uf2b4" 256 | property string facebook : "\uf09a" 257 | property string facebookF : "\uf09a" 258 | property string facebookOfficial : "\uf230" 259 | property string facebookSquare : "\uf082" 260 | property string fastBackward : "\uf049" 261 | property string fastForward : "\uf050" 262 | property string fax : "\uf1ac" 263 | property string feed : "\uf09e" 264 | property string female : "\uf182" 265 | property string fighterJet : "\uf0fb" 266 | property string file : "\uf15b" 267 | property string fileArchiveO : "\uf1c6" 268 | property string fileAudioO : "\uf1c7" 269 | property string fileCodeO : "\uf1c9" 270 | property string fileExcelO : "\uf1c3" 271 | property string fileImageO : "\uf1c5" 272 | property string fileMovieO : "\uf1c8" 273 | property string fileO : "\uf016" 274 | property string filePdfO : "\uf1c1" 275 | property string filePhotoO : "\uf1c5" 276 | property string filePictureO : "\uf1c5" 277 | property string filePowerpointO : "\uf1c4" 278 | property string fileSoundO : "\uf1c7" 279 | property string fileText : "\uf15c" 280 | property string fileTextO : "\uf0f6" 281 | property string fileVideoO : "\uf1c8" 282 | property string fileWordO : "\uf1c2" 283 | property string fileZipO : "\uf1c6" 284 | property string filesO : "\uf0c5" 285 | property string film : "\uf008" 286 | property string filter : "\uf0b0" 287 | property string fire : "\uf06d" 288 | property string fireExtinguisher : "\uf134" 289 | property string firefox : "\uf269" 290 | property string firstOrder : "\uf2b0" 291 | property string flag : "\uf024" 292 | property string flagCheckered : "\uf11e" 293 | property string flagO : "\uf11d" 294 | property string flash : "\uf0e7" 295 | property string flask : "\uf0c3" 296 | property string flickr : "\uf16e" 297 | property string floppyO : "\uf0c7" 298 | property string folder : "\uf07b" 299 | property string folderO : "\uf114" 300 | property string folderOpen : "\uf07c" 301 | property string folderOpenO : "\uf115" 302 | property string font : "\uf031" 303 | property string fontAwesome : "\uf2b4" 304 | property string fonticons : "\uf280" 305 | property string fortAwesome : "\uf286" 306 | property string forumbee : "\uf211" 307 | property string forward : "\uf04e" 308 | property string foursquare : "\uf180" 309 | property string freeCodeCamp : "\uf2c5" 310 | property string frownO : "\uf119" 311 | property string futbolO : "\uf1e3" 312 | property string gamepad : "\uf11b" 313 | property string gavel : "\uf0e3" 314 | property string gbp : "\uf154" 315 | property string ge : "\uf1d1" 316 | property string gear : "\uf013" 317 | property string gears : "\uf085" 318 | property string genderless : "\uf22d" 319 | property string getPocket : "\uf265" 320 | property string gg : "\uf260" 321 | property string ggCircle : "\uf261" 322 | property string gift : "\uf06b" 323 | property string git : "\uf1d3" 324 | property string gitSquare : "\uf1d2" 325 | property string github : "\uf09b" 326 | property string githubAlt : "\uf113" 327 | property string githubSquare : "\uf092" 328 | property string gitlab : "\uf296" 329 | property string gittip : "\uf184" 330 | property string glass : "\uf000" 331 | property string glide : "\uf2a5" 332 | property string glideG : "\uf2a6" 333 | property string globe : "\uf0ac" 334 | property string google : "\uf1a0" 335 | property string googlePlus : "\uf0d5" 336 | property string googlePlusCircle : "\uf2b3" 337 | property string googlePlusOfficial : "\uf2b3" 338 | property string googlePlusSquare : "\uf0d4" 339 | property string googleWallet : "\uf1ee" 340 | property string graduationCap : "\uf19d" 341 | property string gratipay : "\uf184" 342 | property string grav : "\uf2d6" 343 | property string group : "\uf0c0" 344 | property string hSquare : "\uf0fd" 345 | property string hackerNews : "\uf1d4" 346 | property string handGrabO : "\uf255" 347 | property string handLizardO : "\uf258" 348 | property string handODown : "\uf0a7" 349 | property string handOLeft : "\uf0a5" 350 | property string handORight : "\uf0a4" 351 | property string handOUp : "\uf0a6" 352 | property string handPaperO : "\uf256" 353 | property string handPeaceO : "\uf25b" 354 | property string handPointerO : "\uf25a" 355 | property string handRockO : "\uf255" 356 | property string handScissorsO : "\uf257" 357 | property string handSpockO : "\uf259" 358 | property string handStopO : "\uf256" 359 | property string handshakeO : "\uf2b5" 360 | property string hardOfHearing : "\uf2a4" 361 | property string hashtag : "\uf292" 362 | property string hddO : "\uf0a0" 363 | property string header : "\uf1dc" 364 | property string headphones : "\uf025" 365 | property string heart : "\uf004" 366 | property string heartO : "\uf08a" 367 | property string heartbeat : "\uf21e" 368 | property string history : "\uf1da" 369 | property string home : "\uf015" 370 | property string hospitalO : "\uf0f8" 371 | property string hotel : "\uf236" 372 | property string hourglass : "\uf254" 373 | property string hourglass1 : "\uf251" 374 | property string hourglass2 : "\uf252" 375 | property string hourglass3 : "\uf253" 376 | property string hourglassEnd : "\uf253" 377 | property string hourglassHalf : "\uf252" 378 | property string hourglassO : "\uf250" 379 | property string hourglassStart : "\uf251" 380 | property string houzz : "\uf27c" 381 | property string html5 : "\uf13b" 382 | property string iCursor : "\uf246" 383 | property string idBadge : "\uf2c1" 384 | property string idCard : "\uf2c2" 385 | property string idCardO : "\uf2c3" 386 | property string ils : "\uf20b" 387 | property string image : "\uf03e" 388 | property string imdb : "\uf2d8" 389 | property string inbox : "\uf01c" 390 | property string indent : "\uf03c" 391 | property string industry : "\uf275" 392 | property string info : "\uf129" 393 | property string infoCircle : "\uf05a" 394 | property string inr : "\uf156" 395 | property string instagram : "\uf16d" 396 | property string institution : "\uf19c" 397 | property string internetExplorer : "\uf26b" 398 | property string intersex : "\uf224" 399 | property string ioxhost : "\uf208" 400 | property string italic : "\uf033" 401 | property string joomla : "\uf1aa" 402 | property string jpy : "\uf157" 403 | property string jsfiddle : "\uf1cc" 404 | property string key : "\uf084" 405 | property string keyboardO : "\uf11c" 406 | property string krw : "\uf159" 407 | property string language : "\uf1ab" 408 | property string laptop : "\uf109" 409 | property string lastfm : "\uf202" 410 | property string lastfmSquare : "\uf203" 411 | property string leaf : "\uf06c" 412 | property string leanpub : "\uf212" 413 | property string legal : "\uf0e3" 414 | property string lemonO : "\uf094" 415 | property string levelDown : "\uf149" 416 | property string levelUp : "\uf148" 417 | property string lifeBouy : "\uf1cd" 418 | property string lifeBuoy : "\uf1cd" 419 | property string lifeRing : "\uf1cd" 420 | property string lifeSaver : "\uf1cd" 421 | property string lightbulbO : "\uf0eb" 422 | property string lineChart : "\uf201" 423 | property string link : "\uf0c1" 424 | property string linkedin : "\uf0e1" 425 | property string linkedinSquare : "\uf08c" 426 | property string linode : "\uf2b8" 427 | property string linux : "\uf17c" 428 | property string list : "\uf03a" 429 | property string listAlt : "\uf022" 430 | property string listOl : "\uf0cb" 431 | property string listUl : "\uf0ca" 432 | property string locationArrow : "\uf124" 433 | property string lock : "\uf023" 434 | property string longArrowDown : "\uf175" 435 | property string longArrowLeft : "\uf177" 436 | property string longArrowRight : "\uf178" 437 | property string longArrowUp : "\uf176" 438 | property string lowVision : "\uf2a8" 439 | property string magic : "\uf0d0" 440 | property string magnet : "\uf076" 441 | property string mailForward : "\uf064" 442 | property string mailReply : "\uf112" 443 | property string mailReplyAll : "\uf122" 444 | property string male : "\uf183" 445 | property string map : "\uf279" 446 | property string mapMarker : "\uf041" 447 | property string mapO : "\uf278" 448 | property string mapPin : "\uf276" 449 | property string mapSigns : "\uf277" 450 | property string mars : "\uf222" 451 | property string marsDouble : "\uf227" 452 | property string marsStroke : "\uf229" 453 | property string marsStrokeH : "\uf22b" 454 | property string marsStrokeV : "\uf22a" 455 | property string maxcdn : "\uf136" 456 | property string meanpath : "\uf20c" 457 | property string medium : "\uf23a" 458 | property string medkit : "\uf0fa" 459 | property string meetup : "\uf2e0" 460 | property string mehO : "\uf11a" 461 | property string mercury : "\uf223" 462 | property string microchip : "\uf2db" 463 | property string microphone : "\uf130" 464 | property string microphoneSlash : "\uf131" 465 | property string minus : "\uf068" 466 | property string minusCircle : "\uf056" 467 | property string minusSquare : "\uf146" 468 | property string minusSquareO : "\uf147" 469 | property string mixcloud : "\uf289" 470 | property string mobile : "\uf10b" 471 | property string mobilePhone : "\uf10b" 472 | property string modx : "\uf285" 473 | property string money : "\uf0d6" 474 | property string moonO : "\uf186" 475 | property string mortarBoard : "\uf19d" 476 | property string motorcycle : "\uf21c" 477 | property string mousePointer : "\uf245" 478 | property string music : "\uf001" 479 | property string navicon : "\uf0c9" 480 | property string neuter : "\uf22c" 481 | property string newspaperO : "\uf1ea" 482 | property string objectGroup : "\uf247" 483 | property string objectUngroup : "\uf248" 484 | property string odnoklassniki : "\uf263" 485 | property string odnoklassnikiSquare : "\uf264" 486 | property string opencart : "\uf23d" 487 | property string openid : "\uf19b" 488 | property string opera : "\uf26a" 489 | property string optinMonster : "\uf23c" 490 | property string outdent : "\uf03b" 491 | property string pagelines : "\uf18c" 492 | property string paintBrush : "\uf1fc" 493 | property string paperPlane : "\uf1d8" 494 | property string paperPlaneO : "\uf1d9" 495 | property string paperclip : "\uf0c6" 496 | property string paragraph : "\uf1dd" 497 | property string paste : "\uf0ea" 498 | property string pause : "\uf04c" 499 | property string pauseCircle : "\uf28b" 500 | property string pauseCircleO : "\uf28c" 501 | property string paw : "\uf1b0" 502 | property string paypal : "\uf1ed" 503 | property string pencil : "\uf040" 504 | property string pencilSquare : "\uf14b" 505 | property string pencilSquareO : "\uf044" 506 | property string percent : "\uf295" 507 | property string phone : "\uf095" 508 | property string phoneSquare : "\uf098" 509 | property string photo : "\uf03e" 510 | property string pictureO : "\uf03e" 511 | property string pieChart : "\uf200" 512 | property string piedPiper : "\uf2ae" 513 | property string piedPiperAlt : "\uf1a8" 514 | property string piedPiperPp : "\uf1a7" 515 | property string pinterest : "\uf0d2" 516 | property string pinterestP : "\uf231" 517 | property string pinterestSquare : "\uf0d3" 518 | property string plane : "\uf072" 519 | property string play : "\uf04b" 520 | property string playCircle : "\uf144" 521 | property string playCircleO : "\uf01d" 522 | property string plug : "\uf1e6" 523 | property string plus : "\uf067" 524 | property string plusCircle : "\uf055" 525 | property string plusSquare : "\uf0fe" 526 | property string plusSquareO : "\uf196" 527 | property string podcast : "\uf2ce" 528 | property string powerOff : "\uf011" 529 | property string printIcon : "\uf02f" 530 | property string productHunt : "\uf288" 531 | property string puzzlePiece : "\uf12e" 532 | property string qq : "\uf1d6" 533 | property string qrcode : "\uf029" 534 | property string question : "\uf128" 535 | property string questionCircle : "\uf059" 536 | property string questionCircleO : "\uf29c" 537 | property string quora : "\uf2c4" 538 | property string quoteLeft : "\uf10d" 539 | property string quoteRight : "\uf10e" 540 | property string ra : "\uf1d0" 541 | property string random : "\uf074" 542 | property string ravelry : "\uf2d9" 543 | property string rebel : "\uf1d0" 544 | property string recycle : "\uf1b8" 545 | property string reddit : "\uf1a1" 546 | property string redditAlien : "\uf281" 547 | property string redditSquare : "\uf1a2" 548 | property string refresh : "\uf021" 549 | property string registered : "\uf25d" 550 | property string remove : "\uf00d" 551 | property string renren : "\uf18b" 552 | property string reorder : "\uf0c9" 553 | property string repeat : "\uf01e" 554 | property string reply : "\uf112" 555 | property string replyAll : "\uf122" 556 | property string resistance : "\uf1d0" 557 | property string retweet : "\uf079" 558 | property string rmb : "\uf157" 559 | property string road : "\uf018" 560 | property string rocket : "\uf135" 561 | property string rotateLeft : "\uf0e2" 562 | property string rotateRight : "\uf01e" 563 | property string rouble : "\uf158" 564 | property string rss : "\uf09e" 565 | property string rssSquare : "\uf143" 566 | property string rub : "\uf158" 567 | property string ruble : "\uf158" 568 | property string rupee : "\uf156" 569 | property string s15 : "\uf2cd" 570 | property string safari : "\uf267" 571 | property string save : "\uf0c7" 572 | property string scissors : "\uf0c4" 573 | property string scribd : "\uf28a" 574 | property string search : "\uf002" 575 | property string searchMinus : "\uf010" 576 | property string searchPlus : "\uf00e" 577 | property string sellsy : "\uf213" 578 | property string send : "\uf1d8" 579 | property string sendO : "\uf1d9" 580 | property string server : "\uf233" 581 | property string share : "\uf064" 582 | property string shareAlt : "\uf1e0" 583 | property string shareAltSquare : "\uf1e1" 584 | property string shareSquare : "\uf14d" 585 | property string shareSquareO : "\uf045" 586 | property string shekel : "\uf20b" 587 | property string sheqel : "\uf20b" 588 | property string shield : "\uf132" 589 | property string ship : "\uf21a" 590 | property string shirtsinbulk : "\uf214" 591 | property string shoppingBag : "\uf290" 592 | property string shoppingBasket : "\uf291" 593 | property string shoppingCart : "\uf07a" 594 | property string shower : "\uf2cc" 595 | property string signIn : "\uf090" 596 | property string signLanguage : "\uf2a7" 597 | property string signOut : "\uf08b" 598 | property string signal : "\uf012" 599 | property string signing : "\uf2a7" 600 | property string simplybuilt : "\uf215" 601 | property string sitemap : "\uf0e8" 602 | property string skyatlas : "\uf216" 603 | property string skype : "\uf17e" 604 | property string slack : "\uf198" 605 | property string sliders : "\uf1de" 606 | property string slideshare : "\uf1e7" 607 | property string smileO : "\uf118" 608 | property string snapchat : "\uf2ab" 609 | property string snapchatGhost : "\uf2ac" 610 | property string snapchatSquare : "\uf2ad" 611 | property string snowflakeO : "\uf2dc" 612 | property string soccerBallO : "\uf1e3" 613 | property string sort : "\uf0dc" 614 | property string sortAlphaAsc : "\uf15d" 615 | property string sortAlphaDesc : "\uf15e" 616 | property string sortAmountAsc : "\uf160" 617 | property string sortAmountDesc : "\uf161" 618 | property string sortAsc : "\uf0de" 619 | property string sortDesc : "\uf0dd" 620 | property string sortDown : "\uf0dd" 621 | property string sortNumericAsc : "\uf162" 622 | property string sortNumericDesc : "\uf163" 623 | property string sortUp : "\uf0de" 624 | property string soundcloud : "\uf1be" 625 | property string spaceShuttle : "\uf197" 626 | property string spinner : "\uf110" 627 | property string spoon : "\uf1b1" 628 | property string spotify : "\uf1bc" 629 | property string square : "\uf0c8" 630 | property string squareO : "\uf096" 631 | property string stackExchange : "\uf18d" 632 | property string stackOverflow : "\uf16c" 633 | property string star : "\uf005" 634 | property string starHalf : "\uf089" 635 | property string starHalfEmpty : "\uf123" 636 | property string starHalfFull : "\uf123" 637 | property string starHalfO : "\uf123" 638 | property string starO : "\uf006" 639 | property string steam : "\uf1b6" 640 | property string steamSquare : "\uf1b7" 641 | property string stepBackward : "\uf048" 642 | property string stepForward : "\uf051" 643 | property string stethoscope : "\uf0f1" 644 | property string stickyNote : "\uf249" 645 | property string stickyNoteO : "\uf24a" 646 | property string stop : "\uf04d" 647 | property string stopCircle : "\uf28d" 648 | property string stopCircleO : "\uf28e" 649 | property string streetView : "\uf21d" 650 | property string strikethrough : "\uf0cc" 651 | property string stumbleupon : "\uf1a4" 652 | property string stumbleuponCircle : "\uf1a3" 653 | property string subscript : "\uf12c" 654 | property string subway : "\uf239" 655 | property string suitcase : "\uf0f2" 656 | property string sunO : "\uf185" 657 | property string superpowers : "\uf2dd" 658 | property string superscript : "\uf12b" 659 | property string support : "\uf1cd" 660 | property string table : "\uf0ce" 661 | property string tablet : "\uf10a" 662 | property string tachometer : "\uf0e4" 663 | property string tag : "\uf02b" 664 | property string tags : "\uf02c" 665 | property string tasks : "\uf0ae" 666 | property string taxi : "\uf1ba" 667 | property string telegram : "\uf2c6" 668 | property string television : "\uf26c" 669 | property string tencentWeibo : "\uf1d5" 670 | property string terminal : "\uf120" 671 | property string textHeight : "\uf034" 672 | property string textWidth : "\uf035" 673 | property string th : "\uf00a" 674 | property string thLarge : "\uf009" 675 | property string thList : "\uf00b" 676 | property string themeisle : "\uf2b2" 677 | property string thermometer : "\uf2c7" 678 | property string thermometer0 : "\uf2cb" 679 | property string thermometer1 : "\uf2ca" 680 | property string thermometer2 : "\uf2c9" 681 | property string thermometer3 : "\uf2c8" 682 | property string thermometer4 : "\uf2c7" 683 | property string thermometerEmpty : "\uf2cb" 684 | property string thermometerFull : "\uf2c7" 685 | property string thermometerHalf : "\uf2c9" 686 | property string thermometerQuarter : "\uf2ca" 687 | property string thermometerThreeQuarters : "\uf2c8" 688 | property string thumbTack : "\uf08d" 689 | property string thumbsDown : "\uf165" 690 | property string thumbsODown : "\uf088" 691 | property string thumbsOUp : "\uf087" 692 | property string thumbsUp : "\uf164" 693 | property string ticket : "\uf145" 694 | property string times : "\uf00d" 695 | property string timesCircle : "\uf057" 696 | property string timesCircleO : "\uf05c" 697 | property string timesRectangle : "\uf2d3" 698 | property string timesRectangleO : "\uf2d4" 699 | property string tint : "\uf043" 700 | property string toggleDown : "\uf150" 701 | property string toggleLeft : "\uf191" 702 | property string toggleOff : "\uf204" 703 | property string toggleOn : "\uf205" 704 | property string toggleRight : "\uf152" 705 | property string toggleUp : "\uf151" 706 | property string trademark : "\uf25c" 707 | property string train : "\uf238" 708 | property string transgender : "\uf224" 709 | property string transgenderAlt : "\uf225" 710 | property string trash : "\uf1f8" 711 | property string trashO : "\uf014" 712 | property string tree : "\uf1bb" 713 | property string trello : "\uf181" 714 | property string tripadvisor : "\uf262" 715 | property string trophy : "\uf091" 716 | property string truck : "\uf0d1" 717 | property string tryIcon : "\uf195" 718 | property string tty : "\uf1e4" 719 | property string tumblr : "\uf173" 720 | property string tumblrSquare : "\uf174" 721 | property string turkishLira : "\uf195" 722 | property string tv : "\uf26c" 723 | property string twitch : "\uf1e8" 724 | property string twitter : "\uf099" 725 | property string twitterSquare : "\uf081" 726 | property string umbrella : "\uf0e9" 727 | property string underline : "\uf0cd" 728 | property string undo : "\uf0e2" 729 | property string universalAccess : "\uf29a" 730 | property string university : "\uf19c" 731 | property string unlink : "\uf127" 732 | property string unlock : "\uf09c" 733 | property string unlockAlt : "\uf13e" 734 | property string unsorted : "\uf0dc" 735 | property string upload : "\uf093" 736 | property string usb : "\uf287" 737 | property string usd : "\uf155" 738 | property string user : "\uf007" 739 | property string userCircle : "\uf2bd" 740 | property string userCircleO : "\uf2be" 741 | property string userMd : "\uf0f0" 742 | property string userO : "\uf2c0" 743 | property string userPlus : "\uf234" 744 | property string userSecret : "\uf21b" 745 | property string userTimes : "\uf235" 746 | property string users : "\uf0c0" 747 | property string vcard : "\uf2bb" 748 | property string vcardO : "\uf2bc" 749 | property string venus : "\uf221" 750 | property string venusDouble : "\uf226" 751 | property string venusMars : "\uf228" 752 | property string viacoin : "\uf237" 753 | property string viadeo : "\uf2a9" 754 | property string viadeoSquare : "\uf2aa" 755 | property string videoCamera : "\uf03d" 756 | property string vimeo : "\uf27d" 757 | property string vimeoSquare : "\uf194" 758 | property string vine : "\uf1ca" 759 | property string vk : "\uf189" 760 | property string volumeControlPhone : "\uf2a0" 761 | property string volumeDown : "\uf027" 762 | property string volumeOff : "\uf026" 763 | property string volumeUp : "\uf028" 764 | property string warning : "\uf071" 765 | property string wechat : "\uf1d7" 766 | property string weibo : "\uf18a" 767 | property string weixin : "\uf1d7" 768 | property string whatsapp : "\uf232" 769 | property string wheelchair : "\uf193" 770 | property string wheelchairAlt : "\uf29b" 771 | property string wifi : "\uf1eb" 772 | property string wikipediaW : "\uf266" 773 | property string windowClose : "\uf2d3" 774 | property string windowCloseO : "\uf2d4" 775 | property string windowMaximize : "\uf2d0" 776 | property string windowMinimize : "\uf2d1" 777 | property string windowRestore : "\uf2d2" 778 | property string windows : "\uf17a" 779 | property string won : "\uf159" 780 | property string wordpress : "\uf19a" 781 | property string wpbeginner : "\uf297" 782 | property string wpexplorer : "\uf2de" 783 | property string wpforms : "\uf298" 784 | property string wrench : "\uf0ad" 785 | property string xing : "\uf168" 786 | property string xingSquare : "\uf169" 787 | property string yCombinator : "\uf23b" 788 | property string yCombinatorSquare : "\uf1d4" 789 | property string yahoo : "\uf19e" 790 | property string yc : "\uf23b" 791 | property string ycSquare : "\uf1d4" 792 | property string yelp : "\uf1e9" 793 | property string yen : "\uf157" 794 | property string yoast : "\uf2b1" 795 | property string youtube : "\uf167" 796 | property string youtubePlay : "\uf16a" 797 | property string youtubeSquare : "\uf166" 798 | } 799 | -------------------------------------------------------------------------------- /plasmoid/contents/vendor/FontAwesome/Object.qml: -------------------------------------------------------------------------------- 1 | import QtQuick 2.0 2 | 3 | QtObject { 4 | id: object 5 | default property alias children: object.__children 6 | 7 | property list __children: [QtObject {}] 8 | } 9 | -------------------------------------------------------------------------------- /plasmoid/contents/vendor/FontAwesome/README.txt: -------------------------------------------------------------------------------- 1 | This was copy-pasted verbatim from: 2 | https://github.com/benlau/fontawesome.pri/tree/master/FontAwesome 3 | 4 | I wanted to consume it as a QPM package as the author intended, but 5 | there doesn't seem to be a sensible way of doing so in a project 6 | using CMake. 7 | -------------------------------------------------------------------------------- /plasmoid/contents/vendor/FontAwesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lipido/kargos/b4670d0b8fea14087e01b1037fe6c5f892dacde7/plasmoid/contents/vendor/FontAwesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /plasmoid/contents/vendor/FontAwesome/qmldir: -------------------------------------------------------------------------------- 1 | module FontAwesome 2 | singleton FontAwesome 1.0 FontAwesome.qml 3 | -------------------------------------------------------------------------------- /plasmoid/metadata.desktop: -------------------------------------------------------------------------------- 1 | [Desktop Entry] 2 | Encoding=UTF-8 3 | Name=kargos 4 | Comment=Argos port to KDE Plasma 5 | Type=Service 6 | 7 | X-KDE-ParentApp= 8 | X-KDE-PluginInfo-Author=lipido 9 | X-KDE-PluginInfo-Email=lipido@gmail.com 10 | X-KDE-PluginInfo-License=GPL 11 | X-KDE-PluginInfo-Name=org.kde.kargos 12 | X-KDE-PluginInfo-Version=0.6.0 13 | X-KDE-PluginInfo-Website=https://github.com/lipido/kargos 14 | X-KDE-ServiceTypes=Plasma/Applet 15 | X-Plasma-API=declarativeappletscript 16 | X-Plasma-MainScript=ui/main.qml 17 | X-Plasma-RemoteLocation= 18 | X-KDE-PluginInfo-Category=Windows and Tasks 19 | 20 | --------------------------------------------------------------------------------