Here's how we can formulate this problem and translate it into Gurobi code:

**Decision Variables:**

* `x`: Fraction of cheap paint in the mixture.
* `y`: Fraction of expensive paint in the mixture.

**Objective Function:**

Minimize the cost:  `0.30x + 1.50y`

**Constraints:**

* **Quality Constraint:** The quality of the mix must be at least 80: `50x + 90y >= 80`
* **Fraction Constraint:** The fractions must add up to 1: `x + y = 1`
* **Non-negativity Constraints:** `x >= 0`, `y >= 0`

```python
import gurobipy as gp
from gurobipy import GRB

# Create a new model
model = gp.Model("paint_mix")

# Create variables
x = model.addVar(lb=0, ub=1, name="x") # fraction of cheap paint
y = model.addVar(lb=0, ub=1, name="y") # fraction of expensive paint

# Set objective function
model.setObjective(0.3 * x + 1.5 * y, GRB.MINIMIZE)

# Add constraints
model.addConstr(50 * x + 90 * y >= 80, "quality_constraint")
model.addConstr(x + y == 1, "fraction_constraint")

# Optimize model
model.optimize()

# Print results
if model.status == GRB.OPTIMAL:
    print(f"Optimal cost: ${model.objVal:.2f}")
    print(f"Fraction of cheap paint (x): {x.x:.2f}")
    print(f"Fraction of expensive paint (y): {y.x:.2f}")
else:
    print("Infeasible or unbounded")

```
