Operator icon

Hi all!
I’m writing a simple addon and I need a menu in the 3d view to assign one among four custom materials. The menu opens when you press E (in object mode). I came up with this:

I created an operator (ObjectAssignColour) with an integer property (index) ranging from 1 to 4. It assign the colour number index to the active object. Then I created a menu with the method

    def draw(self, context):
        layout = self.layout
        split = layout.split()
        col = split.column()
        for n in (1, 2, 3, 4):
            col.label(icon_value=layout.icon(bpy.data.materials[colour_name % n]))
        col = split.column()
        for t, n in zip(("Red", "Green", "Cyan", "Violet"), (1, 2, 3, 4)):
            col.operator(ObjectAssignColour.bl_idname, text=t).index = n

The main issue is the bad spacing between the icons in the left column and the operators in the right one (I would like to have them closer). The reason why I had to do this is because label() supports the icon_value keyword which allows me to reference the icon of the material. On the other hand, operator() unfortunately does not support it.

Is there a way to use custom icons with operators?
Or is there a way to control the spacing to fit the icons and the operators closer?
Or is there a way to put the materials directly inside the menu (instead of operators) and have the menu assign the selected one when it closes?

Thank you in advance