diff --git a/AUTHORS b/AUTHORS index 24cbe9d01..5a4a69a3a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -2,4 +2,6 @@ ThomasV - authored Electrum flatfly - windows build author genjix - worked on server and parts of the gui Julian Tosh (Tuxavant) - various changes +Tachikoma - Mac version, and various fixes to the gui +coblee - Litecoin support in the server, Mac installer. diff --git a/data/icons/accounts.png b/data/icons/accounts.png deleted file mode 100644 index b932d9194..000000000 Binary files a/data/icons/accounts.png and /dev/null differ diff --git a/data/icons/expand.png b/data/icons/expand.png deleted file mode 100644 index 379e74510..000000000 Binary files a/data/icons/expand.png and /dev/null differ diff --git a/data/icons/interact.png b/data/icons/interact.png deleted file mode 100644 index acc65b7a9..000000000 Binary files a/data/icons/interact.png and /dev/null differ diff --git a/data/style.css b/data/style.css index 61a86e658..9c9755c9d 100644 --- a/data/style.css +++ b/data/style.css @@ -1,35 +1,80 @@ #main_window { - background-image: url(background.png); + background: qlineargradient(x1: 0, y1: 0, x2:0,y2:1, stop: 0 white , stop: 1 #E8E8E8); } -#address_input[readOnly=true], #amount_input[readOnly=true] -{ - font: italic; - color: gray; +MiniWindow QPushButton { + color: #777; + border: 1px solid #CCC; + border-radius: 0px; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 white, stop: 1 #E6E6E6); + min-height: 25px; + min-width: 30px; } -#address_input[readOnly=false], #amount_input[readOnly=false] -{ - font: normal; - color: black; + +#send_button{ + color: #E5F2FF; + border: 1px solid #3786E6; + border-radius: 4px; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #72B2F8, stop: 1 #3484E6); + min-width: 80px; + min-height: 23px; + padding: 2px; +} + +#send_button:disabled{ + color: #D3E8FE; + border: 1px solid #6DAEF7; + border-radius: 4px; + background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, + stop: 0 #A5CFFA, stop: 1 #72B2F8); + min-width: 80px; + min-height: 23px; + padding: 2px; } -#valid_address::indicator +#address_input, #amount_input { - width: 24px; - height: 24px; + color: #000; + padding: 5px; + border-radius: 4px; + border: 1px solid #AAA9A9; + width: 225px; + margin-top: 4px; } -#valid_address::indicator:checked + +#address_input[isValid=true] { - image: url(icons/confirmed.png); + color: #4D9948; + padding: 5px; + border-radius: 4px; + border: 1px solid #AAA9A9; + width: 225px; + margin-top: 4px; } -#valid_address::indicator:unchecked + +#address_input[isValid=false] { - image: url(icons/unconfirmed.png); + color: #CE4141; + padding: 5px; + border-radius: 4px; + border: 1px solid #AAA9A9; + width: 225px; + margin-top: 4px; } +#address_input[isValid=placeholder] +{ + color: blue; + padding: 5px; + border-radius: 4px; + border: 1px solid #AAA9A9; + width: 225px; + margin-top: 4px; +} #balance_label { - color: white; + color: #333; } - diff --git a/lib/gui_lite.py b/lib/gui_lite.py index 758257608..c28f4eedd 100644 --- a/lib/gui_lite.py +++ b/lib/gui_lite.py @@ -109,34 +109,6 @@ class MiniWindow(QDialog): self.actuator = actuator - accounts_button = IconButton(rsrc("icons", "accounts.png")) - accounts_button.setObjectName("accounts_button") - - self.accounts_selector = QMenu() - accounts_button.setMenu(self.accounts_selector) - - interact_button = IconButton(rsrc("icons", "interact.png")) - interact_button.setObjectName("interact_button") - - app_menu = QMenu(interact_button) - acceptbit_action = app_menu.addAction(_("A&cceptBit")) - report_action = app_menu.addAction(_("&Report Bug")) - about_action = app_menu.addAction(_("&About Electrum")) - app_menu.addSeparator() - quit_action = app_menu.addAction(_("&Quit")) - interact_button.setMenu(app_menu) - - self.connect(acceptbit_action, SIGNAL("triggered()"), - self.acceptbit) - self.connect(report_action, SIGNAL("triggered()"), - self.show_report_bug) - self.connect(about_action, SIGNAL("triggered()"), self.show_about) - self.connect(quit_action, SIGNAL("triggered()"), self.close) - - expand_button = IconButton(rsrc("icons", "expand.png")) - expand_button.setObjectName("expand_button") - self.connect(expand_button, SIGNAL("clicked()"), expand_callback) - self.btc_balance = None self.quote_currencies = ["EUR", "USD", "GBP"] self.actuator.set_configured_currency(self.set_quote_currency) @@ -151,15 +123,16 @@ class MiniWindow(QDialog): self.receive_button = QPushButton(_("&Receive")) self.receive_button.setObjectName("receive_button") self.receive_button.setDefault(True) - self.connect(self.receive_button, SIGNAL("clicked()"), - self.copy_address) + self.connect(self.receive_button, SIGNAL("clicked()"), self.copy_address) - self.address_input = TextedLineEdit(_("Enter a Bitcoin address...")) + # Bitcoin address code + self.address_input = QLineEdit() + self.address_input.setPlaceholderText(_("Enter a Bitcoin address...")) self.address_input.setObjectName("address_input") - self.connect(self.address_input, SIGNAL("textEdited(QString)"), - self.address_field_changed) - resize_line_edit_width(self.address_input, - "1BtaFUr3qVvAmwrsuDuu5zk6e4s2rxd2Gy") + + + self.connect(self.address_input, SIGNAL("textEdited(QString)"), self.address_field_changed) + resize_line_edit_width(self.address_input, "1BtaFUr3qVvAmwrsuDuu5zk6e4s2rxd2Gy") self.address_completions = QStringListModel() address_completer = QCompleter(self.address_input) @@ -167,16 +140,11 @@ class MiniWindow(QDialog): address_completer.setModel(self.address_completions) self.address_input.setCompleter(address_completer) - self.valid_address = QCheckBox() - self.valid_address.setObjectName("valid_address") - self.valid_address.setEnabled(False) - self.valid_address.setChecked(False) - address_layout = QHBoxLayout() address_layout.addWidget(self.address_input) - address_layout.addWidget(self.valid_address) - self.amount_input = TextedLineEdit(_("... and amount")) + self.amount_input = QLineEdit() + self.amount_input.setPlaceholderText(_("... and amount")) self.amount_input.setObjectName("amount_input") # This is changed according to the user's displayed balance self.amount_validator = QDoubleValidator(self.amount_input) @@ -184,6 +152,10 @@ class MiniWindow(QDialog): self.amount_validator.setDecimals(8) self.amount_input.setValidator(self.amount_validator) + # This removes the very ugly OSX highlighting, please leave this in :D + self.address_input.setAttribute(Qt.WA_MacShowFocusRect, 0) + self.amount_input.setAttribute(Qt.WA_MacShowFocusRect, 0) + self.connect(self.amount_input, SIGNAL("textChanged(QString)"), self.amount_input_changed) @@ -191,22 +163,34 @@ class MiniWindow(QDialog): amount_layout.addWidget(self.amount_input) amount_layout.addStretch() - send_button = QPushButton(_("&Send")) - send_button.setObjectName("send_button") - self.connect(send_button, SIGNAL("clicked()"), self.send) + self.send_button = QPushButton(_("&Send")) + self.send_button.setObjectName("send_button") + self.send_button.setDisabled(True); + self.connect(self.send_button, SIGNAL("clicked()"), self.send) main_layout = QGridLayout(self) - main_layout.addWidget(accounts_button, 0, 0) - main_layout.addWidget(interact_button, 1, 0) - main_layout.addWidget(expand_button, 2, 0) - main_layout.addWidget(self.balance_label, 0, 1) - main_layout.addWidget(self.receive_button, 0, 2) + main_layout.addWidget(self.balance_label, 0, 0) + main_layout.addWidget(self.receive_button, 0, 1) + + main_layout.addWidget(self.address_input, 1, 0, 1, -1) - main_layout.addLayout(address_layout, 1, 1, 1, -1) + main_layout.addLayout(amount_layout, 2, 0) + main_layout.addWidget(self.send_button, 2, 1) - main_layout.addLayout(amount_layout, 2, 1) - main_layout.addWidget(send_button, 2, 2) + menubar = QMenuBar() + file_menu = menubar.addMenu(_("&File")) + file_menu.addAction(_("Open")) + view_menu = menubar.addMenu(_("&View")) + view_menu.addMenu(_("&Themes")) + view_menu.addAction(_("Show History")) + + settings_menu = menubar.addMenu(_("&Settings")) + expert_gui = settings_menu.addAction(_("&Switch to expert GUI")) + self.connect(expert_gui, SIGNAL("triggered()"), expand_callback) + + menubar.addMenu(_("&Help")) + main_layout.setMenuBar(menubar) quit_shortcut = QShortcut(QKeySequence("Ctrl+Q"), self) self.connect(quit_shortcut, SIGNAL("activated()"), self.close) @@ -219,16 +203,18 @@ class MiniWindow(QDialog): self.layout().setSizeConstraint(QLayout.SetFixedSize) self.setObjectName("main_window") self.show() + + def recompute_style(self): + qApp.style().unpolish(self) + qApp.style().polish(self) def closeEvent(self, event): super(MiniWindow, self).closeEvent(event) qApp.quit() def set_payment_fields(self, dest_address, amount): - self.address_input.become_active() self.address_input.setText(dest_address) self.address_field_changed(dest_address) - self.amount_input.become_active() self.amount_input.setText(amount) def activate(self): @@ -264,14 +250,11 @@ class MiniWindow(QDialog): quote_text = "(%s)" % quote_text btc_balance = "%.2f" % (btc_balance / bitcoin(1)) self.balance_label.set_balance_text(btc_balance, quote_text) - main_account_info = \ - "Checking - %s BTC" % btc_balance - self.setWindowTitle("Electrum - %s" % main_account_info) - self.accounts_selector.clear() - self.accounts_selector.addAction("%s %s" % (main_account_info, - quote_text)) + self.setWindowTitle("Electrum - %s BTC" % btc_balance) def amount_input_changed(self, amount_text): + self.check_button_status() + try: amount = D(str(amount_text)) except decimal.InvalidOperation: @@ -295,16 +278,33 @@ class MiniWindow(QDialog): return quote_text def send(self): - if self.actuator.send(self.address_input.text(), - self.amount_input.text(), self): - self.address_input.become_inactive() - self.amount_input.become_inactive() + if self.actuator.send(self.address_input.text(), self.amount_input.text(), self): + self.address_input.setText("") + self.amount_input.setText("") + + def check_button_status(self): + if self.address_input.property("isValid") == True and len(self.amount_input.text()) != 0: + self.send_button.setDisabled(False) + else: + self.send_button.setDisabled(True) def address_field_changed(self, address): if self.actuator.is_valid(address): - self.valid_address.setChecked(True) + self.check_button_status() + self.address_input.setProperty("isValid", True) + self.recompute_style(self.address_input) else: - self.valid_address.setChecked(False) + self.send_button.setDisabled(True) + self.address_input.setProperty("isValid", False) + self.recompute_style(self.address_input) + + if len(address) == 0: + self.address_input.setProperty("isValid", None) + self.recompute_style(self.address_input) + + def recompute_style(self, element): + self.style().unpolish(element) + self.style().polish(element) def copy_address(self): receive_popup = ReceivePopup(self.receive_button) @@ -344,7 +344,7 @@ class BalanceLabel(QLabel): def set_balance_text(self, btc_balance, quote_text): if self.state == self.SHOW_CONNECTING: self.state = self.SHOW_BALANCE - self.balance_text = "%s BTC %s" % (btc_balance, quote_text) + self.balance_text = "%s BTC %s" % (btc_balance, quote_text) if self.state == self.SHOW_BALANCE: self.setText(self.balance_text) @@ -363,44 +363,6 @@ class BalanceLabel(QLabel): self.state = self.SHOW_AMOUNT self.setText(self.amount_text) -class TextedLineEdit(QLineEdit): - - def __init__(self, inactive_text, parent=None): - super(QLineEdit, self).__init__(parent) - self.inactive_text = inactive_text - self.become_inactive() - - def mousePressEvent(self, event): - if self.isReadOnly(): - self.become_active() - QLineEdit.mousePressEvent(self, event) - - def focusOutEvent(self, event): - if self.text() == "": - self.become_inactive() - QLineEdit.focusOutEvent(self, event) - - def focusInEvent(self, event): - if self.isReadOnly(): - self.become_active() - QLineEdit.focusInEvent(self, event) - - def become_inactive(self): - self.setReadOnly(True) - self.recompute_style() - self.setText(self.inactive_text) - - def become_active(self): - self.setReadOnly(False) - self.recompute_style() - self.setText("") - - def recompute_style(self): - qApp.style().unpolish(self) - qApp.style().polish(self) - # also possible but more expensive: - #qApp.setStyleSheet(qApp.styleSheet()) - def ok_cancel_buttons(dialog): row_layout = QHBoxLayout() row_layout.addStretch(1)