From e94d48c265024b511190fb4d0db7c9bb5144c9c5 Mon Sep 17 00:00:00 2001 From: Chris Seagraves <47610393+nosv1@users.noreply.github.com> Date: Wed, 30 Jun 2021 17:07:53 -0500 Subject: [PATCH] Notes to kneeboard (#1375) Adds global-level kneeboard notes. Explicit save compatability with 4.0.0 --- changelog.md | 1 + game/game.py | 1 + gen/kneeboard.py | 26 +++++++++++ qt_ui/uiconstants.py | 1 + qt_ui/windows/QLiberationWindow.py | 10 ++++ qt_ui/windows/notes/QNotesWindow.py | 67 +++++++++++++++++++++++++++ resources/ui/misc/dark/notes.png | Bin 0 -> 3243 bytes resources/ui/misc/light/notes.png | Bin 0 -> 3536 bytes resources/ui/misc/notes.png | Bin 0 -> 3536 bytes resources/ui/misc/original/notes.png | Bin 0 -> 3435 bytes 10 files changed, 106 insertions(+) create mode 100644 qt_ui/windows/notes/QNotesWindow.py create mode 100644 resources/ui/misc/dark/notes.png create mode 100644 resources/ui/misc/light/notes.png create mode 100644 resources/ui/misc/notes.png create mode 100644 resources/ui/misc/original/notes.png diff --git a/changelog.md b/changelog.md index 1b5d2386..fd71f412 100644 --- a/changelog.md +++ b/changelog.md @@ -12,6 +12,7 @@ Saves from 4.0.0 are compatible with 4.0.1. ## Features/Improvements +* **[UI]** Added ability to take notes and have those notes appear as a kneeboard page. * **[UI]** Hovering over the weather information now dispalys the cloud base (meters and feet). * **[UI]** Google search link added to unit information when there is no information provided. diff --git a/game/game.py b/game/game.py index 80867ecd..3a783e40 100644 --- a/game/game.py +++ b/game/game.py @@ -110,6 +110,7 @@ class Game: self.date = date(start_date.year, start_date.month, start_date.day) self.game_stats = GameStats() self.game_stats.update(self) + self.notes = "" self.ground_planners: dict[int, GroundPlanner] = {} self.informations = [] self.informations.append(Information("Game Start", "-" * 40, 0)) diff --git a/gen/kneeboard.py b/gen/kneeboard.py index 62fd9d25..9a074940 100644 --- a/gen/kneeboard.py +++ b/gen/kneeboard.py @@ -554,6 +554,28 @@ class StrikeTaskPage(KneeboardPage): ] +class NotesPage(KneeboardPage): + """A kneeboard page containing the campaign owner's notes.""" + + def __init__( + self, + game: "Game", + dark_kneeboard: bool, + ) -> None: + self.game = game + self.dark_kneeboard = dark_kneeboard + + def write(self, path: Path) -> None: + writer = KneeboardPageWriter(dark_theme=self.dark_kneeboard) + writer.title(f"Notes") + + try: + writer.text(self.game.notes) + except AttributeError: # old saves may not have .notes ;) + writer.text("") + writer.write(path) + + class KneeboardGenerator(MissionInfoGenerator): """Creates kneeboard pages for each client flight in the mission.""" @@ -621,6 +643,10 @@ class KneeboardGenerator(MissionInfoGenerator): self.mission.start_time, self.dark_kneeboard, ), + NotesPage( + self.game, + self.dark_kneeboard, + ), ] if (target_page := self.generate_task_page(flight)) is not None: diff --git a/qt_ui/uiconstants.py b/qt_ui/uiconstants.py index 30ee7adf..e36ffb7e 100644 --- a/qt_ui/uiconstants.py +++ b/qt_ui/uiconstants.py @@ -106,6 +106,7 @@ def load_icons(): ICONS["PluginsOptions"] = QPixmap( "./resources/ui/misc/" + get_theme_icons() + "/pluginsoptions.png" ) + ICONS["Notes"] = QPixmap("./resources/ui/misc/" + get_theme_icons() + "/notes.png") ICONS["TaskCAS"] = QPixmap("./resources/ui/tasks/cas.png") ICONS["TaskCAP"] = QPixmap("./resources/ui/tasks/cap.png") diff --git a/qt_ui/windows/QLiberationWindow.py b/qt_ui/windows/QLiberationWindow.py index e4d7f403..1cc946fd 100644 --- a/qt_ui/windows/QLiberationWindow.py +++ b/qt_ui/windows/QLiberationWindow.py @@ -36,6 +36,7 @@ from qt_ui.windows.preferences.QLiberationPreferencesWindow import ( ) from qt_ui.windows.settings.QSettingsWindow import QSettingsWindow from qt_ui.windows.stats.QStatsWindow import QStatsWindow +from qt_ui.windows.notes.QNotesWindow import QNotesWindow class QLiberationWindow(QMainWindow): @@ -158,6 +159,10 @@ class QLiberationWindow(QMainWindow): self.openStatsAction.setIcon(CONST.ICONS["Statistics"]) self.openStatsAction.triggered.connect(self.showStatsDialog) + self.openNotesAction = QAction("Notes", self) + self.openNotesAction.setIcon(CONST.ICONS["Notes"]) + self.openNotesAction.triggered.connect(self.showNotesDialog) + def initToolbar(self): self.tool_bar = self.addToolBar("File") self.tool_bar.addAction(self.newGameAction) @@ -171,6 +176,7 @@ class QLiberationWindow(QMainWindow): self.actions_bar = self.addToolBar("Actions") self.actions_bar.addAction(self.openSettingsAction) self.actions_bar.addAction(self.openStatsAction) + self.actions_bar.addAction(self.openNotesAction) def initMenuBar(self): self.menu = self.menuBar() @@ -351,6 +357,10 @@ class QLiberationWindow(QMainWindow): self.dialog = QStatsWindow(self.game) self.dialog.show() + def showNotesDialog(self): + self.dialog = QNotesWindow(self.game) + self.dialog.show() + def onDebriefing(self, debrief: Debriefing): logging.info("On Debriefing") self.debriefing = QDebriefingWindow(debrief) diff --git a/qt_ui/windows/notes/QNotesWindow.py b/qt_ui/windows/notes/QNotesWindow.py new file mode 100644 index 00000000..cb1419b5 --- /dev/null +++ b/qt_ui/windows/notes/QNotesWindow.py @@ -0,0 +1,67 @@ +from PySide2.QtWidgets import ( + QDialog, + QPlainTextEdit, + QVBoxLayout, + QHBoxLayout, + QPushButton, + QLabel, +) +from PySide2.QtGui import QTextCursor +from PySide2.QtCore import QTimer + +import qt_ui.uiconstants as CONST +from game.game import Game + +from time import sleep + + +class QNotesWindow(QDialog): + def __init__(self, game: Game): + super(QNotesWindow, self).__init__() + + self.game = game + self.setWindowTitle("Notes") + self.setWindowIcon(CONST.ICONS["Notes"]) + self.setMinimumSize(400, 100) + self.resize(600, 450) + + self.vbox = QVBoxLayout() + self.setLayout(self.vbox) + + self.vbox.addWidget( + QLabel("Saved notes are available as a page in your kneeboard.") + ) + + self.textbox = QPlainTextEdit(self) + try: + self.textbox.setPlainText(self.game.notes) + self.textbox.moveCursor(QTextCursor.End) + except AttributeError: # old save may not have game.notes + pass + self.textbox.move(10, 10) + self.textbox.resize(600, 450) + self.textbox.setStyleSheet("background: #1D2731;") + self.vbox.addWidget(self.textbox) + + self.button_row = QHBoxLayout() + self.vbox.addLayout(self.button_row) + + self.clear_button = QPushButton(self) + self.clear_button.setText("CLEAR") + self.clear_button.setProperty("style", "btn-primary") + self.clear_button.clicked.connect(self.clearNotes) + self.button_row.addWidget(self.clear_button) + + self.save_button = QPushButton(self) + self.save_button.setText("SAVE") + self.save_button.setProperty("style", "btn-success") + self.save_button.clicked.connect(self.saveNotes) + self.button_row.addWidget(self.save_button) + + def clearNotes(self) -> None: + self.textbox.setPlainText("") + + def saveNotes(self) -> None: + self.game.notes = self.textbox.toPlainText() + self.save_button.setText("SAVED") + QTimer.singleShot(5000, lambda: self.save_button.setText("SAVE")) diff --git a/resources/ui/misc/dark/notes.png b/resources/ui/misc/dark/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb0f1eb5ac50255d7c2db71c48bb0a2aad5c639 GIT binary patch literal 3243 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 literal 0 HcmV?d00001 diff --git a/resources/ui/misc/light/notes.png b/resources/ui/misc/light/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1300fc28f618acc6ef055af7654dc17f94ff72 GIT binary patch literal 3536 zcmV;>4KMPEP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0008}Nklnl-!mESwAD&1U!R-DF_cJ;ObhIp2IU z=er3>0IPvxK!SKS3XA~vf$^$#O6rj`s@g0sDJQ8QX`>{fdO}hbSYY{#$2ffwnCsSA zU?=b<%I1Xr)t~^}1Nvel&<1o^2?Q*%{~f@~C?$}jUy{12fzJ6Odq-AMr=$^E4@;$7n6M;n0WDDz z*a9?1JoysfH1OTl^IhEA%1R9O)(_;3OqF~9xCvYYh5|}C&sc1tni8BhkHUwd`@hsm z;SZE?NkvYe)XO8!G`BAWG)CD}DuE3VNjO~+Z!0{r)ew7HDuFw|!Ah`Iune%qbw}{q z1Uv)QS*#vd6;5D<>+85S2UzabDQm}G>oRXY!wDP*?v`k!s5S|_0)7~Z2^;UHfmVB_ z5BLBa29n_f27tZPZoZ4w1DjmzEATNWbDG&Pg=&voPz}HypxqLh3@6Y8TsD@*u_AE6 zkjw*hPOx+Vo#yk5tR2B^_*>E$Nl#R}6(lv;I|H$D+hSuD%Sq~%G^GSNgDP1A{QbaV zYcqh?z$J?}7*TsIHYI^0z&>}e#Hsx@;FPVu0f&I+uCv}-SNtbPf)Y@p_c-W-Qaq3} zX|W-TO%WtBVf*c5^+vGmz;0{ngx!iQMo^|h;D)3@N#haxlapM{My$Y!Ce5<8&PZx4 zg<6;co2!_DYaP+9+U+-H%DT>t^o()qT@*pmXW}9s!9P10-|i;h0lN>pOn*^H71u(- z#a5D_zlTF}VW8apnHa_AfIkL%qZ_*kD?_RpO&G_LZscaIjBPe>A}b=rlwklpCNk2% z6`OcCG}5#EX*QiGxo#765Li|Yfl(1K6^ literal 0 HcmV?d00001 diff --git a/resources/ui/misc/notes.png b/resources/ui/misc/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1300fc28f618acc6ef055af7654dc17f94ff72 GIT binary patch literal 3536 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 literal 0 HcmV?d00001 diff --git a/resources/ui/misc/original/notes.png b/resources/ui/misc/original/notes.png new file mode 100644 index 0000000000000000000000000000000000000000..1223307a4646c32499d70fa92fce61e03c0a6fe9 GIT binary patch literal 3435 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