diff options
| author | Philippe Mavridis <philippe.mavridis@yandex.com> | 2026-04-01 18:59:40 +0300 |
|---|---|---|
| committer | Philippe Mavridis <philippe.mavridis@yandex.com> | 2026-04-01 19:08:43 +0300 |
| commit | d3067241a0d2f531e23ed82c46326fd95e6a2031 (patch) | |
| tree | e493ff67bc535acb4bb0c37f173c15e82f67a16f /kcharselect/kcharselectdia.cpp | |
| parent | 50855e76de13f2ca1361130493cc026b1ea50bba (diff) | |
| download | tdeutils-feat/kcharselect/category-dock.tar.gz tdeutils-feat/kcharselect/category-dock.zip | |
KCharSelect: add categories dockfeat/kcharselect/category-dock
The category dock provides an easier way to navigate the Unicode tables compared to entering the table number
or manually scrolling until the desired table. The category names are officially defined by the Unicode standard
and are part of many character pickers nowadays.
The proposed dock provides a sortable and searchable hierarchy of categories and subcategories, can be moved, resized
or hidden and the settings are preserved at the next start.
Signed-off-by: Philippe Mavridis <philippe.mavridis@yandex.com>
Diffstat (limited to 'kcharselect/kcharselectdia.cpp')
| -rw-r--r-- | kcharselect/kcharselectdia.cpp | 177 |
1 files changed, 172 insertions, 5 deletions
diff --git a/kcharselect/kcharselectdia.cpp b/kcharselect/kcharselectdia.cpp index d5232a8..33ed2c0 100644 --- a/kcharselect/kcharselectdia.cpp +++ b/kcharselect/kcharselectdia.cpp @@ -9,10 +9,15 @@ #include <stdlib.h> +#include <tqcursor.h> +#include <tqtimer.h> + #include <kdialog.h> #include <tdeapplication.h> #include <tdeaccel.h> #include <tdeconfig.h> +#include <tdelistview.h> +#include <tdelistviewsearchline.h> #include <tdelocale.h> #include <tdeaction.h> @@ -44,6 +49,62 @@ KCharSelectDia::KCharSelectDia(TQWidget *parent,const char *name, TQ_SLOT(fontSelected(const TQString &))); grid->addMultiCellWidget(charSelect, 0, 0, 0, 3); + // Add category browser dock widget + dCategories = new TQDockWindow(this, "categories"); + + TQVBox *cvbox = new TQVBox(dCategories); + + categories = new TDEListView(cvbox, "dock_categories"); + categories->addColumn(i18n("Codepoint")); + categories->addColumn(i18n("Name")); + categories->setRootIsDecorated(true); + categories->setResizeMode(TQListView::LastColumn); + categories->setAllColumnsShowFocus(true); + connect(categories, TQ_SIGNAL(currentChanged(TQListViewItem*)), this, TQ_SLOT(categorySelected(TQListViewItem*))); + + TDEListViewSearchLineWidget *lvsw = new TDEListViewSearchLineWidget(categories, cvbox); + + dCategories->setWidget(cvbox); + dCategories->setCaption(i18n("Categories")); + dCategories->setHorizontallyStretchable(true); + dCategories->setVerticallyStretchable(true); + dCategories->setResizeEnabled(true); + dCategories->setCloseMode(TQDockWindow::Always); + + // BUG TDEMainWindow::saveMainWindowSettings() does not save TQDockWindow settings + TDEConfig *config = tdeApp->config(); + config->setGroup("Docks"); + TQt::Dock categoriesDock = (TQt::Dock)config->readNumEntry("Categories dock", TQt::DockLeft); + int categoriesIndex = config->readNumEntry("Categories index", 0); + bool categoriesNewline = config->readBoolEntry("Categories nl", false); + int categoriesOffset = config->readNumEntry("Categories offset", 0); + int categoriesSize = config->readNumEntry("Categories size", -1); + bool categoriesShown = config->readBoolEntry("Categories shown", true); + + addDockWindow(dCategories, i18n("Categories"), categoriesDock); + moveDockWindow(dCategories, categoriesDock, categoriesNewline, categoriesIndex, categoriesOffset); + if (categoriesSize >= 0) + { + if (dCategories->orientation() == TQt::Horizontal) + { + dCategories->setFixedExtentHeight(categoriesSize); + } + else + { + dCategories->setFixedExtentWidth(categoriesSize); + } + } + + TDEToggleAction *tCategories = new TDEToggleAction(i18n("Show categories dock"), 0, + this, TQ_SLOT(toggleCategoriesDock()), actionCollection(), "show_categories"); + + tCategories->setChecked(categoriesShown); + dCategories->setShown(categoriesShown); + +#include "categories.h" + + TQTimer::singleShot(0, this, TQ_SLOT(populateCategories())); + // Build line editor lined = new TQLineEdit(mainWidget); lined->resize(lined->sizeHint()); @@ -78,7 +139,7 @@ KCharSelectDia::KCharSelectDia(TQWidget *parent,const char *name, // Build menu KStdAction::quit( this, TQ_SLOT(_exit()), actionCollection() ); - + new TDEAction(i18n("&To Clipboard"), "edit-copy", TDEStdAccel::shortcut(TDEStdAccel::Copy), this, TQ_SLOT(toClip()), actionCollection(), "copy_clip" ); @@ -86,20 +147,20 @@ KCharSelectDia::KCharSelectDia(TQWidget *parent,const char *name, TQ_SLOT(toClipUTF8()), actionCollection(), "copy_utf_8" ); (void)new TDEAction(i18n("To Clipboard &HTML"), 0, this, TQ_SLOT(toClipHTML()), actionCollection(), "copy_html" ); - + new TDEAction(i18n("&From Clipboard"), "edit-paste", TDEStdAccel::shortcut(TDEStdAccel::Paste), this, TQ_SLOT(fromClip()), actionCollection(), "from_clip" ); (void)new TDEAction(i18n("From Clipboard UTF-8"), 0, this, TQ_SLOT(fromClipUTF8()), actionCollection(), "from_clip_utf8" ); - + i18n("From Clipboard HTML"); // Intended for future use - + KStdAction::clear(this, TQ_SLOT(clear()), actionCollection(), "clear"); (void)new TDEAction(i18n("&Flip"), 0, this, TQ_SLOT(flipText()), actionCollection(), "flip" ); (void)new TDEAction(i18n("&Alignment"), 0, this, TQ_SLOT(toggleEntryDirection()), actionCollection(), "alignment" ); - + charSelect->setFocus(); entryDirection = direction; @@ -114,7 +175,9 @@ KCharSelectDia::KCharSelectDia(TQWidget *parent,const char *name, //================================================================== void KCharSelectDia::charChanged(const TQChar &_chr) { + if (vChr == _chr) return; vChr = _chr; + updateCurrentCategory(); } //================================================================== @@ -269,6 +332,27 @@ void KCharSelectDia::_exit() config->writeEntry("char",static_cast<int>(vChr.unicode())); config->writeEntry("table",charSelect->tableNum()); config->writeEntry("entryDirection",entryDirection); + + // BUG TDEMainWindow::saveMainWindowSettings() does not save TQDockWindow settings + TQt::Dock dock; int index, offset; bool nl; + if (getLocation(dCategories, dock, index, nl, offset)) + { + config->setGroup("Docks"); + config->writeEntry("Categories dock", dock); + config->writeEntry("Categories index", index); + config->writeEntry("Categories nl", nl); + config->writeEntry("Categories offset", offset); + config->writeEntry("Categories shown", dCategories->isShown()); + + if (dCategories->orientation() == TQt::Horizontal) + { + config->writeEntry("Categories size", dCategories->height()); + } + else + { + config->writeEntry("Categories size", dCategories->width()); + } + } config->sync(); delete this; @@ -287,3 +371,86 @@ void KCharSelectDia::help() tdeApp->invokeHelp(); } +//================================================================== +void KCharSelectDia::populateCategories() +{ + categories->setCursor(TQCursor(TQt::BusyCursor)); + categories->setEnabled(false); + + TQMap<int, TQString>::iterator cit; + for (cit = mCategories.begin(); cit != mCategories.end(); ++cit) + { + TQString uc = TQString("%1").arg(cit.key(), 4, 16).replace(' ', '0'); + TQStringList cdata = TQStringList::split("|", cit.data()); + TQString category = cdata[0]; + TQListViewItem *cItem = categories->findItem(category, 1); + if (!cItem) + { + cItem = new TQListViewItem(categories, uc, category); + } + + if (cdata.count() > 1) + { + TQString subcategory = cdata[1]; + new TQListViewItem(cItem, uc, subcategory); + } + + tqApp->processEvents(); + } + + categories->setEnabled(true); + categories->setCursor(TQCursor(TQt::ArrowCursor)); + updateCurrentCategory(); +} + +//================================================================== +void KCharSelectDia::categorySelected(TQListViewItem *category) +{ + bool ok; + const int uc = category->text(0).toInt(&ok, 16); + if (!ok) return; + + const int table = uc / 256; + charSelect->setTableNum(table); + + const TQChar ch(uc); + charSelect->setChar(ch); +} + +//================================================================== +// Returns the category index corresponding to _chr +int KCharSelectDia::categoryIndex(TQChar &_chr) +{ + TQMap<int, TQString>::iterator cit; + int uc = -1; + for (cit = mCategories.begin(); cit != mCategories.end(); ++cit) + { + if (cit.key() > vChr.unicode()) break; + uc = cit.key(); + } + return uc; +} + +//================================================================== +// Updates category dock to reflect the category of the currently selected character +void KCharSelectDia::updateCurrentCategory() +{ + int uc = categoryIndex(vChr); + if (uc < 0) return; + + TQString codepoint = TQString("%1").arg(uc, 4, 16).replace(' ', '0'); + + TQListViewItem *lvi = categories->findItem(codepoint, 0); + if (!lvi) return; + + categories->blockSignals(true); + categories->setCurrentItem(lvi); + categories->ensureItemVisible(lvi); + categories->blockSignals(false); +} + +//================================================================== +void KCharSelectDia::toggleCategoriesDock() +{ + dCategories->setShown(static_cast<const TDEToggleAction*>(TQObject::sender())->isChecked()); +}
\ No newline at end of file |
