def __init__(self, parent): super().__init__(parent) self.config = Configuration() self.le_resourcedir = QLineEdit(self.config.cfg_resource_dir()) self.le_resyncdir = QLineEdit(self.config.cfg_resync_dir()) self.le_sourcedesc = QLineEdit(self.config.cfg_sourcedesc()) self.le_urlprefix = QLineEdit(self.config.cfg_urlprefix()) # self.language_choice = QLabel(_("Interface Language"), self) self.init_ui()
def __init__(self): super().__init__() self.logger = logging.getLogger(__name__) self.config = Configuration() self.menubar = self.menuBar() self.create_menu() self.tabframe = TabbedFrame(self) self.setCentralWidget(self.tabframe) self.resize(self.config.window_width(), self.config.window_height()) self.show()
def test01_set_test_config(self): print("\n>>> Testing set_test_config") Configuration._set_configuration_filename(None) assert not Configuration._configuration_filename assert Configuration._get_configuration_filename() == "rsync.cfg" Configuration._set_configuration_filename("foo.bar") assert Configuration._get_configuration_filename() == "foo.bar" Configuration._set_configuration_filename(None) assert Configuration._get_configuration_filename() == "rsync.cfg"
def test04_set_get_language(self): print("\n>>> Testing language") Configuration._set_configuration_filename("rsync_test.cfg") config1 = Configuration() print("current language: " + config1.settings_language()) config1.set_settings_language("foo-BR") print("now the language is: " + config1.settings_language())
def test03_read(self): print("\n>>> Testing read") Configuration._set_configuration_filename("rsync_test.cfg") config1 = Configuration() config2 = Configuration() assert config1.cfg_resource_dir() == "foo/bar/baz" assert config2.cfg_resource_dir() == "foo/bar/baz"
def test99_cleanup(self): print("\n>>> Cleaning up") Configuration._set_configuration_filename("rsync_test.cfg") config1 = Configuration() os.remove(config1.config_file) assert not os.path.exists(config1.config_file) config1._instance = None Configuration._set_configuration_filename(None)
def __init__(self, args): super().__init__(args) logger.info("Starting application") language = Configuration().settings_language() i18n.set_language(language) self.main_window = RsMainWindow() self.aboutToQuit.connect(self.__before_close__) sys.exit(self.exec_())
def test02_instance(self): print("\n>>> Testing _instance") Configuration._set_configuration_filename("rsync_test.cfg") config1 = Configuration() config2 = Configuration() assert config1 == config2 path1 = config1.config_path if platform.system() == "Darwin": assert path1 == os.path.expanduser("~") + "/.config/rsync" elif platform.system() == "Windows": path_expected = os.path.join(os.path.expanduser("~"), "AppData", "Local", "rsync") assert path1 == path_expected elif platform.system() == "Linux": assert path1 == os.path.expanduser("~") + "/.config/rsync" else: assert path1 == os.path.expanduser("~") + "/rsync" assert config1.get_cfg_resource_dir() == os.path.expanduser("~") config1.set_cfg_resource_dir("foo/bar/baz") assert config1.get_cfg_resource_dir() == "foo/bar/baz" config2.persist() config1 = None config2 = None Configuration._set_configuration_filename(None)
class ConfigFrame(QFrame): def __init__(self, parent): super().__init__(parent) self.config = Configuration() self.le_resourcedir = QLineEdit(self.config.cfg_resource_dir()) self.le_resyncdir = QLineEdit(self.config.cfg_resync_dir()) self.le_sourcedesc = QLineEdit(self.config.cfg_sourcedesc()) self.le_urlprefix = QLineEdit(self.config.cfg_urlprefix()) # self.language_choice = QLabel(_("Interface Language"), self) self.init_ui() def init_ui(self): # layout vert = QVBoxLayout(self) grid1 = QGridLayout() grid1.setContentsMargins(0, 0, 0, 0) # left, top, right, bottom self.pb_resourcedir = QPushButton(_("Browse")) self.pb_resourcedir.clicked.connect(self.pb_resourcedir_clicked) grid1.addWidget(QLabel(_("Resource directory")), 1, 1) grid1.addWidget(self.le_resourcedir, 1, 2) grid1.addWidget(self.pb_resourcedir, 1, 3) pb_resyncdir = QPushButton(_("Browse")) pb_resyncdir.clicked.connect(self.pb_resyncdir_clicked) grid1.addWidget(QLabel(_("Resync directory")), 2, 1) grid1.addWidget(self.le_resyncdir, 2, 2) grid1.addWidget(pb_resyncdir, 2, 3) # language_combo = QComboBox(self) # for dirname in i18n.get_languages(): # language_combo.addItem(dirname) # language_combo.activated[str].connect(self.cb_language_changed) # grid1.addWidget(self.language_choice, 3, 1) # grid1.addWidget(language_combo, 3, 2) self.le_sourcedesc.setToolTip(tt_sourcedesc) grid1.addWidget(QLabel(_("Source description")), 3, 1) grid1.addWidget(self.le_sourcedesc, 3, 2) grid1.addItem(QSpacerItem(87, 21), 3, 3) self.le_urlprefix.setToolTip(_("The url domain to be used in the resync_a files")) grid1.addWidget(QLabel(_("URL prefix")), 4, 1) grid1.addWidget(self.le_urlprefix, 4, 2) grid1.addItem(QSpacerItem(87, 21), 4, 3) vert.addLayout(grid1) strat_vert = QVBoxLayout() strat_vert.addWidget(QLabel(_("Strategy"))) self.strat_group = QButtonGroup(strat_vert) strat_1 = QRadioButton(_("resourcelist")) strat_2 = QRadioButton(_("resourcelist + changelist")) self.strat_group.addButton(strat_1, 0) self.strat_group.addButton(strat_2, 1) self.strat_group.button(self.config.cfg_strategy()).setChecked(True) strat_vert.addWidget(strat_1) strat_vert.addWidget(strat_2) #self.strat_group.buttonToggled.connect(self.bg_strategy_toggled) vert.addLayout(strat_vert) vert.addStretch(1) # hbox = QHBoxLayout() # hbox.addStretch(1) # # vert.addLayout(hbox) self.setLayout(vert) def __persist_config__(self): self.config.set_cfg_resource_dir(self.le_resourcedir.text()) self.config.set_cfg_resync_dir(self.le_resyncdir.text()) self.config.set_cfg_sourcedesc(self.le_sourcedesc.text()) self.config.set_cfg_urlprefix(self.le_urlprefix.text()) self.config.set_cfg_strategy(self.strat_group.checkedId()) self.config.persist() def pb_resourcedir_clicked(self): self.le_resourcedir.setFocus() # "Unable to simultaneously satisfy constraints:..." as warning is a QT bug: # https://bugreports.qt.io/browse/QTBUG-43248 filename = QFileDialog.getExistingDirectory(self, _("Resource Directory"), self.le_resourcedir.text()) if filename != "": # user cancelled self.le_resourcedir.setText(filename) def pb_resyncdir_clicked(self): self.le_resyncdir.setFocus() # "Unable to simultaneously satisfy constraints:..." as warning is a QT bug: # https://bugreports.qt.io/browse/QTBUG-43248 filename = QFileDialog.getExistingDirectory(self, _("Resync Directory"), self.le_resyncdir.text()) if filename != "": # user cancelled self.le_resyncdir.setText(filename) # def cb_language_changed(self, text): # logger.debug(text) # logger.debug(os.path.abspath(gettext.find(i18n.APP_NAME, localedir=i18n.LOCALE_DIR, languages=[text]))) # # gettext.translation(i18n.APP_NAME, localedir=i18n.LOCALE_DIR, languages=[text]).install() # i18n.set_language(text) # # repaint window application ?? # logger.debug(_("browse")) def hide(self): self.__persist_config__() def close(self): self.__persist_config__()
def test02_instance(self): print("\n>>> Testing _instance") Configuration._set_configuration_filename("rsync_test.cfg") config1 = Configuration() config2 = Configuration() assert config1 == config2 path1 = config1.config_path if platform.system() == "Darwin": assert path1 == os.path.expanduser("~") + "/.config/rsync" elif platform.system() == "Windows": path_expected = os.path.join(os.path.expanduser("~"), "AppData", "Local", "rsync") assert path1 == path_expected elif platform.system() == "Linux": assert path1 == os.path.expanduser("~") + "/.config/rsync" else: assert path1 == os.path.expanduser("~") + "/rsync" assert config1.cfg_resource_dir() == os.path.expanduser("~") config1.set_cfg_resource_dir("foo/bar/baz") assert config2.cfg_resource_dir() == "foo/bar/baz" config2.persist() config1 = None config2 = None Configuration._set_configuration_filename(None)
class ConfigFrame(QFrame): def __init__(self, parent): super().__init__(parent) self.config = Configuration() self.initUI() def initUI(self): # layout vert = QVBoxLayout(self) grid1 = QGridLayout() grid1.setContentsMargins(0, 0, 150, 0) # left, top, right, bottom self.le_resourcedir = QLineEdit(self.config.get_cfg_resource_dir()) pb_resourcedir = QPushButton("browse") pb_resourcedir.clicked.connect(self.pb_resourcedir_clicked) grid1.addWidget(QLabel("resource dir:"), 1, 1) grid1.addWidget(self.le_resourcedir, 1, 2) grid1.addWidget(pb_resourcedir, 1, 3) self.le_resyncdir = QLineEdit(self.config.get_cfg_resync_dir()) pb_resyncdir = QPushButton("browse") pb_resyncdir.clicked.connect(self.pb_resyncdir_clicked) grid1.addWidget(QLabel("resync dir:"), 2, 1) grid1.addWidget(self.le_resyncdir, 2, 2) grid1.addWidget(pb_resyncdir, 2, 3) vert.addLayout(grid1) grid2 = QGridLayout() grid2.setContentsMargins(0, 0, 150, 0) # left, top, right, bottom self.le_sourcedesc = QLineEdit(self.config.get_cfg_sourcedesc()) self.le_sourcedesc.setToolTip(tt_sourcedesc) grid2.addWidget(QLabel("sourcedesc:"), 1, 1) grid2.addWidget(self.le_sourcedesc, 1, 2) self.le_urlprefix = QLineEdit(self.config.get_cfg_urlprefix()) grid2.addWidget(QLabel("URL prefix:"), 2, 1) grid2.addWidget(self.le_urlprefix, 2, 2) vert.addLayout(grid2) vert.addStretch(1) # hbox = QHBoxLayout() # hbox.addStretch(1) # # vert.addLayout(hbox) self.setLayout(vert) def pb_resourcedir_clicked(self): # "Unable to simultaneously satisfy constraints:..." as warning is a QT bug: # https://bugreports.qt.io/browse/QTBUG-43248 filename = QFileDialog.getExistingDirectory(self, "Resource Directory", self.le_resourcedir.text()) if filename != "": # user cancelled self.le_resourcedir.setText(filename) def pb_resyncdir_clicked(self): # "Unable to simultaneously satisfy constraints:..." as warning is a QT bug: # https://bugreports.qt.io/browse/QTBUG-43248 filename = QFileDialog.getExistingDirectory(self, "Resync Directory", self.le_resyncdir.text()) if filename != "": # user cancelled self.le_resyncdir.setText(filename) def hide(self): self.config.set_cfg_resource_dir(self.le_resourcedir.text()) self.config.set_cfg_resync_dir(self.le_resyncdir.text()) self.config.set_cfg_source(self.le_sourcedesc.text()) self.config.set_cfg_urlprefix(self.le_urlprefix.text()) self.config.persist()
class RsMainWindow(QMainWindow): def __init__(self): super().__init__() self.logger = logging.getLogger(__name__) self.config = Configuration() self.menubar = self.menuBar() self.create_menu() self.tabframe = TabbedFrame(self) self.setCentralWidget(self.tabframe) self.resize(self.config.window_width(), self.config.window_height()) self.show() def on_tab_choice(self, tabnr): self.tabframe.setCurrentIndex(tabnr) self.set_tab_menu_enabled(tabnr) def set_tab_menu_enabled(self, tabnr): for action in self.tab_actions: action.setEnabled(True) self.tab_actions[tabnr].setEnabled(False) def create_menu(self): exit_action = QAction(_("&Exit"), self) exit_action.setShortcut("Ctrl+Q") exit_action.setStatusTip(_("Exit application")) exit_action.triggered.connect(qApp.quit) show_configure_action = QAction(_("&Configure"), self) show_configure_action.setShortcut("Ctrl+C") show_configure_action.setStatusTip("Configure rsync") show_configure_action.triggered.connect(lambda: self.on_tab_choice(0)) show_export_action = QAction(_("&Export"), self) show_export_action.setShortcut("Ctrl+E") show_export_action.setStatusTip(_("Export files")) show_export_action.triggered.connect(lambda: self.on_tab_choice(1)) show_statistics_action = QAction(_("&Statistics"), self) show_statistics_action.setShortcut("Ctrl+S") show_statistics_action.setStatusTip(_("Statistics")) show_statistics_action.triggered.connect(lambda: self.on_tab_choice(2)) show_man_sets_action = QAction(_("&Manual Sets"), self) show_man_sets_action.setShortcut("Ctrl+M") show_man_sets_action.setStatusTip(_("Manual Sets")) show_man_sets_action.triggered.connect(lambda: self.on_tab_choice(3)) show_rule_based_sets_action = QAction(_("&Rule-based Sets"), self) show_rule_based_sets_action.setShortcut("Ctrl+R") show_rule_based_sets_action.setStatusTip(_("Rule-based Sets")) show_rule_based_sets_action.triggered.connect(lambda: self.on_tab_choice(4)) self.menubar.setNativeMenuBar(True) self.fileMenu = self.menubar.addMenu(_("&File")) self.fileMenu.addAction(exit_action) # on mac under [application] > Quit [application] self.viewMenu = self.menubar.addMenu(_("&View")) self.viewMenu.addAction(show_configure_action) # on mac under [application] > Preverences self.viewMenu.addAction(show_export_action) self.viewMenu.addAction(show_statistics_action) self.viewMenu.addAction(show_man_sets_action) self.viewMenu.addAction(show_rule_based_sets_action) self.tab_actions = list() self.tab_actions.append(show_configure_action) # 0 self.tab_actions.append(show_export_action) # 1 self.tab_actions.append(show_statistics_action) # 2 self.tab_actions.append(show_man_sets_action) # 3 self.tab_actions.append(show_rule_based_sets_action) # 4 def close(self): self.logger.debug("window closing") self.config.set_window_height(self.height()) self.config.set_window_width(self.width()) self.config.persist() self.tabframe.close()
class RsMainWindow(QMainWindow): def __init__(self): super().__init__() self.logger = logging.getLogger(__name__) self.config = Configuration() self.menubar = self.menuBar() self.create_menu() self.tabframe = TabbedFrame(self) self.setCentralWidget(self.tabframe) self.resize(self.config.window_width(), self.config.window_height()) self.show() def on_tab_choice(self, tabnr): self.tabframe.setCurrentIndex(tabnr) self.set_tab_menu_enabled(tabnr) def set_tab_menu_enabled(self, tabnr): for action in self.tab_actions: action.setEnabled(True) self.tab_actions[tabnr].setEnabled(False) def create_menu(self): exit_action = QAction(_("&Exit"), self) exit_action.setShortcut("Ctrl+Q") exit_action.setStatusTip(_("Exit application")) exit_action.triggered.connect(qApp.quit) show_configure_action = QAction(_("&Configure"), self) show_configure_action.setShortcut("Ctrl+C") show_configure_action.setStatusTip("Configure rsync") show_configure_action.triggered.connect(lambda: self.on_tab_choice(0)) show_export_action = QAction(_("&Export"), self) show_export_action.setShortcut("Ctrl+E") show_export_action.setStatusTip(_("Export files")) show_export_action.triggered.connect(lambda: self.on_tab_choice(1)) show_statistics_action = QAction(_("&Statistics"), self) show_statistics_action.setShortcut("Ctrl+S") show_statistics_action.setStatusTip(_("Statistics")) show_statistics_action.triggered.connect(lambda: self.on_tab_choice(2)) show_man_sets_action = QAction(_("&Manual Sets"), self) show_man_sets_action.setShortcut("Ctrl+M") show_man_sets_action.setStatusTip(_("Manual Sets")) show_man_sets_action.triggered.connect(lambda: self.on_tab_choice(3)) show_rule_based_sets_action = QAction(_("&Rule-based Sets"), self) show_rule_based_sets_action.setShortcut("Ctrl+R") show_rule_based_sets_action.setStatusTip(_("Rule-based Sets")) show_rule_based_sets_action.triggered.connect( lambda: self.on_tab_choice(4)) self.menubar.setNativeMenuBar(True) self.fileMenu = self.menubar.addMenu(_("&File")) self.fileMenu.addAction( exit_action) # on mac under [application] > Quit [application] self.viewMenu = self.menubar.addMenu(_("&View")) self.viewMenu.addAction( show_configure_action) # on mac under [application] > Preverences self.viewMenu.addAction(show_export_action) self.viewMenu.addAction(show_statistics_action) self.viewMenu.addAction(show_man_sets_action) self.viewMenu.addAction(show_rule_based_sets_action) self.tab_actions = list() self.tab_actions.append(show_configure_action) # 0 self.tab_actions.append(show_export_action) # 1 self.tab_actions.append(show_statistics_action) # 2 self.tab_actions.append(show_man_sets_action) # 3 self.tab_actions.append(show_rule_based_sets_action) # 4 def close(self): self.logger.debug("window closing") self.config.set_window_height(self.height()) self.config.set_window_width(self.width()) self.config.persist() self.tabframe.close()
def __init__(self, parent): super().__init__(parent) self.config = Configuration() self.initUI()