From 85d7fa452842e52e28672744356df9103d0bf181 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Mon, 17 Dec 2018 20:35:18 +0700 Subject: [PATCH] Save as --- src/nailab/data/csvfolderdatasource.py | 3 + src/nailab/nailab_rc.py | 262 ++++++++++++------------- src/nailab/ui/mainwindow.py | 14 +- src/nailab/ui/strategywidget.py | 12 ++ src/nailab/ui_gen/mainwindow.py | 5 + src/nailab/ui_gen/strategywidget.py | 2 +- ui/mainwindow.ui | 23 +++ ui/strategywidget.ui | 2 +- 8 files changed, 189 insertions(+), 134 deletions(-) diff --git a/src/nailab/data/csvfolderdatasource.py b/src/nailab/data/csvfolderdatasource.py index a11e0de..8d92d27 100644 --- a/src/nailab/data/csvfolderdatasource.py +++ b/src/nailab/data/csvfolderdatasource.py @@ -27,6 +27,9 @@ class CsvFolderDataSource(DataSource): def available_feeds(self): return [f[1] for f in self.feeds] + def refresh(self): + self._discover_feeds() + def get_feed(self, feed_id): for path, f_id in self.feeds: if f_id == feed_id: diff --git a/src/nailab/nailab_rc.py b/src/nailab/nailab_rc.py index 7ca94cf..23e9e4c 100644 --- a/src/nailab/nailab_rc.py +++ b/src/nailab/nailab_rc.py @@ -9,122 +9,6 @@ from PyQt5 import QtCore qt_resource_data = b"\ -\x00\x00\x02\x0e\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ -\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x8b\x49\x44\ -\x41\x54\x68\x81\xed\x99\x4f\x4a\xc3\x40\x14\x87\x7f\x49\x53\x94\ -\x0a\x2a\xa2\xe2\x9f\x45\xf1\x04\x3d\x42\xc5\x9d\x1b\x71\x29\x81\ -\x9e\xa0\x17\xe8\x11\x7a\x0f\x37\x5d\x8a\x07\x08\xba\xc9\xde\x13\ -\x94\x2e\x6a\x4b\x5a\x28\xad\x34\x28\x49\xe6\x79\x82\x37\x24\x99\ -\xc6\x17\x61\xbe\xed\x1b\xde\xfc\x3e\xe6\x31\x09\x8c\x43\x44\xf8\ -\xcf\xb8\xd2\x01\x4c\xf1\x74\xc5\x20\x0c\xdb\x50\xee\x90\x40\x5d\ -\x07\xce\xe5\x2e\x37\x9e\x2e\xa3\xf7\xde\xe3\xc3\xad\x69\x1f\xf6\ -\x04\x82\x30\x6c\x83\xdc\x0f\x00\x4f\xbb\x0e\x0f\x00\x5f\xf1\xb6\ -\xfb\xfc\xf2\xfa\x66\xda\x87\x1f\x21\xe5\x0e\x41\x38\x32\xdd\x40\ -\xc7\x2e\x24\x58\x01\x02\xdd\x99\x34\xce\x8b\xa9\x04\x2b\xe0\xc0\ -\x39\x2f\xdb\xb4\x28\x26\x12\xb5\xb9\x85\xca\x4a\xd4\x46\x00\x28\ -\x27\x51\x2b\x01\xa0\xb8\x84\x98\x80\xd7\x68\xb0\xb5\x22\x12\x62\ -\x02\xad\xbd\x7d\x6d\x3d\xaf\x84\x98\xc0\xd9\xf1\x09\x5c\x57\xbf\ -\x7d\x1e\x09\x31\x81\xa6\xe7\xe1\xe6\xe2\x1a\x87\xad\x03\xa3\x71\ -\xd2\xfe\x0b\x55\x4d\xd3\xf3\x70\x75\x9a\xeb\x73\xd3\xe5\x0a\xb5\ -\xbb\x85\x8a\x62\x05\xa4\xb1\x02\xd2\x58\x01\x69\xac\x80\x34\x56\ -\x40\x1a\x2b\x20\x8d\x15\x90\xc6\x0a\x48\x63\x05\xa4\xb1\x02\xd2\ -\x58\x01\x69\xac\x80\x34\x56\x40\x1a\x56\x20\xcd\xb2\xbf\xcc\xa1\ -\x45\x97\x85\x15\x88\x7f\xbe\x2b\x09\x53\x06\x5d\x16\x56\x60\xb1\ -\x5e\x45\x4a\xa9\x4a\x02\x15\x41\x29\x85\xc5\x7a\x15\x71\x75\x7e\ -\x84\x92\x24\x18\xcf\xa7\xd8\xc4\x5b\x91\x71\x4a\xb3\x0c\x9b\x78\ -\x8b\xf1\x7c\x8a\x34\x49\x02\x6e\x1d\xfb\x3e\xa0\x40\x83\x24\x4d\ -\xef\x3f\x97\x51\xa5\xaf\xf5\x39\x58\x13\x68\xc0\x15\xd9\x13\xe8\ -\xfb\xfe\x84\x40\x1d\x07\x18\x01\x98\x55\x12\x4d\xcf\xcc\x01\x46\ -\x04\xea\xf4\x7d\x7f\xc2\x2d\xfa\x05\x0e\x3c\xa3\x06\xde\xce\x5a\ -\xc4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x02\x8f\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ -\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x0c\x49\x44\ -\x41\x54\x68\x81\xed\xda\x4f\x4b\x54\x51\x18\x06\xf0\xe7\x3d\xe7\ -\x38\x73\x25\xea\x96\x21\x21\x08\x42\xd8\x66\x5a\x58\x44\x08\x16\ -\x08\x41\x0b\x67\xe3\x4a\xc8\xcf\x20\xb4\x1e\x19\x08\x0c\xa4\xd9\ -\xd6\x97\x50\x74\xe5\xc6\x40\x41\x08\xaa\x85\x2d\xc2\x85\xb3\x49\ -\x82\x01\x41\x18\x65\x72\x46\x63\xfe\x9d\x7b\xde\x16\x76\x69\x82\ -\x1a\x6a\xbc\x7a\xee\x85\xf3\xdb\xcd\x59\xbc\x3c\xcf\xe5\xbd\x67\ -\x73\x87\x98\x19\x49\x26\x6c\x07\x38\x2f\xd5\xf9\x23\xb3\xb8\x3e\ -\x02\xad\x0a\x00\x26\x01\x0c\xf5\x38\x73\xb5\x9d\x0a\xe6\xbe\xcc\ -\x4f\x1d\x9e\x3b\xdd\x3f\xa0\x70\x85\x7e\x86\xdf\x01\xe0\x47\x30\ -\xf7\x90\x88\xe6\x76\x5f\x3c\x5d\x8d\x60\x56\x57\xbf\x56\xe8\xec\ -\xc9\x47\x11\x1e\x00\x06\x99\x79\x25\xb3\xb0\xb1\x72\xe7\xd5\xdb\ -\xc1\x88\x66\xfe\x51\xe7\x3b\x30\x79\x01\xf3\x67\xfa\x5a\x72\xf7\ -\xee\xcb\xcd\x99\x0b\x98\x0d\xa0\x73\x85\x16\x36\xe2\x7e\x1d\x1d\ -\x00\x78\x07\xa5\x73\xc5\x7c\xb6\x14\x1e\x26\xe9\x16\x1a\x02\xf0\ -\x0c\x5a\xed\x64\x16\xd7\x47\xc2\xc3\xdf\x6e\xa1\x01\x4f\x60\x7a\ -\x34\x8d\xd1\xeb\x0a\x7e\x9a\x2e\x3d\x61\x37\xd5\x26\x63\xef\x58\ -\x63\x6d\xaf\xe9\x57\x1a\xaa\x00\x60\x16\xe8\x28\x30\xe0\x09\xcc\ -\x8f\x5f\x41\xbf\x8a\x57\xf0\x90\x9f\x26\x3c\xb8\xd5\x87\xcc\x4d\ -\x85\xc2\xf6\xf7\x27\xe1\x39\x31\x33\xee\xbf\xf9\x34\x71\xfb\x9a\ -\xf7\xe1\x5b\x90\xc6\x89\x8e\xf7\x56\x5d\x55\x06\x37\x64\x13\x5f\ -\x6b\x8d\x47\x9f\x9f\x3f\xfc\x48\xf7\x5e\x6f\x4f\xc8\x94\xff\x9e\ -\x48\xc4\xf3\xd1\xff\x05\xb3\xe1\xa0\x55\x7d\x2c\x88\xbc\xa5\xa4\ -\x85\x07\x00\x22\x41\x44\xde\x92\x10\x32\x35\x6c\x3b\x4c\xaf\x84\ -\x4c\x0d\x0b\x92\x32\xde\x4b\xdf\x05\x49\x29\x12\x1b\x3e\xe4\x0a\ -\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\ -\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\ -\x0a\xd8\x26\xd8\x04\xb6\x33\xf4\x8c\x4d\x00\x11\xb4\xea\xb6\x73\ -\xf4\x2c\x68\xd5\x21\xda\xb5\x4a\x99\xd9\xd8\xce\xf2\xdf\x98\x0d\ -\xda\xb5\x4a\x59\x18\xa3\xb7\xea\x47\xfb\xd0\x8d\x53\x24\x61\x9d\ -\xd8\x04\xd0\x8d\x53\xd4\x8f\xf6\x61\x8c\xde\x52\x50\x3a\xc7\x1a\ -\x53\xcd\xe3\x72\x54\xdf\x88\x2f\x4b\x15\x4a\xe7\x44\x31\x9f\x2d\ -\x41\xe9\x31\x00\xcb\x38\xfb\x94\x19\x77\x07\x00\x96\xa1\xf4\x58\ -\x31\x9f\x2d\x91\xfb\xb7\x8a\x65\x3f\x00\xdf\xf9\xa7\x43\x02\xf4\ -\x78\xd9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ -\x00\x00\x02\x33\ -\x89\ -\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ -\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ -\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ -\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ -\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ -\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ -\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xb0\x49\x44\ -\x41\x54\x68\x81\xed\x9a\x31\x6a\x02\x41\x14\x86\xff\x59\x05\x25\ -\x8d\x21\x10\xc1\xca\x23\xd8\x06\x1b\x21\x5d\xae\x13\x1b\xab\x14\ -\xc1\xc2\x2a\xe7\xf0\x14\x42\x9a\x25\x6d\x4e\x10\x2c\x12\x83\x1b\ -\x16\x5d\x31\xba\xee\xcc\xbc\x14\x21\x90\x80\x6f\xd0\xe8\xfa\x58\ -\x98\xaf\xdc\x19\xd8\xef\x73\xc6\xb1\x18\x15\x11\xa1\xc8\x04\xd2\ -\x02\x87\x52\x76\x0d\x8e\xc2\xb0\x09\x1b\x0c\x08\xd4\x51\x50\x8d\ -\x53\x49\x01\x00\x81\x26\x0a\xea\x11\x81\xed\x5d\xb7\xdb\x63\x6e\ -\x9e\xe2\xb6\xd0\x28\x0c\x9b\xa0\xe0\x19\x84\x5a\x6e\x96\xbb\xa0\ -\x30\x87\xb2\x2d\x2e\x82\xdf\x42\x36\x18\x88\xcb\x03\x00\xa1\x06\ -\x1b\x0c\xb8\x61\x36\x80\x40\x9d\x7c\x8c\xf6\xc7\xe5\xc2\x06\x9c\ -\x7a\xcf\xbb\x70\xb9\x14\xfe\x14\xf2\x01\xd2\xf8\x00\x69\x7c\x80\ -\x34\x3e\x40\x1a\x1f\x20\x8d\x0f\x90\xc6\x07\x48\xe3\x03\xa4\xf1\ -\x01\xd2\xf8\x00\x69\x7c\x80\x34\x3e\x40\x1a\x1f\x20\x0d\x1b\xa0\ -\x8d\x39\xa5\x87\x13\x97\x0b\x1b\xf0\x99\xae\x73\x91\xf9\x0f\x2e\ -\x17\x36\x20\x9a\xc5\xb0\xd6\xe6\x22\xb4\x0f\xd6\x5a\x44\xb3\x98\ -\x1d\x67\xaf\x98\x32\xad\xf1\xf2\xfe\x8a\xcb\xf3\x0b\x9c\x55\xaa\ -\x28\x97\x4a\xb9\x08\x72\x6c\xb2\x0d\xe6\x49\x82\x24\x5d\x21\xd3\ -\x9a\x9d\xe7\xbc\x23\xcb\xb4\xc6\xdb\xc7\xf4\xe8\x72\x00\x30\x9d\ -\x4c\x76\x9a\x57\x6f\xb8\xaf\x29\x0a\x7f\x0a\xb1\x2b\x60\xad\x45\ -\x10\xe4\xdf\x77\x7b\x75\xbf\xf5\xf9\xc3\xd3\xdd\x1f\x17\x0e\xd6\ -\x70\x93\xa6\x07\x68\x1d\x17\x97\x0b\xbb\x02\xcb\xc5\x62\x5a\xa9\ -\x56\xeb\x4a\xa9\x5c\xa4\x7e\xf8\xfd\x49\x6f\x83\x88\xb0\x5c\x2c\ -\xd8\x2f\x22\xbb\x02\xc6\xe8\x51\x1c\x45\x58\xaf\x56\xa2\xc7\x69\ -\x1c\x45\x30\x46\x8f\xb8\x71\x76\x05\x34\xd0\x53\xc6\xdc\x24\xb3\ -\x99\xe8\x5d\xb1\x35\x66\xae\x81\x1e\x37\xce\xae\x40\xbf\xdb\x1d\ -\x67\xa0\x16\x40\x43\x05\xec\x76\xe6\x1d\x91\xef\x77\xd2\x30\x03\ -\xb5\xfa\xdd\xee\xfe\x7f\x35\x28\x0a\x85\xff\x1d\xf8\x02\xd1\xfa\ -\xa2\xe7\x75\x3b\xf6\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ -\x60\x82\ \x00\x00\x03\x8f\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ @@ -184,6 +68,122 @@ qt_resource_data = b"\ \x09\xf1\x80\x43\x84\x88\xf8\xc7\x59\x11\x0f\x08\xbf\x13\x4f\x03\ \xd1\x77\xe2\x69\xf0\xdf\xc0\xb4\xf9\x0b\x47\x70\x6d\x4b\x01\x24\ \x0b\x02\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\x33\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\xb0\x49\x44\ +\x41\x54\x68\x81\xed\x9a\x31\x6a\x02\x41\x14\x86\xff\x59\x05\x25\ +\x8d\x21\x10\xc1\xca\x23\xd8\x06\x1b\x21\x5d\xae\x13\x1b\xab\x14\ +\xc1\xc2\x2a\xe7\xf0\x14\x42\x9a\x25\x6d\x4e\x10\x2c\x12\x83\x1b\ +\x16\x5d\x31\xba\xee\xcc\xbc\x14\x21\x90\x80\x6f\xd0\xe8\xfa\x58\ +\x98\xaf\xdc\x19\xd8\xef\x73\xc6\xb1\x18\x15\x11\xa1\xc8\x04\xd2\ +\x02\x87\x52\x76\x0d\x8e\xc2\xb0\x09\x1b\x0c\x08\xd4\x51\x50\x8d\ +\x53\x49\x01\x00\x81\x26\x0a\xea\x11\x81\xed\x5d\xb7\xdb\x63\x6e\ +\x9e\xe2\xb6\xd0\x28\x0c\x9b\xa0\xe0\x19\x84\x5a\x6e\x96\xbb\xa0\ +\x30\x87\xb2\x2d\x2e\x82\xdf\x42\x36\x18\x88\xcb\x03\x00\xa1\x06\ +\x1b\x0c\xb8\x61\x36\x80\x40\x9d\x7c\x8c\xf6\xc7\xe5\xc2\x06\x9c\ +\x7a\xcf\xbb\x70\xb9\x14\xfe\x14\xf2\x01\xd2\xf8\x00\x69\x7c\x80\ +\x34\x3e\x40\x1a\x1f\x20\x8d\x0f\x90\xc6\x07\x48\xe3\x03\xa4\xf1\ +\x01\xd2\xf8\x00\x69\x7c\x80\x34\x3e\x40\x1a\x1f\x20\x0d\x1b\xa0\ +\x8d\x39\xa5\x87\x13\x97\x0b\x1b\xf0\x99\xae\x73\x91\xf9\x0f\x2e\ +\x17\x36\x20\x9a\xc5\xb0\xd6\xe6\x22\xb4\x0f\xd6\x5a\x44\xb3\x98\ +\x1d\x67\xaf\x98\x32\xad\xf1\xf2\xfe\x8a\xcb\xf3\x0b\x9c\x55\xaa\ +\x28\x97\x4a\xb9\x08\x72\x6c\xb2\x0d\xe6\x49\x82\x24\x5d\x21\xd3\ +\x9a\x9d\xe7\xbc\x23\xcb\xb4\xc6\xdb\xc7\xf4\xe8\x72\x00\x30\x9d\ +\x4c\x76\x9a\x57\x6f\xb8\xaf\x29\x0a\x7f\x0a\xb1\x2b\x60\xad\x45\ +\x10\xe4\xdf\x77\x7b\x75\xbf\xf5\xf9\xc3\xd3\xdd\x1f\x17\x0e\xd6\ +\x70\x93\xa6\x07\x68\x1d\x17\x97\x0b\xbb\x02\xcb\xc5\x62\x5a\xa9\ +\x56\xeb\x4a\xa9\x5c\xa4\x7e\xf8\xfd\x49\x6f\x83\x88\xb0\x5c\x2c\ +\xd8\x2f\x22\xbb\x02\xc6\xe8\x51\x1c\x45\x58\xaf\x56\xa2\xc7\x69\ +\x1c\x45\x30\x46\x8f\xb8\x71\x76\x05\x34\xd0\x53\xc6\xdc\x24\xb3\ +\x99\xe8\x5d\xb1\x35\x66\xae\x81\x1e\x37\xce\xae\x40\xbf\xdb\x1d\ +\x67\xa0\x16\x40\x43\x05\xec\x76\xe6\x1d\x91\xef\x77\xd2\x30\x03\ +\xb5\xfa\xdd\xee\xfe\x7f\x35\x28\x0a\x85\xff\x1d\xf8\x02\xd1\xfa\ +\xa2\xe7\x75\x3b\xf6\xd5\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\ +\x60\x82\ +\x00\x00\x02\x8f\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x02\x0c\x49\x44\ +\x41\x54\x68\x81\xed\xda\x4f\x4b\x54\x51\x18\x06\xf0\xe7\x3d\xe7\ +\x38\x73\x25\xea\x96\x21\x21\x08\x42\xd8\x66\x5a\x58\x44\x08\x16\ +\x08\x41\x0b\x67\xe3\x4a\xc8\xcf\x20\xb4\x1e\x19\x08\x0c\xa4\xd9\ +\xd6\x97\x50\x74\xe5\xc6\x40\x41\x08\xaa\x85\x2d\xc2\x85\xb3\x49\ +\x82\x01\x41\x18\x65\x72\x46\x63\xfe\x9d\x7b\xde\x16\x76\x69\x82\ +\x1a\x6a\xbc\x7a\xee\x85\xf3\xdb\xcd\x59\xbc\x3c\xcf\xe5\xbd\x67\ +\x73\x87\x98\x19\x49\x26\x6c\x07\x38\x2f\xd5\xf9\x23\xb3\xb8\x3e\ +\x02\xad\x0a\x00\x26\x01\x0c\xf5\x38\x73\xb5\x9d\x0a\xe6\xbe\xcc\ +\x4f\x1d\x9e\x3b\xdd\x3f\xa0\x70\x85\x7e\x86\xdf\x01\xe0\x47\x30\ +\xf7\x90\x88\xe6\x76\x5f\x3c\x5d\x8d\x60\x56\x57\xbf\x56\xe8\xec\ +\xc9\x47\x11\x1e\x00\x06\x99\x79\x25\xb3\xb0\xb1\x72\xe7\xd5\xdb\ +\xc1\x88\x66\xfe\x51\xe7\x3b\x30\x79\x01\xf3\x67\xfa\x5a\x72\xf7\ +\xee\xcb\xcd\x99\x0b\x98\x0d\xa0\x73\x85\x16\x36\xe2\x7e\x1d\x1d\ +\x00\x78\x07\xa5\x73\xc5\x7c\xb6\x14\x1e\x26\xe9\x16\x1a\x02\xf0\ +\x0c\x5a\xed\x64\x16\xd7\x47\xc2\xc3\xdf\x6e\xa1\x01\x4f\x60\x7a\ +\x34\x8d\xd1\xeb\x0a\x7e\x9a\x2e\x3d\x61\x37\xd5\x26\x63\xef\x58\ +\x63\x6d\xaf\xe9\x57\x1a\xaa\x00\x60\x16\xe8\x28\x30\xe0\x09\xcc\ +\x8f\x5f\x41\xbf\x8a\x57\xf0\x90\x9f\x26\x3c\xb8\xd5\x87\xcc\x4d\ +\x85\xc2\xf6\xf7\x27\xe1\x39\x31\x33\xee\xbf\xf9\x34\x71\xfb\x9a\ +\xf7\xe1\x5b\x90\xc6\x89\x8e\xf7\x56\x5d\x55\x06\x37\x64\x13\x5f\ +\x6b\x8d\x47\x9f\x9f\x3f\xfc\x48\xf7\x5e\x6f\x4f\xc8\x94\xff\x9e\ +\x48\xc4\xf3\xd1\xff\x05\xb3\xe1\xa0\x55\x7d\x2c\x88\xbc\xa5\xa4\ +\x85\x07\x00\x22\x41\x44\xde\x92\x10\x32\x35\x6c\x3b\x4c\xaf\x84\ +\x4c\x0d\x0b\x92\x32\xde\x4b\xdf\x05\x49\x29\x12\x1b\x3e\xe4\x0a\ +\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\ +\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\x0a\xd8\xe6\ +\x0a\xd8\x26\xd8\x04\xb6\x33\xf4\x8c\x4d\x00\x11\xb4\xea\xb6\x73\ +\xf4\x2c\x68\xd5\x21\xda\xb5\x4a\x99\xd9\xd8\xce\xf2\xdf\x98\x0d\ +\xda\xb5\x4a\x59\x18\xa3\xb7\xea\x47\xfb\xd0\x8d\x53\x24\x61\x9d\ +\xd8\x04\xd0\x8d\x53\xd4\x8f\xf6\x61\x8c\xde\x52\x50\x3a\xc7\x1a\ +\x53\xcd\xe3\x72\x54\xdf\x88\x2f\x4b\x15\x4a\xe7\x44\x31\x9f\x2d\ +\x41\xe9\x31\x00\xcb\x38\xfb\x94\x19\x77\x07\x00\x96\xa1\xf4\x58\ +\x31\x9f\x2d\x91\xfb\xb7\x8a\x65\x3f\x00\xdf\xf9\xa7\x43\x02\xf4\ +\x78\xd9\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ +\x00\x00\x02\x0e\ +\x89\ +\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ +\x00\x00\x30\x00\x00\x00\x30\x08\x06\x00\x00\x00\x57\x02\xf9\x87\ +\x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ +\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\x1b\xaf\ +\x01\x5e\x1a\x91\x1c\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ +\x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ +\x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x01\x8b\x49\x44\ +\x41\x54\x68\x81\xed\x99\x4f\x4a\xc3\x40\x14\x87\x7f\x49\x53\x94\ +\x0a\x2a\xa2\xe2\x9f\x45\xf1\x04\x3d\x42\xc5\x9d\x1b\x71\x29\x81\ +\x9e\xa0\x17\xe8\x11\x7a\x0f\x37\x5d\x8a\x07\x08\xba\xc9\xde\x13\ +\x94\x2e\x6a\x4b\x5a\x28\xad\x34\x28\x49\xe6\x79\x82\x37\x24\x99\ +\xc6\x17\x61\xbe\xed\x1b\xde\xfc\x3e\xe6\x31\x09\x8c\x43\x44\xf8\ +\xcf\xb8\xd2\x01\x4c\xf1\x74\xc5\x20\x0c\xdb\x50\xee\x90\x40\x5d\ +\x07\xce\xe5\x2e\x37\x9e\x2e\xa3\xf7\xde\xe3\xc3\xad\x69\x1f\xf6\ +\x04\x82\x30\x6c\x83\xdc\x0f\x00\x4f\xbb\x0e\x0f\x00\x5f\xf1\xb6\ +\xfb\xfc\xf2\xfa\x66\xda\x87\x1f\x21\xe5\x0e\x41\x38\x32\xdd\x40\ +\xc7\x2e\x24\x58\x01\x02\xdd\x99\x34\xce\x8b\xa9\x04\x2b\xe0\xc0\ +\x39\x2f\xdb\xb4\x28\x26\x12\xb5\xb9\x85\xca\x4a\xd4\x46\x00\x28\ +\x27\x51\x2b\x01\xa0\xb8\x84\x98\x80\xd7\x68\xb0\xb5\x22\x12\x62\ +\x02\xad\xbd\x7d\x6d\x3d\xaf\x84\x98\xc0\xd9\xf1\x09\x5c\x57\xbf\ +\x7d\x1e\x09\x31\x81\xa6\xe7\xe1\xe6\xe2\x1a\x87\xad\x03\xa3\x71\ +\xd2\xfe\x0b\x55\x4d\xd3\xf3\x70\x75\x9a\xeb\x73\xd3\xe5\x0a\xb5\ +\xbb\x85\x8a\x62\x05\xa4\xb1\x02\xd2\x58\x01\x69\xac\x80\x34\x56\ +\x40\x1a\x2b\x20\x8d\x15\x90\xc6\x0a\x48\x63\x05\xa4\xb1\x02\xd2\ +\x58\x01\x69\xac\x80\x34\x56\x40\x1a\x56\x20\xcd\xb2\xbf\xcc\xa1\ +\x45\x97\x85\x15\x88\x7f\xbe\x2b\x09\x53\x06\x5d\x16\x56\x60\xb1\ +\x5e\x45\x4a\xa9\x4a\x02\x15\x41\x29\x85\xc5\x7a\x15\x71\x75\x7e\ +\x84\x92\x24\x18\xcf\xa7\xd8\xc4\x5b\x91\x71\x4a\xb3\x0c\x9b\x78\ +\x8b\xf1\x7c\x8a\x34\x49\x02\x6e\x1d\xfb\x3e\xa0\x40\x83\x24\x4d\ +\xef\x3f\x97\x51\xa5\xaf\xf5\x39\x58\x13\x68\xc0\x15\xd9\x13\xe8\ +\xfb\xfe\x84\x40\x1d\x07\x18\x01\x98\x55\x12\x4d\xcf\xcc\x01\x46\ +\x04\xea\xf4\x7d\x7f\xc2\x2d\xfa\x05\x0e\x3c\xa3\x06\xde\xce\x5a\ +\xc4\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = b"\ @@ -195,32 +195,32 @@ qt_resource_name = b"\ \x00\x6f\xa6\x53\ \x00\x69\ \x00\x63\x00\x6f\x00\x6e\x00\x73\ -\x00\x07\ -\x04\xca\x57\xa7\ -\x00\x6e\ -\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x06\xc1\x59\x87\ -\x00\x6f\ -\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ -\x00\x08\ -\x08\xc8\x58\x67\ -\x00\x73\ -\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x0c\x81\x80\x07\ \x00\x65\ \x00\x78\x00\x65\x00\x63\x00\x75\x00\x74\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x08\xc8\x58\x67\ +\x00\x73\ +\x00\x61\x00\x76\x00\x65\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x08\ +\x06\xc1\x59\x87\ +\x00\x6f\ +\x00\x70\x00\x65\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x00\x07\ +\x04\xca\x57\xa7\ +\x00\x6e\ +\x00\x65\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x0e\x00\x02\x00\x00\x00\x04\x00\x00\x00\x03\ +\x00\x00\x00\x66\x00\x00\x00\x00\x00\x01\x00\x00\x08\x5d\ +\x00\x00\x00\x50\x00\x00\x00\x00\x00\x01\x00\x00\x05\xca\ +\x00\x00\x00\x3a\x00\x00\x00\x00\x00\x01\x00\x00\x03\x93\ \x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x32\x00\x00\x00\x00\x00\x01\x00\x00\x02\x12\ -\x00\x00\x00\x48\x00\x00\x00\x00\x00\x01\x00\x00\x04\xa5\ -\x00\x00\x00\x5e\x00\x00\x00\x00\x00\x01\x00\x00\x06\xdc\ " def qInitResources(): diff --git a/src/nailab/ui/mainwindow.py b/src/nailab/ui/mainwindow.py index b07a952..735b1a4 100644 --- a/src/nailab/ui/mainwindow.py +++ b/src/nailab/ui/mainwindow.py @@ -58,11 +58,23 @@ class MainWindow(QtWidgets.QMainWindow): if currentWidget.source_file is None: currentWidget.source_file = QtWidgets.QFileDialog.getSaveFileName(self, self.tr("Select a file..."), settings.value("save_strategy_path"), self.tr("Python (*.py);;All (*.*, *)"))[0] if currentWidget.source_file != "": + if not currentWidget.source_file.endswith(".py"): + currentWidget.source_file += ".py" settings.setValue("save_strategy_path", os.path.dirname(currentWidget.source_file)) self.ui.tabs.setTabText(self.ui.tabs.currentIndex(), os.path.basename(currentWidget.source_file)) if currentWidget.source_file != "": currentWidget.save() + def saveStrategyAs(self): + settings = QtCore.QSettings() + currentWidget = self.ui.tabs.currentWidget() + new_source_file = QtWidgets.QFileDialog.getSaveFileName(self, self.tr("Select a file..."), settings.value("save_strategy_path"), self.tr("Python (*.py);;All (*.*, *)"))[0] + if new_source_file != "": + settings.setValue("save_strategy_path", os.path.dirname(currentWidget.source_file)) + self.ui.tabs.setTabText(self.ui.tabs.currentIndex(), os.path.basename(currentWidget.source_file)) + currentWidget.save_as(new_source_file) + + def executeStrategy(self): source_file = self.ui.tabs.currentWidget().source_file executor = Executor() @@ -71,7 +83,7 @@ class MainWindow(QtWidgets.QMainWindow): for (source_id, feed_id) in selected_feed_ids: try: selected_feeds.append(self.datasourcemanager.get_source(source_id).get_feed(feed_id)) - except e: + except Exception as e: self.ui.tabs.currentWidget().setError(traceback.format_exc()) try: diff --git a/src/nailab/ui/strategywidget.py b/src/nailab/ui/strategywidget.py index 4a9fa9f..23e1b06 100644 --- a/src/nailab/ui/strategywidget.py +++ b/src/nailab/ui/strategywidget.py @@ -141,6 +141,17 @@ class StrategyWidget(QtWidgets.QWidget): if not saved: self.savedChanged.emit() + def save_as(self, source_file): + self.source_file = source_file + self.save_timestamp = datetime.datetime.now() + with open(self.source_file, "w") as f: + f.write(self.ui.editor.text()) + saved = self.saved + self.saved = True + if not saved: + self.savedChanged.emit() + + def get_time_window(self): if self.ui.rb_allData.isChecked(): return None @@ -151,6 +162,7 @@ class StrategyWidget(QtWidgets.QWidget): self.ui.tw_feeds.clear() sources = self.datasourcemanager.all_sources() for source in sources: + source.refresh() src_item = QtWidgets.QTreeWidgetItem(self.ui.tw_feeds) src_item.setText(0, source.name) src_item.setData(0, ROLE_FEED_ID, (source.name, "")) diff --git a/src/nailab/ui_gen/mainwindow.py b/src/nailab/ui_gen/mainwindow.py index d4eefdf..c1bd557 100644 --- a/src/nailab/ui_gen/mainwindow.py +++ b/src/nailab/ui_gen/mainwindow.py @@ -60,9 +60,12 @@ class Ui_MainWindow(object): self.actionSave_strategy.setObjectName("actionSave_strategy") self.actionExit = QtWidgets.QAction(MainWindow) self.actionExit.setObjectName("actionExit") + self.actionSave_as = QtWidgets.QAction(MainWindow) + self.actionSave_as.setObjectName("actionSave_as") self.menuFile.addAction(self.actionNew_strategy) self.menuFile.addAction(self.actionOpen_strategy) self.menuFile.addAction(self.actionSave_strategy) + self.menuFile.addAction(self.actionSave_as) self.menuFile.addAction(self.actionExit) self.menuBacktest.addAction(self.actionExecute) self.menubar.addAction(self.menuFile.menuAction()) @@ -80,6 +83,7 @@ class Ui_MainWindow(object): self.actionNew_strategy.triggered.connect(MainWindow.newStrategy) self.actionExecute.triggered.connect(MainWindow.executeStrategy) self.actionSave_strategy.triggered.connect(MainWindow.saveStrategy) + self.actionSave_as.triggered.connect(MainWindow.saveStrategyAs) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): @@ -97,5 +101,6 @@ class Ui_MainWindow(object): self.actionSave_strategy.setText(_translate("MainWindow", "Save strategy")) self.actionSave_strategy.setShortcut(_translate("MainWindow", "Ctrl+S")) self.actionExit.setText(_translate("MainWindow", "Exit")) + self.actionSave_as.setText(_translate("MainWindow", "Save as...")) import nailab_rc diff --git a/src/nailab/ui_gen/strategywidget.py b/src/nailab/ui_gen/strategywidget.py index 7125cd7..6d9f7fd 100644 --- a/src/nailab/ui_gen/strategywidget.py +++ b/src/nailab/ui_gen/strategywidget.py @@ -65,7 +65,7 @@ class Ui_StrategyWidget(object): sizePolicy.setHeightForWidth(self.tw_feeds.sizePolicy().hasHeightForWidth()) self.tw_feeds.setSizePolicy(sizePolicy) self.tw_feeds.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.tw_feeds.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) + self.tw_feeds.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.tw_feeds.setHeaderHidden(True) self.tw_feeds.setObjectName("tw_feeds") self.tw_feeds.headerItem().setText(0, "1") diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui index b496e48..afd60d0 100644 --- a/ui/mainwindow.ui +++ b/ui/mainwindow.ui @@ -55,6 +55,7 @@ + @@ -138,6 +139,11 @@ Exit + + + Save as... + + @@ -223,6 +229,22 @@ + + actionSave_as + triggered() + MainWindow + saveStrategyAs() + + + -1 + -1 + + + 529 + 293 + + + openTrades() @@ -231,5 +253,6 @@ newStrategy() executeStrategy() saveStrategy() + saveStrategyAs() diff --git a/ui/strategywidget.ui b/ui/strategywidget.ui index f3b8db4..36dd940 100644 --- a/ui/strategywidget.ui +++ b/ui/strategywidget.ui @@ -149,7 +149,7 @@ Qt::CustomContextMenu - QAbstractItemView::MultiSelection + QAbstractItemView::ExtendedSelection true