Jak zmienić ilość kolumn w widoku?

0

Zapytanie o zmianę ilości kolumn przy wyświetlaniu obrazków. Taka prosta galeria. Mogę zmienić przy starcie, ale ponowne wywołanie dodaje jedynie kolumny.

screenshot-20240111235104.png
Po zwiększeniu z trzech do czterech robi się siedem z czego trzy puste.
Niby czyszczę wszystko w kontenerze poprzez .clear_widgets(),
ale chyba KV trzyma stare dane.

class clRecycleRow(BL,clMyImage): # row in thumbnail view
	def m_MakeColumns(*d):
		sSrcs = ''
		sImgs = ''
		sIDs  = ''
		sBckColor = f'''\n\t\tcanvas.before:
			Color:
				rgba: {glMainBckColor}
			Rectangle:
				pos: root.pos
				size: root.size'''
		if d[0] > 2:
			for nr in range(3, d[0] +1):
				sSrcs = sSrcs + f'''\n\tsSrc{nr}: ""'''
				sIDs  = sIDs  + f'''\n\tnID{nr}: None'''
				sImgs = sImgs + f'''\n\tImage:
		source: root.sSrc{nr}
		nID: root.nID{nr}
		size_hint_y: {gnThumbHeightHint}'''
		sKV = f'''<clRecycleRow>
	canvas.before:
		Color:
			rgba: {glMainBckColor}
		Rectangle:
			pos: root.pos
			size: root.size
	orientation: "horizontal"
	size_hint_y: 1
	sSrc1: ""
	sSrc2: ""'''+sSrcs+f'''
	nID1: None
	nID2: None'''+sIDs+f'''
	Image: {sBckColor}
		source: root.sSrc1
		nID:    root.nID1
		size_hint_y: {gnThumbHeightHint}
	Image:
		source: root.sSrc2
		nID:    root.nID2
		size_hint_y: {gnThumbHeightHint}'''+sImgs
		Builder.load_string(sKV)
		return None
	m_MakeColumns(gnCol)
	pass # end of class clRecycleRow

i jest wykorzystana w budowie:

def f_Thumbnails(*d): # generating thumbs in main window
	koThumbsLay.clear_widgets()
	nRowHeight = Window.size[0] / gnCol
	koRecLay = RBL(default_size = (None, nRowHeight), default_size_hint = (1, None),
                   size_hint = (1, None), orientation = 'vertical',)
	koRecLay.bind(minimum_height = koRecLay.setter("height"))
	koRecView = RV(size_hint = (1,1), bar_color = (.4,.4,1,1),
                   bar_inactive_color = glBckColor, bar_width = Window.size[0] / 60)
	koRecView.add_widget(koRecLay)
	koThumbsLay.add_widget(koRecView)
	koRecView.viewclass = 'clRecycleRow' # <---- O TU
	lData = []
	nElms = len(gdFILES['lElms'])
	nRows = math.ceil(nElms/gnCol)
	nElm = -1

	for row in range(0,nRows):
		dTmp = {}
		for col in range(0,gnCol):
			nElm +=1
			if nElm < nElms:
				dTmp[f'sSrc{col+1}'] = gdFILES['lElms'][nElm]
				dTmp[f'nID{col+1}'] = nElm
			else:
				dTmp[f'sSrc{col+1}'] = gsPath2black
				dTmp[f'nID{col+1}'] = 'None' #                                   ### AAA123
		lData.append(dTmp)
	koRecView.data = lData
	return None

Czy ktoś przerabiał RecycleView i ma w tym doświadczenie.

Pozdrawiam
Radek Glebicki

0

Udało mi się namierzyć rozwiązanie z polami tekstowymi. Zastąpiłem je Image pododawałem cosik od siebie i działa.

class clRowBoxLayout(BL, clMyImage): # BL - BoxLayout, clMyImage - Image (for viewclass) class clMyImage(Image) with pass
	def m_AddCol(self, *d):
		global gnCol
		if self == '+':
			gnCol +=1
			if gnCol > 10: gnCol = 10
		elif self == '-':
			gnCol += -1
			if gnCol < 2: gnCol = 2
		else:
			return None
		# set attrs for RecycleGridLayout (is 1st child of 1st child of koThumbsLay)
		# koThumbsLay holds clRowBoxLayout
		koThumbsLay.children[0].children[0].cols = gnCol # here change the columns
		koThumbsLay.children[0].children[0].default_size = (None, gnWinW/gnCol*0.75)
		return None

	# Below
	# data: {gdFILES['lData']} data in form [{'source': 'path', 'nID': 'index in list with paths to pics'},...]
	Builder.load_string(f'''<clRowBoxLayout>:
	orientation: 'vertical'
	RecycleView:
		canvas.before:
			Color:
				rgba: {glBckColor} # background color
			Rectangle:
				pos: self.pos
				size: self.size
		bar_color: {glSlidCol}
		bar_inactive_color: (0,0,0,0)
		bar_width: {gnWinW/50}
		viewclass: 'clMyImage'
		data: {gdFILES['lData']}
		RecycleGridLayout:
			id: grid
			cols: {str(gnCol)}
			default_size: None, {gnWinW/gnCol*0.75}
			default_size_hint: 1, None
			spacing: 10,10
			padding: 10, 10, {gnWinW/50+5}, 10
			size_hint_y: None
			height: self.minimum_height
			orientation: 'lr-tb'
			multiselect: False
			touch_multiselect: False''')
	pass

Jedynie nie rozumiem dlaczego viewclass to Image (clMyImage), a nie grid.

Może się komuś przyda.

Pozdrawiam
Radek Głębicki

1 użytkowników online, w tym zalogowanych: 0, gości: 1