From 30f8348286f4fe690b309409d7c438821710b8b2 Mon Sep 17 00:00:00 2001 From: bleakgrey Date: Sat, 14 Apr 2018 15:09:06 +0300 Subject: [PATCH] Initial commit --- .gitignore | 5 + LICENSE | 674 ++++++++++++++++++ README.md | 30 + data/Application.css | 27 + ...com.github.bleakgrey.tootle.appdata.xml.in | 37 + data/com.github.bleakgrey.tootle.desktop.in | 12 + .../com.github.bleakgrey.tootle.gresource.xml | 7 + data/com.github.bleakgrey.tootle.gschema.xml | 30 + data/elephant1.png | Bin 0 -> 22388 bytes .../icons/128/com.github.bleakgrey.tootle.svg | 296 ++++++++ data/icons/16/com.github.bleakgrey.tootle.svg | 153 ++++ data/icons/24/com.github.bleakgrey.tootle.svg | 269 +++++++ data/icons/32/com.github.bleakgrey.tootle.svg | 271 +++++++ data/icons/48/com.github.bleakgrey.tootle.svg | 266 +++++++ data/icons/64/com.github.bleakgrey.tootle.svg | 266 +++++++ data/meson.build | 34 + data/screenshot.png | Bin 0 -> 103395 bytes debian/changelog | 5 + debian/compat | 1 + debian/control | 17 + debian/copyright | 25 + debian/rules | 29 + debian/source/format | 1 + meson.build | 51 ++ meson/post_install.py | 16 + po/LINGUAS | 1 + po/POTFILES | 3 + po/com.github.bleakgrey.tootle.pot | 22 + po/meson.build | 5 + po/ru.po | 23 + src/API/Account.vala | 13 + src/API/Status.vala | 53 ++ src/AccountManager.vala | 97 +++ src/Application.vala | 39 + src/CacheManager.vala | 40 ++ src/Dialogs/DialogToot.vala | 59 ++ src/MainWindow.vala | 113 +++ src/NetManager.vala | 67 ++ src/Settings.vala | 29 + src/Views/AbstractView.vala | 19 + src/Views/AddAccountView.vala | 146 ++++ src/Views/FederatedView.vala | 17 + src/Views/HomeView.vala | 77 ++ src/Views/LocalView.vala | 17 + src/Widgets/AccountsButton.vala | 44 ++ src/Widgets/AlignedLabel.vala | 11 + src/Widgets/StatusWidget.vala | 65 ++ 47 files changed, 3482 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 data/Application.css create mode 100644 data/com.github.bleakgrey.tootle.appdata.xml.in create mode 100644 data/com.github.bleakgrey.tootle.desktop.in create mode 100644 data/com.github.bleakgrey.tootle.gresource.xml create mode 100644 data/com.github.bleakgrey.tootle.gschema.xml create mode 100644 data/elephant1.png create mode 100644 data/icons/128/com.github.bleakgrey.tootle.svg create mode 100644 data/icons/16/com.github.bleakgrey.tootle.svg create mode 100644 data/icons/24/com.github.bleakgrey.tootle.svg create mode 100644 data/icons/32/com.github.bleakgrey.tootle.svg create mode 100644 data/icons/48/com.github.bleakgrey.tootle.svg create mode 100644 data/icons/64/com.github.bleakgrey.tootle.svg create mode 100644 data/meson.build create mode 100644 data/screenshot.png create mode 100644 debian/changelog create mode 100644 debian/compat create mode 100644 debian/control create mode 100644 debian/copyright create mode 100755 debian/rules create mode 100644 debian/source/format create mode 100644 meson.build create mode 100644 meson/post_install.py create mode 100644 po/LINGUAS create mode 100644 po/POTFILES create mode 100644 po/com.github.bleakgrey.tootle.pot create mode 100644 po/meson.build create mode 100644 po/ru.po create mode 100644 src/API/Account.vala create mode 100644 src/API/Status.vala create mode 100644 src/AccountManager.vala create mode 100644 src/Application.vala create mode 100644 src/CacheManager.vala create mode 100644 src/Dialogs/DialogToot.vala create mode 100644 src/MainWindow.vala create mode 100644 src/NetManager.vala create mode 100644 src/Settings.vala create mode 100644 src/Views/AbstractView.vala create mode 100644 src/Views/AddAccountView.vala create mode 100644 src/Views/FederatedView.vala create mode 100644 src/Views/HomeView.vala create mode 100644 src/Views/LocalView.vala create mode 100644 src/Widgets/AccountsButton.vala create mode 100644 src/Widgets/AlignedLabel.vala create mode 100644 src/Widgets/StatusWidget.vala diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..22282ca --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +_ignore +build +build.sh +build-po.sh +install.sh \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..bda7912 --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +# Tootle + +Simple [Mastodon](https://github.com/tootsuite/mastodon) client designed for elementary OS. + +![Tootle Screenshot](https://raw.githubusercontent.com/bleakgrey/tootle/master/data/screenshot.png) + +## Building and Installation + +First of all you'll need some dependencies to build and run the app: +* meson +* valac +* libgtk-3-dev +* libsoup2.4-dev +* libgranite-dev +* libjson-glib-dev + +Then run these commands to build and install it: + + meson build --prefix=/usr + cd build + sudo ninja install + com.github.bleakgrey.tootle + +## Contributing + +If you feel like contributing, you're always welcome to help the project in many ways: +* Reporting any issues +* Suggesting ideas and functionality +* Submitting pull requests +* Donating with [PayPal](https://www.paypal.me/bleakgrey) to help project development and keeping the developer happy diff --git a/data/Application.css b/data/Application.css new file mode 100644 index 0000000..b8f8fe3 --- /dev/null +++ b/data/Application.css @@ -0,0 +1,27 @@ +@define-color colorAccent #9aa7c8; +@define-color colorPrimary #9aa7c8; + +.mode .button{ + border-radius:0px; + border-top:none; + border-bottom:none; + padding:10px; +} + +.button_avatar{ + padding:0; + border:0; + box-shadow:none; + background:none; +} + +.status{ + border-bottom: 1px solid #cecece; +} +.status:last-child{ + border-bottom:none; +} + +.toot-text{ + background: none; +} diff --git a/data/com.github.bleakgrey.tootle.appdata.xml.in b/data/com.github.bleakgrey.tootle.appdata.xml.in new file mode 100644 index 0000000..a6280a3 --- /dev/null +++ b/data/com.github.bleakgrey.tootle.appdata.xml.in @@ -0,0 +1,37 @@ + + + + com.github.bleakgrey.tootle.desktop + CC0-1.0 + GPL-3.0+ + Tootle + Mastodon Client + +

+ A client for Mastodon +

+
+ + com.github.bleakgrey.tootle + + bleak_grey + https://github.com/bleakgrey + https://github.com/bleakgrey/tootle/issues + https://www.paypal.me/bleakgrey + + + https://raw.githubusercontent.com/bleakgrey/tootle/master/data/screenshot.png + + + + + + ​ + ​
    +
  • Initial release
  • +
+ ​
+ ​
+ ​
+ +
diff --git a/data/com.github.bleakgrey.tootle.desktop.in b/data/com.github.bleakgrey.tootle.desktop.in new file mode 100644 index 0000000..9eead9a --- /dev/null +++ b/data/com.github.bleakgrey.tootle.desktop.in @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Name=Tootle +Comment=Mastodon Client +GenericName=Mastodon Client +Exec=com.github.bleakgrey.tootle +Icon=com.github.bleakgrey.tootle +Terminal=false +Categories=GNOME;GTK;Network; +Keywords=toot;mastodon;social;network;post; +MimeType=text/plain; +StartupNotify=true diff --git a/data/com.github.bleakgrey.tootle.gresource.xml b/data/com.github.bleakgrey.tootle.gresource.xml new file mode 100644 index 0000000..8f660d2 --- /dev/null +++ b/data/com.github.bleakgrey.tootle.gresource.xml @@ -0,0 +1,7 @@ + + + + Application.css + elephant1.png + + diff --git a/data/com.github.bleakgrey.tootle.gschema.xml b/data/com.github.bleakgrey.tootle.gschema.xml new file mode 100644 index 0000000..25428bc --- /dev/null +++ b/data/com.github.bleakgrey.tootle.gschema.xml @@ -0,0 +1,30 @@ + + + + + 'null' + Client ID + + + + 'null' + Client Secret + + + + 'null' + Instance URL + + + + 'null' + Access Token + + + + 'null' + Refresh Token + + + + diff --git a/data/elephant1.png b/data/elephant1.png new file mode 100644 index 0000000000000000000000000000000000000000..4e8284e7ad4bf6b75043c3a47d8c71aa112c396d GIT binary patch literal 22388 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 literal 0 HcmV?d00001 diff --git a/data/icons/128/com.github.bleakgrey.tootle.svg b/data/icons/128/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..14e925c --- /dev/null +++ b/data/icons/128/com.github.bleakgrey.tootle.svg @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/16/com.github.bleakgrey.tootle.svg b/data/icons/16/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..ef5497a --- /dev/null +++ b/data/icons/16/com.github.bleakgrey.tootle.svg @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/data/icons/24/com.github.bleakgrey.tootle.svg b/data/icons/24/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..055b758 --- /dev/null +++ b/data/icons/24/com.github.bleakgrey.tootle.svg @@ -0,0 +1,269 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/data/icons/32/com.github.bleakgrey.tootle.svg b/data/icons/32/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..a7a8749 --- /dev/null +++ b/data/icons/32/com.github.bleakgrey.tootle.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/data/icons/48/com.github.bleakgrey.tootle.svg b/data/icons/48/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..fd643b0 --- /dev/null +++ b/data/icons/48/com.github.bleakgrey.tootle.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/data/icons/64/com.github.bleakgrey.tootle.svg b/data/icons/64/com.github.bleakgrey.tootle.svg new file mode 100644 index 0000000..d545862 --- /dev/null +++ b/data/icons/64/com.github.bleakgrey.tootle.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/data/meson.build b/data/meson.build new file mode 100644 index 0000000..f0c4ef7 --- /dev/null +++ b/data/meson.build @@ -0,0 +1,34 @@ +icon_sizes = ['16', '24', '32', '48', '64', '128'] + +foreach i : icon_sizes + install_data( + join_paths('icons', i, meson.project_name() + '.svg'), + install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', i + 'x' + i, 'apps') + ) + install_data( + join_paths('icons', i, meson.project_name() + '.svg'), + install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', i + 'x' + i + '@2', 'apps') + ) +endforeach + +install_data( + meson.project_name() + '.gschema.xml', + install_dir: join_paths(get_option('prefix'), get_option('datadir'), 'glib-2.0', 'schemas') +) + +i18n.merge_file( + input: meson.project_name() + '.desktop.in', + output: meson.project_name() + '.desktop', + po_dir: join_paths(meson.source_root(), 'po'), + type: 'desktop', + install: true, + install_dir: join_paths(get_option('datadir'), 'applications') +) + +i18n.merge_file( + input: meson.project_name() + '.appdata.xml.in', + output: meson.project_name() + '.appdata.xml', + po_dir: join_paths(meson.source_root(), 'po'), + install: true, + install_dir: join_paths(get_option('datadir'), 'metainfo') +) diff --git a/data/screenshot.png b/data/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8fb55dffe9e79eb8775170107309377f39624c0f GIT binary patch literal 103395 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
J-}H=)zX0ImE=Gi% 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 EF9@k1&j0`b literal 0 HcmV?d00001 diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..3e70769 --- /dev/null +++ b/debian/changelog @@ -0,0 +1,5 @@ +tootle (0.1.0) xenial; urgency=low + + * Initial release + + -- bleak_grey Tue, 27 Feb 2018 10:00:00 -0500 diff --git a/debian/compat b/debian/compat new file mode 100644 index 0000000..ec63514 --- /dev/null +++ b/debian/compat @@ -0,0 +1 @@ +9 diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..f5f486d --- /dev/null +++ b/debian/control @@ -0,0 +1,17 @@ +Source: com.github.bleakgrey.tootle +Section: x11 +Priority: extra +Maintainer: bleak_grey +Build-Depends: meson, + libgranite-dev, + debhelper (>= 9), + libgtk-3-dev, + valac (>= 0.26), + libglib2.0-dev (>= 2.30.0) +Standards-Version: 3.9.3 + +Package: com.github.bleakgrey.tootle +Architecture: any +Depends: ${misc:Depends}, ${shlibs:Depends} +Description: Mastodon client + Fast and beautiful Mastodon client. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..0ae7c09 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,25 @@ +Format: http://dep.debian.net/deps/dep5 +Upstream-Name: tootle +Source: https://github.com/bleakgrey/tootle + +Files: * +Copyright: 2018 bleak_grey +License: GPL-3.0+ + +License: GPL-3.0+ + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + . + This package is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + . + On Debian systems, the complete text of the GNU General + Public License version 3 can be found in "/usr/share/common-licenses/GPL-3". + diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..02e3b35 --- /dev/null +++ b/debian/rules @@ -0,0 +1,29 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Sample debian/rules that uses debhelper. +# This file was originally written by Joey Hess and Craig Small. +# As a special exception, when this file is copied by dh-make into a +# dh-make output file, you may use that output file without restriction. +# This special exception was added by Craig Small in version 0.37 of dh-make. + +# Uncomment this to turn on verbose mode. +#export DH_VERBOSE=1 + +%: + dh $@ + +override_dh_auto_clean: + rm -rf debian/build + +override_dh_auto_configure: + mkdir -p debian/build + cd debian/build && meson --prefix=/usr ../.. + +override_dh_auto_build: + cd debian/build && ninja -v + +override_dh_auto_test: + cd debian/build && ninja test + +override_dh_auto_install: + cd debian/build && DESTDIR=${CURDIR}/debian/com.github.bleakgrey.tootle ninja install diff --git a/debian/source/format b/debian/source/format new file mode 100644 index 0000000..89ae9db --- /dev/null +++ b/debian/source/format @@ -0,0 +1 @@ +3.0 (native) diff --git a/meson.build b/meson.build new file mode 100644 index 0000000..1194c4b --- /dev/null +++ b/meson.build @@ -0,0 +1,51 @@ +project('com.github.bleakgrey.tootle', 'vala', 'c') + +gnome = import('gnome') +i18n = import('i18n') + +add_global_arguments([ + '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()) + ], + language: 'c', +) + +asresources = gnome.compile_resources( + 'as-resources', 'data/' + meson.project_name() + '.gresource.xml', + source_dir: 'data', + c_name: 'as' +) + +executable( + meson.project_name(), + asresources, + 'src/Application.vala', + 'src/Settings.vala', + 'src/MainWindow.vala', + 'src/AccountManager.vala', + 'src/NetManager.vala', + 'src/CacheManager.vala', + 'src/API/Account.vala', + 'src/API/Status.vala', + 'src/Widgets/AlignedLabel.vala', + 'src/Widgets/AccountsButton.vala', + 'src/Widgets/StatusWidget.vala', + 'src/Dialogs/DialogToot.vala', + 'src/Views/AbstractView.vala', + 'src/Views/AddAccountView.vala', + 'src/Views/HomeView.vala', + 'src/Views/LocalView.vala', + 'src/Views/FederatedView.vala', + dependencies: [ + dependency('gtk+-3.0'), + dependency('glib-2.0', version: '>=2.30.0'), + dependency('granite'), + dependency('json-glib-1.0'), + dependency('libsoup-2.4') + ], + install: true +) + +subdir('data') +subdir('po') + +meson.add_install_script('meson/post_install.py') diff --git a/meson/post_install.py b/meson/post_install.py new file mode 100644 index 0000000..d1d0432 --- /dev/null +++ b/meson/post_install.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python3 + +import os +import subprocess + +schemadir = os.path.join(os.environ['MESON_INSTALL_PREFIX'], 'share', 'glib-2.0', 'schemas') +iconsdir = os.path.join(os.environ['MESON_INSTALL_PREFIX'], 'share', 'icons', 'hicolor') + +if not os.environ.get('DESTDIR'): + print('Compiling gsettings schemas...') + subprocess.call(['glib-compile-schemas', schemadir]) + + print('Updating icon cache...') + if not os.path.exists(iconsdir): + os.makedirs(iconsdir) + subprocess.call(['gtk-update-icon-cache', '-qtf', iconsdir]) \ No newline at end of file diff --git a/po/LINGUAS b/po/LINGUAS new file mode 100644 index 0000000..adc719b --- /dev/null +++ b/po/LINGUAS @@ -0,0 +1 @@ +ru \ No newline at end of file diff --git a/po/POTFILES b/po/POTFILES new file mode 100644 index 0000000..a0b8ac8 --- /dev/null +++ b/po/POTFILES @@ -0,0 +1,3 @@ +src/Application.vala +src/MainWindow.vala +src/Widgets/AccountsButton.vala diff --git a/po/com.github.bleakgrey.tootle.pot b/po/com.github.bleakgrey.tootle.pot new file mode 100644 index 0000000..ff01f09 --- /dev/null +++ b/po/com.github.bleakgrey.tootle.pot @@ -0,0 +1,22 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the com.github.bleakgrey.tootle package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: com.github.bleakgrey.tootle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-13 13:04+0300\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: src/Widgets/AccountsButton.vala:12 +msgid "Account Options" +msgstr "" diff --git a/po/meson.build b/po/meson.build new file mode 100644 index 0000000..14809ab --- /dev/null +++ b/po/meson.build @@ -0,0 +1,5 @@ +#i18n.gettext(meson.project_name(), +# args: ['--directory='+meson.source_root(), '--from-code=UTF-8'], +# install: false, +#) +i18n.gettext(meson.project_name(), preset: 'glib') \ No newline at end of file diff --git a/po/ru.po b/po/ru.po new file mode 100644 index 0000000..1f6e573 --- /dev/null +++ b/po/ru.po @@ -0,0 +1,23 @@ +# Russian translations for com.github.bleakgrey.tootle package. +# Copyright (C) 2018 THE com.github.bleakgrey.tootle'S COPYRIGHT HOLDER +# This file is distributed under the same license as the com.github.bleakgrey.tootle package. +# Automatically generated, 2018. +# +msgid "" +msgstr "" +"Project-Id-Version: com.github.bleakgrey.tootle\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-04-13 13:04+0300\n" +"PO-Revision-Date: 2018-04-13 13:04+0300\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ru\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ASCII\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/Widgets/AccountsButton.vala:12 +msgid "Account Options" +msgstr "" diff --git a/src/API/Account.vala b/src/API/Account.vala new file mode 100644 index 0000000..52e3dfa --- /dev/null +++ b/src/API/Account.vala @@ -0,0 +1,13 @@ +public class Tootle.Account{ + + public int id = -1; + public string username; + public string username_acct; + public string display_name; + public string note; + + public Account(){ + + } + +} diff --git a/src/API/Status.vala b/src/API/Status.vala new file mode 100644 index 0000000..abcbd18 --- /dev/null +++ b/src/API/Status.vala @@ -0,0 +1,53 @@ +public class Tootle.Status{ + + public int64 id; + public string uri; + public string url; + public string content; + public int64 reblogs_count; + public int64 favourites_count; + + public string avatar; + public string acct; + + public Status(int64 id) { + this.id = id; + } + + public static string escape_html(string content){ + //debug(content); + return content + .replace("
", "\n") + .replace("
", "") + .replace("
", "\n") + .replace("rel=\"tag\"", "") + .replace("rel=\"nofollow noopener\"", "") + .replace("class=\"mention hashtag\"", "") + .replace("class=\"h-card\"", "") + .replace("class=\"invisible\"", "") + .replace("class=\"ellipsis\"", "") + .replace("class=\"u-url mention\"", "") + .replace("class=\"\"", "") + .replace("

", "") + .replace("

", " ") + .replace("target=\"_blank\"", ""); + } + + public static Status parse(Json.Object obj) { + var id = int64.parse (obj.get_string_member ("id")); + var status = new Status (id); + + status.uri = obj.get_string_member ("uri"); + status.url = obj.get_string_member ("url"); + status.reblogs_count = obj.get_int_member ("reblogs_count"); + status.favourites_count = obj.get_int_member ("favourites_count"); + status.content = escape_html ( obj.get_string_member ("content")); + + var acc = obj.get_object_member ("account"); + status.avatar = acc.get_string_member ("avatar"); + status.acct = acc.get_string_member ("acct"); + + return status; + } + +} diff --git a/src/AccountManager.vala b/src/AccountManager.vala new file mode 100644 index 0000000..e18f84c --- /dev/null +++ b/src/AccountManager.vala @@ -0,0 +1,97 @@ +using GLib; + +public class Tootle.AccountManager : Object{ + + private static Settings settings; + private static AccountManager _instance; + public static AccountManager instance{ + get{ + if(_instance == null) + _instance = new AccountManager(); + return _instance; + } + } + + construct{ + settings = Settings.instance; + } + + public AccountManager(){ + Object(); + } + + public bool has_client_tokens(){ + var client_id = settings.client_id; + var client_secret = settings.client_secret; + + return !(client_id == "null" || client_secret == "null"); + } + + public bool has_access_token (){ + return settings.access_token != "null"; + } + + public void request_auth_code (string client_id){ + var pars = "?scope=read%20write%20follow"; + pars += "&response_type=code"; + pars += "&redirect_uri=urn:ietf:wg:oauth:2.0:oob"; + pars += "&client_id=" +client_id; + + try { + AppInfo.launch_default_for_uri (settings.instance_url + "/oauth/authorize" + pars, null); + } + catch (GLib.Error e){ + warning (e.message); + } + } + + public Soup.Message request_client_tokens(){ + var pars = "?client_name=Tootle"; + pars += "&redirect_uris=urn:ietf:wg:oauth:2.0:oob"; + pars += "&scopes=read%20write%20follow"; + + var msg = new Soup.Message("POST", settings.instance_url + "/api/v1/apps" + pars); + NetManager.instance.queue(msg, (sess, mess) => { + try{ + var root = NetManager.parse (mess); + var client_id = root.get_string_member ("client_id"); + var client_secret = root.get_string_member ("client_secret"); + settings.client_id = client_id; + settings.client_secret = client_secret; + debug ("Received tokens"); + + request_auth_code (client_id); + } + catch (GLib.Error e) { + warning ("Can't request client secret."); + warning (e.message); + } + }); + return msg; + } + + public Soup.Message try_auth (string code){ + var pars = "?client_id=" + settings.client_id; + pars += "&client_secret=" + settings.client_secret; + pars += "&redirect_uri=urn:ietf:wg:oauth:2.0:oob"; + pars += "&grant_type=authorization_code"; + pars += "&code=" + code; + + var msg = new Soup.Message("POST", settings.instance_url + "/oauth/token" + pars); + NetManager.instance.queue(msg, (sess, mess) => { + try{ + var root = NetManager.parse (mess); + var access_token = root.get_string_member ("access_token"); + settings.access_token = access_token; + debug ("Got access token"); + Tootle.app.state_updated (); + } + catch (GLib.Error e) { + warning ("Can't get access token"); + warning (e.message); + } + }); + return msg; + } + +} diff --git a/src/Application.vala b/src/Application.vala new file mode 100644 index 0000000..7142090 --- /dev/null +++ b/src/Application.vala @@ -0,0 +1,39 @@ +using Gtk; +using Granite; + +namespace Tootle{ + + public static Application app; + public static MainWindow window; + + public class Application : Granite.Application { + + public abstract signal void state_updated(); + public abstract signal void toast(string title); + public abstract signal void error(string error); + + construct { + application_id = "com.github.bleakgrey.tootle"; + flags = ApplicationFlags.FLAGS_NONE; + program_name = "Toot"; + build_version = "0.1.0"; + } + + public static int main (string[] args) { + app = new Application (); + return app.run (args); + } + + protected override void startup () { + base.startup (); + Granite.Services.Logger.DisplayLevel = Granite.Services.LogLevel.DEBUG; + window = new MainWindow (this); + } + + protected override void activate () { + window.present (); + } + + } + +} diff --git a/src/CacheManager.vala b/src/CacheManager.vala new file mode 100644 index 0000000..da78a40 --- /dev/null +++ b/src/CacheManager.vala @@ -0,0 +1,40 @@ +using Gdk; +using GLib; + +public class Tootle.CacheManager : GLib.Object{ + + private static CacheManager _instance; + public static CacheManager instance{ + get{ + if(_instance == null) + _instance = new CacheManager(); + return _instance; + } + } + + private static string path_images; + + construct{ + path_images = GLib.Environment.get_user_special_dir (UserDirectory.DOWNLOAD); + } + + public CacheManager(){ + Object (); + } + + public void load_image (string url, Granite.Widgets.Avatar avatar){ + var msg = new Soup.Message("GET", url); + msg.finished.connect(()=>{ + uint8[] buf = msg.response_body.data; + var loader = new PixbufLoader(); + loader.set_size (32,32); + loader.write(buf); + loader.close(); + var pixbuf = loader.get_pixbuf (); + + avatar.pixbuf = pixbuf; + }); + NetManager.instance.queue(msg, (sess, mess) => {}); + } + +} diff --git a/src/Dialogs/DialogToot.vala b/src/Dialogs/DialogToot.vala new file mode 100644 index 0000000..a977f80 --- /dev/null +++ b/src/Dialogs/DialogToot.vala @@ -0,0 +1,59 @@ +using Gtk; + +public class Tootle.TootDialog : Gtk.Dialog { + + private static TootDialog dialog; + private Gtk.TextView text; + private Gtk.Label counter; + + public TootDialog (Gtk.Window? parent) { + Object ( + border_width: 5, + deletable: false, + resizable: false, + title: _("Toot"), + transient_for: parent + ); + var actions = get_action_area().get_parent() as Gtk.Box; + var content = get_content_area(); + + var close = add_button(_("Cancel"), 5) as Gtk.Button; + close.clicked.connect(() => { + this.destroy (); + }); + + var publish = add_button(_("Toot!"), 5) as Gtk.Button; + publish.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); + + text = new Gtk.TextView(); + text.margin_start = 6; + text.margin_end = 6; + text.get_style_context ().add_class ("toot-text"); + text.hexpand = true; + text.wrap_mode = Gtk.WrapMode.WORD; + text.buffer.changed.connect(update_counter); + + counter = new Gtk.Label ("500"); + + actions.pack_start (counter, false, false, 6); + content.pack_start (text, false, false, 0); + content.set_size_request (300, 100); + } + + private void update_counter(){ + var len = text.buffer.text.length; + + counter.label = (500 - len).to_string (); + } + + public static void open(Gtk.Window? parent){ + if(dialog == null){ + dialog = new TootDialog (parent); + dialog.destroy.connect (() => { + dialog = null; + }); + dialog.show_all (); + } + } + +} diff --git a/src/MainWindow.vala b/src/MainWindow.vala new file mode 100644 index 0000000..c6d78c2 --- /dev/null +++ b/src/MainWindow.vala @@ -0,0 +1,113 @@ +using Gtk; + +public class Tootle.MainWindow: Gtk.Window { + + HeaderBar header; + Stack stack; + AccountsButton accounts; + Granite.Widgets.ModeButton mode; + Spinner spinner; + Button button_toot; + + HomeView home = new HomeView (); + LocalView feed_local = new LocalView (); + FederatedView feed_federated = new FederatedView (); + + public MainWindow (Gtk.Application application) { + Object (application: application, + icon_name: "com.github.bleakgrey.tootle", + title: "Tootle", + resizable: true + ); + set_titlebar (header); + window_position = WindowPosition.CENTER; + + Tootle.app.state_updated.connect(on_state_update); + on_state_update (); + } + + construct { + var provider = new Gtk.CssProvider (); + provider.load_from_resource ("/com/github/bleakgrey/tootle/Application.css"); + StyleContext.add_provider_for_screen (Gdk.Screen.get_default (), provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION); + + stack = new Stack(); + stack.transition_type = Gtk.StackTransitionType.SLIDE_LEFT_RIGHT; + stack.show (); + stack.set_size_request (400, 500); + + spinner = new Spinner (); + spinner.active = true; + + accounts = new AccountsButton (); + + button_toot = new Button (); + button_toot.tooltip_text = "Toot"; + button_toot.image = new Gtk.Image.from_icon_name ("edit-symbolic", Gtk.IconSize.LARGE_TOOLBAR); + button_toot.clicked.connect (() => { + TootDialog.open (this); + }); + + mode = new Granite.Widgets.ModeButton (); + mode.get_style_context ().add_class ("mode"); + mode.mode_changed.connect(widget => { + stack.set_visible_child_name(widget.tooltip_text); + }); + + header = new HeaderBar (); + header.show_close_button = true; + header.pack_start (button_toot); + header.custom_title = mode; + + header.pack_end (accounts); + header.pack_end (spinner); + header.show (); + + mode.valign = Gtk.Align.FILL; + + add (stack); + show_all (); + + NetManager.instance.started.connect (() => spinner.show ()); + NetManager.instance.finished.connect (() => spinner.hide ()); + } + + private void on_state_update(){ + mode.hide (); + button_toot.hide (); + accounts.hide (); + stack.forall (widget => stack.remove (widget)); + + var has_token = AccountManager.instance.has_access_token(); + if(!has_token) + show_setup_views (); + else + show_main_views (); + } + + private void show_setup_views (){ + var add_account = new AddAccountView (); + stack.add_named (add_account, add_account.get_name ()); + } + + private void show_main_views (){ + add_view (home); + add_view (feed_local); + add_view (feed_federated); + mode.set_active (0); + mode.show (); + button_toot.show (); + accounts.show (); + } + + private void add_view (AbstractView view) { + if (view.show_in_header){ + var button = new Gtk.Image.from_icon_name(view.get_icon (), Gtk.IconSize.LARGE_TOOLBAR); + button.tooltip_text = view.get_name (); + mode.append (button); + + stack.add_named(view, view.get_name ()); + } + } + +} diff --git a/src/NetManager.vala b/src/NetManager.vala new file mode 100644 index 0000000..3cc8adb --- /dev/null +++ b/src/NetManager.vala @@ -0,0 +1,67 @@ +using Soup; +using GLib; +using Json; + +public class Tootle.NetManager : GLib.Object{ + + public abstract signal void started(); + public abstract signal void finished(); + + private static NetManager _instance; + public static NetManager instance{ + get{ + if(_instance == null) + _instance = new NetManager(); + return _instance; + } + } + + private int requests_processing = 0; + private Soup.Session session; + + construct{ + session = new Soup.Session (); + session.request_unqueued.connect (() => { + requests_processing--; + if(requests_processing <= 0) + finished (); + }); + } + + public NetManager(){ + GLib.Object(); + } + + public Soup.Message queue(Soup.Message msg, Soup.SessionCallback cb){ + requests_processing++; + started (); + + var token = Settings.instance.access_token; + if(token != "null") + msg.request_headers.append ("Authorization", "Bearer " + token); + + session.queue_message (msg, cb); + return msg; + } + + public static Json.Object parse(Soup.Message msg) throws GLib.Error{ + // stdout.printf ("Status Code: %u\n", msg.status_code); + // stdout.printf ("Message length: %lld\n", msg.response_body.length); + // stdout.printf ("Data: \n%s\n", (string) msg.response_body.data); + + var parser = new Json.Parser (); + parser.load_from_data ((string) msg.response_body.flatten ().data, -1); + return parser.get_root ().get_object (); + } + + public static Json.Array parse_array(Soup.Message msg) throws GLib.Error{ + // stdout.printf ("Status Code: %u\n", msg.status_code); + // stdout.printf ("Message length: %lld\n", msg.response_body.length); + // stdout.printf ("Data: \n%s\n", (string) msg.response_body.data); + + var parser = new Json.Parser (); + parser.load_from_data ((string) msg.response_body.flatten ().data, -1); + return parser.get_root ().get_array (); + } + +} diff --git a/src/Settings.vala b/src/Settings.vala new file mode 100644 index 0000000..8fe05fa --- /dev/null +++ b/src/Settings.vala @@ -0,0 +1,29 @@ +public class Tootle.Settings : Granite.Services.Settings { + + private static Settings? _instance; + public static Settings instance { + get{ + if (_instance == null) + _instance = new Settings (); + return _instance; + } + } + + public string client_id { get; set; } + public string client_secret { get; set; } + public string access_token { get; set; } + public string refresh_token { get; set; } + public string instance_url { get; set; } + + public void clear_account (){ + access_token = "null"; + refresh_token = "null"; + instance_url = "null"; + debug ("Removed current account"); + } + + private Settings () { + base ("com.github.bleakgrey.tootle"); + } + +} diff --git a/src/Views/AbstractView.vala b/src/Views/AbstractView.vala new file mode 100644 index 0000000..84c0324 --- /dev/null +++ b/src/Views/AbstractView.vala @@ -0,0 +1,19 @@ +using Gtk; + +public abstract class Tootle.AbstractView : Gtk.Box { + + public bool show_in_header; + + public AbstractView (bool show_in_header) { + this.show_in_header = show_in_header; + } + + public virtual string get_icon () { + return "null"; + } + + public virtual string get_name () { + return "unnamed"; + } + +} diff --git a/src/Views/AddAccountView.vala b/src/Views/AddAccountView.vala new file mode 100644 index 0000000..0920750 --- /dev/null +++ b/src/Views/AddAccountView.vala @@ -0,0 +1,146 @@ +using Gtk; +using Granite; + +public class Tootle.AddAccountView : Tootle.AbstractView { + + AccountManager manager; + public Stack stack; + GridInstance grid_instance; + GridCode grid_code; + + protected class GridInstance : Grid{ + Image image; + public Button button_next; + public Entry entry; + + construct{ + column_spacing = 12; + row_spacing = 6; + hexpand = true; + halign = Gtk.Align.CENTER; + + image = new Image.from_resource ("/com/github/bleakgrey/tootle/elephant1.png"); + image.halign = Gtk.Align.CENTER; + image.hexpand = true; + image.margin_bottom = 24; + + entry = new Entry (); + entry.text = "https://myinstance.com/"; + entry.set_placeholder_text ("https://myinstance.com/"); + entry.width_chars = 30; + + button_next = new Button.with_label ("Next"); + button_next.halign = Gtk.Align.END; + + var register = new Label ("
What's an instance?"); + register.halign = Gtk.Align.END; + register.set_use_markup (true); + + attach (image, 0, 1, 2, 1); + attach (new AlignedLabel ("Instance:"), 0, 2, 1, 1); + attach (entry, 1, 2, 1, 1); + attach (button_next, 0, 3, 2, 1); + attach (register, 0, 4, 2, 1); + } + + public GridInstance(){} + } + + protected class GridCode : Grid{ + Granite.Widgets.Avatar image; + public Button button_back; + public Button button_next; + public Entry code; + + construct{ + column_spacing = 12; + row_spacing = 6; + hexpand = true; + halign = Gtk.Align.CENTER; + valign = Gtk.Align.CENTER; + + image = new Granite.Widgets.Avatar.with_default_icon (128); + image.halign = Gtk.Align.CENTER; + image.hexpand = true; + image.margin_bottom = 24; + + code = new Entry (); + code.width_chars = 30; + + button_next = new Button.with_label ("Add Account"); + button_next.halign = Gtk.Align.END; + + button_back = new Button.with_label ("Back"); + button_back.halign = Gtk.Align.START; + + attach (image, 0, 1, 2, 1); + attach (new AlignedLabel ("Authorization Code:"), 0, 2, 1, 1); + attach (code, 1, 2, 1, 1); + attach (button_back, 0, 3, 1, 1); + attach (button_next, 1, 3, 1, 1); + } + + public GridCode(){} + } + + + + construct { + manager = AccountManager.instance; + + stack = new Stack (); + stack.valign = Gtk.Align.CENTER; + stack.transition_type = StackTransitionType.SLIDE_LEFT_RIGHT; + + grid_instance = new GridInstance (); + grid_instance.button_next.clicked.connect(on_next_click); + + grid_code = new GridCode (); + grid_code.button_back.clicked.connect(() => stack.set_visible_child_name ("instance")); + grid_code.button_next.clicked.connect(on_add_click); + + var header1 = new Gtk.Label ("Enter Your Instance URL:"); + header1.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL); + header1.halign = Gtk.Align.CENTER; + header1.hexpand = true; + + stack.add_named (grid_instance, "instance"); + stack.add_named (grid_code, "code"); + + add (stack); + show_all (); + } + + public AddAccountView () { + base (false); + } + + public override string get_name () { + return "add_account"; + } + + private void on_next_click(){ + Settings.instance.clear_account (); + Settings.instance.instance_url = grid_instance.entry.text; + grid_instance.sensitive = false; + + if(!manager.has_client_tokens ()){ + var msg = manager.request_client_tokens (); + msg.finished.connect(() => { + grid_instance.sensitive = true; + stack.set_visible_child_name ("code"); + }); + } + else{ + grid_instance.sensitive = true; + stack.set_visible_child_name ("code"); + manager.request_auth_code (Settings.instance.client_id); + } + } + + private void on_add_click (){ + var code = grid_code.code.text; + manager.try_auth (code); + } + +} diff --git a/src/Views/FederatedView.vala b/src/Views/FederatedView.vala new file mode 100644 index 0000000..86c8553 --- /dev/null +++ b/src/Views/FederatedView.vala @@ -0,0 +1,17 @@ +using Gtk; + +public class Tootle.FederatedView : Tootle.HomeView { + + public FederatedView () { + base ("public"); + } + + public override string get_icon () { + return "network-workgroup-symbolic"; + } + + public override string get_name () { + return "Federated Timeline"; + } + +} diff --git a/src/Views/HomeView.vala b/src/Views/HomeView.vala new file mode 100644 index 0000000..d92d4df --- /dev/null +++ b/src/Views/HomeView.vala @@ -0,0 +1,77 @@ +using Gtk; +using Gdk; + +public class Tootle.HomeView : Tootle.AbstractView { + + Gtk.Box view; + Gtk.ScrolledWindow scroll; + + private string timeline; + private string pars; + + construct { + view = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); + view.hexpand = true; + view.valign = Gtk.Align.START; + + scroll = new Gtk.ScrolledWindow (null, null); + scroll.hexpand = true; + scroll.vexpand = true; + scroll.hscrollbar_policy = Gtk.PolicyType.NEVER; + scroll.add (view); + add (scroll); + } + + public HomeView (string timeline = "home", string pars = "") { + base (true); + this.timeline = timeline; + this.pars = pars; + request_update (); + + show_all(); + + // var s = new Status(1); + // s.content = "Test content, wow!"; + // prepend (s); + } + + public override string get_icon () { + return "user-home-symbolic"; + } + + public override string get_name () { + return "Home Timeline"; + } + + public void prepend(Status status){ + var widget = new StatusWidget(); + widget.rebind (status); + view.pack_end (widget, false, false, 0); + } + + public virtual Soup.Message request_update (){ + var url = Settings.instance.instance_url; + url += "api/v1/timelines/"; + url += this.timeline; + url += this.pars; + + var msg = new Soup.Message("GET", url); + NetManager.instance.queue(msg, (sess, mess) => { + try{ + NetManager.parse_array (mess).foreach_element ((array, i, node) => { + var object = node.get_object (); + if (object != null){ + var status = Status.parse(object); + prepend (status); + } + }); + } + catch (GLib.Error e) { + warning ("Can't update feed"); + warning (e.message); + } + }); + return msg; + } + +} diff --git a/src/Views/LocalView.vala b/src/Views/LocalView.vala new file mode 100644 index 0000000..0df25c8 --- /dev/null +++ b/src/Views/LocalView.vala @@ -0,0 +1,17 @@ +using Gtk; + +public class Tootle.LocalView : Tootle.HomeView { + + public LocalView () { + base ("public", "?local=true"); + } + + public override string get_icon () { + return "appointment-symbolic"; + } + + public override string get_name () { + return "Local Timeline"; + } + +} diff --git a/src/Widgets/AccountsButton.vala b/src/Widgets/AccountsButton.vala new file mode 100644 index 0000000..cbe584a --- /dev/null +++ b/src/Widgets/AccountsButton.vala @@ -0,0 +1,44 @@ +using Gtk; + +public class Tootle.AccountsButton : Gtk.MenuButton{ + + Granite.Widgets.Avatar avatar; + Gtk.Grid grid; + Gtk.Popover menu; + + construct{ + //var iconfile = "/var/lib/AccountsService/icons/blue"; + avatar = new Granite.Widgets.Avatar.with_default_icon (24); + avatar.set_tooltip_text (_("Account Options")); + avatar.button_press_event.connect(event => { + return false; + }); + + var item_separator = new Gtk.Separator (Gtk.Orientation.HORIZONTAL); + item_separator.hexpand = true; + item_separator.margin_top = 6; + + var item_settings = new Gtk.ModelButton (); + item_settings.text = _("Settings"); + + grid = new Gtk.Grid (); + grid.orientation = Gtk.Orientation.VERTICAL; + grid.width_request = 200; + grid.attach(item_separator, 0, 1, 1, 1); + grid.attach(item_settings, 0, 2, 1, 1); + grid.show_all (); + + menu = new Gtk.Popover (null); + menu.add (grid); + + get_style_context ().add_class ("button_avatar"); + popover = menu; + add(avatar); + show_all (); + } + + public AccountsButton(){ + Object(); + } + +} diff --git a/src/Widgets/AlignedLabel.vala b/src/Widgets/AlignedLabel.vala new file mode 100644 index 0000000..2782cee --- /dev/null +++ b/src/Widgets/AlignedLabel.vala @@ -0,0 +1,11 @@ +using Gtk; + +public class AlignedLabel : Gtk.Label { + + public AlignedLabel (string text) { + label = text; + halign = Gtk.Align.END; + //margin_start = 12; + } + +} diff --git a/src/Widgets/StatusWidget.vala b/src/Widgets/StatusWidget.vala new file mode 100644 index 0000000..64c7b26 --- /dev/null +++ b/src/Widgets/StatusWidget.vala @@ -0,0 +1,65 @@ +using Gtk; +using Granite; + +public class Tootle.StatusWidget : Gtk.Grid { + + public Granite.Widgets.Avatar avatar; + Gtk.Label user; + Gtk.Label content; + + Gtk.Box counters; + Gtk.Label reblogs; + Gtk.Label favorites; + + construct { + margin = 6; + avatar = new Granite.Widgets.Avatar.with_default_icon (32); + avatar.valign = Gtk.Align.START; + avatar.margin_end = 6; + user = new Gtk.Label ("Anonymous"); + user.hexpand = true; + user.halign = Gtk.Align.START; + user.use_markup = true; + content = new Gtk.Label ("Error parsing text :c"); + content.halign = Gtk.Align.START; + content.use_markup = true; + content.single_line_mode = false; + content.set_line_wrap (true); + //content.selectable = true; //TODO: toot page + content.justify = Gtk.Justification.LEFT; + content.margin_end = 6; + content.xalign = 0; + + reblogs = new Gtk.Label ("0"); + favorites = new Gtk.Label ("0"); + counters = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 6); + counters.margin_top = 6; + counters.margin_bottom = 12; + counters.add(new Gtk.Image.from_icon_name ("media-playlist-repeat-symbolic", Gtk.IconSize.SMALL_TOOLBAR)); + counters.add(reblogs); + counters.add(new Gtk.Image.from_icon_name ("user-bookmarks-symbolic", Gtk.IconSize.SMALL_TOOLBAR)); + counters.add(favorites); + counters.show_all (); + + attach(avatar, 0, 0, 1, 3); + attach(user, 1, 1, 1, 1); + attach(content, 1, 2, 1, 1); + attach(counters, 1, 3, 1, 1); + show_all(); + } + + public StatusWidget () { + get_style_context ().add_class ("status"); + } + + public void rebind (Status status){ + user.label = ""+status.acct+""; + content.label = status.content; + + reblogs.label = status.reblogs_count.to_string (); + favorites.label = status.favourites_count.to_string (); + + CacheManager.instance.load_image (status.avatar, this.avatar); + } + +}