WIP: Refactor and fix network printer list

This commit is contained in:
Lipu Fei 2019-03-11 14:19:21 +01:00
parent 6f6e54fb06
commit 0c94ded93d
5 changed files with 192 additions and 169 deletions

View file

@ -1,4 +1,4 @@
from typing import Callable, Optional, TYPE_CHECKING
from typing import Callable, List, Optional, TYPE_CHECKING
from PyQt5.QtCore import pyqtSlot, pyqtProperty, pyqtSignal, QObject
@ -62,7 +62,7 @@ class DiscoveredPrinterModel(QObject):
discoveredPrintersChanged = pyqtSignal()
@pyqtProperty(list, notify = discoveredPrintersChanged)
def discovered_printers(self) -> "list":
def discovered_printers(self) -> "List[DiscoveredPrinter]":
item_list = list(x for x in self._discovered_printer_dict.values())
item_list.sort(key = lambda x: x.name)
return item_list
@ -70,7 +70,7 @@ class DiscoveredPrinterModel(QObject):
def addDiscoveredPrinter(self, ip_address: str, key: str, name: str, create_callback: Callable[[str], None],
machine_type: str, device) -> None:
if ip_address in self._discovered_printer_dict:
Logger.log("e", "+++++++++++++ printer with ip [%s] has already been added", ip_address)
Logger.log("e", "Printer with ip [%s] has already been added", ip_address)
return
discovered_printer = DiscoveredPrinter(ip_address, key, name, create_callback, machine_type, device, parent = self)
@ -81,7 +81,7 @@ class DiscoveredPrinterModel(QObject):
name: Optional[str] = None,
machine_type: Optional[str] = None) -> None:
if ip_address not in self._discovered_printer_dict:
Logger.log("e", "+++++++++++++ printer with ip [%s] is not known", ip_address)
Logger.log("e", "Printer with ip [%s] is not known", ip_address)
return
item = self._discovered_printer_dict[ip_address]

View file

@ -0,0 +1,153 @@
// Copyright (c) 2019 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 2.3
import UM 1.3 as UM
import Cura 1.1 as Cura
import "../PrinterSelector"
Item
{
id: base
height: networkPrinterScrollView.height + controlsRectangle.height
property alias maxItemCountAtOnce: networkPrinterScrollView.maxItemCountAtOnce
property var selectedItem: networkPrinterListView.model[networkPrinterListView.currentIndex]
ScrollView
{
id: networkPrinterScrollView
anchors.fill: parent
ScrollBar.horizontal.policy: ScrollBar.AsNeeded
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
property int maxItemCountAtOnce: 8 // show at max 8 items at once, otherwise you need to scroll.
height: maxItemCountAtOnce * UM.Theme.getSize("action_button").height
clip: true
ListView
{
id: networkPrinterListView
anchors.fill: parent
model: CuraApplication.getDiscoveredPrinterModel().discovered_printers
visible: model.length > 0
delegate: MachineSelectorButton
{
text: modelData.device.name
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 10
outputDevice: modelData.device
checked: ListView.view.currentIndex == index
onClicked:
{
ListView.view.currentIndex = index
}
}
}
}
Cura.RoundedRectangle
{
id: controlsRectangle
anchors.left: parent.left
anchors.right: parent.right
anchors.top: networkPrinterScrollView.bottom
// Make sure that the left, right, and bottom borders do not show up, otherwise you see double
// borders.
anchors.bottomMargin: -border.width
anchors.leftMargin: -border.width
anchors.rightMargin: -border.width
height: UM.Theme.getSize("message_action_button").height + UM.Theme.getSize("default_margin").height
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("lining")
color: "white"
cornerSide: Cura.RoundedRectangle.Direction.Down
Cura.SecondaryButton
{
id: refreshButton
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Refresh")
height: UM.Theme.getSize("message_action_button").height
}
Cura.SecondaryButton
{
id: addPrinterByIpButton
anchors.left: refreshButton.right
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Add printer by IP")
height: UM.Theme.getSize("message_action_button").height
}
Item
{
id: troubleshootingButton
anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshoortingLinkIcon.height
width: troubleshoortingLinkIcon.width + troubleshoortingLabel.width + UM.Theme.getSize("default_margin").width
UM.RecolorImage
{
id: troubleshoortingLinkIcon
anchors.right: troubleshoortingLabel.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshoortingLabel.height
width: height
sourceSize.height: width
color: UM.Theme.getColor("text_link")
source: UM.Theme.getIcon("external_link")
}
Label
{
id: troubleshoortingLabel
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Troubleshooting")
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text_link")
linkColor: UM.Theme.getColor("text_link")
renderType: Text.NativeRendering
}
MouseArea
{
anchors.fill: parent
hoverEnabled: true
onClicked:
{
// open the material URL with web browser
var url = "https://ultimaker.com/incoming-links/cura/material-compatibilty" // TODO
Qt.openUrlExternally(url)
}
onEntered:
{
troubleshoortingLabel.font.underline = true
}
onExited:
{
troubleshoortingLabel.font.underline = false
}
}
}
}
}

View file

@ -7,8 +7,6 @@ import QtQuick.Controls 2.3
import UM 1.3 as UM
import Cura 1.1 as Cura
import "../PrinterSelector"
//
// This component contains the content for the "Add a printer" (network) page of the welcome on-boarding process.
@ -55,148 +53,11 @@ Item
{
id: networkPrinterListComponent
Item
{
height: networkPrinterScrollView.height + controlsRectangle.height
ScrollView
AddNetworkPrinterScrollView
{
id: networkPrinterScrollView
ScrollBar.horizontal.policy: ScrollBar.AsNeeded
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
property int maxItemCountAtOnce: 8 // show at max 8 items at once, otherwise you need to scroll.
height: maxItemCountAtOnce * (UM.Theme.getSize("action_button").height)
clip: true
ListView
{
id: networkPrinterListView
anchors.fill: parent
model: CuraApplication.getDiscoveredPrinterModel().discovered_printers
visible: model.count > 0
delegate: MachineSelectorButton
{
text: modelData.device.name
anchors.left: parent.left
anchors.right: parent.right
anchors.rightMargin: 10
outputDevice: modelData.device
checked: ListView.view.currentIndex == index
onClicked:
{
ListView.view.currentIndex = index
}
}
}
Label
{
id: noNetworkPrinterLabel
text: catalog.i18nc("@label", "There is no printer found over your network.")
renderType: Text.NativeRendering
visible: !networkPrinterListView.visible
}
}
Cura.RoundedRectangle
{
id: controlsRectangle
anchors.left: parent.left
anchors.right: parent.right
anchors.top: networkPrinterScrollView.bottom
// Make sure that the left, right, and bottom borders do not show up, otherwise you see double
// borders.
anchors.bottomMargin: -border.width
anchors.leftMargin: -border.width
anchors.rightMargin: -border.width
height: UM.Theme.getSize("message_action_button").height + UM.Theme.getSize("default_margin").height
border.width: UM.Theme.getSize("default_lining").width
border.color: UM.Theme.getColor("lining")
color: "white"
cornerSide: Cura.RoundedRectangle.Direction.Down
Cura.SecondaryButton
{
id: refreshButton
anchors.left: parent.left
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Refresh")
height: UM.Theme.getSize("message_action_button").height
}
Cura.SecondaryButton
{
id: addPrinterByIpButton
anchors.left: refreshButton.right
anchors.leftMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Add printer by IP")
height: UM.Theme.getSize("message_action_button").height
}
Item
{
id: troubleshootingButton
anchors.right: parent.right
anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshoortingLinkIcon.height
width: troubleshoortingLinkIcon.width + troubleshoortingLabel.width + UM.Theme.getSize("default_margin").width
UM.RecolorImage
{
id: troubleshoortingLinkIcon
anchors.right: troubleshoortingLabel.left
anchors.rightMargin: UM.Theme.getSize("default_margin").width
anchors.verticalCenter: parent.verticalCenter
height: troubleshoortingLabel.height
width: height
sourceSize.height: width
color: UM.Theme.getColor("text_link")
source: UM.Theme.getIcon("external_link")
}
Label
{
id: troubleshoortingLabel
anchors.right: parent.right
anchors.verticalCenter: parent.verticalCenter
text: catalog.i18nc("@label", "Troubleshooting")
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text_link")
linkColor: UM.Theme.getColor("text_link")
renderType: Text.NativeRendering
}
MouseArea
{
anchors.fill: parent
hoverEnabled: true
onClicked:
{
// open the material URL with web browser
var url = "https://ultimaker.com/incoming-links/cura/material-compatibilty" // TODO
Qt.openUrlExternally(url)
}
onEntered:
{
troubleshoortingLabel.font.underline = true
}
onExited:
{
troubleshoortingLabel.font.underline = false
}
}
}
}
maxItemCountAtOnce: 6 // show at max 6 items at once, otherwise you need to scroll.
}
}
}
@ -230,13 +91,7 @@ Item
{
id: localPrinterView
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
property int maxItemCountAtOnce: 10 // show at max 10 items at once, otherwise you need to scroll.
height: maxItemCountAtOnce * (UM.Theme.getSize("action_button").height)
clip: true
maxItemCountAtOnce: 10 // show at max 10 items at once, otherwise you need to scroll.
}
}
}

View file

@ -16,6 +16,34 @@ ScrollView
property string currentSection: preferredCategory
property string preferredCategory: "Ultimaker"
ScrollBar.horizontal.policy: ScrollBar.AlwaysOff
ScrollBar.vertical.policy: ScrollBar.AlwaysOn
property int maxItemCountAtOnce: 10 // show at max 10 items at once, otherwise you need to scroll.
height: maxItemCountAtOnce * UM.Theme.getSize("action_button").height
clip: true
function updateCurrentItemUponSectionChange()
{
// Find the first machine from this section
for (var i = 0; i < machineList.count; i++)
{
var item = machineList.model.getItem(i)
if (item.section == base.currentSection)
{
base.currentItem = item
machineList.currentIndex = i
break
}
}
}
Component.onCompleted:
{
updateCurrentItemUponSectionChange()
}
background: Rectangle
{
anchors.fill: parent
@ -90,21 +118,8 @@ ScrollView
onClicked:
{
if (base.currentSection != section)
{
// Find the first machine from this section
for (var i = 0; i < ListView.view.count; i++)
{
var item = ListView.view.model.getItem(i)
if (item.section == section)
{
base.currentItem = item
base.currentSection = item.section
ListView.view.currentIndex = i
break
}
}
}
base.currentSection = section
base.updateCurrentItemUponSectionChange()
}
}
}

View file

@ -15,7 +15,7 @@ Item
id: base
implicitWidth: 200
height: header.contentShown ? (header.height + contentRectangle.height) : header.height
height: header.contentShown ? (header.height + contentRectangle.height + 30) : header.height
property var contentComponent: null