Compare commits

...

456 Commits

Author SHA1 Message Date
Lucio Andrés Illanes Albornoz
22db646b91 assets/text/README.md: updated. 2020-03-28 10:37:39 +01:00
Lucio Andrés Illanes Albornoz
b77db5eb4b libgui/GuiCanvasWxBackend.py:resize(): correctly set self.cellSize on non-Windows platforms (via blowfish.) 2020-03-28 10:31:47 +01:00
Lucio Andrés Illanes Albornoz
8fabe15792 libgui/GuiCanvasWxBackend.py: only import WinDLL from ctypes if platform.system() == "Windows" (via blowfish.) 2020-03-27 18:13:26 +01:00
Lucio Andrés Illanes Albornoz
d545a7447e assets/audio/roarspoke15.wav: added.
libroar/RoarCanvasCommandsFile.py: melp?
roar.py: fix typo (via wr34k.)
2020-01-15 10:49:05 +01:00
Lucio Andrés Illanes Albornoz
c8a048403a Hard-wire default canvas size on New to [100, 30]. 2019-10-25 13:21:48 +02:00
Lucio Andrés Illanes Albornoz
0c66f94797 Cleanup, bugfixes & C++ backend implementation.
1) {About,Melp?} window: switch to green on black.
2) Assets window: scroll assets list on selected item update w/ <Cursor> or on deletion.
3) Canvas window: change default brush colours to [3, -1].
4) Canvas window: copy canvas cells given transparent cells from tools.
5) Canvas window: don't disable {re,un}do during object tool usage.
6) Canvas window: don't hide cursor during {re,un}do.
7) Canvas window: draw new cells using current brush background colour on resize.
8) Canvas window: fix memory leak on cell size updating.
9) Text tool: process [\r\n] in text pasted from clipboard.

assets/audio/roar{vap0r[1-8],viking[1-5]}.wav: added.
assets/text/README.txt: updated.
assets/tools/AnsiToMiRCART.py: added (for spoke.)
assets/tools/deploy-python.sh: updated.
2019-10-24 21:14:00 +02:00
Lucio Andrés Illanes Albornoz
90840bd0a0 Various bugfixes & usability improvements.
1) Canvas window: clear new canvases w/ [-1, -1] by default.
2) Canvas window: don't create new canvas on initialisation.
3) Canvas window: set default brush colours to [3, 9].
4) Erase tool: correctly fill non-text cells w/ background colour.
5) GUI: correctly show current operator name in status bar whilst active.
6) GUI: {de,in}crease canvas {height,width} w/ <Ctrl> & cursor keys.
7) GUI: disable tiling items unless current tool is object tool.
8) GUI: select tool w/ <F2-F10> accelerators.
2019-10-01 21:34:42 +02:00
Lucio Andrés Illanes Albornoz
bc969295dd Various bugfixes & usability improvements.
1) Backend: initial optimised cell rendering Python C module implementation skeleton.
2) Backend: raise alpha blending {fore,back}ground colour coefficient to {0.8,1.0 - 0.8}, resp.
3) Backend: reimplement cell rendering using Draw{Rectangle,Text}List().
4) Canvas window: eliminate {canvas,{scroll,tool}bar} flickering during resize.
5) Canvas window: fix cursor artifacts during resizing by masking cursor.
6) Canvas window: restore cursor after executing operations that remove it.
7) Import store: correctly parse non-conforming \u0003,<bg colour> sequences.
8) GUI: correctly save list of recently used files post-update.
2019-10-01 19:03:29 +02:00
Lucio Andrés Illanes Albornoz
e1bf3a3ad4 assets/images/roar.png: updated. 2019-09-28 20:25:03 +02:00
Lucio Andrés Illanes Albornoz
1fd0768912 Apply tool w/ mouse state on brush/colour update. 2019-09-28 20:12:53 +02:00
Lucio Andrés Illanes Albornoz
19957a2006 Implements automatic snapshotting & restoring from snapshots. 2019-09-28 19:45:45 +02:00
Lucio Andrés Illanes Albornoz
451a708d7a Minor cleanup & usability improvements.
1) Add format clarification to commands documentation.
2) Allow changing {canvas,brush} size w/ {<Ctrl> <Shift>,<Ctrl>} <Mouse wheel>.
3) Backend: {draw,produce,remove} cursor w/ list of coordinates instead of cells.
4) Update changing rendered cell size hotkey to <Ctrl> <Alt> <Mouse wheel>.
2019-09-28 12:08:52 +02:00
Lucio Andrés Illanes Albornoz
de96a7cdaa Various bugfixes.
1) Fix erroneous canvas repositioning on resize given no docked toolbars.
2) Correctly update scrollbar parameters when changing font (and hence cell) size.
2019-09-28 10:11:49 +02:00
Lucio Andrés Illanes Albornoz
4b98d1cdf1 Various bugfixes & usability improvements.
1)  Assets window: adds clear list context menu item.
2)  Assets window: allow deleting multiple selected items.
3)  Assets window: fix list view cursor key navigation.
4)  Backend: correctly blend transparent background cursor cells with canvas character cells.
5)  Backend: correctly determine cell size & set font size.
6)  Backend: correctly unmask cursor.
7)  Backend: disable font anti-aliasing on Windows.
8)  Backend: render transparent background cells as RGBA #303030FF.
9)  Canvas window: adds <F1> accelerator for `View melp?' menu item.
10) Canvas window: implement {dockable,floating} toolbars w/ wx' AUI framework.
11) Canvas window: separate tools toolbar from edit commands toolbar & dock both on right-hand side alongside each other.
12) Flip horizontally tool: flip characters, including some Unicode symbols.
13) Flip vertically tool: flip additional Unicode symbols.
14) Text tool: don't process keyboard events w/ either of <{Alt,AltGr,Ctrl}> modifiers.

assets/images/roar.png: updated.
2019-09-27 20:17:39 +02:00
Lucio Andrés Illanes Albornoz
2592fa9ad8 Tool bug fixes & usability improvements.
1) Circle, rectangle tool: initiate dragging with <Ctrl>, conclude w/ <[LR]MB> release.
2) Circle tool: fix artifacts and radius inference from brush size.
3) Line tool: fix origin point artifacts.
4) Rectangle tool: correctly determine target point.
2019-09-27 14:22:58 +02:00
Lucio Andrés Illanes Albornoz
fe6b79a2ab Implement {circle,rectangle} dragging w/ <Ctrl>.
assets/text/hotkeys.txt: updated.
assets/text/TODO: updated.
2019-09-26 23:34:01 +02:00
Lucio Andrés Illanes Albornoz
50edb55e0b Fix brush size toolbar items. 2019-09-26 23:15:56 +02:00
Lucio Andrés Illanes Albornoz
76e57bd081 Improve backend latency and throughput via batching.
assets/text/TODO: updated.
libtools/ToolLine.py: reflect brush width in pre-line dragging cursor.
2019-09-26 22:38:28 +02:00
Lucio Andrés Illanes Albornoz
86e2c9e904 Various bugfixes & usability improvements.
1) Correctly unmask cursor and dispatch delta patches on successful {re,un}do.
2) Don't prompt to save twice on exit via Exit {accelerator,menu item}.
3) Fix cursor artifacts by always resetting origin point on DC whilst unmasking cursor cells.
4) Fix {re,un}do {accelerator,{menu,toolbar} item} desynchronisation with actual canvas journal undo level.
5) Remove scattered remnants of initial implementation of unimplemented italic support.
6) Replace rendering transparent cursor w/ manual blending over wx.GraphicsContext() due to canvas bitmap masking & performance degradation.

assets/text/TODO: updated.
2019-09-26 14:06:11 +02:00
Lucio Andrés Illanes Albornoz
0750bc2261 assets/audio/roardaemon1.wav: added.
assets/text/TODO: updated.
2019-09-25 22:29:48 +02:00
Lucio Andrés Illanes Albornoz
c45a616442 Only allow setting selection w/ <Esc> post-selection. 2019-09-24 18:12:50 +02:00
Lucio Andrés Illanes Albornoz
e2183acf46 Update canvas filename on save as.
libroar/RoarCanvasCommandsFile.py:{_importFile,canvasSaveAs}(): fix return values.
2019-09-24 18:09:05 +02:00
Lucio Andrés Illanes Albornoz
279cca3313 Prompt to save changes on application exit. 2019-09-24 18:08:49 +02:00
Lucio Andrés Illanes Albornoz
286df901a7 assets/images/roar.png: updated. 2019-09-24 18:00:21 +02:00
Lucio Andrés Illanes Albornoz
50c9d69309 Fix underlined cells rendering line width. 2019-09-24 17:59:51 +02:00
Lucio Andrés Illanes Albornoz
fdcf242884 assets/audio/roarspoke1[234].wav: added. 2019-09-24 17:53:29 +02:00
Lucio Andrés Illanes Albornoz
b479e7ddbb Remove cursor before {re,un}doing to prevent artifacts.
assets/text/TODO: updated.
2019-09-24 17:45:18 +02:00
Lucio Andrés Illanes Albornoz
9eec4f58ab Increase roar window height to match default canvas size.
{assets/tools,lib{canvas,gui,roar,rtl,tools}}/*.py: remove Vim fold marker remnants.
2019-09-24 17:02:02 +02:00
Lucio Andrés Illanes Albornoz
a3d1ed3d96 libroar/RoarWindowMelp.py: set button accelerator. 2019-09-24 16:59:51 +02:00
Lucio Andrés Illanes Albornoz
84d20a4398 Adds GitHub & (hotkey) help dialogue menu items.
assets/text/hotkeys.txt: updated.
assets/text/TODO: updated.
libtools/ToolText.py: minor cleanup.
2019-09-24 16:46:02 +02:00
Lucio Andrés Illanes Albornoz
6ab7c443eb Erase back- w/ foreground colour on <RMB>.
assets/text/hotkeys.txt: updated.
assets/text/TODO: updated.
2019-09-24 15:44:54 +02:00
Lucio Andrés Illanes Albornoz
c083800b3b Don't show error when cancelling assets loading. 2019-09-24 15:13:48 +02:00
Lucio Andrés Illanes Albornoz
35f6910427 Load & store LRU file dialogue directory.
assets/text/TODO: updated.
2019-09-24 15:10:34 +02:00
Lucio Andrés Illanes Albornoz
c7dd80327d Fix canvas windows size regarding scrollbars.
assets/text/TODO: updated.
libroar/RoarClient.py: I FUCKING _HATE_ WXPYTHON
2019-09-24 14:39:37 +02:00
Lucio Andrés Illanes Albornoz
a2295d1cfc Various bugfixes & usability improvements.
1) Directly render characters to canvas DC w/ clipping.
2) Fix background colour toolbar icon bitmaps.
3) Line tool: correctly set brush colours whenever updated.
4) Line tool: fix artifacts bug.
5) Render tool cursor transparently at opacity 200 (out of 255.)

assets/text/TODO: updated.
2019-09-24 14:03:16 +02:00
Lucio Andrés Illanes Albornoz
e68cae09b5 assets/text/TODO: updated. 2019-09-23 22:46:11 +02:00
Lucio Andrés Illanes Albornoz
3eb4eaeea5 RoarWindowAbout.py: add website URL. 2019-09-23 22:32:37 +02:00
Lucio Andrés Illanes Albornoz
dc8b96146e Further shorten {file,operator,tool} status bar items.
assets/images/roar.png: updated.
2019-09-23 22:25:32 +02:00
Lucio Andrés Illanes Albornoz
e0a9c97343 assets/images/tool{Erase,PickColour}.png: updated. 2019-09-23 22:18:40 +02:00
Lucio Andrés Illanes Albornoz
c355e848b2 Implements pick colour tool.
assets/text/TODO: updated.
2019-09-23 22:12:20 +02:00
Lucio Andrés Illanes Albornoz
cefb982c1d Implements erase tool.
assets/text/TODO: updated.
2019-09-23 21:59:41 +02:00
Lucio Andrés Illanes Albornoz
1d650bd64b Allow purging MRU list manually & on failure.
assets/text/TODO: updated.
2019-09-23 21:37:52 +02:00
Lucio Andrés Illanes Albornoz
600cecfad1 Fix ANSI underline encoding, 2019-09-23 20:42:30 +02:00
Lucio Andrés Illanes Albornoz
b1de2eda79 Fix ANSI<->mIRC colour conversion. 2019-09-23 20:34:55 +02:00
Lucio Andrés Illanes Albornoz
9c03910420 Fix canvas windows size regarding scrollbars. 2019-09-23 20:24:18 +02:00
Lucio Andrés Illanes Albornoz
e6e0951029 Convert tabs to position-modulated run of whitespaces. 2019-09-23 19:56:10 +02:00
Lucio Andrés Illanes Albornoz
a48d7f3d32 Fix dirty flag updating on {new,open,resize}.
assets/text/hotkeys.txt: updated.
assets/text/TODO: updated.
2019-09-23 19:55:31 +02:00
Lucio Andrés Illanes Albornoz
bff70b409b {assets/tools,lib{canvas,gui,roar,rtl,tools}}/*.py: fix formatting. 2019-09-23 19:21:06 +02:00
Lucio Andrés Illanes Albornoz
0843b7d330 Allow cancelling & setting object selection w/ <Esc>. 2019-09-23 19:19:43 +02:00
Lucio Andrés Illanes Albornoz
724b460be1 assets/images/roar.png: updated. 2019-09-23 19:02:15 +02:00
Lucio Andrés Illanes Albornoz
6fcac2b3b9 libroar/RoarCanvasCommands.py:update(): shorten {file,operator,tool} status bar items.
assets/text/TODO: updated.
2019-09-23 18:59:18 +02:00
Lucio Andrés Illanes Albornoz
f504fa2b76 Various bugfixes & usability improvements.
1)  Add background colour toolbar beneath (foreground) colour toolbar.
2)  Add colour flipping command w/ {accelerator,{menu,toolbar} item}.
3)  Add {de,in}crease {brush,canvas} size accelerator.
4)  Add {hide,show} assets window toolbar item.
5)  Circle tool: draw outline with foreground colour.
6)  Circle tool: honour transparency.
7)  Fill tool: change comprehensive fill modifier key from <Shift> to <Ctrl>.
8)  Fill tool: fill with {back,fore}ground colour given <[RL]MB>
9)  Fix arrow keys cursor motion when scrolled down.
10  Instantly reflect {brush size,colour,tool} changes in canvas.
11) Object tool: honour transparency w/ non-external objects.
12) Object tool: update selection rectangle during <LMB> whilst dragging, set w/ release of <LMB>.
13) Rectangle tool: draw outline with foreground colour.
14) Rectangle tool: honour transparency.
15) Replace wx.ToolBar() w/ wx.lib.agw.aui.AuiToolBar() & custom wx.lib.agw.aui.AuiDefaultToolBarArt().
16) Restore scrolling position after resizing canvas.

.TODO: deleted.
assets/audio/roar{arab8,spoke11}.wav: added.
assets/text/hotkeys.txt: added to document hotkeys.
assets/text/requirements.txt, requirements.txt: moved.
assets/text/TODO: updated.
{assets/tools,lib{canvas,gui,roar,rtl,tools}}/*.py: remove Vim fold markers.
libroar/RoarCanvasCommandsFile.py:_importFile(): update wx.FileDialog() message.
libroar/RoarCanvasCommandsOperators.py:canvasOperator(): update invert colours {caption,label}.
2019-09-23 18:49:33 +02:00
Lucio Andrés Illanes Albornoz
eb3795a98e Initial {rotate,tile} operator implementation. 2019-09-23 09:21:57 +02:00
Lucio Andrés Illanes Albornoz
62e7edc852 assets/tools/deploy-python.sh: updated. 2019-09-19 13:40:58 +02:00
Lucio Andrés Illanes Albornoz
5320e45651 assets/audio/roar{arab7,spoke10}.wav: added. 2019-09-19 13:37:51 +02:00
Lucio Andrés Illanes Albornoz
74a0ef6df8 assets/text/TODO: updated. 2019-09-19 07:52:45 +02:00
Lucio Andrés Illanes Albornoz
25c42023f2 .env: added.
.vscode/{roar.code-workspace,settings.json}: added.
2019-09-18 21:12:42 +02:00
Lucio Andrés Illanes Albornoz
1a0e1bf2de assets/audio/roar{arab6,spoke9}.wav: added.
libroar/RoarWindowAbout.py: correctly pick random soundBitePathName.
2019-09-17 08:50:33 +02:00
Lucio Andrés Illanes Albornoz
93c05d6b09 libroar/RoarCanvasWindow.py:onKeyboardInput(): simulate LMB & advance to the right w/ space key except w/ Text tool. 2019-09-16 17:31:17 +02:00
Lucio Andrés Illanes Albornoz
d01cf7d167 assets/images/toolCursor.png: fix mode bits.
libroar/RoarCanvasWindow.py: remove trailing SP.
2019-09-16 17:17:04 +02:00
Lucio Andrés Illanes Albornoz
1c82e723c1 Implements foreground colour accelerators.
libgui/GuiFrame.py:onMenu(): don't call wx.SafeYield() because wxPython doesn't actually know what it wants from you EVER.
libroar/RoarCanvasCommands.py:update(): select tool corresponding to new foreground colour on change thereof.
libroar/RoarCanvasCommandsEdit.py:canvasColour(): specify <Control> <[0-9]> & <Control> <Shift> <[0-5]> accelerators.
libroar/RoarCanvasCommandsEdit.py:canvasColourAlpha(): specify <Control> <Shift> 6 accelerator.
2019-09-16 17:13:55 +02:00
Lucio Andrés Illanes Albornoz
3dae6dadde Decisively vanquish the lion's share of ftupid fucking fcrolling.
libgui/GuiCanvasWxBackend.py: rOAorAoARRAORA ROaroAR RAOAr roar RAOAAAR...
libroar/Roar{AssetsWindow,Canvas{CommandsOperators,Window}}.py: RoaWORAROORAOARORARARRA!!
libtools/Tool{,Circle,Fill,Line,Object,Rect,Text}.py: ROAOaRoaROAROAROOAAAARORORAOR?
assets/text/TODO: updated.
2019-09-16 16:54:07 +02:00
Lucio Andrés Illanes Albornoz
187dfa6355 libtools/ToolText.py:arabicCombiningRegEx: added.
libtools/ToolText.py:onKeyboardEvent(): skip combining Arabic characters.
2019-09-16 14:52:11 +02:00
Lucio Andrés Illanes Albornoz
deba33deba Initial implementation of Arabic character reshaping & handling.
libgui/GuiCanvasWxBackend.py:{arabicShapes{},_reshapeArabic()}: initial implementation.
libgui/GuiCanvasWxBackend.py:draw{CursorMaskWithJournal,Patch}(): update type signature.
libgui/GuiCanvasWxBackend.py:drawPatch(): call _reshapeArabic() on Arabic character patches.
libroar/Roar{Assets,Canvas}Window.py: pass updated set of arguments to backend.draw{CursorWithMask,Patch}().
libtools/ToolText.py:{arabicRegEx{},_checkRtl()}: initial implementation.
libtools/ToolText.py:_processKeyChar(): call _checkRtl().
libtools/ToolText.py:onKeyboardEvent(): initial implementation of RTL backspace support.
assets/text/TODO: updated.
2019-09-16 14:13:44 +02:00
Lucio Andrés Illanes Albornoz
366a958fdb libtools/ToolObject.py:_mouseEventTsTarget(): fix return value. 2019-09-16 11:42:50 +02:00
Lucio Andrés Illanes Albornoz
632e3a8ac1 libroar/RoarCanvasCommandsOperators.py:canvasOperator(): correctly {pass,set} parentCanvas.dirty.
assets/text/TODO: updated.
2019-09-16 11:38:14 +02:00
Lucio Andrés Illanes Albornoz
c93c8dd8b0 libroar/RoarCanvasCommandsTools.py:canvasTool(): call dropTarget.done() when setting new tool from external object as current tool. 2019-09-16 11:23:47 +02:00
Lucio Andrés Illanes Albornoz
5ad678bf4c Allow pasting text when using text tool.
libtools/ToolText.py:{_processKeyChar,onKeyboardEvent}(): split from onKeyboardEvent().
libtools/ToolText.py:onKeyboardEvent(): obtain & iteratively _processKeyChar() clipboard text on <Control> V.
libtools/ToolText.py:onKeyboardEvent(): dispatch cursor patch once after {drawing,pasting}.
assets/text/TODO: updated.
2019-09-16 11:15:23 +02:00
Lucio Andrés Illanes Albornoz
9752a8e6ce Honour RTL flow in text tool.
libtools/ToolText.py:rtlRegEx: added.
libtools/ToolText.py:onKeyboardEvent(): move backwards given RTL keyChar.
assets/text/TODO: updated.
2019-09-16 10:09:25 +02:00
Lucio Andrés Illanes Albornoz
99369626c4 Fully implement {{arrow keys,backspace,enter},arrow keys} in {text,} tool{,s}.
libroar/RoarCanvasWindow.py:applyTool(): delegate updating of brushPos to ToolText if current tool.
libroar/RoarCanvasWindow.py:applyTool(): fix function result.
libroar/RoarCanvasWindow.py:applyTool(): pass updated set of arguments to on{Keyboard,Mouse}Event().
libroar/RoarCanvasWindow.py:onKeyboardInput(): allow wrapping around canvas when receiving cursor key input.
libroar/RoarCanvasWindow.py:onKeyboardInput(): supply keyCode or None to applyTool().
libroar/RoarCanvas{CommandsTools,Window}.py: supply keyCode or None to applyTool().
libtools/Tool{,Circle,Fill,Line,Object,Rect}.py:on{Keyboard,Mouse}Event(): update type signature.
libtools/ToolText.py:onKeyboardEvent(): fully implement {arrow keys,backspace,enter}.
libtools/ToolText.py:onKeyboardEvent(): update cursor when necessary.
libtools/ToolText.py:onMouseEvent(): correctly set brushPos if mouseLeftDown or mouseRightDown.
libtools/ToolText.py:__init__(): removed.
assets/text/TODO: updated.
2019-09-16 09:55:30 +02:00
Lucio Andrés Illanes Albornoz
299a045aa9 libcanvas/CanvasExportStore.py:exportTextBuffer(): correctly encode {bold,underline} cell state changes. 2019-09-16 08:52:04 +02:00
Lucio Andrés Illanes Albornoz
72b96b7c77 libtools/ToolFill.py: honour cell background colour & character on LMB, cell background colour only on RMB. 2019-09-16 08:45:03 +02:00
Lucio Andrés Illanes Albornoz
70d7995b20 Fix underlined cells rendering.
libgui/GuiCanvasWxBackend.py: FUCK YOU WXPYTHON
assets/text/TODO: updated.
2019-09-16 08:39:55 +02:00
Lucio Andrés Illanes Albornoz
3c0606a390 liboperators/OperatorFlipVertical.py:{flipPairs,apply()}: correctly flip flippable text characters.
assets/text/TODO: updated.
2019-09-16 08:13:55 +02:00
Lucio Andrés Illanes Albornoz
aef7f629d0 libroar/RoarCanvasCommandsFile.py:canvasSaveAs(): fix self.canvasPathName reference.
libroar/RoarCanvasWindow.py:applyTool(): don't dispatch cursor patch if mapPoint == None.
libroar/RoarCanvasWindow.py:applyTool(): correctly handle cursor tool.
assets/text/TODO: updated.
2019-09-16 08:05:50 +02:00
Lucio Andrés Illanes Albornoz
df8ee6fedf Implements cursor tool & arrow keys navigation.
assets/images/toolCursor.png: added.
libroar/Roar{CanvasCommands{,Tools},Client}.py: adds cursor tool.
libroar/RoarCanvasWindow.py:applyTool(): dummy-handle cursor tool.
libroar/RoarCanvasWindow.py:onKeyboardInput(): update cursor position & cursor on {down,left,right,up} arrow key input.
assets/text/TODO: updated.
2019-09-15 21:33:19 +02:00
Lucio Andrés Illanes Albornoz
aed3f7157c Implements invert colours operator.
liboperators/OperatorInvert.py: initial implementation.
libroar/RoarCanvasCommandsOperators.py: adds OperatorInvert.
assets/text/TODO: updated.
2019-09-15 20:43:49 +02:00
Lucio Andrés Illanes Albornoz
af5363cf04 assets/images/roar.png: updated. 2019-09-15 20:31:40 +02:00
Lucio Andrés Illanes Albornoz
e71f11ddad libtools/ToolObject.py:_mouseEventTsSelect(): reset object{Map,Size} when resetting to TS_NONE. 2019-09-15 19:37:10 +02:00
Lucio Andrés Illanes Albornoz
78b567d42b Fix assets management canvas panel scrolling.
libgui/GuiWindow.py: ONCE, THERE WAS A _LETHALLY FUCKING WOUNDED_ WXPYTHON
libroar/RoarAssetsWindow.py: ON THE VERY EDGE OF ITS MISERABLE EXISTENCE
libroar/RoarCanvasWindow.py: BECAUSE A LION VICIOUSLY MAULED IT AND TORTURED IT FOR 392 DAYS AND TWO (2) SECONDS
2019-09-15 16:54:19 +02:00
Lucio Andrés Illanes Albornoz
9f72bd5a4c Inhibit {drag & drop,{un,re}do} during object tool usage.
libroar/RoarCanvasCommands.py:update(): disable {re,un}do {menu,toolbar} items on lastPanelState["undoInhibit"].
libroar/RoarCanvasWindow.py:applyTool(): call commands.update(undoInhibit=True) after active object tool usage.
libroar/RoarCanvasWindow.py:OnDropText(): inhibit during active object tool usage.
2019-09-15 16:04:38 +02:00
Lucio Andrés Illanes Albornoz
1487f2eb9a libroar/RoarCanvasWindow.py:onKeyboardInput(): enter pdb on <Shift> <Pause>. 2019-09-15 15:17:27 +02:00
Lucio Andrés Illanes Albornoz
d7ebed77f7 libroar/RoarCanvasWindow.py:RoarCanvasWindowDropTarget.{done,OnDropText,__init__}(): {honour,set} inProgress.
libroar/RoarCanvasWindow.py:applyTool(): call dropTarget.done() when resetting to last tool.
2019-09-15 13:57:41 +02:00
Lucio Andrés Illanes Albornoz
a40017b607 Implements object tool operators context menu.
libgui/GuiFrame.py: _FUCK_ _YOU_ WXPYTHON
libroar/RoarCanvasCommandsOperators.py: I _FUCKING_ _HATE_ WXPYTHON
libroar/RoarCanvasWindow.py: DIE IN A DITCH WXPYTHON YOU ROTTING PILE OF FUCKING HIPPOPOTAMUS SHIT
libroar/RoarClient.py: I HATE WXPYTHON I HATE WXPYTHON I HATE WXPYTHON I HATE WXPYTHON I HATE WXPYTHON
2019-09-15 13:52:44 +02:00
Lucio Andrés Illanes Albornoz
1c7524ba6f libroar/RoarCanvasWindow.py:onPaint(): invariably remove cursor prior to calling backend.onPaint().
libroar/RoarCanvasWindow.py:onScroll(): removed.
2019-09-15 12:58:39 +02:00
Lucio Andrés Illanes Albornoz
866ef19966 libroar/RoarCanvasCommands.py:update(): disable undo if on last undo item. 2019-09-15 12:52:27 +02:00
Lucio Andrés Illanes Albornoz
245925406e libgui/GuiFrame.py:{_init,load}Menu(): split from loadMenu(), implement nested (sub)menus.
libroar/RoarCanvasCommandsEdit.py: put {brush,canvas} size commands into submenu.
libroar/RoarCanvasCommandsFile.py: put {ex,im}port commands into submenu.
assets/text/TODO: updated.
2019-09-15 12:41:14 +02:00
Lucio Andrés Illanes Albornoz
7226639977 Replace RMB w/ LMB outside of region as end selection UI.
libtools/ToolObject.py: cleanup.
assets/text/TODO: updated.
2019-09-15 11:55:59 +02:00
Lucio Andrés Illanes Albornoz
e2f413e4ba Implements merged object tool & flip operators.
assets/images/toolObject.png: added.
liboperators/Operator{,Flip{Horizontal,Vertical}}.py: initial implementation.
libroar/RoarCanvasCommands.py: adds RoarCanvasCommandsOperators.
libroar/RoarCanvasCommandsOperators.py: initial implementation.
libroar/Roar{CanvasCommands{,Tools},Client}.py: replaces ToolSelect{Clone,Move} w/ ToolObject.
libroar/RoarCanvasWindow.py:RoarCanvasWindowDropTarget.OnDropText(): update ToolObject() invocation.
libroar/RoarCanvasWindow.py:{applyTool,onMouseInput}(): pass keyModifiers to Tool.onMouseEvent().
libroar/RoarCanvasWindow.py:applyTool(): only switch back to lastTool if current object tool contains an external object.
libroar/RoarCanvasWindow.py:onLeaveWindow(): disable hiding cursor for now.
libtools/Tool{,Circle,Fill,Line,Rect,Text}.py:onMouseEvent(): update type signature.
libtools/Tool{Object,Select{,Clone,Move}}.py: merged into libtools/ToolObject.py.
roar.py: add liboperators to sys.path[].
assets/text/TODO: updated.
2019-09-15 11:06:25 +02:00
Lucio Andrés Illanes Albornoz
d67dd317a1 libtools/Tool.py:Tool(): derive from object. 2019-09-14 17:11:08 +02:00
Lucio Andrés Illanes Albornoz
9cc6364a08 assets/images/roar.png: updated. 2019-09-14 16:29:51 +02:00
Lucio Andrés Illanes Albornoz
ddec3cefeb libroar/RoarWindowAbout.py, assets/tools/deploy-python.sh: updated. 2019-09-14 16:16:36 +02:00
Lucio Andrés Illanes Albornoz
25c9e88484 libgui/GuiCanvasWxBackend.py:resize(): set font size from cellSize[0] + 1 vs. hard-wired 8.
libroar/RoarCanvasWindow.py:{onMouseWheel,__init__}(): {de,in}crease cell size w/ <Ctrl> <Mouse Wheel>.
assets/text/TODO: updated.
2019-09-14 15:44:17 +02:00
Lucio Andrés Illanes Albornoz
0e4915351e libgui/GuiFrame.py:onMenu(): clear event queue after calling command function. 2019-09-14 15:20:20 +02:00
Lucio Andrés Illanes Albornoz
bdc8bcd494 Implements recently used {directory,files} in {assets,application} windows & file dialogues.
libgui/GuiFrame.py:GuiSubMenuDecorator(): added.
libgui/GuiFrame.py:loadMenus(): process submenu menu items.
libroar/RoarCanvasCommandsFile.py:{_{load,push}Recent,canvasOpenRecent}(): initial implementation.
libroar/RoarCanvasCommandsFile.py:_import{,File}(): return pathname along w/ rc.
libroar/RoarCanvasCommandsFile.py:canvas{Open,SaveAs}(): call _pushRecent() post-{open,save}.
libroar/RoarCanvasCommandsFile.py:__init__(): updated.
librtl/RtlPlatform.py: added.
librtl/RtlPlatform.py:getLocalConfPathName(): initial implementation.
roar.py: manually call _loadRecent() & _pushRecent() post-import.
assets/text/TODO: updated.
2019-09-14 15:16:57 +02:00
Lucio Andrés Illanes Albornoz
075bff0644 bcanvas/CanvasImportStore.py:importTextBuffer(): handle exceptions. 2019-09-14 11:52:24 +02:00
Lucio Andrés Illanes Albornoz
c049181ceb libroar/RoarAssetsWindow.py:{_importFiles, on{Load,Save}List,__init__}(): {pass,receive} lastDir {before,after} wx.FileDialog()s.
libroar/RoarCanvasCommandsFile.py:{_importFile,canvasExportAs{Ansi,Png},SaveAs,__init__}(): {pass,receive} lastDir {before,after} wx.FileDialog()s.
2019-09-14 11:49:08 +02:00
Lucio Andrés Illanes Albornoz
67f2d11240 libroar/RoarCanvasWindow.py:onScroll(): hide cursor when scrolling. 2019-09-14 11:33:13 +02:00
Lucio Andrés Illanes Albornoz
9e2d9d1419 .gitignore: ignore build/. 2019-09-14 11:29:26 +02:00
Lucio Andrés Illanes Albornoz
6d12c04349 setup.py: added.
requirements.txt: updated.
2019-09-14 11:23:29 +02:00
Lucio Andrés Illanes Albornoz
cab0478c39 roar.py: fix argument handling. 2019-09-14 11:21:40 +02:00
Lucio Andrés Illanes Albornoz
b1cc38a8e7 requirements.txt: added (via Civil.) 2019-09-14 11:05:05 +02:00
Lucio Andrés Illanes Albornoz
5123a016e8 libroar/RoarAssetsWindow.py:{_load_list,onLoadList}(): split from onLoadList().
roar.py: optionally load assets list from argv[2].
2019-09-14 10:52:05 +02:00
Lucio Andrés Illanes Albornoz
243311c091 libtools/ToolObject.py:onSelectEvent(): obtain correct canvas map cell given transparent object selection cell. 2019-09-14 10:49:11 +02:00
Lucio Andrés Illanes Albornoz
f65fe72cea libroar/RoarCanvasCommandsFile.py:canvasSave{,As}(): don't reset dirty on canvasSaveAs(). 2019-09-13 21:14:11 +02:00
Lucio Andrés Illanes Albornoz
74e2bf7f49 libgui/GuiCanvasWxBackend.py:GuiBufferedDC.__init__(): directly select buffer into DC.
libroar/RoarCanvasWindow.py:applyTool(): normalise mapPoint w/ viewRect if mapPoint != None.
2019-09-13 21:09:51 +02:00
Lucio Andrés Illanes Albornoz
2fa06043c6 libroar/RoarCanvasWindow.py:applyTool(): only call tool.onMouseEvent() if mouse state has changed since the last call & update lastCellState.
libroar/RoarCanvasWindow.py:{on{Enter,Leave}Window,__init__}(): reset lastCellState.
2019-09-13 20:20:26 +02:00
Lucio Andrés Illanes Albornoz
2c8fa89eda libgui/GuiCanvasWxBackend.py:{resize,__init__}(): restrict external font loading to Windows (via sym.)
assets/text/TODO: updated.
2019-09-13 10:03:39 +02:00
Lucio Andrés Illanes Albornoz
6e470c93d0 libgui/GuiCanvasWxBackend.py: render transparent cells as dark grey `░'. 2019-09-12 21:01:06 +02:00
Lucio Andrés Illanes Albornoz
a4a9c9a2d5 libtools/ToolSelectMove.py: exclude sub-cells of both of {select,src}Rect from being cleared.
libtools/ToolSelect.py: minor cleanup.
2019-09-12 20:09:11 +02:00
Lucio Andrés Illanes Albornoz
ec515d4ed4 libroar/RoarCanvasWindow.py:dispatchDeltaPatches(): remove cursor prior to updating canvas. 2019-09-12 17:03:21 +02:00
Lucio Andrés Illanes Albornoz
3e4644122b libtools/ToolSelect.py: fix function signatures. 2019-09-12 16:55:03 +02:00
Lucio Andrés Illanes Albornoz
31b45d1076 libcanvas/CanvasJournal.py:end(): purge patchesUndo if at patchesUndoLevel > 0.
assets/text/TODO: updated.
2019-09-12 16:39:17 +02:00
Lucio Andrés Illanes Albornoz
6e05238efa libcanvas/CanvasJournal.py:{begin,end,updateCurrentDeltas}(): {insert,delete,append} at patchesUndoLevel.
libgui/GuiWindow.py:{onEnterWindow,__init__}(): bind wx.EVT_ENTER_WINDOW.
libroar/RoarCanvasWindow.py:applyTool(): only call tool.onMouseEvent() if mouse has moved to another cell since the last dirtying call & update lastDirtyCell.
libroar/RoarCanvasWindow.py:{onEnterWindow,onLeaveWindow,__init__}(): reset lastDirtyCell.
libroar/RoarCanvasWindow.py:__init__():
assets/text/TODO: updated.
2019-09-12 16:24:53 +02:00
Lucio Andrés Illanes Albornoz
b6c063c5d3 Initial implementation of assets window & external object tool.
libgui/GuiFrame.py:GuiMiniFrame(): added as sub-class of wx.MiniFrame().
libgui/GuiWindow.py:RoarCanvasWindowDropTarget(): initial implementation.
libgui/GuiWindow.py:__init__(): receive & pass optional style parameter.
libgui/GuiWindow.py:__init__(): set drop target.
libroar/RoarAssetsWindow.py: initial implementation.
libroar/RoarClient.py:__init__(): add RoarAssetsWindow().
libtools/ToolObject.py: initial implementation.
assets/text/TODO: updated.
2019-09-12 12:49:53 +02:00
Lucio Andrés Illanes Albornoz
99e746f090 libgui/GuiCanvasWxBackend.py:_drawCharPatch(): fix underscore rendering.
libgui/GuiCanvasWxBackend.py:_get{Brush,Char}PatchColours(): fix {back,fore}ground colour {brush{,es},pen}.
assets/text/TODO: updated.
2019-09-12 11:26:17 +02:00
Lucio Andrés Illanes Albornoz
6dad3c7798 libtools/ToolText.py: ignore non-printable key events. 2019-09-12 10:28:56 +02:00
Lucio Andrés Illanes Albornoz
3f992ec44f assets/text/{arab-spokelion,spoke-arablion}.txt: ROAR! 2019-09-12 10:09:41 +02:00
Lucio Andrés Illanes Albornoz
9de3372a80 libtools/Tool{,Circle,Fill,Line,Rect,Select,Text}.py: sync function signature comments. 2019-09-12 10:08:14 +02:00
Lucio Andrés Illanes Albornoz
8485ab568d libroar/RoarCanvasCommandsEdit.py:canvasColourAlpha_(): fix signature. 2019-09-12 10:03:29 +02:00
Lucio Andrés Illanes Albornoz
7a4e1b23e9 libcanvas/CanvasExportStore.py:exportTextBuffer(): fix transparent colour processing.
libcanvas/CanvasImportStore.py:importTextBuffer(): fix transparent colour processing.
2019-09-12 10:02:41 +02:00
Lucio Andrés Illanes Albornoz
0f88a78639 libgui/GuiCanvasWxBackend.py:resize(): load font named by fontName instead of wx.FONTFAMILY_TELETYPE.
libgui/GuiCanvasWxBackend.py:__init__(): receive & set font{Name,PathName}.
libgui/GuiCanvasWxBackend.py:__init__(): call AddFontResourceW() in lieu of WxPython support FOR ANYTHING THAT GOES BEYOND BEING A BLOODY NON-STOP HINDRANCE.
2019-09-11 15:33:15 +02:00
Lucio Andrés Illanes Albornoz
418d16a81a libgui/GuiFrame.py:{load{Accel,Menu,ToolBar}s,__init__}(): replace lastId w/ wx.NewId(). 2019-09-11 14:45:59 +02:00
Lucio Andrés Illanes Albornoz
3be34bc657 libgui/GuiFrame.py:onMenu(): only dispatch events via itemsById[eventId] if present, skip otherwise. 2019-09-11 14:43:55 +02:00
Lucio Andrés Illanes Albornoz
e30628f28d libroar/RoarCanvasCommandsFile.py:_import(): handle FileNotFoundError exception. 2019-09-11 13:53:48 +02:00
Lucio Andrés Illanes Albornoz
6109e9b38c libgui/GuiCanvasWxBackend.py:GuiBufferedDC(): implement double-buffered wx.MemoryDC() honouring view{Rect,Size}.
libgui/GuiCanvasWxBackend.py:{getDeviceContext,onPaint}(): use GuiBufferedDC() if viewRect > (0, 0).
libroar/RoarCanvas{CommandsTools,Window}.py: updated.
assets/text/TODO: updated.
2019-09-11 09:39:36 +02:00
Lucio Andrés Illanes Albornoz
968e7d45c5 assets/images/logo[12].bmp: updated.
libroar/RoarWindowAbout.py: switch to wx.FlexGridSizer().
assets/text/TODO: updated.
2019-09-10 18:43:08 +02:00
Lucio Andrés Illanes Albornoz
af1ef072ab libroar/RoarWindowAbout.py: cleanup. 2019-09-10 13:24:47 +02:00
Lucio Andrés Illanes Albornoz
5f7f2b0f9c assets/tools/deploy-python.sh: updated. 2019-09-10 12:32:09 +02:00
Lucio Andrés Illanes Albornoz
1156f8b5c3 libroar/RoarCanvasCommands.py: fix base classes order. 2019-09-10 12:30:35 +02:00
Lucio Andrés Illanes Albornoz
bb23efac56 libgui/GuiFrame.py:loadAccels(): obtain from {menu,Toolbar}s[].
libroar/RoarCanvasCommands{,Edit,File,Help,Tools}.py: remove self.accels[].
libroar/RoarClient.py: updated.
2019-09-10 12:28:26 +02:00
Lucio Andrés Illanes Albornoz
309e8cf089 libtools/ToolText.py:onKeyboardEvent(): correctly return (rc, dirty). 2019-09-10 12:20:23 +02:00
Lucio Andrés Illanes Albornoz
fb274c0d66 libroar/RoarCanvas{CommandsTools,Window}.py: explicitly pass canvas.
libtools/Tool{,Circle,Fill,Line,Rect,Select,Text}.py: explicitly receive canvas.
2019-09-10 12:12:12 +02:00
Lucio Andrés Illanes Albornoz
f23101f511 libgui/GuiFrame.py: updated.
libroar/RoarCanvasCommands{,Edit,File,Help,Tools}.py: split from libroar/RoarCanvasInterface.py.
libroar/RoarCanvasWindow.py: updated.
libroar/RoarClient.py: updated.
libroar/RoarWindowAbout.py: renamed from libroar/RoarClientAboutWindow.py.
roar.py: updated.
2019-09-10 12:06:56 +02:00
Lucio Andrés Illanes Albornoz
01ca10be21 libroar/RoarCanvasInterface.py, libgui/GuiCanvasInterface.py: split from libgui/GuiCanvasInterface.py.
libroar/RoarClientAboutWindow.py: merged from libgui/GuiCanvasInterfaceAbout.py.
libgui/GuiFrame.py:Gui{Command{,List},Select}Decorator(): moved from libroar/RoarCanvasInterface.py.
libroar/RoarClient.py: updated.
2019-09-10 10:22:02 +02:00
Lucio Andrés Illanes Albornoz
8fd0294ef8 libroar/RoarClient.py, libgui/GuiFrame.py: split from libgui/GuiFrame.py.
libroar/RoarCanvasWindow.py, libgui/GuiWindow.py: split from libgui/GuiCanvasPanel.py.
roar.py: updated.
2019-09-10 10:14:12 +02:00
Lucio Andrés Illanes Albornoz
116e5915dc libgui/GuiCanvasInterface.py:_import(): call reset{Cursor,Undo}() on journal after importing. 2019-09-09 20:10:52 +02:00
Lucio Andrés Illanes Albornoz
c1ce141700 libcanvas/CanvasJournal.py:begin(): don't reset patchesUndo{[],Level}.
assets/text/TODO: updated.
2019-09-09 19:59:57 +02:00
Lucio Andrés Illanes Albornoz
5f00b60cdd assets/text/TODO: updated. 2019-09-09 19:43:07 +02:00
Lucio Andrés Illanes Albornoz
649f118b20 libgui/GuiCanvasInterfaceAbout.py: update legend. 2019-09-09 19:34:22 +02:00
Lucio Andrés Illanes Albornoz
b50879db5f assets/tools/deploy-python.sh: updated. 2019-09-09 19:33:16 +02:00
Lucio Andrés Illanes Albornoz
a4ee9e9083 libcanvas/CanvasImportStore.py:importTextBuffer(): correctly process mIRC foreground colour sequences.
assets/images/roar.png: updated.
assets/text/arab-puke.txt: removed.
assets/text/spoke-vxplion.txt: added.
2019-09-09 19:29:50 +02:00
Lucio Andrés Illanes Albornoz
bfd8e17b2b libgui/GuiCanvasPanel.py:{onPanelScroll,__init__}(): reset cursor on EVT_SCROLLWIN_LINE{DOWN,UP}. 2019-09-09 19:03:14 +02:00
Lucio Andrés Illanes Albornoz
c2f8fb272e assets/text/TODO: updated. 2019-09-09 18:47:39 +02:00
Lucio Andrés Illanes Albornoz
0fe6899d05 libcanvas/Canvas.py:dispatchPatchSingle(): cloned from dispatchPatch().
lib{canvas/Canvas{,Journal},gui/GuiCanvasPanel}.py: replace dirtyJournal & pushDeltas() w/ explicit {begin,end}().
libgui/GuiCanvasPanel.py:applyTool(): updated.
libgui/GuiCanvasPanel.py:dispatchPatchSingle(): cloned from dispatchPatch().
libtools/Tool{,Circle,Fill,Line,Rect,Select{,Clone,Move},Text}.py:on{Mouse,Keyboard}Event(): return rc, dirty.
libtools/ToolSelect{Clone,Move}.py:onSelectEvent(): return rc, dirty.
2019-09-09 18:43:33 +02:00
Lucio Andrés Illanes Albornoz
b3f587fc73 libgui/GuiCanvasInterface.py:canvasTool(): call applyTool() w/ new tool post-selection.
libgui/GuiCanvasPanel.py:{applyTool,onPanelInput}(): split from onPanelInput().
libtools/Tool{,Circle,Fill,Line,Rect,Select,Text}.py:on{Keyboard,Mouse}Event(): updated.
libtools/ToolFill.py:onMouseEvent(): display cursor.
libtools/ToolSelect{,Clone,Move}.py:onSelectEvent(): updated.
2019-09-09 18:18:54 +02:00
Lucio Andrés Illanes Albornoz
1fe5db9fa6 libgui/GuiCanvasPanel.py:{onPanelSize,__init__}(): call _updateScrollBars() on EVT_SIZE. 2019-09-09 17:34:50 +02:00
Lucio Andrés Illanes Albornoz
c2657eeefd libgui/GuiCanvasPanel.py:_updateScrollBars(): split from resize().
libgui/GuiCanvasPanel.py:_updateScrollBars(): reduce flickering induced by calling SetVirtualSize() when scrollbars are not required.
libgui/GuiCanvasPanel.py:{resize,update}(): updated.
libgui/GuiCanvasWxBackend.py:{reset,__init__}(): removes obsolete reset().
2019-09-09 17:27:37 +02:00
Lucio Andrés Illanes Albornoz
04430e7c0c lib{canvas,gui,rtl,tools}/*.py: remove trailing SP. 2019-09-09 12:46:52 +02:00
Lucio Andrés Illanes Albornoz
56a3b748cc libgui/GuiCanvasPanel.py:{onPanelEnterWindow,__init__}(): don't steal focus when entering window.
libgui/GuiCanvasPanel.py:__init__(): bind EVT_CHAR to self vs.  parentFrame.
libgui/GuiFrame.py:{onChar,__init__}(): forward EVT_CHAR to canvasPanel.onPanelInput().
2019-09-09 12:44:32 +02:00
Lucio Andrés Illanes Albornoz
88d69cb31e Initial canvas panel scrollbar implementation.
assets/text/TODO: updated.
libgui/GuiCanvasPanel.py:__init__(): provide self.winSize & call SetScrollRate().
libgui/GuiCanvasPanel.py:{_drawPatch,dispatch{DeltaPatches,Patch},onPanel{Input,LeaveWindow},resize,update}(): receive and/or pass viewRect.
libgui/GuiCanvasPanel.py:onPanelPaint(): updated.
libgui/GuiCanvasPanel.py:resize(): call SetVirtualSize().
libgui/GuiCanvasWxBackend.py:_{draw{Brush,Char}Patch,_get{Brush,Char}PatchColours,xlatePoint}(): updated.
libgui/GuiCanvasWxBackend.py:{draw{CursorMaskWithJournal,Patch},getDeviceContext,xlateEventPoint}(): receive and/or pass viewRect.
libgui/GuiCanvasWxBackend.py:getDeviceContext(): return ClientDC() if viewRect > (0, 0)
libgui/GuiCanvasWxBackend.py:onPanelPaintEvent(): blit subset of canvasBitmap into BufferedPaintDC() if viewRect > (0, 0).
libtools/Tool{,Circle,Fill,Line,Rect,Select{,Clone,Move},Text}.py: receive & pass viewRect to dispatchFn().
2019-09-09 12:30:25 +02:00
Lucio Andrés Illanes Albornoz
e54429e29e libgui/GuiCanvasInterface.py: soft-fail importing ImgurApiKey.
assets/text/TODO: updated.
2019-09-08 20:05:34 +02:00
Lucio Andrés Illanes Albornoz
52672796c6 libgui/GuiCanvasInterface.py:canvas{Brush,Canvas}Size(): correctly {de,in}crement {brush,canvas} height & width. 2019-09-08 19:24:55 +02:00
Lucio Andrés Illanes Albornoz
ff05b829b8 assets/text/{LICENCE,README.md,TODO}: convert to DOS file format for convenience on Windows. 2019-09-08 19:14:24 +02:00
Lucio Andrés Illanes Albornoz
629e03928e assets/tools/deploy-python.sh: updated. 2019-09-08 19:12:16 +02:00
Lucio Andrés Illanes Albornoz
fcd5173329 {libcanvas/Canvas,libgui/GuiCanvasPanel}.py: neither commit nor draw patches referencing cells outside of the current map. 2019-09-08 19:04:27 +02:00
Lucio Andrés Illanes Albornoz
b83684073e libgui/GuiCanvasInterface.py: minor cleanup. 2019-09-08 19:02:19 +02:00
Lucio Andrés Illanes Albornoz
f6e2dbd64b libgui/GuiCanvasInterface.py: minor cleanup. 2019-09-08 18:34:30 +02:00
Lucio Andrés Illanes Albornoz
c77813380a assets/text/ImgurApiKey.py.template, lib{canvas,gui,rtl,tools}/*.py: deXXXify. 2019-09-08 18:08:04 +02:00
Lucio Andrés Illanes Albornoz
6da84c05c5 {libcanvas/Canvas,libgui/GuiCanvas{Interface,Panel}}.py: implement dirty flag.
libgui/GuiCanvasInterface.py:canvas{Exit,New,Open,Save,Import{Ansi,FromClipboard,Sauce}}(): prompt to save canvas if dirty.
libgui/GuiCanvasInterface.py: minor cleanup.
libcanvas/Canvas.py:resize(): don't push undo patches when extending canvas.
2019-09-08 18:00:11 +02:00
Lucio Andrés Illanes Albornoz
d410ef9321 libtools/ToolText.py:onMouseEvent(): only set self.textPos on is{Left,Right}Down. 2019-09-08 17:02:41 +02:00
Lucio Andrés Illanes Albornoz
a628ed6471 Implements transparent colour.
libgui/Gui{CanvasInterface,{General,}Frame}.py: refactored.
{libcanvas/CanvasExportStore,libgui/GuiCanvas{Interface,WxBackend}}.py: implements transparent colour.
libgui/GuiCanvasPanel.py: updated.
libtools/ToolText.py: updated.
assets/text/TODO: updated.
2019-09-08 16:57:45 +02:00
Lucio Andrés Illanes Albornoz
8367c166f3 assets/tools/MiRCART{Reduce,ToAnsi}.py: fixed.
libcanvas/CanvasExportStore.py: fixed.
assets/text/TODO: updated.
2019-09-07 17:38:28 +02:00
Lucio Andrés Illanes Albornoz
f3140d4b3d libcanvas/CanvasColours.py, libgui/GuiCanvasColours.py: split from libcanvas/CanvasColours.py.
libcanvas/Canvas.py, libgui/GuiCanvasPanel.py: split from libcanvas/Canvas.py.
libcanvas/CanvasImportStore.py:import{Ansi{Buffer,File},SauceFile}(): fixed (via spoke.)
{libgui/Gui{CanvasInterface,Frame},libtools/Tool{Fill,Select,Text},roar}.py: updated.
libgui/GuiCanvasWxBackend.py: merged from libcanvas/CanvasBackend.py.
2019-09-07 10:39:26 +02:00
Lucio Andrés Illanes Albornoz
c28c2f87ab libcanvas/CanvasColours.py: renamed from libcanvas/Colours.py.
lib{canvas/Canvas{Backend,{Ex,Im}portStore},gui/GuiFrame}.py: updated.
2019-09-06 10:32:54 +02:00
Lucio Andrés Illanes Albornoz
34d9df756b libcanvas/Canvas{Ex,Im}portStore.py: cleanup.
assets/tools/MiRCARTReduce.py: fixed (for spoke.)
assets/tools/{MiRCARTTo{Ansi,PngFile},SAUCETo{Ansi,MiRCART}}.py: updated.
lib{canvas/Canvas,gui/Gui{CanvasInterface,Frame}}.py: updated.
lib{{canvas/Canvas{Backend,Journal},Colours},tools/ToolRect}.py: minor cleanup.
roar.py: updated.
2019-09-06 10:29:45 +02:00
Lucio Andrés Illanes Albornoz
bb4ba3ae46 libcanvas/Canvas.py, libgui/GuiCanvasInterface.py: correctly set ImgurApiKey.
libcanvas/CanvasExportStore.py:_exportFileToImgur(): fixed.
libcanvas/CanvasExportStore.py:exportPastebin(): fixed.
2019-09-05 17:13:35 +02:00
Lucio Andrés Illanes Albornoz
045b7a24ed Implements importing from {ANSI,SAUCE} and exporting to ANSI files.
assets/tools/{MiRCARTTo{Ansi,PngFile},SAUCETo{Ansi,MiRCART}}.py: reimplemented using Canvas{Ex,Im}portStore.
libcanvas/Canvas.py: minor cleanup.
libcanvas/CanvasExportStore.py:export{Ansi,Png}File(): merged from assets/tools/MiRCARTTo{Ansi,PngFile}.py.
libcanvas/CanvasImportStore.py:import{Ansi,Sauce}File(): merged from assets/tools/SAUCETo{Ansi,MiRCART}.py.
libcanvas/Colours.py:{AnsiBgToMiRCARTColours,AnsiFgToMiRCARTColours,AnsiFgBoldToMiRCARTColours}{}: merged from assets/tools/SAUCEToMiRCART.py.
libcanvas/Colours.py:{ColourMap{Bold,Normal}}[]: merged from assets/tools/MiRCARTToPngFile.py.
libcanvas/Colours.py: minor cleanup.
libgui/GuiCanvasInterface.py:canvas{ExportAsAnsi,Import{Ansi,Sauce}}(): implemented.
libgui/GuiFrame.py: adds CID_{EXPORT_AS_{ANSI,SAUCE},IMPORT_{ANSI,SAUCE}}.
assets/text/TODO: updated.
2019-09-05 16:55:07 +02:00
Lucio Andrés Illanes Albornoz
da8384f3bb libgui/GuiCanvasInterface.py:canvasExportAsPng(): correctly pass self.parentFrame to wx.FileDialog().
libgui/GuiCanvasInterface.py: minor cleanup.
assets/text/TODO: updated.
2019-09-04 16:36:57 +02:00
Lucio Andrés Illanes Albornoz
752af56774 {assets/tools,lib{canvas,gui,rtl,tools}}/*.py: update copyright legends.
assets/text/ImgurApiKey.py.template: updated from assets/text/MiRCARTImgurApiKey.py.template.
librtl/IrcClient.py: minor cleanup.
2019-09-04 16:23:59 +02:00
Lucio Andrés Illanes Albornoz
bd83513689 assets/tools/deploy-python.sh: updated. 2019-09-04 16:13:47 +02:00
Lucio Andrés Illanes Albornoz
b9f271297c Show toolbar tooltips.
libgui/GuiGeneralFrame.py:_initToolBars(): pass label to wx.ToolBar.Add{,Radio}Tool().
libgui/GuiGeneralFrame.py: minor cleanup.
assets/text/TODO: updated.
2019-09-04 16:09:46 +02:00
Lucio Andrés Illanes Albornoz
e3d23200b3 Implements {un,re}doing resizing.
libcanvas/Canvas.py:_dispatchDeltaPatches(): handle `resize' delta patches.
libcanvas/Canvas.py:_dispatchPatch(): only commit to journal given commitUndo.
libcanvas/Canvas.py:resize(): commit `resize' & {deleted,added} cell deltas to journal.
libcanvas/Canvas.py: minor cleanup.
libcanvas/Canvas{Backend,{Export,Import}Store,Journal}.py: minor cleanup.
assets/text/arab-puke.txt: added from mircart/pack2/.
assets/text/TODO: updated.
2019-09-04 15:52:54 +02:00
Lucio Andrés Illanes Albornoz
e407ab2d81 Implements {ex,im}port {to,from} clipboard.
libcanvas/CanvasExportStore.py:exportTextBuffer(): cloned from exportTextFile().
libcanvas/CanvasExportStore.py:exportTextFile(): correctly fetch cell colours & text.
libcanvas/CanvasImportStore.py:importTextFile{,Buffer}(): split from importTextFile().
libcanvas/CanvasImportStore.py: minor cleanup.
libgui/GuiCanvasInterface.py:canvas{ExportTo,ImportFrom}Clipboard(): implemented.
libgui/GuiFrame.py: adds CID_{EX,IM}PORT_CLIPB.
libgui/GuiFrame.py: minor cleanup.
libgui/GuiGeneralFrame.py: minor cleanup.
assets/text/TODO: updated.
2019-09-04 12:50:21 +02:00
Lucio Andrés Illanes Albornoz
84126f5d4e libgui/GuiCanvasInterface.py: merged from libcanvas/CanvasInterface.py.
libgui/GuiCanvasInterfaceAbout.py: split from libgui/GuiCanvasInterface.py.
libcanvas/Canvas.py, libgui/GuiFrame.py: updated.
assets/text/TODO: updated.
2019-09-04 11:47:09 +02:00
Lucio Andrés Illanes Albornoz
e03cf65028 assets/tools/SAUCEToMiRCART.py: added (for spoke.)
assets/text/TODO: updated.
2019-09-04 11:03:53 +02:00
Lucio Andrés Illanes Albornoz
74da2e43c9 ROAR! 2019-09-03 18:58:50 +02:00
Lucio Andrés Illanes Albornoz
f0cc23fcaa assets/text/TODO: merged from roar/. 2019-09-03 15:49:53 +02:00
Lucio Andrés Illanes Albornoz
9c528e8a6f MiRCART.py: melp? 2019-09-03 15:48:52 +02:00
Lucio Andrés Illanes Albornoz
71fd619709 libtools/MiRCARTToolSelect{,Clone,Move}.py: cleanup & bug fixes. 2019-09-03 15:48:48 +02:00
Lucio Andrés Illanes Albornoz
cf2c5a7042 Replaces & merges MiRCART-{nw,python,www} w/ original MiRCART as of Thu Jul 5 2018. 2019-09-01 16:34:00 +02:00
Lucio Andrés Illanes Albornoz
08b453b33f Bump to v1.1.6. 2019-08-28 11:35:42 +02:00
Lucio Andrés Illanes Albornoz
9420392b83 assets/html/index.html: fix asset pathnames.
assets/js/clipboard.js:import_ansi(): correctly handle {bold,faint,reset} SGR parameters.
assets/js/clipboard.js:import_ansi(): don't apply {bold,faint} to background colours.
assets/js/clipboard.js:import_ansi(): don't reset {background,foreground} colour & {bold,faint} flags on new row.
assets/js/clipboard.js:import_ansi(): emit missing cells if necessary.
assets/js/clipboard.js:import_ansi(): handle CUrsor Forward control sequence.
assets/js/color.js: removes ansi_bg_bold_import[].
2019-08-28 11:31:42 +02:00
Lucio Andrés Illanes Albornoz
01394e6137 Bump to v1.1.5. 2019-08-28 10:37:45 +02:00
Lucio Andrés Illanes Albornoz
6453c1ff03 MiRCART-nw/index.html: update symlink. 2019-08-28 10:37:27 +02:00
Lucio Andrés Illanes Albornoz
6e371adbbe Bump to v1.1.4. 2019-08-28 10:32:44 +02:00
Lucio Andrés Illanes Albornoz
035ab03e3c SAUCEToAnsi.py: updated. 2019-08-28 10:32:26 +02:00
Lucio Andrés Illanes Albornoz
80df97f972 Bump to v1.1.3.
assets/shell/bump-version.sh: updated.
2019-08-28 10:31:44 +02:00
Lucio Andrés Illanes Albornoz
c15a5b7a21 MiRCART-python/SAUCEToAnsi.py: added (for spoke.) 2019-08-28 10:29:28 +02:00
Lucio Andrés Illanes Albornoz
0d4a6432b2 assets/html/index.html: moved from index.html.
MiRCART-www/index.html: updates symlink.
2019-08-27 08:49:15 +02:00
Lucio Andrés Illanes Albornoz
6639336a25 assets/js/clipboard.js:import_ansi(): correctly support sequence of comma-separated SGR parameters.
assets/js/clipboard.js:import_ansi(): support {bold,faint,reset} SGR parameters.
assets/js/color.js: adds ansi_[bf]g_bold_import[].
2019-08-27 08:45:39 +02:00
Lucio Andrés Illanes Albornoz
2578c80819 assets/shell/bump-version.sh: removes MiRCART-cordoba support. 2019-08-27 08:01:35 +02:00
Lucio Andrés Illanes Albornoz
66fb77b9b5 assets/js/matrix.js:Matrix.prototype.{ansi,mirc}(): only reset {bg,fg}_ when processing a new row vs. new cell (via spoke.) 2019-08-27 07:59:35 +02:00
Lucio Andrés Illanes Albornoz
50b7e9c279 Removes MiRCART-cordoba. 2019-08-25 19:00:11 +02:00
Lucio Andrés Illanes Albornoz
6200254152 Implements {ex,im}porting {as,from} ANSI.
Bump to v1.1.2.
2019-08-25 18:39:49 +02:00
Lucio Andrés Illanes Albornoz
ecaaf75b6b MiRCARTCanvasImportStore.py:importTextFile(): open() w/ encoding="utf-8-sig" due to potentially present BOM.
MiRCARTToPngFile.py:export(): disable PIL font anti-aliasing.
2019-08-18 13:02:33 +02:00
Lucio Andrés Illanes Albornoz
b4e2286ecc assets/js/matrix.js:Matrix.prototype.mirc(): don't assume default foreground colour (via spoke.) 2019-07-13 23:53:24 +02:00
Lucio Andrés Illanes Albornoz
fd71785b3b MiRCART-python/MiRCARTReduce.py: added. 2019-04-11 14:54:29 +02:00
Lucio Andrés Illanes Albornoz
7d80e5331f MiRCART-python/IrcMiRCARTBot.py: updated.
assets/text/TODO: updated.
2019-02-06 19:10:35 +01:00
Lucio Andrés Illanes Albornoz
375324be9b MiRCARTToAnsi.py: fix colours. 2019-01-21 20:21:11 +01:00
Lucio Andrés Illanes Albornoz
a4fa91f894 MiRCARTToAnsi.py: added.
MiRCARTToPngFile.py: clean up _ColourMap{Bold,Normal}.
2019-01-21 10:23:19 +01:00
Lucio Andrés Illanes Albornoz
efd8b20671 IrcMiRCARTBot.py:_{dispatchPrivmsg,uploadToImgur}(): gracefully handle invalid responses from Imgur.com. 2018-12-03 11:51:20 +01:00
Lucio Andrés Illanes Albornoz
61f7f75755 Bump to v1.1.0. 2018-11-26 11:00:15 +01:00
Lucio Andrés Illanes Albornoz
c4e58ee096 assets/shell/deploy-nw.sh:deploy(): consistent package names. 2018-11-26 10:59:56 +01:00
Lucio Andrés Illanes Albornoz
8f65e1723e Bump to v1.0.9. 2018-11-26 10:55:55 +01:00
Lucio Andrés Illanes Albornoz
c53d1172a2 Fix LICENCEs. 2018-11-26 10:54:54 +01:00
Lucio Andrés Illanes Albornoz
1218de3bdf assets/shell/bump-version.sh:main(): correctly update version in {index,assets/html/help}.html. 2018-11-26 10:46:53 +01:00
Lucio Andrés Illanes Albornoz
3b981c3a34 Bump to v1.0.8. 2018-11-26 10:46:18 +01:00
Lucio Andrés Illanes Albornoz
2d4d14266e Renames asciiblaster{,*} to MiRCART. 2018-11-26 10:45:12 +01:00
Lucio Andrés Illanes Albornoz
bffd7711a1 help im trapped inside the commit message oh hey who are OH NO AHHHHHH STOP NO DONT DO THAT AHHHHHHHHHHHHHHHHHH IM BLEEDING 2018-11-26 10:35:48 +01:00
Lucio Andrés Illanes Albornoz
35f3323be1 assets/html/help.html: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
a39c103065 assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
47604d6bde assets/shell/bump-version.sh:main(): update version in assets/html/help.html also. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
8ef33b1683 Bump to v1.0.7. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
b031c994b5 assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
61c40b59c3 assets/{css,html}/*, index.html: clean up & correct {CSS,HTML}, pt. XII.
assets/text/TODO: updated.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
b6e0a93029 assets/html/help.html, index.html: add <meta ...charset="UTF-8"...> to make Firefox shut up. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
f35850051c assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
bd46fb99c5 assets/html/help.html, index.html: remove <meta charset="utf-8" />. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
fad1dab3c6 assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
ad87bc8b2f assets/{css,js,html}/*, index.html: clean up & correct {CSS,HTML}.
assets/text/TODO: updated.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
0ad72d7fb0 assets/css/{ak.css,html/help.html}, index.html: clean up & correct {CSS,HTML}.
assets/text/TODO: updated.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
3903f61815 assets/css/{{help,nitelite}.css,html/help.html}: clean up & correct {CSS,HTML}. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
6cae432f46 index.html, assets/css/sally.css: clean up & correct {CSS,HTML}. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
f012c628f2 assets/html/help.html:Tips on using the keyboard: updated.
assets/html/help.html:Notate bene: added.
assets/text/TODO: updated.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
6d4db48ef0 index.html, assets/js/{clipboard,lex,matrix,ui/controls}.js: removes non-functional ANSI export format.
index.html, assets/js/{clipboard,lex,matrix,ui/controls}.js: removes Irssi export format due to lack of interest on #MiRCart.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
1d224b2bb4 assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
f9100dacb0 index.html, assets/js/{app,gfx,ui/controls}.js: removes pointless brush [xy] mirroring `feature.'
index.html, assets/{css/sally.css,js/{matrix,ui/controls}.js}: removes dead {rotate[d],pixels} code.
index.html: cleanup UI layout.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
8ec55357e6 assets/{css/sally.css,js/ui/controls.js}, index.html: always show `advanced' UIs. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
85cad2879a assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
a02ebdd039 assets/doc/index.html, index.html: renamed to assets/html/help.html. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
cc7d8b1b17 assets/doc/irssi.txt: removed from repository.
assets/doc/{tips.txt,index.html}: merged.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
2e682e0af1 assets/js/*: substitute VT w/ SP. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
baacc19a67 assets/*, index.html: remove {trailing,leading} SP. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
06fa555306 assets/js/ui/{brush,custom}.js, index.html: merged into brush.js.
assets/js/ui/{letters,palette}.js, index.html: merged into paletters.js.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
0f2a234ec4 assets/js/{app,ui/{canvas,controls,tool,util}}.js: remove is_{android,desktop,i{pad,phone},mobile}. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
301a003549 .gitattributes: ignore asciiblaster-{cordoba,nw}/ concerning Github repository languages. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
48ce316417 Bump to v1.0.6. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
114ec3fb19 assets/shell/bump-version.sh: melp? 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
048b3677ba asciiblaster-cordoba/platforms/android/app/src/main/res/xml/config.xml: fix index.html pathname. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
74952c6367 Bump to v1.0.5. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
18342308b2 assets/shell/bump-version.sh: added to repository. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
e1d338d6c3 asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/: WHO HATES APACHE _CÓRDOBA_?!?!?!
asciiblaster-cordoba/platforms/android/app/src/main/assets/www/assets/: WE HATE APACHE _CÓRDOBA_!"!$"*$%"&(!£*
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
dc45d81361 assets/shell/deploy-www.sh:deploy(): switch from TGZ back to ZIP. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
4b8c0f3469 assets/shell/deploy-all.sh:main(): fix typo. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
f273a3c6b1 assets/shell/deploy-all.sh:main(): cd into asciiblaster-${_build}/ prior to calling deployment script.
assets/shell/deploy-nwjs.sh, asciiblaster-nw/deploy.sh: renamed to assets/shell/deploy-nw.sh.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
7afc5ea271 Bump to v1.0.4. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
401b7a408c asciiblaster-www/: added to repository.
.gitignore: ignore asciiblaster-www/releases/*.
asciiblaster-{cordoba,nw,www}/deploy.sh, assets/shell/: melp?
index.html: add version to <title>.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
2287a8368b assets/js/ext/*, index.html: merges assets/js/ext/ into assets/js/. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
0f5c8eae4a assets/js/ext/oktween.js, index.html: remove dead code. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
9bacadcb70 assets/*, index.html: removes shader feature due to lack of interest on #MiRCart & maintenance cost. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
8bb9982b3b assets/*, index.html: removes nopaint feature due to lack of interest on #MiRCart & maintenance cost. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
d7e7519592 assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
233abaedef assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
9d4f1bf30a assets/text/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
07e693cc85 asciiblaster-cordoba/release.sh: added to automate GitHub standalone Apache Córdoba Android app releases.
asciiblaster-cordoba/releases/: replaced symlink with directory.
.gitignore: ignore asciiblaster-cordoba/releases/*.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
eb0bbac893 asciiblaster-cordoba/{config.xml,package.json}: fix index.html pathnames. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
80cacedd89 asciiblaster-cordoba/: preliminarily added for standalone Android app support via Apache Córdoba.
.gitignore: adds asciiblaster-cordoba/{node_modules,platforms/android/{.gradle,app/build,CordovaLib/build}}.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
b853878b4b Refactor & clean up repository tree. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
9f0357605b assets/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
b51f315bb7 assets/TODO: updated. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
5424b2ba1e assets/release.sh:release(): fix lapse in logic. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
b0f140d657 assets/nwjs.manifest: added to repository.
assets/release.sh:release(): check SHA256 sum of downloaded NW.js archives.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
19200b8249 assets/release.sh: fix typo. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
d597715422 package.json: bump to v1.0.2. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
f68fd2bcb9 assets/release.sh: obtain version number from package.json. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
0f727db699 index.html:cutoff_warning_el: update warning message. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
1aeca12d04 assets/release.sh, package.json: bump to v1.0.1. 2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
2da7965c99 js/matrix.js: disable irresponsibly obnoxious automatic cutoff `feature.'
js/clipboard.js: increase default cutoff warning threshold to 425.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
0f8b211517 assets/release.sh: added to automate GitHub standalone NW.js app releases.
.gitignore: ignore releases/.
asciiblaster.cmd: added as convenience wrapper on Windows.
2018-11-26 10:23:26 +01:00
Lucio Andrés Illanes Albornoz
90192929f6 package{,-lock}.json: added for standalone app support via NW.js. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
948147124f LICENCE: added from <http://jollo.org/licensing/public/LNT-1.txt>.
doc/index.html: update licence URL.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
3607fd59e8 js/ext/unicode.js: cleanup. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
6a347c4786 js/ui/keys.js: cleanup. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
fcea7308f2 js/ui/goodies.js: removed (unused.)
index.html: updated.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
e5e254fb9b js/ui/nopaint.js: moved into js/ext/.
index.html: updated.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
5d045d4de5 assets/sally.css, index.html, js/clipboard.js: remove gallery link. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
ac8fb74dc4 js/ui/controls.js: remove webcam code.
assets/sally.css, index.html: updated.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
fea5e2a4c9 js/clipboard.js: cleanup. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
60cb67e7a6 assets/fsex300-webfont.eot?: removed. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
042cb2a57b {css,img,fonts}/: merged into assets.
doc/index.html, index.html: updates URIs.
TODO: moved into assets/.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
6180783d2d css/sally.css, js/*: remove {gallery,send to IRC,upload,username}.
index.html, TODO: updated.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
8e34feff55 js/{matrix,undo}.js: merged.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
4c629197a7 js/{draw,gfx}.js: merged.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
3c79ca0675 js/tool.js: moved into js/ui/.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
72aa916dc8 js/{blit,shader}.js: merged into js/gfx.js.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
88f8efe56c js/util.js: moved into js/ext/.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
735c016f94 js/ext/dataUriToBlob.js: removed.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
6be9cbd9b0 js/{lex,matrix}.js: encode to mIRC more efficiently, pt. II. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
b10c6fb6f7 TODO: updated. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
9fbfe7c26f js/clipboard.js: fix typo. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
af683e4f26 TODO: updated. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
6b5fc121c8 js/ext/FileSaver.js: removed.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
f7db3b30f4 index.html: readd js/undo.js. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
f1fd806573 js/dither.js: merged into js/ui/palette.js.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
fc652958e8 js/ext/{colorcode,png}.js: removed.
js/clipboard.js: reimplements to_json().
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
63531adce7 js/: split into js/{ext,ui,}.
index.html: updates script URIs.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
44e4b02068 js/lex.js: default to {bg,fg} when encoding to mIRC. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
21526e2421 TODO: added to repository. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
4a132b50df index.html: update {doc,gallery}_el links. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
86e849b122 js/lex.js: encode to mIRC more efficiently.
js/lex.js: remove unused fgOnly.
2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
7e264f8a8b js/ui/custom.js: allow deletion of brushes w/ <Shift> + LMB. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
2106b77586 js/user.js: update cookie domain. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz (arab, vxp)
0eb96f9266 Initial commit. 2018-11-26 10:22:19 +01:00
Lucio Andrés Illanes Albornoz
08e5856db9 Stash dead repository MiRCARTools. 2018-10-25 03:06:28 +02:00
Lucio Andrés Illanes Albornoz
54522ac329 ENNTool/ENNTool{,GL{CanvasPanel,TTFTexture}}.py: adds [-c x,y,z] & [-t float]. 2018-07-25 14:26:47 +02:00
Lucio Andrés Illanes Albornoz
455a3fdcba Stash dead repository MiRCARTools. 2018-07-05 15:21:30 +02:00
Lucio Andrés Illanes Albornoz
3c7560f6d7 Merge remote-tracking branch 'MiRCARTools/master' 2018-07-05 15:20:47 +02:00
Lucio Andrés Illanes Albornoz
624ab9ca71 IrcMiRCARTBot.py: adds optional -[46] force IPv[46] flag. 2018-06-28 18:18:48 +02:00
Lucio Andrés Illanes Albornoz
05d3d28f1d MiRCARTToPngFiles.sh: added. 2018-06-26 15:39:29 +02:00
Lucio Andrés Illanes Albornoz
7a1ec135b2 MiRCARTCanvasImportStore.py:importTextFile(): correctly open() pathName w/ encoding="utf-8" (via munki.) 2018-06-22 11:38:47 +02:00
Lucio Andrés Illanes Albornoz
8b483e262e IrcMiRCARTBot.py:_dispatchPrivmsg(): print message from website if upload fails.
IrcMiRCARTBot.py:_uploadToImgur(): additionally return responseHttp.text on failure.
2018-06-21 09:04:22 +02:00
Lucio Andrés Illanes Albornoz
8d6f6ef56e MiRCARTCanonicalise.py: correctly reset last{Attribs,Colours} on each new row (fixes issue #1.) 2018-06-17 09:45:00 +02:00
Lucio Andrés Illanes Albornoz
9a9d5d858d IrcMiRCARTBot.py:_dispatchPrivmsg(): lower rate limit to once every 5 seconds (via aaa, alghazi, amomp, anji, arab, astra, astra`, biobag, biobag__, bj0rn, blomp, boomp, bromp, brr, butts, buttvomit, c003y, Caku, chomp, chrono_, cooey, CosbyX, darkmage_, dboard, deh uman, dOm3r, eddb, efukt, ep^, er, era, eraser, erratic, erratic_, gnomp, gromp, interdom3, JEWS, kobach, l1tup, Lions, lul, lulz, lulzee, lulzy, Matthew, MercyX, moomp, mr_vile, muff, munki, n0v, nk9k, ooomp, OVH, pcap, pinchy, plop, pngbot, poccri, poomp, promp, pump-, pu mpbull, pyrex, rain, rObOtNiK, rondito, scd, SEEEEN, Shapes, snadge, spidy, spinsane, spoke, spomp, stomp, TACO, tetedupet, toohighto, tromp, twomp, vap0r, vapor, venus, virtuald, vixen, whomp, wreathman, wromp, yoomp, z0z0, zen_, and zoomp.) 2018-05-24 08:59:00 +02:00
Lucio Andrés Illanes Albornoz
95f7dd113c IrcMiRCARTBot.py, MiRCARTCanvasInterface.py: remove Imgur API key from repository (via aaa, alghazi, amomp, anji, arab, astra, astra`, biobag, biobag__, bj0rn, blomp, boomp, bromp, brr, butts, buttvomit, c003y, Caku, chomp, chrono_, cooey, CosbyX, darkmage_, dboard, dehuman, dOm3r, eddb, efukt, ep^, er, era, eraser, erratic, erratic_, gnomp, gromp, interdom3, JEWS, kobach, l1tup, Lions, lul, lulz, lulzee, lulzy, Matthew, MercyX, moomp, mr_vile, muff, munki, n0v, nk9k, ooomp, OVH, pcap, pinchy, plop, pngbot, poccri, poomp, promp, pump-, pumpbull, pyrex, rain, rObOtNiK, rondito, scd, SEEEEN, Shapes, snadge, spidy, spinsane, spoke, spomp, stomp, TACO, tetedupet, toohighto, tromp, twomp, vap0r, vapor, venus, virtuald, vixen, whomp, wreathman, wromp, yoomp, z0z0, zen_, and zoomp.) 2018-05-24 08:52:20 +02:00
Lucio Andrés Illanes Albornoz
99c0c14993 MiRCARTCheckLineLengths.sh: check mIRC art line lengths. 2018-05-02 17:08:45 +02:00
Lucio Andrés Illanes Albornoz
3b70d42784 MiRCARTCanonicalise.py: canonicalise mIRC art {from,to} file (for munki.) 2018-05-01 23:30:36 +02:00
Lucio Andrés Illanes Albornoz
8e91d1269e {IrcMiRCARTBot,MiRCARTToPngFile}.py: reduce memory usage by folding nested patch {coordinate,colour} list(s).
Followup to <b4a71505ffa68757931f633baf511f7863682e8e>.
2018-01-30 20:34:02 +01:00
Lucio Andrés Illanes Albornoz
6d5e081dfb Reduce memory usage by folding nested patch {coordinate,colour} list(s). 2018-01-30 11:31:28 +01:00
Lucio Andrés Illanes Albornoz
1a503979d1 IrcMiRCARTBot.py:_uploadToImgur(): prevent file object leak via `with' barrier.
MiRCARTCanvasExportStore.py:_exportFileToImgur(): prevent file object leak via `with' barrier.
2018-01-26 22:38:28 +01:00
Lucio Andrés Illanes Albornoz
c6ab27c08c Fixes memory leaks on {re,un}do state mutation & resize-related operations.
MiRCARTCanvas.py:__del__(): delete canvasMap w/ clear().
MiRCARTCanvasBackend.py:resize(): delete old canvasBitmap w/ Destroy().
MiRCARTCanvasJournal.py:reset{Cursor,Undo}(): delete patches{Cursor,Undo} w/ clear().
MiRCARTCanvasJournal.py:__del__(): provided explicitly to call reset{Cursor,Undo}().
MiRCARTFrame.py:__del__(): provided explicitly to delete panelCanvas.
2018-01-26 17:45:04 +01:00
Lucio Andrés Illanes Albornoz
579dd858ba MiRCARTCanvasInterface.py:canvasSave(): fix call parameters. 2018-01-25 15:04:37 +01:00
Lucio Andrés Illanes Albornoz
92124dc34f MiRCARTCanvas.py:resize(): clean up & fix.
MiRCARTCanvasInterface.py:_updateCanvasSize(): merged into ...Canvas.resize().
MiRCARTCanvasInterface.py:canvas{De,In}crCanvas{Height,Width}(): directly call ...Canvas.resize().
2018-01-25 15:02:09 +01:00
Lucio Andrés Illanes Albornoz
f77e6d5bf8 IrcClient.py:connect(): create file from socket w/ errors="replace" to prevent UnicodeDecodeErrors. 2018-01-22 21:06:46 +01:00
Lucio Andrés Illanes Albornoz
b385909b45 MiRCARTCanvasImportStore.py: correctly process ^C<colour>, sequences.
MiRCARTToPngFile.py: fix {bold,underline} processing.
2018-01-20 09:17:52 +01:00
Lucio Andrés Illanes Albornoz
0cf1040614 MiRCARTColours.py: fix permission bits. 2018-01-11 23:27:57 +01:00
Lucio Andrés Illanes Albornoz
802de6fa6e MiRCART{CanvasInterface,Frame}.py: complete set of {brush,canvas} size operations.
assets/tool{De,In}cr{Brush,Canvas}{H{,W},W}.png: added/updated.
2018-01-11 23:26:36 +01:00
Lucio Andrés Illanes Albornoz
4f4ecb4331 MiRCARTToPngFile.py:export(): treat `█' as whitespace w/ inverse colours. 2018-01-11 23:22:02 +01:00
Lucio Andrés Illanes Albornoz
1511002798 MiRCARTCanvasImportStore.py:_parseCharAsColourSpec(): correctly process mIRC colour control code sequences specifying one single colour.
MiRCARTToPngFile.py:export(): fix indentation.
2018-01-11 23:13:46 +01:00
Lucio Andrés Illanes Albornoz
d79ea00164 IrcMiRCARTBot.py: include black-on-black border around map.
IrcMiRCARTBot.py: normalise imported map.
2018-01-11 21:28:53 +01:00
Lucio Andrés Illanes Albornoz
9eee59b501 MiRCARTFrame.py: initially select red (4) colour toolbar item. 2018-01-11 03:02:18 +01:00
Lucio Andrés Illanes Albornoz
5380e899e4 MiRCARTFrame.py: add {in,de}crease {height,width} toolbar items.
assets/tool{De,In}crCanvas{H,W}.png: added.
2018-01-11 02:49:53 +01:00
Lucio Andrés Illanes Albornoz
4e19f91eb0 MiRCARTFrame.py: adds exit accelerator (hotkey) <Ctrl> X. 2018-01-11 02:37:20 +01:00
Lucio Andrés Illanes Albornoz
a33ff6b5df MiRCART{CanvasInterface,{,General}Frame}.py: add & sync {tools,colour selection} toolbar items as radio tools. 2018-01-11 02:34:32 +01:00
Lucio Andrés Illanes Albornoz
46258cde32 MiRCARTCanvas.py:MiRCARTCanvas.onPanelInput(): clip mapPoint to canvasSize. 2018-01-11 02:10:33 +01:00
Lucio Andrés Illanes Albornoz
508a3cd489 MiRCARTToolFill.py: don't process cells more than once. 2018-01-11 02:06:09 +01:00
Lucio Andrés Illanes Albornoz
44490912b2 MiRCARTCanvasInterface.py:_updateCanvasSize(): hide cursor before resizing. 2018-01-11 01:59:43 +01:00
Lucio Andrés Illanes Albornoz
2f85fa8cd1 MiRCARTToolFill.py: set qualifying colour from current cell. 2018-01-11 01:56:28 +01:00
Lucio Andrés Illanes Albornoz
bb243c7556 MiRCARTCanvasInterface.py:_updateCanvasSize(): reimplement (fixes <Alt> [WASD] bugs.) 2018-01-11 01:52:53 +01:00
Lucio Andrés Illanes Albornoz
d1936486ff MiRCART.py: import argv[1] into canvas if specified. 2018-01-11 01:18:50 +01:00
Lucio Andrés Illanes Albornoz
cf04a12690 MiRCARTCanvasInterface.py: prompt to save changes on exit given non-None canvasPathName. 2018-01-11 01:12:55 +01:00
Lucio Andrés Illanes Albornoz
02d3c7f6f4 assets/tool{Clone,Move}.png: updated. 2018-01-11 01:09:00 +01:00
Lucio Andrés Illanes Albornoz
ebdf7f410b MiRCARTCanvasInterface.py: sync menu item state when selecting tool. 2018-01-11 00:59:07 +01:00
Lucio Andrés Illanes Albornoz
4bc9b61f2c MiRCARTGeneralFrame.py: show accelerators (hotkeys) in menus. 2018-01-11 00:45:40 +01:00
Lucio Andrés Illanes Albornoz
f65603dd0c MiRCART.png: updated. 2018-01-11 00:31:25 +01:00
Lucio Andrés Illanes Albornoz
d26a322612 MiRCART{CanvasInterface,Frame}.py: adds (flood) fill tool.
MiRCARTToolFill.py: initial implementation.
assets/toolFill.png: added.
2018-01-11 00:27:50 +01:00
Lucio Andrés Illanes Albornoz
499296ba1d MiRCARTGeneralFrame.py: add toolbar windows to sizer w/ border width 3. 2018-01-10 22:31:52 +01:00
Lucio Andrés Illanes Albornoz
e53e8bf8e7 MiRCARTFrame.py: add canvas panel window to sizer w/ border width 14. 2018-01-10 22:16:48 +01:00
Lucio Andrés Illanes Albornoz
33df272b39 MiRCARTCanvas.py:MiRCARTCanvas.resize(): call SetSize() w/o changing position.
MiRCARTCanvas.py:MiRCARTCanvas.resize(): call SetMinSize() in addition to SetSize().
MiRCARTCanvas.py:MiRCARTCanvas.resize(): call Layout() on canvas panel window and its parents.
MiRCARTCanvasInterface.py: always call SetCursor() w/ self.parentCanvas.
MiRCARTFrame.py: moves colour toolbar items to separate toolbar.
MiRCARTFrame.py:MiRCARTFrame.__init__(): add canvas panel to and initialise sizer.
MiRCARTGeneralFrame.py: adds support for multiple toolbars via vertical box sizer.
2018-01-10 22:06:48 +01:00
Lucio Andrés Illanes Albornoz
8c0de9fbd3 MiRCARTToolSelectMove.py: clear source region prior to moving. 2018-01-10 19:20:35 +01:00
Lucio Andrés Illanes Albornoz
ad761d658e MiRCART{CanvasInterface,Frame}.py: adds clone & move (selection) tools.
MiRCARTTool{Clone,Move}Select.py: initial implementation.
assets/tool{Clone,Move}.png: added.
MiRCART.png: updated.
2018-01-10 18:29:16 +01:00
Lucio Andrés Illanes Albornoz
c9d6b90e68 MiRCART{anvas{,ImportStore,Interface},Frame}.py: pass & initialise from default canvas position, size, and cell size. 2018-01-10 15:04:59 +01:00
Lucio Andrés Illanes Albornoz
49ef54ef76 MiRCARTToolLine.py: correctly cache colours on first click. 2018-01-10 14:53:35 +01:00
Lucio Andrés Illanes Albornoz
2254a0638b MiRCART{Canvas{,Interface},Frame}.py: use dict() to cache canvas state in Frame. 2018-01-10 14:51:25 +01:00
Lucio Andrés Illanes Albornoz
402e542137 MiRCART{CanvasInterface,Frame,Tool*}.py: include current tool name in status bar text. 2018-01-10 05:05:59 +01:00
Lucio Andrés Illanes Albornoz
a320c904fe MiRCART{Canvas{,Interface},Frame}.py: remove undo level & show brush size in status bar. 2018-01-10 05:00:52 +01:00
Lucio Andrés Illanes Albornoz
3fa377791a MiRCARTToolLine.py: honour brush size. 2018-01-10 04:44:13 +01:00
Lucio Andrés Illanes Albornoz
e157f479ce MiRCART{Canvas,Frame}.py: include canvas width and height in status bar. 2018-01-10 04:36:39 +01:00
Lucio Andrés Illanes Albornoz
12027bc6b5 MiRCARTToolText.py: fix non-US ASCII character handling. 2018-01-10 04:31:20 +01:00
Lucio Andrés Illanes Albornoz
f9f910160f MiRCART{Canvas{,Interface},Frame}.py: merge on{StatusBar,Undo}Update() into onCanvasUpdate().
MiRCARTCanvas{Frame,Interface}.py: adds canvas{De,In}crCanvas{Height,Width}() & CID_*.
MiRCARTCanvasFrame.py:onCanvasUpdate(): updated.
2018-01-10 04:23:54 +01:00
Lucio Andrés Illanes Albornoz
3e03126006 MiRCARTCanvasInterface.py: split from MiRCARTCanvas.py.
MiRCART{Canvas,{,General}Frame}.py: updated.
2018-01-10 03:24:25 +01:00
Lucio Andrés Illanes Albornoz
398ee3af3d MiRCARTCanvas{Export,Import}Store.py: split from MiRCARTCanvasStore.py.
IrcMiRCARTBot.py, MiRCART{Canvas,Frame,ToPngFile}.py: updated.
2018-01-10 00:48:13 +01:00
Lucio Andrés Illanes Albornoz
cd5ea1fab5 MiRCARTCanvas{,Journal,Store}.py: dispatch patches from tool event handlers directly.
MiRCARTTool{,Circle,Line,Rect,Text}.py: updated to new interface.
2018-01-10 00:35:08 +01:00
Lucio Andrés Illanes Albornoz
ed8ccab26f MiRCART{Canvas{,Backend},Frame}.py: replace MemoryDC() w/ BufferedDC(canvasBitmap). 2018-01-09 22:23:27 +01:00
Lucio Andrés Illanes Albornoz
2e014cd7ec MiRCARTCanvasBackend.py: only update device context brushes & pen if necessary. 2018-01-09 21:37:58 +01:00
Lucio Andrés Illanes Albornoz
dbf6c76930 MiRCARTGeneralFrame.py: prepend script execution directory when loading toolbar item bitmaps. 2018-01-09 21:21:04 +01:00
Lucio Andrés Illanes Albornoz
363a86fe81 MiRCARTCanvas.py: enable double buffering to eliminate brush flickering. 2018-01-09 05:07:04 +01:00
Lucio Andrés Illanes Albornoz
dec1e4c0d4 MiRCART.png: updates screenshot.
MiRCARTCanvas.py:onPanelKeyboardInput(): only handle {no,shift}-modifier keyboard events.
MiRCARTFrame.py: fix {de,in}crease canvas size accelerators (hotkeys.)
2018-01-09 04:17:24 +01:00
Lucio Andrés Illanes Albornoz
38e90f96ca Initial release w/ circle, line, rectangle, and text tools. 2018-01-09 03:56:40 +01:00
Lucio Andrés Illanes Albornoz
2a7f281d29 MiRCART{General,}Frame.py, assets/*.png: adds icons for tools.
MiRCART{Frame,ToolText}.py: initial implementation of Text tool.
2018-01-08 20:28:43 +01:00
Lucio Andrés Illanes Albornoz
f431adb381 MiRCART.png: updates screenshot. 2018-01-08 17:47:58 +01:00
Lucio Andrés Illanes Albornoz
195ddd9af8 MiRCART{Canvas,Frame}.py: adds circle & line tools.
MiRCARTTool{Circle,Line}.py: initial implementation.
2018-01-08 17:44:54 +01:00
Lucio Andrés Illanes Albornoz
9b5c9be88b MiRCARTFrame.py: adds <Ctrl>-<{+,-}> {in,de}crease brush size accelerators (hotkeys). 2018-01-08 02:56:08 +01:00
Lucio Andrés Illanes Albornoz
1099341b5d MiRCARTCanvas{,Journal}.py: fix {un,re}do regarding brush sizes >(1,1). 2018-01-08 02:45:03 +01:00
Lucio Andrés Illanes Albornoz
e7b7e05234 MiRCARTGeneralFrame.py, MiRCARTFrame.py: cleanup. 2018-01-08 01:43:54 +01:00
Lucio Andrés Illanes Albornoz
30f3688a2c MiRCARTFrame.py:MiRCARTFrame.onFrameCommand(): don't decrease brush size below (1,1).
MiRCARTFrame.py:MiRCARTFrame.onFrameCommand(): remove debugging print()s.
2018-01-08 01:18:52 +01:00
Lucio Andrés Illanes Albornoz
da82a543b5 MiRCARTCanvas.py: disable double buffering. 2018-01-08 01:11:00 +01:00
Lucio Andrés Illanes Albornoz
54adf3a95c MiRCART{CanvasJournal,Frame,ToolRect}.py: implements variable brush size. 2018-01-08 00:33:47 +01:00
Lucio Andrés Illanes Albornoz
6a4356568b MiRCARTFrame.py:MiRCARTFrame.canvas{Export{AsPng,Imgur,Pastebin},New,Open,Save}(): add wx.CURSOR_WAIT guards. 2018-01-08 00:05:10 +01:00
Lucio Andrés Illanes Albornoz
39babc71a4 MiRCART{CanvasStore,Frame}.py: implements export to Imgur (from bitmap via PNG.) 2018-01-08 00:05:10 +01:00
Lucio Andrés Illanes Albornoz
84ab4eee5a Initial release sans tools. 2018-01-08 00:05:03 +01:00
Lucio Andrés Illanes Albornoz
f6911293c3 MiRCARTFrame:MiRCARTFrame.TID_SELECT, [CM]ID_*: adds selectable item type.
MiRCARTFrame:MiRCARTFrame.{_initMenus,__init__}(): automatically set menu item initial state.
2018-01-07 15:20:27 +01:00
Lucio Andrés Illanes Albornoz
1c5f869c40 MiRCARTFrame.py: remove obsolete MiRCARTTo{Pastebin,PngFile} imports.
MiRCARTFrame.py:MiRCARTFrame.__init__(): initially disable (grey out) Copy, Cut, Delete, Paste, Export to Pastebin, and Export as PNG menu items.
2018-01-07 15:07:37 +01:00
Lucio Andrés Illanes Albornoz
3c28fa0071 MiRCARTCanvasStore.py: split & merge MiRCART{FromTextFile,ToPastebin,ToTextFile}.py. 2018-01-07 15:07:22 +01:00
Lucio Andrés Illanes Albornoz
115991736a MiRCART.py: hand off to MiRCARTFrame().
MiRCARTCanvas.py: split from MiRCART.py.
MiRCARTCanvasJournal.py: split from MiRCART.py.
MiRCARTColours.py: split from MiRCART.py.
MiRCARTFrame.py: split from MiRCART.py.
MiRCARTFromTextFile.py: initial implementation.
MiRCARTToPastebin.py: initial implementation.
MiRCARTToPngFile.py, IrcMiRCARTBot.py: renamed MiRC2png to MiRCARTToPngFile.
MiRCARTToTextFile.py: split from MiRCART.py.
MiRCARTTool.py: split from MiRCART.py.
MiRCARTToolRect.py: split from MiRCART.py.
README.md: updated.
2018-01-07 03:45:18 +01:00
Lucio Andrés Illanes Albornoz
0259662a4e IrcClient.py:IrcClient.connect(): explicitly pass encoding="utf-8" to clientSocket.makeFile(). 2018-01-06 16:40:20 +01:00
Lucio Andrés Illanes Albornoz
d93e1fecda MiRCART.py:MiRCARTCanvasJournal: split from MiRCARTCanvas. 2018-01-06 04:48:15 +01:00
Lucio Andrés Illanes Albornoz
fcc4215b68 {IrcClient,IrcMiRCARTBot,MiRC{2png,ART}}.py: fix spaces & typo. 2018-01-06 02:50:12 +01:00
Lucio Andrés Illanes Albornoz
968d07050e MiRCART.py:MiRCARTTool{,Rect}: cleaned up. 2018-01-06 02:46:46 +01:00
Lucio Andrés Illanes Albornoz
16065401e8 MiRCART.py:MiRCARTCanvas: cleaned up. 2018-01-06 02:42:26 +01:00
Lucio Andrés Illanes Albornoz
44e593714d {IrcClient,IrcMiRCARTBot.py,MiRC{2png,ART}}.py: include parameters in function header comments. 2018-01-06 01:44:45 +01:00
Lucio Andrés Illanes Albornoz
845185f9c3 MiRCART.py:MiRCARTFrame: cleaned up. 2018-01-06 01:23:48 +01:00
Lucio Andrés Illanes Albornoz
5350ebd881 README.md, MiRCART.png: added screenshot & WIP/pending cleanup tags. 2018-01-05 21:18:06 +01:00
Lucio Andrés Illanes Albornoz
61d53c818c MiRCART.py:MiRCARTFrame.__init__(): remove debugging print(). 2018-01-05 21:15:33 +01:00
Lucio Andrés Illanes Albornoz
703aa2c388 MiRCART.py:MiRCARTPalette, MiRCARTFrame.panelPalette: replaced w/ toolbar items.
MiRCART.py:MiRCARTFrame.toolBar*: added.
MiRCART.py:MiRCARTFrame.onToolColour{Bg,Fg}(): hand off to onPaletteEvent().
MiRCART.py:MiRCARTFrame.__init__(): create & initialise toolbar.
2018-01-05 20:45:21 +01:00
Lucio Andrés Illanes Albornoz
55381cf57b MiRCART.py:MiRCARTFrame.__init__(): update File menu titles to "Export to Pasteb&in..." and "Export as PN&G...". 2018-01-05 18:28:19 +01:00
Lucio Andrés Illanes Albornoz
28ae8f04f8 MiRCART.py:MiRCARTCanvas.{parentFrame,__init__()}: added for MiRCARTFrame.onCanvasUpdate().
MiRCART.py:MiRCARTCanvas._processMapPatches(): call parentFrame.onCanvasUpdate() given updates.
MiRCART.py:MiRCARTCanvas.{re,un}do(): call parentFrame.onCanvasUpdate() given {re,un}do.
MiRCART.py:MiRCARTFrame.onCanvasUpdate(): {dis,en}able menuEdit{Re,Un}do on updates.
2018-01-05 18:21:38 +01:00
Lucio Andrés Illanes Albornoz
813d49a3f2 MiRCART.py:MiRCARTFrame.__init__(): disable (grey out) menuEdit{Redo,Undo} initially. 2018-01-05 18:12:02 +01:00
Lucio Andrés Illanes Albornoz
c7fbe5b20c MiRCART.py:MiRCARTFrame.__init__(): change default appSize to (800, 600). 2018-01-05 18:09:25 +01:00
Lucio Andrés Illanes Albornoz
8215229f84 MiRCART.py:MiRCARTFrame: complete GUI skeleton. 2018-01-05 18:08:10 +01:00
Lucio Andrés Illanes Albornoz
133c4dc240 MiRCART.py:MiRCARTCanvas.patchesUndoLevel: added to track {un,re}do queue movement in both directions.
MiRCART.py:MiRCARTCanvas._processMapPatches(): remove {un,re}do queue items 0..patchesUndoLevel when updating queue.
MiRCART.py:MiRCARTCanvas._processMapPatches(): prepend to queue instead of appending.
MiRCART.py:MiRCARTCanvas._processMapPatches(): insert {un,re}do queue items as single (list) item each.
MiRCART.py:MiRCARTCanvas.redo(): decrement patchesUndoLevel & apply redo patch, if patchesUndoLevel > 0.
MiRCART.py:MiRCARTCanvas.undo(): apply undo patch & increment patchesUndoLevel, if patchesUndo[patchesUndoLevel] != None.
MiRCART.py:MiRCARTFrame.{menuFileRedo,onFileRedo(),__init__()}: adds `&Redo' File menu item w/ wx.ID_REDO.
MiRCART.py:MiRCARTFrame.{accelRedoId,onAccelRedo(),__init__()}: binds ^Y accelerator to MiRCARTCanvas.redo().
MiRCART.py: update title.
2018-01-05 17:21:14 +01:00
Lucio Andrés Illanes Albornoz
bcf52d8dc5 IrcMiRCARTBot.py, README.md:IrcMiRCARTBot.py: update title. 2018-01-05 17:05:58 +01:00
Lucio Andrés Illanes Albornoz
31d644515a README.md:MiRCART.py: add prerequisites for Windows & title. 2018-01-05 17:04:35 +01:00
Lucio Andrés Illanes Albornoz
ba99dc1280 MiRC2png.py:MiRC2png._syncColourSpecState(): handle empty mIRC colour control code sequences. 2018-01-05 16:48:50 +01:00
Lucio Andrés Illanes Albornoz
496e4c7a4b MiRCART.py:MiRCARTToolRect.__processMapPatches(): always obtain cell state from canvasMap.
MiRCART.py:MiRCARTToolRect._draw(): always paint w/ background colour given isRightDown.
2018-01-05 03:27:57 +01:00
Lucio Andrés Illanes Albornoz
8b6d7ab445 MiRCART.py:MiRCARTFrame.accel{UndoId,Table}: added.
MiRCART.py:MiRCARTFrame.onAccelUndo(): call self.panelCanvas.undo().
MiRCART.py:MiRCARTFrame.__init__(): create self.menuFileUndo w/ wx.ID_UNDO.
MiRCART.py:MiRCARTFrame.__init__(): bind ^Z accelerator to self.onAccelUndo().
2018-01-05 01:59:04 +01:00
Lucio Andrés Illanes Albornoz
423f923b4e MiRCART.py:MiRCARTCanvas._processMapPatches(): don't process patches that don't introduce changes..
MiRCART.py:MiRCARTCanvas._processMapPatches(): append redo and undo patches to self.patchesUndo.
MiRCART.py:MiRCARTCanvas.undo(): initial implementation.
MiRCART.py:MiRCARTFrame.{menuFileUndo,onFileUndo,__init__}(): add GUI for MiRCARTCanvas.undo().
2018-01-05 01:34:57 +01:00
Lucio Andrés Illanes Albornoz
7a891d9863 MiRCART.py:MiRCARTToolRect.onMouse{Down,Motion}(): remove debugging print()s. 2018-01-05 00:57:22 +01:00
Lucio Andrés Illanes Albornoz
68ba42f244 MiRC2png.py: fix mIRC colour control code sequence counting & rendering logic. 2018-01-05 00:52:02 +01:00
Lucio Andrés Illanes Albornoz
e0300331fd MiRC2png.py:MiRC2png._parseAs{Char,ColourSpec}(): fix indentation. 2018-01-04 23:45:30 +01:00
Lucio Andrés Illanes Albornoz
325a454db7 MiRCART.py:MiRCARTCanvas._eventPointToMap[XY](): added for _onMouseEvent().
MiRCART.py:MiRCARTCanvas._onMouseEvent(): split into _processMapPatches() and _drawPatch().
MiRCART.py:MiRCARTCanvas.getCell{Height,Width}(): added for _drawPatch() and _eventPointToMap[XY]().
MiRCART.py:MiRCARTCanvas.onPaletteEvent(): only set self.mirc[FB]g.
MiRCART.py:MiRCARTCanvas.__init__(): cache canvas window size.
MiRCART.py:MiRCARTCanvas.__init__(): initialise & append canvasTools.
MiRCART.py:MiRCARTCanvas.__init__(): pre-create 16 mIRC colour brushes & pens.
MiRCART.py:MiRCARTCanvas.__init__(): initialise temporary & {un,re}do patches.
MiRCART.py:MiRCARTTool: added abstract base class for all canvas tools.
MiRCART.py:MiRCARTToolRect: initial implementation w/ cursor, limited to 1x1 rectangles.
MiRCART.py:MiRCARTFrame.__init__(): initialise MiRCARTCanvas() w/ canvasTools=[MiRCARTToolRect].
2018-01-04 23:36:37 +01:00
Lucio Andrés Illanes Albornoz
91e33f8a4a MiRCART.py:MiRCARTCanvas.canvasBitmap: added to optimise onPaint().
MiRCART.py:MiRCARTCanvas._onMouseEvent(): additionally draw to canvasBitmap via temporary wx.MemoryDC().
MiRCART.py:MiRCARTCanvas.onPaint(): reimplement using (double-buffered) wx.BufferedPaintDC() from canvasBitmap.
MiRCART.py:MiRCARTCanvas.__init__(): initialise canvasBitmap from canvas window size.
2018-01-04 20:22:15 +01:00
Lucio Andrés Illanes Albornoz
dcb4ca83bb MiRCART.py:MiRCARTCanvas.{onCharHook,__init__}(): removes wx.EVT_CHAR_HOOK event handler. 2018-01-04 20:14:38 +01:00
Lucio Andrés Illanes Albornoz
42e18ec252 MiRCART.py:MiRCARTCanvas.{_onMouseEvent,onPaint,__init__}(): switch addressing mode of self.canvasMap to [Y][X].
MiRCART.py:MiRCARTCanvas.get{Height,Map,Width}(): added for MiRCARTFrame.onFileSaveAs().
MiRCART.py:MiRCARTFrame.onFileSaveAs(): initial implementation.
2018-01-04 18:11:57 +01:00
Lucio Andrés Illanes Albornoz
427290e783 MiRCART.py:mircColours, MiRCARTCanvas.{onPaint,__init__}(): moved from MiRCARTCanvas.mircColours.
MiRCART.py:MiRCARTCanvas.get{Background,Foreground}Colour: added for MiRCARTFrame._updateStatusBar().
MiRCART.py:MiRCARTCanvas.onCharHook(): merged into MiRCARTCanvas.onPaletteEvent().
MiRCART.py:MiRCARTCanvas.onPaletteEvent(): set self.{mirc,brush,pen}{Fg,Bg} from colour choice event.
MiRCART.py:MiRCARTPalette: implements 16 colour palette panels GUI.
MiRCART.py:MiRCARTFrame._updateStatusBar(): show canvas {fore,back}ground colours in status bar.
MiRCART.py:MiRCARTFrame.onPaletteEvent(): hand off to MiRCARTCanvas.onPaletteEvent() and call _updateStatusBar().
MiRCART.py:MiRCARTFrame.__init__(): fix `&File' menu item order.
MiRCART.py:MiRCARTFrame.__init__(): create & update status bar.
2018-01-04 17:26:12 +01:00
Lucio Andrés Illanes Albornoz
1a2dd5f692 MiRC2png.py: renamed from MiRCART.py.
{IrcClient,IrcMiRCARTBot,MiRC2png}.py: update Vim modeline w/ `sw=4 ts=4'.
{IrcMiRCARTBot,MiRC2png}.py: update header legend.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): lower rate limit to (once per) 30 seconds.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): eliminate useless instance variable.
IrcMiRCARTBot.py:IrcMiRCARTBot._urlretrieveReportHook(): compare against correct limit of 1 MB (2**20.)
MiRCART.py: initial commit.
README.md: updated.
2018-01-04 16:24:06 +01:00
Lucio Andrés Illanes Albornoz
49705ad4bc IrcMiRCARTBot.py:IrcMiRCARTBot.{ContentTooLargeException,_urlretrieveReportHook()}: restrict ASCII downloads to 1 MB in size.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): pass (static) _urlretrieveReportHook() to urllib.request.urlretrieve().
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): handle ContentTooLargeException, urllib.error.URLError, and ValueError exceptions.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): only reset clientLastMessage after successful completion.
2018-01-03 15:50:42 +01:00
Lucio Andrés Illanes Albornoz
b71ca6af89 IrcClient.py:IrcClient.{queue,unqueue}(): always CR NL-terminate messages & encode() before queuing. 2018-01-03 15:18:28 +01:00
Lucio Andrés Illanes Albornoz
9c34fe3220 IrcClient.py:IrcClient.unqueue(): handle timeout from timed select(). 2018-01-03 15:13:52 +01:00
Lucio Andrés Illanes Albornoz
97d8caaf1e IrcClient.py: add missing `# {{{'. 2018-01-03 15:12:28 +01:00
Lucio Andrés Illanes Albornoz
f2affda37e IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): catch urllib.error.HTTPError exception during download.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): fix typo.
2018-01-03 04:24:18 +01:00
Lucio Andrés Illanes Albornoz
95b706b4bd IrcMiRCARTBot.py:IrcMiRCARTBot._dispatchPrivmsg(): correctly instantiate MiRCART.MiRCART. 2018-01-03 04:19:13 +01:00
Lucio Andrés Illanes Albornoz
6fcf0e0a4f IrcClient.py:IrcClient.{queue,unqueue}(): split.
IrcMiRCARTBot.py:IrcMiRCARTBot._dispatch{001,Ping,Privmsg,Timer}(): replace readline() calls w/ queue() calls.
IrcMiRCARTBot.py:IrcMiRCARTBot.dispatch(): call unqueue() after processing timers and prior to calling readline().
2018-01-03 04:15:43 +01:00
Lucio Andrés Illanes Albornoz
523d91ff89 MiRCART.py:MiRCART._parseAsChar(): derive rectangle & line coordinates and outCur{X,Y} offset from outImgFontSize[{0,1}].
MiRCART.py:MiRCART.__init__(): initialise outImgFontSize and add underline area offset.
MiRCART.py:MiRCART.__init__(): derive outCurY offset from outImgFontSize[1].
2018-01-03 03:52:41 +01:00
Lucio Andrés Illanes Albornoz
e182f0ffa9 {IrcMiRCARTBot,MiRCART}.py: differentiate private class member functions. 2018-01-03 03:33:57 +01:00
Lucio Andrés Illanes Albornoz
9896108028 IrcMiRCARTBot.py:IrcMiRCARTBot: replace print() w/ _log() calls.
IrcMiRCARTBot.py:IrcMiRCARTBot._log(): log message w/ timestamp.
2018-01-03 03:28:05 +01:00
Lucio Andrés Illanes Albornoz
c32d749675 IrcClient.py: split from IrcMiRCARTBot.py.
IrcMiRCARTBot.py: renamed from pngbot.py, importing IrcClient.IrcClient.
MiRCART.py: renamed from mirc2png.py.
README.md: updated.
2018-01-03 02:33:12 +01:00
Lucio Andrés Illanes Albornoz
98eae4257c pngbot.py:IrcBot.clientNextTimeout: moved from IrcMiRCARTBot.
pngbot.py:IrcBot.connect(): close() & return False given timeout and True given success.
pngbot.py:IrcBot.readline(): honour clientNextTimeout and return "" given timer expiry.
pngbot.py:IrcBot.sendline(): ignore clientNextTimeout.
pngbot.py:IrcMiRCARTBot.connect(): honour & pass IrcBot.connect() return value.
pngbot.py:IrcMiRCARTBot.dispatch{Join,Kick,Timer}(): (re)set clientNextTimeout to time.time() + 15 seconds.
pngbot.py:IrcMiRCARTBot.dispatch(): dispatch expired timers prior to calling readline() & honour "" return value.
pngbot.py:main(): honour IrcMiRCARTBot.connect() return value & delay reconnection by 15 seconds.
2018-01-03 02:24:58 +01:00
Lucio Andrés Illanes Albornoz
3a207fc53c pngbot.py:IrcBot.connect(): set socket non-blocking, ignore BlockingIOError, and select() for writability & optionally specified timeout.
pngbot.py:IrcBot.readline(): replace settimeout()/socket.timeout-based logic w/ select() for readability & optionally specified timeout.
pngbot.py:IrcBot.sendline(): select() for writability & optionally specified timeout and send() full buffer until failure.
pngbot.py:IrcMiRCARTBot.dispatch(): dispatch expired timers prior to calling readline().
pngbot.py:main(): default (maximum) connect timeout to 15 seconds.
2018-01-03 01:43:41 +01:00
Lucio Andrés Illanes Albornoz
09a7995a50 mirc2png.py:MiRCART.parseAsChar(): implement ^V (reverse) by swapping {background,foreground} colours. 2018-01-03 01:25:46 +01:00
Lucio Andrés Illanes Albornoz
532806176c pngbot.py:IrcBot.readline(): correctly catch socket.timeout exception. 2018-01-03 00:57:55 +01:00
Lucio Andrés Illanes Albornoz
ebd2ce9393 pngbot.py:IrcMiRCARTBot.dispatch353(): skip empty nick specs. 2018-01-03 00:53:42 +01:00
Lucio Andrés Illanes Albornoz
a0db56a530 pngbot.py:IrcBot.readline(): add optional timeout parameter.
pngbot.py:IrcMiRCARTBot.clientChannelRejoin{,TimerNext}: added to support delayed rejoin-on-kick logic.
pngbot.py:IrcMiRCARTBot.dispatchJoin(): reset clientChannelRejoin{,TimerNext} on successful (re)join to clientChannel.
pngbot.py:IrcMiRCARTBot.dispatchKick(): set clientChannelRejoin{,TimerNext} on kick from clientChannel to time.time() + 15 (seconds.)
pngbot.py:IrcMiRCARTBot.dispatchTimer(): (re)join clientChannel and set clientChannelRejoin{,TimerNext} to time.time() + 15 (seconds.)
pngbot.py:IrcMiRCARTBot.dispatch(): call readline() w/ timeout delta given clientChannelRejoinTimerNext.
2018-01-03 00:49:02 +01:00
Lucio Andrés Illanes Albornoz
936bfb6c86 pngbot.py:IrcMiRCARTBot.dispatchKick(): rejoin channel on kick. 2018-01-03 00:13:02 +01:00
Lucio Andrés Illanes Albornoz
c6aa3f9ad9 pngbot.py:IrcBot.readline(): correctly parse messages w/o a prefix. 2018-01-03 00:05:46 +01:00
Lucio Andrés Illanes Albornoz
90d9d146f1 README.md: update usage information. 2018-01-02 23:45:01 +01:00
Lucio Andrés Illanes Albornoz
95c950d2ee pngbot.py:IrcMiRCARTBot.dispatch353(): fix indentation. 2018-01-02 23:39:38 +01:00
Lucio Andrés Illanes Albornoz
8f29ba4e16 pngbot.py:IrcMiRCARTBot.dispatch353(): correctly print channel name. 2018-01-02 23:38:32 +01:00
Lucio Andrés Illanes Albornoz
f4218e8ae1 pngbot.py:IrcMiRCARTBot.dispatch{001,353,MODE,None,PING,PRIVMSG}(): split from dispatch(). 2018-01-02 23:35:01 +01:00
Lucio Andrés Illanes Albornoz
28e5b9b958 pngbot.py:IrcMiRCARTBot.dispatch(): ignore `!pngbot' requests from unauthorised (non-opped) nicks.
pngbot.py:IrcMiRCARTBot.dispatch(): add status (stdout) messages.
pngbot.py:IrcMiRCARTBot.dispatch(): always use lower-case channel name in status (stdout) messages.
2018-01-02 23:23:30 +01:00
Lucio Andrés Illanes Albornoz
993e986ec0 pngbot.py:IrcMiRCARTBot.clientChannelOps: added to track nicks authorised to use `!pngbot'.
pngbot.py:IrcMiRCARTBot.dispatch(): sync clientChannelOps w/ 353 (RPL_NAMREPLY) and (channel) MODE messages.
2018-01-02 23:12:26 +01:00
Lucio Andrés Illanes Albornoz
75e8e5fdf0 pngbot.py:IrcMiRCARTBot.uploadToImgur(): split from dispatch().
pngbot.py:IrcMiRCARTBot.dispatch(): only os.remove() if target file exists.
2018-01-02 22:40:46 +01:00
Lucio Andrés Illanes Albornoz
4556f8b238 pngbot.py: set +x bit. 2018-01-02 22:25:00 +01:00
Lucio Andrés Illanes Albornoz
3b29343e15 mirc2png.py:MiRCART.__init__(): move defaults from main(). 2018-01-02 22:24:21 +01:00
Lucio Andrés Illanes Albornoz
4f56b9c783 pngbot.py: splits main into class IrcMiRCARTBot.
pngbot.py:IrcBot.close(): only close() clientSocket if non-None.
pngbot.py:IrcMiRCARTBot.connect(): correctly zero-initialise clientLastMessage.
pngbot.py:IrcMiRCARTBot.dispatch(): fix imgurResponseHttp.status_code reference.
2018-01-02 22:20:20 +01:00
Lucio Andrés Illanes Albornoz
4c5755d2fc pngbot.py: rate-limit `!pngbot' processing to once (1) each 45 seconds. 2018-01-02 22:02:36 +01:00
Lucio Andrés Illanes Albornoz
e091920bda pngbot.py: handle HTTP status codes differing from 200.
pngbot.py: update IRC message text.
2018-01-02 21:57:21 +01:00
Lucio Andrés Illanes Albornoz
b94d3afdb5 pngbot.py: convert to lower case when comparing channel names. 2018-01-02 21:54:02 +01:00
Lucio Andrés Illanes Albornoz
5f4aa470b9 README.md: add pngbot.py prerequisites.
pngbot.py: initial commit (requires python3-{json,requests,urllib3}.)
2018-01-02 20:51:32 +01:00
Lucio Andrés Illanes Albornoz
93946c3bc9 mirc2png.py: fix class declaration & commenting style. 2018-01-02 20:51:06 +01:00
Lucio Andrés Illanes Albornoz
89e244890c .gitignore: ignore __pycache__/. 2018-01-02 20:50:40 +01:00
Lucio Andrés Illanes Albornoz
1c664f26e0 .gitignore: added to repository. 2018-01-02 19:16:09 +01:00
Lucio Andrés Illanes Albornoz
2d397ad4cf README.md: added to repository. 2018-01-02 17:03:15 +01:00
Lucio Andrés Illanes Albornoz
734cc19333 DejaVuSansMono.ttf: added to repository for convenience.
mirc2png.py:main(): default fontFilePath to `DejaVuSansMono.ttf'.
2018-01-02 16:59:35 +01:00
Lucio Andrés Illanes Albornoz
abaa92b53d mirc2png.py:parseAsChar(): implement underline (^_.)
mirc2png.py:__init__(): increment self.outCurY by correct row height.
2018-01-02 16:54:39 +01:00
Lucio Andrés Illanes Albornoz
2ea89a0559 Initial commit. 2018-01-02 16:19:07 +01:00
163 changed files with 5391 additions and 1363 deletions

1
.env Normal file
View File

@ -0,0 +1 @@
PYTHONPATH="E:\Documents - Repositories\roar\libcanvas;E:\Documents - Repositories\roar\libgui;E:\Documents - Repositories\roar\liboperators;E:\Documents - Repositories\roar\libroar;E:\Documents - Repositories\roar\librtl;E:\Documents - Repositories\roar\libtools"

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
*.sw[op]
__pycache__/
build/
libgui/GuiCanvasWxBackendFast.exp
libgui/GuiCanvasWxBackendFast.lib
libgui/GuiCanvasWxBackendFast.obj
libgui/GuiCanvasWxBackendFast.pyd
librtl/ImgurApiKey.py
releases/

23
.vscode/c_cpp_properties.json vendored Executable file
View File

@ -0,0 +1,23 @@
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"C:/Python37/include/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/BuildTools/VC/Tools/MSVC/14.23.28105/bin/Hostx64/x64/cl.exe",
"cStandard": "c11",
"cppStandard": "c++17",
"intelliSenseMode": "msvc-x64",
"compilerArgs": []
}
],
"version": 4
}

70
.vscode/launch.json vendored Executable file
View File

@ -0,0 +1,70 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File (Integrated Terminal)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},
{
"name": "Python: Remote Attach",
"type": "python",
"request": "attach",
"port": 5678,
"host": "localhost",
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
]
},
{
"name": "Python: Module",
"type": "python",
"request": "launch",
"module": "enter-your-module-name-here",
"console": "integratedTerminal"
},
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/manage.py",
"console": "integratedTerminal",
"args": [
"runserver",
"--noreload",
"--nothreading"
],
"django": true
},
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"env": {
"FLASK_APP": "app.py"
},
"args": [
"run",
"--no-debugger",
"--no-reload"
],
"jinja": true
},
{
"name": "Python: Current File (External Terminal)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "externalTerminal"
}
]
}

8
.vscode/roar.code-workspace vendored Executable file
View File

@ -0,0 +1,8 @@
{
"folders": [
{
"path": "E:\\Documents - Repositories\\roar"
}
],
"settings": {}
}

5
.vscode/settings.json vendored Executable file
View File

@ -0,0 +1,5 @@
{
"python.analysis.disabled": ["unresolved-import"],
"python.pythonPath": "C:\\Python37\\python.exe",
"python.linting.enabled": false
}

15
.vscode/tasks.json vendored Executable file
View File

@ -0,0 +1,15 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "Build libgui/GuiCanvasWxBackendFast.pyd",
"type": "shell",
"command": "cd \"${workspaceFolder}/libgui\" && cmd /c cl /EHsc /LD /Ox /Wall /WX /IC:/Python37/include GuiCanvasWxBackendFast.cpp C:/Python37/libs/python37.lib /FeGuiCanvasWxBackendFast.pyd",
"problemMatcher": [
"$msCompile"
]
}
]
}

2
ENNTool/.gitignore vendored
View File

@ -1,2 +0,0 @@
__pycache__/
*.sw[op]

View File

@ -1,180 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
# TODO:
# 1) -A, -S: replace w/ -s, implement animation script: render frame #1, render frame #2, ...; scrolling script; effects: rotate, smash into bricks, swirl, wave, ...
# 2) Feature: include ETA(s) @ progress bar(s)
# 3) Feature: autodetect video width from widest mircart
# 4) Feature: render mircart as 3D blocks vs flat surface
#
# 1) Optimisation: speed up ENNToolMiRCARTImporter
# 2) Cleanup: use names @ optdict + set from optdefaults
# 3) Feature: scrolling speed as <how many Y units>x<count of frame(s)>
# 4) Cleanup: use VAOs + glVertexAttribFormat + glVertexAttribBinding
# 5) Optimisation: split mIRC art into separate VBOs & implement rudimentary culling
# 6) Optimisation: only call glReadPixels() when changes were made relative to the last call
# 7) Split video output into separate module, switch to GUI
# 8) FBOs http://www.songho.ca/opengl/gl_fbo.html
#
from getopt import getopt, GetoptError
from glob import glob
from OpenGL.GL import *
import os, sys, time
import wx
from ENNToolGLCanvasPanel import ENNToolGLCanvas, ENNToolGLPanel
from ENNToolGLTTFTexture import ENNToolGLTTFTexture
from ENNToolGLVideoWriter import ENNToolGLVideoWriter
from ENNToolMiRCARTImporter import ENNToolMiRCARTImporter
class ENNToolApp(object):
"""XXX"""
# {{{ parseArgv(self, argv): XXX
def parseArgv(self, argv):
def usage(argv0):
print("usage: {}".format(os.path.basename(argv0)), file=sys.stderr)
print(" [-A] [-f fps] [-h] [-o fname]".format(os.path.basename(argv0)), file=sys.stderr)
print(" [-p] [-r WxH] [-R WxH] [-s fname]", file=sys.stderr)
print(" [-S] [-v] [--] fname..", file=sys.stderr)
print("", file=sys.stderr)
print(" -a........: select animation mode (UNIMPLEMENTED)", file=sys.stderr)
print(" -f fps....: set video FPS; defaults to 25", file=sys.stderr)
print(" -h........: show this screen", file=sys.stderr)
print(" -o fname..: output video filename; extension determines video type", file=sys.stderr)
print(" -p........: play video after rendering", file=sys.stderr)
print(" -r WxH....: set video resolution; defaults to 1152x864", file=sys.stderr)
print(" -R WxH....: set MiRCART cube resolution; defaults to 0.1x0.2", file=sys.stderr)
print(" -s fname..: input script filename", file=sys.stderr)
print(" -S........: select scrolling mode", file=sys.stderr)
print(" -v........: be verbose", file=sys.stderr)
try:
optlist, argv = getopt(argv[1:], "Af:ho:pr:R:s:Sv")
optdict = dict(optlist)
if "-h" in optdict:
usage(sys.argv[0]); exit(0);
elif not len(argv):
raise GetoptError("at least one MiRCART input fname must be specified")
if not "-f" in optdict:
optdict["-f"] = "25"
if not "-r" in optdict:
optdict["-r"] = "1152x864"
if not "-R" in optdict:
optdict["-R"] = "0.1x0.2"
if "-r" in optdict:
optdict["-r"] = [int(r) for r in optdict["-r"].split("x")][0:2]
if "-R" in optdict:
optdict["-R"] = [float(r) for r in optdict["-R"].split("x")][0:2]
except GetoptError as e:
print(e.msg); usage(sys.argv[0]); exit(1);
return argv, optdict
# }}}
# {{{ printProgress(self, progressCur, progressMax): XXX
def printProgress(self, progressCur, progressMax):
progressDiv = float(progressCur / progressMax)
if progressDiv >= 1:
progressDiv = 1; endChar = "\n";
else:
endChar = ""
print("\r[{:<50}] {}%".format(
("=" * int(progressDiv * 50)), int(progressDiv * 100)), end=endChar)
# }}}
# {{{ modeScroll(self, argv, optdict, GLVideoWriter, GLpanel, GLpanel, fps=25, scrollRate=0.1): XXX
def modeScroll(self, argv, optdict, GLVideoWriter, GLcanvas, GLpanel, fps=25, scrollRate=0.1):
MiRCART = []
if "-v" in optdict:
time0 = time.time()
for inFileArg in argv:
for inFile in sorted(glob(inFileArg)):
MiRCART += ENNToolMiRCARTImporter(inFile).outMap
if "-v" in optdict:
print("mIRC art import delta {:.3f}ms".format((time.time() - time0) * 1000))
if "-v" in optdict:
time0 = time.time()
artTextureId, artInfo = ENNToolGLTTFTexture(MiRCART, optdict["-R"], optdict["-r"]).getParams()
if "-v" in optdict:
print("TTF texture generation delta {:.3f}ms".format((time.time() - time0) * 1000))
artVbo, artVboLen, lastY, numVertices = GLcanvas.renderMiRCART(artInfo, MiRCART, cubeSize=optdict["-R"])
if "-v" in optdict:
print("{} vertices".format(numVertices))
def scrollFrameFun():
curY, rotateX, rotateY, translateY = 0, 0, 0, scrollRate
w, h = GLcanvas.GetClientSize(); w, h = max(w, 1.0), max(h, 1.0);
def scrollFrame():
nonlocal curY
self.printProgress(curY, lastY)
GLcanvas.renderFrame(artTextureId, artVbo, artVboLen)
if translateY:
glTranslatef(0, translateY, 0); curY += translateY
if rotateX:
glRotatef(rotateX * (180.0/w), 0.0, 1.0, 0.0)
if rotateY:
glRotatef(rotateY * (180.0/h), 1.0, 0.0, 0.0)
if "-o" in optdict:
GLVideoWriter.saveFrame()
else:
GLcanvas.SwapBuffers()
if curY >= lastY:
self.printProgress(curY, lastY)
if "-o" in optdict:
GLVideoWriter.saveVideo()
return False
return True
return scrollFrame
if "-o" in optdict:
frameFun = scrollFrameFun()
while True:
if not frameFun():
break
else:
GLpanel.frameFun = scrollFrameFun()
self.wxApp.MainLoop()
# }}}
# {{{ __init__(self, argv): XXX
def __init__(self, argv):
argv, optdict = self.parseArgv(argv)
self.wxApp = wx.App(False)
appFrameSize = [c + 128 for c in optdict["-r"]]
self.appFrame = wx.Frame(None, size=appFrameSize)
appPanelSkin = wx.Panel(self.appFrame, wx.ID_ANY)
videoFps, videoPath = int(optdict["-f"]), optdict["-o"] if "-o" in optdict else None
GLpanel = ENNToolGLPanel(appPanelSkin, size=optdict["-r"], parentFrame=self.appFrame)
GLcanvas = ENNToolGLCanvas(GLpanel, optdict["-r"])
GLcanvas.initOpenGL()
GLcanvas.initShaders()
GLVideoWriter = ENNToolGLVideoWriter(videoPath, GLpanel.GetClientSize(), videoFps=videoFps)
if "-o" in optdict:
self.appFrame.Hide()
else:
self.appFrame.Show(); self.appFrame.SetFocus();
if "-v" in optdict:
time0 = time.time()
self.modeScroll(argv, optdict, GLVideoWriter, GLcanvas, GLpanel, fps=videoFps)
if "-v" in optdict:
print("delta {}s".format(time.time() - time0))
if "-o" in optdict \
and "-p" in optdict:
os.startfile(videoPath)
# }}}
#
# Entry point
def main(*argv):
ENNToolApp(argv)
if __name__ == "__main__":
main(*sys.argv)
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,204 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
# References:
# Wed, 27 Jun 2018 16:02:10 +0200 [1] <https://www.opengl.org/discussion_boards/showthread.php/125843-default-camera?p=954801&viewfull=1#post954801>
# Wed, 27 Jun 2018 16:02:11 +0200 [2] <https://www.opengl.org/discussion_boards/showthread.php/167808-2D-texture-problem-lines-between-textures>
# Wed, 27 Jun 2018 16:02:12 +0200 [3] <https://www.khronos.org/opengl/wiki/How_lighting_works#Good_Settings.>
# Wed, 27 Jun 2018 16:02:13 +0200 [4] <https://www.khronos.org/opengl/wiki/Common_Mistakes>
# Wed, 27 Jun 2018 16:02:14 +0200 [5] <https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout>
# Thu, 28 Jun 2018 18:32:50 +0200 [6] <https://stackoverflow.com/questions/18935203/shader-position-vec4-or-vec3>
# Tue, 03 Jul 2018 14:34:57 +0200 [7] <https://gamedev.stackexchange.com/questions/107793/binding-and-unbinding-what-would-you-do>
#
from ENNToolMiRCARTColours import ENNToolMiRCARTColoursFloat
from OpenGL.GL import *
from OpenGL.GL import shaders
import ctypes, wx, wx.glcanvas
class ENNToolGLCanvas(wx.glcanvas.GLCanvas):
# {{{ initOpenGL(self): XXX
def initOpenGL(self):
self.glContext = wx.glcanvas.GLContext(self)
self.SetCurrent(self.glContext)
# [1]
glViewport(0, 0, *self.curSize)
glMatrixMode(GL_PROJECTION)
glLoadIdentity(); glFrustum(-1, 1, -1, 1, 1, 100);
glMatrixMode(GL_MODELVIEW)
glEnable(GL_DEPTH_TEST)
glTranslatef(-5.0, 3.0, -5)
# }}}
# {{{ initShaders(self): XXX
def initShaders(self):
# Fragment shader
fs = shaders.compileShader("""
#version 330 core
in vec2 frgTexCoord;
in vec3 frgFgColour;
in vec3 frgBgColour;
uniform sampler2D texture;
layout(location = 0) out vec4 fragColour;
void main() {
vec4 texel = texture2D(texture, frgTexCoord);
if (texel.r == 0.0 && texel.g == 0.0 && texel.b == 0.0 && texel.a == 0.0) {
fragColour = vec4(frgBgColour.r, frgBgColour.g, frgBgColour.b, 1.0);
} else {
fragColour = vec4(frgFgColour.r, frgFgColour.g, frgFgColour.b, 1.0);
}
}
""", GL_FRAGMENT_SHADER)
# Vertex shader
vs = shaders.compileShader("""
#version 330 core
layout(location = 0) in vec4 vertex;
layout(location = 1) in vec2 texcoord;
layout(location = 2) in vec3 vexFgColour;
layout(location = 3) in vec3 vexBgColour;
out vec2 frgTexCoord;
out vec3 frgFgColour;
out vec3 frgBgColour;
uniform mat4 modelview;
uniform mat4 projection;
void main() {
gl_Position = projection * modelview * vertex;
frgTexCoord = texcoord;
frgFgColour = vexFgColour;
frgBgColour = vexBgColour;
}
""", GL_VERTEX_SHADER)
self.shader = shaders.compileProgram(vs, fs)
# }}}
# {{{ renderFrame(self, artTextureId, artVbo, artVboLen): XXX
def renderFrame(self, artTextureId, artVbo, artVboLen):
# Bind VBO and named texture & install shader program object
glBindBuffer(GL_ARRAY_BUFFER, artVbo)
glBindTexture(GL_TEXTURE_2D, artTextureId)
glUseProgram(self.shader)
# Specify modelview and projection matrix & texture unit uniforms for shader programs
modelview, projection = (GLfloat * 16)(), (GLfloat * 16)()
glGetFloatv(GL_MODELVIEW_MATRIX, modelview)
glGetFloatv(GL_PROJECTION_MATRIX, projection)
glUniformMatrix4fv(glGetUniformLocation(self.shader, "modelview"), 1, GL_FALSE, modelview)
glUniformMatrix4fv(glGetUniformLocation(self.shader, "projection"), 1, GL_FALSE, projection)
glUniform1i(glGetUniformLocation(self.shader, "texture"), 0)
# VBO vertices location
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, False, 44, ctypes.c_void_p(0))
glVertexPointer(3, GL_FLOAT, 44, ctypes.c_void_p(0))
# VBO texture coordinates
glEnableVertexAttribArray(1)
glVertexAttribPointer(1, 2, GL_FLOAT, False, 44, ctypes.c_void_p(12))
glTexCoordPointer(2, GL_FLOAT, 44, ctypes.c_void_p(12))
# VBO foreground colours
glEnableVertexAttribArray(2)
glVertexAttribPointer(2, 3, GL_FLOAT, False, 44, ctypes.c_void_p(20))
glTexCoordPointer(3, GL_FLOAT, 44, ctypes.c_void_p(20))
# VBO background colours
glEnableVertexAttribArray(3)
glVertexAttribPointer(3, 3, GL_FLOAT, False, 44, ctypes.c_void_p(32))
glTexCoordPointer(3, GL_FLOAT, 44, ctypes.c_void_p(32))
# Clear colour and depth buffer, draw quads from VBO & clear state
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glDrawArrays(GL_QUADS, 0, artVboLen)
glDisableVertexAttribArray(0)
glBindTexture(GL_TEXTURE_2D, 0)
# }}}
# {{{ renderMiRCART(self, artInfo, artMap, centre=True, canvasCols=100, cubeSize=(0.1, 0.2)): XXX
def renderMiRCART(self, artInfo, artMap, centre=True, canvasCols=100, cubeSize=(0.1, 0.2)):
curPos, vertices, numVertices = [0, 0, 0], [], 0
for numRow in range(len(artMap)):
if centre and (len(artMap[numRow]) < canvasCols):
curPos[0] += (((canvasCols - len(artMap[numRow])) * cubeSize[0]) / 2)
for numCol in range(len(artMap[numRow])):
cubeFg = artMap[numRow][numCol][0]
cubeBg = artMap[numRow][numCol][1]
cubeAttrs = artMap[numRow][numCol][2]
cubeChar = artMap[numRow][numCol][3]
artCell = artInfo[cubeAttrs][cubeChar]
# Top Right, Top Left
vertices += curPos
vertices += artCell[0:2]
vertices += [*ENNToolMiRCARTColoursFloat[cubeFg]]
vertices += [*ENNToolMiRCARTColoursFloat[cubeBg]]
vertices += [curPos[0] - cubeSize[0], curPos[1], curPos[2]]
vertices += artCell[2:4]
vertices += ENNToolMiRCARTColoursFloat[cubeFg]
vertices += ENNToolMiRCARTColoursFloat[cubeBg]
# Bottom Left, Bottom Right
vertices += [curPos[0] - cubeSize[0], curPos[1] - cubeSize[1], curPos[2]]
vertices += artCell[4:6]
vertices += [*ENNToolMiRCARTColoursFloat[cubeFg]]
vertices += [*ENNToolMiRCARTColoursFloat[cubeBg]]
vertices += [curPos[0], curPos[1] - cubeSize[1], curPos[2]]
vertices += artCell[6:8]
vertices += ENNToolMiRCARTColoursFloat[cubeFg]
vertices += ENNToolMiRCARTColoursFloat[cubeBg]
curPos[0], numVertices = curPos[0] + cubeSize[0], numVertices + 4
curPos[0], curPos[1] = 0, curPos[1] - cubeSize[1]
artVbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, artVbo)
glBufferData(GL_ARRAY_BUFFER,
(ctypes.c_float*len(vertices))(*vertices),
GL_STATIC_DRAW)
return artVbo, len(vertices), -curPos[1], numVertices
# }}}
# {{{ __init__(self, parentCanvas, size): initialisation method
def __init__(self, parentCanvas, size):
super().__init__(parentCanvas, size=size)
self.curSize = list(size)
self.parentCanvas = parentCanvas
# }}}
class ENNToolGLPanel(wx.Panel):
"""XXX"""
# {{{ onPaint(self, event): XXX
def onPaint(self, event):
eventDc = wx.PaintDC(self)
eventUpdates = wx.RegionIterator(self.GetUpdateRegion())
paintFlag = True if eventUpdates.HaveRects() else False
if self.frameFun != None:
self.frameFun()
# }}}
# {{{ onTimer(self, event): XXX
def onTimer(self, event):
if self.frameFun != None:
if not self.frameFun():
event.GetTimer().Stop()
event.GetTimer().Destroy()
# }}}
# {{{ __init__(self, parent, size, defaultPos=(24,24), parentFrame=None): initialisation method
def __init__(self, parent, size, defaultPos=(24,24), parentFrame=None):
super().__init__(parent, pos=defaultPos, size=size)
self.curPos = list(defaultPos); self.curSize = list(size);
self.Bind(wx.EVT_PAINT, self.onPaint)
self.frameFun = None
self.timerTimer = wx.Timer(self, 1)
self.timerTimer.Start(40)
self.Bind(wx.EVT_TIMER, self.onTimer, self.timerTimer)
# }}}
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,152 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
# References:
# Thu, 28 Jun 2018 17:03:16 +0200 [1] <https://stackoverflow.com/questions/384759/how-to-convert-a-pil-image-into-a-numpy-array>
# Thu, 28 Jun 2018 17:04:59 +0200 [2] <https://www.khronos.org/opengl/wiki/Common_Mistakes#y-axis>
# Wed, 27 Jun 2018 16:02:12 +0200 [3] <https://www.khronos.org/opengl/wiki/How_lighting_works#Good_Settings.>
# Wed, 27 Jun 2018 16:02:13 +0200 [4] <https://www.khronos.org/opengl/wiki/Common_Mistakes>
# Wed, 27 Jun 2018 16:02:14 +0200 [5] <https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout>
# Wed, 04 Jul 2018 10:57:09 +0200 [6] <https://stackoverflow.com/questions/466204/rounding-up-to-next-power-of-2>
#
from collections import defaultdict
from OpenGL.GL import *
from PIL import Image, ImageDraw, ImageFont
import numpy
import os, string, sys
from ENNToolMiRCARTColours import ENNToolMiRCARTColours
from ENNToolMiRCARTImporter import ENNToolMiRCARTImporter
class ENNToolGLTTFTexture(object):
"""XXX"""
# {{{ _defaultDict(*args): XXX
@staticmethod
def _defaultDict(*args):
return defaultdict(*args)
# }}}
# {{{ _nestedDict(): XXX
@staticmethod
def _nestedDict():
return defaultdict(ENNToolGLTTFTexture._nestedDict)
# }}}
# {{{ _drawCharList(self, artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize): XXX
def _drawCharList(self, artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize):
curPos = [0, 0]
for newChar in charList:
if newChar[2] & ENNToolMiRCARTImporter._CellState.CS_BOLD:
pilFont, pilFontSize = pilFontBold, [pilFontBold.getsize(newChar[3])[0], pilFontBold.getsize(newChar[3])[1]]
else:
pilFont, pilFontSize = pilFontNormal, [pilFontNormal.getsize(newChar[3])[0], pilFontNormal.getsize(newChar[3])[1]]
if newChar[2] & ENNToolMiRCARTImporter._CellState.CS_UNDERLINE:
underLine = True
else:
underLine = False
if newChar[3] != " ":
pilImageDraw.text(curPos, newChar[3], (255, 255, 255, 255), pilFont)
elif newChar[0] == newChar[1]:
pilImageDraw.rectangle((*curPos, curPos[0] + pilFontSize[0], curPos[1] + pilFontSize[1] - 1),
fill=(255, 255, 255, 255))
if underLine and False:
pilImageDraw.line(
xy=(curPos[0], curPos[1] + (pilFontSize[1] - 2),
curPos[0] + pilFontSize[0], curPos[1] + pilFontSize[1]),
fill=(*ENNToolMiRCARTColours[newChar[0]], 255))
artInfo[newChar[2]][newChar[3]] = []
# Top Right
artInfo[newChar[2]][newChar[3]] += [float(curPos[0] + pilFontSize[0]) / pilImageSize[0], 0.0]
# Top Left
artInfo[newChar[2]][newChar[3]] += [float(curPos[0]) / pilImageSize[0], 0.0]
# Bottom Left
artInfo[newChar[2]][newChar[3]] += [float(curPos[0]) / pilImageSize[0], float(pilFontSize[1]) / pilImageSize[1]]
# Bottom Right
artInfo[newChar[2]][newChar[3]] += [float(curPos[0] + pilFontSize[0]) / pilImageSize[0], float(pilFontSize[1]) / pilImageSize[1]]
curPos[0] += pilFontSize[0]
return artInfo
# }}}
# {{{ _initArtInfoCharList(self): XXX
def _initArtInfoCharList(self, artMap):
artInfo, charList = ENNToolGLTTFTexture._nestedDict(), []
for numRow in range(len(artMap)):
for numCol in range(len(artMap[numRow])):
artFg = artMap[numRow][numCol][0]
artBg = artMap[numRow][numCol][1]
artAttrs = artMap[numRow][numCol][2]
artChar = artMap[numRow][numCol][3]
if artInfo[artAttrs][artChar] == {}:
artInfo[artAttrs][artChar] = None
charList += [[artFg, artBg, artAttrs, artChar]]
return artInfo, charList
# }}}
# {{{ _initFonts(self, charMap): XXX
def _initFonts(self, charMap):
fontBoldPathName = os.path.join("assets", "DejaVuSansMono-Bold.ttf")
fontNormalPathName = os.path.join("assets", "DejaVuSansMono.ttf")
fontSize = int("26")
pilFontBold = ImageFont.truetype(fontBoldPathName, fontSize)
pilFontMaxSize = [16, 32] # TODO
pilFontNormal = ImageFont.truetype(fontNormalPathName, fontSize)
return pilFontBold, pilFontMaxSize, pilFontNormal
# }}}
# {{{ _initImage(self, charList, pilFontMaxSize): XXX
def _initImage(self, charList, pilFontMaxSize):
pilImageSize = [pilFontMaxSize[0] * len(charList), pilFontMaxSize[1]]
for numDim in range(len(pilImageSize)):
if (pilImageSize[numDim] & (pilImageSize[numDim] - 1)) != 0:
pilImageSize[numDim] -= 1
pilImageSize[numDim] |= pilImageSize[numDim] >> 1
pilImageSize[numDim] |= pilImageSize[numDim] >> 2
pilImageSize[numDim] |= pilImageSize[numDim] >> 4
pilImageSize[numDim] |= pilImageSize[numDim] >> 8
pilImageSize[numDim] |= pilImageSize[numDim] >> 16
pilImageSize[numDim] += 1
pilImage = Image.new("RGBA", pilImageSize, (0, 0, 0, 0))
pilImageDraw = ImageDraw.Draw(pilImage)
return pilImage, pilImageDraw, pilImageSize
# }}}
# {{{ _initTexture(self, pilImage): XXX
def _initTexture(self, pilImage):
# [1], [2]
artTextureId = glGenTextures(1)
artTextureImage = pilImage
artTextureImageData = numpy.array(artTextureImage)
glBindTexture(GL_TEXTURE_2D, artTextureId)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP)
# [3]
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
# [4][5]
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
artTextureImage.size[0], artTextureImage.size[1],
0, GL_RGBA, GL_UNSIGNED_BYTE, artTextureImageData)
glBindTexture(GL_TEXTURE_2D, 0)
return artTextureId
# }}}
# {{{ getParams(self): XXX
def getParams(self):
return self.artTextureId, self.artInfo
# }}}
# {{{ __init__(self): initialisation method
def __init__(self, artMap, cubeSize, videoSize):
artInfo, charList = self._initArtInfoCharList(artMap)
pilFontBold, pilFontMaxSize, pilFontNormal = self._initFonts(charList)
pilImage, pilImageDraw, pilImageSize = self._initImage(charList, pilFontMaxSize)
artInfo = self._drawCharList(artInfo, charList, pilFontBold, pilFontNormal, pilImageDraw, pilImageSize)
artTextureId = self._initTexture(pilImage)
self.artTextureId = artTextureId
self.artInfo = artInfo
# }}}
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,68 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
# References:
# Tue, 03 Jul 2018 20:35:52 +0200 [1] <https://stackoverflow.com/questions/23930671/how-to-create-n-dim-numpy-array-from-a-pointer>
# Wed, 04 Jul 2018 10:02:22 +0200 [2] <http://www.songho.ca/opengl/gl_pbo.html>
#
from OpenGL.GL import *
import ctypes, cv2, numpy
class ENNToolGLVideoWriter(object):
"""XXX"""
# {{{ _copyFrames(self): XXX
def _copyFrames(self):
for numPbo in range(self.pboCount):
glBindBuffer(GL_PIXEL_PACK_BUFFER, self.pboList[numPbo])
frameBufferPtr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY)
frameBufferPtr = ctypes.cast(frameBufferPtr, ctypes.POINTER(ctypes.c_ubyte))
frameBuffer = numpy.ctypeslib.as_array(frameBufferPtr, shape=(self.videoSize[1], self.videoSize[0], 3))
frameBuffer = numpy.flipud(frameBuffer)
self.videoWriter.write(frameBuffer)
glUnmapBuffer(GL_PIXEL_PACK_BUFFER)
# }}}
# {{{ _initCv2(self, videoFps, videoPath, videoSize): XXX
def _initCv2(self, videoFps, videoPath, videoSize):
fourcc = cv2.VideoWriter_fourcc(*"avc1")
videoWriter = cv2.VideoWriter(videoPath, fourcc, videoFps, tuple(videoSize), True)
return videoWriter
# }}}
# {{{ _initPbos(self, pboCount, videoSize): XXX
def _initPbos(self, pboCount, videoSize):
pboBufs, pboCur, pboList = [None] * pboCount, 0, [None] * pboCount
for numPbo in range(pboCount):
pboList[numPbo] = glGenBuffers(1)
glBindBuffer(GL_PIXEL_PACK_BUFFER, pboList[numPbo])
glBufferData(GL_PIXEL_PACK_BUFFER,
videoSize[0] * videoSize[1] * 3, None, GL_STREAM_READ)
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)
return pboBufs, pboCount, pboCur, pboList
# }}}
# {{{ saveFrame(self): XXX
def saveFrame(self):
glBindBuffer(GL_PIXEL_PACK_BUFFER, self.pboList[self.pboCur])
glReadPixels(0, 0, self.videoSize[0], self.videoSize[1], GL_BGR, GL_UNSIGNED_BYTE, ctypes.c_void_p(0))
self.pboCur += 1
if self.pboCur >= self.pboCount:
self._copyFrames(); self.pboCur = 0;
glBindBuffer(GL_PIXEL_PACK_BUFFER, 0)
# }}}
# {{{ saveVideo(self): XXX
def saveVideo(self):
return
# }}}
# {{{ __init__(self, videoPath, videoSize, videoFps=25): XXX
def __init__(self, videoPath, videoSize, videoFps=25):
videoWriter = self._initCv2(videoFps, videoPath, videoSize)
self.pboBufs, self.pboCount, \
self.pboCur, self.pboList = self._initPbos(videoFps, videoSize)
self.videoFps, self.videoPath, \
self.videoSize, self.videoWriter = videoFps, videoPath, videoSize, videoWriter
# }}}
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,52 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
#
# MiRCARTColours: mIRC colour number to RGBA map given none of ^[BFV_] (bold, italic, reverse, underline],
#
ENNToolMiRCARTColours = [
[255, 255, 255], # White
[0, 0, 0], # Black
[0, 0, 187], # Blue
[0, 187, 0], # Green
[255, 85, 85], # Light Red
[187, 0, 0], # Red
[187, 0, 187], # Purple
[187, 187, 0], # Yellow
[255, 255, 85], # Light Yellow
[85, 255, 85], # Light Green
[0, 187, 187], # Cyan
[85, 255, 255], # Light Cyan
[85, 85, 255], # Light Blue
[255, 85, 255], # Pink
[85, 85, 85], # Grey
[187, 187, 187], # Light Grey
]
#
# MiRCARTColours: mIRC colour number to RGBA float map given none of ^[BFV_] (bold, italic, reverse, underline],
#
ENNToolMiRCARTColoursFloat = [
[1.00, 1.00, 1.00], # White
[0.00, 0.00, 0.00], # Black
[0.00, 0.00, 0.73], # Blue
[0.00, 0.73, 0.00], # Green
[1.00, 0.33, 0.33], # Light Red
[0.73, 0.00, 0.00], # Red
[0.73, 0.00, 0.73], # Purple
[0.73, 0.73, 0.00], # Yellow
[1.00, 1.00, 0.33], # Light Yellow
[0.33, 1.00, 0.33], # Light Green
[0.00, 0.73, 0.73], # Cyan
[0.33, 1.00, 1.00], # Light Cyan
[0.33, 0.33, 1.00], # Light Blue
[1.00, 0.33, 1.00], # Pink
[0.33, 0.33, 0.33], # Grey
[0.73, 0.73, 0.73], # Light Grey
]
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,134 +0,0 @@
#!/usr/bin/env python3
#
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
# Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT license.
#
# TODO:
# 1) un-Quick'n'Dirty-ify
#
import chardet
class ENNToolMiRCARTImporter(object):
"""XXX"""
# {{{ _CellState(): Cell state
class _CellState():
CS_NONE = 0x00
CS_BOLD = 0x01
CS_ITALIC = 0x02
CS_UNDERLINE = 0x04
# }}}
# {{{ _ParseState(): Parsing loop state
class _ParseState():
PS_CHAR = 1
PS_COLOUR_DIGIT0 = 2
PS_COLOUR_DIGIT1 = 3
# }}}
# {{{ _flipCellStateBit(self, cellState, bit): XXX
def _flipCellStateBit(self, cellState, bit):
if cellState & bit:
return cellState & ~bit
else:
return cellState | bit
# }}}
# {{{ _parseCharAsColourSpec(self, colourSpec, curColours): XXX
def _parseCharAsColourSpec(self, colourSpec, curColours):
if len(colourSpec) > 0:
colourSpec = colourSpec.split(",")
if len(colourSpec) == 2 \
and len(colourSpec[1]) > 0:
return [int(colourSpec[0] or curColours[0]), \
int(colourSpec[1])]
elif len(colourSpec) == 1 \
or len(colourSpec[1]) == 0:
return [int(colourSpec[0]), curColours[1]]
else:
return [15, 1]
# }}}
# {{{ fromTextFile(self, pathName): XXX
def fromTextFile(self, pathName):
with open(pathName, "rb") as fileObject:
inFileEncoding = chardet.detect(fileObject.read())["encoding"]
self.inFile = open(pathName, "r", encoding=inFileEncoding)
self.inSize = self.outMap = None;
inCurColourSpec = ""; inCurRow = -1;
inLine = self.inFile.readline()
inSize = [0, 0]; outMap = []; inMaxCols = 0;
while inLine:
inCellState = self._CellState.CS_NONE
inParseState = self._ParseState.PS_CHAR
inCurCol = 0; inMaxCol = len(inLine);
inCurColourDigits = 0; inCurColours = [15, 1]; inCurColourSpec = "";
inCurRow += 1; outMap.append([]); inRowCols = 0; inSize[1] += 1;
while inCurCol < inMaxCol:
inChar = inLine[inCurCol]
if inChar in set("\r\n"): \
inCurCol += 1
elif inParseState == self._ParseState.PS_CHAR:
inCurCol += 1
if inChar == "":
inCellState = self._flipCellStateBit( \
inCellState, self._CellState.CS_BOLD)
elif inChar == "":
inParseState = self._ParseState.PS_COLOUR_DIGIT0
elif inChar == "":
inCellState = self._flipCellStateBit( \
inCellState, self._CellState.CS_ITALIC)
elif inChar == "":
inCellState |= self._CellState.CS_NONE
inCurColours = [15, 1]
elif inChar == "":
inCurColours = [inCurColours[1], inCurColours[0]]
elif inChar == "":
inCellState = self._flipCellStateBit( \
inCellState, self._CellState.CS_UNDERLINE)
else:
inRowCols += 1
outMap[inCurRow].append([*inCurColours, inCellState, inChar])
elif inParseState == self._ParseState.PS_COLOUR_DIGIT0 \
or inParseState == self._ParseState.PS_COLOUR_DIGIT1:
if inChar == "," \
and inParseState == self._ParseState.PS_COLOUR_DIGIT0:
if (inCurCol + 1) < inMaxCol \
and not inLine[inCurCol + 1] in set("0123456789"):
inCurColours = self._parseCharAsColourSpec( \
inCurColourSpec, inCurColours)
inCurColourDigits = 0; inCurColourSpec = "";
inParseState = self._ParseState.PS_CHAR
else:
inCurCol += 1
inCurColourDigits = 0; inCurColourSpec += inChar;
inParseState = self._ParseState.PS_COLOUR_DIGIT1
elif inChar in set("0123456789") \
and inCurColourDigits == 0:
inCurCol += 1
inCurColourDigits += 1; inCurColourSpec += inChar;
elif inChar in set("0123456789") \
and inCurColourDigits == 1 \
and inCurColourSpec[-1] == "0":
inCurCol += 1
inCurColourDigits += 1; inCurColourSpec += inChar;
elif inChar in set("012345") \
and inCurColourDigits == 1 \
and inCurColourSpec[-1] == "1":
inCurCol += 1
inCurColourDigits += 1; inCurColourSpec += inChar;
else:
inCurColours = self._parseCharAsColourSpec( \
inCurColourSpec, inCurColours)
inCurColourDigits = 0; inCurColourSpec = "";
inParseState = self._ParseState.PS_CHAR
inMaxCols = max(inMaxCols, inRowCols)
inLine = self.inFile.readline()
inSize[0] = inMaxCols; self.inSize = inSize; self.outMap = outMap;
self.inFile.close()
# }}}
# {{{ __init__(self, inFile): initialisation method
def __init__(self, inFile):
self.inFile = inFile; self.inSize = self.outMap = None;
self.fromTextFile(inFile)
# }}}
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,35 +0,0 @@
# ENNTool -- mIRC art animation tool (for EFnet #MiRCART) (WIP)
Copyright (c) 2018 Lucio Andrés Illanes Albornoz <<lucio@lucioillanes.de>>
This project is licensed under the terms of the MIT licence.
## Installation instructions on Windows
1. Install Python v>=3.5.x[[4](#r4)]
2. Install script dependencies w/ the following elevated command prompt command line:
`pip install chardet numpy Pillow PyOpenGL wxPython`
3. Download OpenCV wheel[[1](#r1)] and install w/ the following elevated command prompt command line:
`pip install <path to OpenCV wheel>`
## How to run
```
usage: ENNTool.py
[-A] [-f fps] [-h] [-o fname]
[-p] [-r WxH] [-R WxH] [-s fname]
[-S] [-v] [--] fname..
-a........: select animation mode (UNIMPLEMENTED)
-f fps....: set video FPS; defaults to 25
-h........: show this screen
-o fname..: output video filename; extension determines video type
-p........: play video after rendering
-r WxH....: set video resolution; defaults to 1152x864
-R WxH....: set MiRCART cube resolution; defaults to 0.1x0.2
-s fname..: input script filename
-S........: select scrolling mode
-v........: be verbose
```
## References
``Wed, 04 Jul 2018 09:33:53 +0200 [1]`` <a href="https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv" id="r1">Python Extension Packages for Windows - Christoph Gohlke</a>
``Wed, 04 Jul 2018 09:38:28 +0200 [2]`` <a href="https://github.com/cisco/openh264/releases" id="r2">Releases · cisco/openh264 · GitHub</a>
``Wed, 04 Jul 2018 09:49:38 +0200 [3]`` <a href="https://github.com/opencv/opencv/issues/6080" id="r3">opencv_ffmpeg and OpenH264-x.y.z · Issue #6080 · opencv/opencv · GitHub</a>
``Wed, 04 Jul 2018 10:24:12 +0200 [4]`` <a href="https://www.python.org/downloads/windows" id="r4">Python Releases for Windows | Python.org</a>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

View File

@ -1,36 +0,0 @@
0,1 3,3 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 3,3 0,1 0,0 1,1 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 1,1 9,9 1,1 9,9 1,1 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1
3,3 0,1 3,3 0,1 9,9 0,1 9,9 1,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 0,0 0,1 0,0 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1 1,1 9,9 0,1 9,9 1,1 0,1 9,9 0,1 9,9 0,1 9,9 0,1 9,9 0,1
0,1 3,3 0,1 9,9 0,1 11,11 10,10 11,11 0,1 9,9 0,1 9,9 0,1 3,3 0,1 3,3 0,1 0,0 0,1 0,0 0,1 0,0 0,1 9,9 0,1 9,9 0,1 9,9 0,1 1,1 9,9 0,1 1,1 0,1 9,9 0,1 9,9 0,1
0,1 3,3 0,1 3,3 0,1 10,10 11,11 10,10 11,11 10,10 0,1 3,3 0,1 3,3 0,1 0,0 0,1 3,3 0,1 3,3 0,1 1,1 3,3 1,1 3,3 1,1 9,9 1,1 9,9 1,1 3,3 1,1 3,3 1,1 0,1 3,3 0,1 3,3 0,1
9,9 1,1 3,3 1,1 10,10 11,11 10,10 11,11 10,10 1,1 0,0 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 9,9 1,1 3,3 1,1 11,11 1,1 1,10 11,11 0,1 9,9
9,9 1,1 10,10 11,11 10,10 11,11 10,10 11,11 1,1 3,3 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 3,3 1,1 11,11 1,1 1,10 11,11 0,1 9,9
9,9 1,1 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 11,11 1,10 1,1 11,11 1,1 3,3 1,1 11,11 1,1 1,10 11,11 1,1 0,1 9,9
9,9 1,1 11,11 10,10 11,11 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 11,11 1,10 1,1 11,11 1,1 1,10 11,11 1,1 0,1 9,9
9,9 1,1 11,11 10,10 11,11 10,10 11,10 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 11,11 1,10 1,1 1,10 11,11 1,1 0,1 9,9
9,9 1,1 11,11 10,10 11,11 10,10 11,11 10,10 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 11,11 1,10 11,11 1,10 11,11 1,1 0,1 9,9
1,3 9,9 1,1 11,11 10,10 11,11 10,10 11,11 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 11,11 10,10 11,11 1,1 0,1 9,9 1,3
3,3 9,9 1,1 3,3 1,1 3,3 1,1 11,11 10,10 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 1,1 0,1 9,9 1,3
3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 0,0 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 0,0 1,1 8,8 1,1 0,0 1,1 8,8 1,1 8,8 1,1 8,8 1,1 9,9 3,3 1,1 0,1 9,9 1,3
1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3
11,11 3,3 9,9 1,1 7,7 8,8 1,1 8,8 1,1 8,8 1,1 8,8 1,1 3,3 9,9 1,1 0,1 9,9 1,3 11,11
11,11 3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 7,7 8,8 1,1 0,0 1,1 8,8 1,1 3,3 9,9 3,3 1,1 0,1 9,9 1,3 11,11
11,11 1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 1,1 8,8 1,1 9,9 3,3 1,1 0,1 9,9 1,3 11,11
10,10 3,11 1,3 3,3 9,9 1,1 3,3 1,1 3,3 1,1 7,7 8,8 1,1 0,0 1,1 0,0 1,1 0,0 1,1 8,8 1,1 3,3 1,1 9,9 1,3 3,11 10,10
10,10 3,11 1,3 3,3 9,9 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 3,3 1,1 7,7 8,8 8,1 1,1 8,1 8,8 1,1 9,9 3,3 1,1 9,9 1,3 3,11 10,10
10,10 3,11 1,3 3,3 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 9,9 1,1 7,7 8,8 8,1 0,0 1,1 0,0 1,1 0,0 8,1 8,8 1,1 3,3 9,9 1,3 3,11 10,10
10,10 3,11 3,3 9,9 7,7 8,8 8,1 1,1 8,1 8,8 7,7 9,9 3,3 1,3 3,11 10,10
10,10 11,11 3,3 7,7 8,8 8,1 0,0 8,1 8,8 7,7 3,3 11,11 10,10
10,10 11,11 3,3 9,9 7,7 8,8 8,1 8,8 7,7 9,9 3,3 11,11 10,10
10,10 11,11 3,3 9,9 3,3 7,7 3,3 9,9 3,3 11,11 10,10
10,10 11,11 3,3 9,9 3,3 11,11 3,3 9,9 3,3 11,11 10,10
11,11 3,3 9,9 3,3 11,11 10,10 11,11 3,3 9,9 3,3 11,11
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
11,11 3,3 9,9 3,3 11,11 10,10 11,11 10,10 11,11 3,3 9,9 3,3 11,11
10,10 11,11 3,3 9,9 3,3 11,11 10,10 11,11 3,3 9,9 3,3 11,11 10,10
10,10 11,11 3,3 9,9 3,3 11,11 3,3 9,9 3,3 11,11 10,10
10,10 11,11 3,3 9,9 3,3 9,9 3,3 11,11 10,10
10,10 11,11 3,3 9,9 3,3 11,11 10,10
10,10 11,11 3,3 11,11 10,10

Binary file not shown.

Binary file not shown.

View File

@ -1,59 +0,0 @@
-------------------------------------------------------
About The Cisco-Provided Binary of OpenH264 Video Codec
-------------------------------------------------------
Cisco provides this program under the terms of the BSD license.
Additionally, this binary is licensed under Ciscos AVC/H.264 Patent Portfolio License from MPEG LA, at no cost to you, provided that the requirements and conditions shown below in the AVC/H.264 Patent Portfolio sections are met.
As with all AVC/H.264 codecs, you may also obtain your own patent license from MPEG LA or from the individual patent owners, or proceed at your own risk. Your rights from Cisco under the BSD license are not affected by this choice.
For more information on the OpenH264 binary licensing, please see the OpenH264 FAQ found at http://www.openh264.org/faq.html#binary
A corresponding source code to this binary program is available under the same BSD terms, which can be found at http://www.openh264.org
-----------
BSD License
-----------
Copyright © 2014 Cisco Systems, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-----------------------------------------
AVC/H.264 Patent Portfolio License Notice
-----------------------------------------
The binary form of this Software is distributed by Cisco under the AVC/H.264 Patent Portfolio License from MPEG LA, and is subject to the following requirements, which may or may not be applicable to your use of this software:
THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE PERSONAL USE OF A CONSUMER OR OTHER USES IN WHICH IT DOES NOT RECEIVE REMUNERATION TO (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD (“AVC VIDEO”) AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM
Accordingly, please be advised that content providers and broadcasters using AVC/H.264 in their service may be required to obtain a separate use license from MPEG LA, referred to as "(b) sublicenses" in the SUMMARY OF AVC/H.264 LICENSE TERMS from MPEG LA found at http://www.openh264.org/mpegla
---------------------------------------------
AVC/H.264 Patent Portfolio License Conditions
---------------------------------------------
In addition, the Cisco-provided binary of this Software is licensed under Cisco's license from MPEG LA only if the following conditions are met:
1. The Cisco-provided binary is separately downloaded to an end users device, and not integrated into or combined with third party software prior to being downloaded to the end users device;
2. The end user must have the ability to control (e.g., to enable, disable, or re-enable) the use of the Cisco-provided binary;
3. Third party software, in the location where end users can control the use of the Cisco-provided binary, must display the following text:
"OpenH264 Video Codec provided by Cisco Systems, Inc."
4. Any third-party software that makes use of the Cisco-provided binary must reproduce all of the above text, as well as this last condition, in the EULA and/or in another location where licensing information is to be presented to the end user.
v1.0

1
LICENCE Symbolic link
View File

@ -0,0 +1 @@
assets/text/LICENCE

1
README.md Symbolic link
View File

@ -0,0 +1 @@
assets/text/README.md

BIN
assets/audio/roararab1.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab2.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab3.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab4.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab5.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab6.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab7.wav Normal file

Binary file not shown.

BIN
assets/audio/roararab8.wav Normal file

Binary file not shown.

Binary file not shown.

BIN
assets/audio/roarspoke1.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/audio/roarspoke2.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke3.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke4.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke5.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke6.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke7.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke8.wav Normal file

Binary file not shown.

BIN
assets/audio/roarspoke9.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r1.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r2.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r3.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r4.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r5.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r6.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r7.wav Normal file

Binary file not shown.

BIN
assets/audio/roarvap0r8.wav Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
assets/images/logo1.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
assets/images/logo2.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
assets/images/logo3.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
assets/images/logo4.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

BIN
assets/images/logo5.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
assets/images/logo6.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

BIN
assets/images/logo7.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
assets/images/logo8.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
assets/images/logo9.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
assets/images/roar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 B

BIN
assets/images/toolClone.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

BIN
assets/images/toolErase.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 253 B

BIN
assets/images/toolFill.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 290 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

BIN
assets/images/toolLine.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

BIN
assets/images/toolMove.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 213 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

BIN
assets/images/toolRect.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 268 B

BIN
assets/images/toolText.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

View File

@ -0,0 +1,11 @@
#!/usr/bin/env python3
#
# ImgurApiKey.py
# Copyright (c) 2018, 2019 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
# This project is licensed under the terms of the MIT licence.
#
class ImgurApiKey(object):
imgurApiKey = None
# vim:expandtab foldmethod=marker sw=4 ts=4 tw=120

View File

@ -1,19 +1,21 @@
Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Copyright (c) 2018 Lucio Andrés Illanes Albornoz <lucio@lucioillanes.de>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
vim:ff=dos

11
assets/text/README.md Normal file
View File

@ -0,0 +1,11 @@
# roar.py -- mIRC art editor for Windows & Linux (unmaintained reference implementation, do not use)
* Prerequisites on Windows: install Python v3.7.x[1] and script dependencies w/ the following elevated command prompt command line:
`pip install requests urllib3 wxPython`
* Prerequisites on Linux: python3 (v3.7.x) && python-wx{gtk2.8,tools} on Debian-family Linux distributions
* Screenshot:
![Screenshot](https://github.com/lalbornoz/roar/raw/master/assets/images/roar.png "Screenshot")
References:
Fri, 05 Jan 2018 17:01:47 +0100 [1] Python Releases for Windows | Python.org <https://www.python.org/downloads/windows/>
vim:ff=dos tw=0

Some files were not shown because too many files have changed in this diff Show More