Chyba #931
otevřenýNové UI pro nastavení
0%
Popis
Analýza¶
Systémové nastavení začíná poměrně bobtnat, což jej značně znepřehledňuje,
a je proto nutné udělat nové uživatelské rozhraní, které bude:
- zvládat velké množství konfiguračních stránek,
- usnadňovat navigaci (ikony, vyhledávání dle názvu konfigurace apod.),
- podporovat rozšiřitelnost konfigurace různými moduly (#921).
Návrh¶
Myslím, že nemá vymýšlet nic nového, ale inspirovat se fungujícími systémy.
V GNOME je to IMHO velmi povedené.
Oproti současnému stavu by tedy přibyly kategorie konfiguračních stránek,
podobné aktuálním záložkám ale víc obecné (např. Systém, Uživatelé, Síť, ...),
vyhledávání a velké ikony.
Samotné současné formuláře by prozatím zůstali (do úplné modularizace),
jen by na ně vedly odkazy z úvodní ("ikonové") stránky konfigurace.
Implementace¶
Je nutné modulární řešení, a proto budou zavedeny třídy CofigurationPage
(konfigurační stránka), ConfigurationCategory a ConfigurationManager.
Základní návrh rozhraní a třídy¶
Spousta věcí může chybět - dělám to z hlavy...
class CofigurationPage {
/**
* Relative path to settings page.
* @return string
*/
public function getPath();
/**
* Translated title for menu in main configuration page.
* @return string
*/
public function getMenuTitle();
/**
* Icon for menu in main configuration page.
* @return string
*/
public function getMenuIcon();
/**
* List of configuration options that are contained in this
* page. It is commonly used for searching of available
* configuration options (see it at action in Chromium).
* @return array array of options names (strings)
* in future it may maybe contain also anchor
* to specific position in configuration page
* where option may be found.
*/
public function getContainedConfigurations();
}
class CofigurationCategory {
/**
* Name of category for main configuration page that is translatable.
* @return string
*/
public function getName();
/**
* Adds a page to category.
* @param IConfigurationPage $page
*/
public function addPage(ConfigurationPage $page);
/**
* Gets all pages in category.
* @return array
*/
public function getPages();
}
class ConfigurationManager {
private $categories = array();
public function putCategory($categoryName) {
if (!array_key_exists($categoryName, $categories)) {
$categories[$categoryName] = new ConfigurationCategory($categoryName);
}
return $categories[$categoryName];
}
public function getCategories() {return $this->categories; }
/**
* Finds the most relevant configuration page to given needle
* string. Searching is made through configuration pages
* of all categories.
* Searching is made on names of pages and then if nothing
* founded also on contained configuration of each page.
* @return array of ConfigurationPage
*/
public function search($needle);
}
Interakce tříd¶
// global object
$cm = new ConfigurationManager();
// module QoS
$cm->putCategory('Network')->addPage(new ConfigurationPage(
'qos', 'QoS', 'qos-icon.png', array('QoS ceil', 'QoS rate', 'QoS server')
));
// module monitoring
$cm->putCategory('Network')->addPage(new ConfigurationPage(
'monitoring', 'Monitoring', 'monitoring.png', array('Monitoring server', 'Info mailbox')
));
// A long time after, in a galaxy far, far away....
render($cm);
Související úkoly 1 (1 otevřený — 0 uzavřených)
Aktualizováno uživatelem Ondřej Fibich před více než 9 roky(ů)
- související s Požadavek #921: Modularita přidán