summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuf Keten <ketenyusuf@gmail.com>2020-08-21 02:30:26 +0300
committerMuhammet Kara <muhammet.kara@collabora.com>2020-08-26 21:49:22 +0200
commitf1e6919a5072b3f4bc67dbf5d8fcde524b74ecf8 (patch)
tree3c48b5593bc64d49a6ad1c15dc17aa0d3edd5520
parente5356fb099d5fe0d476fa99697e4a7e04688f9ee (diff)
tdf#135275: Additions: Sorting of extensions
Change-Id: If10820786ebc1f97aef24a7cb71a9f8a67e4bb8d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101097 Tested-by: Jenkins Reviewed-by: Muhammet Kara <muhammet.kara@collabora.com>
-rw-r--r--cui/source/dialogs/AdditionsDialog.cxx59
-rw-r--r--cui/source/inc/AdditionsDialog.hxx6
2 files changed, 55 insertions, 10 deletions
diff --git a/cui/source/dialogs/AdditionsDialog.cxx b/cui/source/dialogs/AdditionsDialog.cxx
index 7460fb576790..395198948dea 100644
--- a/cui/source/dialogs/AdditionsDialog.cxx
+++ b/cui/source/dialogs/AdditionsDialog.cxx
@@ -445,6 +445,8 @@ void SearchAndParseThread::execute()
{
std::string sResponse = curlGet(m_pAdditionsDialog->m_sURL);
parseResponse(sResponse, m_pAdditionsDialog->m_aAllExtensionsVector);
+ std::sort(m_pAdditionsDialog->m_aAllExtensionsVector.begin(),
+ m_pAdditionsDialog->m_aAllExtensionsVector.end(), AdditionsDialog::sortByRating);
Search();
}
else // Searching
@@ -471,6 +473,9 @@ AdditionsDialog::AdditionsDialog(weld::Window* pParent, const OUString& sAdditio
, m_xLabelProgress(m_xBuilder->weld_label("labelProgress"))
, m_xGearBtn(m_xBuilder->weld_menu_button("buttonGear"))
{
+ m_xGearBtn->connect_selected(LINK(this, AdditionsDialog, GearHdl));
+ m_xGearBtn->set_item_active("gear_sort_voting", true);
+
m_aSearchDataTimer.SetInvokeHandler(LINK(this, AdditionsDialog, ImplUpdateDataHdl));
m_aSearchDataTimer.SetDebugName("AdditionsDialog SearchDataTimer");
m_aSearchDataTimer.SetTimeout(EDIT_UPDATEDATA_TIMEOUT);
@@ -579,6 +584,32 @@ void AdditionsDialog::ClearList()
this->m_aAdditionsItems.clear();
}
+void AdditionsDialog::RefreshUI()
+{
+ if (m_pSearchThread.is())
+ m_pSearchThread->StopExecution();
+ ClearList();
+ m_nCurrentListItemCount = 0;
+ m_nMaxItemCount = PAGE_SIZE;
+ m_pSearchThread = new SearchAndParseThread(this, false);
+ m_pSearchThread->launch();
+}
+
+bool AdditionsDialog::sortByRating(const AdditionInfo& a, const AdditionInfo& b)
+{
+ return a.sRating.toDouble() > b.sRating.toDouble();
+}
+
+bool AdditionsDialog::sortByComment(const AdditionInfo& a, const AdditionInfo& b)
+{
+ return a.sCommentNumber.toUInt32() > b.sCommentNumber.toUInt32();
+}
+
+bool AdditionsDialog::sortByDownload(const AdditionInfo& a, const AdditionInfo& b)
+{
+ return a.sDownloadNumber.toUInt32() > b.sDownloadNumber.toUInt32();
+}
+
AdditionsItem::AdditionsItem(weld::Widget* pParent, AdditionsDialog* pParentDialog,
AdditionInfo& additionInfo)
: m_xBuilder(Application::CreateBuilder(pParent, "cui/ui/additionsfragment.ui"))
@@ -700,16 +731,7 @@ bool AdditionsItem::getExtensionFile(OUString& sExtensionFile)
return true;
}
-IMPL_LINK_NOARG(AdditionsDialog, ImplUpdateDataHdl, Timer*, void)
-{
- if (m_pSearchThread.is())
- m_pSearchThread->StopExecution();
- ClearList();
- m_nCurrentListItemCount = 0;
- m_nMaxItemCount = PAGE_SIZE;
- m_pSearchThread = new SearchAndParseThread(this, false);
- m_pSearchThread->launch();
-}
+IMPL_LINK_NOARG(AdditionsDialog, ImplUpdateDataHdl, Timer*, void) { RefreshUI(); }
IMPL_LINK_NOARG(AdditionsDialog, SearchUpdateHdl, weld::Entry&, void)
{
@@ -848,4 +870,21 @@ void TmpRepositoryCommandEnv::update(uno::Any const& /*Status */) {}
void TmpRepositoryCommandEnv::pop() {}
+IMPL_LINK(AdditionsDialog, GearHdl, const OString&, rIdent, void)
+{
+ if (rIdent == "gear_sort_voting")
+ {
+ std::sort(m_aAllExtensionsVector.begin(), m_aAllExtensionsVector.end(), sortByRating);
+ }
+ else if (rIdent == "gear_sort_comments")
+ {
+ std::sort(m_aAllExtensionsVector.begin(), m_aAllExtensionsVector.end(), sortByComment);
+ }
+ else if (rIdent == "gear_sort_downloads")
+ {
+ std::sort(m_aAllExtensionsVector.begin(), m_aAllExtensionsVector.end(), sortByDownload);
+ }
+ // After the sorting, UI will be refreshed to update extension list.
+ RefreshUI();
+}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/cui/source/inc/AdditionsDialog.hxx b/cui/source/inc/AdditionsDialog.hxx
index 9061b755a5be..9efaad017af7 100644
--- a/cui/source/inc/AdditionsDialog.hxx
+++ b/cui/source/inc/AdditionsDialog.hxx
@@ -68,6 +68,7 @@ class AdditionsDialog : public weld::GenericDialogController
private:
Timer m_aSearchDataTimer;
+ DECL_LINK(GearHdl, const OString&, void);
DECL_LINK(SearchUpdateHdl, weld::Entry&, void);
DECL_LINK(ImplUpdateDataHdl, Timer*, void);
DECL_LINK(FocusOut_Impl, weld::Widget&, void);
@@ -102,6 +103,11 @@ public:
getInstalledExtensions();
void SetProgress(const OUString& rProgress);
void ClearList();
+ void RefreshUI();
+
+ static bool sortByComment(const AdditionInfo& a, const AdditionInfo& b);
+ static bool sortByRating(const AdditionInfo& a, const AdditionInfo& b);
+ static bool sortByDownload(const AdditionInfo& a, const AdditionInfo& b);
};
class AdditionsItem