User Tools

Site Tools


ui_extension:ui_extension

This is an old revision of the document!


UI Extensions

Introduction

A UI Extension generally refers to a component that implements the ui_extension API. They are also commonly refered to as panels.

The UI Extension API an API that allows a component (a UI Extension Host) to insert a window created by another component (UI Extension) into one of its windows as a child window. UI Extensions come in two forms: multiple instance extensions, of which allow hosts to make as many instances of its window as they want. Single instance windows only have one instance of its window created at any one time.

Developer resources

Prerequistes for developing UI Extension aware components

In order to create UI Extension aware components, you will need:

The foobar2000 SDK

The foobar200 SDK can be downloaded from the foobar2000 homepage.

The UI Extension SDK

The UI Extension SDK can be downloaded from its webpage.

Microsoft Visual C++

Information on Visual C++ can be found from its homepage.

The optimising Microsoft Visual C++ 2003 (7.1) is currently the prefered compiler because of its better support for templating. Microsoft Visual C++ 6.0 will also work.

The Microsoft Visual C++ 2003 compiler is freely available in the Visual C++ 2003 toolkit, and so are some .libs not included with the toolkit (namely msvcrt.lib) with the .NET Framework SDK 1.1. You can use these to set up the MSVC7.1 compiler with the MSVC6 IDE if you wish. Be warned though, the MSVC6 debugger is not compatible with the MSVC7.1 compiler's pdb files. Alternate freely available debuggers you can use are the Debugging Tools for Windows, or Microsoft Visual C++ 2005 Express. Also, be warned of this bug in the current version of the MSVC7.1 compiler.

Platform SDK

Not usually required, but highly recommended is the current Microsoft Platform SDK.

Developing UI Extension aware components

If you are unaware of how to set up the foobar2000 SDK, and create foobar2000 components, please read the foobar2000 FAQ first. Reading the plugin development tutorial is also worthwhile.

You should extract the UI Extension archive to the foobar2000\ui_extension sub-directory of your SDK root folder. You should then proceed to insert the ui_extension project into your workspace, and add it as a dependency of your project.

You should include the header “../ui_extension_with_helpers.h” as appropriate in your code.

UI Extension hosts must implement the ui_extension_host interface, whilst panels should implement the ui_extension interface.

View doxygen generated documentation of the interfaces

Some example components you can look at are:
Album list panel
ASCII playback buttons
History
Simple spectrum panel
Track info panel
Static control panel
Extended search panel

UI Extension lifecycle (for UI Extension 6)

Multiple-instance extensions

Info retrieiving functions:

  • get_name()
  • get_category()
  • get_short_name()
  • get_description()
  • get_type()
  • get_prefer_multiple_instances()
  • get_is_single_instance()
  • get_extension_guid()

Config functions:

  • have_config_popup()
  • show_config_popup()

In-use functions:

  • build_menu()
  • menu_action()
  • get_menu_action_description()
  • get_wnd()
  • create_or_transfer_window()
  • config functions
  • get_config()

Typical info retreiving lifecycle:

  • class created
  • one or more info retreiving functions called
  • class destroyed

Typical config lifecycle:

  • class created
  • one or more info retreiving functions called
  • set_config()
  • have_config_popup()
  • show_config_popup()
  • get_config()
  • class destroyed

Typical usage lifecycle:

  • class created
  • get_extension_guid() called
  • is_available() called
  • set_config() called
  • create_or_transfer_window() called
  • in-use functions called
  • destroy_window() called
  • class destroyed

Known shortcomings in UI Extension API version 5

  • ui_extension_host::override_status_text, ui_extension_host::restore_status_text have no HWND parameter. This hinders the functionality of panel-hosts.
  • No method to retrieve whether a component supports multiple instances or not.
  • A method to create a configuration dialog for a ui_extension instance may be useful.

Plans for UI Extension 6

  • Rename TYPE_LAYOUT to TYPE_SPLITTER
  • Add a subclass for splitter panels
  • Add methods for displaying a configuration dialog for UI Extensions
  • ui_extension_host API will no longer be single instance only
  • Implement methods in ui_extension_factory to retrieve whether extension is single or multiple instance
  • Add HWND parameters to ui_extension_host::override_status_text and ui_extension_host::restore_status_text functions
What will become of the tabbed panel stack which currently uses the TYPE_LAYOUT flag IIRC? The name “splitter” doesn't seem to fit there, perhaps the flag should be renamed to TYPE_CONTAINER instead.
foosion 2005/03/16 21:34
Hmm I just thought it fitted in more with the splitter subclass, which I would expect the tabbed panel stack to implement so that you can switch from the splitter types buit into columns ui to the panel stack without loosing config. But the built in splitters are not implemented as ui extensions, so I'll use which ever name you and Phi think makes the most sense in regard to the general scope of ui extensions in this category. — musicmusic 2005/03/16 21:38
ui_extension/ui_extension.1111915113.txt.gz · Last modified: 2007/08/25 22:58 (external edit)