mirror of
https://github.com/alicevision/Meshroom.git
synced 2025-05-29 17:06:35 +02:00
[ui] more flexible filtering mechanism + filter with viewIds
This commit is contained in:
parent
047b6fb589
commit
e24310d1a1
3 changed files with 41 additions and 48 deletions
|
@ -109,9 +109,6 @@ Panel {
|
||||||
SearchBar {
|
SearchBar {
|
||||||
id: searchBar
|
id: searchBar
|
||||||
width: 100
|
width: 100
|
||||||
onTextChanged: {
|
|
||||||
sortedModel.updateFilter("path", text);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MaterialToolButton {
|
MaterialToolButton {
|
||||||
|
@ -207,35 +204,33 @@ Panel {
|
||||||
id: sortedModel
|
id: sortedModel
|
||||||
model: m.viewpoints
|
model: m.viewpoints
|
||||||
sortRole: "path.basename"
|
sortRole: "path.basename"
|
||||||
property var filterRoleType: ""
|
filters: [
|
||||||
filterRole: _reconstruction.sfmReport ? filterRoleType : ""
|
[
|
||||||
filterValue: false
|
{role: "path", value: searchBar.text},
|
||||||
|
{role: "viewId.asString", value: searchBar.text}
|
||||||
function updateFilter(role, value) {
|
],
|
||||||
grid.updateSelectedViewFromGrid = false
|
{role: "viewId.isReconstructed", value: reconstructionFilter}
|
||||||
sortedModel.filterRoleType = role
|
]
|
||||||
sortedModel.filterValue = value
|
property var reconstructionFilter: undefined
|
||||||
grid.updateCurrentIndexFromSelectionViewId()
|
|
||||||
grid.updateSelectedViewFromGrid = true
|
|
||||||
grid.makeCurrentItemVisible()
|
|
||||||
}
|
|
||||||
|
|
||||||
// override modelData to return basename of viewpoint's path for sorting
|
// override modelData to return basename of viewpoint's path for sorting
|
||||||
function modelData(item, roleName_) {
|
function modelData(item, roleName_) {
|
||||||
var roleNameAndCmd = roleName_.split(".")
|
var roleNameAndCmd = roleName_.split(".");
|
||||||
var roleName = roleName_
|
var roleName = roleName_;
|
||||||
var cmd = ""
|
var cmd = "";
|
||||||
if(roleNameAndCmd.length >= 2)
|
if(roleNameAndCmd.length >= 2)
|
||||||
{
|
{
|
||||||
roleName = roleNameAndCmd[0]
|
roleName = roleNameAndCmd[0];
|
||||||
cmd = roleNameAndCmd[1]
|
cmd = roleNameAndCmd[1];
|
||||||
}
|
}
|
||||||
if(cmd == "isReconstructed")
|
if(cmd == "isReconstructed")
|
||||||
return _reconstruction.isReconstructed(item.model.object)
|
return _reconstruction.isReconstructed(item.model.object);
|
||||||
var value = item.model.object.childAttribute(roleName).value
|
|
||||||
|
|
||||||
|
var value = item.model.object.childAttribute(roleName).value;
|
||||||
if(cmd == "basename")
|
if(cmd == "basename")
|
||||||
return Filepath.basename(value)
|
return Filepath.basename(value);
|
||||||
|
if (cmd == "asString")
|
||||||
|
return value.toString();
|
||||||
|
|
||||||
return value
|
return value
|
||||||
}
|
}
|
||||||
|
@ -592,9 +587,9 @@ Panel {
|
||||||
|
|
||||||
onCheckedChanged:{
|
onCheckedChanged:{
|
||||||
if(checked) {
|
if(checked) {
|
||||||
sortedModel.updateFilter("", true)
|
sortedModel.reconstructionFilter = undefined;
|
||||||
estimatedCamerasFilterButton.checked = false
|
estimatedCamerasFilterButton.checked = false;
|
||||||
nonEstimatedCamerasFilterButton.checked = false
|
nonEstimatedCamerasFilterButton.checked = false;
|
||||||
intrinsicsFilterButton.checked = false;
|
intrinsicsFilterButton.checked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -614,9 +609,9 @@ Panel {
|
||||||
|
|
||||||
onCheckedChanged:{
|
onCheckedChanged:{
|
||||||
if(checked) {
|
if(checked) {
|
||||||
sortedModel.updateFilter("viewId.isReconstructed", true)
|
sortedModel.reconstructionFilter = true;
|
||||||
inputImagesFilterButton.checked = false
|
inputImagesFilterButton.checked = false;
|
||||||
nonEstimatedCamerasFilterButton.checked = false
|
nonEstimatedCamerasFilterButton.checked = false;
|
||||||
intrinsicsFilterButton.checked = false;
|
intrinsicsFilterButton.checked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -643,9 +638,9 @@ Panel {
|
||||||
|
|
||||||
onCheckedChanged:{
|
onCheckedChanged:{
|
||||||
if(checked) {
|
if(checked) {
|
||||||
sortedModel.updateFilter("viewId.isReconstructed", false)
|
sortedModel.reconstructionFilter = false;
|
||||||
inputImagesFilterButton.checked = false
|
inputImagesFilterButton.checked = false;
|
||||||
estimatedCamerasFilterButton.checked = false
|
estimatedCamerasFilterButton.checked = false;
|
||||||
intrinsicsFilterButton.checked = false;
|
intrinsicsFilterButton.checked = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,13 +19,11 @@ DelegateModel {
|
||||||
|
|
||||||
property string sortRole: "" /// the role to use for sorting
|
property string sortRole: "" /// the role to use for sorting
|
||||||
property int sortOrder: Qt.AscendingOrder /// the sorting order
|
property int sortOrder: Qt.AscendingOrder /// the sorting order
|
||||||
property string filterRole: "" /// the role to use for filtering
|
property var filters: []
|
||||||
property variant filterValue /// the value to use as filter
|
|
||||||
|
|
||||||
onSortRoleChanged: invalidateSort()
|
onSortRoleChanged: invalidateSort()
|
||||||
onSortOrderChanged: invalidateSort()
|
onSortOrderChanged: invalidateSort()
|
||||||
onFilterRoleChanged: invalidateFilter()
|
onFiltersChanged: invalidateFilters()
|
||||||
onFilterValueChanged: invalidateFilter()
|
|
||||||
|
|
||||||
// display "filtered" group
|
// display "filtered" group
|
||||||
filterOnGroup: "filtered"
|
filterOnGroup: "filtered"
|
||||||
|
@ -50,7 +48,7 @@ DelegateModel {
|
||||||
sort()
|
sort()
|
||||||
}
|
}
|
||||||
// perform filter invalidation in both cases
|
// perform filter invalidation in both cases
|
||||||
invalidateFilter()
|
invalidateFilters()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// Group for storing filtered items
|
// Group for storing filtered items
|
||||||
|
@ -85,6 +83,9 @@ DelegateModel {
|
||||||
* TODO: add case sensitivity / whole word options for Strings
|
* TODO: add case sensitivity / whole word options for Strings
|
||||||
*/
|
*/
|
||||||
function respectFilter(value, filter) {
|
function respectFilter(value, filter) {
|
||||||
|
if (filter === undefined) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
switch(value.constructor.name)
|
switch(value.constructor.name)
|
||||||
{
|
{
|
||||||
case "String":
|
case "String":
|
||||||
|
@ -94,6 +95,11 @@ DelegateModel {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function respectFilters(item) {
|
||||||
|
let cond = (filter => respectFilter(modelData(item, filter.role), filter.value));
|
||||||
|
return filters.every(x => Array.isArray(x) ? x.some(cond) : cond(x));
|
||||||
|
}
|
||||||
|
|
||||||
/// Reverse sort order (toggle between Qt.AscendingOrder / Qt.DescendingOrder)
|
/// Reverse sort order (toggle between Qt.AscendingOrder / Qt.DescendingOrder)
|
||||||
function reverseSortOrder() {
|
function reverseSortOrder() {
|
||||||
sortOrder = sortOrder == Qt.AscendingOrder ? Qt.DescendingOrder : Qt.AscendingOrder
|
sortOrder = sortOrder == Qt.AscendingOrder ? Qt.DescendingOrder : Qt.AscendingOrder
|
||||||
|
@ -113,18 +119,11 @@ DelegateModel {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Invalidate filtering
|
/// Invalidate filtering
|
||||||
function invalidateFilter() {
|
function invalidateFilters() {
|
||||||
// no filtering, add everything to the filtered group
|
|
||||||
if(!filterRole)
|
|
||||||
{
|
|
||||||
items.addGroups(0, items.count, "filtered")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
for(var i=0; i < items.count; ++i)
|
for(var i=0; i < items.count; ++i)
|
||||||
{
|
{
|
||||||
// if the property value contains filterText, add it to the filtered group
|
// if the property value contains filterText, add it to the filtered group
|
||||||
if(respectFilter(modelData(items.get(i), filterRole), filterValue))
|
if(respectFilters(items.get(i)))
|
||||||
{
|
{
|
||||||
items.addGroups(items.get(i), 1, "filtered")
|
items.addGroups(items.get(i), 1, "filtered")
|
||||||
}
|
}
|
||||||
|
|
|
@ -188,8 +188,7 @@ FloatingPane {
|
||||||
id: sortedMetadataModel
|
id: sortedMetadataModel
|
||||||
model: metadataModel
|
model: metadataModel
|
||||||
sortRole: "raw"
|
sortRole: "raw"
|
||||||
filterRole: "raw"
|
filters: [{role: "raw", value: searchBar.text}]
|
||||||
filterValue: searchBar.text
|
|
||||||
delegate: RowLayout {
|
delegate: RowLayout {
|
||||||
width: parent.width
|
width: parent.width
|
||||||
Label {
|
Label {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue