├── LICENSE
├── README.md
├── assets
└── pbfm.mp4
├── pbfm
├── pickle_berry.sh
├── scripts
├── install.sh
└── uninstall.sh
└── src
└── berry_picker
/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 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | #
6 | 
7 |
8 | **pickleBerry** is a TUI based file-manager which specifically built for keyboard driven usecase.
9 | It is completly shell based and so is very light weight and still can perform all basic file operations.
10 | It is still required to know basic bash/zsh commands for usage (eg: touch, mkdir, etc).
11 | **pickleBerry** uses dynamic keybindings so to improve usage speed and for a genral better user experience, for example the keybinding `t` can mean diffrent
12 | things under diffrent senarios.
13 |
14 | # Dependencies
15 | - bash
16 | - fzf
17 | - tput (ncurses)
18 |
19 | # Installation
20 |
21 | ### 1] Get the latest Release from the [releases page](https://github.com/ekahPruthvi/pickle_berry/releases)
22 | 
23 |
24 | ### 2] Download the `pickleBerry_vX.X.X.tar.gz file and extract it
25 | 
26 |
27 | ### 3] Install pickleBerry
28 | run in terminal from inside the folder
29 | ```bash
30 | sudo ./install.sh
31 | ```
32 |
33 | ### 4] Launch pickleBerry
34 | In terminal
35 | ```bash
36 | pbfm
37 | ```
38 |
39 | # Uninstallation
40 | ```bash
41 | curl -Ss https://raw.githubusercontent.com/ekahPruthvi/pickle_berry/refs/heads/main/scripts/uninstall.sh | sudo bash
42 | ```
43 | # Usage
44 |
45 | | Keybinding | Action |
46 | |------------|--------|
47 | |`!`| Show the keybindings cheatsheet|
48 | |`a`| Refresh Display|
49 | |`h`| Toggle Hidden FIles|
50 | |`/`| Traverse through directories|
51 | |`<`| Go back in path|
52 | |`[`| Quick actions|
53 | |`m`| Move files/folders|
54 | |`c`| Copy files/folders|
55 | |`r`| Rename file/folder|
56 | |`x`| Delete file/folder|
57 | |`t`| Run Terminal commands|
58 | |`o`| Open file/folder|
59 | |`.`| Select files/folders to drag and drop elsewhere|
60 | |`q`| Quit pickleBerry|
61 |
62 | - FileNames contaning spaces might not always work, rename them and use
63 | - If folder in the same directory avoid giving "/" infront of it, `/directory` --> ❌
64 | - Use tab in selection menu to select multiple
65 |
66 | # Features to add
67 | ### todo in the future
68 | - [ ] Mount and unmount external drives support
69 | - [ ] Tarball support
70 | - [ ] quickLinks - shortcut support
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/assets/pbfm.mp4:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ekahPruthvi/pickle_berry/d60da71425c005668f1e85bba6225ef63f988141/assets/pbfm.mp4
--------------------------------------------------------------------------------
/pbfm:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # ekahPruthvi (SCU)
3 |
4 | #----------------version----------------------#
5 |
6 | if [ "$1" = "-v" ]; then
7 | echo "pickleBerry v2.8.0"
8 | exit
9 | fi
10 |
11 | #-----------------init------------------------#
12 | cd ~/
13 |
14 | flag=1
15 | win_size=$( tput lines )
16 | max_rows=0
17 | current_dir="$(dirname "$(readlink -f "$0")")"
18 |
19 | tput civis
20 | printf '\033[2J\033[3J\033[1;1H'
21 | printf "$color"
22 |
23 | #-----------------variables-------------#
24 |
25 | fournotfour=( "A folder full of possibilities."
26 | "As vacant as a promise never made."
27 | "A sanctuary untouched by data."
28 | "Population: zero."
29 | "404: Contents not found —"
30 | "chmod 000 on existence."
31 | "Zero bytes, infinite potential."
32 | "A clean slate in digital form."
33 | )
34 |
35 | #-----------------backend---------------#
36 | clear_win() {
37 | printf '\033[2J\033[3J\033[1;1H'
38 | }
39 |
40 | fnf() {
41 | local hide="$1"
42 | if [ "$hide" = 1 ]; then
43 | folders=$(find . -maxdepth 1 -type d -not -path '*/.*' -printf '%f\n' )
44 | files=$(find . -maxdepth 1 -type f -not -name '.*' -printf '%f\n' )
45 | find . -maxdepth 1 -type d -not -name '.*' -printf '%f\n' > /tmp/pbfiles.dat
46 | find . -maxdepth 1 -type f -not -name '.*' -printf '%f\n' >> /tmp/pbfiles.dat
47 | else
48 | folders=$(ls -Ap | grep / | grep "^.")
49 | files=$(ls -Ap | grep -v / | grep "^.")
50 | ls -Ap | grep / | grep "^." > /tmp/pbfiles.dat
51 | ls -Ap | grep -v / | grep "^." >> /tmp/pbfiles.dat
52 | fi
53 | }
54 |
55 | fnfind() {
56 | local fol="$1"
57 | if [ "$flag" = 1 ] && [ "$fol" = 1 ]; then
58 | echo $(find . -maxdepth 1 -type d -not -path '*/.*' -printf '%f\n'| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
59 | elif [ "$flag" = 1 ] && [ "$fol" = 0 ]; then
60 | echo $(find . -maxdepth 1 -not -path '*/.*' -printf '%f\n'| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
61 | elif [ "$flag" = 0 ] && [ "$fol" = 1 ]; then
62 | echo $(ls -Ap | grep / | grep "^." | fzf --layout=reverse --border=bold --border=rounded --margin=10%)
63 | elif [ "$flag" = 0 ] && [ "$fol" = 0 ]; then
64 | echo $(ls -a| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
65 | else
66 | echo 0
67 | fi
68 | }
69 |
70 | make_window() {
71 | tput cup 0 0
72 | local COL=$( tput cols )
73 | local ROW=$( tput lines )
74 | #printf "$COL"
75 | printf "┌"
76 | for (( i=1 ; i<( $COL - 1 ) ; i++ )); do
77 | printf "─"
78 | done
79 | printf "┐\n"
80 | for (( i=1 ; i<( $ROW - 2 ); i++ )); do
81 | printf "│"
82 | tput cup $i $COL
83 | printf "│\n"
84 | done
85 | printf "└"
86 | for (( i=1 ; i<( $COL - 1 ) ; i++ )); do
87 | printf "─"
88 | done
89 | printf "┘"
90 | tput cup 0 $(( $COL - 16 ))
91 | printf " pickleBerry "
92 | tput cup 1 1
93 | }
94 |
95 | #taken from basil
96 | Fillaform(){
97 | local ROW=$(tput lines)
98 | local lineno="$#"
99 | local max=50
100 | for i in "$@"
101 | do
102 | local temp="$i"
103 | local wc=${#temp}
104 | if [ "$wc" -gt "$max" ]
105 | then
106 | max="$wc"
107 | fi
108 | done
109 | max=$(($max+5))
110 | local fwidth=$(tput cols)
111 | local fpadding=$(( (fwidth - ${max}) / 2 ))
112 | local fendpad=$((( (fwidth - ${max}) / 2 )-1))
113 | local cont=0
114 | echo ""
115 | echo ""
116 | tput cup $(( (ROW / 2) - 7 ))
117 | local nline=$(( (ROW / 2) - 7 ))
118 | for i in "$@"
119 | do
120 | local finstartpadd=2
121 | local finendpadd=2
122 | temp="$i"
123 | local end="║"
124 | if [ "$cont" -eq 0 ]
125 | then
126 | end="╗"
127 |
128 | fi
129 | cont=$(($cont+1))
130 | wc=${#temp}
131 | finendpadd=$(( ($max-$wc)-5 ))
132 | tput cup $nline $fpadding
133 | printf " %${finstartpadd}s\033[7m %s%${finendpadd}s\033[0m" "" "$temp"
134 | echo "$end"
135 | ((nline++))
136 | local fline="╚"
137 | if [ "$cont" -eq "$lineno" ]
138 | then
139 | tput cup $nline $(( $fpadding + 2))
140 | for f in $(seq 1 "$((max - 2 ))" )
141 | do
142 | if [ "$f" -eq "$(( max - 2 ))" ]
143 | then
144 | fline="╝"
145 | fi
146 | printf "$fline"
147 | fline="═"
148 | done
149 | fi
150 | done
151 | }
152 |
153 | file_icon_exp(){
154 | local w=0
155 | local wc=$start_wc
156 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
157 | printf " $1\t"
158 | ((w++))
159 | ((wc++))
160 | done
161 | echo
162 | }
163 |
164 | file_icon(){
165 | for word in "${file_array[@]}"; do
166 | printf " $1\t"
167 | done
168 | echo
169 | }
170 |
171 |
172 | show(){
173 | echo
174 | if [ "$1" = 1 ]; then
175 | readarray -t file_array <<<"$folders"
176 | else
177 | readarray -t file_array <<<"$files"
178 | fi
179 |
180 | local num=${#file_array[@]}
181 | local width=$(tput cols)
182 | local win_width=$(( width - 2 ))
183 | local max_lines=$(( (num / (win_width / 15)) + 1 ))
184 | local cur_num=$num
185 | local files_in_line=$(( (win_width / 15) - 1 ))
186 | max_rows=$(( $max_rows + $max_lines ))
187 |
188 | #printf "$win_width\n$max_lines\n$num\n" #testing
189 | if [ "$1" = 1 ]; then
190 | echo " [$PWD]"
191 | echo
192 | if [[ $(( win_width / 15 )) -gt "$num" ]]; then
193 | file_icon "╔▒▀▀▀▒▒▒"
194 | file_icon "║███████"
195 | file_icon "║███████"
196 | file_icon "╚══════╝"
197 | printf " "
198 | for word in "${file_array[@]}"; do
199 | printf "%-15.15s " "/$word"
200 | done
201 | else
202 | start_wc=0
203 | local w=0
204 | local wc=0
205 | for (( i=1 ; i<=$max_lines ; i++ )); do
206 | file_icon_exp "╔▒▀▀▀▒▒▒"
207 | file_icon_exp "║███████"
208 | file_icon_exp "║███████"
209 | file_icon_exp "╚══════╝"
210 | w=0
211 | wc=$start_wc
212 | printf " "
213 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
214 | printf "%-15.15s " "/${file_array[$wc]}"
215 | ((w++))
216 | ((wc++))
217 | done
218 | #echo "$w $files_in_line $wc $num" #testing
219 | start_wc=$wc
220 | echo
221 | echo
222 | done
223 | fi
224 | else
225 | if [[ $(( win_width / 15 )) -gt "$num" ]]; then
226 | file_icon "╔█▀▀▀▀▀▄"
227 | file_icon "║█ █"
228 | file_icon "║█#####█"
229 | file_icon "║█▄▄▄▄▄█"
230 | file_icon "╚══════╝"
231 | printf " "
232 | local counter=0
233 | for word in "${file_array[@]}"; do
234 | printf "%-15.15s " "$counter]$word"
235 | ((counter++))
236 | done
237 | else
238 | start_wc=0
239 | local w=0
240 | local wc=0
241 | for (( i=1 ; i<=$max_lines ; i++ )); do
242 | file_icon_exp "╔█▀▀▀▀▀▄"
243 | file_icon_exp "║█ █"
244 | file_icon_exp "║█#####█"
245 | file_icon_exp "║█▄▄▄▄▄█"
246 | file_icon_exp "╚══════╝"
247 | w=0
248 | wc=$start_wc
249 | printf " "
250 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
251 | printf "%-15.15s " "$wc]${file_array[$wc]}"
252 | ((w++))
253 | ((wc++))
254 | done
255 | start_wc=$wc
256 | echo
257 | echo
258 | done
259 | fi
260 | fi
261 | }
262 |
263 |
264 | display_seq(){
265 | clear_win
266 | fnf "$flag"
267 | if [ -s "/tmp/pbfiles.dat" ]; then
268 | show 1
269 | echo
270 | echo
271 | show 0
272 | if [[ $(( $max_rows * 8 )) -lt "$win_size" ]]; then
273 | make_window
274 | fi
275 | else
276 | ll=$(tput lines)
277 | col=$(tput cols)
278 | ind=$((RANDOM % 8))
279 | echo
280 | echo " [$PWD]"
281 | tput cup $(( ( $ll / 2 ) - 2 )) $(( ( $col / 2 ) - 20 ))
282 | echo "░▀▀▀░░░"
283 | tput cup $(( ( $ll / 2 ) - 1 )) $(( ( $col / 2 ) - 20 ))
284 | echo "▒▒▒▒▒▒▒ ${fournotfour[$ind]}"
285 | tput cup $(( $ll / 2 )) $(( ( $col / 2 ) - 20 ))
286 | echo "▒▒▒▒▒▒▒"
287 | if [[ $(( $max_rows * 8 )) -lt "$win_size" ]]; then
288 | make_window
289 | fi
290 | fi
291 | if [[ "$PWD" = ~/.local/share/Trash/files ]] && [ -s /tmp/pbfiles.dat ]; then
292 | tput cup $(( $ll - 2 )) 3
293 | printf " -t TO EMPTY TRASH "
294 | fi
295 | }
296 |
297 | moveanim(){
298 | local ROW=$(tput lines)
299 | clear_win
300 | local ctext="╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒"
301 | local cwidth=$(tput cols)
302 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
303 | for ((i=0;i<1;i++)) do
304 | clear
305 | tput cup $(( (ROW / 2) - 4 ))
306 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
307 | printf "%${cpadding}s║███████ ║███████\n"
308 | printf "%${cpadding}s║███████ ║███████\n"
309 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
310 | sleep 0.3
311 | clear
312 | tput cup $(( (ROW / 2) - 4 ))
313 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
314 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
315 | printf "%${cpadding}s║███████ ║███████\n"
316 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
317 | sleep 0.3
318 | clear
319 | tput cup $(( (ROW / 2) - 4 ))
320 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
321 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
322 | printf "%${cpadding}s║███████ ║███████\n"
323 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
324 | sleep 0.3
325 | clear
326 | tput cup $(( (ROW / 2) - 4 ))
327 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
328 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
329 | printf "%${cpadding}s║███████ ║███████\n"
330 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
331 | sleep 0.3
332 | clear
333 | tput cup $(( (ROW / 2) - 4 ))
334 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
335 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
336 | printf "%${cpadding}s║███████ ║███████\n"
337 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
338 | sleep 0.3
339 | clear
340 | tput cup $(( (ROW / 2) - 4 ))
341 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
342 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
343 | printf "%${cpadding}s║███████ ║███████\n"
344 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
345 | sleep 0.3
346 | clear
347 | tput cup $(( (ROW / 2) - 4 ))
348 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
349 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
350 | printf "%${cpadding}s║███████ ║███████\n"
351 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
352 | sleep 0.3
353 | clear
354 | tput cup $(( (ROW / 2) - 4 ))
355 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
356 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
357 | printf "%${cpadding}s║███████ ║███████\n"
358 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
359 | sleep 0.3
360 | clear
361 | tput cup $(( (ROW / 2) - 4 ))
362 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
363 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
364 | printf "%${cpadding}s║███████ ║███████\n"
365 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
366 | sleep 0.3
367 | done
368 | }
369 |
370 | copyanim(){
371 | local ROW=$(tput lines)
372 | clear_win
373 | local ctext=" █▀▀▀▀▀▄"
374 | local cwidth=$(tput cols)
375 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
376 | for ((i=0;i<2;i++)) do
377 | clear
378 | tput cup $(( (ROW / 2) - 4 ))
379 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
380 | printf "%${cpadding}s║█ █\n"
381 | printf "%${cpadding}s║█#####█\n"
382 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
383 | printf "%${cpadding}s╚══════╝\n"
384 | sleep 0.3
385 | clear
386 | tput cup $(( (ROW / 2) - 4 ))
387 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
388 | printf "%${cpadding}s╔═█ █\n"
389 | printf "%${cpadding}s║ █#####█\n"
390 | printf "%${cpadding}s║ █▄▄▄▄▄█\n"
391 | printf "%${cpadding}s║ ║\n"
392 | printf "%${cpadding}s╚══════╝\n"
393 | sleep 0.3
394 | clear
395 | tput cup $(( (ROW / 2) - 4 ))
396 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
397 | printf "%${cpadding}s╔═════─┐ █\n"
398 | printf "%${cpadding}s║ █###│#█\n"
399 | printf "%${cpadding}s║ █▄▄▄║▄█\n"
400 | printf "%${cpadding}s║ ║\n"
401 | printf "%${cpadding}s╚══════╝\n"
402 | sleep 0.3
403 | clear
404 | tput cup $(( (ROW / 2) - 4 ))
405 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
406 | printf "%${cpadding}s╔═════─┐█\n"
407 | printf "%${cpadding}s║ █####│█\n"
408 | printf "%${cpadding}s║ █▄▄▄▄║█\n"
409 | printf "%${cpadding}s║ ║\n"
410 | printf "%${cpadding}s╚══════╝\n"
411 | sleep 0.3
412 | done
413 | }
414 |
415 | trashanim(){
416 | local ROW=$(tput lines)
417 | clear_win
418 | local ctext=" █▀▀▀▀▀▄"
419 | local cwidth=$(tput cols)
420 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
421 | for ((i=0;i<1;i++)) do
422 | clear
423 | tput cup $(( (ROW / 2) - 4 ))
424 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
425 | printf "%${cpadding}s║█ █\n"
426 | printf "%${cpadding}s║█ █\n"
427 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
428 | printf "%${cpadding}s╚══════╝\n"
429 | sleep 0.3
430 | clear
431 | tput cup $(( (ROW / 2) - 4 ))
432 | printf "%${cpadding}s\033[?25l╔█#▀▀▀▀▄\n"
433 | printf "%${cpadding}s║█ ## █\n"
434 | printf "%${cpadding}s║█ █\n"
435 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
436 | printf "%${cpadding}s╚══════╝\n"
437 | sleep 0.3
438 | clear
439 | tput cup $(( (ROW / 2) - 4 ))
440 | printf "%${cpadding}s\033[?25l╔█##▀▀▀▄\n"
441 | printf "%${cpadding}s║█ ## █\n"
442 | printf "%${cpadding}s║█ # █\n"
443 | printf "%${cpadding}s║█#▄▄▄▄█\n"
444 | printf "%${cpadding}s╚══════╝\n"
445 | sleep 0.3
446 | clear
447 | tput cup $(( (ROW / 2) - 4 ))
448 | printf "%${cpadding}s\033[?25l╔█##▀▀▀▄\n"
449 | printf "%${cpadding}s║█ ## █\n"
450 | printf "%${cpadding}s########\n"
451 | printf "%${cpadding}s########\n"
452 | printf "%${cpadding}s########\n"
453 | printf "%${cpadding}s ## # \n"
454 | printf "%${cpadding}s # \n"
455 | sleep 0.3
456 | done
457 | }
458 |
459 | delanim(){
460 | local ROW=$(tput lines)
461 | clear_win
462 | local ctext=" █▀▀▀▀▀▄"
463 | local cwidth=$(tput cols)
464 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
465 | for ((i=0;i<1;i++)) do
466 | clear
467 | tput cup $(( (ROW / 2) - 4 ))
468 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
469 | printf "%${cpadding}s║█ █\n"
470 | printf "%${cpadding}s║█#####█\n"
471 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
472 | printf "%${cpadding}s╚══════╝\n"
473 | sleep 0.3
474 | clear
475 | tput cup $(( (ROW / 2) - 4 ))
476 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
477 | printf "%${cpadding}s║█ █\n"
478 | printf "%${cpadding}s║█#####█\n"
479 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
480 | printf "%${cpadding}s╚═│═│═│╝\n"
481 | sleep 0.3
482 | clear
483 | tput cup $(( (ROW / 2) - 4 ))
484 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
485 | printf "%${cpadding}s║█ █\n"
486 | printf "%${cpadding}s║█│#│#│█\n"
487 | printf "%${cpadding}s║█│▄│▄│█\n"
488 | printf "%${cpadding}s╚═│═│═│╝\n"
489 | sleep 0.3
490 | clear
491 | tput cup $(( (ROW / 2) - 4 ))
492 | printf "%${cpadding}s\033[?25l╔█│▀│▀│▄\n"
493 | printf "%${cpadding}s║█│ │ │█\n"
494 | printf "%${cpadding}s║█│#│#│█\n"
495 | printf "%${cpadding}s║█│▄│▄│█\n"
496 | printf "%${cpadding}s╚═│═│═│╝\n"
497 | sleep 0.3
498 | clear
499 | tput cup $(( (ROW / 2) - 4 ))
500 | printf "%${cpadding}s\033[?25l╔█ ▀ ▀ ▄\n"
501 | printf "%${cpadding}s║█ █\n"
502 | printf "%${cpadding}s║█ # # █\n"
503 | printf "%${cpadding}s║█ ▄ ▄ █\n"
504 | printf "%${cpadding}s╚═ ═ ═ ╝\n"
505 | sleep 0.3
506 | done
507 | }
508 |
509 | #taken from basil
510 | Line_sweep(){
511 | sleep 0.01
512 | [[ $LINES ]] || LINES=$(tput lines)
513 | [[ $COLUMNS ]] || COLUMNS=$(tput cols)
514 | tput civis
515 | for (( i=0; i<$LINES; i++ ))
516 | do
517 | clear
518 | if [ $i -gt 0 ]
519 | then
520 | n=$(($i-1))
521 | eval printf "$'\n%.0s'" {0..$n}
522 | fi
523 | eval printf %.1s '$((RANDOM & 1))'{1..$COLUMNS}
524 | sleep 0.01
525 | done
526 | clear
527 | tput cnorm
528 | }
529 |
530 | Flap-Travel(){
531 | fileanim=2
532 | eval last=\${$#}
533 | if [ $# -lt 2 ]; then
534 | echo "penguin asks where to move to?" && sleep 2s
535 | else
536 | for i in $@; do
537 | if [ -e $i ]; then
538 | if [[ -f "$last/$i" ]]; then
539 | echo "file with same name, $i exists in $last " && sleep 3s
540 | fileanim=1
541 | break
542 | else
543 | fileanim=0
544 | continue
545 | fi
546 | else
547 | echo "penguin don't think it exits : $i " && sleep 2s
548 | fileanim=1
549 | break
550 | fi
551 | done
552 | if [ "$fileanim" -eq 0 ]; then
553 | mv $@
554 | fi
555 | fi
556 | }
557 |
558 | Waddle-Name(){
559 | local flag=2
560 | if [ $# -lt 2 ]; then
561 | echo "Enter the file/directory followed by the new name" && sleep 2s
562 | else
563 | if [ -e "$1" ]; then
564 | flag=0
565 | continue
566 | else
567 | echo "penguin don't think it exits : $1 " && sleep 2s
568 | flag=1
569 | break
570 | fi
571 | mv "$1" $2 2> /dev/null
572 | fi
573 | }
574 |
575 | Fish-Borrow(){
576 | local flag=1
577 | eval last=\${$#}
578 | if [ -f $last ] -a [ $last != " " ]; then
579 | max_rows=0
580 | display_seq
581 | tput cup $(( $ll - 2 )) 3
582 | printf " penguin asks if you want to rewrite (Y/n) : "
583 | read -rsn1 choice
584 | if [ "$choice" = "y" ] || [ "$choice" = "Y" ] || [ "$choice" = "" ]; then
585 | echo "rewriting $last"
586 | flag=1
587 | else
588 | flag=0
589 | return
590 | fi
591 | else
592 | flag=1
593 | fi
594 | if [ -n $@ ]; then
595 | echo "penguin says invalid input, "
596 | echo "select souce file/directory and give destination file/directory " && sleep 2s
597 | elif [ "$flag" -eq 1 ]; then
598 | cp -a $@
599 | copyanim
600 | fi
601 | }
602 |
603 | Snow-Sweep(){
604 | tput civis
605 | local inp
606 | undo="$1"
607 | undodir="$PWD"
608 | if [ $# -gt 1 ]; then
609 | echo "penguin will not delete mutiple files/folders for safety concerns, use -t insted " && sleep 2s
610 | elif [ $# -eq 0 ]; then
611 | echo "penguin cannot delete nothing " && sleep 2s
612 | elif [ "$1" = "/" ] || [ "$1" = "//" ] ; then
613 | echo "penguin will not perform this action " && sleep 2s
614 | elif [ -e "$1" ]; then
615 | make_window
616 | tput cup $(( $ll - 2 )) 3
617 | printf " DELETE $1? (y/n) : "
618 | read -rsn1 inp
619 | if [ "$inp" = "y" ]; then
620 | mv "$1" ~/.local/share/Trash/files
621 | trash_file="$HOME/.local/share/Trash/files/$undo"
622 | printf "\nUSE -u TO UNDO CHANGES" && sleep 1s
623 | delanim
624 | fi
625 | else
626 | echo "penguin don't think $1 exits" && sleep 2s
627 | fi
628 | }
629 |
630 | Belly-Flop(){
631 | tput civis
632 | local brow
633 | local code
634 | local inp
635 | if [ $# -gt 1 ]; then
636 | echo "penguin can not open mutiple files/folders" && sleep 2s
637 | elif [ $# -lt 1 ]; then
638 | echo
639 | elif [ -e "$1" ]; then
640 | if [[ "$1" =~ \.html$ ]]; then
641 | brow=$(grep -il "MimeType=.*text/html" /usr/share/applications/*.desktop | xargs -n 1 basename | sed 's/.desktop//')
642 | code=$(xdg-mime query default text/plain | sed 's/.desktop//')
643 | make_window
644 | tput cup $(( $ll - 2 )) 3
645 | printf " penguin detects a html file, open with browser ? (y/n) : "
646 | read -rsn1 inp
647 | if [ "$inp" = "y" ]; then
648 | $brow "$1" 2> /dev/null
649 | else
650 | $code "$1" 2> /dev/null
651 | fi
652 | elif [ -d "$1" ]; then
653 | code=$(xdg-mime query default text/plain | sed 's/.desktop//')
654 | make_window
655 | tput cup $(( $ll - 2 )) 3
656 | printf " penguin detects a Directory, open with code editor ? (y/n) : "
657 | read -rsn1 inp
658 | if [ "$inp" = "y" ]; then
659 | $code "$1" 2> /dev/null
660 | else
661 | xdg-open "$1" 2> /dev/null
662 | fi
663 | else
664 | xdg-open "$1" 2> /dev/null
665 | fi
666 | else
667 | echo "penguin don't think $1 exits" && sleep 2s
668 | fi
669 | }
670 |
671 | startup(){
672 | local ROW=$(tput lines)
673 | clear_win
674 | tput cup $(( (ROW / 2) - 4 ))
675 | cat << "EOF"
676 | __
677 | -=(o '.
678 | '.-.\
679 | /| \\ █▀▄ █ ▄▀▀ █▄▀ █ ██▀ ██▄ ██▀ █▀▄ █▀▄ ▀▄▀
680 | '| || █▀ █ ▀▄▄ █ █ █▄▄ █▄▄ █▄█ █▄▄ █▀▄ █▀▄ █
681 | _\_):,_
682 |
683 | EOF
684 | make_window
685 | sleep 1s
686 | max_rows=0
687 | display_seq
688 | chk="no"
689 | undo="bob.penglin067"
690 | }
691 |
692 | #--------------------main--------------------#
693 |
694 | startup
695 | resize_trigger=0
696 | trap 'resize_trigger=1' SIGWINCH
697 | while true; do
698 | read -rsn1 -t 0.1 input
699 | if [ "$resize_trigger" -eq 1 ]; then
700 | input="a"
701 | resize_trigger=0
702 | fi
703 |
704 | if [ "$input" = "!" ] && [ "$chk" = "penglin" ] ; then
705 | input="a"
706 | chk="no"
707 | fi
708 |
709 | if [ "$input" = "a" ]; then
710 | max_rows=0
711 | display_seq
712 |
713 | elif [ "$input" = "h" ]; then
714 | clear_win
715 | if [[ "$flag" -eq 1 ]]; then
716 | echo "hidden toggle off" && sleep 1s
717 | flag=0
718 | max_rows=0
719 | display_seq
720 | else
721 | echo "hidden toggle on" && sleep 1s
722 | flag=1
723 | max_rows=0
724 | display_seq
725 | fi
726 | elif [ "$input" = "/" ]; then
727 | bob=$(fnfind 1)
728 | tput civis
729 | cd "$bob"
730 | max_rows=0
731 | display_seq
732 | elif [ "$input" = "<" ]; then
733 | cd ../
734 | max_rows=0
735 | display_seq
736 | elif [ "$input" = "[" ]; then
737 | ll=$(tput lines)
738 | tput cup $(( $ll - 2 )) 3
739 | printf " [ back - ] home - t trash - / type location "
740 | read -rsn1 bob
741 | if [ "$bob" = "]" ]; then
742 | cd ~/
743 | elif [ "$bob" = "[" ]; then
744 | cd -
745 | elif [ "$bob" = "t" ]; then
746 | cd ~/.local/share/Trash/files
747 | elif [ "$bob" = "/" ]; then
748 | make_window
749 | tput cup $(( $ll - 2 )) 3
750 | printf " type location : "
751 | read bob2
752 | cd "$bob2"
753 | fi
754 | max_rows=0
755 | display_seq
756 | elif [ "$input" = "m" ]; then
757 | ll=$(tput lines)
758 | if [ "$flag" = 1 ]; then
759 | bob=$(find . -maxdepth 1 -not -path '*/.*' -printf '%f\n'| fzf -m --ghost=" select files/folders to move" --layout=reverse --border=bold --border=rounded --margin=10%)
760 | elif [ "$flag" = 0 ]; then
761 | bob=$(ls -a| fzf -m --ghost=" select files/folders to move" --layout=reverse --border=bold --border=rounded --margin=10%)
762 | fi
763 | tput civis
764 | if [ "$bob" != "" ]; then
765 | tput cup $(( $ll - 2 )) 3
766 | printf " enter destination folder : "
767 | read bob2
768 | Flap-Travel $bob $bob2
769 | if [ $fileanim -eq 0 ]; then
770 | moveanim
771 | fi
772 | max_rows=0
773 | display_seq
774 | fi
775 | elif [ "$input" = "r" ]; then
776 | ll=$(tput lines)
777 | tput cup $(( $ll - 2 )) 3
778 | bob=$(fnfind 0)
779 | tput civis
780 | if [ "$bob" != "" ]; then
781 | printf " enter new name : "
782 | read bob2
783 | Waddle-Name "$bob" $bob2
784 | max_rows=0
785 | display_seq
786 | fi
787 | elif [ "$input" = "c" ]; then
788 | ll=$(tput lines)
789 | if [ "$flag" = 1 ]; then
790 | bob=$(find . -maxdepth 1 -not -path '*/.*' -printf '%f\n'| fzf -m --ghost=" select file/folder to copy" --layout=reverse --border=bold --border=rounded --margin=10%)
791 | elif [ "$flag" = 0 ]; then
792 | bob=$(ls -a| fzf -m --ghost=" select file/folder to copy" --layout=reverse --border=bold --border=rounded --margin=10%)
793 | fi
794 | tput civis
795 | if [ "$bob" != "" ]; then
796 | tput cup $(( $ll - 2 )) 3
797 | printf " enter destination folder or coplied file name : "
798 | read bob2
799 | Fish-Borrow $bob $bob2
800 | max_rows=0
801 | display_seq
802 | fi
803 | elif [ "$input" = "." ]; then
804 | ll=$(tput lines)
805 | bp=$( find . -maxdepth 2 | fzf -m --ghost=" select files for drag and drop" --layout=reverse --border=bold --border=rounded --margin=10%)
806 | tput civis
807 | if [ "$bp" != "" ]; then
808 | $current_dir/src/berry_picker $bp 2> /dev/null
809 | fi
810 | elif [ "$input" = "t" ] && [ "$bob" = "t" ]; then
811 | make_window
812 | ll=$(tput lines)
813 | tput cup $(( $ll - 2 )) 3
814 | printf " Empty TRASH (y/n) : "
815 | read -rsn1 bobb
816 | if [ "$bobb" = "y" ]; then
817 | rm -rf ~/.local/share/Trash/files/*
818 | trashanim
819 | fi
820 | max_rows=0
821 | display_seq
822 | elif [ "$input" = "t" ]; then
823 | make_window
824 | ll=$(tput lines)
825 | tput cup $(( ll - 2 )) 3
826 | printf " Execute command : "
827 | read bob
828 | if [ "$bob" != "" ]; then
829 | clear_win
830 | echo "[user@pbfm]$ $bob"
831 | echo "------------"
832 | printf "\033[0;32m"
833 | bash -c "$bob"
834 | printf "\033[0m\n"
835 | read -n 1 -s -r -p "Press any key to return to the file manager ..."
836 | Line_sweep
837 | tput civis
838 | fi
839 | max_rows=0
840 | display_seq
841 | elif [ "$input" = "x" ]; then
842 | ll=$(tput lines)
843 | tput cup $(( $ll - 2 )) 3
844 | printf " DELETE FILE/FOLDER : "
845 | Snow-Sweep $(fnfind 0)
846 | max_rows=0
847 | display_seq
848 | elif [ "$input" = "u" ] && [ -e "$trash_file" ]; then
849 | mv "$trash_file" "$undodir"
850 | max_rows=0
851 | display_seq
852 | elif [ "$input" = "o" ]; then
853 | ll=$(tput lines)
854 | tput cup $(( $ll - 2 )) 3
855 | printf " Open Files ? : "
856 | if [ "$flag" = 1 ]; then
857 | Belly-Flop $(find . -maxdepth 1 -not -path '*/.*' -printf '%f\n'| fzf --layout=reverse --border=bold --border=rounded --margin=10% --preview 'file -b {} | grep -iq "text" && echo -e "Permissions: $(stat -c %A {})\nLinks: $(stat -c %h {})\nOwner: $(stat -c %U {})\nGroup: $(stat -c %G {})\nSize: $(stat -c %s {}) bytes\nModified: $(stat -c %y {})\nFile: {}\n\n------ Separator Line ------\n$(cat {})" || echo -e "Permissions: $(stat -c %A {})\nLinks: $(stat -c %h {})\nOwner: $(stat -c %U {})\nGroup: $(stat -c %G {})\nSize: $(stat -c %s {}) bytes\nModified: $(stat -c %y {})\nFile: {}\n\n------ Preview ------\nPenguin detects Binary file, cannot display content."')
858 | elif [ "$flag" = 0 ]; then
859 | Belly-Flop $(ls -a| fzf --layout=reverse --border=bold --border=rounded --margin=10% --preview 'file -b {} | grep -iq "text" && echo -e "Permissions: $(stat -c %A {})\nLinks: $(stat -c %h {})\nOwner: $(stat -c %U {})\nGroup: $(stat -c %G {})\nSize: $(stat -c %s {}) bytes\nModified: $(stat -c %y {})\nFile: {}\n\n------ Separator Line ------\n$(cat {})" || echo -e "Permissions: $(stat -c %A {})\nLinks: $(stat -c %h {})\nOwner: $(stat -c %U {})\nGroup: $(stat -c %G {})\nSize: $(stat -c %s {}) bytes\nModified: $(stat -c %y {})\nFile: {}\n\n------ Preview ------\nPenguin detects Binary file, cannot display content."')
860 | fi
861 | max_rows=0
862 | display_seq
863 | elif [ "$input" = "!" ]; then
864 | Fillaform " " "█▀▄ █ ▄▀▀ █▄▀ █ ██▀ ██▄ ██▀ █▀▄ █▀▄ ▀▄▀" "█▀ █ ▀▄▄ █ █ █▄▄ █▄▄ █▄█ █▄▄ █▀▄ █▀▄ █ v2.8.0 " "The keyboard oriented file manager" " " " for this help message" " to refresh display" " toggle hidden files" "> change directory" "<<> back" "<[> quick commands" " to move files and folders" " to copy files and folders" " to rename file of folder" " to delete (use to undo)" " to open file" " to quit" "<.> to drag and drop files" " "
865 | chk="penglin"
866 | elif [ "$input" = "q" ]; then
867 | tput cnorm
868 | break
869 | fi
870 | done
871 |
872 | ascii_wave() {
873 | frames=(
874 | "⣾"
875 | "⣽"
876 | "⣻"
877 | "⢿"
878 | "⡿"
879 | "⣟"
880 | "⣯"
881 | "⣷"
882 | )
883 | for i in {1..2}; do
884 | printf "\r%s Disconnect matrix " "${frames[i % 6]}"
885 | sleep 0.05
886 | done
887 | echo ""
888 | for i in {1..2}; do
889 | printf "\r%s Running exit sequence " "${frames[i % 6]}"
890 | sleep 0.05
891 | done
892 | echo ""
893 | }
894 |
895 | clear_win
896 | ascii_wave
897 | clear_win
898 | tput cnorm
899 | exit
900 |
--------------------------------------------------------------------------------
/pickle_berry.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | #--------------------Author:ekahPruthvi--------------------#
3 |
4 | #-----------------init------------------------#
5 | cd ~/
6 |
7 | flag=1
8 | win_size=$( tput lines )
9 | max_rows=0
10 |
11 | tput civis
12 | printf '\033[2J\033[3J\033[1;1H'
13 | printf "$color"
14 |
15 | #-----------------backend---------------#
16 | clear_win() {
17 | printf '\033[2J\033[3J\033[1;1H'
18 | }
19 |
20 | fnf() {
21 | local hide="$1"
22 | if [ "$hide" = 1 ]; then
23 | folders=$(find . -maxdepth 1 -type d -not -path '*/.*' | sed 's|^\./||')
24 | files=$(find . -maxdepth 1 -type f -not -name '.*' | sed 's|^\./||')
25 | else
26 | folders=$(ls -Ap | grep / | grep "^.")
27 | files=$(ls -Ap | grep -v / | grep "^.")
28 | fi
29 | }
30 |
31 | fnfind() {
32 | local fol="$1"
33 | if [ "$flag" = 1 ] && [ "$fol" = 1 ]; then
34 | echo $(find . -maxdepth 1 -type d -not -path '*/.*' | sed 's|^\./||'| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
35 | elif [ "$flag" = 1 ] && [ "$fol" = 0 ]; then
36 | echo $(find . -maxdepth 1 -not -path '*/.*' | sed 's|^\./||'| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
37 | elif [ "$flag" = 0 ] && [ "$fol" = 1 ]; then
38 | echo $(ls -Ap | grep / | grep "^." | fzf --layout=reverse --border=bold --border=rounded --margin=10%)
39 | elif [ "$flag" = 0 ] && [ "$fol" = 0 ]; then
40 | echo $(ls -a| fzf --layout=reverse --border=bold --border=rounded --margin=10%)
41 | else
42 | echo 0
43 | fi
44 | }
45 |
46 | make_window() {
47 | tput cup 0 0
48 | local COL=$( tput cols )
49 | local ROW=$( tput lines )
50 | #printf "$COL"
51 | printf "┌"
52 | for (( i=1 ; i<( $COL - 1 ) ; i++ )); do
53 | printf "─"
54 | done
55 | printf "┐\n"
56 | for (( i=1 ; i<( $ROW - 2 ); i++ )); do
57 | printf "│"
58 | tput cup $i $COL
59 | printf "│\n"
60 | done
61 | printf "└"
62 | for (( i=1 ; i<( $COL - 1 ) ; i++ )); do
63 | printf "─"
64 | done
65 | printf "┘"
66 | tput cup 0 $(( $COL - 16 ))
67 | printf " pickle berry "
68 | tput cup 1 1
69 | }
70 |
71 | #taken from basil
72 | Fillaform(){
73 | local ROW=$(tput lines)
74 | local lineno="$#"
75 | local max=50
76 | for i in "$@"
77 | do
78 | local temp="$i"
79 | local wc=${#temp}
80 | if [ "$wc" -gt "$max" ]
81 | then
82 | max="$wc"
83 | fi
84 | done
85 | max=$(($max+5))
86 | local fwidth=$(tput cols)
87 | local fpadding=$(( (fwidth - ${max}) / 2 ))
88 | local fendpad=$((( (fwidth - ${max}) / 2 )-1))
89 | local cont=0
90 | echo ""
91 | echo ""
92 | tput cup $(( (ROW / 2) - 7 ))
93 | local nline=$(( (ROW / 2) - 7 ))
94 | for i in "$@"
95 | do
96 | local finstartpadd=2
97 | local finendpadd=2
98 | temp="$i"
99 | local end="║"
100 | if [ "$cont" -eq 0 ]
101 | then
102 | end="╗"
103 |
104 | fi
105 | cont=$(($cont+1))
106 | wc=${#temp}
107 | finendpadd=$(( ($max-$wc)-5 ))
108 | tput cup $nline $fpadding
109 | printf " %${finstartpadd}s\033[7m %s%${finendpadd}s\033[0m" "" "$temp"
110 | echo "$end"
111 | ((nline++))
112 | local fline="╚"
113 | if [ "$cont" -eq "$lineno" ]
114 | then
115 | tput cup $nline $(( $fpadding + 2))
116 | for f in $(seq 1 "$((max - 2 ))" )
117 | do
118 | if [ "$f" -eq "$(( max - 2 ))" ]
119 | then
120 | fline="╝"
121 | fi
122 | printf "$fline"
123 | fline="═"
124 | done
125 | fi
126 | done
127 | }
128 |
129 | file_icon_exp(){
130 | local w=0
131 | local wc=$start_wc
132 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
133 | printf " $1\t"
134 | ((w++))
135 | ((wc++))
136 | done
137 | echo
138 | }
139 |
140 | file_icon(){
141 | for word in "${file_array[@]}"; do
142 | printf " $1\t"
143 | done
144 | echo
145 | }
146 |
147 |
148 | show(){
149 | echo
150 | fnf "$flag"
151 | if [ "$1" = 1 ]; then
152 | readarray -t file_array <<<"$folders"
153 |
154 |
155 | else
156 | readarray -t file_array <<<"$files"
157 |
158 |
159 | fi
160 |
161 | local num=${#file_array[@]}
162 | local width=$(tput cols)
163 | local win_width=$(( width - 2 ))
164 | local max_lines=$(( (num / (win_width / 15)) + 1 ))
165 | local cur_num=$num
166 | local files_in_line=$(( (win_width / 15) - 1 ))
167 | max_rows=$(( $max_rows + $max_lines ))
168 |
169 | #printf "$win_width\n$max_lines\n$num\n" #testing
170 | if [ "$1" = 1 ]; then
171 | echo " [$PWD]"
172 | echo
173 | if [[ $(( win_width / 15 )) -gt "$num" ]]; then
174 | file_icon "╔▒▀▀▀▒▒▒"
175 | file_icon "║███████"
176 | file_icon "║███████"
177 | file_icon "╚══════╝"
178 | printf " "
179 | for word in "${file_array[@]}"; do
180 | printf "%-15.15s " "/$word"
181 | done
182 | else
183 | start_wc=0
184 | local w=0
185 | local wc=0
186 | for (( i=1 ; i<=$max_lines ; i++ )); do
187 | file_icon_exp "╔▒▀▀▀▒▒▒"
188 | file_icon_exp "║███████"
189 | file_icon_exp "║███████"
190 | file_icon_exp "╚══════╝"
191 | w=0
192 | wc=$start_wc
193 | printf " "
194 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
195 | printf "%-15.15s " "/${file_array[$wc]}"
196 | ((w++))
197 | ((wc++))
198 | done
199 | #echo "$w $files_in_line $wc $num" #testing
200 | start_wc=$wc
201 | echo
202 | echo
203 | done
204 | fi
205 | else
206 | if [[ $(( win_width / 15 )) -gt "$num" ]]; then
207 | file_icon "╔█▀▀▀▀▀▄"
208 | file_icon "║█ █"
209 | file_icon "║█#####█"
210 | file_icon "║█▄▄▄▄▄█"
211 | file_icon "╚══════╝"
212 | printf " "
213 | local counter=0
214 | for word in "${file_array[@]}"; do
215 | printf "%-15.15s " "$counter]$word"
216 | ((counter++))
217 | done
218 | else
219 | start_wc=0
220 | local w=0
221 | local wc=0
222 | for (( i=1 ; i<=$max_lines ; i++ )); do
223 | file_icon_exp "╔█▀▀▀▀▀▄"
224 | file_icon_exp "║█ █"
225 | file_icon_exp "║█#####█"
226 | file_icon_exp "║█▄▄▄▄▄█"
227 | file_icon_exp "╚══════╝"
228 | w=0
229 | wc=$start_wc
230 | printf " "
231 | while [ $w -lt $files_in_line ] && [ $wc -lt $num ]; do
232 | printf "%-15.15s " "$wc]${file_array[$wc]}"
233 | ((w++))
234 | ((wc++))
235 | done
236 | start_wc=$wc
237 | echo
238 | echo
239 | done
240 | fi
241 | fi
242 | }
243 |
244 |
245 | display_seq(){
246 | clear_win
247 | show 1
248 | echo
249 | echo
250 | show 0
251 | if [[ $(( $max_rows * 8 )) -lt "$win_size" ]]; then
252 | make_window
253 | fi
254 | }
255 |
256 | moveanim(){
257 | local ROW=$(tput lines)
258 | clear_win
259 | local ctext="╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒"
260 | local cwidth=$(tput cols)
261 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
262 | for ((i=0;i<1;i++)) do
263 | clear
264 | tput cup $(( (ROW / 2) - 4 ))
265 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
266 | printf "%${cpadding}s║███████ ║███████\n"
267 | printf "%${cpadding}s║███████ ║███████\n"
268 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
269 | sleep 0.3
270 | clear
271 | tput cup $(( (ROW / 2) - 4 ))
272 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
273 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
274 | printf "%${cpadding}s║███████ ║███████\n"
275 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
276 | sleep 0.3
277 | clear
278 | tput cup $(( (ROW / 2) - 4 ))
279 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
280 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
281 | printf "%${cpadding}s║███████ ║███████\n"
282 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
283 | sleep 0.3
284 | clear
285 | tput cup $(( (ROW / 2) - 4 ))
286 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
287 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
288 | printf "%${cpadding}s║███████ ║███████\n"
289 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
290 | sleep 0.3
291 | clear
292 | tput cup $(( (ROW / 2) - 4 ))
293 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
294 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
295 | printf "%${cpadding}s║███████ ║███████\n"
296 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
297 | sleep 0.3
298 | clear
299 | tput cup $(( (ROW / 2) - 4 ))
300 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
301 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
302 | printf "%${cpadding}s║███████ ║███████\n"
303 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
304 | sleep 0.3
305 | clear
306 | tput cup $(( (ROW / 2) - 4 ))
307 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
308 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
309 | printf "%${cpadding}s║███████ ║███████\n"
310 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
311 | sleep 0.3
312 | clear
313 | tput cup $(( (ROW / 2) - 4 ))
314 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
315 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
316 | printf "%${cpadding}s║███████ ║███████\n"
317 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
318 | sleep 0.3
319 | clear
320 | tput cup $(( (ROW / 2) - 4 ))
321 | printf "%${cpadding}s\033[?25l╔▒▀▀▀▒▒▒ ╔▒▀▀▀▒▒▒\n"
322 | printf "%${cpadding}s║███████ ▗▗▗ ║███████\n"
323 | printf "%${cpadding}s║███████ ║███████\n"
324 | printf "%${cpadding}s╚══════╝ ╚══════╝\n"
325 | sleep 0.3
326 | done
327 | }
328 |
329 | copyanim(){
330 | local ROW=$(tput lines)
331 | clear_win
332 | local ctext=" █▀▀▀▀▀▄"
333 | local cwidth=$(tput cols)
334 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
335 | for ((i=0;i<2;i++)) do
336 | clear
337 | tput cup $(( (ROW / 2) - 4 ))
338 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
339 | printf "%${cpadding}s║█ █\n"
340 | printf "%${cpadding}s║█#####█\n"
341 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
342 | printf "%${cpadding}s╚══════╝\n"
343 | sleep 0.3
344 | clear
345 | tput cup $(( (ROW / 2) - 4 ))
346 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
347 | printf "%${cpadding}s╔═█ █\n"
348 | printf "%${cpadding}s║ █#####█\n"
349 | printf "%${cpadding}s║ █▄▄▄▄▄█\n"
350 | printf "%${cpadding}s║ ║\n"
351 | printf "%${cpadding}s╚══════╝\n"
352 | sleep 0.3
353 | clear
354 | tput cup $(( (ROW / 2) - 4 ))
355 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
356 | printf "%${cpadding}s╔═════─┐ █\n"
357 | printf "%${cpadding}s║ █###│#█\n"
358 | printf "%${cpadding}s║ █▄▄▄║▄█\n"
359 | printf "%${cpadding}s║ ║\n"
360 | printf "%${cpadding}s╚══════╝\n"
361 | sleep 0.3
362 | clear
363 | tput cup $(( (ROW / 2) - 4 ))
364 | printf "%${cpadding}s\033[?25l █▀▀▀▀▀▄\n"
365 | printf "%${cpadding}s╔═════─┐█\n"
366 | printf "%${cpadding}s║ █####│█\n"
367 | printf "%${cpadding}s║ █▄▄▄▄║█\n"
368 | printf "%${cpadding}s║ ║\n"
369 | printf "%${cpadding}s╚══════╝\n"
370 | sleep 0.3
371 | done
372 | }
373 |
374 | trashanim(){
375 | local ROW=$(tput lines)
376 | clear_win
377 | local ctext=" █▀▀▀▀▀▄"
378 | local cwidth=$(tput cols)
379 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
380 | for ((i=0;i<1;i++)) do
381 | clear
382 | tput cup $(( (ROW / 2) - 4 ))
383 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
384 | printf "%${cpadding}s║█ █\n"
385 | printf "%${cpadding}s║█ █\n"
386 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
387 | printf "%${cpadding}s╚══════╝\n"
388 | sleep 0.3
389 | clear
390 | tput cup $(( (ROW / 2) - 4 ))
391 | printf "%${cpadding}s\033[?25l╔█#▀▀▀▀▄\n"
392 | printf "%${cpadding}s║█ ## █\n"
393 | printf "%${cpadding}s║█ █\n"
394 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
395 | printf "%${cpadding}s╚══════╝\n"
396 | sleep 0.3
397 | clear
398 | tput cup $(( (ROW / 2) - 4 ))
399 | printf "%${cpadding}s\033[?25l╔█##▀▀▀▄\n"
400 | printf "%${cpadding}s║█ ## █\n"
401 | printf "%${cpadding}s║█ # █\n"
402 | printf "%${cpadding}s║█#▄▄▄▄█\n"
403 | printf "%${cpadding}s╚══════╝\n"
404 | sleep 0.3
405 | clear
406 | tput cup $(( (ROW / 2) - 4 ))
407 | printf "%${cpadding}s\033[?25l╔█##▀▀▀▄\n"
408 | printf "%${cpadding}s║█ ## █\n"
409 | printf "%${cpadding}s########\n"
410 | printf "%${cpadding}s########\n"
411 | printf "%${cpadding}s########\n"
412 | printf "%${cpadding}s ## # \n"
413 | printf "%${cpadding}s # \n"
414 | sleep 0.3
415 | done
416 | }
417 |
418 | delanim(){
419 | local ROW=$(tput lines)
420 | clear_win
421 | local ctext=" █▀▀▀▀▀▄"
422 | local cwidth=$(tput cols)
423 | local cpadding=$(( (cwidth - ${#ctext}) / 2 ))
424 | for ((i=0;i<1;i++)) do
425 | clear
426 | tput cup $(( (ROW / 2) - 4 ))
427 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
428 | printf "%${cpadding}s║█ █\n"
429 | printf "%${cpadding}s║█#####█\n"
430 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
431 | printf "%${cpadding}s╚══════╝\n"
432 | sleep 0.3
433 | clear
434 | tput cup $(( (ROW / 2) - 4 ))
435 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
436 | printf "%${cpadding}s║█ █\n"
437 | printf "%${cpadding}s║█#####█\n"
438 | printf "%${cpadding}s║█▄▄▄▄▄█\n"
439 | printf "%${cpadding}s╚═│═│═│╝\n"
440 | sleep 0.3
441 | clear
442 | tput cup $(( (ROW / 2) - 4 ))
443 | printf "%${cpadding}s\033[?25l╔█▀▀▀▀▀▄\n"
444 | printf "%${cpadding}s║█ █\n"
445 | printf "%${cpadding}s║█│#│#│█\n"
446 | printf "%${cpadding}s║█│▄│▄│█\n"
447 | printf "%${cpadding}s╚═│═│═│╝\n"
448 | sleep 0.3
449 | clear
450 | tput cup $(( (ROW / 2) - 4 ))
451 | printf "%${cpadding}s\033[?25l╔█│▀│▀│▄\n"
452 | printf "%${cpadding}s║█│ │ │█\n"
453 | printf "%${cpadding}s║█│#│#│█\n"
454 | printf "%${cpadding}s║█│▄│▄│█\n"
455 | printf "%${cpadding}s╚═│═│═│╝\n"
456 | sleep 0.3
457 | clear
458 | tput cup $(( (ROW / 2) - 4 ))
459 | printf "%${cpadding}s\033[?25l╔█ ▀ ▀ ▄\n"
460 | printf "%${cpadding}s║█ █\n"
461 | printf "%${cpadding}s║█ # # █\n"
462 | printf "%${cpadding}s║█ ▄ ▄ █\n"
463 | printf "%${cpadding}s╚═ ═ ═ ╝\n"
464 | sleep 0.3
465 | done
466 | }
467 |
468 | #taken from basil
469 | Line_sweep(){
470 | sleep 0.01
471 | [[ $LINES ]] || LINES=$(tput lines)
472 | [[ $COLUMNS ]] || COLUMNS=$(tput cols)
473 | tput civis
474 | for (( i=0; i<$LINES; i++ ))
475 | do
476 | clear
477 | if [ $i -gt 0 ]
478 | then
479 | n=$(($i-1))
480 | eval printf "$'\n%.0s'" {0..$n}
481 | fi
482 | eval printf %.1s '$((RANDOM & 1))'{1..$COLUMNS}
483 | sleep 0.01
484 | done
485 | clear
486 | tput cnorm
487 | }
488 |
489 | Flap-Travel(){
490 | fileanim=2
491 | if [ $# -lt 2 ]; then
492 | echo "penguin asks where to move to?" && sleep 2s
493 | else
494 | for i in $@; do
495 | if [ -e $i ]; then
496 | fileanim=0
497 | continue
498 | else
499 | echo "penguin don't think it exits : $i " && sleep 2s
500 | fileanim=1
501 | break
502 | fi
503 | done
504 | if [ "$fileanim" -eq 0 ]; then
505 | mv $@ 2> /dev/null
506 | fi
507 | fi
508 | }
509 |
510 | Waddle-Name(){
511 | local flag=2
512 | if [ $# -lt 2 ]; then
513 | echo "Enter the file/directory followed by the new name" && sleep 2s
514 | else
515 | if [ -e "$1" ]; then
516 | flag=0
517 | continue
518 | else
519 | echo "penguin don't think it exits : $1 " && sleep 2s
520 | flag=1
521 | break
522 | fi
523 | mv "$1" $2 2> /dev/null
524 | fi
525 | }
526 |
527 | Fish-Borrow(){
528 | local flag=1
529 | eval last=\${$#}
530 | if [ -f $last ] -a [ $last != " " ]; then
531 | max_rows=0
532 | display_seq
533 | tput cup $(( $ll - 2 )) 3
534 | printf " penguin asks if you want to rewrite (Y/n) : "
535 | read -rsn1 choice
536 | if [ "$choice" = "y" ] || [ "$choice" = "Y" ] || [ "$choice" = "" ]; then
537 | echo "rewriting $last"
538 | flag=1
539 | else
540 | flag=0
541 | return
542 | fi
543 | else
544 | flag=1
545 | fi
546 | if [ -n $@ ]; then
547 | echo "penguin says invalid input,"
548 | echo "select souce file/directory and give destination file/directory" && sleep 2s
549 | elif [ "$flag" -eq 1 ]; then
550 | cp -a $@ 2> /dev/null
551 | copyanim
552 | fi
553 | }
554 |
555 | Snow-Sweep(){
556 | local inp
557 | undo="$1"
558 | undodir="$PWD"
559 | if [ $# -gt 1 ]; then
560 | echo "penguin will not delete mutiple files/folders (safety concerns ) use -t insted" && sleep 2s
561 | elif [ $# -eq 0 ]; then
562 | echo "penguin cannot delete nothing" && sleep 2s
563 | elif [ "$1" = "/" ] || [ "$1" = "//" ] ; then
564 | echo "penguin will not perform this action" && sleep 2s
565 | elif [ -e "$1" ]; then
566 | make_window
567 | tput cup $(( $ll - 2 )) 3
568 | printf " DELETE $1? (y/n) : "
569 | read -rsn1 inp
570 | if [ "$inp" = "y" ]; then
571 | mv "$1" ~/.local/share/Trash/files 2> /dev/null
572 | trash_file="$HOME/.local/share/Trash/files/$undo"
573 | printf "\nUSE -u TO UNDO CHANGES" && sleep 1s
574 | delanim
575 | fi
576 | else
577 | echo "penguin don't think $1 exits" && sleep 2s
578 | fi
579 | }
580 |
581 | Belly-Flop(){
582 | local brow
583 | local code
584 | local inp
585 | if [ $# -gt 1 ]; then
586 | echo "penguin can not open mutiple files/folders" && sleep 2s
587 | elif [ $# -lt 1 ]; then
588 | echo "penguin has to open somthing ??" && sleep 2s
589 | elif [ -e "$1" ]; then
590 | if [[ "$1" =~ \.html$ ]]; then
591 | brow=$(grep -il "MimeType=.*text/html" /usr/share/applications/*.desktop | xargs -n 1 basename | sed 's/.desktop//')
592 | #code=$(xdg-mime query default text/plain | sed 's/.desktop//')
593 | make_window
594 | tput cup $(( $ll - 2 )) 3
595 | printf " penguin detects a html file, open with browser ? (y/n) : "
596 | read -rsn1 inp
597 | if [ "$inp" = "y" ]; then
598 | $brow "$1" 2> /dev/null
599 | else
600 | open "$1" 2> /dev/null
601 | fi
602 | elif [ -d "$1" ]; then
603 | code=$(xdg-mime query default text/plain | sed 's/.desktop//')
604 | make_window
605 | tput cup $(( $ll - 2 )) 3
606 | printf " penguin detects a Directory, open with code editor ? (y/n) : "
607 | read -rsn1 inp
608 | if [ "$inp" = "y" ]; then
609 | open "$1" 2> /dev/null
610 | else
611 | open "$1" 2> /dev/null
612 | fi
613 | else
614 | open "$1" 2> /dev/null
615 | fi
616 | else
617 | echo "penguin don't think $1 exits" && sleep 2s
618 | fi
619 | }
620 |
621 | startup(){
622 | local ROW=$(tput lines)
623 | clear_win
624 | tput cup $(( (ROW / 2) - 4 ))
625 | cat << "EOF"
626 | __
627 | -=(o '.
628 | '.-.\
629 | /| \\ █▀▄ █ ▄▀▀ █▄▀ █ ██▀ ██▄ ██▀ █▀▄ █▀▄ ▀▄▀
630 | '| || █▀ █ ▀▄▄ █ █ █▄▄ █▄▄ █▄█ █▄▄ █▀▄ █▀▄ █
631 | _\_):,_
632 |
633 | EOF
634 | make_window
635 | sleep 1s
636 | max_rows=0
637 | display_seq
638 | chk="no"
639 | undo="bob.penglin067"
640 | }
641 |
642 | #--------------------main--------------------#
643 | startup
644 | resize_trigger=0
645 | trap 'resize_trigger=1' SIGWINCH
646 | while true; do
647 | read -rsn1 -t 0.1 input
648 | if [ "$resize_trigger" -eq 1 ]; then
649 | input="a"
650 | resize_trigger=0
651 | fi
652 |
653 | if [ "$input" = "!" ] && [ "$chk" = "penglin" ] ; then
654 | input="a"
655 | chk="no"
656 | fi
657 |
658 | if [ "$input" = "a" ]; then
659 | max_rows=0
660 | display_seq
661 |
662 | elif [ "$input" = "h" ]; then
663 | clear_win
664 | if [[ "$flag" -eq 1 ]]; then
665 | echo "hide toggle off" && sleep 1s
666 | flag=0
667 | max_rows=0
668 | display_seq
669 | else
670 | echo "hide toggle on" && sleep 1s
671 | flag=1
672 | max_rows=0
673 | display_seq
674 | fi
675 | elif [ "$input" = "/" ]; then
676 | bob=$(fnfind 1)
677 | tput civis
678 |
679 | cd "$bob"
680 | max_rows=0
681 | display_seq
682 | elif [ "$input" = "<" ]; then
683 |
684 | cd ../
685 | max_rows=0
686 | display_seq
687 | elif [ "$input" = "[" ]; then
688 | ll=$(tput lines)
689 | tput cup $(( $ll - 2 )) 3
690 | printf " [ back - ] home - t trash - / type location "
691 | read -rsn1 bob
692 | if [ "$bob" = "]" ]; then
693 | cd ~/
694 | elif [ "$bob" = "[" ]; then
695 | cd -
696 | elif [ "$bob" = "t" ]; then
697 | cd ~/.local/share/Trash/files
698 | elif [ "$bob" = "/" ]; then
699 | make_window
700 | tput cup $(( $ll - 2 )) 3
701 | printf " type location : "
702 | read bob2
703 | cd "$bob2"
704 | else
705 | ll=$(tput lines)
706 | tput cup $(( $ll - 2 )) 3
707 | echo " invalid input " && sleep 1s
708 | max_rows=0
709 | display_seq
710 | fi
711 | max_rows=0
712 | display_seq
713 | if [[ "$PWD" = ~/.local/share/Trash/files ]]; then
714 | tput cup $(( $ll - 2 )) 3
715 | printf " -t TO EMPTY TRASH "
716 | fi
717 | elif [ "$input" = "m" ]; then
718 | ll=$(tput lines)
719 | if [ "$flag" = 1 ]; then
720 | bob=$(find . -maxdepth 1 -not -path '*/.*' | sed 's|^\./||'| fzf -m --layout=reverse --border=bold --border=rounded --margin=10%)
721 | elif [ "$flag" = 0 ]; then
722 | bob=$(ls -a| fzf -m --layout=reverse --border=bold --border=rounded --margin=10%)
723 | fi
724 | tput civis
725 | tput cup $(( $ll - 2 )) 3
726 | printf " enter destination folder : "
727 | read bob2
728 | Flap-Travel $bob $bob2
729 | if [ $fileanim -eq 0 ]; then
730 | moveanim
731 | fi
732 | max_rows=0
733 | display_seq
734 | elif [ "$input" = "r" ]; then
735 | ll=$(tput lines)
736 | tput cup $(( $ll - 2 )) 3
737 | bob=$(fnfind 0)
738 | tput civis
739 | printf " enter new name : "
740 | read bob2
741 | Waddle-Name "$bob" $bob2
742 | max_rows=0
743 | display_seq
744 | elif [ "$input" = "c" ]; then
745 | ll=$(tput lines)
746 | if [ "$flag" = 1 ]; then
747 | bob=$(find . -maxdepth 1 -not -path '*/.*' | sed 's|^\./||'| fzf -m --layout=reverse --border=bold --border=rounded --margin=10%)
748 | elif [ "$flag" = 0 ]; then
749 | bob=$(ls -a| fzf -m --layout=reverse --border=bold --border=rounded --margin=10%)
750 | fi
751 | tput civis
752 | tput cup $(( $ll - 2 )) 3
753 | printf " enter destination folder or coplied file name : "
754 | read bob2
755 | Fish-Borrow $bob $bob2
756 | max_rows=0
757 | display_seq
758 | elif [ "$input" = "." ]; then
759 | ll=$(tput lines)
760 | fzf -m --layout=reverse --border=bold --border=rounded --margin=10% | wl-copy
761 | tput civis
762 | tput cup $(( $ll - 2 )) 3
763 | printf " copied path "
764 | sleep 1s
765 | max_rows=0
766 | display_seq
767 | elif [ "$input" = "t" ] && [ "$bob" = "t" ]; then
768 | make_window
769 | ll=$(tput lines)
770 | tput cup $(( $ll - 2 )) 3
771 | printf " Empty TRASH (y/n) : "
772 | read -rsn1 bob
773 | if [ "$bob" = "y" ]; then
774 | rm -rf ~/.local/share/Trash/files/*
775 | trashanim
776 | fi
777 | max_rows=0
778 | display_seq
779 | elif [ "$input" = "t" ]; then
780 | make_window
781 | ll=$(tput lines)
782 | tput cup $(( ll - 2 )) 3
783 | printf " Execute command : "
784 | read bob
785 | clear_win
786 | echo "[user@pbfm]$ $bob"
787 | echo "------------"
788 | printf "\033[0;32m"
789 | bash -c "$bob"
790 | printf "\033[0m\n"
791 | read -n 1 -s -r -p "Press any key to return to the file manager ..."
792 | Line_sweep
793 | tput civis
794 | max_rows=0
795 | display_seq
796 | elif [ "$input" = "x" ]; then
797 | ll=$(tput lines)
798 | tput cup $(( $ll - 2 )) 3
799 | printf " DELETE FILE/FOLDER : "
800 | Snow-Sweep $(fnfind 0)
801 | tput civis
802 | max_rows=0
803 | display_seq
804 | elif [ "$input" = "u" ] && [ -e "$trash_file" ]; then
805 | mv "$trash_file" "$undodir"
806 | max_rows=0
807 | display_seq
808 | elif [ "$input" = "o" ]; then
809 | ll=$(tput lines)
810 | tput cup $(( $ll - 2 )) 3
811 | printf " Open Files ? : "
812 | if [ "$flag" = 1 ]; then
813 | Belly-Flop $(find . -maxdepth 1 -not -path '*/.*' | sed 's|^\./||'| fzf --layout=reverse --border=bold --border=rounded --margin=10% --preview 'file -b {} | grep -iq "text" && echo -e "Permissions: $(stat -f %Sp {})\nLinks: $(stat -f %l {})\nOwner: $(stat -f %Su {})\nGroup: $(stat -f %Sg {})\nSize: $(stat -f %z {}) bytes\nModified: $(stat -f %Sm {})\nFile: {}\n\n------ Separator Line ------\n$(cat {})" || echo -e "Permissions: $(stat -f %Sp {})\nLinks: $(stat -f %l {})\nOwner: $(stat -f %Su {})\nGroup: $(stat -f %Sg {})\nSize: $(stat -f %z {}) bytes\nModified: $(stat -f %Sm {})\nFile: {}\n\n------ Preview ------\nPenguin detects Binary file, cannot display content."')
814 | elif [ "$flag" = 0 ]; then
815 | Belly-Flop $(ls -a| fzf --layout=reverse --border=bold --border=rounded --margin=10% --preview 'file -b {} | grep -iq "text" && echo -e "Permissions: $(stat -f %Sp {})\nLinks: $(stat -f %l {})\nOwner: $(stat -f %Su {})\nGroup: $(stat -f %Sg {})\nSize: $(stat -f %z {}) bytes\nModified: $(stat -f %Sm {})\nFile: {}\n\n------ Separator Line ------\n$(cat {})" || echo -e "Permissions: $(stat -f %Sp {})\nLinks: $(stat -f %l {})\nOwner: $(stat -f %Su {})\nGroup: $(stat -f %Sg {})\nSize: $(stat -f %z {}) bytes\nModified: $(stat -f %Sm {})\nFile: {}\n\n------ Preview ------\nPenguin detects Binary file, cannot display content."')
816 | fi
817 | tput civis
818 | max_rows=0
819 | display_seq
820 | elif [ "$input" = "!" ]; then
821 | Fillaform " " "█▀▄ █ ▄▀▀ █▄▀ █ ██▀ ██▄ ██▀ █▀▄ █▀▄ ▀▄▀" "█▀ █ ▀▄▄ █ █ █▄▄ █▄▄ █▄█ █▄▄ █▀▄ █▀▄ █" "The keyboard oriented file manager" " " " for this help message" " to refresh display" " toggle hidden files" "> change directory" "<<> back" "<[> quick commands" " to move files and folders" " to copy files and folders" " to rename file of folder" " to delete (use to undo)" " to open file" " to quit" "<.> to copy path" " "
822 | chk="penglin"
823 | elif [ "$input" = "q" ]; then
824 | tput cnorm
825 | break
826 | fi
827 | done
828 |
829 | ascii_wave() {
830 | frames=(
831 | "⣾"
832 | "⣽"
833 | "⣻"
834 | "⢿"
835 | "⡿"
836 | "⣟"
837 | "⣯"
838 | "⣷"
839 | )
840 | for i in {1..16}; do
841 | printf "\r%s Disconnect matrix " "${frames[i % 8]}"
842 | sleep 0.1
843 | done
844 | echo ""
845 | for i in {1..16}; do
846 | printf "\r%s Running exit sequence " "${frames[i % 8]}"
847 | sleep 0.1
848 | done
849 | echo ""
850 | for i in {1..16}; do
851 | printf "\r%s Removing nodes " "${frames[i % 8]}"
852 | sleep 0.1
853 | done
854 | echo ""
855 | for i in {1..16}; do
856 | printf "\r%s Clearing temp variables " "${frames[i % 8]}"
857 | sleep 0.1
858 | done
859 | echo ""
860 | }
861 |
862 | clear_win
863 | ascii_wave
864 | clear_win
865 | tput cnorm
866 |
--------------------------------------------------------------------------------
/scripts/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # ekahPruthvi (SCU)
3 |
4 | install_dir="/opt/pickle_Berry"
5 | current_dir="$(dirname "$(readlink -f "$0")")"
6 |
7 | echo "Starting install script."
8 | echo "fzf is required as a dependency, installing"
9 | pacman -Sy fzf
10 |
11 | mkdir $install_dir
12 | cp $current_dir/pbfm $install_dir/
13 | cp $current_dir/pickleberry.png $install_dir/
14 | cp -a $current_dir/src $install_dir/
15 | ln -s $install_dir/pbfm /usr/bin/pbfm
16 | cat > /usr/share/applications/pickleBerry.desktop << EOF
17 | [Desktop Entry]
18 | Version=2.8.0
19 | Type=Application
20 | Name=pickleBerry
21 | Comment=File manager for the TUIfreaks!!
22 | Exec=bash $install_dir/pbfm
23 | Icon=$install_dir/pickleberry.png
24 | Terminal=true
25 | StartupNotify=false
26 | EOF
27 |
28 | ascii_wave() {
29 | frames=(
30 | "⣾"
31 | "⣽"
32 | "⣻"
33 | "⢿"
34 | "⡿"
35 | "⣟"
36 | "⣯"
37 | "⣷"
38 | )
39 | for i in {1..12}; do
40 | printf "\r%s Moving Files " "${frames[i % 6]}"
41 | sleep 0.05
42 | done
43 | echo ""
44 | for i in {1..12}; do
45 | printf "\r%s Running install sequence " "${frames[i % 6]}"
46 | sleep 0.05
47 | done
48 | echo ""
49 | for i in {1..12}; do
50 | printf "\r%s Giving Permissions " "${frames[i % 6]}"
51 | sleep 0.05
52 | done
53 | echo ""
54 | for i in {1..12}; do
55 | printf "\r%s Making a TUIfreak excited " "${frames[i % 6]}"
56 | sleep 0.05
57 | done
58 | echo ""
59 | }
60 |
61 | ascii_wave
62 | chmod u+x /usr/share/applications/pickleBerry.desktop
63 |
64 | echo "pickleBerry installed!!"
--------------------------------------------------------------------------------
/scripts/uninstall.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | # ekahPruthvi (SCU)
3 |
4 | install_dir="/opt/pickle_Berry"
5 | desktop_file="/usr/share/applications/pickleBerry.desktop"
6 |
7 | ascii_wave() {
8 | frames=(
9 | "⣾"
10 | "⣽"
11 | "⣻"
12 | "⢿"
13 | "⡿"
14 | "⣟"
15 | "⣯"
16 | "⣷"
17 | )
18 | for i in {1..12}; do
19 | printf "\r%s Removing binary files " "${frames[i % 6]}"
20 | sleep 0.05
21 | done
22 | echo ""
23 | for i in {1..12}; do
24 | printf "\r%s Deleting desktop files " "${frames[i % 6]}"
25 | sleep 0.05
26 | done
27 | echo ""
28 | for i in {1..12}; do
29 | printf "\r%s Dereferencing penguin " "${frames[i % 6]}"
30 | sleep 0.05
31 | done
32 | echo ""
33 | }
34 |
35 | if [ -d "$install_dir" ] && [ -e "$desktop_file" ]; then
36 | printf "Uninstalling pickleBerry"
37 | else
38 | printf "\033[0;31m!pickleBerry not installed\033[0m\n"
39 | exit
40 | fi
41 |
42 | rm -r $install_dir
43 | rm $desktop_file
44 | rm /usr/bin/pbfm
45 | ascii_wave
46 | echo "pickleBerry uninstalled :(" | pv -qL 50
47 |
--------------------------------------------------------------------------------
/src/berry_picker:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ekahPruthvi/pickle_berry/d60da71425c005668f1e85bba6225ef63f988141/src/berry_picker
--------------------------------------------------------------------------------