diff options
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp | 192 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/ikwsopts.h | 8 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui | 449 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp | 52 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/searchprovider.h | 27 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp | 18 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h | 3 | ||||
| -rw-r--r-- | kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui | 29 |
8 files changed, 534 insertions, 244 deletions
diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp index 622cec32c..f5e15b6ad 100644 --- a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp +++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.cpp @@ -49,6 +49,30 @@ #include "searchproviderdlg.h" +class CategoryItem : public TQListViewItem +{ + public: + CategoryItem(TQListView *parent, TQString category) + : TQListViewItem(parent), m_category(category) + { + if (category.isNull()) + m_category = "Misc"; + + setText(0, displayName()); + } + + const TQString& key() const { return m_category; } + + const TQString& displayName() const + { + return SearchProvider::searchCategoryName(m_category); + } + + private: + TQString m_category; +}; + + class SearchProviderItem : public TQCheckListItem { public: @@ -84,7 +108,7 @@ FilterOptions::FilterOptions(TDEInstance *instance, TQWidget *parent, const char m_dlg = new FilterOptionsUI (this); mainLayout->addWidget(m_dlg); - m_dlg->lvSearchProviders->header()->setLabel(0, SmallIconSet("bookmark"),i18n("Name")); + m_dlg->lvSearchProviders->header()->setLabel(0, SmallIconSet("bookmark"), i18n("Name")); m_dlg->lvSearchProviders->setSorting(0); // Load the options @@ -123,7 +147,7 @@ void FilterOptions::load( bool useDefaults ) TQString defaultSearchEngine = config.readEntry("DefaultSearchEngine"); m_favoriteEngines.clear(); - m_favoriteEngines << "google" << "google_groups" << "google_news" << "webster" << "dmoz" << "wikipedia"; + m_favoriteEngines << "duckduckgo" << "wikipedia_en"; m_favoriteEngines = config.readListEntry("FavoriteSearchEngines", m_favoriteEngines); const TDETrader::OfferList services = TDETrader::self()->query("SearchProvider"); @@ -151,6 +175,8 @@ void FilterOptions::load( bool useDefaults ) TQ_SLOT(setWebShortcutState())); connect(m_dlg->cbEnableShortcuts, TQ_SIGNAL(clicked()), this, TQ_SLOT(configChanged())); + connect(m_dlg->cbCategories, TQ_SIGNAL(toggled(bool)), this, + TQ_SLOT(setCategoriesShown(bool))); connect(m_dlg->lvSearchProviders, TQ_SIGNAL(selectionChanged(TQListViewItem *)), this, TQ_SLOT(updateSearchProvider())); @@ -166,6 +192,10 @@ void FilterOptions::load( bool useDefaults ) this, TQ_SLOT(checkFavoritesChanged())); connect(m_dlg->lvSearchProviders, TQ_SIGNAL(clicked(TQListViewItem *)), this, TQ_SLOT(checkFavoritesChanged())); + connect(m_dlg->lvSearchProviders, TQ_SIGNAL(expanded(TQListViewItem *)), + this, TQ_SLOT(adjustColumns())); + connect(m_dlg->lvSearchProviders, TQ_SIGNAL(collapsed(TQListViewItem *)), + this, TQ_SLOT(adjustColumns())); connect(m_dlg->cmbDefaultEngine, TQ_SIGNAL(activated(const TQString &)), this, @@ -177,6 +207,8 @@ void FilterOptions::load( bool useDefaults ) connect(m_dlg->pbChange, TQ_SIGNAL(clicked()), this, TQ_SLOT(changeSearchProvider())); connect(m_dlg->pbDelete, TQ_SIGNAL(clicked()), this, TQ_SLOT(deleteSearchProvider())); + adjustColumns(); + updateSearchProvider(); emit changed( useDefaults ); } @@ -230,8 +262,7 @@ void FilterOptions::save() for (TQListViewItemIterator it(m_dlg->lvSearchProviders); it.current(); ++it) { SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(it.current()); - - Q_ASSERT(item); + if (!item) continue; SearchProvider *provider = item->provider(); @@ -281,6 +312,7 @@ void FilterOptions::save() service.writeEntry("Name", provider->name()); service.writeEntry("Query", provider->query(), true, false, true); service.writeEntry("Keys", provider->keys()); + service.writeEntry("Category", provider->category()); service.writeEntry("Charset", provider->charset()); // we might be overwriting a hidden entry @@ -342,8 +374,7 @@ void FilterOptions::checkFavoritesChanged() for (TQListViewItemIterator it(m_dlg->lvSearchProviders); it.current(); ++it) { SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(it.current()); - - Q_ASSERT(item); + if (!item) continue; if (item->isOn()) currentFavoriteEngines << item->provider()->desktopEntryName(); @@ -368,26 +399,138 @@ void FilterOptions::setWebShortcutState() m_dlg->cmbDefaultEngine->setEnabled (use_keywords); } +void FilterOptions::adjustColumns() +{ + m_dlg->lvSearchProviders->adjustColumn(1); + m_dlg->lvSearchProviders->adjustColumn(2); +} + +void FilterOptions::setCategoriesShown(bool shown) +{ + if (shown) + { + m_dlg->lvSearchProviders->removeColumn(2); + } + else + { + m_dlg->lvSearchProviders->addColumn(i18n("Category")); + adjustColumns(); + } + + // Move search provider items between the list root and the appropriate + // category items. + TQListViewItemIterator it(m_dlg->lvSearchProviders); + while (it.current()) + { + SearchProviderItem *sp = dynamic_cast<SearchProviderItem*>(it.current()); + ++it; + + if (!sp) continue; + + TQString category = sp->provider()->category(); + + if (shown) + { + if (sp->depth() > 0) continue; + + if (!m_categories.contains(category)) + { + m_categories[category] = new CategoryItem(m_dlg->lvSearchProviders, category); + } + + m_dlg->lvSearchProviders->takeItem(sp); + m_categories[category]->insertItem(sp); + } + else + { + if (sp->depth() < 1) continue; + + sp->parent()->takeItem(sp); + m_dlg->lvSearchProviders->insertItem(sp); + + sp->setText(2, category); + } + } + + // Delete category items if no longer needed + if (!shown) + { + TQListViewItem *item = m_dlg->lvSearchProviders->firstChild(); + TQListViewItem *next; + do + { + next = item->nextSibling(); + if (dynamic_cast<CategoryItem *>(item)) + delete item; + } + while (item = next); + m_categories.clear(); + } + + m_dlg->lvSearchProviders->adjustColumn(0); + m_dlg->lvSearchProviders->setTreeStepSize(shown ? 20 : 0); + m_dlg->lvSearchProviders->sort(); +} + +const TQString& FilterOptions::getCurrentCategory() +{ + TQListViewItem *item = m_dlg->lvSearchProviders->currentItem(); + if (!item) return TQString::null; + + CategoryItem *cat = dynamic_cast<CategoryItem*>(item); + if (cat) return cat->key(); + + SearchProviderItem *sp = dynamic_cast<SearchProviderItem*>(item); + if (sp) return sp->provider()->category(); + + return TQString::null; +} + void FilterOptions::addSearchProvider() { - SearchProviderDialog dlg(0, this); - if (dlg.exec()) - { - m_dlg->lvSearchProviders->setSelected(displaySearchProvider(dlg.provider()), true); - configChanged(); - } + SearchProviderDialog dlg(0, getCurrentCategory(), this); + if (dlg.exec()) + { + m_dlg->lvSearchProviders->setSelected(displaySearchProvider(dlg.provider()), true); + configChanged(); + } } void FilterOptions::changeSearchProvider() { SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(m_dlg->lvSearchProviders->currentItem()); - Q_ASSERT(item); + if (!item) return; - SearchProviderDialog dlg(item->provider(), this); + SearchProviderDialog dlg(item->provider(), item->provider()->category(), this); if (dlg.exec()) { m_dlg->lvSearchProviders->setSelected(displaySearchProvider(dlg.provider()), true); + + if (m_dlg->cbCategories->isChecked()) + { + // check if we need to move the item to another category + CategoryItem *category = static_cast<CategoryItem*>(item->parent()); + + if (category->key() != dlg.provider()->category()) + { + TQString c = dlg.provider()->category(); + if (!m_categories.contains(c)) + { + m_categories[c] = new CategoryItem(m_dlg->lvSearchProviders, c); + } + CategoryItem *newCategory = m_categories[c]; + + category->takeItem(item); + newCategory->insertItem(item); + + if (category->childCount() < 1) + { + delete category; + } + } + } + configChanged(); } } @@ -395,7 +538,7 @@ void FilterOptions::changeSearchProvider() void FilterOptions::deleteSearchProvider() { SearchProviderItem *item = dynamic_cast<SearchProviderItem *>(m_dlg->lvSearchProviders->currentItem()); - Q_ASSERT(item); + if (!item) return; // Update the combo box to go to None if the fallback was deleted. int current = m_dlg->cmbDefaultEngine->currentItem(); @@ -428,14 +571,15 @@ void FilterOptions::deleteSearchProvider() void FilterOptions::updateSearchProvider() { - m_dlg->pbChange->setEnabled(m_dlg->lvSearchProviders->currentItem()); - m_dlg->pbDelete->setEnabled(m_dlg->lvSearchProviders->currentItem()); + SearchProviderItem *item = dynamic_cast<SearchProviderItem*>(m_dlg->lvSearchProviders->currentItem()); + m_dlg->pbChange->setEnabled(item); + m_dlg->pbDelete->setEnabled(item); } SearchProviderItem *FilterOptions::displaySearchProvider(SearchProvider *p, bool fallback) { // Show the provider in the list. - SearchProviderItem *item = 0L; + SearchProviderItem *item = nullptr; TQListViewItemIterator it(m_dlg->lvSearchProviders); @@ -444,7 +588,6 @@ SearchProviderItem *FilterOptions::displaySearchProvider(SearchProvider *p, bool if (it.current()->text(0) == p->name()) { item = dynamic_cast<SearchProviderItem *>(it.current()); - Q_ASSERT(item); break; } } @@ -459,6 +602,17 @@ SearchProviderItem *FilterOptions::displaySearchProvider(SearchProvider *p, bool item = new SearchProviderItem(m_dlg->lvSearchProviders, p); + if (m_dlg->cbCategories->isChecked()) + { + if (!m_categories.contains(p->category())) + { + m_categories[p->category()] = new CategoryItem(m_dlg->lvSearchProviders, p->category()); + } + + m_dlg->lvSearchProviders->takeItem(item); + m_categories[p->category()]->insertItem(item); + } + if (m_favoriteEngines.find(p->desktopEntryName())!=m_favoriteEngines.end()) item->setOn(true); diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h index 661a3abb0..1304ce8ae 100644 --- a/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h +++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts.h @@ -29,6 +29,7 @@ class FilterOptionsUI; class SearchProvider; class SearchProviderItem; +class CategoryItem; class FilterOptions : public TDECModule { @@ -43,11 +44,17 @@ public: void defaults(); TQString quickHelp() const; +protected: + const TQString& getCurrentCategory(); + protected slots: void configChanged(); void checkFavoritesChanged(); void setWebShortcutState(); + void setCategoriesShown(bool shown); + + void adjustColumns(); void addSearchProvider(); void changeSearchProvider(); @@ -64,6 +71,7 @@ private: // these are marked as deleted in the user's homedirectory // on save if a global service file exists for it. TQStringList m_deletedProviders; + TQMap <TQString, CategoryItem*> m_categories; TQMap <TQString, TQString> m_defaultEngineMap; TQStringList m_favoriteEngines; diff --git a/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui b/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui index 3c5fd2e3b..c4ee4f3da 100644 --- a/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui +++ b/kcontrol/ebrowsing/plugins/ikws/ikwsopts_ui.ui @@ -1,4 +1,4 @@ -<!DOCTYPE UI><UI version="3.2" stdsetdef="1"> +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> <class>FilterOptionsUI</class> <widget class="TQWidget"> <property name="name"> @@ -8,18 +8,21 @@ <rect> <x>0</x> <y>0</y> - <width>360</width> - <height>327</height> + <width>371</width> + <height>355</height> </rect> </property> - <vbox> + <property name="caption"> + <string>FilterOptionsUI</string> + </property> + <grid> <property name="name"> <cstring>unnamed</cstring> </property> <property name="margin"> - <number>0</number> + <number>5</number> </property> - <widget class="TQCheckBox"> + <widget class="TQCheckBox" row="0" column="0" rowspan="1" colspan="3"> <property name="name"> <cstring>cbEnableShortcuts</cstring> </property> @@ -32,218 +35,241 @@ Enable shortcuts that allow you to quickly search for information on the web. Fo </qt></string> </property> </widget> - <widget class="TQLayoutWidget"> + <widget class="TQPushButton" row="2" column="2"> + <property name="name"> + <cstring>pbChange</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Chan&ge...</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Modify a search provider.</string> + </property> + </widget> + <widget class="TQPushButton" row="3" column="2"> + <property name="name"> + <cstring>pbDelete</cstring> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>De&lete</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Delete the selected search provider.</string> + </property> + </widget> + <widget class="TQPushButton" row="1" column="2"> + <property name="name"> + <cstring>pbNew</cstring> + </property> + <property name="text"> + <string>&New...</string> + </property> + <property name="whatsThis" stdset="0"> + <string>Add a search provider.</string> + </property> + </widget> + <widget class="TQCheckBox" row="5" column="0" rowspan="1" colspan="2"> <property name="name"> - <cstring>layout10</cstring> + <cstring>cbCategories</cstring> </property> - <grid> - <property name="name"> - <cstring>unnamed</cstring> + <property name="text"> + <string>Show grouped in &categories</string> + </property> + <property name="accel"> + <string>Alt+C</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string><qt> + If checked, the search providers will be shown grouped by category (Web Search, Images, etc.). Otherwise, all the engines are shown ungrouped in alphabetic order. + </qt></string> + </property> + </widget> + <spacer row="4" column="2"> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>21</width> + <height>150</height> + </size> + </property> + </spacer> + <widget class="Line" row="6" column="0" rowspan="1" colspan="3"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="KComboBox" row="7" column="1" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>None</string> </property> - <widget class="TQLabel" row="5" column="0"> - <property name="name"> - <cstring>lbDelimiter</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>&Keyword delimiter:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>cmbDelimiter</cstring> - </property> - <property name="whatsThis" stdset="0"> - <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string> - </property> - </widget> - <widget class="TQLabel" row="4" column="0"> - <property name="name"> - <cstring>lbDefaultEngine</cstring> - </property> - <property name="enabled"> - <bool>true</bool> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>0</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="text"> - <string>Default &search engine:</string> - </property> - <property name="buddy" stdset="0"> - <cstring>cmbDefaultEngine</cstring> - </property> - <property name="whatsThis" stdset="0"> - <string><qt> + </item> + <property name="name"> + <cstring>cmbDefaultEngine</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis" stdset="0"> + <string><qt> Select the search engine to use for input boxes that provide automatic lookup services when you type in normal words and phrases instead of a URL. To disable this feature select <b>None</b> from the list. </qt></string> - </property> - </widget> - <widget class="KComboBox" row="4" column="1"> - <item> - <property name="text"> - <string>None</string> - </property> - </item> - <property name="name"> - <cstring>cmbDefaultEngine</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="whatsThis" stdset="0"> - <string><qt> + </property> + </widget> + <widget class="TQLabel" row="7" column="0"> + <property name="name"> + <cstring>lbDefaultEngine</cstring> + </property> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>Default &search engine:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>cmbDefaultEngine</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string><qt> Select the search engine to use for input boxes that provide automatic lookup services when you type in normal words and phrases instead of a URL. To disable this feature select <b>None</b> from the list. </qt></string> - </property> - </widget> - <widget class="TQPushButton" row="1" column="2"> - <property name="name"> - <cstring>pbChange</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>Chan&ge...</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Modify a search provider.</string> - </property> - </widget> - <widget class="TQPushButton" row="2" column="2"> - <property name="name"> - <cstring>pbDelete</cstring> - </property> - <property name="enabled"> - <bool>false</bool> - </property> - <property name="text"> - <string>De&lete</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Delete the selected search provider.</string> - </property> - </widget> - <widget class="TQPushButton" row="0" column="2"> - <property name="name"> - <cstring>pbNew</cstring> - </property> - <property name="text"> - <string>&New...</string> - </property> - <property name="whatsThis" stdset="0"> - <string>Add a search provider.</string> - </property> - </widget> - <spacer row="3" column="2" rowspan="3" colspan="1"> - <property name="name"> - <cstring>spacer1</cstring> - </property> - <property name="orientation"> - <enum>Vertical</enum> - </property> - <property name="sizeType"> - <enum>Expanding</enum> - </property> - <property name="sizeHint"> - <size> - <width>21</width> - <height>170</height> - </size> - </property> - </spacer> - <widget class="TDEListView" row="0" column="0" rowspan="4" colspan="2"> - <column> - <property name="text"> - <string>Name</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizable"> - <bool>true</bool> - </property> - </column> - <column> - <property name="text"> - <string>Shortcuts</string> - </property> - <property name="clickable"> - <bool>true</bool> - </property> - <property name="resizable"> - <bool>true</bool> - </property> - </column> - <property name="name"> - <cstring>lvSearchProviders</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>5</vsizetype> - <horstretch>1</horstretch> - <verstretch>1</verstretch> - </sizepolicy> - </property> - <property name="showSortIndicator"> - <bool>true</bool> - </property> - <property name="resizeMode"> - <enum>AllColumns</enum> - </property> - <property name="treeStepSize"> - <number>0</number> - </property> - <property name="whatsThis" stdset="0"> - <string>List of search providers, their associated shortcuts and whether they shall be listed in menus.</string> - </property> - </widget> - <widget class="KComboBox" row="5" column="1"> - <item> - <property name="text"> - <string>Colon</string> - </property> - </item> - <item> - <property name="text"> - <string>Space</string> - </property> - </item> - <property name="name"> - <cstring>cmbDelimiter</cstring> - </property> - <property name="sizePolicy"> - <sizepolicy> - <hsizetype>5</hsizetype> - <vsizetype>0</vsizetype> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> - </property> - <property name="whatsThis" stdset="0"> - <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string> - </property> - </widget> - </grid> + </property> + </widget> + <widget class="TQLabel" row="8" column="0"> + <property name="name"> + <cstring>lbDelimiter</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>0</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="text"> + <string>&Keyword delimiter:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>cmbDelimiter</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string> + </property> </widget> - </vbox> + <widget class="KComboBox" row="8" column="1" rowspan="1" colspan="2"> + <item> + <property name="text"> + <string>Colon</string> + </property> + </item> + <item> + <property name="text"> + <string>Space</string> + </property> + </item> + <property name="name"> + <cstring>cmbDelimiter</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + <property name="whatsThis" stdset="0"> + <string>Choose the delimiter that separates the keyword from the phrase or word to be searched.</string> + </property> + </widget> + <widget class="TDEListView" row="1" column="0" rowspan="4" colspan="2"> + <column> + <property name="text"> + <string>Name</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>Shortcuts</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>lvSearchProviders</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>5</hsizetype> + <vsizetype>5</vsizetype> + <horstretch>1</horstretch> + <verstretch>1</verstretch> + </sizepolicy> + </property> + <property name="showSortIndicator"> + <bool>true</bool> + </property> + <property name="resizeMode"> + <enum>AllColumns</enum> + </property> + <property name="rootIsDecorated"> + <bool>true</bool> + </property> + <property name="whatsThis" stdset="0"> + <string>List of search providers, their associated shortcuts and whether they shall be listed in menus.</string> + </property> + </widget> + </grid> </widget> <tabstops> <tabstop>cbEnableShortcuts</tabstop> @@ -254,8 +280,9 @@ Select the search engine to use for input boxes that provide automatic lookup se <tabstop>cmbDefaultEngine</tabstop> <tabstop>cmbDelimiter</tabstop> </tabstops> -<layoutdefaults spacing="6" margin="11"/> <includes> <include location="global" impldecl="in implementation">kcombobox.h</include> + <include location="global" impldecl="in implementation">tdelistview.h</include> </includes> +<layoutdefaults spacing="6" margin="11"/> </UI> diff --git a/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp b/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp index f2cbdfc6f..eff7727ff 100644 --- a/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp +++ b/kcontrol/ebrowsing/plugins/ikws/searchprovider.cpp @@ -16,10 +16,13 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include <tdelocale.h> #include <ktrader.h> #include "searchprovider.h" +SearchCategoryMap SearchProvider::searchCategories; + SearchProvider::SearchProvider(const KService::Ptr service) : m_dirty(false) { @@ -28,6 +31,27 @@ SearchProvider::SearchProvider(const KService::Ptr service) m_query = service->property("Query").toString(); m_keys = service->property("Keys").toStringList(); m_charset = service->property("Charset").toString(); + m_category = service->property("Category", TQVariant::String).toString(); + + if (!searchCategories.count()) + { + initSearchCategories(); + } +} + +void SearchProvider::initSearchCategories() +{ + searchCategories["Web"] = i18n("Web Search"); + searchCategories["Dictionaries"] = i18n("Dictionaries"); + searchCategories["Images"] = i18n("Images"); + searchCategories["Music"] = i18n("Music"); + searchCategories["Video"] = i18n("Video"); + searchCategories["Software"] = i18n("Software"); + searchCategories["Movies"] = i18n("Movies"); + searchCategories["Development"] = i18n("Development"); + searchCategories["Academic"] = i18n("Academic"); + searchCategories["Maps"] = i18n("Maps"); + searchCategories["Misc"] = i18n("Miscellaneous"); } void SearchProvider::setName(const TQString &name) @@ -62,6 +86,15 @@ void SearchProvider::setCharset(const TQString &charset) m_dirty = true; } +void SearchProvider::setCategory(const TQString &category) +{ + if (m_category == category) + return; + + m_category = searchCategoryKey(category); + m_dirty = true; +} + SearchProvider *SearchProvider::findByDesktopName(const TQString &name) { KService::Ptr service = @@ -76,3 +109,22 @@ SearchProvider *SearchProvider::findByKey(const TQString &key) return providers.count() ? new SearchProvider(providers[0]) : 0; } +const TQString& SearchProvider::searchCategoryName(const TQString& category) +{ + auto it = searchCategories.find(category); + if (it != searchCategories.end()) + { + return it.data(); + } + return category; +} + +const TQString& SearchProvider::searchCategoryKey(const TQString& displayName) +{ + SearchCategoryMap::Iterator it; + for (it = searchCategories.begin(); it != searchCategories.end(); ++it) + { + if (it.data() == displayName) return it.key(); + } + return displayName; // user-defined key +}
\ No newline at end of file diff --git a/kcontrol/ebrowsing/plugins/ikws/searchprovider.h b/kcontrol/ebrowsing/plugins/ikws/searchprovider.h index 45309939c..895a4ba0c 100644 --- a/kcontrol/ebrowsing/plugins/ikws/searchprovider.h +++ b/kcontrol/ebrowsing/plugins/ikws/searchprovider.h @@ -21,33 +21,48 @@ #define __SEARCHPROVIDER_H___ #include <kservice.h> +#include <tqmap.h> -class SearchProvider +typedef TQMap<TQString, TQString> SearchCategoryMap; + +class SearchProvider { public: SearchProvider() : m_dirty(false) {}; SearchProvider(const KService::Ptr service); - const TQString &desktopEntryName() const { return m_desktopEntryName; } - const TQString &name() const { return m_name; } - const TQString &query() const { return m_query; } - const TQStringList &keys() const { return m_keys; } - const TQString &charset() const { return m_charset; } + const TQString& desktopEntryName() const { return m_desktopEntryName; } + const TQString& name() const { return m_name; } + const TQString& query() const { return m_query; } + const TQStringList& keys() const { return m_keys; } + const TQString& charset() const { return m_charset; } + const TQString& category() const { return m_category; } bool isDirty() const { return m_dirty; } void setName(const TQString &); void setQuery(const TQString &); void setKeys(const TQStringList &); void setCharset(const TQString &); + void setCategory(const TQString &); static SearchProvider *findByDesktopName(const TQString &); static SearchProvider *findByKey(const TQString &); + + static const TQString& searchCategoryName(const TQString& category); + static const TQString& searchCategoryKey(const TQString& displayName); + + static SearchCategoryMap searchCategories; + +private: + void initSearchCategories(); + private: TQString m_desktopEntryName; TQString m_name; TQString m_query; TQStringList m_keys; TQString m_charset; + TQString m_category; bool m_dirty; }; diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp index bf295462f..2af0aaa80 100644 --- a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp +++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.cpp @@ -33,17 +33,19 @@ #include "searchproviderdlg.h" #include "searchprovider.h" -SearchProviderDialog::SearchProviderDialog(SearchProvider *provider, +SearchProviderDialog::SearchProviderDialog(SearchProvider *provider, const TQString& category, TQWidget *parent, const char *name) - :KDialogBase(parent, name, true, TQString::null, Ok|Cancel), - m_provider(provider) + : KDialogBase(parent, name, true, TQString::null, Ok|Cancel), + m_provider(provider) { m_dlg = new SearchProviderDlgUI (this); setMainWidget(m_dlg); enableButtonSeparator(true); - m_dlg->leQuery->setMinimumWidth(tdeApp->fontMetrics().maxWidth() * 40); + m_dlg->leQuery->setMinimumWidth(tdeApp->fontMetrics().maxWidth() * 16); + m_dlg->cbCategory->setDuplicatesEnabled(false); + m_dlg->cbCategory->setEditable(true); connect(m_dlg->leName, TQ_SIGNAL(textChanged(const TQString &)), TQ_SLOT(slotChanged())); connect(m_dlg->leQuery, TQ_SIGNAL(textChanged(const TQString &)), TQ_SLOT(slotChanged())); @@ -54,12 +56,19 @@ SearchProviderDialog::SearchProviderDialog(SearchProvider *provider, charsets.prepend(i18n("Default")); m_dlg->cbCharset->insertStringList(charsets); + m_dlg->cbCategory->insertStringList(SearchProvider::searchCategories.values()); + if (!category.isNull()) + { + m_dlg->cbCategory->setCurrentText(SearchProvider::searchCategoryName(category)); + } + if (m_provider) { setPlainCaption(i18n("Modify Search Provider")); m_dlg->leName->setText(m_provider->name()); m_dlg->leQuery->setText(m_provider->query()); m_dlg->leShortcut->setText(m_provider->keys().join(",")); + m_dlg->cbCategory->setCurrentText(SearchProvider::searchCategoryName(m_provider->category())); m_dlg->cbCharset->setCurrentItem(m_provider->charset().isEmpty() ? 0 : charsets.findIndex(m_provider->charset())); m_dlg->leName->setEnabled(false); m_dlg->leQuery->setFocus(); @@ -95,6 +104,7 @@ void SearchProviderDialog::slotOk() m_provider->setQuery(m_dlg->leQuery->text().stripWhiteSpace()); m_provider->setKeys(TQStringList::split(",", m_dlg->leShortcut->text().stripWhiteSpace())); m_provider->setCharset(m_dlg->cbCharset->currentItem() ? m_dlg->cbCharset->currentText() : TQString::null); + m_provider->setCategory(m_dlg->cbCategory->currentText()); KDialog::accept(); } diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h index a698ee626..8f68788ce 100644 --- a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h +++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg.h @@ -30,7 +30,8 @@ class SearchProviderDialog : public KDialogBase TQ_OBJECT public: - SearchProviderDialog(SearchProvider *provider, TQWidget *parent = 0, const char *name = 0); + SearchProviderDialog(SearchProvider *provider, const TQString &category = TQString::null, + TQWidget *parent = nullptr, const char *name = nullptr); SearchProvider *provider() { return m_provider; } diff --git a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui index 9fe898c83..f3c79a6db 100644 --- a/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui +++ b/kcontrol/ebrowsing/plugins/ikws/searchproviderdlg_ui.ui @@ -27,7 +27,7 @@ <string>Enter the human readable name of the search provider here.</string> </property> </widget> - <widget class="TQLabel" row="6" column="0"> + <widget class="TQLabel" row="8" column="0"> <property name="name"> <cstring>lbCharset</cstring> </property> @@ -109,14 +109,36 @@ Recommended is \{@}, since it removes all query variables (name=value) from the </qt></string> </property> </widget> - <widget class="KComboBox" row="7" column="0"> + <widget class="KComboBox" row="9" column="0"> <property name="name"> <cstring>cbCharset</cstring> </property> <property name="whatsThis" stdset="0"> <string>Select the character set that will be used to encode your search query.</string> </property> - </widget> + </widget> + <widget class="TQLabel" row="6" column="0"> + <property name="name"> + <cstring>lbCategory</cstring> + </property> + <property name="text"> + <string>&Category:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>cbCategory</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>Select the category the search engine will be grouped under.</string> + </property> + </widget> + <widget class="KComboBox" row="7" column="0"> + <property name="name"> + <cstring>cbCategory</cstring> + </property> + <property name="whatsThis" stdset="0"> + <string>Select the category the search engine will be grouped under.</string> + </property> + </widget> </grid> </widget> <customwidgets> @@ -125,6 +147,7 @@ Recommended is \{@}, since it removes all query variables (name=value) from the <tabstop>leName</tabstop> <tabstop>leQuery</tabstop> <tabstop>leShortcut</tabstop> + <tabstop>cbCategory</tabstop> <tabstop>cbCharset</tabstop> </tabstops> <layoutdefaults spacing="6" margin="11"/> |
