Git Product home page Git Product logo

ajour's Introduction

Ajour is no longer maintained. Please read #746.

Thank you all for the support, the feedback and for being an awesome community.

Ajour

Continuous integration Security audit Discord Server Ajour on Patreon

ajour banner

Table of Contents

Introduction

Ajour is a World of Warcraft addon manager written in Rust with a strong focus on performance and simplicity. The project is completely advertisement free, privacy respecting and open source. Ajour currently supports Windows, macOS and Linux.

Download Button

Screenshots

Ajour showing addons Ajour showing catalog

Features

  • Addons will be parsed automatically and resolved from multiple repositories:
  • Install new addons from the catalog or directly from a GitHub/GitLab URL
  • Support for release channels, so it's possible to select either alpha, beta or stable for each addon
  • View changelogs for each addon
  • Bulk addon update without any limitations
  • Remove addons and their dependencies
  • Ignore addons you don't want to update
  • Supports both Retail, Classic Era, Classic Tbc, Ptr and Beta versions of World of Warcraft
  • 10+ handcrafted themes to choose between
  • Ability to backup your whole UI, including all settings from WTF
  • Ability to run as a command line application for advanced users
  • WeakAuras and Plater import strings from Wago.io will automatically be parsed
  • Localized in multiple languages

Install

Prebuilt binaries for macOS and Windows can be downloaded from the GitHub releases page.

For everyone else, a detailed instruction can be found here.

Themes

Use the theme builder (source) website to quickly generate custom themes. Once you are done press copy and paste the value into Import Theme inside Settings in Ajour.

Custom themes will be saved in this location:

macOS / Linux:

  • $HOME/.config/ajour/themes

Windows:

  • %APPDATA%\ajour\themes

Keybindings

key action
a Go to MyAddons
w Go to Wago
c Go to Catalog
i Go to Install from URL
s Go to Settings
r Refresh
u Update

Command Line

Find instructions for using the command line interface here

Contribute

PRs Welcome

Ajour wouldn't be here without your help. I welcome contributions of any kind, because together we can make Ajour even better.

FAQ

macOS won't let me open the app, what should I do?

Instead of double clicking it, right click and choose "Open". That should successfully open Ajour.

What requirements does Ajour have?

Windows: DX12 or Vulkan Linux: Vulkan macOS: Metal

If you are having problems with these requirements, then try the OpenGL build.

Where does Ajour store its configuration?

Ajour will generate a folder in the following directory:

macOS / Linux:

  • $HOME/.config/ajour

Windows:

  • %APPDATA%\ajour

Inside this folder Ajour will keep a configuration file for storing different user settings, a log file with events from the last session, a fingerprint file with hashed fingerprints for each addon and a theme folder with custom themes.

Why Rust?

We wanted to create an application which natively compiles to both Windows, Linux and macOS while at the same time is as performant and reliable as possible.

Acknowledgement

License

Ajour is released under the GPL-3.0 License.

ajour's People

Contributors

anses-simon-arnaud avatar casperstorm avatar crimsonvoid avatar cronnay avatar fputs avatar jef avatar kasperkronborg avatar kawarimidoll avatar kawashita86 avatar kwilliams1987 avatar layday avatar legol2 avatar masonnl avatar mazwak avatar mlablah avatar nelfym avatar nkf avatar revinderdev avatar scoiatael avatar seank-com avatar tarkah avatar zeevallin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ajour's Issues

Titles above cells

We should have titles added above each cell so it's easier to tell what is what.

[...] I think the columns could use some titles. Eg. "Your version" and "Latest version" or something similar.

Not clear when async operations are done

There is no UI indication when the refresh or update all operations have completed. It's hard to judge by looking at the list.

Possible fix:
Use status mesages to communicate operation status. Eg. "Refreshing list of addons...", "Refresh complete", "Updating all addons..." and "Update complete".

Disabling the buttons as suggested in #32 would also help address this issue.

What to do with non-matched addons?

If a addon does not have either a curse_id, wowi_id or tuk_id I can't match it against any API. What to do with those, visually?

Example:
Screenshot 2020-08-14 at 15 53 15

Notice: AngryNotes and AddonSkins. They don't have any id's to any repository so i've just added - to the remote version for now.

Do you have any input, @mlablah?

Delete AddOn

As a User, I want to be able to delete an installed addon.

Clicking the Delete AddOn button should remove the addon, and all the addons that is related to it via dependencies, leaving the SavedVariables intact.

Updating an addon will also trigger this action.

Pseudo code:

  • Refresh data structure by executing Parse Interface folder (to make sure we have the latest changes).
  • From data structure, determine addons with dependencies to the addon being deleted.
  • Delete dependent addons and the addon the user wanted to delete.
  • Refresh data structure by executing Parse Interface folder again (to make sure changes are propagated).

Buttons sometimes stuck in their highlighted state

It's sometimes possible to move the mouse away from the application, and have the state of a button get "stuck" in the moused over appearance.

Ways to reproduce:
Mouse over the "Refresh" button, and then quickly move the pointer up. Or mouse over a "Delete" button and move mouse to the right.

Since it does not always happen, I think it is caused by the application only registering mouse positions inside the app.

Settings: add option to change flavor

I only play classic so for the flavor change I have to dive in into the config file, so it will be nice some autodetection what flavor is installed on the given path or simple gui "SelectBox" with those options.

Ability to ignore addons

A user may wish to exclude certain addons from update consideration, but would like to use the "Update All" operation for all other addons.

I propose an "Ignore" button inside the "Details" view of each addon. Clicking it will add the Addon to a list of ignored addons and remove it from the list. The addon will stay ignored through refreshing the list or restarting the application.

Ignored addons can be "unignored" via the Settings view, (or alternatively by editing the config file they've been added to).

Fingerprint local addons to improve addon parsing

Is your feature request related to a problem? Please describe.
Currently our ability to match a local addon with an online repository is entirely dependent on the quality of the data in the local toc files. In many cases the version tag is missing from the toc file or it has an incorrect value.

Describe the solution you'd like
To mitigate this, we can implement a fingerprint algorithm that will match the fingerprint values returned by the curse api's fingerprint endpoint.

This has implications for:

  • Addon parsing (need to calculate fingerprints)
  • GUI (show/hide addons based on additional criteria)
  • Updating (try fingerprint lookup before ever searching by title)

Additional context
Caching fingerprints per folder along with a timestamp, and only recalculate the fingerprint if the toc file is newer than the timestamp (or addon is updated via ajour) could speed up subsequent load times.

Ability to "fail safe" to our offline logic, in case the fingerprint algorithm is changed on us, and nothing matches or the api is offline.

Implementing this enhancement will most likely solve #67 and #74.

Throttle # of connections to api

When Ajour performs a refresh or update all operation, a large number of simultaneous asynchronous calls are being made to the API (curse, tukui, wowinterface). I suggest a setting that caps/throttles the number of connections.

I do not think this value needs to be exposed in the config file / settings view as most users will probably see it as a way to "optimize" their performance and not consider the API. But if we do expose it, it should only allow a range of sensible values.

For reference, a typical value used by browsers is 6 per server.

See Firefox about.config setting: network.http.max-persistent-connections-per-server

Refresh

As a user, I want to be able to manually trigger a refresh of the list displaying my currently installed addons.

When the list is refreshed it should show the current state of the addons in the Interface folder and the latest versions of the addon that are available online.

Pseudo code:

  • Read Interface folder path from config.
    • If path not set in config execute Set path (work done in separate issue).
  • Execute Parse Interface folder (work done in separate issue).
  • Display addons that should be shown in scrollable list.
  • Execute Compare AddOns (work done in separate issue).
  • Enable Update button for items in list where newer version is available.
  • Enable Update All button if at least one addon has a newer version available.

UI artifact in Settings menu

Describe the bug
In the latest Ajour release (version 0.2.5) there is a tiny UI artifact in the Settings menu. The left side of the bottom edge of the menu is 1 pixel higher than the right side.

To Reproduce

  1. Open the Settings menu
  2. See UI artifact at bottom edge of menu.

Expected behavior
A straight border.

Screenshots
uiartifact

Desktop (please complete the following information):

  • OS: Windows 10
  • Version: 0.2.5

Additional context
Persists across themes, with/without installed addons and with/without ignored addons.

List of addons not completely sorted

The addon list looks sorted alphabetically (good), but there are some exceptions leading me to think it might not be sorted by the title as it is displayed, but as it is listed in the toc file.

See attached examples.
abc1
abc2

Error messages replace the number of addons text

Error and status messages replace the text in the field displaying the number of addons. Refreshing the list does not re-add the number of addons to that field.

Possible fix:
Use separate fields to show number of addons and status/error messages.

Add Ajour as a Cask to Homebrew

Homebrew Cask extends Homebrew and brings its elegance, simplicity, and speed to the installation and management of GUI macOS applications.

Homebrew (and Cask) is the most used package manager for macOS, and I believe it would make sense to add Ajour.
There is a little work to get us going, but they have a great README which guides us through the progress step by step.

Set Path

As a user I want to be able to specify the path to my Interface folder.

In the Settings menu, there should be an option to specify a path.

  • Display input field to user (or allow user to navigate to folder)
  • Write user specified path to config file
  • Return to app main window

Clicking "Refresh" during refresh operation crashes app

If the user clicks "Refresh" during an already running refresh operation, the app shuts down.

And a related issue:
If the user clicks "Update All" during an already running refresh operation, the app will start updating those addons with available updates, while the refresh operation is adding more to the list. This results in a list containing addons that still require updates.

Possible fix:
To address both issues I suggest disabling the buttons until the "Refresh" operation has ended.

Ability to force an update

As a user I would like to be able to trigger an update, despite there not being a newer version available.

Use cases:

  • User messed with the addon files and want to restore them to mint condition
  • Ajour has looked at the remote version and decided no update is available, but this might be due to obscure versioning

Proposed solution:
In the details view of an addon, add a "Force Update" button.
The button should only be available if Ajour has detected a remote version.
Clicking it should update the addon including its dependencies the same way a normal update is handled.

Add icon to Windows executable

Ajour only displays an icon on the executable. However, start-menu and the application border does not have an icon.
This is dependent on iced-rs/iced#285. Currently awaiting a new release of iced so the API is available.

ajour-no-icon

  • Executable icon 777f628
  • Status bar icon
  • Start bar icon

What to do UI wise when we successfully update an Addon

When an addon has been updated I am currently taking the remote_version and replacing it with the version. This can be found here: https://github.com/casperstorm/ajour/blob/master/src/gui/update.rs#L237-L238.

This was intended to be a quick fix so that, visually, you would see the "version" updated instead of just seeing "Completed!" but version stayed the same. I would like to avoid refreshing and re-parsing all addons but on the other hand not happy with this solution because remote version could be Rematch-v.121.zip, eg.

Any ideas? You can see it in action in the below .gif.

addons-complete-ui

Invalid Zip archive: Could not find central directory end

I have Questie v6.0.4 installed and I wanted to update it to the last version v6.0.5, but its ajour is downloading some botched zip that cannot be open, when I do it from the curseforge website manualy opening the zip works.

Error is "Invalid Zip archive: Could not find central directory end".

Every other addon I had updated succesfully, so maybe something wrong with the curseforge api?

App doesn't show any addon in the list

Hello.
I don't sure if this app is ready-to-use, but I can't get it working :(
After setting path to WoW folder nothing appears in the list of addons.

Steps (on Windows 10):

  1. Download latest release.
  2. Launch app (even as administator), set path to WoW dir.
  3. I have many addons installed, but list in the app is empty.

Maybe this app writes a log somewhere?

Group addons with updates at top of list

It's not ideal having to scroll through a long list to look for updates. The UX could benefit from grouping addons that have updates at the top of the list when a refresh finishes. Preferably before the user is able to interact with the list.

Support light theme

This is a low priority task, but it would be easy to extend the curent ColorPalette to support a light theme:

https://github.com/casperstorm/ajour/blob/d765c4675797c09bbac5af7e70c51b78f7edd991/src/gui/style.rs#L12-L23

An example of light theme colors could be: https://coolors.co/6100ee-00dac6-000000-f5f5f5-af0120-ffffff:

ColorPalette::Primary => Color::from_rgb(0.39, 0.0, 0.93),
ColorPalette::Secondary => Color::from_rgb(0.0, 0.85, 0.77),
ColorPalette::Surface => Color::from_rgb(0.96, 0.96, 0.96),
ColorPalette::OnSurface => Color::from_rgb(0.0, 0.0, 0.0),
ColorPalette::Background => Color::from_rgb(1.0, 1.0, 1.0),
ColorPalette::Error => Color::from_rgb(0.68, 0.0, 0.12),

Essentially the value should be saved to the Config and changeable though Settings.

Screenshot 2020-08-31 at 21 50 33

Addons with strange update behaviour

I apologize in advance for this "bucket"-style issue.

4 of the 99 addons I have tested show weird matches (remote versions) or remain update-able after an update which could indicate a bug in Ajour's match algorithm.

  • AddOnSkins - Local 4.44, Remote: 4.43. Offered to update. I updated it to 4.43 (downgrade but now same as remote), but it still offers to update again.
  • Altoholic - After updating, local: 837036, remote: 8.3.036. Resulting in addon still being updatable.
  • Gladius - Detects wrong remote version using text search, resulting in Update downgrading to WoD version which breaks future updates.
  • Plater - Detects shadowlands beta remote version using text search. Updating does not result in addon appearing as up to date.

I have attached the version of the addons that I've been using for my test.
Plater-Plater-v8.3.0.305-Retail.zip
AddOnSkins-4.44.zip
Altoholic+v8.3.001.zip
Gladius+6.2.1.zip

Addons without versions in toc files

So right now we dependent on addons having a ## Version: x.x.x in their .toc file. And example from BigWigs:

## Interface: 80300
## Title: BigWigs
## Notes: Modular, lightweight, non-intrusive approach to boss encounter warnings.
## Version: v184.4

However a few addons does not have any version, meaning they won't appear in Ajour. An example is Details!:

## Interface: 80300
## Title: Details! Damage Meter
## Notes: Essential tool to impress that chick in your raid.
## SavedVariables: _detalhes_global
## SavedVariablesPerCharacter: _detalhes_database
## OptionalDeps: Ace3, LibSharedMedia-3.0, LibWindow-1.1, LibDBIcon-1.0, NickTag-1.0, LibDataBroker-1.1, LibItemUpgradeInfo-1.0, LibGroupInSpecT-1.1, LibCompress, LibGraph-2.0
#@no-lib-strip@
Libs\libs.xml
#@end-no-lib-strip@

However, while investigating this specific issue I found that Details! actually has it's version written in one of its library toc files. So we could make some logic were we handle speciale cases like this, with a proper failure plan if something goes on.

Linux: selected directory ending with \n

When I select dir from button "Select directory" the selected path end with newline and the addons directory cannot be found.
Had to do ugly workaround to get it working:

async fn open_directory() -> Option<PathBuf> {
    // Should we use task::spawn_blocking here?
    // TODO: We should maybe make sure we can't spawn multiple windows here.
    let dialog = OpenSingleDir { dir: None };
    dialog.show().unwrap().and_then(|f| Some(PathBuf::from(&f.as_path().display().to_string().replace("\n", ""))))
}

Trim leading and trailing spaces in addon info

Describe the bug
_DevPad
DevPad is not a popular addon, but just in case.

To Reproduce
Install an addon with some thing like ## Title:・・・・・・・_|cffCCCC88DevPad|r in .toc file, where is space.

Expected behavior
Addon name to be shown without spaces.

Desktop (please complete the following information):
Windows 10
Ajour 0.2.5

Improve speed when fetching addon details

When fetching details for the top 99 most popular addons it takes between 10 to 30 seconds, and often it will also freeze the application briefly. This is likely due to the fact that for each addon we are doing a GET request, and it is happening in parallel.

We can't, for now, avoid making a request per addon, but we could improve the experience.

Check for Ajour update

As a user, I would like to know when a new version of Ajour is available.

Suggested solution:
When the app is launched, check if its version matches the one tagged "Latest release" on github. If it does not match: display a "New version available!" clickable button/text, left of the version in the UI.

If the user clicks the button, open https://github.com/casperstorm/ajour/releases/latest in the default browser.

Optional: Add option to disable this check in settings.

Parse Interface folder

In order to display a list of addons in the GUI, the Interface folder must first be parsed and data structure constructed from the contents of the AddOn .toc files.

Pseudo code:

  • Read Interface path from config
  • Create data structure by reading the relevant .toc properties
  • Determine whether an AddOn should be shown or not (It should probably be shown if it hasVersion property)
  • Sanitize AddOn title (remove web color)

Add additional info to Addon Details view

Is your feature request related to a problem? Please describe.
As a user, I would like to see more details regarding an addon in the "Details" view. Currently, only a short description is displayed.

Describe the solution you'd like
Suggestions:

  • Author
  • Link to addon website
  • A fuller description than the one currently displayed (but truncated with link to full text (same as above) if too long)
  • Release date of latest available release
  • Changelog for latest available release

Windows installer enhancements

This is a collection of enhancements for the Windows installer.

Right now we are using default wix settings in order to generate the .msi installer for Windows: https://github.com/volks73/cargo-wix.

  • Wizard is not branded with Ajour graphic.
  • "Custom Setup" gives the opportunity to select which components to install. Maybe this is unnecessary complex.
  • "Unknown publisher" – we should look into signing it.
  • Maybe, if possible, a pre-checked checkbox to automatically launch Ajour after installation.
  • Option to create shortcuts to the startmenu and desktop.

Compare AddOns

In order to determine whether the Update button next to a specific addon or the Update All button should be enabled, we must determine whether a newer version of an addon is available online.

Pseudo code:

  • For each addon
    • Look up addon title online
    • Compare version numbers
    • If newer version is available
      • Write new version number to Latest version property in data structure for that addon
      • Write URL to download of new version in data structure for that addon

Launch

As a User I want to be able to launch the app.

When the app is launched it should display a GUI with a list of currently installed addons, their version and the latest version available online.

Pseudo code:

  • Display GUI.
    • Update All, Refresh, Settings buttons.
    • Scrollable list.
  • Execute Refresh.

Calculating hash as a way to determine version

Hello.

I guess it is really difficult to determine version of addons on third-party websites, so thank you for your hard work.

As a 'last solution', could you consider using any hash algoritm? Something like option "Use hashing algoritm to determine addon version". It straitforward way to handle cases like Easy Scrap - two different versions of this addon have the same Version tag in .toc file. I think you just have not time to ask every addon author to keep information actual.

There is a problem in hash calculation - you need to download the latest file, unzip it and then do hashing on folder(s). It may be network- (and sometimes CPU-) intensive, but it worth its purpose.

Updating addons and status reverts to "update" after I refresh

Hello,
Thank you for this great contribution. I've been looking for a good open source alternative to Twitch for a long time, and now seem to finally have found one.

I'm encountering an issue where the app tells me that certain apps need an update. After I update said addons trough the app, the status reverts to "update" after I refresh or close the app and open it again. Any ideas what might cause the problem? I does seem like the addons are getting updated, just not the status in the app.

Update

As a User, I want to be able to manually trigger an update of an installed addon, where a newer version is available online.

Clicking the Update button should replace the addon, and all the addons that is related to it via dependencies, leaving the SavedVariables intact.

Pseudo code:

  • User clicks the Update button
  • Download addon zip from link in the data structure
  • Extract to temp storage
  • Sanity Check: Verify that at least one folder in the extracted data contains a toc file with the same title as the AddOn being updated
  • Refresh data structure by executing Parse Interface folder.
  • From data structure, determine addons with dependencies to the addon being updated.
  • (Optionally) Present the user with list of dependent addons and allow the user to cancel the update.
  • Execute Delete AddOn on addon being updated.
  • Copy folders from temp storage to Interface folder.
  • Refresh data structure by executing Parse Interface folder (to make sure new addon is parsed).
  • Delete temp storage.

Handle addon "bundles" as single addon

Background:
By analyzing addon dependencies Ajour already attempts to hide "sub" addons from the list so that only 1 entry is shown per downloaded addon.

But some downloads act more like an addon "bundle", since they don't share dependencies internally, but they all have the same Curse and/or WoWInterface ID.

This means that updating one, will result in an update of all of them. And so if they have separate entries in the list an "Update All" operation will attempt to update the entire set of bundled addons many times over.

The only examples exhibiting this behavior that I know of are Deadly Boss Mods "expansions":
DBM-BrokenIsles-r20.zip
DBM-Draenor-r51.zip
DBM-DragonSoul-r209.zip
DBM-Icecrown-r295.zip
DBM-Outlands-r674.zip
DBM-Pandaria-r137.zip
DBM-Party-BC-r18.zip

Proposed new feature:
Option A)
For addons where is_parent is true, that have an X-Curse-Project-ID (or X-WoWI-ID) , group them by the value of that ID so that only 1 entry is shown in the list for each group.

Updating that entry should replace all the addons in the group (once).
Deleting that entry should delete all the addons in the group (once).

Deciding on a name for the entry will be a challenge. I don't have a good solution for that.

Option B)
Keep the separate entries for each addon in the "bundle", but implement logic to ensure that an "Update All" operation will only replace the files of each addon once. This doesn't shorten the length of the list displayed in Ajour, but is potentially a much simpler solution to the problem of multiple async updates replacing the same files.

README: Linux install

You can install ajour with cargo install ajour --git https://github.com/casperstorm/ajour.git if you have cargo and compile dependencies installed.
Would be great to publish the crate to crates.io, then you can ommit the --git part.

Ensure build is passing

Build should (always) be passing on master.
Currently this requires that cargo fmt and cargo clippy is happy.

Update All

As a User, I want to be able to manually trigger an update of all installed addons, where a newer version is available online.

Clicking the Update All button should replace the updated addons, and all the addons that are related to them via dependencies, leaving the SavedVariables intact.

Pseudo code:

  • Run "Update" code flow for each AddOn where an update is available

Addons shown that should be hidden

Ajour attempts to present a list of addons with exactly 1 entry per downloaded addon. This means some filtering needs to take place in order to hide "sub addons" that only function as library/helper addons.

Today Ajour decides which addons should be shown in the list based on whether or not the toc file contains a row with: "## Version:"

This is a good first approximation, however...

A few addon authors don't have a Version line in their toc file, resulting in rare false negatives. Eg. Details!, Kui Nameplates, NameplateCooldowns and WorldQuestTracker.

Worse still is that many more addons have Version lines in the toc files of their library/helper addons, resulting in many false positives. Eg. Healbot, NeatPlates, Altoholic, SilverDragon, AtlasLoot, Grid2, TitanPanel and WeakAuras.

To address this last issue I propose a second rule to filter additional addons:
If an addon has a version, only show it if none of its linked addons have titles that are substrings of its own title.

Eg. don't show AtlasLoot_Cataclysm because it's linked to AtlasLoot which is a substring of AtlasLoot_Cataclysm.

It's not a perfect fix, since it will hide some addons that are separate downloads (eg. DBM-BrokenIsles), but the resulting list should be much closer to a 1-1 match.

Ability to edit config via a Settings menu

As a user I would like to be able to see the content of the configuration file and be able to edit it via the application. Preferably in a way that guards against user error.

For this feature I imagine the following tasks:

  • A "Settings" button where the client version is currently displayed.
  • A Settings view underneath Update All / Refresh / Settings buttons, bumping the addon list to make room for it.
  • Ability to display settings based on content of ajour.yml.
  • Ability to save settings made in Settings view back to ajour.yml.
  • Ability to specify WoW directory path (path selector if possible, otherwise input field with "apply" button that validates the path exists before saving to ajour.yml).
  • WoW game flavor (dropdown list only containing valid flavors).
  • List of addons that have been hidden by the user.
  • A "Show" button for each hidden addon* (pressing "Show" will reset its "is_hidden" property and re-add it to the main list assuming it would otherwise be displayed there)
  • Re-clicking the Settings button should close the Settings view. Similar to how the Details view is closed.

* This assumes addons can be hidden which is handled by #43. That feature currently requires manually editing the config to hide addons.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.