2013-11-03 36 views
0

我嘗試處理ListView上多個項目選擇的一組操作。上下文:一個RSS閱讀器。一篇文章可以被讀/未讀,標記/未標記,已發佈/未發佈。目前,my code在用戶開始多選時添加了所有可能的操作:標記爲已讀,保持未讀,...因此即使每個已選文章已被標記爲已讀,標記爲已讀仍可用。動態管理級聯多選處理程序中的操作

我試圖隱藏不相關的操作。在documentation中有一個例子可以在多個選擇處理程序之間切換,並具有預定義的操作列表。我需要爲每個可能性創建一個處理程序,所以8個處理程序。這顯然不是解決方案。

我每次選擇更改時都會嘗試撥打MultiSelectionHandler::removeAllActions(),並且MultiSelectionHandler::addAction()需要添加回所需的操作。這是我當前的代碼的相關部分:

ListView { 
    dataModel: _articleModel 
    id: listView 

    multiSelectAction: MultiSelectActionItem { 
    } 

    multiSelectHandler { 
     status: qsTr("None selected") 
     actions: [] 

     attachedObjects: [ 
      ActionItem { 
       id: actionMultiRead 
       title: qsTr("Mark as read") 
       imageSource: "asset:///images/mark_as_read.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++i) 
         _articleModel.data(selectionList[i]).unread = false; 
       } 
      }, 
      ActionItem { 
       id: actionMultiUnread 
       title: qsTr("Keep unread") 
       imageSource: "asset:///images/keep_unread.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++ i) 
         _articleModel.data(selectionList[i]).unread = true; 
       } 
      }, 

      ActionItem { 
       id: actionMultiPublish 
       title: qsTr("Publish") 
       imageSource: "asset:///images/publish.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++ i) 
         _articleModel.data(selectionList[i]).published = true; 
       } 
      }, 
      ActionItem { 
       id: actionMultiUnpublish 
       title: qsTr("Unpublish") 
       imageSource: "asset:///images/unpublish.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++ i) 
         _articleModel.data(selectionList[i]).published = false; 
       } 
      }, 

      ActionItem { 
       id: actionMultiStar 
       title: qsTr("Star") 
       imageSource: "asset:///images/star.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++ i) 
         _articleModel.data(selectionList[i]).marked = true; 
       } 
      }, 
      ActionItem { 
       id: actionMultiUnstar 
       title: qsTr("Unstar") 
       imageSource: "asset:///images/unstar.png" 

       onTriggered: { 
        var selectionList = listView.selectionList(); 
        listView.clearSelection(); 
        for (var i = 0; i < selectionList.length; ++ i) 
         _articleModel.data(selectionList[i]).marked = false; 
       } 
      } 
     ] 
    } 

    onSelectionChanged: { 
     if (selectionList().length > 1) { 
      multiSelectHandler.status = qsTr("%1 items selected").arg(selectionList().length); 
     } else if (selectionList().length == 1) { 
      multiSelectHandler.status = qsTr("1 item selected"); 
     } else { 
      multiSelectHandler.status = qsTr("None selected"); 
     } 

     // Update available actions 
     multiSelectHandler.removeAllActions(); 
     for (var i = 0; i < selectionList().length; ++ i) { 
      var elt = _articleModel.data(selectionList()[i]); 
      if (elt.marked) { 
       multiSelectHandler.addAction(actionMultiUnstar); 
       console.log("Adding unstar"); 
      } else { 
       multiSelectHandler.addAction(actionMultiStar); 
       console.log("Adding star"); 
      } 

      if (elt.published) { 
       multiSelectHandler.addAction(actionMultiUnpublish); 
       console.log("Adding unpublish"); 
      } else { 
       multiSelectHandler.addAction(actionMultiPublish); 
       console.log("Adding publish"); 
      } 

      if (elt.unread) { 
       multiSelectHandler.addAction(actionMultiRead); 
       console.log("Adding read"); 
      } else { 
       multiSelectHandler.addAction(actionMultiUnread); 
       console.log("Adding unread"); 
      } 
     } 
    } 
}

雖然它可以大大優化,並能正常工作,直到選擇的變化,它不會再發生變化後的工作:MultiSelectionHandler::removeAllActions()刪除的行動,他們不能被添加回來。

有沒有任何方法可以實現這一點,而無需聲明8個多選處理程序?

回答

1

這個問題是相當古老的,可能你已經解決了,但對於任何其他人偶然發現這個問題我的解決方案是使用MultiSelectionHandler::removeAction()而不是removeAllActions()。

removeAllActions自動刪除對象,因此每次都應該重新創建動作。

for (var i = 0; i < multiSelectAction.actionCount(); ++ i) 
    multiSelectAction.removeAction(multiSelectAction.actionAt(i)); 

乾杯。

+0

好的。我沒有注意到其中的差異。我現在無法測試它(我可能還有這個代碼,我很久沒有在這個應用程序上工作過),但我會保持你的發佈。 –

+0

對不起,我從來沒有花時間來測試這個,我不再有可能了...... –