+ indexOfExtension -= extension.length() + 1;
+ }
+
+ return numberOfUnicodeCharactersIn(text.left(indexOfExtension));
+}
+
+void KFileItemListWidget::hoverSequenceStarted()
+{
+ KFileItemListView *view = listView();
+
+ if (!view) {
+ return;
+ }
+
+ const QUrl itemUrl = data().value("url").toUrl();
+
+ view->setHoverSequenceState(itemUrl, 0);
+}
+
+void KFileItemListWidget::forceUpdate()
+{
+ updateAdditionalInfoTextColor();
+ // icon layout does not include the icons in the item selection rectangle
+ // so its icon does not need updating
+ if (listView()->itemLayout() != KStandardItemListView::ItemLayout::IconsLayout) {
+ invalidateIconCache();
+ }
+ update();
+}
+
+void KFileItemListWidget::hoverSequenceIndexChanged(int sequenceIndex)
+{
+ KFileItemListView *view = listView();
+
+ if (!view || !data().value("supportsSequencing").toBool()) {
+ return;
+ }
+
+ const QUrl itemUrl = data().value("url").toUrl();
+
+ view->setHoverSequenceState(itemUrl, sequenceIndex);
+
+ // Force-update the displayed icon
+ invalidateIconCache();
+ update();
+}
+
+void KFileItemListWidget::hoverSequenceEnded()
+{
+ KFileItemListView *view = listView();
+
+ if (!view) {
+ return;