--- /dev/null
+##
+## This file is part of the sigrok-meter project.
+##
+## Copyright (C) 2015 Jens Steinhauser <jens.steinhauser@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+ifneq ($(MAKECMDGOALS),clean)
+ ifeq (0,$(shell which pyrcc4 >/dev/null 2>&1; echo $$?))
+ RCC = pyrcc4
+ else
+ ifeq (0,$(shell which pyside-rcc >/dev/null 2>&1; echo $$?))
+ RCC = pyside-rcc
+ else
+ $(error "resource compiler not found")
+ endif
+ endif
+endif
+
+resources.py: resources.qrc
+ $(RCC) -py3 -o $@ $<
+
+.PHONY: clean
+clean:
+ rm -f resources.py
$ git clone git://sigrok.org/sigrok-meter
$ cd sigrok-meter
+ $ make
$ ./sigrok-meter
For installing sigrok-meter:
Please see the individual source files for the full list of copyright holders.
+The sigrok logo is licensed under the CC-BY-SA 3.0 license, the icons from the
+Adwaita icon set are dual licenced under CC-BY-SA 3.0 and LGPLv3.
+
Mailing list
------------
item.setData(traces, MeasurementDataModel.tracesRole)
+ def clear_samples(self):
+ '''Removes all old samples from the model.'''
+ for row in range(self.rowCount()):
+ idx = self.index(row, 0)
+ self.setData(idx, {},
+ MeasurementDataModel.tracesRole)
+
class MultimeterDelegate(QtGui.QStyledItemDelegate):
'''Delegate to show the data items from a MeasurementDataModel.'''
--- /dev/null
+##
+## This file is part of the sigrok-meter project.
+##
+## Copyright (C) 2015 Jens Steinhauser <jens.steinhauser@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+import qtcompat
+import resources
+
+QtCore = qtcompat.QtCore
+QtGui = qtcompat.QtGui
+
+def _load_icon(name):
+ icon = QtGui.QIcon()
+
+ nameFilters = ['{}-*'.format(name)]
+ it = QtCore.QDirIterator(':/icons/', nameFilters)
+ while it.hasNext():
+ filename = it.next()
+ icon.addFile(filename)
+
+ globals()[name] = icon
+
+def load_icons():
+ '''Loads all available icons in all sizes from the resource file.
+
+ A QApplication must have been created before this function can be called.
+ '''
+ _load_icon('about')
+ _load_icon('add')
+ _load_icon('exit')
+ _load_icon('graph')
+ _load_icon('log')
+ _load_icon('preferences')
+ _load_icon('start')
+ _load_icon('stop')
--- /dev/null
+This work is licenced under the terms of either the GNU LGPL v3 or
+Creative Commons Attribution-Share Alike 3.0 United States License.
+
+To view a copy of the CC-BY-SA licence, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
+
+When attributing the artwork, using "GNOME Project" is enough.
+Please link to http://www.gnome.org where available.
+
--- /dev/null
+This work is licenced under the Creative Commons Attribution-Share Alike 3.0
+United States License. To view a copy of this licence, visit
+http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative
+Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.
+
+When attributing the artwork, using "GNOME Project" is enough.
+Please link to http://www.gnome.org where available.
--- /dev/null
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
--- /dev/null
+#!/usr/bin/env python3
+
+##
+## This file is part of the sigrok-meter project.
+##
+## Copyright (C) 2015 Jens Steinhauser <jens.steinhauser@gmail.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+# This scripts copies the icons that sigrok-meter uses from the icon pack,
+# and outputs the matching entries for a Qt resource file.
+
+import os
+import shutil
+
+ICONDIR = '../adwaita-icon-theme-3.18.0/Adwaita'
+OUTDIR = 'icons/adwaita-icon-theme-3.18.0'
+
+def find(iconname):
+ result = []
+ for root, dirs, files in os.walk(ICONDIR):
+ if iconname in files:
+ result.append(os.path.join(root[len(ICONDIR)+1:], iconname))
+ return result
+
+def copy(alias, iconname):
+ for fn in sorted(find(iconname)):
+ inputfile = os.path.join(ICONDIR, fn)
+ outputfile = os.path.join(OUTDIR, fn)
+ outputpath = os.path.dirname(outputfile)
+ size = fn.split(os.sep)[0]
+
+ if not os.path.exists(outputpath):
+ os.makedirs(outputpath)
+
+ shutil.copy(inputfile, outputpath)
+
+ template = '<file alias="{}-{}.png">{}</file>'
+ print(template.format(alias, size, outputfile))
+
+copy('about', 'help-about.png')
+copy('add', 'list-add.png')
+copy('exit', 'application-exit.png')
+copy('graph', 'utilities-system-monitor.png')
+copy('log', 'accessories-text-editor.png')
+copy('preferences', 'preferences-system.png')
+copy('start', 'media-playback-start.png')
+copy('stop', 'media-playback-stop.png')
import acquisition
import datamodel
+import icons
import multiplotwidget
import os.path
import qtcompat
self.delegate = datamodel.MultimeterDelegate(self, self.font())
self.model = datamodel.MeasurementDataModel(self)
- self.model.rowsInserted.connect(self.modelRowsInserted)
- self.setup_ui()
+ # Maps from 'unit' to the corresponding plot.
+ self._plots = {}
+ # Maps from '(plot, device)' to the corresponding curve.
+ self._curves = {}
+
+ self._setup_ui()
+
+ self._plot_update_timer = QtCore.QTimer()
+ self._plot_update_timer.setInterval(MainWindow.UPDATEINTERVAL)
+ self._plot_update_timer.timeout.connect(self._updatePlots)
QtCore.QTimer.singleShot(0, self._start_acquisition)
self.close()
return
- self.acquisition.start()
+ self.start_stop_acquisition()
- def setup_ui(self):
+ def _setup_ui(self):
self.setWindowTitle('sigrok-meter')
# Resizing the listView below will increase this again.
self.resize(350, 10)
- p = os.path.abspath(os.path.dirname(__file__))
- p = os.path.join(p, 'sigrok-logo-notext.png')
- self.setWindowIcon(QtGui.QIcon(p))
+ self.setWindowIcon(QtGui.QIcon(':/logo.png'))
- actionQuit = QtGui.QAction(self)
- actionQuit.setText('&Quit')
- actionQuit.setIcon(QtGui.QIcon.fromTheme('application-exit'))
- actionQuit.setShortcut('Ctrl+Q')
- actionQuit.triggered.connect(self.close)
+ self._setup_graphPage()
+ self._setup_addDevicePage()
+ self._setup_logPage()
+ self._setup_preferencesPage()
- actionAbout = QtGui.QAction(self)
- actionAbout.setText('&About')
- actionAbout.setIcon(QtGui.QIcon.fromTheme('help-about'))
- actionAbout.triggered.connect(self.show_about)
+ self._pages = [
+ self.graphPage,
+ self.addDevicePage,
+ self.logPage,
+ self.preferencesPage
+ ]
- menubar = self.menuBar()
- menuFile = menubar.addMenu('&File')
- menuFile.addAction(actionQuit)
- menuHelp = menubar.addMenu('&Help')
- menuHelp.addAction(actionAbout)
-
- self.listView = EmptyMessageListView('waiting for data...')
- self.listView.setFrameShape(QtGui.QFrame.NoFrame)
- self.listView.viewport().setBackgroundRole(QtGui.QPalette.Window)
- self.listView.viewport().setAutoFillBackground(True)
- self.listView.setMinimumWidth(260)
- self.listView.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
- self.listView.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
- self.listView.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
- self.listView.setItemDelegate(self.delegate)
- self.listView.setModel(self.model)
- self.listView.setUniformItemSizes(True)
- self.listView.setMinimumSize(self.delegate.sizeHint())
+ self.stackedWidget = QtGui.QStackedWidget(self)
+ for page in self._pages:
+ self.stackedWidget.addWidget(page)
- self.plotwidget = multiplotwidget.MultiPlotWidget(self)
- self.plotwidget.plotHidden.connect(self._on_plotHidden)
+ self._setup_sidebar()
- # Maps from 'unit' to the corresponding plot.
- self._plots = {}
- # Maps from '(plot, device)' to the corresponding curve.
- self._curves = {}
+ self.setCentralWidget(QtGui.QWidget())
+ self.centralWidget().setContentsMargins(0, 0, 0, 0)
- self.splitter = QtGui.QSplitter(QtCore.Qt.Horizontal);
- self.splitter.addWidget(self.listView)
- self.splitter.addWidget(self.plotwidget)
- self.splitter.setStretchFactor(0, 0)
- self.splitter.setStretchFactor(1, 1)
+ layout = QtGui.QHBoxLayout(self.centralWidget())
+ layout.addWidget(self.sideBar)
+ layout.addWidget(self.stackedWidget)
+ layout.setSpacing(0)
+ layout.setContentsMargins(0, 0, 0, 0)
+
+ self.resize(900, 550)
+
+ def _setup_sidebar(self):
+ self.sideBar = QtGui.QToolBar(self)
+ self.sideBar.setOrientation(QtCore.Qt.Vertical)
+
+ actionGraph = self.sideBar.addAction('Instantaneous Values and Graphs')
+ actionGraph.setCheckable(True)
+ actionGraph.setIcon(icons.graph)
+ actionGraph.triggered.connect(self.showGraphPage)
+
+ #actionAdd = self.sideBar.addAction('Add Device')
+ #actionAdd.setCheckable(True)
+ #actionAdd.setIcon(icons.add)
+ #actionAdd.triggered.connect(self.showAddDevicePage)
+
+ #actionLog = self.sideBar.addAction('Logs')
+ #actionLog.setCheckable(True)
+ #actionLog.setIcon(icons.log)
+ #actionLog.triggered.connect(self.showLogPage)
+
+ #actionPreferences = self.sideBar.addAction('Preferences')
+ #actionPreferences.setCheckable(True)
+ #actionPreferences.setIcon(icons.preferences)
+ #actionPreferences.triggered.connect(self.showPreferencesPage)
+
+ # make the buttons at the top exclusive
+ self.actionGroup = QtGui.QActionGroup(self)
+ self.actionGroup.addAction(actionGraph)
+ #self.actionGroup.addAction(actionAdd)
+ #self.actionGroup.addAction(actionLog)
+ #self.actionGroup.addAction(actionPreferences)
+
+ # show graph at startup
+ actionGraph.setChecked(True)
+
+ # fill space between buttons on the top and on the bottom
+ fill = QtGui.QWidget(self)
+ fill.setSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Expanding)
+ self.sideBar.addWidget(fill)
+
+ self.actionStartStop = self.sideBar.addAction('Start Acquisition')
+ self.actionStartStop.setIcon(icons.start)
+ self.actionStartStop.triggered.connect(self.start_stop_acquisition)
+
+ actionAbout = self.sideBar.addAction('About')
+ actionAbout.setIcon(icons.about)
+ actionAbout.triggered.connect(self.show_about)
- self.setCentralWidget(self.splitter)
- self.centralWidget().setContentsMargins(0, 0, 0, 0)
- self.resize(800, 500)
+ actionQuit = self.sideBar.addAction('Quit')
+ actionQuit.setIcon(icons.exit)
+ actionQuit.triggered.connect(self.close)
+
+ s = self.style().pixelMetric(QtGui.QStyle.PM_LargeIconSize)
+ self.sideBar.setIconSize(QtCore.QSize(s, s))
+
+ self.sideBar.setStyleSheet('''
+ QToolBar {
+ background-color: white;
+ margin: 0px;
+ border: 0px;
+ border-right: 1px solid black;
+ }
+
+ QToolButton {
+ padding: 10px;
+ border: 0px;
+ border-right: 1px solid black;
+ }
+
+ QToolButton:checked,
+ QToolButton[checkable="false"]:hover {
+ background-color: #c0d0e8;
+ }
+ ''')
+
+ def _setup_graphPage(self):
+ listView = EmptyMessageListView('waiting for data...')
+ listView.setFrameShape(QtGui.QFrame.NoFrame)
+ listView.viewport().setBackgroundRole(QtGui.QPalette.Window)
+ listView.viewport().setAutoFillBackground(True)
+ listView.setMinimumWidth(260)
+ listView.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
+ listView.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+ listView.setVerticalScrollMode(QtGui.QAbstractItemView.ScrollPerPixel)
+ listView.setItemDelegate(self.delegate)
+ listView.setModel(self.model)
+ listView.setUniformItemSizes(True)
+ listView.setMinimumSize(self.delegate.sizeHint())
- self.startTimer(MainWindow.UPDATEINTERVAL)
+ self.plotwidget = multiplotwidget.MultiPlotWidget(self)
+ self.plotwidget.plotHidden.connect(self._on_plotHidden)
- def stop(self):
- self.acquisition.stop()
- print(self.acquisition.is_running())
+ self.graphPage = QtGui.QSplitter(QtCore.Qt.Horizontal, self)
+ self.graphPage.addWidget(listView)
+ self.graphPage.addWidget(self.plotwidget)
+ self.graphPage.setStretchFactor(0, 0)
+ self.graphPage.setStretchFactor(1, 1)
+
+ def _setup_addDevicePage(self):
+ self.addDevicePage = QtGui.QWidget(self)
+ layout = QtGui.QVBoxLayout(self.addDevicePage)
+ label = QtGui.QLabel('add device page')
+ layout.addWidget(label)
+
+ def _setup_logPage(self):
+ self.logPage = QtGui.QWidget(self)
+ layout = QtGui.QVBoxLayout(self.logPage)
+ label = QtGui.QLabel('log page')
+ layout.addWidget(label)
+
+ def _setup_preferencesPage(self):
+ self.preferencesPage = QtGui.QWidget(self)
+ layout = QtGui.QVBoxLayout(self.preferencesPage)
+ label = QtGui.QLabel('preferences page')
+ layout.addWidget(label)
+
+ def showPage(self, page):
+ self.stackedWidget.setCurrentIndex(self._pages.index(page))
+
+ @QtCore.Slot(bool)
+ def showGraphPage(self):
+ self.showPage(self.graphPage)
+
+ @QtCore.Slot(bool)
+ def showAddDevicePage(self):
+ self.showPage(self.addDevicePage)
+
+ @QtCore.Slot(bool)
+ def showLogPage(self):
+ self.showPage(self.logPage)
+
+ @QtCore.Slot(bool)
+ def showPreferencesPage(self):
+ self.showPage(self.preferencesPage)
def _getPlot(self, unit):
'''Looks up or creates a new plot for 'unit'.'''
def _getCurve(self, plot, deviceID):
'''Looks up or creates a new curve for '(plot, deviceID)'.'''
- key = (id(plot), deviceID)
+ key = (plot, deviceID)
if key in self._curves:
return self._curves[key]
self._curves[key] = curve
return curve
- def timerEvent(self, event):
- '''Periodically updates all graphs.'''
-
- self._updatePlots()
-
def _updatePlots(self):
'''Updates all plots.'''
@QtCore.Slot()
def _stopped(self):
if self._closing:
+ # The acquisition was stopped by the 'closeEvent()', close the
+ # window again now that the acquisition has stopped.
self.close()
def closeEvent(self, event):
if self.acquisition.is_running():
+ # Stop the acquisition before closing the window.
self._closing = True
- self.acquisition.stop()
+ self.start_stop_acquisition()
event.ignore()
else:
event.accept()
+ @QtCore.Slot()
+ def start_stop_acquisition(self):
+ if self.acquisition.is_running():
+ self.acquisition.stop()
+ self._plot_update_timer.stop()
+ self.actionStartStop.setText('Start Acquisition')
+ self.actionStartStop.setIcon(icons.start)
+ else:
+ # before starting (again), remove all old samples and old curves
+ self.model.clear_samples()
+
+ for key in self._curves:
+ plot, _ = key
+ curve = self._curves[key]
+ plot.view.removeItem(curve)
+ self._curves = {}
+
+ self.acquisition.start()
+ self._plot_update_timer.start()
+ self.actionStartStop.setText('Stop Acquisition')
+ self.actionStartStop.setIcon(icons.stop)
+
@QtCore.Slot()
def show_about(self):
text = textwrap.dedent('''\
This program comes with ABSOLUTELY NO WARRANTY;<br/>
for details visit
<a href='http://www.gnu.org/licenses/gpl.html'>
- http://www.gnu.org/licenses/gpl.html</a>
+ http://www.gnu.org/licenses/gpl.html</a><br/>
+ <br/>
+ Some icons by <a href='https://www.gnome.org'>
+ the GNOME project</a>
</div>
'''.format(self.context.package_version, self.context.lib_version))
QtGui.QMessageBox.about(self, 'About sigrok-meter', text)
-
- @QtCore.Slot(object, int, int)
- def modelRowsInserted(self, parent, start, end):
- '''Resize the list view to the size of the content.'''
- rows = self.model.rowCount()
- dh = self.delegate.sizeHint().height()
- self.listView.setMinimumHeight(dh * rows)
for m in [
'addPlot',
+ 'hidePlot',
'showPlot'
]:
setattr(self, m, getattr(self.multiPlotItem, m))
--- /dev/null
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource>
+<file alias="logo.png" >icons/sigrok-logo-notext.png</file>
+</qresource>
+<qresource prefix="/icons">
+<file alias="about-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/actions/help-about.png</file>
+<file alias="about-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/actions/help-about.png</file>
+<file alias="about-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/actions/help-about.png</file>
+<file alias="about-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/actions/help-about.png</file>
+<file alias="about-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/actions/help-about.png</file>
+<file alias="add-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/actions/list-add.png</file>
+<file alias="add-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/actions/list-add.png</file>
+<file alias="add-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/actions/list-add.png</file>
+<file alias="add-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/actions/list-add.png</file>
+<file alias="add-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/actions/list-add.png</file>
+<file alias="exit-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/actions/application-exit.png</file>
+<file alias="exit-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/actions/application-exit.png</file>
+<file alias="exit-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/actions/application-exit.png</file>
+<file alias="exit-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/actions/application-exit.png</file>
+<file alias="exit-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/actions/application-exit.png</file>
+<file alias="graph-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/apps/utilities-system-monitor.png</file>
+<file alias="graph-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/apps/utilities-system-monitor.png</file>
+<file alias="graph-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/apps/utilities-system-monitor.png</file>
+<file alias="graph-256x256.png">icons/adwaita-icon-theme-3.18.0/256x256/apps/utilities-system-monitor.png</file>
+<file alias="graph-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/apps/utilities-system-monitor.png</file>
+<file alias="graph-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/apps/utilities-system-monitor.png</file>
+<file alias="log-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/apps/accessories-text-editor.png</file>
+<file alias="log-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/apps/accessories-text-editor.png</file>
+<file alias="log-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/apps/accessories-text-editor.png</file>
+<file alias="log-256x256.png">icons/adwaita-icon-theme-3.18.0/256x256/apps/accessories-text-editor.png</file>
+<file alias="log-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/apps/accessories-text-editor.png</file>
+<file alias="log-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/apps/accessories-text-editor.png</file>
+<file alias="preferences-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/categories/preferences-system.png</file>
+<file alias="preferences-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/categories/preferences-system.png</file>
+<file alias="preferences-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/categories/preferences-system.png</file>
+<file alias="preferences-256x256.png">icons/adwaita-icon-theme-3.18.0/256x256/categories/preferences-system.png</file>
+<file alias="preferences-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/categories/preferences-system.png</file>
+<file alias="preferences-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/categories/preferences-system.png</file>
+<file alias="start-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/actions/media-playback-start.png</file>
+<file alias="start-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/actions/media-playback-start.png</file>
+<file alias="start-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/actions/media-playback-start.png</file>
+<file alias="start-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/actions/media-playback-start.png</file>
+<file alias="start-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/actions/media-playback-start.png</file>
+<file alias="stop-16x16.png">icons/adwaita-icon-theme-3.18.0/16x16/actions/media-playback-stop.png</file>
+<file alias="stop-22x22.png">icons/adwaita-icon-theme-3.18.0/22x22/actions/media-playback-stop.png</file>
+<file alias="stop-24x24.png">icons/adwaita-icon-theme-3.18.0/24x24/actions/media-playback-stop.png</file>
+<file alias="stop-32x32.png">icons/adwaita-icon-theme-3.18.0/32x32/actions/media-playback-stop.png</file>
+<file alias="stop-48x48.png">icons/adwaita-icon-theme-3.18.0/48x48/actions/media-playback-stop.png</file>
+</qresource>
+</RCC>
sys.exit('Error: invalid log level.')
app = QtGui.QApplication([])
+
+ import icons
+ icons.load_icons()
+
s = mainwindow.MainWindow(context, args.drivers)
s.show()