Control.MoveItem() when groups are used

A test script
dlgtest.opusscriptinstall (1.6 KB)

the code
function OnInit(initData) {
	initData.name = "test";
	initData.version = "1.0";
	initData.copyright = "";
	initData.desc = "";
	initData.default_enable = true;
	initData.min_version = "13.17";
}

// Called to add commands to Opus
function OnAddCommands(addCmdData) {
	var cmd = addCmdData.AddCommand();
	cmd.name = "test";
	cmd.method = "Ontest";
	cmd.desc = "";
	cmd.label = "test";
	cmd.template = "";
	cmd.hide = false;
	cmd.icon = "script";
}

// Implements the test command
function Ontest() {
	DOpus.ClearOutput();
	var dlg = DOpus.Dlg();
	dlg.template = 'main';
	dlg.Create();
	var listview = dlg.Control('listview');
	var content = [];
	var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
	listview.AddGroup('Checked', 1);
	listview.AddGroup('Unchecked', 0);
	listview.EnableGroupView(true);
	for (var i = 0; i < 10; i++) {
		content.push({
			'col1': RandomStr(10),
			'col2': RandomStr(10)
		});
	}
	dlg.Show();
	FillList();

	var msg;
	while (true) {
		msg = dlg.GetMsg();
		if (!msg.result) break;
		if (msg.event === 'click') {
			switch (msg.control) {
				case 'up_btn':
					MoveItemList(-1);
					break;
				case 'down_btn':
					MoveItemList(1);
					break;
			}
		}
		else if (msg.event === 'checked') {
			MoveGroup(msg.index);
		}
	}

	function FillList() {
		var item, row;
		listview.redraw = false;
		listview.RemoveItem(-1);
		for (var i = 0; i < content.length; i++) {
			item = content[i];
			row = listview.getItemAt(listview.AddItem(item.col1, i, 0));
			if (!row) continue;
			row.subitems(0).text = item.col2;
		}
		listview.columns.autosize();
		listview.redraw = true;
	}

	function MoveItemList(num) {
		var row = listview.value;
		if (!row ) return;
		Log('Selected "' + row.name + '" pos=' + row.index);
		var new_pos = row.index + num;
		Log('Moving "' + row.name + '" to ' + new_pos);
		if (new_pos < 0 || new_pos >= listview.count) return;
		Log('Moved to ' + listview.MoveItem(row, new_pos));
		// Log('Moved to ' + listview.MoveItem(row.index, new_pos));// does the same
		row.selected = true;
	}

	function MoveGroup(index) {
		var row = listview.getItemAt(index);
		if (!row) return;
		row.group = row.checked ? 1 : 0;
		row.selected = true;
	}

	function RandomStr(len) {
		if (len === 0) return '';
		var out = '';
		for (var i = 0; i < len; i++) {
			out += chars.charAt(Math.floor(Math.random() * chars.length));
		}
		return out;
	}
}

function Log(text, err) {
	DOpus.Output(text, err);
}

==SCRIPT RESOURCES
<resources>
	<resource name="main" type="dialog">
		<dialog height="156" lang="english" width="290">
			<control checkboxes="auto" fullrow="yes" height="148" name="listview" nosortheader="yes" resize="wh" type="listview" viewmode="details" width="266" x="20" y="4">
				<columns>
					<item text="Col1" />
					<item text="Col2" />
				</columns>
			</control>
			<control height="14" name="up_btn" title="UP" type="button" width="14" x="4" y="12" />
			<control height="14" name="down_btn" title="D" type="button" width="14" x="4" y="28" />
		</dialog>
	</resource>
</resources>

To move an item up or down the list, use the corresponding buttons.
I don't know if I'm doing something wrong, but when a ListView uses groups and you try to move an item, it disappears (shows index -1).

If I disable groups, the script above can move the items normally.

Thanks, fixed in the next update.

1 Like